Compare commits

..

22 Commits

Author SHA1 Message Date
Janek Bevendorff
34a78f0ec3 Release 2.6.4
Added

- Automatically adapt to light/dark system theme changes (Windows/macOS only) [#6034]

Changed

- Show window title as tooltip on system tray [#5948]
- Compress Snap release as LZO for faster initial startup [#5877]
- Password generator: Set maximum selectable password length to 999 [#5937]

Fixed

- Fix crash on app close when using SSH agent [#5935]
- Fix KDF selection showing wrong item when using Argon2id [#5923]
- Automatically close About dialog on database lock if it is still open [#5947]
- Linux: Fix automatic launch at system startup with AppImages [#5901]
- Linux: Fix click-to-move on empty area activating when using menus [#5971]
- Linux: Try multiple times to show tray icon if tray is not ready yet [#5948]
- macOS: Fix KeePassXC blocking clean shutdown [#6002]
2021-01-31 22:37:23 +01:00
Janek Bevendorff
3e8a195eda Update translations 2021-01-31 22:37:18 +01:00
Janek Bevendorff
50bde82f17 Bump version to 2.6.4 2021-01-31 22:36:11 +01:00
Janek Bevendorff
bf0fd6f189 Update changelog 2021-01-31 22:36:07 +01:00
Jonathan White
109671900b Merge pull request #6034 from keepassxreboot/hotfix/theme-switching-backport 2021-01-31 15:43:37 -05:00
Janek Bevendorff
2889341acd Fix on/off icons not being redrawn on theme change (backport) 2021-01-31 14:29:49 -05:00
Janek Bevendorff
874e9e1075 Fix icon alpha blending in QTableView (backport)
Some widgets such as QTableView do not call QIconEngine::pixmap(), but do
the drawing immediately through QIconEngine::paint(). This breaks alpha
blending for recolouring, since the underlying image canvas is not
necessarily transparent and also not anchored at (0, 0). This results in
a black box of the size of the icon bounding box.

Icon recolouring is now always done on a temporary QImage with
transparent background and only the finished end result is composed onto
the original canvas.

Fixes #6006
2021-01-31 14:54:55 +01:00
Janek Bevendorff
48f2efbc92 Fix adaptive icon painting (backport)
Fixes resolution problems on HighDPI.
Backport of c7323accf2
2021-01-31 14:54:51 +01:00
Janek Bevendorff
f7d387d233 Add dynamic theme switching on Windows 10 (backport) 2021-01-31 12:38:01 +01:00
Janek Bevendorff
dad4ad68f3 Improve macOS platform integration (backport).
- Allow switching between themes without restart (except classic)
- Rework icon loading and recolouring logic to react to theme changes
- Automatically react to light/dark theme change
- Remove explicit selection of monochrome tray icon variant (selected
  automatically now)

The tray icon doesn't respond perfectly to theme changes yet on Big Sur,
since we need different icons for dark and light theme and cannot simply
let the OS recolour the icon for us (we do that, too, but only as an
additional fallback). At the moment, there is no signal to listen to
that would allow this.

This patch adds a few generic methods to OSUtils for detecting and
communicating theme changes, which are only stubs for Windows and Linux at
the moment and need to be implemented in future commits.

Fixes #5349
2021-01-31 12:18:58 +01:00
Jonathan White
63df00a723 Auto-close About Dialog before locking databases
* Fixes #5941
2021-01-28 21:21:49 -05:00
Jonathan White
db18a14cde Ensure app exiting flag is set on logoff/shutdown
* Fix #3944
2021-01-27 10:27:23 -05:00
Jonathan White
35d215aa70 Correct issues with system tray icon
* Close #5780 - Show window title as system tray icon tooltip
* Fix #5943 - Try to show system tray icon up to 5 times, waiting 5 seconds between attempts, if the system tray is not available. This works around observed startup issues on Linux.
* Change function of "isTrayIconEnabled()" to return true if the tray icon is created and visible. This may correct some long standing bugs with the window hiding forever unexpectedly.
2021-01-27 10:26:54 -05:00
Jonathan White
a3b9700f90 Fix unloading ssh keys on database lock
* Fix #5928 - SSH Agent keys are properly removed on database lock. Also fixes crash when keys are still loaded on application close.
* Remove dependency on DatabaseWidget within SSH Agent.
2021-01-26 18:35:34 +01:00
JCallicoat
0d3d5db87c Fix menubar click-to-move window with Qt 5.15
Change logic in click handler in eventFilter so that
startSystemMove() is only called when there is no menubar
action under the mouse cursor (i.e., when a blank area
of the menubar is clicked).

Fixes #5925
2021-01-20 15:37:12 -05:00
Jonathan White
fa239865f2 Allow max password length of 999 characters
* The slidebar maxes out at 128 characters (same as before)
* The spinbox text entry maxes out at 999 characters
2021-01-19 06:25:13 -05:00
Jonathan White
4216f1d03e Set Snap compression to lzo
* Fix #5877, greatly improve startup time of snap package
2021-01-16 10:37:51 -05:00
ei-ke
7fdc6010c5 Add documentation for creating YubiKey backups
* Closes #465
2021-01-16 10:37:33 -05:00
Farnbacher
031f31f83f Use AppImage path for startup on login
Fixes #5050
2021-01-16 10:37:07 -05:00
Jonathan White
2ddd61cff6 Ignore format changes for new clang-format version 2021-01-15 15:02:05 -05:00
Jonathan White
61ed2fff44 Update timestamp server for appsign
Also add ability to set the timestamp server by command line switch.
2021-01-15 15:02:05 -05:00
Janek Bevendorff
54b382f3fe Fix Argon2id UUID mixup
Argon2Kdf was using a wrong UUID internally for the id variant, resulting
in the incorrect dropdown entry being selected in the database
encryption settings.

Reading and writing databases was not affected.

Fixes #5922
2021-01-14 22:40:47 -05:00
854 changed files with 25271 additions and 211115 deletions

View File

@@ -19,7 +19,7 @@ AlwaysBreakBeforeMultilineStrings: false
AlwaysBreakTemplateDeclarations: false AlwaysBreakTemplateDeclarations: false
BinPackArguments: false BinPackArguments: false
BinPackParameters: false BinPackParameters: false
BraceWrapping: BraceWrapping:
AfterClass: true AfterClass: true
AfterFunction: true AfterFunction: true
AfterControlStatement: false AfterControlStatement: false
@@ -44,7 +44,7 @@ DerivePointerAlignment: false
DisableFormat: false DisableFormat: false
ExperimentalAutoDetectBinPacking: false ExperimentalAutoDetectBinPacking: false
ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH ] ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH ]
IncludeCategories: IncludeCategories:
- Regex: '^"(llvm|llvm-c|clang|clang-c)/' - Regex: '^"(llvm|llvm-c|clang|clang-c)/'
Priority: 2 Priority: 2
- Regex: '^(<|"(gtest|isl|json)/)' - Regex: '^(<|"(gtest|isl|json)/)'
@@ -85,3 +85,4 @@ Standard: Cpp11
TabWidth: 4 TabWidth: 4
UseTab: Never UseTab: Never
... ...

3
.gitattributes vendored
View File

@@ -14,6 +14,3 @@ AppImage-Recipe.sh export-ignore
# binary files # binary files
*.ai binary *.ai binary
# Line endings harmony
* text=auto

View File

@@ -63,7 +63,7 @@ Before submitting a bug report, check if the problem has already been reported.
### Discuss with the team ### Discuss with the team
As with feature requests, you can talk to the KeePassXC team about bugs, new features, other issues and pull requests on the dedicated issue tracker, on the [Matrix development channel](https://matrix.to/#/!RhJPJPGwQIFVQeXqZa:matrix.org?via=matrix.org), or in the IRC channel on Libera.Chat (`#keepassxc-dev` on `irc.libera.chat`, or use a [webchat link](https://web.libera.chat/#keepassxc-dev)). As with feature requests, you can talk to the KeePassXC team about bugs, new features, other issues and pull requests on the dedicated issue tracker, or in the IRC channel on Freenode (`#keepassxc-dev` on `irc.freenode.net`, or use a [webchat link](https://webchat.freenode.net/?channels=%23keepassxc-dev)).
### Your first code contribution ### Your first code contribution

12
.github/pull.yml vendored
View File

@@ -1,12 +0,0 @@
# doc: https://github.com/wei/pull#basic-setup
# manual trigger: https://pull.git.ci/process/${fork-user}/keepassxc
# pull from: https://github.com/keepassxreboot/keepassxc
version: "1"
rules:
- base: master
upstream: keepassxreboot:master
mergeMethod: hardreset
- base: develop
upstream: keepassxreboot:develop
mergeMethod: rebase

5
.gitignore vendored
View File

@@ -21,8 +21,3 @@ desktop.ini
/*.snap /*.snap
/*_source.tar.bz2 /*_source.tar.bz2
# MSVC Files
CMakeSettings.json
CMakePresets.json
.vs/
out/

View File

@@ -1,14 +1,8 @@
[main] [main]
host = https://www.transifex.com host = https://www.transifex.com
[keepassxc.share-translations-keepassxc-en-ts--develop] [keepassxc.keepassxc]
source_file = share/translations/keepassxc_en.ts source_file = share/translations/keepassx_en.ts
file_filter = share/translations/keepassxc_<lang>.ts file_filter = share/translations/keepassx_<lang>.ts
source_lang = en
type = QT
[keepassxc.share-translations-keepassxc-en-ts--master]
source_file = share/translations/keepassxc_en.ts
file_filter = share/translations/keepassxc_<lang>.ts
source_lang = en source_lang = en
type = QT type = QT

View File

@@ -1,135 +1,5 @@
# Changelog # Changelog
## Release 2.7.0 (2022-02-26)
### Major Additions
- Implement KDBX 4.1 [#7114]
- Add direct write save option for cloud storage and GVFS [#6594]
- Prevent screen capture on Windows and macOS [#6030]
- Support quick unlock using Windows Hello [#7384]
- Support quick unlock using Apple Watch [#5526]
- Allow specifying database backup paths [#7035]
- Add tag functionality [#6487][#7436][#7446]
- Add password rating column to entry view [#4797]
- Add group clone action [#6124]
- Show modifications between entry history items [#6789]
- Ability to bulk-delete and purge unused custom icons [#5970]
- Support adding custom passphrase wordlists [#6799]
- Support passphrase wordlists in numbered and PGP-signed formats [#6791]
- Implement support for hardware keys via wireless NFC [#6895]
- SSH Agent: Add support for OpenSSH 8.2 FIDO/U2F keys [#6371]
- CLI: Implement attachment handling [#5538]
- CLI: Add support for okon in offline HIBP checks [#5478]
- CLI: Implement `search` command and remove `locate` [#6805]
- CLI: Add db statistic output to `db-info` command [#7032]
- CLI: Add -i/--include option to `generate` command. [#7112]
- CLI: Add a -n (--notes) option to `add` and `edit` commands [#4646]
- CLI: Add keyfile option to `import` command [#5402]
- CLI: Adding a best option to clip to copy a password of the best match [#4489]
- Browser: Add Microsoft Edge support on Linux [#7100]
- Browser: Support native password generator from the extension [#6529]
- Browser: Add group settings [#4180]
- Browser: Add feature to ignore entries for HTTP-Auth Logins [#5394]
- Browser: Support triggering Auto-Type from browser extension [#6272]
- Browser: Add delete-entry command to API [#6899]
- Browser: Add search 'by-path' url to API [#5535]
- Browser: search for entries by UUID to API [#4763]
- Browser: Support auto-download of favicon on entry addition [#7179]
- Auto-Type: Major improvements to Auto-Type [#5864][#7463][#7435][#7391][#7129][#6400][#6364][#6361][#5283]
- Auto-Type: Fix typing to virtual machines on Windows [#7366]
- Auto-Type: Re-implement X11 keysym emulation [#7098]
- Auto-Type: Support multiple Xkb layouts [#6247]
- Auto-Type: Abort keystroke if modifiers held on X11 [#6351][#6357]
- Auto-Type: Add TOTP option to entry level Auto-Type menu [#6675]
- FdoSecrets: Major Refactor and Code Consolidation [#5747][#5660][#7043][#6915]
- FdoSecrets: Implement unlock before search [#6943]
- Reports: Add browser statistics report [#7197]
### Major Changes
- Port crypto backend to [Botan](https://github.com/randombit/botan) [#6209]
- Improve attachment handling and security [#6606][#5034][#7083]
- Allow selecting any open database in unlock dialog [#5427]
- KeeShare: Remove checking signed container and QuaZip dependency [#7223]
- Introduce security option to enable copy on double click (default off) [#6433]
- Add 'delete entry without confirm' functionality [#5812]
- Improve macOS and Windows platform integration [#5851]
- Lock only the current database by default [#6652]
- Show expired entries on DB unlock [#7290]
### Other Changes and Fixes
- Add countdown progress bar to TOTP preview [#6930]
- Enter favicon url directly on icons page [#6614]
- Set C++17 as standard in the build system [#7180]
- Internalize ykcore into code base [#6654]
- Transition to Visual Studio builds on Windows [#5874]
- Ability to delete entries from health check reports [#6537]
- Enhance remembering last-used directories [#6711]
- Implement org.freedesktop.appearance.color-scheme support on Linux [#7422]
- Support sorting HTML export [#7011]
- Add display number of characters in passphrases [#5449]
- Use Alt+Tab on macOS to switch between databases [#5407]
- Add feature to sort groups using shortcut keys [#6999]
- Add CTRL+Enter to apply password generator changes [#6414]
- Display `Database created` timestamp on statistics report [#6876]
- Browser: Improve best matching credentials setting [#6893]
- SSH Agent: Use both Pageant and OpenSSH agent simultaneously on Windows [#6288]
- SSH Agent: Allow using database path to resolve keys [#6365]
- SSH Agent: Show correct error messages in main window [#7166]
- Multiple fixes for MSI installer [#6630]
- Fix tab order for CSV import dialog to match screen order [#7315]
- Don't mark kdbx:// urls as invalid [#7221]
- Make selected text copyable instead of copying password [#7209]
- Detect timestamp resolution for CSV files [#7196]
- Fix crash while downloading favicon [#7104]
- Correct naming of newly generated keyx files [#7010]
- Place the 'Recycle Bin' at the bottom of the list when groups are sorted [#7004]
- Handle tilde with custom browser paths [#6659]
- Don't scroll up when deleting an entry [#6833]
- Set the MIME-Type to text/plain when using wl-copy on wayland [#6832]
- Fix adaptive icon painting [#5989][#6033]
- Fix favicon download from URL with non-standard port [#5509]
- Ignore recycle bin on KeePassHTTP migration [#5481]
## 2.6.6 (2021-06-12)
### Fixed
- Fix focusing search when pressing hotkey [#6603]
- Trim whitespace from TOTP key input prior to processing [#6604]
- Fix building on macOS [#6598]
- Resolve compiler warnings for unused return values [#6607]
## 2.6.5 (2021-06-08)
### Added
- Show search bar when toolbar is hidden or in overflow [#6279]
- Show countdown for clipboard clearing in status bar [#6333]
- Command line option to lock all open databases [#6511]
- Allow CSV import of bare TOTP secrets [#6211]
- Retain file creation time when saving database [#6576]
- Set permissions of saved attachments to be private to the current user [#6363]
- OPVault: Use Text instead of Name for attribute names [#6334]
### Changed
- Reports: Allow resizing of reports columns [#6435]
- Reports: Toggle showing expired entries [#6534]
- Save Always on Top setting [#6236]
- Password generator can exclude additional lookalike characters (6/G, 8/B) [#6196]
### Fixed
- Allow setting MSI properties in unattended install [#6196]
- Update MainWindow minimum size to enable smaller verticle space [#6196]
- Use application font size when setting default or monospace fonts [#6332]
- Fix notes not clearing in entry preview panel in some cases [#6481]
- macOS: Correct window activation when restoring from tray [#6575]
- macOS: Better handling of minimize after unlock when using browser integration [#6338]
- Linux: Start after the system tray is available on LXQt [#6216]
- Linux: Allow selection of modal dialogs on X11 in Auto-Type [#6204]
- KeeShare: prevent crash when file extension is missing [#6174]
## 2.6.4 (2021-01-31) ## 2.6.4 (2021-01-31)
### Added ### Added
@@ -353,7 +223,7 @@
- Return keyboard focus after saving database edits [#4287] - Return keyboard focus after saving database edits [#4287]
- Windows: Use bare minimum settings in portable version [#4131] - Windows: Use bare minimum settings in portable version [#4131]
- Windows: Use SHA256 code signing [#4129] - Windows: Use SHA256 code signing [#4129]
- macOS: Fix code signing incompatibility in latest macOS release [#4564] - macOS: Fix code signing incompatibility in latest macOS release [#4564]
## 2.5.3 (2020-01-19) ## 2.5.3 (2020-01-19)
@@ -485,8 +355,8 @@
- Redesign database unlock dialog [ #3287] - Redesign database unlock dialog [ #3287]
- Rework the entry preview panel [ #3306] - Rework the entry preview panel [ #3306]
- Move notes to General tab on Group Preview Panel [#3336] - Move notes to General tab on Group Preview Panel [#3336]
- Enable entry actions when editing an entry and cleanup entry context menu [#3641] - Enable entry actions when editing an entry and cleanup entry context menu [#3641]
- Improve detection of external database changes [#2389] - Improve detection of external database changes [#2389]
- Warn if user is trying to use a KDBX file as a key file [#3625] - Warn if user is trying to use a KDBX file as a key file [#3625]
- Add option to disable KeePassHTTP settings migrations prompt [#3349, #3344] - Add option to disable KeePassHTTP settings migrations prompt [#3349, #3344]
- Re-enabled Wayland support (no Auto-Type yet) [#3520, #3341] - Re-enabled Wayland support (no Auto-Type yet) [#3520, #3341]

View File

@@ -24,9 +24,6 @@ if(NOT CMAKE_BUILD_TYPE)
FORCE) FORCE)
endif() endif()
string(TOLOWER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE_LOWER) string(TOLOWER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE_LOWER)
if(CMAKE_BUILD_TYPE_LOWER STREQUAL "debug" OR CMAKE_BUILD_TYPE_LOWER STREQUAL "relwithdebinfo")
set(IS_DEBUG_BUILD TRUE)
endif()
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
@@ -53,21 +50,25 @@ option(WITH_XC_NETWORKING "Include networking code (e.g. for downloading website
option(WITH_XC_BROWSER "Include browser integration with keepassxc-browser." OFF) option(WITH_XC_BROWSER "Include browser integration with keepassxc-browser." OFF)
option(WITH_XC_YUBIKEY "Include YubiKey support." OFF) option(WITH_XC_YUBIKEY "Include YubiKey support." OFF)
option(WITH_XC_SSHAGENT "Include SSH agent support." OFF) option(WITH_XC_SSHAGENT "Include SSH agent support." OFF)
option(WITH_XC_KEESHARE "Sharing integration with KeeShare" 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) option(WITH_XC_UPDATECHECK "Include automatic update checks; disable for controlled distributions" ON)
if(UNIX AND NOT APPLE) if(UNIX AND NOT APPLE)
option(WITH_XC_FDOSECRETS "Implement freedesktop.org Secret Storage Spec server side API." OFF) option(WITH_XC_FDOSECRETS "Implement freedesktop.org Secret Storage Spec server side API." OFF)
endif() endif()
if(APPLE)
option(WITH_XC_TOUCHID "Include TouchID support for macOS." OFF)
endif()
option(WITH_XC_DOCS "Enable building of documentation" ON) option(WITH_XC_DOCS "Enable building of documentation" ON)
if(WITH_CCACHE) if(WITH_CCACHE)
# Use the Compiler Cache (ccache) program # Use the Compiler Cache (ccache) program
# (install with: sudo apt get ccache) # (install with: sudo apt get ccache)
find_program(CCACHE_FOUND ccache) find_program(CCACHE_FOUND ccache)
if(NOT CCACHE_FOUND) if(CCACHE_FOUND)
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE_FOUND})
else()
message(FATAL_ERROR "ccache requested but cannot be found.") message(FATAL_ERROR "ccache requested but cannot be found.")
endif() endif()
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE_FOUND})
endif() endif()
if(WITH_XC_ALL) if(WITH_XC_ALL)
@@ -78,11 +79,20 @@ if(WITH_XC_ALL)
set(WITH_XC_YUBIKEY ON) set(WITH_XC_YUBIKEY ON)
set(WITH_XC_SSHAGENT ON) set(WITH_XC_SSHAGENT ON)
set(WITH_XC_KEESHARE ON) set(WITH_XC_KEESHARE ON)
if(APPLE)
set(WITH_XC_TOUCHID ON)
endif()
if(UNIX AND NOT APPLE) if(UNIX AND NOT APPLE)
set(WITH_XC_FDOSECRETS ON) set(WITH_XC_FDOSECRETS ON)
endif() endif()
endif() endif()
if(WITH_XC_SSHAGENT OR WITH_XC_KEESHARE)
set(WITH_XC_CRYPTO_SSH ON)
else()
set(WITH_XC_CRYPTO_SSH OFF)
endif()
# Prefer WITH_XC_NETWORKING setting over WITH_XC_UPDATECHECK # Prefer WITH_XC_NETWORKING setting over WITH_XC_UPDATECHECK
if(NOT WITH_XC_NETWORKING AND WITH_XC_UPDATECHECK) if(NOT WITH_XC_NETWORKING AND WITH_XC_UPDATECHECK)
message(STATUS "Disabling WITH_XC_UPDATECHECK because WITH_XC_NETWORKING is disabled") message(STATUS "Disabling WITH_XC_UPDATECHECK because WITH_XC_NETWORKING is disabled")
@@ -90,8 +100,8 @@ if(NOT WITH_XC_NETWORKING AND WITH_XC_UPDATECHECK)
endif() endif()
set(KEEPASSXC_VERSION_MAJOR "2") set(KEEPASSXC_VERSION_MAJOR "2")
set(KEEPASSXC_VERSION_MINOR "7") set(KEEPASSXC_VERSION_MINOR "6")
set(KEEPASSXC_VERSION_PATCH "0") set(KEEPASSXC_VERSION_PATCH "4")
set(KEEPASSXC_VERSION "${KEEPASSXC_VERSION_MAJOR}.${KEEPASSXC_VERSION_MINOR}.${KEEPASSXC_VERSION_PATCH}") set(KEEPASSXC_VERSION "${KEEPASSXC_VERSION_MAJOR}.${KEEPASSXC_VERSION_MINOR}.${KEEPASSXC_VERSION_PATCH}")
set(OVERRIDE_VERSION "" CACHE STRING "Override the KeePassXC Version for Snapshot builds") set(OVERRIDE_VERSION "" CACHE STRING "Override the KeePassXC Version for Snapshot builds")
@@ -166,15 +176,6 @@ elseif(KEEPASSXC_DIST_TYPE STREQUAL "Other")
unset(KEEPASSXC_DIST) unset(KEEPASSXC_DIST)
endif() endif()
if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.14.0")
cmake_policy(SET CMP0083 NEW)
include(CheckPIESupported)
check_pie_supported()
endif()
# Create position independent code for shared libraries and executables
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
if("${CMAKE_SIZEOF_VOID_P}" EQUAL "4") if("${CMAKE_SIZEOF_VOID_P}" EQUAL "4")
set(IS_32BIT TRUE) set(IS_32BIT TRUE)
endif() endif()
@@ -250,11 +251,6 @@ if(WITH_APP_BUNDLE)
endif() endif()
add_gcc_compiler_flags("-fno-common") add_gcc_compiler_flags("-fno-common")
find_package(OpenMP)
if(OpenMP_FOUND)
add_gcc_compiler_cflags(${OpenMP_C_FLAGS})
add_gcc_compiler_cxxflags(${OpenMP_CXX_FLAGS})
endif()
add_gcc_compiler_flags("-Wall -Wextra -Wundef -Wpointer-arith -Wno-long-long") add_gcc_compiler_flags("-Wall -Wextra -Wundef -Wpointer-arith -Wno-long-long")
add_gcc_compiler_flags("-Wformat=2 -Wmissing-format-attribute") add_gcc_compiler_flags("-Wformat=2 -Wmissing-format-attribute")
add_gcc_compiler_flags("-fvisibility=hidden") add_gcc_compiler_flags("-fvisibility=hidden")
@@ -267,13 +263,14 @@ if(CMAKE_BUILD_TYPE_LOWER STREQUAL "debug")
endif() endif()
if (NOT HAIKU) if (NOT HAIKU)
if((CMAKE_COMPILER_IS_GNUCXX AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.8.999) OR CMAKE_COMPILER_IS_CLANGXX) if((CMAKE_COMPILER_IS_GNUCXX AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.8.999) OR CMAKE_COMPILER_IS_CLANGXX)
add_gcc_compiler_flags("-fstack-protector-strong") add_gcc_compiler_flags("-fstack-protector-strong")
else() else()
add_gcc_compiler_flags("-fstack-protector --param=ssp-buffer-size=4") add_gcc_compiler_flags("-fstack-protector --param=ssp-buffer-size=4")
endif() endif()
endif() endif()
add_gcc_compiler_cxxflags("-fno-exceptions -fno-rtti")
add_gcc_compiler_cxxflags("-Wnon-virtual-dtor -Wold-style-cast -Woverloaded-virtual") add_gcc_compiler_cxxflags("-Wnon-virtual-dtor -Wold-style-cast -Woverloaded-virtual")
add_gcc_compiler_cflags("-Wchar-subscripts -Wwrite-strings") add_gcc_compiler_cflags("-Wchar-subscripts -Wwrite-strings")
@@ -300,86 +297,63 @@ check_add_gcc_compiler_flag("-Werror=format-security")
check_add_gcc_compiler_flag("-Werror=implicit-function-declaration" C) check_add_gcc_compiler_flag("-Werror=implicit-function-declaration" C)
check_add_gcc_compiler_flag("-Wcast-align") check_add_gcc_compiler_flag("-Wcast-align")
if(UNIX AND NOT APPLE) 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_SYSTEM_NAME STREQUAL "Linux")
check_add_gcc_compiler_flag("-Qunused-arguments") check_add_gcc_compiler_flag("-Qunused-arguments")
add_gcc_compiler_flags("-pie -fPIE")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--no-add-needed -Wl,--as-needed -Wl,--no-undefined") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--no-add-needed -Wl,--as-needed -Wl,--no-undefined")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,relro,-z,now -pie") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,relro,-z,now")
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--no-add-needed -Wl,--as-needed") set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--no-add-needed -Wl,--as-needed")
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,-z,relro,-z,now") set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,-z,relro,-z,now")
endif() endif()
set(CMAKE_C_STANDARD 99) add_gcc_compiler_cflags("-std=c99")
set(CMAKE_CXX_STANDARD 17) add_gcc_compiler_cxxflags("-std=c++11")
set(CMAKE_CXX_STANDARD_REQUIRED ON)
check_cxx_compiler_flag("-fsized-deallocation" CXX_HAS_fsized_deallocation) check_add_gcc_compiler_flag("-fsized-deallocation" CXX)
if(CXX_HAS_fsized_deallocation)
# Do additional check: the deallocation functions must be there too.
set(CMAKE_REQUIRED_FLAGS "-fsized-deallocation")
check_cxx_source_compiles("#include <new>
int main() { void * ptr = nullptr; std::size_t size = 1; ::operator delete(ptr, size); }"
HAVE_DEALLOCATION_FUNCTIONS)
if(HAVE_DEALLOCATION_FUNCTIONS)
check_add_gcc_compiler_flag("-fsized-deallocation" CXX)
endif()
unset(CMAKE_REQUIRED_FLAGS)
endif()
if(APPLE AND CMAKE_COMPILER_IS_CLANGXX) if(APPLE AND CMAKE_COMPILER_IS_CLANGXX)
add_gcc_compiler_cxxflags("-stdlib=libc++") add_gcc_compiler_cxxflags("-stdlib=libc++")
endif() endif()
if(WITH_DEV_BUILD) if(WITH_DEV_BUILD)
add_definitions(-DQT_DEPRECATED_WARNINGS) add_definitions(-DQT_DEPRECATED_WARNINGS -DGCRYPT_NO_DEPRECATED)
else() else()
add_definitions(-DQT_NO_DEPRECATED_WARNINGS) add_definitions(-DQT_NO_DEPRECATED_WARNINGS)
add_gcc_compiler_cxxflags("-Wno-deprecated-declarations") add_gcc_compiler_cxxflags("-Wno-deprecated-declarations")
endif() endif()
# MSVC specific options if(MINGW)
if (MSVC)
if(MSVC_TOOLSET_VERSION LESS 141)
message(FATAL_ERROR "Only Microsoft Visual Studio 17 and newer are supported!")
endif()
add_compile_options(/permissive- /utf-8)
if(IS_DEBUG_BUILD)
add_compile_options(/Zf)
if(MSVC_TOOLSET_VERSION GREATER 141)
add_compile_definitions(/fsanitize=address)
endif()
endif()
endif()
if(WIN32)
set(CMAKE_RC_COMPILER_INIT windres) set(CMAKE_RC_COMPILER_INIT windres)
enable_language(RC) enable_language(RC)
if(MINGW) set(CMAKE_RC_COMPILE_OBJECT "<CMAKE_RC_COMPILER> <FLAGS> -O coff <DEFINES> -i <SOURCE> -o <OBJECT>")
set(CMAKE_RC_COMPILE_OBJECT "<CMAKE_RC_COMPILER> <FLAGS> -O coff <DEFINES> -i <SOURCE> -o <OBJECT>") if(NOT (CMAKE_BUILD_TYPE_LOWER STREQUAL "debug" OR CMAKE_BUILD_TYPE_LOWER STREQUAL "relwithdebinfo"))
endif() # Enable DEP and ASLR
if(NOT IS_DEBUG_BUILD) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--nxcompat -Wl,--dynamicbase")
if(MSVC) set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--nxcompat -Wl,--dynamicbase")
# By default MSVC enables NXCOMPAT # Enable high entropy ASLR for 64-bit builds
add_compile_options(/guard:cf) if(NOT IS_32BIT)
add_link_options(/DYNAMICBASE /HIGHENTROPYVA /GUARD:CF) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--high-entropy-va")
else(MINGW) set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--high-entropy-va")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--nxcompat -Wl,--dynamicbase")
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--nxcompat -Wl,--dynamicbase")
# Enable high entropy ASLR for 64-bit builds
if(NOT IS_32BIT)
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--high-entropy-va")
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--high-entropy-va")
endif()
endif() endif()
endif() endif()
endif() endif()
if(APPLE AND WITH_APP_BUNDLE OR WIN32) if(APPLE AND WITH_APP_BUNDLE OR MINGW)
set(PROGNAME KeePassXC) set(PROGNAME KeePassXC)
else() else()
set(PROGNAME keepassxc) set(PROGNAME keepassxc)
endif() endif()
if(WIN32) if(MINGW)
set(CLI_INSTALL_DIR ".") set(CLI_INSTALL_DIR ".")
set(PROXY_INSTALL_DIR ".") set(PROXY_INSTALL_DIR ".")
set(BIN_INSTALL_DIR ".") set(BIN_INSTALL_DIR ".")
@@ -410,47 +384,26 @@ endif(WITH_TESTS)
if(WITH_COVERAGE) if(WITH_COVERAGE)
# Include code coverage, use with -DCMAKE_BUILD_TYPE=Debug # Include code coverage, use with -DCMAKE_BUILD_TYPE=Debug
include(CodeCoverage) include(CodeCoverage)
set(COVERAGE_GCOVR_EXCLUDES
"\\(.+/\\)?tests/.\\*"
".\\*/moc_\\[^/\\]+\\.cpp"
".\\*/ui_\\[^/\\]+\\.h"
"\\(.+/\\)?zxcvbn/.\\*")
append_coverage_compiler_flags() append_coverage_compiler_flags()
setup_target_for_coverage_gcovr_html(
set(COVERAGE_EXCLUDES NAME coverage
"'^(.+/)?(thirdparty|zxcvbn)/.*'" EXECUTABLE $(MAKE) && $(MAKE) test
"'^(.+/)?main\\.cpp$$'" )
"'^(.+/)?cli/keepassxc-cli\\.cpp$$'"
"'^(.+/)?proxy/keepassxc-proxy\\.cpp$$'")
if(WITH_COVERAGE AND CMAKE_COMPILER_IS_CLANGXX)
set(MAIN_BINARIES
"$<TARGET_FILE:${PROGNAME}>"
"$<TARGET_FILE:keepassxc-cli>"
"$<TARGET_FILE:keepassxc-proxy>")
setup_target_for_coverage_llvm(
NAME coverage
BINARY ${MAIN_BINARIES}
SOURCES_ROOT ${CMAKE_SOURCE_DIR}/src
)
else()
setup_target_for_coverage_gcovr(
NAME coverage
SOURCES_ROOT ${CMAKE_SOURCE_DIR}/src
)
endif()
endif() endif()
include(CLangFormat) include(CLangFormat)
set(QT_COMPONENTS Core Network Concurrent Gui Svg Widgets Test LinguistTools) set(QT_COMPONENTS Core Network Concurrent Gui Svg Widgets Test LinguistTools)
if(UNIX AND NOT APPLE) if(UNIX AND NOT APPLE)
find_package(Qt5 COMPONENTS ${QT_COMPONENTS} DBus X11Extras REQUIRED) find_package(Qt5 COMPONENTS ${QT_COMPONENTS} DBus REQUIRED)
elseif(APPLE) elseif(APPLE)
find_package(Qt5 COMPONENTS ${QT_COMPONENTS} REQUIRED HINTS find_package(Qt5 COMPONENTS ${QT_COMPONENTS} REQUIRED HINTS /usr/local/opt/qt/lib/cmake /usr/local/Cellar/qt/*/lib/cmake ENV PATH)
/usr/local/opt/qt/lib/cmake find_package(Qt5 COMPONENTS MacExtras HINTS /usr/local/opt/qt/lib/cmake /usr/local/Cellar/qt/*/lib/cmake ENV PATH)
/usr/local/Cellar/qt/*/lib/cmake
/opt/homebrew/opt/qt/lib/cmake
ENV PATH)
find_package(Qt5 COMPONENTS MacExtras HINTS
/usr/local/opt/qt/lib/cmake
/usr/local/Cellar/qt/*/lib/cmake
/opt/homebrew/opt/qt/lib/cmake
ENV PATH)
else() else()
find_package(Qt5 COMPONENTS ${QT_COMPONENTS} REQUIRED) find_package(Qt5 COMPONENTS ${QT_COMPONENTS} REQUIRED)
endif() endif()
@@ -470,40 +423,45 @@ set(CMAKE_AUTORCC ON)
if(APPLE) if(APPLE)
set(CMAKE_MACOSX_RPATH TRUE) set(CMAKE_MACOSX_RPATH TRUE)
find_program(MACDEPLOYQT_EXE macdeployqt HINTS ${Qt5_PREFIX}/bin ${Qt5_PREFIX}/tools/qt5/bin ENV PATH) find_program(MACDEPLOYQT_EXE macdeployqt HINTS ${Qt5_PREFIX}/bin ENV PATH)
if(NOT MACDEPLOYQT_EXE) if(NOT MACDEPLOYQT_EXE)
message(FATAL_ERROR "macdeployqt is required to build on macOS") message(FATAL_ERROR "macdeployqt is required to build on macOS")
else()
message(STATUS "Using macdeployqt: ${MACDEPLOYQT_EXE}")
endif() endif()
message(STATUS "Using macdeployqt: ${MACDEPLOYQT_EXE}") elseif(MINGW)
elseif(WIN32) find_program(WINDEPLOYQT_EXE windeployqt HINTS ${Qt5_PREFIX}/bin ENV PATH)
find_program(WINDEPLOYQT_EXE windeployqt HINTS ${Qt5_PREFIX}/bin ${Qt5_PREFIX}/tools/qt5/bin ENV PATH)
if(NOT WINDEPLOYQT_EXE) if(NOT WINDEPLOYQT_EXE)
message(FATAL_ERROR "windeployqt is required to build on Windows") message(FATAL_ERROR "windeployqt is required to build on Windows")
else()
message(STATUS "Using windeployqt: ${WINDEPLOYQT_EXE}")
endif() endif()
message(STATUS "Using windeployqt: ${WINDEPLOYQT_EXE}")
endif() endif()
# Debian sets the build type to None for package builds. # Debian sets the the build type to None for package builds.
# Make sure we don't enable asserts there. # Make sure we don't enable asserts there.
set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS_NONE QT_NO_DEBUG) set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS_NONE QT_NO_DEBUG)
# Find Botan2 find_package(LibGPGError REQUIRED)
find_package(Botan2 REQUIRED) find_package(Gcrypt 1.7.0 REQUIRED)
if(BOTAN2_VERSION VERSION_LESS "2.11.0") find_package(Argon2 REQUIRED)
message(FATAL_ERROR "Botan2 2.11.0 or higher is required")
endif()
include_directories(SYSTEM ${BOTAN2_INCLUDE_DIR})
# Find zlib
find_package(ZLIB REQUIRED) find_package(ZLIB REQUIRED)
find_package(QREncode REQUIRED)
find_package(sodium 1.0.12 REQUIRED)
set(CMAKE_REQUIRED_INCLUDES ${ZLIB_INCLUDE_DIR})
if(ZLIB_VERSION_STRING VERSION_LESS "1.2.0") if(ZLIB_VERSION_STRING VERSION_LESS "1.2.0")
message(FATAL_ERROR "zlib 1.2.0 or higher is required to use the gzip format") message(FATAL_ERROR "zlib 1.2.0 or higher is required to use the gzip format")
endif() endif()
include_directories(SYSTEM ${ZLIB_INCLUDE_DIR})
include_directories(SYSTEM ${ARGON2_INCLUDE_DIR} ${sodium_INCLUDE_DIR})
# Optional
if(WITH_XC_YUBIKEY) if(WITH_XC_YUBIKEY)
find_package(PCSC REQUIRED) find_package(YubiKey REQUIRED)
include_directories(SYSTEM ${PCSC_INCLUDE_DIRS})
include_directories(SYSTEM ${YUBIKEY_INCLUDE_DIRS})
endif() endif()
if(UNIX) if(UNIX)
@@ -536,7 +494,7 @@ if(UNIX)
endif() endif()
endif() endif()
include_directories(SYSTEM ${ZLIB_INCLUDE_DIR}) include_directories(SYSTEM ${GCRYPT_INCLUDE_DIR} ${ZLIB_INCLUDE_DIR})
add_subdirectory(src) add_subdirectory(src)
add_subdirectory(share) add_subdirectory(share)

View File

@@ -1,20 +0,0 @@
# Contributor Code of Conduct
KeePassXC is an open project that welcomes everybody no matter their ethnicity, sex,
sexual identity or orientation, age, socio-economic status, nationality, or religion.
Regardless of what background you come from, feel encouraged to participate in
the project and express your views as long you are respectful to others.
We value all members of our community and so in order to ensure a harassment-free
experience for everyone and mutual respect among members of this community, we
impose the following simple rules:
- No bullying, no insults. Any form of harassment will not be tolerated.
- No racism, no sexism, no homophobia, no hurtful extremist views of any kind.
- Be mindful of what you say, be diligent in how you say it.
- Show respect and, as always, be excellent to each other.
Violations of these rules or any other form of abuse can be reported confidentially
to conduct AT keepassxc DOT org. Members who do not adhere to our code of conduct
will be banned either permanently or until they change their ways so as to be
compatible with a friendly, open, and inclusive community.

22
COPYING
View File

@@ -46,10 +46,6 @@ Files: cmake/FindYubiKey.cmake
Copyright: 2014 Kyle Manna <kyle@kylemanna.com> Copyright: 2014 Kyle Manna <kyle@kylemanna.com>
License: GPL-2 or GPL-3 License: GPL-2 or GPL-3
Files: cmake/FindBotan2.cmake
Copyright: 2018 Ribose Inc.
License: BSD-2-clause
Files: cmake/GenerateProductVersion.cmake Files: cmake/GenerateProductVersion.cmake
Copyright: 2015 halex2005 <akharlov@gmail.com> Copyright: 2015 halex2005 <akharlov@gmail.com>
License: MIT License: MIT
@@ -141,13 +137,11 @@ Files: share/icons/badges/2_Expired.svg
share/icons/database/C46_Help.svg share/icons/database/C46_Help.svg
share/icons/database/C53_Apply.svg share/icons/database/C53_Apply.svg
share/icons/database/C61_Services.svg share/icons/database/C61_Services.svg
Copyright: 2022 KeePassXC Team <team@keepassxc.org> Copyright: 2020 KeePassXC Team <team@keepassxc.org>
License: MIT License: MIT
Files: share/icons/application/scalable/actions/chevron-double-down.svg Files: share/icons/application/scalable/actions/chevron-double-down.svg
share/icons/application/scalable/actions/chevron-double-right.svg share/icons/application/scalable/actions/chevron-double-right.svg
share/icons/application/scalable/actions/database-lock.svg
share/icons/application/scalable/actions/database-lock-all.svg
share/icons/application/scalable/actions/document-close.svg share/icons/application/scalable/actions/document-close.svg
share/icons/application/scalable/actions/document-edit.svg share/icons/application/scalable/actions/document-edit.svg
share/icons/application/scalable/actions/document-export.svg share/icons/application/scalable/actions/document-export.svg
@@ -166,17 +160,12 @@ Files: share/icons/application/scalable/actions/chevron-double-down.svg
share/icons/application/scalable/actions/entry-edit.svg share/icons/application/scalable/actions/entry-edit.svg
share/icons/application/scalable/actions/entry-new.svg share/icons/application/scalable/actions/entry-new.svg
share/icons/application/scalable/actions/favicon-download.svg share/icons/application/scalable/actions/favicon-download.svg
share/icons/application/scalable/actions/fingerprint.svg
share/icons/application/scalable/actions/group-clone.svg
share/icons/application/scalable/actions/group-delete.svg share/icons/application/scalable/actions/group-delete.svg
share/icons/application/scalable/actions/group-edit.svg share/icons/application/scalable/actions/group-edit.svg
share/icons/application/scalable/actions/group-empty-trash.svg share/icons/application/scalable/actions/group-empty-trash.svg
share/icons/application/scalable/actions/group-new.svg share/icons/application/scalable/actions/group-new.svg
share/icons/application/scalable/actions/hammer-wrench.svg
share/icons/application/scalable/actions/health.svg
share/icons/application/scalable/actions/help-about.svg share/icons/application/scalable/actions/help-about.svg
share/icons/application/scalable/actions/key-enter.svg share/icons/application/scalable/actions/key-enter.svg
share/icons/application/scalable/actions/lock-question.svg
share/icons/application/scalable/actions/message-close.svg share/icons/application/scalable/actions/message-close.svg
share/icons/application/scalable/actions/move-down.svg share/icons/application/scalable/actions/move-down.svg
share/icons/application/scalable/actions/move-up.svg share/icons/application/scalable/actions/move-up.svg
@@ -192,9 +181,6 @@ Files: share/icons/application/scalable/actions/chevron-double-down.svg
share/icons/application/scalable/actions/statistics.svg share/icons/application/scalable/actions/statistics.svg
share/icons/application/scalable/actions/system-help.svg share/icons/application/scalable/actions/system-help.svg
share/icons/application/scalable/actions/system-search.svg share/icons/application/scalable/actions/system-search.svg
share/icons/application/scalable/actions/tag.svg
share/icons/application/scalable/actions/tag-search.svg
share/icons/application/scalable/actions/trash.svg
share/icons/application/scalable/actions/url-copy.svg share/icons/application/scalable/actions/url-copy.svg
share/icons/application/scalable/actions/username-copy.svg share/icons/application/scalable/actions/username-copy.svg
share/icons/application/scalable/actions/view-history.svg share/icons/application/scalable/actions/view-history.svg
@@ -244,9 +230,3 @@ Files: share/icons/application/scalable/actions/hibp.svg
share/icons/database/C64_Apple.svg share/icons/database/C64_Apple.svg
Copyright: GPL-2+ Copyright: GPL-2+
Comment: from the Simple Icons repo (https://github.com/simple-icons/simple-icons/) Comment: from the Simple Icons repo (https://github.com/simple-icons/simple-icons/)
Files: src/thirdparty/ykcore/yk*
src/thirdparty/ykcore/yubikey.h
Copyright: 2006-2015, Yubico AB
License: BSD-2-Clause
Comment: from the yubikey-personalization repo (https://github.com/Yubico/yubikey-personalization)

View File

@@ -12,20 +12,21 @@ Build Dependencies
The following tools must exist within your PATH: The following tools must exist within your PATH:
* make * make
* cmake (>= 3.3.0) * cmake (>= 2.8.12)
* g++ (>= 4.7) or clang++ (>= 6.0) * g++ (>= 4.7) or clang++ (>= 3.0)
* asciidoctor * asciidoctor (on Linux/MacOS)
The following libraries are required: The following libraries are required:
* Qt 5 (>= 5.9.5): qtbase5, qtbase5-private, libqt5svg5, qttools5, qt5-image-formats-plugins * Qt 5 (>= 5.2): qtbase and qttools5
* botan (>= 2.12) * libgcrypt (>= 1.6)
* zlib * zlib
* minizip * libmicrohttpd
* readline (for completion in cli) * libxi, libxtst, qtx11extras (optional for auto-type on X11)
* libqt5x11extras5, libxi, and libxtst (for auto-type on X11) * libsodium (>= 1.0.12)
* libargon2
* qrencode * qrencode
* libusb-1.0, pcsclite (optional to support YubiKey on Linux) * yubikey ykpers (optional to support YubiKey)
Prepare the Building Environment Prepare the Building Environment
================================ ================================
@@ -39,7 +40,7 @@ Build Steps
We recommend using the release tool to perform builds, please read up-to-date instructions [on our wiki](https://github.com/keepassxreboot/keepassxc/wiki/Building-KeePassXC#building-using-the-release-tool). We recommend using the release tool to perform builds, please read up-to-date instructions [on our wiki](https://github.com/keepassxreboot/keepassxc/wiki/Building-KeePassXC#building-using-the-release-tool).
To compile from source, open a **Terminal (on Linux/MacOS)** or a **MSYS2-MinGW shell (on Windows)**<br/> To compile from source, open a **Terminal (on Linux/MacOS)** or a **MSYS2-MinGW shell (on Windows)**<br/>
**Note:** on Windows you can also use MSVC to build natively, we recommend Visual Studio 2019 **Note:** on Windows make sure you are using a **MINGW shell** by checking the label before the current path
First, download the KeePassXC [source tarball](https://keepassxc.org/download#source) First, download the KeePassXC [source tarball](https://keepassxc.org/download#source)
or check out the latest version from our [Git repository](https://github.com/keepassxreboot/keepassxc). or check out the latest version from our [Git repository](https://github.com/keepassxreboot/keepassxc).
@@ -64,8 +65,6 @@ For a stable build, it is recommended to checkout the master branch.
git checkout master git checkout master
``` ```
NOTE: See the [Windows Build Instructions](https://github.com/keepassxreboot/keepassxc/wiki/Building-KeePassXC#windows) for building with MSVC.
Navigate to the directory where you have downloaded KeePassXC and type these commands: Navigate to the directory where you have downloaded KeePassXC and type these commands:
``` ```
@@ -75,7 +74,7 @@ cmake -DWITH_XC_ALL=ON ..
make make
``` ```
NOTE: If you are using MSYS2, you may have to add ```-G "MSYS Makefiles"``` to the beginning of the cmake command. If you are on Windows, you may have to add ```-G "MSYS Makefiles"``` to the beginning of the cmake command. See the [Windows Build Instructions](https://github.com/keepassxreboot/keepassxc/wiki/Building-KeePassXC#windows) for more information.
These steps place the compiled KeePassXC binary inside the `./build/src/` directory. These steps place the compiled KeePassXC binary inside the `./build/src/` directory.
(Note the cmake notes/options below.) (Note the cmake notes/options below.)
@@ -99,10 +98,12 @@ These steps place the compiled KeePassXC binary inside the `./build/src/` direct
-DWITH_XC_BROWSER=[ON|OFF] Enable/Disable KeePassXC-Browser extension support (default: OFF) -DWITH_XC_BROWSER=[ON|OFF] Enable/Disable KeePassXC-Browser extension support (default: OFF)
-DWITH_XC_NETWORKING=[ON|OFF] Enable/Disable Networking support (e.g., favicon downloading) (default: OFF) -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_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_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=[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) -DWITH_XC_ALL=[ON|OFF] Enable/Disable compiling all plugins above (default: OFF)
-DWITH_XC_UPDATECHECK=[ON|OFF] Enable/Disable automatic updating checking (requires WITH_XC_NETWORKING) (default: ON) -DWITH_XC_UPDATECHECK=[ON|OFF] Enable/Disable automatic updating checking (requires WITH_XC_NETWORKING) (default: ON)
-DWITH_TESTS=[ON|OFF] Enable/Disable building of unit tests (default: ON) -DWITH_TESTS=[ON|OFF] Enable/Disable building of unit tests (default: ON)

View File

@@ -1,12 +1,12 @@
GNU GENERAL PUBLIC LICENSE GNU GENERAL PUBLIC LICENSE
Version 2, June 1991 Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc., Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed. of this license document, but changing it is not allowed.
Preamble Preamble
The licenses for most software are designed to take away your The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public freedom to share and change it. By contrast, the GNU General Public
@@ -56,7 +56,7 @@ patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and The precise terms and conditions for copying, distribution and
modification follow. modification follow.
GNU GENERAL PUBLIC LICENSE GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains 0. This License applies to any program or other work which contains
@@ -255,7 +255,7 @@ make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally. of promoting the sharing and reuse of software generally.
NO WARRANTY NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
@@ -277,9 +277,9 @@ YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES. POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it possible use to the public, the best way to achieve this is to make it

View File

@@ -1,11 +1,12 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/> GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed. of this license document, but changing it is not allowed.
Preamble Preamble
The GNU General Public License is a free, copyleft license for The GNU General Public License is a free, copyleft license for
software and other kinds of works. software and other kinds of works.
@@ -68,7 +69,7 @@ patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and The precise terms and conditions for copying, distribution and
modification follow. modification follow.
TERMS AND CONDITIONS TERMS AND CONDITIONS
0. Definitions. 0. Definitions.
@@ -76,7 +77,7 @@ modification follow.
"Copyright" also means copyright-like laws that apply to other kinds of "Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks. works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this "The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations. "recipients" may be individuals or organizations.
@@ -509,7 +510,7 @@ actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid. country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties covered work, and grant a patent license to some of the parties
@@ -618,9 +619,9 @@ an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee. copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it possible use to the public, the best way to achieve this is to make it
@@ -645,7 +646,7 @@ the "copyright" line and a pointer to where the full notice is found.
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail. Also add information on how to contact you by electronic and paper mail.
@@ -664,11 +665,12 @@ might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school, You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary. if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>. <http://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read Public License instead of this License. But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>. <http://www.gnu.org/philosophy/why-not-lgpl.html>.

View File

@@ -55,7 +55,7 @@ modified by someone else and passed on, the recipients should know
that what they have is not the original version, so that the original that what they have is not the original version, so that the original
author's reputation will not be affected by problems that might be author's reputation will not be affected by problems that might be
introduced by others. introduced by others.
Finally, software patents pose a constant threat to the existence of Finally, software patents pose a constant threat to the existence of
any free program. We wish to make sure that a company cannot any free program. We wish to make sure that a company cannot
effectively restrict the users of a free program by obtaining a effectively restrict the users of a free program by obtaining a
@@ -111,7 +111,7 @@ modification follow. Pay close attention to the difference between a
"work based on the library" and a "work that uses the library". The "work based on the library" and a "work that uses the library". The
former contains code derived from the library, whereas the latter must former contains code derived from the library, whereas the latter must
be combined with the library in order to run. be combined with the library in order to run.
GNU LESSER GENERAL PUBLIC LICENSE GNU LESSER GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
@@ -158,7 +158,7 @@ Library.
You may charge a fee for the physical act of transferring a copy, You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a and you may at your option offer warranty protection in exchange for a
fee. fee.
2. You may modify your copy or copies of the Library or any portion 2. You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1 distribute such modifications or work under the terms of Section 1
@@ -216,7 +216,7 @@ instead of to this License. (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.) Do not make any other change in that version instead if you wish.) Do not make any other change in
these notices. these notices.
Once this change is made in a given copy, it is irreversible for Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy. subsequent copies and derivative works made from that copy.
@@ -267,7 +267,7 @@ Library will still fall under Section 6.)
distribute the object code for the work under the terms of Section 6. distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6, Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself. whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or 6. As an exception to the Sections above, you may also combine or
link a "work that uses the Library" with the Library to produce a link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work work containing portions of the Library, and distribute that work
@@ -329,7 +329,7 @@ restrictions of other proprietary libraries that do not normally
accompany the operating system. Such a contradiction means you cannot accompany the operating system. Such a contradiction means you cannot
use both them and the Library together in an executable that you use both them and the Library together in an executable that you
distribute. distribute.
7. You may place library facilities that are a work based on the 7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined facilities not covered by this License, and distribute such a combined
@@ -370,7 +370,7 @@ subject to these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein. restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties with You are not responsible for enforcing compliance by third parties with
this License. this License.
11. If, as a consequence of a court judgment or allegation of patent 11. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues), infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or conditions are imposed on you (whether by court order, agreement or
@@ -422,7 +422,7 @@ conditions either of that version or of any later version published by
the Free Software Foundation. If the Library does not specify a the Free Software Foundation. If the Library does not specify a
license version number, you may choose any version ever published by license version number, you may choose any version ever published by
the Free Software Foundation. the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free 14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these, programs whose distribution conditions are incompatible with these,
write to the author to ask for permission. For software which is write to the author to ask for permission. For software which is
@@ -456,7 +456,7 @@ SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES. DAMAGES.
END OF TERMS AND CONDITIONS END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest If you develop a new library, and you want it to be of the greatest

View File

@@ -1,7 +1,7 @@
GNU LESSER GENERAL PUBLIC LICENSE GNU LESSER GENERAL PUBLIC LICENSE
Version 3, 29 June 2007 Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/> Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed. of this license document, but changing it is not allowed.

View File

@@ -3,10 +3,7 @@
[![codecov](https://codecov.io/gh/keepassxreboot/keepassxc/branch/develop/graph/badge.svg)](https://codecov.io/gh/keepassxreboot/keepassxc) [![codecov](https://codecov.io/gh/keepassxreboot/keepassxc/branch/develop/graph/badge.svg)](https://codecov.io/gh/keepassxreboot/keepassxc)
[![GitHub release](https://img.shields.io/github/release/keepassxreboot/keepassxc)](https://github.com/keepassxreboot/keepassxc/releases/) [![GitHub release](https://img.shields.io/github/release/keepassxreboot/keepassxc)](https://github.com/keepassxreboot/keepassxc/releases/)
[![Matrix community channel](https://img.shields.io/matrix/keepassxc:matrix.org?label=Community%20channel)](https://app.element.io/#/room/#keepassxc:mozilla.org) [KeePassXC](https://keepassxc.org) is a modern, secure, and open-source password manager that stores and manages your most sensitive information. You can run KeePassXC on Windows, macOS, and Linux systems. KeePassXC is for people with extremely high demands of secure personal data management. It saves many different types of information, such as usernames, passwords, URLs, attachments, and notes in an offline, encrypted file that can be stored in any location, including private and public cloud solutions. For easy identification and management, user-defined titles and icons can be specified for entries. In addition, entries are sorted in customizable groups. An integrated search function allows you to use advanced patterns to easily find any entry in your database. A customizable, fast, and easy-to-use password generator utility allows you to create passwords with any combination of characters or easy to remember passphrases.
[![Matrix development channel](https://img.shields.io/matrix/keepassxc-dev:matrix.org?label=Development%20channel)](https://app.element.io/#/room/#keepassxc-dev:mozilla.org)
[KeePassXC](https://keepassxc.org) is a modern, secure, and open-source password manager that stores and manages your most sensitive information. You can run KeePassXC on Windows, macOS, and Linux systems. KeePassXC is for people with extremely high demands of secure personal data management. It saves many different types of information, such as usernames, passwords, URLs, attachments, and notes in an offline, encrypted file that can be stored in any location, including private and public cloud solutions. For easy identification and management, user-defined titles and icons can be specified for entries. In addition, entries are sorted into customizable groups. An integrated search function allows you to use advanced patterns to easily find any entry in your database. A customizable, fast, and easy-to-use password generator utility allows you to create passwords with any combination of characters or easy to remember passphrases.
## Quick Start ## Quick Start
The [QuickStart Guide](https://keepassxc.org/docs/KeePassXC_GettingStarted.html) gets you started using KeePassXC on your Windows, macOS, or Linux computer using pre-compiled binaries from the [downloads page](https://keepassxc.org/download). Additionally, individual Linux distributions may ship their own versions, so please check your distribution's package list to see if KeePassXC is available. Detailed documentation is available in the [User Guide](https://keepassxc.org/docs/KeePassXC_UserGuide.html). The [QuickStart Guide](https://keepassxc.org/docs/KeePassXC_GettingStarted.html) gets you started using KeePassXC on your Windows, macOS, or Linux computer using pre-compiled binaries from the [downloads page](https://keepassxc.org/download). Additionally, individual Linux distributions may ship their own versions, so please check your distribution's package list to see if KeePassXC is available. Detailed documentation is available in the [User Guide](https://keepassxc.org/docs/KeePassXC_UserGuide.html).
@@ -15,7 +12,7 @@ The [QuickStart Guide](https://keepassxc.org/docs/KeePassXC_GettingStarted.html)
KeePassXC has numerous features for novice and power users alike. Our goal is to create an application that can be used by anyone while still offering advanced features to those that need them. KeePassXC has numerous features for novice and power users alike. Our goal is to create an application that can be used by anyone while still offering advanced features to those that need them.
### Basic ### Basic
* Create, open, and save databases in the KDBX format (KeePass-compatible with KDBX4 and KDBX3) * Create, open, and save databases in the KDBX format (KeePass compatible to KDBX4 and KDBX3)
* Store sensitive information in entries that are organized by groups * Store sensitive information in entries that are organized by groups
* Search for entries * Search for entries
* Password generator * Password generator
@@ -48,12 +45,10 @@ Detailed instructions are available in the [Build and Install](./INSTALL.md) pag
## Contributing ## Contributing
We are always looking for suggestions on how to improve KeePassXC. If you find any bugs or have an idea for a new feature, please let us know by opening a report in the [issue tracker](https://github.com/keepassxreboot/keepassxc/issues) on GitHub, or join us on [Matrix community channel](https://matrix.to/#/!zUxwGnFkUyycpxeHeM:matrix.org?via=matrix.org) or [Matrix development channel](https://matrix.to/#/!RhJPJPGwQIFVQeXqZa:matrix.org?via=matrix.org), or on IRC in [Libera.Chat](https://web.libera.chat/) channels #keepassxc and #keepassxc-dev. We are always looking for suggestions on how to improve KeePassXC. If you find any bugs or have an idea for a new feature, please let us know by opening a report in the [issue tracker](https://github.com/keepassxreboot/keepassxc/issues) on GitHub or join us on IRC in [freenode](https://webchat.freenode.net/) channels #keepassxc and #keepassxc-dev.
You may directly contribute your own code by submitting a pull request. Please read the [CONTRIBUTING](.github/CONTRIBUTING.md) document for further information. You may directly contribute your own code by submitting a pull request. Please read the [CONTRIBUTING](.github/CONTRIBUTING.md) document for further information.
Contributors are required to adhere to the project's [Code of Conduct](CODE-OF-CONDUCT.md).
## License ## License
KeePassXC code is licensed under GPL-2 or GPL-3. Additional licensing for third-party files is detailed in [COPYING](./COPYING). KeePassXC code is licensed under GPL-2 or GPL-3. Additional licensing for third-party files is detailed in [COPYING](./COPYING).

View File

@@ -15,46 +15,50 @@
set(EXCLUDED_DIRS set(EXCLUDED_DIRS
# third-party directories # third-party directories
src/thirdparty src/zxcvbn/
src/zxcvbn
# objective-c directories # objective-c directories
src/touchid src/touchid/
src/autotype/mac src/autotype/mac/
src/gui/osutils/macutils) src/gui/osutils/macutils/)
set(EXCLUDED_FILES set(EXCLUDED_FILES
# third-party files # third-party files
src/streams/qtiocompressor.\\* streams/qtiocompressor.cpp
src/gui/KMessageWidget.\\* streams/qtiocompressor.h
src/gui/MainWindowAdaptor.\\* gui/KMessageWidget.h
src/gui/tag/TagsEdit.\\* gui/KMessageWidget.cpp
tests/modeltest.\\* gui/MainWindowAdaptor.h
gui/MainWindowAdaptor.cpp
crypto/ssh/bcrypt_pbkdf.cpp
crypto/ssh/blf.h
crypto/ssh/blowfish.c
tests/modeltest.cpp
tests/modeltest.h
# objective-c files # objective-c files
src/core/ScreenLockListenerMac.\\*) core/ScreenLockListenerMac.h
core/ScreenLockListenerMac.cpp)
set(FIND_EXCLUDE_DIR_EXPR "") file(GLOB_RECURSE ALL_SOURCE_FILES RELATIVE ${CMAKE_SOURCE_DIR} src/*.cpp src/*.h tests/*.cpp tests/*.h)
foreach(EXCLUDE ${EXCLUDED_DIRS}) foreach(SOURCE_FILE ${ALL_SOURCE_FILES})
list(APPEND FIND_EXCLUDE_DIR_EXPR -o -path "${EXCLUDE}" -prune) foreach(EXCLUDED_DIR ${EXCLUDED_DIRS})
string(FIND ${SOURCE_FILE} ${EXCLUDED_DIR} SOURCE_FILE_EXCLUDED)
if(NOT ${SOURCE_FILE_EXCLUDED} EQUAL -1)
list(REMOVE_ITEM ALL_SOURCE_FILES ${SOURCE_FILE})
endif()
endforeach()
foreach(EXCLUDED_FILE ${EXCLUDED_FILES})
if(${SOURCE_FILE} MATCHES ".*${EXCLUDED_FILE}$")
list(REMOVE_ITEM ALL_SOURCE_FILES ${SOURCE_FILE})
endif()
endforeach()
endforeach() endforeach()
set(FIND_EXCLUDE_FILE_EXPR "")
foreach(EXCLUDE ${EXCLUDED_FILES})
if(FIND_EXCLUDE_FILE_EXPR)
list(APPEND FIND_EXCLUDE_FILE_EXPR -o)
endif()
list(APPEND FIND_EXCLUDE_FILE_EXPR -path "${EXCLUDE}")
endforeach()
if(FIND_EXCLUDE_FILE_EXPR)
set(FIND_EXCLUDE_FILE_EXPR -a -not "\\(" ${FIND_EXCLUDE_FILE_EXPR} "\\)")
endif()
add_custom_target(format) add_custom_target(format)
foreach(SOURCE_FILE ${ALL_SOURCE_FILES})
add_custom_command( add_custom_command(
TARGET format TARGET format
PRE_BUILD PRE_BUILD
COMMAND find src tests "\\(" -name "\\*.h" -o -name "\\*.cpp" ${FIND_EXCLUDE_DIR_EXPR} "\\)" COMMAND echo Formatting ${SOURCE_FILE}
${FIND_EXCLUDE_FILE_EXPR} -type f -print0 | xargs -0 -P0 -n10 clang-format -style=file -i COMMAND clang-format -style=file -i \"${SOURCE_FILE}\"
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
COMMENT "Formatting source files..." endforeach()
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})

View File

@@ -1,5 +1,4 @@
# Copyright (c) 2012 - 2017, Lars Bilke # Copyright (c) 2012 - 2017, Lars Bilke
# Copyright (c) 2021 KeePassXC Team
# All rights reserved. # All rights reserved.
# #
# Redistribution and use in source and binary forms, with or without modification, # Redistribution and use in source and binary forms, with or without modification,
@@ -26,218 +25,279 @@
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
# CHANGES:
#
# 2012-01-31, Lars Bilke
# - Enable Code Coverage
#
# 2013-09-17, Joakim Söderberg
# - Added support for Clang.
# - Some additional usage instructions.
#
# 2016-02-03, Lars Bilke
# - Refactored functions to use named parameters
#
# 2017-06-02, Lars Bilke
# - Merged with modified version from github.com/ufz/ogs
#
#
# USAGE:
#
# 1. Copy this file into your cmake modules path.
#
# 2. Add the following line to your CMakeLists.txt:
# include(CodeCoverage)
#
# 3. Append necessary compiler flags:
# APPEND_COVERAGE_COMPILER_FLAGS()
#
# 4. If you need to exclude additional directories from the report, specify them
# using the COVERAGE_LCOV_EXCLUDES variable before calling SETUP_TARGET_FOR_COVERAGE_LCOV.
# Example:
# set(COVERAGE_LCOV_EXCLUDES 'dir1/*' 'dir2/*')
#
# 5. Use the functions described below to create a custom make target which
# runs your test executable and produces a code coverage report.
#
# 6. Build a Debug build:
# cmake -DCMAKE_BUILD_TYPE=Debug ..
# make
# make my_coverage_target
#
include(CMakeParseArguments) include(CMakeParseArguments)
# Check prereqs # Check prereqs
find_program(GCOV_PATH gcov) find_program( GCOV_PATH gcov )
find_program(LLVM_COV_PATH llvm-cov) find_program( LCOV_PATH NAMES lcov lcov.bat lcov.exe lcov.perl)
find_program(LLVM_PROFDATA_PATH llvm-profdata) find_program( GENHTML_PATH NAMES genhtml genhtml.perl genhtml.bat )
find_program(XCRUN_PATH xcrun) find_program( GCOVR_PATH gcovr PATHS ${CMAKE_SOURCE_DIR}/scripts/test)
find_program(GENHTML_PATH NAMES genhtml genhtml.perl genhtml.bat) find_program( SIMPLE_PYTHON_EXECUTABLE python )
find_program(GCOVR_PATH gcovr PATHS ${CMAKE_SOURCE_DIR}/scripts/test)
set(COVERAGE_COMPILER_FLAGS "-g -O0" CACHE INTERNAL "") if(NOT GCOV_PATH)
if(CMAKE_COMPILER_IS_GNUCXX) message(FATAL_ERROR "gcov not found! Aborting...")
set(COVERAGE_COMPILER_FLAGS "${COVERAGE_COMPILER_FLAGS} --coverage -fprofile-arcs -ftest-coverage") endif() # NOT GCOV_PATH
elseif(CMAKE_COMPILER_IS_CLANGXX)
set(COVERAGE_COMPILER_FLAGS "${COVERAGE_COMPILER_FLAGS} -fprofile-instr-generate -fcoverage-mapping") if("${CMAKE_CXX_COMPILER_ID}" MATCHES "(Apple)?[Cc]lang")
if("${CMAKE_CXX_COMPILER_VERSION}" VERSION_LESS 3)
message(FATAL_ERROR "Clang version must be 3.0.0 or greater! Aborting...")
endif()
elseif(NOT CMAKE_COMPILER_IS_GNUCXX)
message(FATAL_ERROR "Compiler is not GNU gcc! Aborting...")
endif() endif()
set(CMAKE_COVERAGE_FORMAT set(COVERAGE_COMPILER_FLAGS "-g -O0 --coverage -fprofile-arcs -ftest-coverage"
"html" "xml" CACHE INTERNAL "")
CACHE STRING "Coverage report output format.")
set_property(CACHE CMAKE_COVERAGE_FORMAT PROPERTY STRINGS "html" "txt")
set(CMAKE_CXX_FLAGS_COVERAGE set(CMAKE_CXX_FLAGS_COVERAGE
${COVERAGE_COMPILER_FLAGS} ${COVERAGE_COMPILER_FLAGS}
CACHE STRING "Flags used by the C++ compiler during coverage builds.") CACHE STRING "Flags used by the C++ compiler during coverage builds."
FORCE )
set(CMAKE_C_FLAGS_COVERAGE set(CMAKE_C_FLAGS_COVERAGE
${COVERAGE_COMPILER_FLAGS} ${COVERAGE_COMPILER_FLAGS}
CACHE STRING "Flags used by the C compiler during coverage builds.") CACHE STRING "Flags used by the C compiler during coverage builds."
FORCE )
set(CMAKE_EXE_LINKER_FLAGS_COVERAGE set(CMAKE_EXE_LINKER_FLAGS_COVERAGE
"" ""
CACHE STRING "Flags used for linking binaries during coverage builds.") CACHE STRING "Flags used for linking binaries during coverage builds."
FORCE )
set(CMAKE_SHARED_LINKER_FLAGS_COVERAGE set(CMAKE_SHARED_LINKER_FLAGS_COVERAGE
"" ""
CACHE STRING "Flags used by the shared libraries linker during coverage builds.") CACHE STRING "Flags used by the shared libraries linker during coverage builds."
FORCE )
mark_as_advanced( mark_as_advanced(
CMAKE_COVERAGE_FORMAT
CMAKE_CXX_FLAGS_COVERAGE CMAKE_CXX_FLAGS_COVERAGE
CMAKE_C_FLAGS_COVERAGE CMAKE_C_FLAGS_COVERAGE
CMAKE_EXE_LINKER_FLAGS_COVERAGE CMAKE_EXE_LINKER_FLAGS_COVERAGE
CMAKE_SHARED_LINKER_FLAGS_COVERAGE) CMAKE_SHARED_LINKER_FLAGS_COVERAGE )
if(NOT CMAKE_BUILD_TYPE_LOWER STREQUAL "debug") if(NOT CMAKE_BUILD_TYPE_LOWER STREQUAL "debug")
message(WARNING "Code coverage results with an optimised (non-Debug) build may be misleading") message(WARNING "Code coverage results with an optimised (non-Debug) build may be misleading")
endif() # NOT CMAKE_BUILD_TYPE STREQUAL "Debug" endif() # NOT CMAKE_BUILD_TYPE STREQUAL "Debug"
if(CMAKE_COMPILER_IS_GNUCXX) if(CMAKE_C_COMPILER_ID STREQUAL "GNU")
if(NOT GCOV_PATH)
message(FATAL_ERROR "gcov not found! Aborting...")
endif() # NOT GCOV_PATH
link_libraries(gcov) link_libraries(gcov)
else()
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --coverage")
endif() endif()
# Defines a target for running and collection code coverage information # Defines a target for running and collection code coverage information
# Builds dependencies, runs the given executable and outputs reports. # Builds dependencies, runs the given executable and outputs reports.
# NOTE! The executable should always have a ZERO as exit code otherwise # NOTE! The executable should always have a ZERO as exit code otherwise
# the coverage generation will not complete. # the coverage generation will not complete.
# #
# SETUP_TARGET_FOR_COVERAGE_GCOVR( # SETUP_TARGET_FOR_COVERAGE_LCOV(
# NAME testrunner_coverage # New target name
# EXECUTABLE testrunner -j ${PROCESSOR_COUNT} # Executable in PROJECT_BINARY_DIR
# DEPENDENCIES testrunner # Dependencies to build first
# )
function(SETUP_TARGET_FOR_COVERAGE_LCOV)
set(options NONE)
set(oneValueArgs NAME)
set(multiValueArgs EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES)
cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
if(NOT LCOV_PATH)
message(FATAL_ERROR "lcov not found! Aborting...")
endif() # NOT LCOV_PATH
if(NOT GENHTML_PATH)
message(FATAL_ERROR "genhtml not found! Aborting...")
endif() # NOT GENHTML_PATH
# Setup target
add_custom_target(${Coverage_NAME}
# Cleanup lcov
COMMAND ${LCOV_PATH} --gcov-tool ${GCOV_PATH} -directory . --zerocounters
# Create baseline to make sure untouched files show up in the report
COMMAND ${LCOV_PATH} --gcov-tool ${GCOV_PATH} -c -i -d . -o ${Coverage_NAME}.base
# Run tests
COMMAND ${Coverage_EXECUTABLE}
# Capturing lcov counters and generating report
COMMAND ${LCOV_PATH} --gcov-tool ${GCOV_PATH} --directory . --capture --output-file ${Coverage_NAME}.info
# add baseline counters
COMMAND ${LCOV_PATH} --gcov-tool ${GCOV_PATH} -a ${Coverage_NAME}.base -a ${Coverage_NAME}.info --output-file ${Coverage_NAME}.total
COMMAND ${LCOV_PATH} --gcov-tool ${GCOV_PATH} --remove ${Coverage_NAME}.total ${COVERAGE_LCOV_EXCLUDES} --output-file ${PROJECT_BINARY_DIR}/${Coverage_NAME}.info.cleaned
COMMAND ${GENHTML_PATH} -o ${Coverage_NAME} ${PROJECT_BINARY_DIR}/${Coverage_NAME}.info.cleaned
COMMAND ${CMAKE_COMMAND} -E remove ${Coverage_NAME}.base ${Coverage_NAME}.total ${PROJECT_BINARY_DIR}/${Coverage_NAME}.info.cleaned
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
DEPENDS ${Coverage_DEPENDENCIES}
COMMENT "Resetting code coverage counters to zero.\nProcessing code coverage counters and generating report."
)
# Show where to find the lcov info report
add_custom_command(TARGET ${Coverage_NAME} POST_BUILD
COMMAND ;
COMMENT "Lcov code coverage info report saved in ${Coverage_NAME}.info."
)
# Show info where to find the report
add_custom_command(TARGET ${Coverage_NAME} POST_BUILD
COMMAND ;
COMMENT "Open ./${Coverage_NAME}/index.html in your browser to view the coverage report."
)
endfunction() # SETUP_TARGET_FOR_COVERAGE_LCOV
# Defines a target for running and collection code coverage information
# Builds dependencies, runs the given executable and outputs reports.
# NOTE! The executable should always have a ZERO as exit code otherwise
# the coverage generation will not complete.
#
# SETUP_TARGET_FOR_COVERAGE_GCOVR_XML(
# NAME ctest_coverage # New target name # NAME ctest_coverage # New target name
# EXECUTABLE ctest -j ${PROCESSOR_COUNT} # Executable in PROJECT_BINARY_DIR # EXECUTABLE ctest -j ${PROCESSOR_COUNT} # Executable in PROJECT_BINARY_DIR
# DEPENDENCIES executable_target # Dependencies to build first # DEPENDENCIES executable_target # Dependencies to build first
# ) # )
function(SETUP_TARGET_FOR_COVERAGE_GCOVR) function(SETUP_TARGET_FOR_COVERAGE_GCOVR_XML)
set(options NONE) set(options NONE)
set(oneValueArgs NAME SOURCES_ROOT) set(oneValueArgs NAME)
set(multiValueArgs EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES) set(multiValueArgs EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES)
cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
if(NOT SIMPLE_PYTHON_EXECUTABLE)
message(FATAL_ERROR "python not found! Aborting...")
endif() # NOT SIMPLE_PYTHON_EXECUTABLE
if(NOT GCOVR_PATH) if(NOT GCOVR_PATH)
message(FATAL_ERROR "gcovr not found! Aborting...") message(FATAL_ERROR "gcovr not found! Aborting...")
endif() # NOT GCOVR_PATH endif() # NOT GCOVR_PATH
# Combine excludes to several -e arguments # Combine excludes to several -e arguments
set(GCOVR_EXCLUDES "") set(GCOVR_EXCLUDES "")
foreach(EXCLUDE ${COVERAGE_EXCLUDES}) foreach(EXCLUDE ${COVERAGE_GCOVR_EXCLUDES})
list(APPEND GCOVR_EXCLUDES "-e") list(APPEND GCOVR_EXCLUDES "-e")
list(APPEND GCOVR_EXCLUDES "${EXCLUDE}") list(APPEND GCOVR_EXCLUDES "${EXCLUDE}")
endforeach() endforeach()
add_custom_target(${Coverage_NAME} add_custom_target(${Coverage_NAME}
# Run tests # Run tests
COMMAND ctest -C $<CONFIG> $ENV{ARGS} $$ARGS ${Coverage_EXECUTABLE}
# Running gcovr
COMMAND ${GCOVR_PATH} --xml
-r ${PROJECT_SOURCE_DIR} ${GCOVR_EXCLUDES}
--object-directory=${PROJECT_BINARY_DIR}
-o ${Coverage_NAME}.xml
WORKING_DIRECTORY ${PROJECT_BINARY_DIR} WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
DEPENDS ${Coverage_DEPENDENCIES} DEPENDS ${Coverage_DEPENDENCIES}
COMMENT "Running gcovr to produce Cobertura code coverage report."
) )
if("html" IN_LIST CMAKE_COVERAGE_FORMAT) # Show info where to find the report
add_custom_command(TARGET ${Coverage_NAME} POST_BUILD add_custom_command(TARGET ${Coverage_NAME} POST_BUILD
# Create folder COMMAND ;
COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/${Coverage_NAME}-html COMMENT "Cobertura code coverage report saved in ${Coverage_NAME}.xml."
)
# Running gcovr HTML endfunction() # SETUP_TARGET_FOR_COVERAGE_GCOVR_XML
COMMAND ${GCOVR_PATH} --html --html-details
-r ${Coverage_SOURCES_ROOT} ${GCOVR_EXCLUDES}
--object-directory=${PROJECT_BINARY_DIR}
--exclude-unreachable-branches --exclude-throw-branches
-o ${Coverage_NAME}-html/index.html
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
COMMENT "Running gcovr to produce HTML code coverage report ${Coverage_NAME}-html."
)
endif()
if("xml" IN_LIST CMAKE_COVERAGE_FORMAT)
add_custom_command(TARGET ${Coverage_NAME} POST_BUILD
# Running gcovr TXT
COMMAND ${GCOVR_PATH} --xml
-r ${Coverage_SOURCES_ROOT} ${GCOVR_EXCLUDES}
--object-directory=${PROJECT_BINARY_DIR}
--exclude-unreachable-branches --exclude-throw-branches
-o ${Coverage_NAME}.xml
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
COMMENT "Running gcovr to produce XML code coverage report ${Coverage_NAME}.xml."
)
endif()
if("txt" IN_LIST CMAKE_COVERAGE_FORMAT)
add_custom_command(TARGET ${Coverage_NAME} POST_BUILD
# Running gcovr TXT
COMMAND ${GCOVR_PATH}
-r ${Coverage_SOURCES_ROOT} ${GCOVR_EXCLUDES}
--object-directory=${PROJECT_BINARY_DIR}
--exclude-unreachable-branches --exclude-throw-branches
-o ${Coverage_NAME}.txt
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
COMMENT "Running gcovr to produce TXT code coverage report ${Coverage_NAME}.txt."
)
endif()
endfunction() # SETUP_TARGET_FOR_COVERAGE_GCOVR
# Defines a target for running and collection code coverage information # Defines a target for running and collection code coverage information
# Builds dependencies, runs the given executable and outputs reports. # Builds dependencies, runs the given executable and outputs reports.
# NOTE! The executable should always have a ZERO as exit code otherwise # NOTE! The executable should always have a ZERO as exit code otherwise
# the coverage generation will not complete. # the coverage generation will not complete.
# #
# SETUP_TARGET_FOR_COVERAGE_LLVM( # SETUP_TARGET_FOR_COVERAGE_GCOVR_HTML(
# NAME ctest_coverage # New target name # NAME ctest_coverage # New target name
# EXECUTABLE ctest -j ${PROCESSOR_COUNT} # Executable in PROJECT_BINARY_DIR # EXECUTABLE ctest -j ${PROCESSOR_COUNT} # Executable in PROJECT_BINARY_DIR
# DEPENDENCIES executable_target # Dependencies to build first # DEPENDENCIES executable_target # Dependencies to build first
# ) # )
function(SETUP_TARGET_FOR_COVERAGE_LLVM) function(SETUP_TARGET_FOR_COVERAGE_GCOVR_HTML)
set(options NONE) set(options NONE)
set(oneValueArgs NAME SOURCES_ROOT PROF_FILE) set(oneValueArgs NAME)
set(multiValueArgs EXECUTABLE BINARY EXECUTABLE_ARGS DEPENDENCIES) set(multiValueArgs EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES)
cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
if(XCRUN_PATH) if(NOT SIMPLE_PYTHON_EXECUTABLE)
set(LLVM_COV_PATH ${XCRUN_PATH} llvm-cov) message(FATAL_ERROR "python not found! Aborting...")
set(LLVM_PROFDATA_PATH ${XCRUN_PATH} llvm-profdata) endif() # NOT SIMPLE_PYTHON_EXECUTABLE
else()
if(NOT LLVM_COV_PATH)
message(FATAL_ERROR "llvm-cov not found! Aborting...")
endif() # NOT LLVM_COV_PATH
if(NOT LLVM_PROFDATA_PATH)
message(FATAL_ERROR "llvm-profdata not found! Aborting...")
endif() # NOT LLVM_PROFDATA_PATH
endif() # XCRUN_PATH
set(LLVM_PROFILE_DIR ${PROJECT_BINARY_DIR}/llvm_profile) if(NOT GCOVR_PATH)
file(REMOVE_RECURSE ${LLVM_PROFILE_DIR}) message(FATAL_ERROR "gcovr not found! Aborting...")
endif() # NOT GCOVR_PATH
set(COV_EXCLUDES "") # Combine excludes to several -e arguments
foreach(EXCLUDE ${COVERAGE_EXCLUDES}) set(GCOVR_EXCLUDES "")
list(APPEND COV_EXCLUDES "-ignore-filename-regex=${EXCLUDE}") foreach(EXCLUDE ${COVERAGE_GCOVR_EXCLUDES})
list(APPEND GCOVR_EXCLUDES "-e")
list(APPEND GCOVR_EXCLUDES "${EXCLUDE}")
endforeach() endforeach()
list(GET Coverage_BINARY 0 COV_BINARY)
if(Coverage_BINARY)
list(REMOVE_AT Coverage_BINARY 0)
foreach(BIN ${Coverage_BINARY})
list(APPEND COV_BINARY -object ${BIN})
endforeach()
endif()
add_custom_target(${Coverage_NAME} add_custom_target(${Coverage_NAME}
COMMAND ${CMAKE_COMMAND} -E env LLVM_PROFILE_FILE=${LLVM_PROFILE_DIR}/profile-%p.profraw ctest -C $<CONFIG> $$ARGS # Run tests
${Coverage_EXECUTABLE}
COMMAND ${LLVM_PROFDATA_PATH} merge -sparse ${LLVM_PROFILE_DIR}/* -o coverage.profdata # Create folder
WORKING_DIRECTORY ${PROJECT_BINARY_DIR} COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/${Coverage_NAME}
DEPENDS ${Coverage_DEPENDENCIES})
if("html" IN_LIST CMAKE_COVERAGE_FORMAT) # Running gcovr
add_custom_command(TARGET ${Coverage_NAME} POST_BUILD COMMAND ${GCOVR_PATH} --html --html-details
COMMAND ${LLVM_COV_PATH} show -instr-profile=coverage.profdata ${COV_BINARY} -r ${PROJECT_SOURCE_DIR} ${GCOVR_EXCLUDES}
--format=html --output-dir=${Coverage_NAME}-html ${COV_EXCLUDES} ${Coverage_SOURCES_ROOT} --object-directory=${PROJECT_BINARY_DIR}
WORKING_DIRECTORY ${PROJECT_BINARY_DIR} -o ${Coverage_NAME}/index.html
COMMENT "Running llvm-cov to produce HTML code coverage report ${Coverage_NAME}-html") WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
endif() DEPENDS ${Coverage_DEPENDENCIES}
COMMENT "Running gcovr to produce HTML code coverage report."
)
if("xml" IN_LIST CMAKE_COVERAGE_FORMAT) # Show info where to find the report
message(WARNING "XML coverage report format not supported for llvm-cov") add_custom_command(TARGET ${Coverage_NAME} POST_BUILD
endif() COMMAND ;
COMMENT "Open ./${Coverage_NAME}/index.html in your browser to view the coverage report."
if("txt" IN_LIST CMAKE_COVERAGE_FORMAT) )
add_custom_command(TARGET ${Coverage_NAME} POST_BUILD
COMMAND ${LLVM_COV_PATH} show -instr-profile=coverage.profdata ${COV_BINARY}
--format=text ${COV_EXCLUDES} ${Coverage_SOURCES_ROOT} > ${Coverage_NAME}.txt
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
COMMENT "Running llvm-cov to produce TXT code coverage report ${Coverage_NAME}.txt.")
endif()
endfunction() # SETUP_TARGET_FOR_COVERAGE_LLVM
endfunction() # SETUP_TARGET_FOR_COVERAGE_GCOVR_HTML
function(APPEND_COVERAGE_COMPILER_FLAGS) function(APPEND_COVERAGE_COMPILER_FLAGS)
message(STATUS "Appending code coverage compiler flags: ${COVERAGE_COMPILER_FLAGS}")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COVERAGE_COMPILER_FLAGS}" PARENT_SCOPE) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COVERAGE_COMPILER_FLAGS}" PARENT_SCOPE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COVERAGE_COMPILER_FLAGS}" PARENT_SCOPE) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COVERAGE_COMPILER_FLAGS}" PARENT_SCOPE)
endfunction() # APPEND_COVERAGE_COMPILER_FLAGS message(STATUS "Appending code coverage compiler flags: ${COVERAGE_COMPILER_FLAGS}")
endfunction() # APPEND_COVERAGE_COMPILER_FLAGS

36
cmake/FindArgon2.cmake Normal file
View File

@@ -0,0 +1,36 @@
# Copyright (C) 2017 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
# 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/>.
find_path(ARGON2_INCLUDE_DIR argon2.h)
if(MINGW)
# find static library on Windows, and redefine used symbols to
# avoid definition name conflicts with libsodium
find_library(ARGON2_SYS_LIBRARIES libargon2.a)
message(STATUS "Patching libargon2...\n")
execute_process(COMMAND objcopy
--redefine-sym argon2_hash=libargon2_argon2_hash
--redefine-sym _argon2_hash=_libargon2_argon2_hash
--redefine-sym argon2_error_message=libargon2_argon2_error_message
--redefine-sym _argon2_error_message=_libargon2_argon2_error_message
${ARGON2_SYS_LIBRARIES} ${CMAKE_BINARY_DIR}/libargon2_patched.a
WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
find_library(ARGON2_LIBRARIES libargon2_patched.a PATHS ${CMAKE_BINARY_DIR} NO_DEFAULT_PATH)
else()
find_library(ARGON2_LIBRARIES argon2)
endif()
mark_as_advanced(ARGON2_LIBRARIES ARGON2_INCLUDE_DIR)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Argon2 DEFAULT_MSG ARGON2_LIBRARIES ARGON2_INCLUDE_DIR)

View File

@@ -1,106 +0,0 @@
# Copyright (c) 2018 Ribose Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#.rst:
# FindBotan2
# -----------
#
# Find the botan-2 library.
#
# IMPORTED Targets
# ^^^^^^^^^^^^^^^^
#
# This module defines :prop_tgt:`IMPORTED` targets:
#
# ``Botan2::Botan2``
# The botan-2 library, if found.
#
# Result variables
# ^^^^^^^^^^^^^^^^
#
# This module defines the following variables:
#
# ::
#
# BOTAN2_FOUND - true if the headers and library were found
# BOTAN2_INCLUDE_DIRS - where to find headers
# BOTAN2_LIBRARIES - list of libraries to link
# BOTAN2_VERSION - library version that was found, if any
# find the headers
find_path(BOTAN2_INCLUDE_DIR
NAMES botan/version.h
PATH_SUFFIXES botan-2
)
# find the library
find_library(BOTAN2_LIBRARY NAMES botan-2 libbotan-2 botan)
# determine the version
if(BOTAN2_INCLUDE_DIR AND EXISTS "${BOTAN2_INCLUDE_DIR}/botan/build.h")
file(STRINGS "${BOTAN2_INCLUDE_DIR}/botan/build.h" botan2_version_str
REGEX "^#define[\t ]+(BOTAN_VERSION_[A-Z]+)[\t ]+[0-9]+")
string(REGEX REPLACE ".*#define[\t ]+BOTAN_VERSION_MAJOR[\t ]+([0-9]+).*"
"\\1" _botan2_version_major "${botan2_version_str}")
string(REGEX REPLACE ".*#define[\t ]+BOTAN_VERSION_MINOR[\t ]+([0-9]+).*"
"\\1" _botan2_version_minor "${botan2_version_str}")
string(REGEX REPLACE ".*#define[\t ]+BOTAN_VERSION_PATCH[\t ]+([0-9]+).*"
"\\1" _botan2_version_patch "${botan2_version_str}")
set(BOTAN2_VERSION "${_botan2_version_major}.${_botan2_version_minor}.${_botan2_version_patch}"
CACHE INTERNAL "The version of Botan which was detected")
endif()
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Botan2
REQUIRED_VARS BOTAN2_LIBRARY BOTAN2_INCLUDE_DIR
VERSION_VAR BOTAN2_VERSION
)
if(BOTAN2_FOUND)
set(BOTAN2_INCLUDE_DIRS ${BOTAN2_INCLUDE_DIR} ${PC_BOTAN2_INCLUDE_DIRS})
set(BOTAN2_LIBRARIES ${BOTAN2_LIBRARY})
endif()
if(BOTAN2_FOUND AND NOT TARGET Botan2::Botan2)
# create the new library target
add_library(Botan2::Botan2 UNKNOWN IMPORTED)
# set the required include dirs for the target
if(BOTAN2_INCLUDE_DIRS)
set_target_properties(Botan2::Botan2
PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${BOTAN2_INCLUDE_DIRS}"
)
endif()
# set the required libraries for the target
if(EXISTS "${BOTAN2_LIBRARY}")
set_target_properties(Botan2::Botan2
PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES "C"
IMPORTED_LOCATION "${BOTAN2_LIBRARY}"
)
endif()
endif()
mark_as_advanced(BOTAN2_INCLUDE_DIR BOTAN2_LIBRARY)

31
cmake/FindGcrypt.cmake Normal file
View File

@@ -0,0 +1,31 @@
# Copyright (C) 2011 Felix Geyer <debfx@fobos.de>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 or (at your option)
# version 3 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
find_path(GCRYPT_INCLUDE_DIR gcrypt.h)
find_library(GCRYPT_LIBRARIES gcrypt)
mark_as_advanced(GCRYPT_LIBRARIES GCRYPT_INCLUDE_DIR)
if(GCRYPT_INCLUDE_DIR AND EXISTS "${GCRYPT_INCLUDE_DIR}/gcrypt.h")
file(STRINGS "${GCRYPT_INCLUDE_DIR}/gcrypt.h" GCRYPT_H REGEX "^#define GCRYPT_VERSION \"[^\"]*\"$")
string(REGEX REPLACE "^.*GCRYPT_VERSION \"([0-9]+).*$" "\\1" GCRYPT_VERSION_MAJOR "${GCRYPT_H}")
string(REGEX REPLACE "^.*GCRYPT_VERSION \"[0-9]+\\.([0-9]+).*$" "\\1" GCRYPT_VERSION_MINOR "${GCRYPT_H}")
string(REGEX REPLACE "^.*GCRYPT_VERSION \"[0-9]+\\.[0-9]+\\.([0-9]+).*$" "\\1" GCRYPT_VERSION_PATCH "${GCRYPT_H}")
set(GCRYPT_VERSION_STRING "${GCRYPT_VERSION_MAJOR}.${GCRYPT_VERSION_MINOR}.${GCRYPT_VERSION_PATCH}")
endif()
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Gcrypt DEFAULT_MSG GCRYPT_LIBRARIES GCRYPT_INCLUDE_DIR)

View File

@@ -1,19 +1,23 @@
# Copyright (C) 2021 KeePassXC Team <team@keepassxc.org> # Copyright (C) 2017 KeePassXC Team <team@keepassxc.org>
# #
# This program is free software: you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 or (at your option) # the Free Software Foundation, either version 2 or (at your option)
# version 3 of the License. # version 3 of the License.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
if(WITH_XC_YUBIKEY) find_path(GPGERROR_INCLUDE_DIR gpg-error.h)
add_subdirectory(ykcore) find_library(GPGERROR_LIBRARIES gpg-error)
set(thirdparty_LIBRARIES ${thirdparty_LIBRARIES} ykcore PARENT_SCOPE)
endif() mark_as_advanced(GPGERROR_LIBRARIES GPGERROR_INCLUDE_DIR)
include(FindPackageHandleStandardArgs)
include_directories(${GPGERROR_INCLUDE_DIR})
find_package_handle_standard_args(LibGPGError DEFAULT_MSG GPGERROR_LIBRARIES GPGERROR_INCLUDE_DIR)

View File

@@ -1,9 +0,0 @@
# MINIZIP_FOUND - Minizip library was found
# MINIZIP_INCLUDE_DIR - Path to Minizip include dir
# MINIZIP_LIBRARIES - List of Minizip libraries
find_library(MINIZIP_LIBRARIES NAMES minizip libminizip)
find_path(MINIZIP_INCLUDE_DIR zip.h PATH_SUFFIXES minizip)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Minizip DEFAULT_MSG MINIZIP_LIBRARIES MINIZIP_INCLUDE_DIR)

View File

@@ -1,39 +0,0 @@
# Copyright (C) 2021 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/>.
# Use pkgconfig on Linux
if(NOT WIN32)
find_package(PkgConfig QUIET)
pkg_check_modules(PCSC libpcsclite)
endif()
if(NOT PCSC_FOUND)
# Search for PC/SC headers on Mac and Windows
find_path(PCSC_INCLUDE_DIRS winscard.h
HINTS
${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES}
/usr/include/PCSC
PATH_SUFFIXES PCSC)
# MAC library is PCSC, Windows library is WinSCard
find_library(PCSC_LIBRARIES NAMES pcsclite libpcsclite WinSCard PCSC
HINTS
${CMAKE_C_IMPLICIT_LINK_DIRECTORIES})
endif()
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(PCSC DEFAULT_MSG PCSC_LIBRARIES PCSC_INCLUDE_DIRS)
mark_as_advanced(PCSC_LIBRARIES PCSC_INCLUDE_DIRS)

View File

@@ -13,15 +13,8 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
find_path(QRENCODE_INCLUDE_DIR NAMES qrencode.h) find_path(QRENCODE_INCLUDE_DIR qrencode.h)
find_library(QRENCODE_LIBRARY qrencode)
if (VCPKG_INSTALLED_DIR)
find_library(QRENCODE_LIBRARY_RELEASE qrencode)
find_library(QRENCODE_LIBRARY_DEBUG qrencoded)
set(QRENCODE_LIBRARY optimized ${QRENCODE_LIBRARY_RELEASE} debug ${QRENCODE_LIBRARY_DEBUG})
else()
find_library(QRENCODE_LIBRARY qrencode)
endif()
mark_as_advanced(QRENCODE_LIBRARY QRENCODE_INCLUDE_DIR) mark_as_advanced(QRENCODE_LIBRARY QRENCODE_INCLUDE_DIR)

24
cmake/FindQuaZip.cmake Normal file
View File

@@ -0,0 +1,24 @@
# QUAZIP_FOUND - QuaZip library was found
# QUAZIP_INCLUDE_DIR - Path to QuaZip include dir
# QUAZIP_INCLUDE_DIRS - Path to QuaZip and zlib include dir (combined from QUAZIP_INCLUDE_DIR + ZLIB_INCLUDE_DIR)
# QUAZIP_LIBRARIES - List of QuaZip libraries
# QUAZIP_ZLIB_INCLUDE_DIR - The include dir of zlib headers
if(MINGW)
find_library(QUAZIP_LIBRARIES libquazip5)
find_path(QUAZIP_INCLUDE_DIR quazip.h PATH_SUFFIXES quazip5)
find_path(QUAZIP_ZLIB_INCLUDE_DIR zlib.h)
else()
find_library(QUAZIP_LIBRARIES
NAMES quazip5 quazip
PATHS /usr/lib /usr/lib64 /usr/local/lib
)
find_path(QUAZIP_INCLUDE_DIR quazip.h
PATHS /usr/include /usr/local/include
PATH_SUFFIXES quazip5 quazip
)
find_path(QUAZIP_ZLIB_INCLUDE_DIR zlib.h PATHS /usr/include /usr/local/include)
endif()
include(FindPackageHandleStandardArgs)
set(QUAZIP_INCLUDE_DIRS ${QUAZIP_INCLUDE_DIR} ${QUAZIP_ZLIB_INCLUDE_DIR})
find_package_handle_standard_args(QUAZIP DEFAULT_MSG QUAZIP_LIBRARIES QUAZIP_INCLUDE_DIR QUAZIP_ZLIB_INCLUDE_DIR QUAZIP_INCLUDE_DIRS)

View File

@@ -47,3 +47,4 @@ mark_as_advanced(
Readline_INCLUDE_DIR Readline_INCLUDE_DIR
Readline_LIBRARY Readline_LIBRARY
) )

27
cmake/FindYubiKey.cmake Normal file
View File

@@ -0,0 +1,27 @@
# Copyright (C) 2014 Kyle Manna <kyle@kylemanna.com>
#
# 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/>.
find_path(YUBIKEY_CORE_INCLUDE_DIR yubikey.h)
find_path(YUBIKEY_PERS_INCLUDE_DIR ykcore.h PATH_SUFFIXES ykpers-1)
set(YUBIKEY_INCLUDE_DIRS ${YUBIKEY_CORE_INCLUDE_DIR} ${YUBIKEY_PERS_INCLUDE_DIR})
find_library(YUBIKEY_CORE_LIBRARY NAMES yubikey.dll libyubikey.so yubikey)
find_library(YUBIKEY_PERS_LIBRARY NAMES ykpers-1.dll libykpers-1.so ykpers-1)
set(YUBIKEY_LIBRARIES ${YUBIKEY_CORE_LIBRARY} ${YUBIKEY_PERS_LIBRARY})
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(YubiKey DEFAULT_MSG YUBIKEY_LIBRARIES YUBIKEY_INCLUDE_DIRS)
mark_as_advanced(YUBIKEY_LIBRARIES YUBIKEY_INCLUDE_DIRS)

267
cmake/Findsodium.cmake Normal file
View File

@@ -0,0 +1,267 @@
# Written in 2016 by Henrik Steffen Gaßmann <henrik@gassmann.onl>
#
# To the extent possible under law, the author(s) have dedicated all
# copyright and related and neighboring rights to this software to the
# public domain worldwide. This software is distributed without any warranty.
#
# You should have received a copy of the CC0 Public Domain Dedication
# along with this software. If not, see
#
# http://creativecommons.org/publicdomain/zero/1.0/
#
########################################################################
# Tries to find the local libsodium installation.
#
# On Windows the sodium_DIR environment variable is used as a default
# hint which can be overridden by setting the corresponding cmake variable.
#
# Once done the following variables will be defined:
#
# sodium_FOUND
# sodium_INCLUDE_DIR
# sodium_LIBRARY_DEBUG
# sodium_LIBRARY_RELEASE
#
#
# Furthermore an imported "sodium" target is created.
#
if (CMAKE_C_COMPILER_ID STREQUAL "GNU"
OR CMAKE_C_COMPILER_ID STREQUAL "Clang")
set(_GCC_COMPATIBLE 1)
endif()
# static library option
option(sodium_USE_STATIC_LIBS "enable to statically link against sodium")
if(NOT (sodium_USE_STATIC_LIBS EQUAL sodium_USE_STATIC_LIBS_LAST))
unset(sodium_LIBRARY CACHE)
unset(sodium_LIBRARY_DEBUG CACHE)
unset(sodium_LIBRARY_RELEASE CACHE)
unset(sodium_DLL_DEBUG CACHE)
unset(sodium_DLL_RELEASE CACHE)
set(sodium_USE_STATIC_LIBS_LAST ${sodium_USE_STATIC_LIBS} CACHE INTERNAL "internal change tracking variable")
endif()
########################################################################
# UNIX
if (UNIX)
# import pkg-config
find_package(PkgConfig QUIET)
if (PKG_CONFIG_FOUND)
pkg_check_modules(sodium_PKG QUIET libsodium)
endif()
if(sodium_USE_STATIC_LIBS)
set(XPREFIX sodium_PKG_STATIC)
else()
set(XPREFIX sodium_PKG)
endif()
find_path(sodium_INCLUDE_DIR sodium.h
HINTS ${${XPREFIX}_INCLUDE_DIRS}
)
find_library(sodium_LIBRARY_DEBUG NAMES ${${XPREFIX}_LIBRARIES} sodium
HINTS ${${XPREFIX}_LIBRARY_DIRS}
)
find_library(sodium_LIBRARY_RELEASE NAMES ${${XPREFIX}_LIBRARIES} sodium
HINTS ${${XPREFIX}_LIBRARY_DIRS}
)
########################################################################
# Windows
elseif (WIN32)
set(sodium_DIR "$ENV{sodium_DIR}" CACHE FILEPATH "sodium install directory")
mark_as_advanced(sodium_DIR)
find_path(sodium_INCLUDE_DIR sodium.h
HINTS ${sodium_DIR}
PATH_SUFFIXES include
)
if (MSVC)
# detect target architecture
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/arch.c" [=[
#if defined _M_IX86
#error ARCH_VALUE x86_32
#elif defined _M_X64
#error ARCH_VALUE x86_64
#endif
#error ARCH_VALUE unknown
]=])
try_compile(_UNUSED_VAR "${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_CURRENT_BINARY_DIR}/arch.c"
OUTPUT_VARIABLE _COMPILATION_LOG
)
string(REGEX REPLACE ".*ARCH_VALUE ([a-zA-Z0-9_]+).*" "\\1" _TARGET_ARCH "${_COMPILATION_LOG}")
# construct library path
if (_TARGET_ARCH STREQUAL "x86_32")
string(APPEND _PLATFORM_PATH "Win32")
elseif(_TARGET_ARCH STREQUAL "x86_64")
string(APPEND _PLATFORM_PATH "x64")
else()
message(FATAL_ERROR "the ${_TARGET_ARCH} architecture is not supported by Findsodium.cmake.")
endif()
string(APPEND _PLATFORM_PATH "/$$CONFIG$$")
if (MSVC_VERSION LESS 1900)
math(EXPR _VS_VERSION "${MSVC_VERSION} / 10 - 60")
else()
math(EXPR _VS_VERSION "${MSVC_VERSION} / 10 - 50")
endif()
string(APPEND _PLATFORM_PATH "/v${_VS_VERSION}")
if (sodium_USE_STATIC_LIBS)
string(APPEND _PLATFORM_PATH "/static")
else()
string(APPEND _PLATFORM_PATH "/dynamic")
endif()
string(REPLACE "$$CONFIG$$" "Debug" _DEBUG_PATH_SUFFIX "${_PLATFORM_PATH}")
string(REPLACE "$$CONFIG$$" "Release" _RELEASE_PATH_SUFFIX "${_PLATFORM_PATH}")
find_library(sodium_LIBRARY_DEBUG libsodium.lib
HINTS ${sodium_DIR}
PATH_SUFFIXES ${_DEBUG_PATH_SUFFIX}
)
find_library(sodium_LIBRARY_RELEASE libsodium.lib
HINTS ${sodium_DIR}
PATH_SUFFIXES ${_RELEASE_PATH_SUFFIX}
)
if (NOT sodium_USE_STATIC_LIBS)
set(CMAKE_FIND_LIBRARY_SUFFIXES ".dll")
find_library(sodium_DLL_DEBUG libsodium
HINTS ${sodium_DIR}
PATH_SUFFIXES ${_DEBUG_PATH_SUFFIX}
)
find_library(sodium_DLL_RELEASE libsodium
HINTS ${sodium_DIR}
PATH_SUFFIXES ${_RELEASE_PATH_SUFFIX}
)
endif()
elseif(_GCC_COMPATIBLE)
if (sodium_USE_STATIC_LIBS)
find_library(sodium_LIBRARY_DEBUG libsodium.a
HINTS ${sodium_DIR}
PATH_SUFFIXES lib
)
find_library(sodium_LIBRARY_RELEASE libsodium.a
HINTS ${sodium_DIR}
PATH_SUFFIXES lib
)
else()
find_library(sodium_LIBRARY_DEBUG libsodium.dll.a
HINTS ${sodium_DIR}
PATH_SUFFIXES lib
)
find_library(sodium_LIBRARY_RELEASE libsodium.dll.a
HINTS ${sodium_DIR}
PATH_SUFFIXES lib
)
file(GLOB _DLL
LIST_DIRECTORIES false
RELATIVE "${sodium_DIR}/bin"
"${sodium_DIR}/bin/libsodium*.dll"
)
find_library(sodium_DLL_DEBUG ${_DLL} libsodium
HINTS ${sodium_DIR}
PATH_SUFFIXES bin
)
find_library(sodium_DLL_RELEASE ${_DLL} libsodium
HINTS ${sodium_DIR}
PATH_SUFFIXES bin
)
endif()
else()
message(FATAL_ERROR "this platform is not supported by FindSodium.cmake")
endif()
########################################################################
# unsupported
else()
message(FATAL_ERROR "this platform is not supported by FindSodium.cmake")
endif()
########################################################################
# common stuff
# extract sodium version
if (sodium_INCLUDE_DIR)
set(_VERSION_HEADER "${_INCLUDE_DIR}/sodium/version.h")
if (EXISTS _VERSION_HEADER)
file(READ "${_VERSION_HEADER}" _VERSION_HEADER_CONTENT)
string(REGEX REPLACE ".*#[ \t]*define[ \t]*SODIUM_VERSION_STRING[ \t]*\"([^\n]*)\".*" "\\1"
sodium_VERSION "${_VERSION_HEADER_CONTENT}")
set(sodium_VERSION "${sodium_VERSION}" PARENT_SCOPE)
endif()
endif()
# communicate results
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(sodium
REQUIRED_VARS
sodium_LIBRARY_RELEASE
sodium_LIBRARY_DEBUG
sodium_INCLUDE_DIR
VERSION_VAR
sodium_VERSION
)
# mark file paths as advanced
mark_as_advanced(sodium_INCLUDE_DIR)
mark_as_advanced(sodium_LIBRARY_DEBUG)
mark_as_advanced(sodium_LIBRARY_RELEASE)
if (WIN32)
mark_as_advanced(sodium_DLL_DEBUG)
mark_as_advanced(sodium_DLL_RELEASE)
endif()
# create imported target
if(sodium_USE_STATIC_LIBS)
set(_LIB_TYPE STATIC)
else()
set(_LIB_TYPE SHARED)
endif()
add_library(sodium ${_LIB_TYPE} IMPORTED)
set_target_properties(sodium PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${sodium_INCLUDE_DIR}"
IMPORTED_LINK_INTERFACE_LANGUAGES "C"
)
if (sodium_USE_STATIC_LIBS)
set_target_properties(sodium PROPERTIES
INTERFACE_COMPILE_DEFINITIONS "SODIUM_STATIC"
IMPORTED_LOCATION "${sodium_LIBRARY_RELEASE}"
IMPORTED_LOCATION_DEBUG "${sodium_LIBRARY_DEBUG}"
)
else()
if (UNIX)
set_target_properties(sodium PROPERTIES
IMPORTED_LOCATION "${sodium_LIBRARY_RELEASE}"
IMPORTED_LOCATION_DEBUG "${sodium_LIBRARY_DEBUG}"
)
elseif (WIN32)
set_target_properties(sodium PROPERTIES
IMPORTED_IMPLIB "${sodium_LIBRARY_RELEASE}"
IMPORTED_IMPLIB_DEBUG "${sodium_LIBRARY_DEBUG}"
)
if (NOT (sodium_DLL_DEBUG MATCHES ".*-NOTFOUND"))
set_target_properties(sodium PROPERTIES
IMPORTED_LOCATION_DEBUG "${sodium_DLL_DEBUG}"
)
endif()
if (NOT (sodium_DLL_RELEASE MATCHES ".*-NOTFOUND"))
set_target_properties(sodium PROPERTIES
IMPORTED_LOCATION_RELWITHDEBINFO "${sodium_DLL_RELEASE}"
IMPORTED_LOCATION_MINSIZEREL "${sodium_DLL_RELEASE}"
IMPORTED_LOCATION_RELEASE "${sodium_DLL_RELEASE}"
)
endif()
endif()
endif()

View File

@@ -1,3 +0,0 @@
if (CMAKE_INSTALL_PREFIX MATCHES "/ZIP/")
file(TOUCH "${CMAKE_INSTALL_PREFIX}/.portable")
endif()

View File

@@ -1,8 +0,0 @@
coverage:
range: 60..80
round: nearest
precision: 2
fixes:
- "*/src/::"
comment:
require_changes: true

View File

@@ -16,44 +16,51 @@
find_program(ASCIIDOCTOR_EXE asciidoctor) find_program(ASCIIDOCTOR_EXE asciidoctor)
if(NOT ASCIIDOCTOR_EXE) if(NOT ASCIIDOCTOR_EXE)
message(FATAL_ERROR "asciidoctor is required to build documentation") message(FATAL_ERROR "asciidoctor is required to build documentation")
else()
message(STATUS "Using asciidoctor: ${ASCIIDOCTOR_EXE}")
endif() endif()
message(STATUS "Using asciidoctor: ${ASCIIDOCTOR_EXE}")
set(DOC_DIR ${CMAKE_CURRENT_SOURCE_DIR}) set(DOC_DIR ${CMAKE_CURRENT_SOURCE_DIR})
set(OUT_DIR ${CMAKE_CURRENT_BINARY_DIR}) set(OUT_DIR ${CMAKE_CURRENT_BINARY_DIR})
set(REV -a revnumber=${KEEPASSXC_VERSION})
# Build html documentation on all platforms # Build html documentation on all platforms
# NOTE: Combine into one long command to prevent MSVC from failing to build all docs file(GLOB html_depends ${DOC_DIR}/topics/* ${DOC_DIR}/styles/* ${DOC_DIR}/images/*)
file(GLOB doc_depends ${DOC_DIR}/*.adoc ${DOC_DIR}/topics/* ${DOC_DIR}/styles/* ${DOC_DIR}/images/*) add_custom_command(OUTPUT KeePassXC_GettingStarted.html
add_custom_command( COMMAND ${ASCIIDOCTOR_EXE} -D ${OUT_DIR} -o KeePassXC_GettingStarted.html ${DOC_DIR}/GettingStarted.adoc
OUTPUT KeePassXC_GettingStarted.html KeePassXC_UserGuide.html KeePassXC_KeyboardShortcuts.html DEPENDS ${html_depends} ${DOC_DIR}/GettingStarted.adoc
COMMAND VERBATIM)
${ASCIIDOCTOR_EXE} -D ${OUT_DIR} -o KeePassXC_GettingStarted.html ${REV} ${DOC_DIR}/GettingStarted.adoc && add_custom_command(OUTPUT KeePassXC_UserGuide.html
${ASCIIDOCTOR_EXE} -D ${OUT_DIR} -o KeePassXC_UserGuide.html ${REV} ${DOC_DIR}/UserGuide.adoc && COMMAND ${ASCIIDOCTOR_EXE} -D ${OUT_DIR} -o KeePassXC_UserGuide.html ${DOC_DIR}/UserGuide.adoc
${ASCIIDOCTOR_EXE} -D ${OUT_DIR} -o KeePassXC_KeyboardShortcuts.html ${REV} ${DOC_DIR}/topics/KeyboardShortcuts.adoc DEPENDS ${html_depends} ${DOC_DIR}/UserGuide.adoc
DEPENDS ${doc_depends} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
VERBATIM)
file(GLOB styles_depends ${DOC_DIR}/styles/*)
add_custom_command(OUTPUT KeePassXC_KeyboardShortcuts.html
COMMAND ${ASCIIDOCTOR_EXE} -D ${OUT_DIR} -o KeePassXC_KeyboardShortcuts.html ${DOC_DIR}/topics/KeyboardShortcuts.adoc
DEPENDS ${DOC_DIR}/topics/KeyboardShortcuts.adoc ${styles_depends}
VERBATIM) VERBATIM)
add_custom_target(docs ALL DEPENDS KeePassXC_GettingStarted.html KeePassXC_UserGuide.html KeePassXC_KeyboardShortcuts.html) add_custom_target(docs ALL DEPENDS KeePassXC_GettingStarted.html KeePassXC_UserGuide.html KeePassXC_KeyboardShortcuts.html)
install(FILES install(FILES
${OUT_DIR}/KeePassXC_GettingStarted.html ${OUT_DIR}/KeePassXC_GettingStarted.html
${OUT_DIR}/KeePassXC_UserGuide.html ${OUT_DIR}/KeePassXC_UserGuide.html
${OUT_DIR}/KeePassXC_KeyboardShortcuts.html ${OUT_DIR}/KeePassXC_KeyboardShortcuts.html
DESTINATION ${DATA_INSTALL_DIR}/docs) DESTINATION ${DATA_INSTALL_DIR}/docs)
# Build Man Pages on Linux and macOS # Build Man Pages on Linux and macOS
if(UNIX) if(APPLE OR UNIX)
add_custom_command(OUTPUT keepassxc.1 keepassxc-cli.1 add_custom_command(OUTPUT keepassxc.1
COMMAND ${ASCIIDOCTOR_EXE} -D ${OUT_DIR} -b manpage ${REV} ./man/keepassxc.1.adoc COMMAND ${ASCIIDOCTOR_EXE} -D ${OUT_DIR} -b manpage ${DOC_DIR}/man/keepassxc.1.adoc
COMMAND ${ASCIIDOCTOR_EXE} -D ${OUT_DIR} -b manpage ${REV} ./man/keepassxc-cli.1.adoc DEPENDS ${DOC_DIR}/man/keepassxc.1.adoc
DEPENDS ${DOC_DIR}/man/keepassxc.1.adoc ${DOC_DIR}/man/keepassxc-cli.1.adoc VERBATIM)
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} add_custom_command(OUTPUT keepassxc-cli.1
COMMAND ${ASCIIDOCTOR_EXE} -D ${OUT_DIR} -b manpage ${DOC_DIR}/man/keepassxc-cli.1.adoc
DEPENDS ${DOC_DIR}/man/keepassxc-cli.1.adoc
VERBATIM) VERBATIM)
add_custom_target(manpages ALL DEPENDS keepassxc.1 keepassxc-cli.1) add_custom_target(manpages ALL DEPENDS keepassxc.1 keepassxc-cli.1)
install(FILES install(FILES
${OUT_DIR}/keepassxc.1 ${OUT_DIR}/keepassxc.1
${OUT_DIR}/keepassxc-cli.1 ${OUT_DIR}/keepassxc-cli.1
DESTINATION ${CMAKE_INSTALL_MANDIR}/man1/) DESTINATION ${CMAKE_INSTALL_MANDIR}/man1/)

View File

@@ -1,68 +0,0 @@
# Fuzz-Testing KeePassXC
Fuzz-testing = feeding random input into a program until it crashes. Be smart about what's "random" by looking at how the program executes the input.
We use the "American Fuzzy Lop" (AFL) fuzz tester (https://lcamtuf.coredump.cx/afl/).
The following assumes that all tools and libraries required to build KeePassXC from source have already been installed.
## Installing AFL
$ sudo apt install afl
Optionally, build AFL from source:
$ git clone https://github.com/google/AFL
$ cd AFL
$ make
$ make install
## Building KeePassXC For Fuzzing
A special "instrumented build" is used that allows the fuzzer to look into the program as it executes. We place it in its own build directory so it doesn't confused with the production build.
$ cd your_keepassxc_source_directory
$ mkdir buildafl
$ cd buildafl
$ CXX=afl-g++ AFL_HARDEN=1 cmake -DWITH_XC_ALL=ON ..
$ make
In the source code, special behavior for fuzz testing can be implemented with `#ifdef __AFL_COMPILER`. For example, in fuzz builds, the KeePassXC CLI takes the database password from environment variable `KEYPASSXC_AFL_PASSWORD` to allow non-interactive operation.
## Prepare Fuzzer Input
To get the fuzzer started, we provide empty password database files (the password is `secret`).
$ cd buildafl
$ mkdir -p findings/testcases
$ cp ../share/empty*.kdbx findings/testcases
The fuzzer works by running KeePassXC with variations of this input, mutated in ways that make the program crash or hang.
## Run The Fuzzer
$ cd buildafl
$ KEYPASSXC_AFL_PASSWORD=secret afl-fuzz -i findings/testcases -o findings -m 2000 -t 1000 src/cli/keepassxc-cli ls @@
This fuzz-tests the `ls` command of the KeePassXC CLI, which loads and decrypts a database file and then lists its contents. The parameters mean:
* `KEYPASSXC_AFL_PASSWORD=secret`: In fuzz test builds, the KeePassXC CLI takes the database password from this environment variable.
* `-i findings/testcases`: The directory which contains the initial fuzzer input.
* `-o findings`: The directory in which to store fuzzer results.
* `-m 2000`: Fuzzer memory (in megabytes). Adjust as required if the fuzzer fails to start up.
* `-t 1000`: Timeout until a hang is detected (in milliseconds).
* `src/cli/keepassxc-cli`: The instrumented executable.
* `ls`: The subcommand we're testing.
* `@@`: The fuzzer replaces this by the name of a file with the generated input.
You may also need `export AFL_SKIP_CPUFREQ=1`.
If KeePassXC crashes or hangs when processing the input, the fuzzer writes the database file (that was used in place of `@@`) to the `findings/crashes` or `findings/hangs` directory, respectively.
To continue where the fuzzer left off, use `-i -`. To start over, remove and re-create the `findings` directory.
## More Information
AFL documentation: https://afl-1.readthedocs.io/en/latest/
Read this if you want to get serious about fuzz-testing.

View File

@@ -1,5 +1,6 @@
= KeePassXC: Getting Started Guide = KeePassXC: Getting Started Guide
KeePassXC Team <team@keepassxc.org> KeePassXC Team <team@keepassxc.org>
v2.6.0
:data-uri: :data-uri:
:linkcss!: :linkcss!:
:homepage: https://keepassxc.org :homepage: https://keepassxc.org

View File

@@ -1,5 +1,6 @@
= KeePassXC: User Guide = KeePassXC: User Guide
KeePassXC Team <team@keepassxc.org> KeePassXC Team <team@keepassxc.org>
v2.6.0
:data-uri: :data-uri:
:homepage: https://keepassxc.org :homepage: https://keepassxc.org
:icons: font :icons: font
@@ -34,5 +35,3 @@ include::topics/AutoType.adoc[tags=*]
include::topics/KeeShare.adoc[tags=*] include::topics/KeeShare.adoc[tags=*]
include::topics/SSHAgent.adoc[tags=*] include::topics/SSHAgent.adoc[tags=*]
include::topics/Reference.adoc[tags=*]

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 38 KiB

View File

@@ -15,9 +15,9 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. // along with this program. If not, see <http://www.gnu.org/licenses/>.
= keepassxc-cli(1) = keepassxc-cli(1)
KeePassXC Team <team@keepassxc.org> :docdate: 2020-07-10
:docdate: 2020-08-31
:doctype: manpage :doctype: manpage
:revnumber: 2.6.0
:mansource: KeePassXC {revnumber} :mansource: KeePassXC {revnumber}
:manmanual: General Commands Manual :manmanual: General Commands Manual
@@ -38,25 +38,14 @@ It provides the ability to query and modify the entries of a KeePass database, d
The same password generation options as documented for the generate command can be used when the *-g* option is set. The same password generation options as documented for the generate command can be used when the *-g* option is set.
*analyze* [_options_] <__database__>:: *analyze* [_options_] <__database__>::
Analyzes passwords in a database for weaknesses using offline HIBP SHA-1 hash lookup. Analyzes passwords in a database for weaknesses.
*attachment-export* [_options_] <__database__> <__entry__> <__attachment_name__> <__export_file__>::
Exports the content of an attachment to a specified file.
Use *--stdout* option to instead output the contents of the attachment to stdout.
*attachment-import* [_options_] <__database__> <__entry__> <__attachment_name__> <__import_file__>::
Imports the attachment into an entry.
An existing attachment with the same name may be overwritten if the *-f* option is specified.
*attachment-rm* <__database__> <__entry__> <__attachment_name__>::
Removes the named attachment from an entry.
*clip* [_options_] <__database__> <__entry__> [_timeout_]:: *clip* [_options_] <__database__> <__entry__> [_timeout_]::
Copies an attribute or the current TOTP (if the *-t* option is specified) of a database entry to the clipboard. Copies an attribute or the current TOTP (if the *-t* option is specified) of a database entry to the clipboard.
If no attribute name is specified using the *-a* option, the password is copied. If no attribute name is specified using the *-a* option, the password is copied.
If multiple entries with the same name exist in different groups, only the attribute for the first one is copied. If multiple entries with the same name exist in different groups, only the attribute for the first one is copied.
For copying the attribute of an entry in a specific group, the group path to the entry should be specified as well, instead of just the name. For copying the attribute 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, the default timeout is 10 seconds, set to 0 to disable. Optionally, a timeout in seconds can be specified to automatically clear the clipboard.
*close*:: *close*::
In interactive mode, closes the currently opened database (see *open*). In interactive mode, closes the currently opened database (see *open*).
@@ -95,11 +84,10 @@ It provides the ability to query and modify the entries of a KeePass database, d
Displays a list of available commands, or detailed information about the specified command. Displays a list of available commands, or detailed information about the specified command.
*import* [_options_] <__xml__> <__database__>:: *import* [_options_] <__xml__> <__database__>::
Imports the contents of an XML exported database to a new created database Imports the contents of an XML database to the target database.
with a password and/or key file.
The key file will be created if the file that is referred to does not exist. *locate* [_options_] <__database__> <__term__>::
If both the key file and password are empty, no database will be created. Locates all the entries that match a specific search term in a database.
The new database will be in kdbx 4 format.
*ls* [_options_] <__database__> [_group_]:: *ls* [_options_] <__database__> [_group_]::
Lists the contents of a group in a database. Lists the contents of a group in a database.
@@ -134,9 +122,6 @@ It provides the ability to query and modify the entries of a KeePass database, d
If the database has a recycle bin, the group will be moved there. 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. If the group is already in the recycle bin, it will be removed permanently.
*search* [_options_] <__database__> <__term__>::
Searches all entries that match a specific search term in a database.
*show* [_options_] <__database__> <__entry__>:: *show* [_options_] <__database__> <__entry__>::
Shows the title, username, password, URL and notes of a database entry. Shows the title, username, password, URL and notes of a database entry.
Can also show the current TOTP. Can also show the current TOTP.
@@ -192,9 +177,6 @@ The same password generation options as documented for the generate command can
*--url* <__url__>:: *--url* <__url__>::
Specifies the URL of the entry. Specifies the URL of the entry.
*--notes* <__notes__>::
Specifies the notes of the entry.
*-p*, *--password-prompt*:: *-p*, *--password-prompt*::
Uses a password prompt for the entry's password. Uses a password prompt for the entry's password.
@@ -215,10 +197,6 @@ The same password generation options as documented for the generate command can
Such files are available from https://haveibeenpwned.com/Passwords; 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). note that they are large, and so this operation typically takes some time (minutes up to an hour or so).
*--okon* <__okon-cli path__>::
Use the specified okon-cli program to perform offline breach checks. You can obtain okon-cli from https://github.com/stryku/okon.
When using this option, *-H, --hibp* must point to a post-processed okon file (e.g. file.okon).
=== Clip options === Clip options
*-a*, *--attribute*:: *-a*, *--attribute*::
Copies the specified attribute to the clipboard. Copies the specified attribute to the clipboard.
@@ -230,12 +208,7 @@ The same password generation options as documented for the generate command can
Copies the current TOTP instead of the specified attribute to the clipboard. Copies the current TOTP instead of the specified attribute to the clipboard.
Will report an error if no TOTP is configured for the entry. Will report an error if no TOTP is configured for the entry.
*-b*, *--best*:: === Create options
Try to find and copy to clipboard a unique entry matching the input
If a unique matching entry is found it will be copied to the clipboard.
If multiple entries are found they will be listed to refine the search. (no clip performed)
=== Create and Import options
*-k*, *--set-key-file* <__path__>:: *-k*, *--set-key-file* <__path__>::
Set the key file for the database. Set the key file for the database.
@@ -255,9 +228,6 @@ The same password generation options as documented for the generate command can
*-s*, *--show-protected*:: *-s*, *--show-protected*::
Shows the protected attributes in clear text. Shows the protected attributes in clear text.
*--show-attachments*::
Shows the attachment names along with the size of the attachments.
*-t*, *--totp*:: *-t*, *--totp*::
Also shows the current TOTP, reporting an error if no TOTP is configured for the entry. Also shows the current TOTP, reporting an error if no TOTP is configured for the entry.
@@ -270,7 +240,6 @@ The same password generation options as documented for the generate command can
Sets the Path of the wordlist for the diceware generator. Sets the Path of the wordlist for the diceware generator.
The wordlist must have > 1000 words, otherwise the program will fail. The wordlist must have > 1000 words, otherwise the program will fail.
If the wordlist has < 4000 words a warning will be printed to STDERR. If the wordlist has < 4000 words a warning will be printed to STDERR.
Any *diceware*-compatible wordlist can used. Note however that *KeePassXC* will NOT verify the PGP signature of signed wordlists.
=== Export options === Export options
*-f*, *--format*:: *-f*, *--format*::
@@ -323,11 +292,11 @@ The same password generation options as documented for the generate command can
Include characters from every selected group. Include characters from every selected group.
[Default: Disabled] [Default: Disabled]
include::includes/section-notes.adoc[] include::section-notes.adoc[]
== AUTHOR == AUTHOR
This manual page was originally written by Manolis Agkopian <m.agkopian@gmail.com>. This manual page was originally written by Manolis Agkopian <m.agkopian@gmail.com>.
include::includes/section-reporting-bugs.adoc[] include::section-reporting-bugs.adoc[]
include::includes/section-copyright.adoc[] include::section-copyright.adoc[]

View File

@@ -15,9 +15,9 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. // along with this program. If not, see <http://www.gnu.org/licenses/>.
= keepassxc(1) = keepassxc(1)
KeePassXC Team <team@keepassxc.org> :docdate: 2020-07-10
:docdate: 2020-08-31
:doctype: manpage :doctype: manpage
:revnumber: 2.6.0
:mansource: KeePassXC {revnumber} :mansource: KeePassXC {revnumber}
:manmanual: General Commands Manual :manmanual: General Commands Manual
@@ -55,11 +55,11 @@ Your wallet works offline and requires no Internet connection.
*--debug-info*:: *--debug-info*::
Displays debugging information. Displays debugging information.
include::includes/section-notes.adoc[] include::section-notes.adoc[]
== AUTHOR == AUTHOR
This manual page was originally written by Janek Bevendorff <janek@jbev.net>. This manual page was originally written by Janek Bevendorff <janek@jbev.net>.
include::includes/section-reporting-bugs.adoc[] include::section-reporting-bugs.adoc[]
include::includes/section-copyright.adoc[] include::section-copyright.adoc[]

View File

@@ -16,5 +16,4 @@
== COPYRIGHT == COPYRIGHT
Copyright \(C) 2016-2020 KeePassXC Team <team@keepassxc.org> Copyright \(C) 2016-2020 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, either version 2 or version 3. *KeePassXC* code is licensed under GPL-2 or GPL-3.
There is NO WARRANTY, to the extent permitted by law.

View File

@@ -1,4 +1,5 @@
KeePassXC Team <team@keepassxc.org> KeePassXC Team <team@keepassxc.org>
v2.6.0
:data-uri: :data-uri:
:homepage: https://keepassxc.org :homepage: https://keepassxc.org
:stylesheet: ../styles/dark.css :stylesheet: ../styles/dark.css

View File

@@ -31,9 +31,26 @@ To configure Auto-Type sequences for your entries, perform the following steps:
.Auto-Type entry sequences .Auto-Type entry sequences
image::autotype_entry_sequences.png[] image::autotype_entry_sequences.png[]
2. _(Optional)_ Define a custom Auto-Type sequence for each window title match by selecting the _Use specific sequence for this association_ checkbox. Sequence action codes and field placeholders are detailed in the following table. Beyond the most important ones detailed below, there are additional action codes and placeholders available: xref:UserGuide.adoc#_auto_type_actions[Auto-Type Actions Reference] and xref:UserGuide.adoc#_entry_placeholders[Entry Placeholders Reference]. Action codes and placeholders are not case sensitive. 2. _(Optional)_ Define a custom auto-type sequence for each window title match by selecting the _Use specific sequence for this association_ checkbox. Sequence action codes and field placeholders are detailed in the following table. A complete list of supported actions and placeholders can be found at https://keepass.info/help/base/autotype.html#autoseq[KeePass Auto-Type Action Codes] and https://keepass.info/help/base/placeholders.html[KeePass Placeholders]. Action codes and placeholders are not case sensitive.
+ +
[grid=rows, frame=none, width=90%] [grid=rows, frame=none, width=70%]
|===
|Action Code |Description
|{TAB}, {ENTER}, {SPACE}, {INSERT}, {DELETE}, {HOME}, {END}, {PGUP}, {PGDN}, {BACKSPACE}, {CAPSLOCK}, {ESC}
|Press the corresponding keyboard key
|{UP}, {DOWN}, {LEFT}, {RIGHT} |Press the corresponding arrow key
|{F1}, {F2}, ..., {F16} |Press F1, F2, etc.
|{LEFTBRACE}, {RIGHTBRACE} |Press `{` or `}`, respectively
|{DELAY=X} |Set key press delay to X milliseconds
|{DELAY X} |Delay typing start by X milliseconds
|{CLEARFIELD} |Clear the input field before typing
|{TOTP} |Insert calculated TOTP value (if configured)
|{<ACTION> X} |Repeat <ACTION> X times (e.g., {SPACE 5} inserts five spaces)
|===
+
[grid=rows, frame=none, width=70%]
|=== |===
|Placeholder |Description |Placeholder |Description
@@ -43,44 +60,21 @@ image::autotype_entry_sequences.png[]
|{URL} |URL |{URL} |URL
|{NOTES} |Notes |{NOTES} |Notes
|{TOTP} |Current TOTP value (if configured) |{TOTP} |Current TOTP value (if configured)
|{DT_SIMPLE} |Current date-time
|{DB_DIR} |Absolute directory path for database file
|{S:<ATTRIBUTE_NAME>} |Value for the given attribute name |{S:<ATTRIBUTE_NAME>} |Value for the given attribute name
|=== |{REF:<FIELD>@<SEARCH_IN>:<SEARCH_TEXT>} |Search for a field in another entry using the reference syntax.
+
[grid=rows, frame=none, width=90%]
|===
|Action Code |Description
|{TAB}, {ENTER}, {SPACE}, {INSERT}, {DELETE}, {HOME}, {END}, {PGUP}, {PGDN}, {BACKSPACE}, {CAPSLOCK}, {ESC}
|Press the corresponding keyboard key
|{UP}, {DOWN}, {LEFT}, {RIGHT} |Press the corresponding arrow key
|{LEFTBRACE}, {RIGHTBRACE} |Press `{` or `}`, respectively
|{<KEY> X} |Repeat <KEY> X times (e.g., {SPACE 5} inserts five spaces)
|{DELAY=X} |Set delay between key presses to X milliseconds
|{DELAY X} |Pause typing for X milliseconds
|{CLEARFIELD} |Clear the input field
|{PICKCHARS} |Pick specific password characters from a dialog
|=== |===
=== Performing Global Auto-Type === Performing Global Auto-Type
The global Auto-Type keyboard shortcut is used when you have focus on the window you want to type into. To make use of this feature, you must have previously configured an Auto-Type hotkey. The global Auto-Type keyboard shortcut is used when you have focus on the window you want to type into. To make use of this feature, you must have previously configured an Auto-Type hotkey.
When you press the global Auto-Type hotkey, KeePassXC searches all unlocked databases for entries that match the focused window title. The Auto-Type selection dialog will appear in the following circumstances: there are no matches found, there are multiple matches found, or the setting "Always ask before performing Auto-Type" is enabled. The selection is remembered for a short while to help retype with the same entry in quick succession. Pressing the global Auto-Type hotkey cause KeePassXC to search the database for entries that match the window title. Multiple matches may be returned and will cause the sequence selection dialog to appear. Click on a sequence line will immediately execute the Auto-Type action. A search box is also available in case numerous matches are returned.
.Auto-Type sequence selection .Auto-Type sequence selection
image::autotype_selection_dialog.png[,70%] image::autotype_selection_dialog.png[,70%]
Perform the selected Auto-Type sequence by double clicking the desired row or pressing _Enter_. Press the up and down arrows to navigate the list. Sequences can be filtered through the text edit field. TIP: The _Sequence_ column will only appear when there are different sequences defined by one or more entries displayed in the selection dialog.
.Auto-Type search database
image::autotype_selection_dialog_search.png[,70%]
Search the unlocked databases by activating Search Database radio button. Use the text edit field to issue search queries using the same syntax as database searching.
.Additional Auto-Type choices
image::autotype_selection_dialog_type_menu.png[,70%]
The option to type just the username, password, or current TOTP value is available by right clicking the desired row or expanding the Type Sequence button options.
=== Performing Entry-Level Auto-Type === Performing Entry-Level Auto-Type
You can quickly activate the default Auto-Type sequence for a particular entry using Entry-Level Auto-Type. For this operation, the KeePassXC window will be minimized and the Auto-Type sequence occurs in the previously selected window. You can perform Entry-Level Auto-Type from the toolbar icon *(A)*, entry context menu *(B)*, or by pressing `Ctrl+Shift+V`. You can quickly activate the default Auto-Type sequence for a particular entry using Entry-Level Auto-Type. For this operation, the KeePassXC window will be minimized and the Auto-Type sequence occurs in the previously selected window. You can perform Entry-Level Auto-Type from the toolbar icon *(A)*, entry context menu *(B)*, or by pressing `Ctrl+Shift+V`.
@@ -89,4 +83,4 @@ WARNING: Be careful when using Entry-Level Auto-Type as you can inadvertently ty
.Entry-Level Auto-Type .Entry-Level Auto-Type
image::autotype_entrylevel.png[] image::autotype_entrylevel.png[]
// end::content[] // end::content[]

View File

@@ -48,7 +48,7 @@ image::browser_settings.png[]
.Connect Extension to KeePassXC .Connect Extension to KeePassXC
image::browser_extension_connect.png[,80%] image::browser_extension_connect.png[,80%]
6. Click the _Connect_ button *(B)* in the pop-up window to complete integrating the KeePassXC-Browser extension with your KeePassXC desktop application. 6. Click the _Connect_ button *(B)* in the pop-up window to complete integrating the KeePassXC-Browser extension with your KeePassXC desktop application.
7. You are now prompted to enter a unique name to identify the connection between this browser and your database. Enter a unique name in the field (e.g., firefox-laptop) and click the _Save and allow access_ button. 7. You are now prompted to enter a unique name to identify the connection between this browser and your database. Enter a unique name in the field (e.g., firefox-laptop) and click the _Save and allow access_ button.
+ +
@@ -62,7 +62,7 @@ The KeePassXC-Browser extension lets you automatically populate the entries from
1. Open your KeePassXC desktop application and unlock your database. 1. Open your KeePassXC desktop application and unlock your database.
2. Open your web browser. The KeePassXC-Browser extension icon in your browser window will change based on its connection state. The figure below shows the different states. 2. Open your web browser. The KeePassXC-Browser extension icon in your browser window will change based on its connection state. The figure below shows the different states.
+ +
*(A)* KeePassXC is not running or is disconnected + *(A)* KeePassXC is not running or is disconnected +
*(B)* Connected to KeePassXC, but database is locked + *(B)* Connected to KeePassXC, but database is locked +
@@ -81,7 +81,7 @@ image::browser_extension_reload.png[,80%]
.Confirm Access Dialog .Confirm Access Dialog
image::browser_confirm_access_dialog.png[,80%] image::browser_confirm_access_dialog.png[,80%]
5. Ensure the credentials you want to use are checked, then click *(A)* Remember _(optional)_, then click _Allow Selected_ *(B)*. 5. Ensure the credentials you want use are checked, then click *(A)* Remember _(optional)_, then click _Allow Selected_ *(B)*.
6. In your website, the KeePassXC icon will appear in the username field of the login form *(A)*. Click the icon to populate the field with your stored credentials. If you have more than one credential for this website, a dropdown will appear to choose the one to use. 6. In your website, the KeePassXC icon will appear in the username field of the login form *(A)*. Click the icon to populate the field with your stored credentials. If you have more than one credential for this website, a dropdown will appear to choose the one to use.
+ +

View File

@@ -120,7 +120,18 @@ image::clone_entry_dialog.png[,70%]
.References in a cloned entry .References in a cloned entry
image::clone_entry_references.png[] image::clone_entry_references.png[]
4. You can create your own references using the xref:UserGuide.adoc#_entry_cross_reference[Entry Reference Syntax] 4. You can create your own references using the following syntax:
+
`{REF:<ShortCode>@I:<UUID>}`
+
Where `<UUID>` is the Unique Identifier of the entry to pull data from and `<ShortCode>` is from the following:
+
* T - Title
* U - Username
* P - Password
* A - URL
* N - Notes
* I - UUID
== Searching the Database == Searching the Database
KeePassXC provides an enhanced and granular search features the enables you to search for specific entries in the databases using the different modifiers, wild card characters, and logical operators. KeePassXC provides an enhanced and granular search features the enables you to search for specific entries in the databases using the different modifiers, wild card characters, and logical operators.
@@ -171,14 +182,11 @@ The following tables lists a few samples search queries for your reference:
|`+user:johnsmith -url:www.google.com *notes:"secret note \d"` |`+user:johnsmith -url:www.google.com *notes:"secret note \d"`
|Search the username field for exactly johnsmith, the URL must not contain www.google.com, and notes contains secret note [digit]. |Search the username field for exactly johnsmith, the URL must not contain www.google.com, and notes contains secret note [digit].
|`+attr:mystring123`
|Searches all Additional Attributes for any name OR value equal to mystring123.
|=== |===
== Advanced Entry Options == Advanced Entry Options
=== Additional Attributes === Additional Attributes
A lot of applications and web sites now require to provide additional information when you create accounts. The additional information is used to block hackers if any suspicious activity is detected. In addition, the additional information you provide can be used to reset passwords if you forget them. You can also store arbitrary information here that can be copied to the clipboard or Auto-Typed using the `{S:<ATTR_NAME>}` action code. A lot of applications and web sites now require to provide additional information when you create accounts. The additional information is used to block hackers if any suspicious activity is detected. In addition, the additional information you provide can be used to reset passwords if you forget them. You can also store arbitrary information here that can be copied to the clipboard or Auto-Typed using the `{S:<ATTR_NAME}` action code.
To protect an attribute from being displayed by default, activate the _Protect_ checkbox *(A)*. To show the contents of the attribute while keeping it protected, press the _Reveal_ button *(B)*. To protect an attribute from being displayed by default, activate the _Protect_ checkbox *(A)*. To show the contents of the attribute while keeping it protected, press the _Reveal_ button *(B)*.
@@ -231,7 +239,7 @@ NOTE: Restoring an old history item will store the current entry settings as a n
== Automatic Database Opening == Automatic Database Opening
You can setup one or more databases to open automatically when you unlock a single database. This is done by *(1)* defining a special group named `AutoOpen` with *(2)* entries that contain the file path and credentials for each database that should be opened. There is no limit to the number of databases that can be opened. You can setup one or more databases to open automatically when you unlock a single database. This is done by *(1)* defining a special group named `AutoOpen` with *(2)* entries that contain the file path and credentials for each database that should be opened. There is no limit to the number of databases that can be opened.
TIP: Case matters with auto open, the group name must be exactly `AutoOpen` and it must be a child of the root group. TIP: Case matters with auto open, the group name must be exactly `AutoOpen`.
.AutoOpen Group and Entries .AutoOpen Group and Entries
image::autoopen.png[] image::autoopen.png[]
@@ -279,7 +287,7 @@ image::database_security.png[]
+ +
.Database credentials .Database credentials
image::database_security_credentials.png[] image::database_security_credentials.png[]
+
WARNING: Consider creating a backup of your YubiKey. Please refer to <<Creating a YubiKey backup>> WARNING: Consider creating a backup of your YubiKey. Please refer to <<Creating a YubiKey backup>>
5. Encryption settings allows you to change the average time it takes to encrypt and decrypt the database. The longer time that is chosen, the harder it will be to brute force attack your database. *We recommend a setting of one second.* 5. Encryption settings allows you to change the average time it takes to encrypt and decrypt the database. The longer time that is chosen, the harder it will be to brute force attack your database. *We recommend a setting of one second.*

View File

@@ -60,5 +60,3 @@ To install the KeePassXC app on macOS, double click on the downloaded DMG file a
image::macos_install.png[,80%] image::macos_install.png[,80%]
// end::content[] // end::content[]
// tag::advanced[]
// end::advanced[]

View File

@@ -61,11 +61,4 @@ WARNING: Exporting your database will result in all of your passwords and sensit
.Database export menu .Database export menu
image::export_database.png[,80%] image::export_database.png[,80%]
The HTML export file is intended to be human-readable (viewed/printed in a web browser) rather than machine-readable (re-imported into another database file). The intention of HTML export is to provide a "paper backup" functionality for those who want to ensure access to their passwords in case of catastrophic failure of IT infrastructure. To create a paper backup, export the database to an HTML file, print the file with your web browser, then delete the file.
WARNING: Creating a paper backup exposes your passwords to potentially insecure components, like printer drivers on your computer or software inside the printer. Make sure all these components can be trusted.
For more information, check out the https://keepassxc.org/blog/2020-10-03-paper-backup/[blog article about paper backups].
// end::content[] // end::content[]

View File

@@ -22,11 +22,10 @@ image::password_generator.png[]
5. Use the regenerate button (Ctrl + R) to make a new password using the chosen options. 5. Use the regenerate button (Ctrl + R) to make a new password using the chosen options.
6. Use the clipboard button (Ctrl + C) to copy the generated password to the clipboard. 6. Use the clipboard button (Ctrl + C) to copy the generated password to the clipboard.
// tag::advanced[] // tag::advanced[]
7. Click the Advanced button to specify additional conditions for your desired password. 7. Click the Advanced button to specify additional conditions for your desired password.
+ +
.Advanced Password Generator Options .Advanced Password Generator Options
image::password_generator_advanced.png[] image::password_generator_advanced.png[]
8. When generating a password for an entry, click the Apply Password button (Ctrl + S or Ctrl + Enter) to close the window and apply your changes.
=== Generating Passphrases === Generating Passphrases
A passphrase is a sequence of words or other text used to control access to your applications and data. A passphrase is similar to a password in usage, but is generally longer for added security. To generate the random passphrase using Password Generator, perform the following steps: A passphrase is a sequence of words or other text used to control access to your applications and data. A passphrase is similar to a password in usage, but is generally longer for added security. To generate the random passphrase using Password Generator, perform the following steps:
@@ -41,6 +40,5 @@ Word Count slider.
3. In the Word Separator field, enter a character, word, number, or space that you want to use a separator between the words in your passphrase. 3. In the Word Separator field, enter a character, word, number, or space that you want to use a separator between the words in your passphrase.
4. Click the Regenerate button (Ctrl + R) to generate a new random passphrase. 4. Click the Regenerate button (Ctrl + R) to generate a new random passphrase.
5. Click the Clipboard button (Ctrl + C) to copy the passphrase to the clipboard. 5. Click the Clipboard button (Ctrl + C) to copy the passphrase to the clipboard.
6. When generating a password for an entry, click the Apply Password button (Ctrl + S or Ctrl + Enter) to close the window and apply your changes.
// end::advanced[] // end::advanced[]
// end::content[] // end::content[]

View File

@@ -1,94 +0,0 @@
= KeePassXC - Reference
include::.sharedheader[]
:imagesdir: ../images
// tag::content[]
== Reference
This section contains full details on advanced features available in KeePassXC.
=== Entry Placeholders
[grid=rows, frame=none, width=90%]
|===
|Placeholder |Description
|{TITLE} |Entry Title
|{USERNAME} |Username
|{PASSWORD} |Password
|{URL} |URL
|{NOTES} |Notes
|{TOTP} |Current TOTP value (if configured)
|{S:<ATTRIBUTE_NAME>} |Value for the given attribute (case sensitive)
|{URL:RMVSCM} |URL without scheme (e.g., https)
|{URL:WITHOUTSCHEME} |URL without scheme
|{URL:SCM} |URL Scheme
|{URL:SCHEME} |URL Scheme
|{URL:HOST} |URL Host (e.g., example.com)
|{URL:PORT} |URL Port
|{URL:PATH} |URL Path (e.g., /path/to/page.html)
|{URL:QUERY} |URL Query String
|{URL:FRAGMENT} |URL Fragment
|{URL:USERINFO} |URL Username:Password
|{URL:USERNAME} |URL Username
|{URL:PASSWORD} |URL Password
|{DT_SIMPLE} |Current Date-Time (yyyyMMddhhmmss)
|{DT_YEAR} |Current Year (yyyy)
|{DT_MONTH} |Current Month (MM)
|{DT_DAY} |Current Day (dd)
|{DT_HOUR} |Current Hour (hh)
|{DT_MINUTE} |Current Minutes (mm)
|{DT_SECOND} |Current Seconds (ss)
|{DT_UTC_SIMPLE} |Current UTC Date-Time (yyyyMMddhhmmss)
|{DT_UTC_YEAR} |Current UTC Year (yyyy)
|{DT_UTC_MONTH} |Current UTC Month (MM)
|{DT_UTC_DAY} |Current UTC Day (dd)
|{DT_UTC_HOUR} |Current UTC Hour (hh)
|{DT_UTC_MINUTE} |Current UTC Minutes (mm)
|{DT_UTC_SECOND} |Current UTC Seconds (ss)
|{DB_DIR} |Absolute directory path of database file
|===
=== Entry Cross-Reference
A reference to another entry's field is possible using the short-hand syntax:
`{REF:<FIELD>@<SEARCH_IN>:<SEARCH_TEXT>}`
`<FIELD>` and `<SEARCH_IN>` can be one of following:
* T - Title
* U - Username
* P - Password
* A - URL
* N - Notes
* I - UUID (found on entry properties page)
* O - Custom Attribute _(SEARCH_IN only)_
Examples: +
`{REF:U@I:033054D445C648C59092CC1D661B1B71}` +
`{REF:P@T:Other Entry}` +
`{REF:A@O:Attribute 1}`
=== Auto-Type Actions
[grid=rows, frame=none, width=90%]
|===
|Action Code |Description
|{TAB}, {ENTER}, {SPACE}, {INSERT}, {DELETE}, {HOME}, {END}, {PGUP}, {PGDN}, {BACKSPACE}, {CAPSLOCK}, {ESC}
|Press the corresponding keyboard key
|{UP}, {DOWN}, {LEFT}, {RIGHT} |Press the corresponding arrow key
|{F1}, {F2}, ..., {F16} |Press F1, F2, etc.
|{LEFTBRACE}, {RIGHTBRACE} |Press `{` or `}`, respectively
|{<KEY> X} |Repeat <KEY> X times (e.g., {SPACE 5} inserts five spaces)
|{DELAY=X} |Set delay between key presses to X milliseconds
|{DELAY X} |Pause typing for X milliseconds
|{CLEARFIELD} |Clear the input field
|{PICKCHARS} |Pick specific password characters from a dialog
|===
*Text Conversions:*
*{T-CONV:/<PLACEHOLDER>/<METHOD>/}* +
Convert resolved placeholder (e.g., {USERNAME}, {PASSWORD}, etc.) using the following methods: UPPER, LOWER, BASE64, HEX, URI, URI-DEC.
*{T-REPLACE-RX:/<PLACEHOLDER>/<SEARCH>/<REPLACE>/}* +
Use regular expressions to find and replace data from a resolved placeholder. Refer to match groups using $1, $2, etc.
// end::content[]

View File

@@ -4,7 +4,7 @@ include::.sharedheader[]
// tag::content[] // tag::content[]
== SSH Agent == SSH Agent
SSH (Secure Shell) is a widely used remote secure shell protocol and is considered an industry standard for secure remote access to UNIX-like systems including Linux, BSDs, macOS and more recently even Windows received native support. SSH supports multiple types of authentication and the most widely used ones are either interactive keyboard input with a password or a public-key cryptography pair of keys. SSH (Secure Shell) is a widely used remote secure shell protocol and is considered an industry standard for secure remote access to UNIX-like systems including Linux, BSDs, MacOS and more recently even Windows received native support. SSH supports multiple types of authentication and the most widely used ones are either interactive keyboard input with a password or a public-key cryptography pair of keys.
KeePassXC SSH Agent integration is built to manage SSH keys in a secure manner by either storing them completely within your KeePassXC database or by having only the decryption key of a key file that is stored elsewhere. SSH Agent integration _does not_ provide an agent itself but works as a client for any agent implementation that is OpenSSH compatible. KeePassXC SSH Agent integration is built to manage SSH keys in a secure manner by either storing them completely within your KeePassXC database or by having only the decryption key of a key file that is stored elsewhere. SSH Agent integration _does not_ provide an agent itself but works as a client for any agent implementation that is OpenSSH compatible.
@@ -32,35 +32,18 @@ WARNING: _GNOME Keyring_ prior to release 3.27.92 had its own custom implementat
It does not support any constraints you may want to configure for an added key. It does not support any constraints you may want to configure for an added key.
If you are running a modern distribution the custom agent has been removed and replaced with the stock OpenSSH agent which is feature complete. If you are running a modern distribution the custom agent has been removed and replaced with the stock OpenSSH agent which is feature complete.
=== OpenSSH agent on macOS === OpenSSH agent on MacOS
Apple has made OpenSSH an integrated part of macOS with automatic agent startup when it is first used. No further configuration is needed. Apple has made OpenSSH an integrated part of MacOS with automatic agent startup when it is first used. No further configuration is needed.
=== OpenSSH agent and Pageant on Windows === Pageant agent on Windows
The SSH Agent integration on Windows supports both _PuTTY Pageant_ and _OpenSSH for Windows 10_. The SSH Agent integration on Windows supports both _PuTTY Pageant_ and _OpenSSH for Windows 10_.
Since Pageant is currently still the most widely used implementation and is easily installable on any version of Windows, it is the default on KeePassXC. Since Pageant is currently still the most widely used implementation and is easily installable on any version of Windows we focus on that.
However, Microsoft includes a native OpenSSH client implementation with Windows 10 since autumn 2018 that can be used instead. If you would like to self-manage your OpenSSH version you can use the builds offered via their official https://github.com/powershell/Win32-OpenSSH[GitHub repository]. It is also the default on KeePassXC.
==== Pageant
Download Pageant from the official PuTTY home page at https://www.chiark.greenend.org.uk/~sgtatham/putty/ Download Pageant from the official PuTTY home page at https://www.chiark.greenend.org.uk/~sgtatham/putty/
To use Pageant with KeePassXC, simply start it and it will minimize into the system tray and is ready to use. PuTTY and compatible tools will use Pageant automatically. To use Pageant with KeePassXC, simply start it and it will minimize into the system tray and is ready to use. PuTTY and compatible tools will use Pageant automatically.
==== OpenSSH
Make sure your Windows version has at least update 1809 installed. For more details consult the https://docs.microsoft.com/en-us/windows-server/administration/openssh/openssh_overview[official documentation].
To use Windows OpenSSH the _OpenSSH Authentication Agent_ service has to be enabled first:
1. Open the Services application via the _Start Menu_, it is located in the _Windows Administrative Tools_ section
2. Select the _OpenSSH Authentication Agent_ and open its _Properties_
3. Set the _Startup type_ to _Automatic_ and start the service
Alternatively, you can use a _Windows PowerShell_ running as _Administrator_ to enable and start the service:
PS C:\Users\user> Get-Service ssh-agent | Set-Service -StartupType Automatic
PS C:\Users\user> Start-Service ssh-agent
KeePassXC and other compatible tools can now use the Windows OpenSSH agent. To use it with KeePassXC, update the settings explained in <<Setting up SSH Agent integration>>.
=== Setting up SSH Agent integration === Setting up SSH Agent integration
By default the SSH Agent integration plugin is disabled. By default the SSH Agent integration plugin is disabled.
To enable integration, follow the steps below to access the settings: To enable integration, follow the steps below to access the settings:
@@ -81,13 +64,14 @@ If the value of _SSH_AUTH_SOCK_ is empty it means the agent is not properly conf
=== Generating a key to use with KeePassXC === Generating a key to use with KeePassXC
KeePassXC only supports keys in the _OpenSSH_ format. On Windows, _PuTTYgen_ saves keys in its own format by default and you will need to convert them to OpenSSH format before being used. In this guide we are going to generate a standard RSA key in the default size. KeePassXC only supports keys in the _OpenSSH_ format. On Windows, _PuTTYgen_ saves keys in its own format by default and you will need to convert them to OpenSSH format before being used. In this guide we are going to generate a standard RSA key in the default size.
==== Generating a key on Linux or macOS with _ssh-keygen_ ==== Generating a key on Linux or MacOS with _ssh-keygen_
Open a terminal window and type the following command to generate a key: Open a terminal window and type the following command to generate a key:
$ ssh-keygen -o -f keepassxc -C johndoe@example $ ssh-keygen -o -f keepassxc -C johndoe@example
Generating public/private rsa key pair. Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): Enter passphrase (empty for no passphrase):
Enter same passphrase again: Enter same passphrase again:
Your identification has been saved in keepassxc Your identification has been saved in keepassxc
Your public key has been saved in keepassxc.pub Your public key has been saved in keepassxc.pub
The key fingerprint is: The key fingerprint is:
@@ -105,6 +89,7 @@ Open a terminal window and type the following command to generate a key:
|. ..++ooo | |. ..++ooo |
+----[SHA256]-----+ +----[SHA256]-----+
Now we can see two files were generated: Now we can see two files were generated:
$ ls -l keepassxc* $ ls -l keepassxc*
@@ -113,59 +98,19 @@ Now we can see two files were generated:
With KeePassXC you only need the first file listed. With KeePassXC you only need the first file listed.
==== Generating a key on Windows ==== Generating a key on Windows with PuTTYgen
On Windows you can generate key pairs with _PuTTYgen_ and with _ssh-keygen_, depending on whether you installed PuTTY and your Windows version. Please read the manual on how to use PuTTYgen for details on generate a key: https://the.earth.li/~sgtatham/putty/0.74/htmldoc/Chapter8.html#pubkey-puttygen. Once generated, you must save the key in OpenSSH format, follow the image below.
===== Using _PuTTYgen_ .Generating a key with PuTTYgen
Please read the manual on how to use _PuTTYgen_ for details on generate a key: https://the.earth.li/~sgtatham/putty/0.74/htmldoc/Chapter8.html#pubkey-puttygen. Once generated, you must save the key in the new OpenSSH format, see image below.
.Generating a key with _PuTTYgen_
image::sshagent_puttygen.png[,70%] image::sshagent_puttygen.png[,70%]
===== Using _ssh-keygen_
Open _Command Prompt_ or _Windows PowerShell_ and type the following command to generate a key:
PS C:\Users\user> ssh-keygen.exe -o -f keepassxc -C johndoe@example
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in keepassxc
Your public key has been saved in keepassxc.pub
The key fingerprint is:
SHA256:pN+o5AqUmijYBDUrFV/caMus9oIR61+MiWLa8fcsVYI johndoe@example
The key's randomart image is:
+---[RSA 3072]----+
| =. ..o |
| o + .+ . |
|o . .+ o. |
| o.. Eo. . |
| +o .. So |
|o*o.o+ ..o |
|Bo=+o.+.o . |
|+oo+.++o |
|. ..++ooo |
+----[SHA256]-----+
Now we can see two files were generated:
PS C:\Users\user> dir keepassxc*
Directory C:\Users\user
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 9/19/2021 12:08 PM 2655 keepassxc
-a---- 9/19/2021 12:08 PM 570 keepassxc.pub
With KeePassXC you only need the first file listed.
=== Configuring an entry to use SSH Agent === Configuring an entry to use SSH Agent
The last step is to setup an entry to contain the SSH Agent settings and key file you generated. The last step is to setup an entry to contain the SSH Agent settings and key file you generated.
1. Create a new entry, or open an existing entry in edit mode. 1. Create a new entry, or open an existing entry in edit mode.
2. Set the password you used for the key file in the password field. 2. Set the password you used for the key file in the password field.
3. Go to the advanced category and attach the key file you generated previously. 3. Go to the advanced category and attach the key file you generated previously.
4. Go to the SSH Agent category *(1)* and select the attachment from the list *(2)*. 4. Go to the SSH Agent category *(1)* and select the attachment from the list *(2)*.
5. Alternatively, you can load an external file dynamically using the file selection. 5. Alternatively, you can load an external file dynamically using the file selection.
6. Choose the options for this key. 6. Choose the options for this key.
7. Press *OK* to accept the entry. Depending on the options you chose, KeePassXC will load the key and present it for use. 7. Press *OK* to accept the entry. Depending on the options you chose, KeePassXC will load the key and present it for use.

View File

@@ -10,7 +10,7 @@ The KeePassXC interface is designed for simplicity and easy access to your infor
.Main database interface .Main database interface
image::main_interface.png[] image::main_interface.png[]
*(A) Groups* - Organize your entries into discrete groups to bring order to all of your sensitive information. Groups can be nested under each other to create a hierarchy. Settings from parent groups get applied to their children. You can hide this panel on the View menu. *(A) Groups* - Organize your entries into discrete groups to bring order to all of your sensitive information. Groups can be nested under each other to create a hierarchy. Settings from parent groups get applied to their children.
*(B) Entries* - Entries contain all the information for each website or application you are storing in KeePassXC. This view shows all the entries in the selected group. Each column can be resized, reordered, and shown or hidden based on your preference. Right click the header row to see all available options. *(B) Entries* - Entries contain all the information for each website or application you are storing in KeePassXC. This view shows all the entries in the selected group. Each column can be resized, reordered, and shown or hidden based on your preference. Right click the header row to see all available options.
@@ -46,14 +46,6 @@ For users with smaller screens or those who desire seeing more entries at once,
.Compact mode comparison .Compact mode comparison
image::compact_mode_comparison.png[] image::compact_mode_comparison.png[]
==== Copy entry Columns on Double Click
KeePassXC offers the possibility of copying certain entry columns, such as username and password, into your clipboard on double click, for a limited period of time.
This feature can be enabled by checking the box "Enable double click to copy some entry columns" in the security settings:
.Enable copying on double click
image::enable_copy_dc.png[]
=== Keyboard Shortcuts === Keyboard Shortcuts
include::KeyboardShortcuts.adoc[tag=content, leveloffset=+1] include::KeyboardShortcuts.adoc[tag=content, leveloffset=+1]

View File

@@ -44,5 +44,3 @@ KeePassXC has numerous features for novice and power users alike. This guide wil
** FreeDesktop.org Secret Service (replace Gnome keyring, etc.) ** FreeDesktop.org Secret Service (replace Gnome keyring, etc.)
** Additional encryption choices: Twofish and ChaCha20 ** Additional encryption choices: Twofish and ChaCha20
// end::content[] // end::content[]
// tag::advanced[]
// end::advanced[]

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# #
# KeePassXC Release Preparation Helper # KeePassXC Release Preparation Helper
# Copyright (C) 2021 KeePassXC team <https://keepassxc.org/> # Copyright (C) 2017 KeePassXC team <https://keepassxc.org/>
# #
# This program is free software: you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
@@ -17,9 +17,8 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
printf "\e[1m\e[32mKeePassXC\e[0m Release Preparation Helper\n" printf "\e[1m\e[32mKeePassXC\e[0m Release Preparation Helper\n"
printf "Copyright (C) 2021 KeePassXC Team <https://keepassxc.org/>\n\n" printf "Copyright (C) 2017 KeePassXC Team <https://keepassxc.org/>\n\n"
set -eE -o pipefail
# ----------------------------------------------------------------------- # -----------------------------------------------------------------------
# global default values # global default values
@@ -35,16 +34,15 @@ TARGET_BRANCH="master"
TAG_NAME="" TAG_NAME=""
DOCKER_IMAGE="" DOCKER_IMAGE=""
DOCKER_CONTAINER_NAME="keepassxc-build-container" DOCKER_CONTAINER_NAME="keepassxc-build-container"
CMAKE_GENERATOR="Ninja"
CMAKE_OPTIONS="" CMAKE_OPTIONS=""
CPACK_GENERATORS="WIX;ZIP" CPACK_GENERATORS="WIX;ZIP"
COMPILER="g++" COMPILER="g++"
MAKE_OPTIONS="-j$(getconf _NPROCESSORS_ONLN)" MAKE_OPTIONS="-j8"
BUILD_PLUGINS="all" BUILD_PLUGINS="all"
INSTALL_PREFIX="/usr/local" INSTALL_PREFIX="/usr/local"
ORIG_BRANCH="" ORIG_BRANCH=""
ORIG_CWD="$(pwd)" ORIG_CWD="$(pwd)"
MACOSX_DEPLOYMENT_TARGET=10.13 MACOSX_DEPLOYMENT_TARGET=10.12
GREP="grep" GREP="grep"
TIMESTAMP_SERVER="http://timestamp.sectigo.com" TIMESTAMP_SERVER="http://timestamp.sectigo.com"
@@ -53,17 +51,17 @@ TIMESTAMP_SERVER="http://timestamp.sectigo.com"
# ----------------------------------------------------------------------- # -----------------------------------------------------------------------
printUsage() { printUsage() {
local cmd local cmd
if [ -z "$1" ] || [ "help" == "$1" ]; then if [ "" == "$1" ] || [ "help" == "$1" ]; then
cmd="COMMAND" cmd="COMMAND"
elif [ "check" == "$1" ] || [ "merge" == "$1" ] || [ "build" == "$1" ] || [ "gpgsign" == "$1" ] || \ elif [ "check" == "$1" ] || [ "merge" == "$1" ] || [ "build" == "$1" ] \
[ "appsign" == "$1" ] || [ "notarize" == "$1" ] || [ "appimage" == "$1" ] || [ "i18n" == "$1" ]; then || [ "gpgsign" == "$1" ] || [ "appsign" == "$1" ] || [ "appimage" == "$1" ]; then
cmd="$1" cmd="$1"
else else
logError "Unknown command: '$1'\n" logError "Unknown command: '$1'\n"
cmd="COMMAND" cmd="COMMAND"
fi fi
printf "\e[1mUsage:\e[0m $(basename "$0") $cmd [OPTIONS, ...]\n" printf "\e[1mUsage:\e[0m $(basename $0) $cmd [options]\n"
if [ "COMMAND" == "$cmd" ]; then if [ "COMMAND" == "$cmd" ]; then
cat << EOF cat << EOF
@@ -74,9 +72,7 @@ Commands:
build Build and package binary release from sources build Build and package binary release from sources
gpgsign Sign previously compiled release packages with GPG gpgsign Sign previously compiled release packages with GPG
appsign Sign binaries with code signing certificates on Windows and macOS appsign Sign binaries with code signing certificates on Windows and macOS
notarize Submit macOS application DMG for notarization
help Show help for the given command help Show help for the given command
i18n Update translation files and pull from or push to Transifex
EOF EOF
elif [ "merge" == "$cmd" ]; then elif [ "merge" == "$cmd" ]; then
cat << EOF cat << EOF
@@ -119,9 +115,7 @@ Options:
If this option is set, --install-prefix has no effect If this option is set, --install-prefix has no effect
--appsign Perform platform specific App Signing before packaging --appsign Perform platform specific App Signing before packaging
--timestamp Explicitly set the timestamp server to use for appsign (default: '${TIMESTAMP_SERVER}') --timestamp Explicitly set the timestamp server to use for appsign (default: '${TIMESTAMP_SERVER}')
--vcpkg Specify VCPKG toolchain file (example: ~/vcpkg/scripts/buildsystems/vcpkg.cmake)
-k, --key Specify the App Signing Key/Identity -k, --key Specify the App Signing Key/Identity
--cmake-generator Override the default CMake generator (Default: Ninja)
-c, --cmake-options Additional CMake options for compiling the sources -c, --cmake-options Additional CMake options for compiling the sources
--compiler Compiler to use (default: '${COMPILER}') --compiler Compiler to use (default: '${COMPILER}')
-m, --make-options Make options for compiling sources (default: '${MAKE_OPTIONS}') -m, --make-options Make options for compiling sources (default: '${MAKE_OPTIONS}')
@@ -154,16 +148,6 @@ Options:
Signing Key or Apple Developer ID (required) Signing Key or Apple Developer ID (required)
--timestamp Explicitly set the timestamp server to use for appsign (default: '${TIMESTAMP_SERVER}') --timestamp Explicitly set the timestamp server to use for appsign (default: '${TIMESTAMP_SERVER}')
-u, --username Apple username for notarization (required on macOS) -u, --username Apple username for notarization (required on macOS)
-h, --help Show this help
EOF
elif [ "notarize" == "$cmd" ]; then
cat << EOF
Submit macOS application DMG for notarization
Options:
-f, --files Files to notarize (required)
-u, --username Apple username for notarization (required)
-c, --keychain Apple keychain entry name storing the notarization -c, --keychain Apple keychain entry name storing the notarization
app password (default: 'AC_PASSWORD') app password (default: 'AC_PASSWORD')
-h, --help Show this help -h, --help Show this help
@@ -186,16 +170,6 @@ Options:
-k, --key The PGP Signing Key -k, --key The PGP Signing Key
--verbosity linuxdeploy verbosity (default: 3) --verbosity linuxdeploy verbosity (default: 3)
-h, --help Show this help -h, --help Show this help
EOF
elif [ "i18n" == "$cmd" ]; then
cat << EOF
Update translation files and pull from or push to Transifex
Subcommands:
tx-push Push source translation file to Transifex
tx-pull Pull updated translations from Transifex
lupdate Update source translation file from C++ sources
EOF EOF
fi fi
} }
@@ -213,17 +187,17 @@ logError() {
} }
init() { init() {
if [ -z "$RELEASE_NAME" ]; then if [ "" == "$RELEASE_NAME" ]; then
logError "Missing arguments, --version is required!\n" logError "Missing arguments, --version is required!\n"
printUsage "check" printUsage "check"
exit 1 exit 1
fi fi
if [ -z "$TAG_NAME" ]; then if [ "" == "$TAG_NAME" ]; then
TAG_NAME="$RELEASE_NAME" TAG_NAME="$RELEASE_NAME"
fi fi
if [ -z "$SOURCE_BRANCH" ]; then if [ "" == "$SOURCE_BRANCH" ]; then
SOURCE_BRANCH="release/${RELEASE_NAME}" SOURCE_BRANCH="release/${RELEASE_NAME}"
fi fi
@@ -286,25 +260,29 @@ checkGitRepository() {
} }
checkReleaseDoesNotExist() { checkReleaseDoesNotExist() {
if ! git tag | $GREP -q "^$TAG_NAME$"; then git tag | $GREP -q "^$TAG_NAME$"
if [ $? -eq 0 ]; then
exitError "Release '$RELEASE_NAME' (tag: '$TAG_NAME') already exists!" exitError "Release '$RELEASE_NAME' (tag: '$TAG_NAME') already exists!"
fi fi
} }
checkWorkingTreeClean() { checkWorkingTreeClean() {
if ! git diff-index --quiet HEAD --; then git diff-index --quiet HEAD --
if [ $? -ne 0 ]; then
exitError "Current working tree is not clean! Please commit or unstage any changes." exitError "Current working tree is not clean! Please commit or unstage any changes."
fi fi
} }
checkSourceBranchExists() { checkSourceBranchExists() {
if ! git rev-parse "$SOURCE_BRANCH" > /dev/null 2>&1; then git rev-parse "$SOURCE_BRANCH" > /dev/null 2>&1
if [ $? -ne 0 ]; then
exitError "Source branch '$SOURCE_BRANCH' does not exist!" exitError "Source branch '$SOURCE_BRANCH' does not exist!"
fi fi
} }
checkTargetBranchExists() { checkTargetBranchExists() {
if ! git rev-parse "$TARGET_BRANCH" > /dev/null 2>&1; then git rev-parse "$TARGET_BRANCH" > /dev/null 2>&1
if [ $? -ne 0 ]; then
exitError "Target branch '$TARGET_BRANCH' does not exist!" exitError "Target branch '$TARGET_BRANCH' does not exist!"
fi fi
} }
@@ -315,15 +293,18 @@ checkVersionInCMake() {
local minor_num="$(echo ${RELEASE_NAME} | cut -f2 -d.)" local minor_num="$(echo ${RELEASE_NAME} | cut -f2 -d.)"
local patch_num="$(echo ${RELEASE_NAME} | cut -f3 -d. | cut -f1 -d-)" local patch_num="$(echo ${RELEASE_NAME} | cut -f3 -d. | cut -f1 -d-)"
if ! $GREP -q "${app_name_upper}_VERSION_MAJOR \"${major_num}\"" CMakeLists.txt; then $GREP -q "${app_name_upper}_VERSION_MAJOR \"${major_num}\"" CMakeLists.txt
if [ $? -ne 0 ]; then
exitError "${app_name_upper}_VERSION_MAJOR not updated to '${major_num}' in CMakeLists.txt!" exitError "${app_name_upper}_VERSION_MAJOR not updated to '${major_num}' in CMakeLists.txt!"
fi fi
if ! $GREP -q "${app_name_upper}_VERSION_MINOR \"${minor_num}\"" CMakeLists.txt; then $GREP -q "${app_name_upper}_VERSION_MINOR \"${minor_num}\"" CMakeLists.txt
if [ $? -ne 0 ]; then
exitError "${app_name_upper}_VERSION_MINOR not updated to '${minor_num}' in CMakeLists.txt!" exitError "${app_name_upper}_VERSION_MINOR not updated to '${minor_num}' in CMakeLists.txt!"
fi fi
if ! $GREP -q "${app_name_upper}_VERSION_PATCH \"${patch_num}\"" CMakeLists.txt; then $GREP -q "${app_name_upper}_VERSION_PATCH \"${patch_num}\"" CMakeLists.txt
if [ $? -ne 0 ]; then
exitError "${app_name_upper}_VERSION_PATCH not updated to '${patch_num}' in CMakeLists.txt!" exitError "${app_name_upper}_VERSION_PATCH not updated to '${patch_num}' in CMakeLists.txt!"
fi fi
} }
@@ -333,7 +314,8 @@ checkChangeLog() {
exitError "No CHANGELOG file found!" exitError "No CHANGELOG file found!"
fi fi
if ! $GREP -qPzo "## ${RELEASE_NAME} \(\d{4}-\d{2}-\d{2}\)\n" CHANGELOG.md; then $GREP -qPzo "## ${RELEASE_NAME} \(\d{4}-\d{2}-\d{2}\)\n" CHANGELOG.md
if [ $? -ne 0 ]; then
exitError "'CHANGELOG.md' has not been updated to the '${RELEASE_NAME}' release!" exitError "'CHANGELOG.md' has not been updated to the '${RELEASE_NAME}' release!"
fi fi
} }
@@ -343,7 +325,8 @@ checkAppStreamInfo() {
exitError "No AppStream info file found!" exitError "No AppStream info file found!"
fi fi
if ! $GREP -qPzo "<release version=\"${RELEASE_NAME}\" date=\"\d{4}-\d{2}-\d{2}\">" share/linux/org.keepassxc.KeePassXC.appdata.xml; then $GREP -qPzo "<release version=\"${RELEASE_NAME}\" date=\"\d{4}-\d{2}-\d{2}\">" share/linux/org.keepassxc.KeePassXC.appdata.xml
if [ $? -ne 0 ]; then
exitError "'share/linux/org.keepassxc.KeePassXC.appdata.xml' has not been updated to the '${RELEASE_NAME}' release!" exitError "'share/linux/org.keepassxc.KeePassXC.appdata.xml' has not been updated to the '${RELEASE_NAME}' release!"
fi fi
} }
@@ -354,7 +337,13 @@ checkSnapcraft() {
return return
fi fi
if ! $GREP -qPzo "KEEPASSXC_BUILD_TYPE=Release" snap/snapcraft.yaml; then $GREP -qPzo "version: ${RELEASE_NAME}" snap/snapcraft.yaml
if [ $? -ne 0 ]; then
exitError "'snapcraft.yaml' has not been updated to the '${RELEASE_NAME}' release!"
fi
$GREP -qPzo "KEEPASSXC_BUILD_TYPE=Release" snap/snapcraft.yaml
if [ $? -ne 0 ]; then
exitError "'snapcraft.yaml' is not set for a release build!" exitError "'snapcraft.yaml' is not set for a release build!"
fi fi
} }
@@ -415,7 +404,7 @@ performChecks() {
checkTargetBranchExists checkTargetBranchExists
logInfo "Checking out '${SOURCE_BRANCH}'..." logInfo "Checking out '${SOURCE_BRANCH}'..."
git checkout "$SOURCE_BRANCH" > /dev/null 2>&1 git checkout "$SOURCE_BRANCH"
logInfo "Attempting to find '${RELEASE_NAME}' in various files..." logInfo "Attempting to find '${RELEASE_NAME}' in various files..."
@@ -450,7 +439,7 @@ if ! cmdExists realpath; then
fi fi
trap exitTrap SIGINT SIGTERM ERR trap exitTrap SIGINT SIGTERM
# ----------------------------------------------------------------------- # -----------------------------------------------------------------------
# check command # check command
@@ -530,17 +519,17 @@ merge() {
performChecks performChecks
# Update translations logInfo "Updating language files..."
i18n lupdate ./share/translations/update.sh update
i18n tx-pull ./share/translations/update.sh pull
if [ 0 -ne $? ]; then if [ 0 -ne $? ]; then
exitError "Updating translations failed!" exitError "Updating translations failed!"
fi fi
if ! git diff-index --quiet HEAD --; then git diff-index --quiet HEAD --
if [ $? -ne 0 ]; then
git add -A ./share/translations/ git add -A ./share/translations/
logInfo "Committing changes..." logInfo "Committing changes..."
if [ -z "$GPG_GIT_KEY" ]; then if [ "" == "$GPG_GIT_KEY" ]; then
git commit -m "Update translations" git commit -m "Update translations"
else else
git commit -m "Update translations" -S"$GPG_GIT_KEY" git commit -m "Update translations" -S"$GPG_GIT_KEY"
@@ -552,14 +541,14 @@ merge() {
COMMIT_MSG="Release ${RELEASE_NAME}" COMMIT_MSG="Release ${RELEASE_NAME}"
logInfo "Checking out target branch '${TARGET_BRANCH}'..." logInfo "Checking out target branch '${TARGET_BRANCH}'..."
git checkout "$TARGET_BRANCH" > /dev/null 2>&1 git checkout "$TARGET_BRANCH"
logInfo "Merging '${SOURCE_BRANCH}' into '${TARGET_BRANCH}'..." logInfo "Merging '${SOURCE_BRANCH}' into '${TARGET_BRANCH}'..."
git merge "$SOURCE_BRANCH" --no-ff -m "$COMMIT_MSG" -m "${CHANGELOG}" "$SOURCE_BRANCH" -S"$GPG_GIT_KEY" git merge "$SOURCE_BRANCH" --no-ff -m "$COMMIT_MSG" -m "${CHANGELOG}" "$SOURCE_BRANCH" -S"$GPG_GIT_KEY"
logInfo "Creating tag '${TAG_NAME}'..." logInfo "Creating tag '${TAG_NAME}'..."
if [ -z "$GPG_GIT_KEY" ]; then if [ "" == "$GPG_GIT_KEY" ]; then
git tag -a "$TAG_NAME" -m "$COMMIT_MSG" -m "${CHANGELOG}" -s git tag -a "$TAG_NAME" -m "$COMMIT_MSG" -m "${CHANGELOG}" -s
else else
git tag -a "$TAG_NAME" -m "$COMMIT_MSG" -m "${CHANGELOG}" -s -u "$GPG_GIT_KEY" git tag -a "$TAG_NAME" -m "$COMMIT_MSG" -m "${CHANGELOG}" -s -u "$GPG_GIT_KEY"
@@ -642,7 +631,7 @@ appimage() {
appdir="$(realpath "$appdir")" appdir="$(realpath "$appdir")"
local out="${OUTPUT_DIR}" local out="${OUTPUT_DIR}"
if [ -z "$out" ]; then if [ "" == "$out" ]; then
out="." out="."
fi fi
mkdir -p "$out" mkdir -p "$out"
@@ -659,12 +648,12 @@ appimage() {
logInfo "Testing for AppImage tools..." logInfo "Testing for AppImage tools..."
local docker_test_cmd local docker_test_cmd
if [ "" != "$DOCKER_IMAGE" ]; then if [ "" != "$DOCKER_IMAGE" ]; then
docker_test_cmd="docker run -it --user $(id -u):$(id -g) --rm ${DOCKER_IMAGE}" docker_test_cmd="docker run --rm ${DOCKER_IMAGE}"
fi fi
# Test if linuxdeploy and linuxdeploy-plugin-qt are installed # Test if linuxdeploy and linuxdeploy-plugin-qt are installed
# on the system or inside the Docker container # on the system or inside the Docker container
if ! ${docker_test_cmd} which ${linuxdeploy} > /dev/null; then if ! ${docker_test_cmd} which ${linuxdeploy} &> /dev/null; then
logInfo "Downloading linuxdeploy..." logInfo "Downloading linuxdeploy..."
linuxdeploy="./linuxdeploy" linuxdeploy="./linuxdeploy"
linuxdeploy_cleanup="rm -f ${linuxdeploy}" linuxdeploy_cleanup="rm -f ${linuxdeploy}"
@@ -673,7 +662,7 @@ appimage() {
fi fi
chmod +x "$linuxdeploy" chmod +x "$linuxdeploy"
fi fi
if ! ${docker_test_cmd} which ${linuxdeploy_plugin_qt} > /dev/null; then if ! ${docker_test_cmd} which ${linuxdeploy_plugin_qt} &> /dev/null; then
logInfo "Downloading linuxdeploy-plugin-qt..." logInfo "Downloading linuxdeploy-plugin-qt..."
linuxdeploy_plugin_qt="./linuxdeploy-plugin-qt" linuxdeploy_plugin_qt="./linuxdeploy-plugin-qt"
linuxdeploy_plugin_qt_cleanup="rm -f ${linuxdeploy_plugin_qt}" linuxdeploy_plugin_qt_cleanup="rm -f ${linuxdeploy_plugin_qt}"
@@ -695,46 +684,49 @@ appimage() {
fi fi
# Create custom AppRun wrapper # Create custom AppRun wrapper
cat << 'EOF' > "${out_real}/KeePassXC-AppRun" cat << EOF > "${out_real}/KeePassXC-AppRun"
#!/usr/bin/env bash #!/usr/bin/env bash
export PATH="$(dirname $0)/usr/bin:${PATH}" export PATH="\$(dirname \$0)/usr/bin:\${PATH}"
export LD_LIBRARY_PATH="$(dirname $0)/usr/lib:${LD_LIBRARY_PATH}" export LD_LIBRARY_PATH="\$(dirname \$0)/usr/lib:\${LD_LIBRARY_PATH}"
if [ "$1" == "cli" ]; then if [ "\${1}" == "cli" ]; then
shift shift
exec keepassxc-cli "$@" exec keepassxc-cli "\$@"
elif [ "$1" == "proxy" ]; then elif [ "\${1}" == "proxy" ]; then
shift shift
exec keepassxc-proxy "$@" exec keepassxc-proxy "\$@"
elif [ -v CHROME_WRAPPER ] || [ -v MOZ_LAUNCHED_CHILD ]; then elif [ -v CHROME_WRAPPER ] || [ -v MOZ_LAUNCHED_CHILD ]; then
exec keepassxc-proxy "$@" exec keepassxc-proxy "\$@"
else else
exec keepassxc "$@" exec keepassxc "\$@"
fi fi
EOF EOF
chmod +x "${out_real}/KeePassXC-AppRun" chmod +x "${out_real}/KeePassXC-AppRun"
# Find .desktop files, icons, and binaries to deploy # Find .desktop files, icons, and binaries to deploy
local desktop_file="$(find "$appdir" -name "org.keepassxc.KeePassXC.desktop" | head -n1)" local desktop_file="$(find "$appdir" -name "org.keepassxc.KeePassXC.desktop" | head -n1)"
local icon="$(find "$appdir" -path '*/application/256x256/apps/keepassxc.png' | head -n1)" local icon="$(find "$appdir" -name 'keepassxc.png' | $GREP -P 'application/256x256/apps/keepassxc.png$' | head -n1)"
local executables="$(find "$appdir" -type f -executable -path '*/bin/keepassxc*' -print0 | xargs -0 -i printf " --executable={}")" local executables="$(IFS=$'\n' find "$appdir" | $GREP -P '/usr/bin/keepassxc[^/]*$' | xargs -i printf " --executable={}")"
logInfo "Collecting libs and patching binaries..." logInfo "Collecting libs and patching binaries..."
if [ -z "$DOCKER_IMAGE" ]; then if [ "" == "$DOCKER_IMAGE" ]; then
"$linuxdeploy" --verbosity=${verbosity} --plugin=qt --appdir="$appdir" --desktop-file="$desktop_file" \ "$linuxdeploy" --verbosity=${verbosity} --plugin=qt --appdir="$appdir" --desktop-file="$desktop_file" \
--custom-apprun="${out_real}/KeePassXC-AppRun" --icon-file="$icon" ${executables} --custom-apprun="${out_real}/KeePassXC-AppRun" --icon-file="$icon" ${executables} \
--library=$(ldconfig -p | $GREP x86-64 | $GREP -oP '/[^\s]+/libgpg-error\.so\.\d+$' | head -n1)
else else
desktop_file="${desktop_file//${appdir}/\/keepassxc\/AppDir}"
icon="${icon//${appdir}/\/keepassxc\/AppDir}"
executables="${executables//${appdir}/\/keepassxc\/AppDir}"
docker run --name "$DOCKER_CONTAINER_NAME" --rm \ docker run --name "$DOCKER_CONTAINER_NAME" --rm \
--cap-add SYS_ADMIN --security-opt apparmor:unconfined --device /dev/fuse -it \ --cap-add SYS_ADMIN --security-opt apparmor:unconfined --device /dev/fuse \
-v "${out_real}:${out_real}:rw" \ -v "${appdir}:/keepassxc/AppDir:rw" \
-v "${appdir}:${appdir}:rw" \ -v "${out_real}:/keepassxc/out:rw" \
-w "$out_real" \
--user $(id -u):$(id -g) \
"$DOCKER_IMAGE" \ "$DOCKER_IMAGE" \
bash -c "${linuxdeploy} --verbosity=${verbosity} --plugin=qt \ bash -c "cd /keepassxc/out && ${linuxdeploy} --verbosity=${verbosity} --plugin=qt --appdir=/keepassxc/AppDir \
--appdir='${appdir}' --custom-apprun='${out_real}/KeePassXC-AppRun' \ --custom-apprun="/keepassxc/out/KeePassXC-AppRun" --desktop-file=${desktop_file} --icon-file=${icon} ${executables} \
--desktop-file='${desktop_file}' --icon-file='${icon}' ${executables}" --library=\$(ldconfig -p | grep x86-64 | grep -oP '/[^\s]+/libgpg-error\.so\.\d+$' | head -n1)"
fi fi
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
@@ -780,7 +772,6 @@ build() {
local build_generators="" local build_generators=""
local build_appsign=false local build_appsign=false
local build_key="" local build_key=""
local build_vcpkg=""
while [ $# -ge 1 ]; do while [ $# -ge 1 ]; do
local arg="$1" local arg="$1"
@@ -830,10 +821,6 @@ build() {
--appimage) --appimage)
build_appimage=true ;; build_appimage=true ;;
--cmake-generator)
CMAKE_GENERATOR="$2"
shift ;;
-c|--cmake-options) -c|--cmake-options)
CMAKE_OPTIONS="$2" CMAKE_OPTIONS="$2"
shift ;; shift ;;
@@ -842,10 +829,6 @@ build() {
COMPILER="$2" COMPILER="$2"
shift ;; shift ;;
--vcpkg)
build_vcpkg="$2"
shift ;;
-m|--make-options) -m|--make-options)
MAKE_OPTIONS="$2" MAKE_OPTIONS="$2"
shift ;; shift ;;
@@ -882,15 +865,12 @@ build() {
init init
OUTPUT_DIR="$(realpath "$OUTPUT_DIR")"
# Resolve appsign key to absolute path if under Windows # Resolve appsign key to absolute path if under Windows
if [[ "${build_key}" && "$(uname -o)" == "Msys" ]]; then if [[ "${build_key}" && "$(uname -o)" == "Msys" ]]; then
build_key="$(realpath "${build_key}")" build_key="$(realpath "${build_key}")"
fi fi
if [[ -f ${build_vcpkg} ]]; then
CMAKE_OPTIONS="${CMAKE_OPTIONS} -DCMAKE_TOOLCHAIN_FILE=${build_vcpkg} -DX_VCPKG_APPLOCAL_DEPS_INSTALL=ON"
fi
if ${build_snapshot}; then if ${build_snapshot}; then
TAG_NAME="HEAD" TAG_NAME="HEAD"
local branch=`git rev-parse --abbrev-ref HEAD` local branch=`git rev-parse --abbrev-ref HEAD`
@@ -908,16 +888,13 @@ build() {
CMAKE_OPTIONS="${CMAKE_OPTIONS} -DKEEPASSXC_BUILD_TYPE=Release" CMAKE_OPTIONS="${CMAKE_OPTIONS} -DKEEPASSXC_BUILD_TYPE=Release"
logInfo "Checking out release tag '${TAG_NAME}'..." logInfo "Checking out release tag '${TAG_NAME}'..."
fi fi
git checkout "$TAG_NAME" > /dev/null 2>&1 git checkout "$TAG_NAME"
fi
OUTPUT_DIR="$(realpath "$OUTPUT_DIR")"
if ! ${build_snapshot} && [ -d "$OUTPUT_DIR" ]; then
exitError "Output dir '${OUTPUT_DIR}' already exists."
fi fi
logInfo "Creating output directory..." logInfo "Creating output directory..."
if ! mkdir -p "$OUTPUT_DIR"; then mkdir -p "$OUTPUT_DIR"
if [ $? -ne 0 ]; then
exitError "Failed to create output directory!" exitError "Failed to create output directory!"
fi fi
@@ -945,6 +922,14 @@ build() {
$xz -6 "${OUTPUT_DIR}/${tarball_name}" $xz -6 "${OUTPUT_DIR}/${tarball_name}"
fi fi
if ! ${build_snapshot} && [ -e "${OUTPUT_DIR}/build-release" ]; then
logInfo "Cleaning existing build directory..."
rm -rf "${OUTPUT_DIR}/build-release" 2> /dev/null
if [ $? -ne 0 ]; then
exitError "Failed to clean existing build directory, please do it manually."
fi
fi
logInfo "Creating build directory..." logInfo "Creating build directory..."
mkdir -p "${OUTPUT_DIR}/build-release" mkdir -p "${OUTPUT_DIR}/build-release"
cd "${OUTPUT_DIR}/build-release" cd "${OUTPUT_DIR}/build-release"
@@ -965,23 +950,22 @@ build() {
export CC=gcc export CC=gcc
elif [ "$COMPILER" == "clang++" ]; then elif [ "$COMPILER" == "clang++" ]; then
export CC=clang export CC=clang
else
export CC="$COMPILER"
fi fi
export CXX="$COMPILER" export CXX="$COMPILER"
if [ -z "$DOCKER_IMAGE" ]; then if [ "" == "$DOCKER_IMAGE" ]; then
if [ "$(uname -s)" == "Darwin" ]; then if [ "$(uname -s)" == "Darwin" ]; then
# Building on macOS # Building on macOS
export MACOSX_DEPLOYMENT_TARGET export MACOSX_DEPLOYMENT_TARGET
logInfo "Configuring build..." logInfo "Configuring build..."
cmake -G "${CMAKE_GENERATOR}" -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_ARCHITECTURES="$(uname -m)" \ cmake -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" ${CMAKE_OPTIONS} "$SRC_DIR" -DCMAKE_OSX_ARCHITECTURES=x86_64 -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" \
-DCMAKE_PREFIX_PATH="/usr/local/opt/qt/lib/cmake" \
${CMAKE_OPTIONS} "$SRC_DIR"
logInfo "Compiling and packaging sources..." logInfo "Compiling and packaging sources..."
cmake --build . -- ${MAKE_OPTIONS} make ${MAKE_OPTIONS} package
cpack -G "DragNDrop"
# Appsign the executables if desired # Appsign the executables if desired
if ${build_appsign}; then if ${build_appsign}; then
@@ -989,20 +973,20 @@ build() {
appsign "-f" "./${APP_NAME}-${RELEASE_NAME}.dmg" "-k" "${build_key}" appsign "-f" "./${APP_NAME}-${RELEASE_NAME}.dmg" "-k" "${build_key}"
fi fi
mv "./${APP_NAME}-${RELEASE_NAME}.dmg" "../${APP_NAME}-${RELEASE_NAME}-$(uname -m).dmg" mv "./${APP_NAME}-${RELEASE_NAME}.dmg" ../
elif [ "$(uname -o)" == "Msys" ]; then elif [ "$(uname -o)" == "Msys" ]; then
# Building on Windows with Msys2 # Building on Windows with Msys2
logInfo "Configuring build..." logInfo "Configuring build..."
cmake -DCMAKE_BUILD_TYPE=Release -G "${CMAKE_GENERATOR}" -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" \ cmake -DCMAKE_BUILD_TYPE=Release -G"MSYS Makefiles" \
${CMAKE_OPTIONS} "$SRC_DIR" -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" ${CMAKE_OPTIONS} "$SRC_DIR"
logInfo "Compiling and packaging sources..." logInfo "Compiling and packaging sources..."
cmake --build . --config "Release" -- ${MAKE_OPTIONS} mingw32-make ${MAKE_OPTIONS} preinstall
# Appsign the executables if desired # Appsign the executables if desired
if ${build_appsign} && [ -f "${build_key}" ]; then if ${build_appsign} && [ -f "${build_key}" ]; then
logInfo "Signing executable files" logInfo "Signing executable files"
appsign "-f" $(find src | $GREP -Pi 'keepassxc.*(.exe$|.dll$)') "-k" "${build_key}" appsign "-f" $(find src | $GREP -P '\.exe$|\.dll$') "-k" "${build_key}"
fi fi
# Call cpack directly instead of calling make package. # Call cpack directly instead of calling make package.
@@ -1010,6 +994,17 @@ build() {
# release. # release.
cpack -G "${CPACK_GENERATORS};${build_generators}" cpack -G "${CPACK_GENERATORS};${build_generators}"
# Inject the portable config into the zip build and rename
touch .portable
for filename in ${APP_NAME}-*.zip; do
logInfo "Creating portable zip file"
local folder=$(echo ${filename} | sed -r 's/(.*)\.zip/\1/')
python -c 'import zipfile,sys ; zipfile.ZipFile(sys.argv[1],"a").write(sys.argv[2],sys.argv[3])' \
${filename} .portable ${folder}/.portable
mv ${filename} ${folder}-portable.zip
done
rm .portable
mv "${APP_NAME}-"*.* ../ mv "${APP_NAME}-"*.* ../
else else
mkdir -p "${OUTPUT_DIR}/KeePassXC.AppDir" mkdir -p "${OUTPUT_DIR}/KeePassXC.AppDir"
@@ -1033,7 +1028,7 @@ build() {
logInfo "Launching Docker contain to compile snapcraft..." logInfo "Launching Docker contain to compile snapcraft..."
sudo docker run --name "$DOCKER_CONTAINER_NAME" --rm -it --user $(id -u):$(id -g) \ sudo docker run --name "$DOCKER_CONTAINER_NAME" --rm \
-v "$(realpath "$SRC_DIR"):/keepassxc" -w "/keepassxc" \ -v "$(realpath "$SRC_DIR"):/keepassxc" -w "/keepassxc" \
"$DOCKER_IMAGE" snapcraft "$DOCKER_IMAGE" snapcraft
else else
@@ -1043,8 +1038,7 @@ build() {
docker run --name "$DOCKER_CONTAINER_NAME" --rm \ docker run --name "$DOCKER_CONTAINER_NAME" --rm \
--cap-add SYS_ADMIN --security-opt apparmor:unconfined --device /dev/fuse \ --cap-add SYS_ADMIN --security-opt apparmor:unconfined --device /dev/fuse \
--user $(id -u):$(id -g) \ -e "CC=${CC}" -e "CXX=${CXX}" \
-e "CC=${CC}" -e "CXX=${CXX}" -it \
-v "$(realpath "$SRC_DIR"):/keepassxc/src:ro" \ -v "$(realpath "$SRC_DIR"):/keepassxc/src:ro" \
-v "$(realpath "$OUTPUT_DIR"):/keepassxc/out:rw" \ -v "$(realpath "$OUTPUT_DIR"):/keepassxc/out:rw" \
"$DOCKER_IMAGE" \ "$DOCKER_IMAGE" \
@@ -1074,7 +1068,7 @@ build() {
docker_image_flag="-d ${DOCKER_IMAGE}" docker_image_flag="-d ${DOCKER_IMAGE}"
docker_container_name_flag="--container-name ${DOCKER_CONTAINER_NAME}" docker_container_name_flag="--container-name ${DOCKER_CONTAINER_NAME}"
fi fi
appimage -a "${OUTPUT_DIR}/KeePassXC.AppDir" -o "${OUTPUT_DIR}" \ appimage "-a" "${OUTPUT_DIR}/KeePassXC.AppDir" "-o" "${OUTPUT_DIR}" \
${appsign_flag} ${appsign_key_flag} ${docker_image_flag} ${docker_container_name_flag} ${appsign_flag} ${appsign_key_flag} ${docker_image_flag} ${docker_container_name_flag}
fi fi
@@ -1147,6 +1141,8 @@ gpgsign() {
appsign() { appsign() {
local sign_files=() local sign_files=()
local key local key
local ac_username
local ac_keychain="AC_PASSWORD"
while [ $# -ge 1 ]; do while [ $# -ge 1 ]; do
local arg="$1" local arg="$1"
@@ -1161,6 +1157,14 @@ appsign() {
key="$2" key="$2"
shift ;; shift ;;
-u|--username)
ac_username="$2"
shift ;;
-c|--keychain)
ac_keychain="$2"
shift ;;
-h|--help) -h|--help)
printUsage "appsign" printUsage "appsign"
exit ;; exit ;;
@@ -1186,12 +1190,16 @@ appsign() {
fi fi
for f in "${sign_files[@]}"; do for f in "${sign_files[@]}"; do
if [ ! -e "${f}" ]; then if [ ! -f "${f}" ]; then
exitError "File '${f}' does not exist!" exitError "File '${f}' does not exist or is not a file!"
fi fi
done done
if [ "$(uname -s)" == "Darwin" ]; then if [ "$(uname -s)" == "Darwin" ]; then
if [ "$ac_username" == "" ]; then
exitError "Missing arguments, --username is required!"
fi
checkXcodeSetup checkXcodeSetup
checkGrepCompat checkGrepCompat
@@ -1202,45 +1210,30 @@ appsign() {
logInfo "Unpacking disk image '${f}'..." logInfo "Unpacking disk image '${f}'..."
local tmp_dir="/tmp/KeePassXC_${RANDOM}" local tmp_dir="/tmp/KeePassXC_${RANDOM}"
mkdir -p ${tmp_dir}/mnt mkdir -p ${tmp_dir}/mnt
if ! hdiutil attach -quiet -noautoopen -mountpoint ${tmp_dir}/mnt "${f}"; then hdiutil attach -quiet -noautoopen -mountpoint ${tmp_dir}/mnt "${f}"
exitError "DMG mount failed!"
fi
cd ${tmp_dir} cd ${tmp_dir}
cp -a ./mnt ./app cp -a ./mnt ./app
hdiutil detach -quiet ${tmp_dir}/mnt hdiutil detach -quiet ${tmp_dir}/mnt
local app_dir_tmp="./app/KeePassXC.app"
if [ ! -d "$app_dir_tmp" ]; then if [ ! -d ./app/KeePassXC.app ]; then
cd "${orig_dir}" cd "${orig_dir}"
exitError "Unpacking failed!" exitError "Unpacking failed!"
fi fi
elif [[ ${f: -4} == '.app' ]]; then
local app_dir_tmp="$f"
else
logWarn "Skipping non-app file '${f}'..."
continue
fi
logInfo "Signing libraries and frameworks..." logInfo "Signing app bundle..."
if ! find "$app_dir_tmp" \( -name '*.dylib' -o -name '*.so' -o -name '*.framework' \) -print0 | xargs -0 \ xcrun codesign --sign "${key}" --verbose --deep --options runtime ./app/KeePassXC.app
xcrun codesign --sign "${key}" --verbose --force --options runtime; then
cd "${orig_dir}" # Sign main binary and libraries independently so we can keep using the convenient --deep
exitError "Signing failed!" # option while avoiding adding entitlements recursively
fi logInfo "Signing main binary..."
logInfo "Signing executables..." xcrun codesign --sign "${key}" --verbose --force --options runtime --entitlements \
if ! find "${app_dir_tmp}/Contents/MacOS" \( -type f -not -name KeePassXC \) -print0 | xargs -0 \ "${real_src_dir}/share/macosx/keepassxc.entitlements" ./app/KeePassXC.app/Contents/MacOS/KeePassXC
xcrun codesign --sign "${key}" --verbose --force --options runtime; then
cd "${orig_dir}" if [ 0 -ne $? ]; then
exitError "Signing failed!" cd "${orig_dir}"
fi exitError "Signing failed!"
# Sign main executable with additional entitlements fi
if ! xcrun codesign --sign "${key}" --verbose --force --options runtime --entitlements \
"${real_src_dir}/share/macosx/keepassxc.entitlements" "${app_dir_tmp}/Contents/MacOS/KeePassXC"; then
cd "${orig_dir}"
exitError "Signing failed!"
fi
if [[ ${f: -4} == '.dmg' ]]; then
logInfo "Repacking disk image..." logInfo "Repacking disk image..."
hdiutil create \ hdiutil create \
-volname "KeePassXC" \ -volname "KeePassXC" \
@@ -1254,18 +1247,60 @@ appsign() {
cd "${orig_dir}" cd "${orig_dir}"
cp -f "${tmp_dir}/$(basename "${f}")" "${f}" cp -f "${tmp_dir}/$(basename "${f}")" "${f}"
rm -Rf ${tmp_dir} rm -Rf ${tmp_dir}
fi
logInfo "File '${f}' successfully signed." logInfo "Submitting disk image for notarization..."
local status="$(xcrun altool --notarize-app \
--primary-bundle-id "org.keepassxc.keepassxc" \
--username "${ac_username}" \
--password "@keychain:${ac_keychain}" \
--file "${f}")"
if [ 0 -ne $? ]; then
logError "Submission failed!"
exitError "Error message:\n${status}"
fi
local ticket="$(echo "${status}" | $GREP -oP "[a-f0-9-]+$")"
logInfo "Submission successful. Ticket ID: ${ticket}."
logInfo "Waiting for notarization to finish (this may take a while)..."
while true; do
echo -n "."
status="$(xcrun altool --notarization-info "${ticket}" \
--username "${ac_username}" \
--password "@keychain:${ac_keychain}")"
if echo "$status" | $GREP -q "Status Code: 0"; then
logInfo "\nNotarization successful."
break
elif echo "$status" | $GREP -q "Status Code"; then
logError "\nNotarization failed!"
exitError "Error message:\n${status}"
fi
sleep 5
done
logInfo "Stapling ticket to disk image..."
xcrun stapler staple "${f}"
if [ 0 -ne $? ]; then
exitError "Stapling failed!"
fi
logInfo "Disk image successfully signed and notarized."
else
logWarn "Skipping non-DMG file '${f}'..."
fi
done done
elif [ "$(uname -o)" == "Msys" ]; then elif [ "$(uname -o)" == "Msys" ]; then
if [[ ! -f "${key}" ]]; then if [[ ! -f "${key}" ]]; then
exitError "Appsign key file was not found! (${key})" exitError "Key file was not found!"
fi fi
logInfo "Using appsign key ${key}." read -s -p "Key password: " password
IFS=$'\n' read -s -r -p "Key password: " password
echo echo
for f in "${sign_files[@]}"; do for f in "${sign_files[@]}"; do
@@ -1294,190 +1329,12 @@ appsign() {
logInfo "All done!" logInfo "All done!"
} }
# -----------------------------------------------------------------------
# notarize command
# -----------------------------------------------------------------------
notarize() {
local notarize_files=()
local ac_username
local ac_keychain="AC_PASSWORD"
while [ $# -ge 1 ]; do
local arg="$1"
case "$arg" in
-f|--files)
while [ "${2:0:1}" != "-" ] && [ $# -ge 2 ]; do
notarize_files+=("$2")
shift
done ;;
-u|--username)
ac_username="$2"
shift ;;
-c|--keychain)
ac_keychain="$2"
shift ;;
-h|--help)
printUsage "notarize"
exit ;;
*)
logError "Unknown option '$arg'\n"
printUsage "notarize"
exit 1 ;;
esac
shift
done
if [ "$(uname -s)" != "Darwin" ]; then
exitError "Notarization is only supported on macOS!"
fi
if [ -z "${notarize_files}" ]; then
logError "Missing arguments, --files is required!\n"
printUsage "notarize"
exit 1
fi
if [ -z "$ac_username" ]; then
logError "Missing arguments, --username is required!"
printUsage "notarize"
exit 1
fi
for f in "${notarize_files[@]}"; do
if [[ ${f: -4} != '.dmg' ]]; then
logWarn "Skipping non-DMG file '${f}'..."
continue
fi
logInfo "Submitting disk image '${f}' for notarization..."
local status
status="$(xcrun altool --notarize-app \
--primary-bundle-id "org.keepassxc.keepassxc" \
--username "${ac_username}" \
--password "@keychain:${ac_keychain}" \
--file "${f}" 2> /dev/null)"
if [ 0 -ne $? ]; then
logError "Submission failed!"
exitError "Error message:\n${status}"
fi
local ticket="$(echo "${status}" | $GREP -oP "[a-f0-9-]+$")"
logInfo "Submission successful. Ticket ID: ${ticket}."
logInfo "Waiting for notarization to finish (this may take a while)..."
while true; do
echo -n "."
status="$(xcrun altool --notarization-info "${ticket}" \
--username "${ac_username}" \
--password "@keychain:${ac_keychain}" 2> /dev/null)"
if echo "$status" | $GREP -q "Status Code: 0"; then
logInfo "\nNotarization successful."
break
elif echo "$status" | $GREP -q "Status Code"; then
logError "\nNotarization failed!"
exitError "Error message:\n${status}"
fi
sleep 5
done
logInfo "Stapling ticket to disk image..."
xcrun stapler staple "${f}"
if [ 0 -ne $? ]; then
exitError "Stapling failed!"
fi
logInfo "Disk image successfully notarized."
done
}
# -----------------------------------------------------------------------
# i18n command
# -----------------------------------------------------------------------
i18n() {
local cmd="$1"
if [ -z "$cmd" ]; then
logError "No subcommand specified.\n"
printUsage i18n
exit 1
elif [ "$cmd" != "tx-push" ] && [ "$cmd" != "tx-pull" ] && [ "$cmd" != "lupdate" ]; then
logError "Unknown subcommand: '${cmd}'\n"
printUsage i18n
exit 1
fi
shift
checkGitRepository
if [ "$cmd" == "lupdate" ]; then
if [ ! -d share/translations ]; then
logError "Command must be called from repository root directory."
exit 1
fi
checkQt5LUpdateExists
logInfo "Updating source translation file..."
LUPDATE=lupdate-qt5
if ! command -v $LUPDATE > /dev/null; then
LUPDATE=lupdate
fi
$LUPDATE -no-ui-lines -disable-heuristic similartext -locations none -no-obsolete src \
-ts share/translations/keepassxc_en.ts $@
return 0
fi
checkTransifexCommandExists
local branch="$(git branch --show-current 2>&1)"
local real_branch="$branch"
if [[ "$branch" =~ ^release/ ]]; then
logInfo "Release branch, setting language resource to master branch."
branch="master"
elif [ "$branch" != "develop" ] && [ "$branch" != "master" ]; then
logError "Must be on master or develop branch!"
exit 1
fi
local resource="keepassxc.share-translations-keepassxc-en-ts--${branch}"
if [ "$cmd" == "tx-push" ]; then
echo -e "This will push the \e[1m'en'\e[0m source file from the current branch to Transifex:\n" >&2
echo -e " \e[1m${real_branch}\e[0m -> \e[1m${resource}\e[0m\n" >&2
echo -n "Continue? [y/N] " >&2
read -r yesno
if [ "$yesno" != "y" ] && [ "$yesno" != "Y" ]; then
logError "Push aborted."
exit 1
fi
logInfo "Pushing source translation file to Transifex..."
tx push -s --use-git-timestamps -r "$resource" $@
elif [ "$cmd" == "tx-pull" ]; then
logInfo "Pulling updated translations from Transifex..."
tx pull -af --minimum-perc=60 --parallel -r "$resource" $@
fi
}
# ----------------------------------------------------------------------- # -----------------------------------------------------------------------
# parse global command line # parse global command line
# ----------------------------------------------------------------------- # -----------------------------------------------------------------------
MODE="$1" MODE="$1"
shift || true shift
if [ -z "$MODE" ]; then if [ "" == "$MODE" ]; then
logError "Missing arguments!\n" logError "Missing arguments!\n"
printUsage printUsage
exit 1 exit 1
@@ -1485,8 +1342,7 @@ elif [ "help" == "$MODE" ]; then
printUsage "$1" printUsage "$1"
exit exit
elif [ "check" == "$MODE" ] || [ "merge" == "$MODE" ] || [ "build" == "$MODE" ] \ elif [ "check" == "$MODE" ] || [ "merge" == "$MODE" ] || [ "build" == "$MODE" ] \
|| [ "gpgsign" == "$MODE" ] || [ "appsign" == "$MODE" ]|| [ "notarize" == "$MODE" ] \ || [ "gpgsign" == "$MODE" ] || [ "appsign" == "$MODE" ] || [ "appimage" == "$MODE" ]; then
|| [ "appimage" == "$MODE" ]|| [ "i18n" == "$MODE" ]; then
${MODE} "$@" ${MODE} "$@"
else else
printUsage "$MODE" printUsage "$MODE"

View File

@@ -1,538 +0,0 @@
<#
.SYNOPSIS
KeePassXC Release Tool
.DESCRIPTION
Commands:
merge Merge release branch into main branch and create release tags
build Build and package binary release from sources
sign Sign previously compiled release packages
.NOTES
The following are descriptions of certain parameters:
-Vcpkg Specify VCPKG toolchain file (example: C:\vcpkg\scripts\buildsystems\vcpkg.cmake)
-Tag Release tag to check out (defaults to version number)
-Snapshot Build current HEAD without checkout out Tag
-CMakeGenerator Override the default CMake generator
-CMakeOptions Additional CMake options for compiling the sources
-CPackGenerators Set CPack generators (default: WIX;ZIP)
-Compiler Compiler to use (example: g++, clang, msbuild)
-MakeOptions Options to pass to the make program
-SignBuild Perform platform specific App Signing before packaging
-SignKey Specify the App Signing Key/Identity
-TimeStamp Explicitly set the timestamp server to use for appsign
-SourceBranch Source branch to merge from (default: 'release/$Version')
-TargetBranch Target branch to merge to (default: master)
-VSToolChain Specify Visual Studio Toolchain by name if more than one is available
#>
param(
[Parameter(ParameterSetName = "merge", Mandatory, Position = 0)]
[switch] $Merge,
[Parameter(ParameterSetName = "build", Mandatory, Position = 0)]
[switch] $Build,
[Parameter(ParameterSetName = "sign", Mandatory, Position = 0)]
[switch] $Sign,
[Parameter(ParameterSetName = "merge", Mandatory, Position = 1)]
[Parameter(ParameterSetName = "build", Mandatory, Position = 1)]
[Parameter(ParameterSetName = "sign", Mandatory, Position = 1)]
[ValidatePattern("^[0-9]\.[0-9]\.[0-9]$")]
[string] $Version,
[Parameter(ParameterSetName = "build", Mandatory)]
[string] $Vcpkg,
[Parameter(ParameterSetName = "sign", Mandatory)]
[SupportsWildcards()]
[string[]] $SignFiles,
# [Parameter(ParameterSetName = "build")]
# [switch] $DryRun,
[Parameter(ParameterSetName = "build")]
[switch] $Snapshot,
[Parameter(ParameterSetName = "build")]
[switch] $SignBuild,
[Parameter(ParameterSetName = "build")]
[string] $CMakeGenerator = "Ninja",
[Parameter(ParameterSetName = "build")]
[string] $CMakeOptions,
[Parameter(ParameterSetName = "build")]
[string] $CPackGenerators = "WIX;ZIP",
[Parameter(ParameterSetName = "build")]
[string] $Compiler,
[Parameter(ParameterSetName = "build")]
[string] $MakeOptions,
[Parameter(ParameterSetName = "build")]
[Parameter(ParameterSetName = "sign")]
[string] $SignKey,
[Parameter(ParameterSetName = "build")]
[Parameter(ParameterSetName = "sign")]
[string] $Timestamp = "http://timestamp.sectigo.com",
[Parameter(ParameterSetName = "merge")]
[Parameter(ParameterSetName = "build")]
[Parameter(ParameterSetName = "sign")]
[string] $GpgKey = "CFB4C2166397D0D2",
[Parameter(ParameterSetName = "merge")]
[Parameter(ParameterSetName = "build")]
[string] $SourceDir = ".",
[Parameter(ParameterSetName = "build")]
[string] $OutDir = ".\release",
[Parameter(ParameterSetName = "merge")]
[Parameter(ParameterSetName = "build")]
[string] $Tag,
[Parameter(ParameterSetName = "merge")]
[string] $SourceBranch,
[Parameter(ParameterSetName = "merge")]
[string] $TargetBranch = "master",
[Parameter(ParameterSetName = "build")]
[string] $VSToolChain,
[Parameter(ParameterSetName = "merge")]
[Parameter(ParameterSetName = "build")]
[Parameter(ParameterSetName = "sign")]
[string] $ExtraPath
)
# Helper function definitions
function Test-RequiredPrograms {
# If any of these fail they will throw an exception terminating the script
if ($Build) {
Get-Command git | Out-Null
Get-Command cmake | Out-Null
}
if ($Merge) {
Get-Command git | Out-Null
Get-Command tx | Out-Null
Get-Command lupdate | Out-Null
}
if ($Sign -or $SignBuild) {
if ($SignKey.Length) {
Get-Command signtool | Out-Null
}
Get-Command gpg | Out-Null
}
}
function Test-VersionInFiles {
# Check CMakeLists.txt
$Major, $Minor, $Patch = $Version.split(".", 3)
if (!(Select-String "$SourceDir\CMakeLists.txt" -pattern "KEEPASSXC_VERSION_MAJOR `"$Major`"" -Quiet) `
-or !(Select-String "$SourceDir\CMakeLists.txt" -pattern "KEEPASSXC_VERSION_MINOR `"$Minor`"" -Quiet) `
-or !(Select-String "$SourceDir\CMakeLists.txt" -pattern "KEEPASSXC_VERSION_PATCH `"$Patch`"" -Quiet)) {
throw "CMakeLists.txt has not been updated to $Version."
}
# Check Changelog
if (!(Select-String "$SourceDir\CHANGELOG.md" -pattern "^## $Version \(\d{4}-\d{2}-\d{2}\)$" -Quiet)) {
throw "CHANGELOG.md does not contain a section for $Version."
}
# Check AppStreamInfo
if (!(Select-String "$SourceDir\share\linux\org.keepassxc.KeePassXC.appdata.xml" `
-pattern "<release version=`"$Version`" date=`"\d{4}-\d{2}-\d{2}`">" -Quiet)) {
throw "share/linux/org.keepassxc.KeePassXC.appdata.xml does not contain a section for $Version."
}
}
function Test-WorkingTreeClean {
& git diff-index --quiet HEAD --
if ($LASTEXITCODE) {
throw "Current working tree is not clean! Please commit or unstage any changes."
}
}
function Invoke-VSToolchain([String] $Toolchain, [String] $Path, [String] $Arch) {
# Find Visual Studio installations
$vs = Get-CimInstance MSFT_VSInstance
if ($vs.count -eq 0) {
$err = "No Visual Studio installations found, download one from https://visualstudio.com/downloads."
$err = "$err`nIf Visual Studio is installed, you may need to repair the install then restart."
throw $err
}
$VSBaseDir = $vs[0].InstallLocation
if ($Toolchain) {
# Try to find the specified toolchain by name
foreach ($_ in $vs) {
if ($_.Name -eq $Toolchain) {
$VSBaseDir = $_.InstallLocation
break
}
}
} elseif ($vs.count -gt 1) {
# Ask the user which install to use
$i = 0
foreach ($_ in $vs) {
$i = $i + 1
$i.ToString() + ") " + $_.Name | Write-Host
}
$i = Read-Host -Prompt "Which Visual Studio installation do you want to use?"
$i = [Convert]::ToInt32($i, 10) - 1
if ($i -lt 0 -or $i -ge $vs.count) {
throw "Invalid selection made"
}
$VSBaseDir = $vs[$i].InstallLocation
}
# Bootstrap the specified VS Toolchain
Import-Module "$VSBaseDir\Common7\Tools\Microsoft.VisualStudio.DevShell.dll"
Enter-VsDevShell -VsInstallPath $VSBaseDir -Arch $Arch -StartInPath $Path | Write-Host
Write-Host # Newline after command output
}
function Invoke-Cmd([string] $command, [string[]] $options = @(), [switch] $maskargs, [switch] $quiet) {
$call = ('{0} {1}' -f $command, ($options -Join ' '))
if ($maskargs) {
Write-Host "$command <masked>" -ForegroundColor DarkGray
}
else {
Write-Host $call -ForegroundColor DarkGray
}
if ($quiet) {
Invoke-Expression $call > $null
} else {
Invoke-Expression $call
}
if ($LASTEXITCODE -ne 0) {
throw "Failed to run command: {0}" -f $command
}
Write-Host #insert newline after command output
}
function Invoke-SignFiles([string[]] $files, [string] $key, [string] $time) {
if (!(Test-Path -Path "$key" -PathType leaf)) {
throw "Appsign key file was not found! ($key)"
}
if ($files.Length -eq 0) {
return
}
Write-Host "Signing files using $key" -ForegroundColor Cyan
$KeyPassword = Read-Host "Key password: " -MaskInput
foreach ($_ in $files) {
Write-Host "Signing file '$_' using Microsoft signtool..."
Invoke-Cmd "signtool" "sign -f `"$key`" -p `"$KeyPassword`" -d `"KeePassXC`" -td sha256 -fd sha256 -tr `"$time`" `"$_`"" -maskargs
}
}
function Invoke-GpgSignFiles([string[]] $files, [string] $key) {
if ($files.Length -eq 0) {
return
}
Write-Host "Signing files using GPG key $key" -ForegroundColor Cyan
foreach ($_ in $files) {
Write-Host "Signing file '$_' and creating DIGEST..."
if (Test-Path "$_.sig") {
Remove-Item "$_.sig"
}
Invoke-Cmd "gpg" "--output `"$_.sig`" --armor --local-user `"$key`" --detach-sig `"$_`""
$FileName = (Get-Item $_).Name
(Get-FileHash "$_" SHA256).Hash + " *$FileName" | Out-File "$_.DIGEST" -NoNewline
}
}
# Handle errors and restore state
$OrigDir = (Get-Location).Path
$OrigBranch = & git rev-parse --abbrev-ref HEAD
$ErrorActionPreference = 'Stop'
trap {
Write-Host "Restoring state..." -ForegroundColor Yellow
& git checkout $OrigBranch
Set-Location "$OrigDir"
}
Write-Host "KeePassXC Release Preparation Helper" -ForegroundColor Green
Write-Host "Copyright (C) 2022 KeePassXC Team <https://keepassxc.org/>`n" -ForegroundColor Green
# Prepend extra PATH locations as specified
if ($ExtraPath) {
$env:Path = "$ExtraPath;$env:Path"
}
# Resolve absolute directory for paths
$SourceDir = (Resolve-Path $SourceDir).Path
# Check format of -Version
if ($Version -notmatch "^\d+\.\d+\.\d+$") {
throw "Invalid format for -Version input"
}
# Check platform
if (!$IsWindows) {
throw "The PowerShell release tool is not available for Linux or macOS at this time."
}
if ($Merge) {
Test-RequiredPrograms
# Change to SourceDir
Set-Location "$SourceDir"
Test-VersionInFiles
Test-WorkingTreeClean
if (!$SourceBranch.Length) {
$SourceBranch = & git branch --show-current
}
if ($SourceBranch -notmatch "^release/.*|develop$") {
throw "Must be on develop or a release/* branch to continue merging."
}
# Update translation files
Write-Host "Updating source translation file..."
Invoke-Cmd "lupdate" "-no-ui-lines -disable-heuristic similartext -locations none", `
"-no-obsolete ./src -ts share/translations/keepassxc_en.ts"
Write-Host "Pulling updated translations from Transifex..."
Invoke-Cmd "tx" "pull -af --minimum-perc=60 --parallel -r keepassxc.share-translations-keepassxc-en-ts--develop"
# Only commit if there are changes
& git diff-index --quiet HEAD --
if ($LASTEXITCODE) {
Write-Host "Committing translation updates..."
Invoke-Cmd "git" "add -A ./share/translations/" -quiet
Invoke-Cmd "git" "commit -m `"Update translations`"" -quiet
}
# Read the version release notes from CHANGELOG
$Changelog = ""
$ReadLine = $false
Get-Content "CHANGELOG.md" | ForEach-Object {
if ($ReadLine) {
if ($_ -match "^## ") {
$ReadLine = $false
} else {
$Changelog += $_ + "`n"
}
} elseif ($_ -match "$Version \(\d{4}-\d{2}-\d{2}\)") {
$ReadLine = $true
}
}
Write-Host "Checking out target branch '$TargetBranch'..."
Invoke-Cmd "git" "checkout `"$TargetBranch`"" -quiet
Write-Host "Merging '$SourceBranch' into '$TargetBranch'..."
Invoke-Cmd "git" "merge `"$SourceBranch`" --no-ff -m `"Release $Version`" -m `"$Changelog`" `"$SourceBranch`" -S" -quiet
Write-Host "Creating tag for '$Version'..."
Invoke-Cmd "git" "tag -a `"$Version`" -m `"Release $Version`" -m `"$Changelog`" -s" -quiet
Write-Host "All done!"
Write-Host "Please merge the release branch back into the develop branch now and then push your changes."
Write-Host "Don't forget to also push the tags using 'git push --tags'."
} elseif ($Build) {
$Vcpkg = (Resolve-Path $Vcpkg).Path
# Find Visual Studio and establish build environment
Invoke-VSToolchain $VSToolChain $SourceDir -Arch "amd64"
Test-RequiredPrograms
if ($Snapshot) {
$Tag = "HEAD"
$SourceBranch = & git rev-parse --abbrev-ref HEAD
$ReleaseName = "$Version-snapshot"
$CMakeOptions = "$CMakeOptions -DKEEPASSXC_BUILD_TYPE=Snapshot -DOVERRIDE_VERSION=`"$ReleaseName`""
Write-Host "Using current branch '$SourceBranch' to build." -ForegroundColor Cyan
} else {
Test-WorkingTreeClean
# Clear output directory
if (Test-Path $OutDir) {
Remove-Item $OutDir -Recurse
}
if ($Version -match "-beta\\d+$") {
$CMakeOptions = "$CMakeOptions -DKEEPASSXC_BUILD_TYPE=PreRelease"
} else {
$CMakeOptions = "$CMakeOptions -DKEEPASSXC_BUILD_TYPE=Release"
}
# Setup Tag if not defined then checkout tag
if ($Tag -eq "" -or $Tag -eq $null) {
$Tag = $Version
}
Write-Host "Checking out tag 'tags/$Tag' to build." -ForegroundColor Cyan
Invoke-Cmd "git" "checkout `"tags/$Tag`""
}
# Create directories
New-Item "$OutDir" -ItemType Directory -Force | Out-Null
$OutDir = (Resolve-Path $OutDir).Path
$BuildDir = "$OutDir\build-release"
New-Item "$BuildDir" -ItemType Directory -Force | Out-Null
# Enter build directory
Set-Location "$BuildDir"
# Setup CMake options
$CMakeOptions = "$CMakeOptions -DWITH_XC_ALL=ON -DWITH_TESTS=OFF -DCMAKE_BUILD_TYPE=Release"
$CMakeOptions = "$CMakeOptions -DCMAKE_TOOLCHAIN_FILE:FILEPATH=`"$Vcpkg`" -DX_VCPKG_APPLOCAL_DEPS_INSTALL=ON"
Write-Host "Configuring build..." -ForegroundColor Cyan
Invoke-Cmd "cmake" "$CMakeOptions -G `"$CMakeGenerator`" `"$SourceDir`""
Write-Host "Compiling sources..." -ForegroundColor Cyan
Invoke-Cmd "cmake" "--build . --config Release -- $MakeOptions"
if ($SignBuild) {
$files = Get-ChildItem "$BuildDir\src" -Include "*keepassxc*.exe", "*keepassxc*.dll" -Recurse -File | ForEach-Object { $_.FullName }
Invoke-SignFiles $files $SignKey $Timestamp
}
Write-Host "Create deployment packages..." -ForegroundColor Cyan
Invoke-Cmd "cpack" "-G `"$CPackGenerators`""
Move-Item "$BuildDir\keepassxc-*" -Destination "$OutDir" -Force
if ($SignBuild) {
# Enter output directory
Set-Location -Path "$OutDir"
# Sign MSI files using AppSign key
$files = Get-ChildItem $OutDir -Include "*.msi" -Name
Invoke-SignFiles $files $SignKey $Timestamp
# Sign all output files using the GPG key then hash them
$files = Get-ChildItem $OutDir -Include "*.msi", "*.zip" -Name
Invoke-GpgSignFiles $files $GpgKey
}
# Restore state
Invoke-Command {git checkout $OrigBranch}
Set-Location "$OrigDir"
} elseif ($Sign) {
if (Test-Path $SignKey) {
# Need to include path to signtool program
Invoke-VSToolchain $VSToolChain $SourceDir -Arch "amd64"
}
Test-RequiredPrograms
# Resolve wildcard paths
$ResolvedFiles = @()
foreach ($_ in $SignFiles) {
$ResolvedFiles += (Get-ChildItem $_ -File | ForEach-Object { $_.FullName })
}
$AppSignFiles = $ResolvedFiles.Where({ $_ -match "\.(msi|exe|dll)$" })
Invoke-SignFiles $AppSignFiles $SignKey $Timestamp
$GpgSignFiles = $ResolvedFiles.Where({ $_ -match "\.(msi|zip|gz|xz|dmg|appimage)$" })
Invoke-GpgSignFiles $GpgSignFiles $GpgKey
}
# SIG # Begin signature block
# MIIThAYJKoZIhvcNAQcCoIITdTCCE3ECAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUyaXWK5K1LP2TD/IgGb5Tfs8v
# C2GgghC8MIIFOjCCBCKgAwIBAgIQWKLXLYzA/YnM/yHg1O3HSjANBgkqhkiG9w0B
# AQsFADB8MQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVy
# MRAwDgYDVQQHEwdTYWxmb3JkMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxJDAi
# BgNVBAMTG1NlY3RpZ28gUlNBIENvZGUgU2lnbmluZyBDQTAeFw0yMTAzMTUwMDAw
# MDBaFw0yNDAzMTQyMzU5NTlaMIGhMQswCQYDVQQGEwJVUzEOMAwGA1UEEQwFMjIz
# MTUxETAPBgNVBAgMCFZpcmdpbmlhMRIwEAYDVQQHDAlGcmFuY29uaWExGzAZBgNV
# BAkMEjY2NTMgQXVkcmV5IEtheSBDdDEeMBwGA1UECgwVRHJvaWRNb25rZXkgQXBw
# cywgTExDMR4wHAYDVQQDDBVEcm9pZE1vbmtleSBBcHBzLCBMTEMwggEiMA0GCSqG
# SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCwB9L/+1zlcXOQLoYvdrYAWS9B5ui+7E9c
# XCn6wcB4NdmaRbNM3kdWc8nbjOOHeOct2jVzVu/pJR1SagI+V1R1BfzgfzuW55Yy
# iHrqXQGfL9xhqJAWSvdQRinvlkZ+WY3QxnOhzcQk+BTLYdUwq04O3jMv7vnH6fuL
# q/HXEsgDObZC7EyKEtVbWVo4nqY0tUTviJXvRI/sFDN8DvULefwZWIvF7G11NFeK
# It24+hDCzvVBKtEn7DNmFGO1CJAB7Sz4jFewV4MP1gviMAfGbSBqavyRDBOG7eda
# SVb1Zq482yoHNAs+mpIQK2SGvUKKAJK2wCDbzgpvu5sfzwStpc0hAgMBAAGjggGQ
# MIIBjDAfBgNVHSMEGDAWgBQO4TqoUzox1Yq+wbutZxoDha00DjAdBgNVHQ4EFgQU
# 7u2WZ7fqJiaM3u9SlzAwGBhoWH0wDgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQC
# MAAwEwYDVR0lBAwwCgYIKwYBBQUHAwMwEQYJYIZIAYb4QgEBBAQDAgQQMEoGA1Ud
# IARDMEEwNQYMKwYBBAGyMQECAQMCMCUwIwYIKwYBBQUHAgEWF2h0dHBzOi8vc2Vj
# dGlnby5jb20vQ1BTMAgGBmeBDAEEATBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8v
# Y3JsLnNlY3RpZ28uY29tL1NlY3RpZ29SU0FDb2RlU2lnbmluZ0NBLmNybDBzBggr
# BgEFBQcBAQRnMGUwPgYIKwYBBQUHMAKGMmh0dHA6Ly9jcnQuc2VjdGlnby5jb20v
# U2VjdGlnb1JTQUNvZGVTaWduaW5nQ0EuY3J0MCMGCCsGAQUFBzABhhdodHRwOi8v
# b2NzcC5zZWN0aWdvLmNvbTANBgkqhkiG9w0BAQsFAAOCAQEAD2w/Tt5KyPbX2M+h
# WVwgqpKm42nk6aN2HvSp+KWlrB2t+ziL+1IRXwq7S0V7p2e1ZK8uXLzBjUDVGjBc
# ugh5hGG95MGVltxCJrr/bk1He62L7MwVxfH5b5MrE/vC/cHcSxEB1AZwZxYKjDPf
# R81biDVch++XeKmvUxfT4XGo7McJqT4K/TcLwijSb/AWsXR+r2BXEAqgsoG37kk/
# fbPKimpJ07hxd/RNYVpE33E93zCQ1Tjc1tP3DaLq8cpS6jGUY5NNOzRgp2mGcGHy
# lv6Q/xf45qNvHiqFVctdvY9of0QFjg5eYDr4rLDa+mks9f1Jd8aDWKcsfCBnlohT
# KIffbTCCBYEwggRpoAMCAQICEDlyRDr5IrdR19NsEN0xNZUwDQYJKoZIhvcNAQEM
# BQAwezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQ
# MA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAf
# BgNVBAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0xOTAzMTIwMDAwMDBa
# Fw0yODEyMzEyMzU5NTlaMIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMKTmV3IEpl
# cnNleTEUMBIGA1UEBxMLSmVyc2V5IENpdHkxHjAcBgNVBAoTFVRoZSBVU0VSVFJV
# U1QgTmV0d29yazEuMCwGA1UEAxMlVVNFUlRydXN0IFJTQSBDZXJ0aWZpY2F0aW9u
# IEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIASZRc2
# DsPbCLPQrFcNdu3NJ9NMrVCDYeKqIE0JLWQJ3M6Jn8w9qez2z8Hc8dOx1ns3KBEr
# R9o5xrw6GbRfpr19naNjQrZ28qk7K5H44m/Q7BYgkAk+4uh0yRi0kdRiZNt/owbx
# iBhqkCI8vP4T8IcUe/bkH47U5FHGEWdGCFHLhhRUP7wz/n5snP8WnRi9UY41pqdm
# yHJn2yFmsdSbeAPAUDrozPDcvJ5M/q8FljUfV1q3/875PbcstvZU3cjnEjpNrkyK
# t1yatLcgPcp/IjSufjtoZgFE5wFORlObM2D3lL5TN5BzQ/Myw1Pv26r+dE5px2uM
# YJPexMcM3+EyrsyTO1F4lWeL7j1W/gzQaQ8bD/MlJmszbfduR/pzQ+V+DqVmsSl8
# MoRjVYnEDcGTVDAZE6zTfTen6106bDVc20HXEtqpSQvf2ICKCZNijrVmzyWIzYS4
# sT+kOQ/ZAp7rEkyVfPNrBaleFoPMuGfi6BOdzFuC00yz7Vv/3uVzrCM7LQC/NVV0
# CUnYSVgaf5I25lGSDvMmfRxNF7zJ7EMm0L9BX0CpRET0medXh55QH1dUqD79dGMv
# sVBlCeZYQi5DGky08CVHWfoEHpPUJkZKUIGy3r54t/xnFeHJV4QeD2PW6WK61l9V
# LupcxigIBCU5uA4rqfJMlxwHPw1S9e3vL4IPAgMBAAGjgfIwge8wHwYDVR0jBBgw
# FoAUoBEKIz6W8Qfs4q8p74Klf9AwpLQwHQYDVR0OBBYEFFN5v1qqK0rPVIDh2JvA
# nfKyA2bLMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MBEGA1UdIAQK
# MAgwBgYEVR0gADBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3JsLmNvbW9kb2Nh
# LmNvbS9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDA0BggrBgEFBQcBAQQoMCYw
# JAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmNvbW9kb2NhLmNvbTANBgkqhkiG9w0B
# AQwFAAOCAQEAGIdR3HQhPZyK4Ce3M9AuzOzw5steEd4ib5t1jp5y/uTW/qofnJYt
# 7wNKfq70jW9yPEM7wD/ruN9cqqnGrvL82O6je0P2hjZ8FODN9Pc//t64tIrwkZb+
# /UNkfv3M0gGhfX34GRnJQisTv1iLuqSiZgR2iJFODIkUzqJNyTKzuugUGrxx8Vvw
# QQuYAAoiAxDlDLH5zZI3Ge078eQ6tvlFEyZ1r7uq7z97dzvSxAKRPRkA0xdcOds/
# exgNRc2ThZYvXd9ZFk8/Ub3VRRg/7UqO6AZhdCMWtQ1QcydER38QXYkqa4UxFMTo
# qWpMgLxqeM+4f452cpkMnf7XkQgWoaNflTCCBfUwggPdoAMCAQICEB2iSDBvmyYY
# 0ILgln0z02owDQYJKoZIhvcNAQEMBQAwgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQI
# EwpOZXcgSmVyc2V5MRQwEgYDVQQHEwtKZXJzZXkgQ2l0eTEeMBwGA1UEChMVVGhl
# IFVTRVJUUlVTVCBOZXR3b3JrMS4wLAYDVQQDEyVVU0VSVHJ1c3QgUlNBIENlcnRp
# ZmljYXRpb24gQXV0aG9yaXR5MB4XDTE4MTEwMjAwMDAwMFoXDTMwMTIzMTIzNTk1
# OVowfDELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQ
# MA4GA1UEBxMHU2FsZm9yZDEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMSQwIgYD
# VQQDExtTZWN0aWdvIFJTQSBDb2RlIFNpZ25pbmcgQ0EwggEiMA0GCSqGSIb3DQEB
# AQUAA4IBDwAwggEKAoIBAQCGIo0yhXoYn0nwli9jCB4t3HyfFM/jJrYlZilAhlRG
# dDFixRDtsocnppnLlTDAVvWkdcapDlBipVGREGrgS2Ku/fD4GKyn/+4uMyD6DBmJ
# qGx7rQDDYaHcaWVtH24nlteXUYam9CflfGqLlR5bYNV+1xaSnAAvaPeX7Wpyvjg7
# Y96Pv25MQV0SIAhZ6DnNj9LWzwa0VwW2TqE+V2sfmLzEYtYbC43HZhtKn52BxHJA
# teJf7wtF/6POF6YtVbC3sLxUap28jVZTxvC6eVBJLPcDuf4vZTXyIuosB69G2flG
# HNyMfHEo8/6nxhTdVZFuihEN3wYklX0Pp6F8OtqGNWHTAgMBAAGjggFkMIIBYDAf
# BgNVHSMEGDAWgBRTeb9aqitKz1SA4dibwJ3ysgNmyzAdBgNVHQ4EFgQUDuE6qFM6
# MdWKvsG7rWcaA4WtNA4wDgYDVR0PAQH/BAQDAgGGMBIGA1UdEwEB/wQIMAYBAf8C
# AQAwHQYDVR0lBBYwFAYIKwYBBQUHAwMGCCsGAQUFBwMIMBEGA1UdIAQKMAgwBgYE
# VR0gADBQBgNVHR8ESTBHMEWgQ6BBhj9odHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20v
# VVNFUlRydXN0UlNBQ2VydGlmaWNhdGlvbkF1dGhvcml0eS5jcmwwdgYIKwYBBQUH
# AQEEajBoMD8GCCsGAQUFBzAChjNodHRwOi8vY3J0LnVzZXJ0cnVzdC5jb20vVVNF
# UlRydXN0UlNBQWRkVHJ1c3RDQS5jcnQwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3Nw
# LnVzZXJ0cnVzdC5jb20wDQYJKoZIhvcNAQEMBQADggIBAE1jUO1HNEphpNveaiqM
# m/EAAB4dYns61zLC9rPgY7P7YQCImhttEAcET7646ol4IusPRuzzRl5ARokS9At3
# WpwqQTr81vTr5/cVlTPDoYMot94v5JT3hTODLUpASL+awk9KsY8k9LOBN9O3ZLCm
# I2pZaFJCX/8E6+F0ZXkI9amT3mtxQJmWunjxucjiwwgWsatjWsgVgG10Xkp1fqW4
# w2y1z99KeYdcx0BNYzX2MNPPtQoOCwR/oEuuu6Ol0IQAkz5TXTSlADVpbL6fICUQ
# DRn7UJBhvjmPeo5N9p8OHv4HURJmgyYZSJXOSsnBf/M6BZv5b9+If8AjntIeQ3pF
# McGcTanwWbJZGehqjSkEAnd8S0vNcL46slVaeD68u28DECV3FTSK+TbMQ5Lkuk/x
# YpMoJVcp+1EZx6ElQGqEV8aynbG8HArafGd+fS7pKEwYfsR7MUFxmksp7As9V1DS
# yt39ngVR5UR43QHesXWYDVQk/fBO4+L4g71yuss9Ou7wXheSaG3IYfmm8SoKC6W5
# 9J7umDIFhZ7r+YMp08Ysfb06dy6LN0KgaoLtO0qqlBCk4Q34F8W2WnkzGJLjtXX4
# oemOCiUe5B7xn1qHI/+fpFGe+zmAEc3btcSnqIBv5VPU4OOiwtJbGvoyJi1qV3Ac
# PKRYLqPzW0sH3DJZ84enGm1YMYICMjCCAi4CAQEwgZAwfDELMAkGA1UEBhMCR0Ix
# GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEY
# MBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMSQwIgYDVQQDExtTZWN0aWdvIFJTQSBD
# b2RlIFNpZ25pbmcgQ0ECEFii1y2MwP2JzP8h4NTtx0owCQYFKw4DAhoFAKB4MBgG
# CisGAQQBgjcCAQwxCjAIoAKAAKECgAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcC
# AQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwIwYJKoZIhvcNAQkEMRYE
# FPvoURlVLtMyc41aoH1W7jNXhNkUMA0GCSqGSIb3DQEBAQUABIIBACa4ISoVYuy4
# LQD5f2XzRDboWCOwR2ClFczB/vOn7uX+RKpbW+vZwllcL0wk0kA4Iotk12yKLAni
# K0DkhX8P/Gt5B4hMFaWYKkwTZljITgCEHoAy8vQzpfDUdfJF40R7IIEQLzr2/n5q
# Iztv/ApXsPX8SkgEGdikFbBA0i/xtzI8+3sI1QINiRig8xEH/1eOZlR54YHwClvS
# 8QhXueb9NbqNN9oKBwx5gRWcOE4I2E5mYAppDDQyhqitbeeY2Pw4Eo5koLM3zTDy
# 4/zc+A9lNkAa5eDTavxMHQVqKgO5KomzIYHAdIFnKs85SdntIOr5nSAHnAl6svTh
# iJXqSEggdX8=
# SIG # End signature block

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24"><path style="stroke-width:.65502" d="M7.275.645a2.949 2.949 0 0 0-1.404.298c-1.34.571-2.058 2.064-1.918 3.475-.085.269.215.925-.248.816-.77-.119-1.655.327-1.71 1.176-.016 2.092-.004 4.183-.009 6.276-.119.769.329 1.654 1.176 1.712 1.855.012 3.711.006 5.567.004v-1.308H3.297v-6.55h7.861v4.106h1.301c0-1.252.002-2.504.008-3.755.137-.804-.444-1.689-1.309-1.66h-.656c-.021-.693.062-1.395-.09-2.077C10.112 1.7 8.71.688 7.275.645zm-.048 1.314c.465-.001.929.17 1.28.475.869.681.665 1.836.686 2.8H5.32c-.139-.22-.017-.701-.058-1.02-.153-1.14.789-2.292 1.965-2.255zm.097 6.559c-.37-.04-.752.069-1.025.373-.834.75-.195 2.3.928 2.238.736.016 1.37-.659 1.308-1.393-.008-.676-.594-1.153-1.21-1.218z" transform="translate(-.218 .136) scale(1.04251)"/><path style="fill:#000;fill-opacity:1;fill-rule:evenodd;stroke-width:.857645" d="M11.773 18.34c-1.322.064-2.213-1.618-1.424-2.677.676-1.116 2.527-.937 2.994.27.513 1.094-.357 2.434-1.57 2.406zm5.146 2.572v-8.576H6.627v8.576h10.292zm0-10.292c1.038-.032 1.855.99 1.715 1.993-.01 2.84.019 5.68-.014 8.519-.096.979-1.095 1.626-2.034 1.495-3.378-.006-6.757.012-10.135-.009-1.032-.072-1.677-1.125-1.54-2.094.007-2.788-.01-5.577.01-8.365.068-1.003 1.084-1.67 2.038-1.539.432.09.635-.048.526-.498-.025-1.262-.04-2.616.77-3.67 1.263-1.913 4.126-2.424 5.971-1.064 1.326.884 1.959 2.516 1.835 4.071v1.161h.858zm-5.146-4.288c-1.49-.044-2.739 1.385-2.573 2.85v1.438h5.146c-.053-1.126.231-2.4-.575-3.336a2.578 2.578 0 0 0-1.998-.952z" transform="matrix(.99434 0 0 .99434 3.623 .679)"/></svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24"><path d="M12 17a2 2 0 0 1-2-2c0-1.11.89-2 2-2a2 2 0 0 1 2 2 2 2 0 0 1-2 2m6 3V10H6v10h12m0-12a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V10c0-1.11.89-2 2-2h1V6a5 5 0 0 1 5-5 5 5 0 0 1 5 5v2h1m-6-5a3 3 0 0 0-3 3v2h6V6a3 3 0 0 0-3-3z"/></svg> <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="mdi-lock-outline" width="24" height="24" viewBox="0 0 24 24"><path d="M12,17C10.89,17 10,16.1 10,15C10,13.89 10.89,13 12,13A2,2 0 0,1 14,15A2,2 0 0,1 12,17M18,20V10H6V20H18M18,8A2,2 0 0,1 20,10V20A2,2 0 0,1 18,22H6C4.89,22 4,21.1 4,20V10C4,8.89 4.89,8 6,8H7V6A5,5 0 0,1 12,1A5,5 0 0,1 17,6V8H18M12,3A3,3 0 0,0 9,6V8H15V6A3,3 0 0,0 12,3Z" /></svg>

Before

Width:  |  Height:  |  Size: 307 B

After

Width:  |  Height:  |  Size: 583 B

View File

@@ -1 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M12,3A9,9 0 0,0 3,12H0L4,16L8,12H5A7,7 0 0,1 12,5A7,7 0 0,1 19,12A7,7 0 0,1 12,19C10.5,19 9.09,18.5 7.94,17.7L6.5,19.14C8.04,20.3 9.94,21 12,21A9,9 0 0,0 21,12A9,9 0 0,0 12,3M14,12A2,2 0 0,0 12,10A2,2 0 0,0 10,12A2,2 0 0,0 12,14A2,2 0 0,0 14,12Z" /></svg>

Before

Width:  |  Height:  |  Size: 540 B

View File

@@ -1 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M17.81,4.47C17.73,4.47 17.65,4.45 17.58,4.41C15.66,3.42 14,3 12,3C10.03,3 8.15,3.47 6.44,4.41C6.2,4.54 5.9,4.45 5.76,4.21C5.63,3.97 5.72,3.66 5.96,3.53C7.82,2.5 9.86,2 12,2C14.14,2 16,2.47 18.04,3.5C18.29,3.65 18.38,3.95 18.25,4.19C18.16,4.37 18,4.47 17.81,4.47M3.5,9.72C3.4,9.72 3.3,9.69 3.21,9.63C3,9.47 2.93,9.16 3.09,8.93C4.08,7.53 5.34,6.43 6.84,5.66C10,4.04 14,4.03 17.15,5.65C18.65,6.42 19.91,7.5 20.9,8.9C21.06,9.12 21,9.44 20.78,9.6C20.55,9.76 20.24,9.71 20.08,9.5C19.18,8.22 18.04,7.23 16.69,6.54C13.82,5.07 10.15,5.07 7.29,6.55C5.93,7.25 4.79,8.25 3.89,9.5C3.81,9.65 3.66,9.72 3.5,9.72M9.75,21.79C9.62,21.79 9.5,21.74 9.4,21.64C8.53,20.77 8.06,20.21 7.39,19C6.7,17.77 6.34,16.27 6.34,14.66C6.34,11.69 8.88,9.27 12,9.27C15.12,9.27 17.66,11.69 17.66,14.66A0.5,0.5 0 0,1 17.16,15.16A0.5,0.5 0 0,1 16.66,14.66C16.66,12.24 14.57,10.27 12,10.27C9.43,10.27 7.34,12.24 7.34,14.66C7.34,16.1 7.66,17.43 8.27,18.5C8.91,19.66 9.35,20.15 10.12,20.93C10.31,21.13 10.31,21.44 10.12,21.64C10,21.74 9.88,21.79 9.75,21.79M16.92,19.94C15.73,19.94 14.68,19.64 13.82,19.05C12.33,18.04 11.44,16.4 11.44,14.66A0.5,0.5 0 0,1 11.94,14.16A0.5,0.5 0 0,1 12.44,14.66C12.44,16.07 13.16,17.4 14.38,18.22C15.09,18.7 15.92,18.93 16.92,18.93C17.16,18.93 17.56,18.9 17.96,18.83C18.23,18.78 18.5,18.96 18.54,19.24C18.59,19.5 18.41,19.77 18.13,19.82C17.56,19.93 17.06,19.94 16.92,19.94M14.91,22C14.87,22 14.82,22 14.78,22C13.19,21.54 12.15,20.95 11.06,19.88C9.66,18.5 8.89,16.64 8.89,14.66C8.89,13.04 10.27,11.72 11.97,11.72C13.67,11.72 15.05,13.04 15.05,14.66C15.05,15.73 16,16.6 17.13,16.6C18.28,16.6 19.21,15.73 19.21,14.66C19.21,10.89 15.96,7.83 11.96,7.83C9.12,7.83 6.5,9.41 5.35,11.86C4.96,12.67 4.76,13.62 4.76,14.66C4.76,15.44 4.83,16.67 5.43,18.27C5.53,18.53 5.4,18.82 5.14,18.91C4.88,19 4.59,18.87 4.5,18.62C4,17.31 3.77,16 3.77,14.66C3.77,13.46 4,12.37 4.45,11.42C5.78,8.63 8.73,6.82 11.96,6.82C16.5,6.82 20.21,10.33 20.21,14.65C20.21,16.27 18.83,17.59 17.13,17.59C15.43,17.59 14.05,16.27 14.05,14.65C14.05,13.58 13.12,12.71 11.97,12.71C10.82,12.71 9.89,13.58 9.89,14.65C9.89,16.36 10.55,17.96 11.76,19.16C12.71,20.1 13.62,20.62 15.03,21C15.3,21.08 15.45,21.36 15.38,21.62C15.33,21.85 15.12,22 14.91,22Z" /></svg>

Before

Width:  |  Height:  |  Size: 2.4 KiB

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24"><path d="M6 2.58c-1.11 0-2 .89-2 2v1.572l-1.951-.007a1.99 1.99 0 0 0-2 2v12c0 1.11.89 2 2 2h16a1.99 1.99 0 0 0 2-2l-.01-1.565H22c1.11 0 2-.89 2-2v-10c0-1.11-.89-2-2-2h-8l-2-2H6zm0 4h16v10H6v-10zm10 2v2h-2v2h2v2h2v-2h2v-2h-2v-2h-2zM2.049 10.145 4 10.158v6.422c0 1.11.89 2 2 2h12.053l-.004 1.565h-16v-10z"/></svg>

Before

Width:  |  Height:  |  Size: 374 B

View File

@@ -1 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M13.78 15.3L19.78 21.3L21.89 19.14L15.89 13.14L13.78 15.3M17.5 10.1C17.11 10.1 16.69 10.05 16.36 9.91L4.97 21.25L2.86 19.14L10.27 11.74L8.5 9.96L7.78 10.66L6.33 9.25V12.11L5.63 12.81L2.11 9.25L2.81 8.55H5.62L4.22 7.14L7.78 3.58C8.95 2.41 10.83 2.41 12 3.58L9.89 5.74L11.3 7.14L10.59 7.85L12.38 9.63L14.2 7.75C14.06 7.42 14 7 14 6.63C14 4.66 15.56 3.11 17.5 3.11C18.09 3.11 18.61 3.25 19.08 3.53L16.41 6.2L17.91 7.7L20.58 5.03C20.86 5.5 21 6 21 6.63C21 8.55 19.45 10.1 17.5 10.1Z" /></svg>

Before

Width:  |  Height:  |  Size: 773 B

View File

@@ -1 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M12,1A5,5 0 0,0 7,6V8H6A2,2 0 0,0 4,10V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V10A2,2 0 0,0 18,8H17V6A5,5 0 0,0 12,1M12,2.9C13.71,2.9 15.1,4.29 15.1,6V8H8.9V6C8.9,4.29 10.29,2.9 12,2.9M12.19,10.5C13.13,10.5 13.88,10.71 14.42,11.12C14.96,11.54 15.23,12.1 15.23,12.8C15.23,13.24 15.08,13.63 14.79,14C14.5,14.36 14.12,14.64 13.66,14.85C13.4,15 13.23,15.15 13.14,15.32C13.05,15.5 13,15.72 13,16H11C11,15.5 11.1,15.16 11.29,14.92C11.5,14.68 11.84,14.4 12.36,14.08C12.62,13.94 12.83,13.76 13,13.54C13.14,13.33 13.22,13.08 13.22,12.8C13.22,12.5 13.13,12.28 12.95,12.11C12.77,11.93 12.5,11.85 12.19,11.85C11.92,11.85 11.7,11.92 11.5,12.06C11.34,12.2 11.24,12.41 11.24,12.69H9.27C9.22,12 9.5,11.4 10.05,11.04C10.59,10.68 11.3,10.5 12.19,10.5M11,17H13V19H11V17Z" /></svg>

Before

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -1 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M22 13C22 13.53 21.79 14.04 21.41 14.41L21 14.83C20.91 11.97 18.84 9.62 16.11 9.11L11 4H4V11L9.11 16.11C9.62 18.84 11.97 20.91 14.83 21L14.41 21.41C14.04 21.79 13.53 22 13 22C12.47 22 11.97 21.79 11.59 21.42L2.59 12.42C2.21 12.04 2 11.53 2 11V4C2 2.9 2.9 2 4 2H11C11.53 2 12.04 2.21 12.41 2.58L21.41 11.58C21.79 11.96 22 12.47 22 13M5 6.5C5 7.33 5.67 8 6.5 8S8 7.33 8 6.5 7.33 5 6.5 5 5 5.67 5 6.5M15.11 10.61C12.61 10.61 10.61 12.61 10.61 15.11S12.61 19.61 15.11 19.61C16 19.61 16.8 19.36 17.5 18.93L20.61 22L22 20.61L18.92 17.5C19.36 16.82 19.61 16 19.61 15.11C19.61 12.61 17.61 10.61 15.11 10.61M15.11 12.61C16.5 12.61 17.61 13.73 17.61 15.11S16.5 17.61 15.11 17.61 12.61 16.5 12.61 15.11 13.73 12.61 15.11 12.61" /></svg>

Before

Width:  |  Height:  |  Size: 1010 B

View File

@@ -1 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M21.41 11.58L12.41 2.58A2 2 0 0 0 11 2H4A2 2 0 0 0 2 4V11A2 2 0 0 0 2.59 12.42L11.59 21.42A2 2 0 0 0 13 22A2 2 0 0 0 14.41 21.41L21.41 14.41A2 2 0 0 0 22 13A2 2 0 0 0 21.41 11.58M13 20L4 11V4H11L20 13M6.5 5A1.5 1.5 0 1 1 5 6.5A1.5 1.5 0 0 1 6.5 5Z" /></svg>

Before

Width:  |  Height:  |  Size: 542 B

View File

@@ -1 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M6,19A2,2 0 0,0 8,21H16A2,2 0 0,0 18,19V7H6V19M8,9H16V19H8V9M15.5,4L14.5,3H9.5L8.5,4H5V6H19V4H15.5Z" /></svg>

Before

Width:  |  Height:  |  Size: 394 B

View File

@@ -1 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M17.63,5.84C17.27,5.33 16.67,5 16,5H5A2,2 0 0,0 3,7V17A2,2 0 0,0 5,19H16C16.67,19 17.27,18.66 17.63,18.15L22,12L17.63,5.84Z" /></svg>

Before

Width:  |  Height:  |  Size: 418 B

View File

@@ -1 +1 @@
<svg viewBox="0 0 48 48" xmlns="http://www.w3.org/2000/svg" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2"><path d="M41 6H7c-.6 0-1 .4-1 1v35h36V7c0-.6-.4-1-1-1z" style="fill:#cfd8dc;fill-rule:nonzero"/><path style="fill:#263238" d="M8 13h32v27H8z"/><path d="M.046-.081v-.138l.343-.135-.343-.133v-.138l.492.213v.117l-.492.214z" style="fill:#76ff03;fill-rule:nonzero" transform="translate(12.703 31.235) scale(22.14058)"/><path style="fill:#76ff03;fill-rule:nonzero" d="M-.009.109h.57v.089h-.57z" transform="translate(25.632 31.235) scale(22.14058)"/><circle cx="13.5" cy="9.5" r="1.5" style="fill:#90a4ae"/><circle cx="9.5" cy="9.5" r="1.5" style="fill:#90a4ae"/><g><path d="m22 45-4-4V21h12v8l-2 2 2 2v2l-2 2 2 2v2l-4 4h-4z" style="fill:#ffa000;fill-rule:nonzero" transform="matrix(.43899 0 0 .59862 -2.036 19.721)"/><path d="M38 7.8c-.5-1.8-2-3.1-3.7-3.6C31.9 3.7 28.2 3 24 3c-4.2 0-7.9.7-10.3 1.2C12 4.7 10.5 6 10 7.8c-.5 1.7-1 4.1-1 6.7 0 2.6.5 5 1 6.7.5 1.8 1.9 3.1 3.7 3.5 2.4.6 6.1 1.3 10.3 1.3 4.2 0 7.9-.7 10.3-1.2 1.8-.4 3.2-1.8 3.7-3.5s1-4.1 1-6.7c0-2.7-.5-5.1-1-6.8zM29 13H19c-1.1 0-2-.9-2-2V9c0-.6 3.1-1 7-1s7 .4 7 1v2c0 1.1-.9 2-2 2z" style="fill:#ffa000;fill-rule:nonzero" transform="matrix(.43899 0 0 .59862 -2.036 19.721)"/><path style="fill:#d68600" d="M23.559 26h2v19h-2z" transform="translate(-6.481 19.721) scale(.59862)"/></g></svg> <svg viewBox="0 0 48 48" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2"><g><path d="M41 6H7c-.6.0-1 .4-1 1V42H42V7C42 6.4 41.6 6 41 6z" style="fill:#cfd8dc;fill-rule:nonzero"/></g><rect x="8" y="13" width="32" height="27" style="fill:#263238"/><g transform="matrix(1.00639,0,0,1.00639,12.7027,31.2351)"><g><text x="0" y="0" style="font-family:roboto-bold,roboto;font-weight:700;font-size:22px;fill:#76ff03">>_</text></g></g><g><circle cx="13.5" cy="9.5" r="1.5" style="fill:#90a4ae"/><circle cx="9.5" cy="9.5" r="1.5" style="fill:#90a4ae"/></g><g transform="matrix(1,0,0,1,1.02128,-0.291791)"><g id="polygon2" transform="matrix(0.438989,0,0,0.598621,-3.05709,20.013)"><path d="M22 45l-4-4V21H30v8l-2 2 2 2v2l-2 2 2 2v2l-4 4H22z" style="fill:#ffa000;fill-rule:nonzero"/></g><g id="path4" transform="matrix(0.438989,0,0,0.598621,-3.05709,20.013)"><path d="M38 7.8c-.5-1.8-2-3.1-3.7-3.6C31.9 3.7 28.2 3 24 3s-7.9.7-10.3 1.2C12 4.7 10.5 6 10 7.8c-.5 1.7-1 4.1-1 6.7s.5 5 1 6.7c.5 1.8 1.9 3.1 3.7 3.5C16.1 25.3 19.8 26 24 26S31.9 25.3 34.3 24.8C36.1 24.4 37.5 23 38 21.3s1-4.1 1-6.7c0-2.7-.5-5.1-1-6.8zM29 13H19c-1.1.0-2-.9-2-2V9c0-.6 3.1-1 7-1s7 .4 7 1v2C31 12.1 30.1 13 29 13z" style="fill:#ffa000;fill-rule:nonzero"/></g><g id="rect8" transform="matrix(0.598621,0,0,0.598621,-7.50244,20.013)"><rect x="23.559" y="26" width="2" height="19" style="fill:#d68600"/></g></g></svg>

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -1 +1 @@
<svg viewBox="0 0 48 48" xmlns="http://www.w3.org/2000/svg" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2"><path d="M41 6H7c-.6 0-1 .4-1 1v35h36V7c0-.6-.4-1-1-1z" style="fill:#cfd8dc;fill-rule:nonzero"/><path style="fill:#263238" d="M8 13h32v27H8z"/><path d="M.046-.081v-.138l.343-.135-.343-.133v-.138l.492.213v.117l-.492.214z" style="fill:#76ff03;fill-rule:nonzero" transform="translate(12.703 31.235) scale(22.14058)"/><path style="fill:#76ff03;fill-rule:nonzero" d="M-.009.109h.57v.089h-.57z" transform="translate(25.632 31.235) scale(22.14058)"/><g><circle cx="13.5" cy="9.5" r="1.5" style="fill:#90a4ae"/><circle cx="9.5" cy="9.5" r="1.5" style="fill:#90a4ae"/></g></svg> <svg viewBox="0 0 48 48" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2"><g><path d="M41 6H7c-.6.0-1 .4-1 1V42H42V7C42 6.4 41.6 6 41 6z" style="fill:#cfd8dc;fill-rule:nonzero"/></g><rect x="8" y="13" width="32" height="27" style="fill:#263238"/><g transform="matrix(1.00639,0,0,1.00639,12.7027,31.2351)"><g><text x="0" y="0" style="font-family:roboto-bold,roboto;font-weight:700;font-size:22px;fill:#76ff03">>_</text></g></g><g><circle cx="13.5" cy="9.5" r="1.5" style="fill:#90a4ae"/><circle cx="9.5" cy="9.5" r="1.5" style="fill:#90a4ae"/></g></svg>

Before

Width:  |  Height:  |  Size: 715 B

After

Width:  |  Height:  |  Size: 703 B

View File

@@ -15,7 +15,6 @@
<file>application/scalable/actions/configure.svg</file> <file>application/scalable/actions/configure.svg</file>
<file>application/scalable/actions/database-change-key.svg</file> <file>application/scalable/actions/database-change-key.svg</file>
<file>application/scalable/actions/database-lock.svg</file> <file>application/scalable/actions/database-lock.svg</file>
<file>application/scalable/actions/database-lock-all.svg</file>
<file>application/scalable/actions/database-merge.svg</file> <file>application/scalable/actions/database-merge.svg</file>
<file>application/scalable/actions/dialog-close.svg</file> <file>application/scalable/actions/dialog-close.svg</file>
<file>application/scalable/actions/dialog-ok.svg</file> <file>application/scalable/actions/dialog-ok.svg</file>
@@ -35,23 +34,18 @@
<file>application/scalable/actions/edit-clear-locationbar-rtl.svg</file> <file>application/scalable/actions/edit-clear-locationbar-rtl.svg</file>
<file>application/scalable/actions/entry-clone.svg</file> <file>application/scalable/actions/entry-clone.svg</file>
<file>application/scalable/actions/entry-delete.svg</file> <file>application/scalable/actions/entry-delete.svg</file>
<file>application/scalable/actions/entry-restore.svg</file>
<file>application/scalable/actions/entry-edit.svg</file> <file>application/scalable/actions/entry-edit.svg</file>
<file>application/scalable/actions/entry-new.svg</file> <file>application/scalable/actions/entry-new.svg</file>
<file>application/scalable/actions/favicon-download.svg</file> <file>application/scalable/actions/favicon-download.svg</file>
<file>application/scalable/actions/fingerprint.svg</file>
<file>application/scalable/actions/getting-started.svg</file> <file>application/scalable/actions/getting-started.svg</file>
<file>application/scalable/actions/group-delete.svg</file> <file>application/scalable/actions/group-delete.svg</file>
<file>application/scalable/actions/group-edit.svg</file> <file>application/scalable/actions/group-edit.svg</file>
<file>application/scalable/actions/group-clone.svg</file>
<file>application/scalable/actions/group-empty-trash.svg</file> <file>application/scalable/actions/group-empty-trash.svg</file>
<file>application/scalable/actions/group-new.svg</file> <file>application/scalable/actions/group-new.svg</file>
<file>application/scalable/actions/hammer-wrench.svg</file>
<file>application/scalable/actions/health.svg</file> <file>application/scalable/actions/health.svg</file>
<file>application/scalable/actions/help-about.svg</file> <file>application/scalable/actions/help-about.svg</file>
<file>application/scalable/actions/hibp.svg</file> <file>application/scalable/actions/hibp.svg</file>
<file>application/scalable/actions/key-enter.svg</file> <file>application/scalable/actions/key-enter.svg</file>
<file>application/scalable/actions/lock-question.svg</file>
<file>application/scalable/actions/keyboard-shortcuts.svg</file> <file>application/scalable/actions/keyboard-shortcuts.svg</file>
<file>application/scalable/actions/message-close.svg</file> <file>application/scalable/actions/message-close.svg</file>
<file>application/scalable/actions/move-down.svg</file> <file>application/scalable/actions/move-down.svg</file>
@@ -64,7 +58,7 @@
<file>application/scalable/actions/password-generator.svg</file> <file>application/scalable/actions/password-generator.svg</file>
<file>application/scalable/actions/password-show-off.svg</file> <file>application/scalable/actions/password-show-off.svg</file>
<file>application/scalable/actions/password-show-on.svg</file> <file>application/scalable/actions/password-show-on.svg</file>
<file>application/scalable/actions/refresh.svg</file> <file>application/scalable/actions/refresh.svg</file>
<file>application/scalable/actions/reports.svg</file> <file>application/scalable/actions/reports.svg</file>
<file>application/scalable/actions/reports-exclude.svg</file> <file>application/scalable/actions/reports-exclude.svg</file>
<file>application/scalable/actions/sort-alphabetical-ascending.svg</file> <file>application/scalable/actions/sort-alphabetical-ascending.svg</file>
@@ -73,14 +67,12 @@
<file>application/scalable/actions/system-help.svg</file> <file>application/scalable/actions/system-help.svg</file>
<file>application/scalable/actions/system-search.svg</file> <file>application/scalable/actions/system-search.svg</file>
<file>application/scalable/actions/system-software-update.svg</file> <file>application/scalable/actions/system-software-update.svg</file>
<file>application/scalable/actions/tag.svg</file>
<file>application/scalable/actions/tag-search.svg</file>
<file>application/scalable/actions/trash.svg</file>
<file>application/scalable/actions/url-copy.svg</file> <file>application/scalable/actions/url-copy.svg</file>
<file>application/scalable/actions/user-guide.svg</file> <file>application/scalable/actions/user-guide.svg</file>
<file>application/scalable/actions/username-copy.svg</file> <file>application/scalable/actions/username-copy.svg</file>
<file>application/scalable/actions/view-history.svg</file> <file>application/scalable/actions/view-history.svg</file>
<file>application/scalable/actions/web.svg</file> <file>application/scalable/actions/web.svg</file>
<file>application/scalable/apps/freedesktop.svg</file> <file>application/scalable/apps/freedesktop.svg</file>
<file>application/scalable/apps/internet-web-browser.svg</file> <file>application/scalable/apps/internet-web-browser.svg</file>
<file>application/scalable/apps/keepassxc.svg</file> <file>application/scalable/apps/keepassxc.svg</file>

View File

@@ -18,4 +18,4 @@ minify -o icons/database --match=.svg icons/database
# Crush PNG's # Crush PNG's
echo "Crushing PNG's..." echo "Crushing PNG's..."
find . -iname '*.png' -exec pngcrush -ow -brute {} \; find "." -iname '*png' -exec pngcrush -ow -brute {} \;

View File

@@ -50,42 +50,6 @@
</screenshots> </screenshots>
<releases> <releases>
<release version="2.6.6" date="2021-06-11">
<description>
<ul>
<li>Fix focusing search when pressing hotkey [#6603]</li>
<li>Trim whitespace from TOTP key input prior to processing [#6604]</li>
<li>Fix building on macOS [#6598]</li>
<li>Resolve compiler warnings for unused return values [#6607]</li>
</ul>
</description>
</release>
<release version="2.6.5" date="2021-06-07">
<description>
<ul>
<li>Show search bar when toolbar is hidden or in overflow [#6279]</li>
<li>Show countdown for clipboard clearing in status bar [#6333]</li>
<li>Command line option to lock all open databases [#6511]</li>
<li>Allow CSV import of bare TOTP secrets [#6211]</li>
<li>Retain file creation time when saving database [#6576]</li>
<li>Set permissions of saved attachments to be private to the current user [#6363]</li>
<li>OPVault: Use Text instead of Name for attribute names [#6334]</li>
<li>Reports: Allow resizing of reports columns [#6435]</li>
<li>Reports: Toggle showing expired entries [#6534]</li>
<li>Save Always on Top setting [#6236]</li>
<li>Password generator can exclude additional lookalike characters (6/G, 8/B) [#6196]</li>
<li>Allow setting MSI properties in unattended install [#6196]</li>
<li>Update MainWindow minimum size to enable smaller verticle space [#6196]</li>
<li>Use application font size when setting default or monospace fonts [#6332]</li>
<li>Fix notes not clearing in entry preview panel in some cases [#6481]</li>
<li>macOS: Correct window activation when restoring from tray [#6575]</li>
<li>macOS: Better handling of minimize after unlock when using browser integration [#6338]</li>
<li>Linux: Start after the system tray is available on LXQt [#6216]</li>
<li>Linux: Allow selection of modal dialogs on X11 in Auto-Type [#6204]</li>
<li>KeeShare: prevent crash when file extension is missing [#6174]</li>
</ul>
</description>
</release>
<release version="2.6.4" date="2021-01-31"> <release version="2.6.4" date="2021-01-31">
<description> <description>
<ul> <ul>

View File

@@ -23,7 +23,7 @@ GenericName[pl]=Menedżer haseł
GenericName[pt_BR]=Gerenciador de Senhas GenericName[pt_BR]=Gerenciador de Senhas
GenericName[pt]=Gestor de palavras-passe GenericName[pt]=Gestor de palavras-passe
GenericName[ro]=Manager de parole GenericName[ro]=Manager de parole
GenericName[ru]=Менеджер паролей GenericName[ru]=менеджер паролей
GenericName[sk]=Správca hesiel GenericName[sk]=Správca hesiel
GenericName[sv]=Lösenordshanterare GenericName[sv]=Lösenordshanterare
GenericName[th]=แอพจัดการรหัสผ่าน GenericName[th]=แอพจัดการรหัสผ่าน
@@ -34,7 +34,6 @@ GenericName[zh_TW]=密碼管理員
Comment=Community-driven port of the Windows application “KeePass Password Safe” Comment=Community-driven port of the Windows application “KeePass Password Safe”
Comment[da]=Fællesskabsdrevet port af Windows-programmet “KeePass Password Safe” Comment[da]=Fællesskabsdrevet port af Windows-programmet “KeePass Password Safe”
Comment[et]=Kogukonna arendatav port Windowsi programmist KeePass Password Safe Comment[et]=Kogukonna arendatav port Windowsi programmist KeePass Password Safe
Comment[ru]=Разработанный сообществом порт Windows-приложения KeePass Password Safe
Exec=keepassxc %f Exec=keepassxc %f
TryExec=keepassxc TryExec=keepassxc
Icon=keepassxc Icon=keepassxc

View File

@@ -15,14 +15,14 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
file(GLOB TRANSLATION_FILES *.ts) file(GLOB TRANSLATION_FILES *.ts)
get_filename_component(TRANSLATION_EN_ABS keepassxc_en.ts ABSOLUTE) get_filename_component(TRANSLATION_EN_ABS keepassx_en.ts ABSOLUTE)
list(REMOVE_ITEM TRANSLATION_FILES keepassxc_en.ts) list(REMOVE_ITEM TRANSLATION_FILES keepassx_en.ts)
list(REMOVE_ITEM TRANSLATION_FILES ${TRANSLATION_EN_ABS}) list(REMOVE_ITEM TRANSLATION_FILES ${TRANSLATION_EN_ABS})
message(STATUS "Including translations...\n") message(STATUS "Including translations...\n")
qt5_add_translation(QM_FILES ${TRANSLATION_FILES}) qt5_add_translation(QM_FILES ${TRANSLATION_FILES})
if(WIN32) if(MINGW)
file(GLOB QTBASE_TRANSLATIONS ${Qt5_PREFIX}/share/qt5/translations/qtbase_*.qm) file(GLOB QTBASE_TRANSLATIONS ${Qt5_PREFIX}/share/qt5/translations/qtbase_*.qm)
elseif(APPLE OR KEEPASSXC_DIST_APPIMAGE) elseif(APPLE OR KEEPASSXC_DIST_APPIMAGE)
file(GLOB QTBASE_TRANSLATIONS file(GLOB QTBASE_TRANSLATIONS
@@ -35,7 +35,7 @@ set(QM_FILES ${QM_FILES} ${QTBASE_TRANSLATIONS})
install(FILES ${QM_FILES} DESTINATION ${DATA_INSTALL_DIR}/translations) install(FILES ${QM_FILES} DESTINATION ${DATA_INSTALL_DIR}/translations)
# Add keepassx_en.qm as a fallback for uncommon english locales # Add keepassx_en.qm as a fallback for uncommon english locales
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/keepassxc_en_US.qm DESTINATION ${DATA_INSTALL_DIR}/translations RENAME keepassxc_en.qm) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/keepassx_en_US.qm DESTINATION ${DATA_INSTALL_DIR}/translations RENAME keepassx_en.qm)
add_custom_target(translations DEPENDS ${QM_FILES}) add_custom_target(translations DEPENDS ${QM_FILES})
add_dependencies(${PROGNAME} translations) add_dependencies(${PROGNAME} translations)

View File

@@ -3,78 +3,78 @@
<name>AboutDialog</name> <name>AboutDialog</name>
<message> <message>
<source>About KeePassXC</source> <source>About KeePassXC</source>
<translation>حَول KeePassXC</translation> <translation>حول KeePassXC</translation>
</message> </message>
<message> <message>
<source>About</source> <source>About</source>
<translation>حَول</translation> <translation>حول</translation>
</message> </message>
<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> <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>
<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> <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 موزع وفقًا لشروط رخصة غنو العمومية (GPL) إصدار 2 أو (حسب خيارك) إصدار 3.</translation>
</message> </message>
<message> <message>
<source>Contributors</source> <source>Contributors</source>
<translation>المُساهِمون</translation> <translation>المساهمون</translation>
</message> </message>
<message> <message>
<source>&lt;a href=&quot;https://github.com/keepassxreboot/keepassxc/graphs/contributors&quot;&gt;See Contributions on GitHub&lt;/a&gt;</source> <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;ألقِ نظرة على المُساهِمون في GitHub&lt;/a&gt;</translation> <translation>&lt;a href=&quot;https://github.com/keepassxreboot/keepassxc/graphs/contributors&quot;&gt;إستكشاف المساهمين عبر GitHub&lt;/a&gt;</translation>
</message> </message>
<message> <message>
<source>Debug Info</source> <source>Debug Info</source>
<translation>معلومات التصحيح</translation> <translation>معلومات تتبع الأخطاء</translation>
</message> </message>
<message> <message>
<source>Include the following information whenever you report a bug:</source> <source>Include the following information whenever you report a bug:</source>
<translation>ََضَمِّن المعلومات التالية عند الإبلاغ عن الأخطاء:</translation> <translation>قم بتضمين المعلومات التالية عند الإبلاغ عن علة:</translation>
</message> </message>
<message> <message>
<source>Copy to clipboard</source> <source>Copy to clipboard</source>
<translation>النسخ إلى الحافظة</translation> <translation>نسخ إلى الحافظة</translation>
</message> </message>
<message> <message>
<source>Project Maintainers:</source> <source>Project Maintainers:</source>
<translation>مُشرِّفو المَشروع:</translation> <translation>مشرفي المشروع:</translation>
</message> </message>
<message> <message>
<source>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</source> <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> </message>
</context> </context>
<context> <context>
<name>AgentSettingsWidget</name> <name>AgentSettingsWidget</name>
<message> <message>
<source>Use OpenSSH for Windows instead of Pageant</source> <source>Use OpenSSH for Windows instead of Pageant</source>
<translation>استخدام OpenSSH لنظام تشغيل Windows بدلاً من Pageant</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Enable SSH Agent integration</source> <source>Enable SSH Agent integration</source>
<translation>تفعِّيل تكامُل SSH Agent</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>SSH_AUTH_SOCK value</source> <source>SSH_AUTH_SOCK value</source>
<translation>خانة SSH_AUTH_SOCK</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>SSH_AUTH_SOCK override</source> <source>SSH_AUTH_SOCK override</source>
<translation>تجاوز SSH_AUTH_SOCK</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>(empty)</source> <source>(empty)</source>
<translation>(فارِغ)</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>No SSH Agent socket available. Either make sure SSH_AUTH_SOCK environment variable exists or set an override.</source> <source>No SSH Agent socket available. Either make sure SSH_AUTH_SOCK environment variable exists or set an override.</source>
<translation>لا يُوجد مِقبَس SSH Agent مُتاح. تأكد مِن وجود مُتغير SSH_AUTH_SOCK في البيئة أو عيّن تجاوز له.</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>SSH Agent connection is working!</source> <source>SSH Agent connection is working!</source>
<translation>اتِّصال SSH Agent يعمل!</translation> <translation type="unfinished"/>
</message> </message>
</context> </context>
<context> <context>
@@ -85,7 +85,7 @@
</message> </message>
<message> <message>
<source>General</source> <source>General</source>
<translation>عام</translation> <translation>العام</translation>
</message> </message>
<message> <message>
<source>Security</source> <source>Security</source>
@@ -93,7 +93,7 @@
</message> </message>
<message> <message>
<source>Access error for config file %1</source> <source>Access error for config file %1</source>
<translation>خطأ في الوصول إلى ملف الإعداد %1</translation> <translation>خطأ في الوصول لملف التكوين %1</translation>
</message> </message>
<message> <message>
<source>Icon only</source> <source>Icon only</source>
@@ -101,15 +101,15 @@
</message> </message>
<message> <message>
<source>Text only</source> <source>Text only</source>
<translation>النص فقط</translation> <translation>الوصف بالكلمات فقط </translation>
</message> </message>
<message> <message>
<source>Text beside icon</source> <source>Text beside icon</source>
<translation>نص بجانب الأيقونة</translation> <translation>وصف حرفي بجانب الأيقونة</translation>
</message> </message>
<message> <message>
<source>Text under icon</source> <source>Text under icon</source>
<translation>النص أسفل الأيقونة</translation> <translation>الوصف أسفل الأيقونة</translation>
</message> </message>
<message> <message>
<source>Follow style</source> <source>Follow style</source>
@@ -117,30 +117,26 @@
</message> </message>
<message> <message>
<source>Reset Settings?</source> <source>Reset Settings?</source>
<translation>إعادة تعيّين الإعدادات؟</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Are you sure you want to reset all general and security settings to default?</source> <source>Are you sure you want to reset all general and security settings to default?</source>
<translation>هل أنت متأكد من رغبتك في إعادة تعيّين كافة الإعدادات العامة وإعدادات الأمن إلى وضعها الافتراضي؟</translation> <translation>هل أنت متأكد من رغبتك في إعادة جميع الإعدادات العامة وإعدادات الأمن الى وضعها النمطي الأولي ؟</translation>
</message> </message>
<message> <message>
<source>Monochrome (light)</source> <source>Monochrome (light)</source>
<translation>أُحادي اللون (فاتح)</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Monochrome (dark)</source> <source>Monochrome (dark)</source>
<translation>أُُحادي اللون (داكِن)</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Colorful</source> <source>Colorful</source>
<translation>مُلون</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>You must restart the application to set the new language. Would you like to restart now?</source> <source>You must restart the application to set the new language. Would you like to restart now?</source>
<translation>يجب إعادة تشغيل التطبيق لتعيين اللغة الجديدة. هل تريد إعادة التشغيل الآن ؟</translation>
</message>
<message>
<source>Monochrome</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
</context> </context>
@@ -233,7 +229,7 @@
</message> </message>
<message> <message>
<source>Remember database key files and security dongles</source> <source>Remember database key files and security dongles</source>
<translation>تذكر ملفات مفاتيح قاعدة البيانات وأجهزة الوصول الآمن</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Check for updates at application startup once per week</source> <source>Check for updates at application startup once per week</source>
@@ -241,7 +237,7 @@
</message> </message>
<message> <message>
<source>Include beta releases when checking for updates</source> <source>Include beta releases when checking for updates</source>
<translation>ضمّن النسخ التجريبية عند البحث عن التحديثات</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Language:</source> <source>Language:</source>
@@ -307,19 +303,19 @@
</message> </message>
<message> <message>
<source>Automatically launch KeePassXC at system startup</source> <source>Automatically launch KeePassXC at system startup</source>
<translation>قم بتشغيل KeePassXC تلقائيًا عند بدء تشغيل النظام</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Safely save database files (disable if experiencing problems with Dropbox, etc.)</source> <source>Safely save database files (disable if experiencing problems with Dropbox, etc.)</source>
<translation>احفظ ملفات قاعدة البيانات بأمان (قم بتعطيلها إذا كنت تواجه مشكلات مع Dropbox ، وما إلى ذلك)</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>User Interface</source> <source>User Interface</source>
<translation>واجهة المستخدم</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Toolbar button style:</source> <source>Toolbar button style:</source>
<translation>نمط أزرار شريط الأدوات</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Use monospaced font for notes</source> <source>Use monospaced font for notes</source>
@@ -444,11 +440,11 @@
</message> </message>
<message> <message>
<source>Require password repeat when it is visible</source> <source>Require password repeat when it is visible</source>
<translation>يلزم تكرار كلمة المرور عندما تكون مرئية</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Hide passwords when editing them</source> <source>Hide passwords when editing them</source>
<translation>إخفاء كلمات المرور عند تعديلها</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Use placeholder for empty password fields</source> <source>Use placeholder for empty password fields</source>
@@ -582,7 +578,7 @@
</message> </message>
<message> <message>
<source>Remember</source> <source>Remember</source>
<translation>تذكر</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Allow access to entries</source> <source>Allow access to entries</source>
@@ -590,11 +586,11 @@
</message> </message>
<message> <message>
<source>Allow Selected</source> <source>Allow Selected</source>
<translation>السماح بالمُحدد</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Deny All</source> <source>Deny All</source>
<translation>منع الكل</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Disable for this site</source> <source>Disable for this site</source>
@@ -889,7 +885,7 @@ chrome-laptop.</source>
</message> </message>
<message> <message>
<source>Browser type:</source> <source>Browser type:</source>
<translation>نوع المتصفح:</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Toolbar button style</source> <source>Toolbar button style</source>
@@ -1239,7 +1235,7 @@ Backup database located at %2</source>
</message> </message>
<message> <message>
<source>Enter Password:</source> <source>Enter Password:</source>
<translation>أدخل كلمة المرور:</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Password field</source> <source>Password field</source>
@@ -1303,7 +1299,7 @@ To prevent this error from appearing, you must go to &quot;Database Settings / S
</message> </message>
<message> <message>
<source>?</source> <source>?</source>
<translation>؟</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Cannot use database file as key file</source> <source>Cannot use database file as key file</source>
@@ -1793,7 +1789,7 @@ If you keep this number, your database may be too easy to crack!</source>
</message> </message>
<message> <message>
<source>Delete Recycle Bin</source> <source>Delete Recycle Bin</source>
<translation>حذف سلة المحذوفات</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Do you want to delete the current recycle bin and all its contents? <source>Do you want to delete the current recycle bin and all its contents?
@@ -1833,7 +1829,7 @@ This action is not reversible.</source>
</message> </message>
<message> <message>
<source>Certificates</source> <source>Certificates</source>
<translation>الشهادات</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source> &gt; </source> <source> &gt; </source>
@@ -2474,14 +2470,6 @@ Unfortunately, any changes made have been lost.</source>
<source>Use this entry only with HTTP Basic Auth</source> <source>Use this entry only with HTTP Basic Auth</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Do not send this setting to the browser for HTTP Auth dialogs. If enabled, HTTP Auth dialogs will not show this entry for selection.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Do not use this entry with HTTP Basic Auth</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>EditEntryWidgetHistory</name> <name>EditEntryWidgetHistory</name>
@@ -2744,7 +2732,7 @@ Unfortunately, any changes made have been lost.</source>
<name>EditGroupWidgetKeeShare</name> <name>EditGroupWidgetKeeShare</name>
<message> <message>
<source>Type:</source> <source>Type:</source>
<translation>النوع:</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Path:</source> <source>Path:</source>
@@ -2756,7 +2744,7 @@ Unfortunately, any changes made have been lost.</source>
</message> </message>
<message> <message>
<source>Inactive</source> <source>Inactive</source>
<translation>غير فعال</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>KeeShare unsigned container</source> <source>KeeShare unsigned container</source>
@@ -4331,14 +4319,26 @@ Message: %2</source>
<source>Select a key file</source> <source>Select a key file</source>
<translation>حدد ملف المفتاح</translation> <translation>حدد ملف المفتاح</translation>
</message> </message>
<message>
<source>Key file selection</source>
<translation type="unfinished"/>
</message>
<message> <message>
<source>Browse for key file</source> <source>Browse for key file</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Browse...</source>
<translation>إستعراض...</translation>
</message>
<message> <message>
<source>Generate a new key file</source> <source>Generate a new key file</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </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> <message>
<source>Invalid Key File</source> <source>Invalid Key File</source>
<translation type="unfinished"/> <translation type="unfinished"/>
@@ -4364,18 +4364,6 @@ Are you sure you want to continue with this file?</source>
<source>You selected a key file in an old format which KeePassXC&lt;br&gt;may stop supporting in the future.&lt;br&gt;&lt;br&gt;Please consider generating a new key file instead.</source> <source>You selected a key file in an old format which KeePassXC&lt;br&gt;may stop supporting in the future.&lt;br&gt;&lt;br&gt;Please consider generating a new key file instead.</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Generate a new key file or choose an existing one to protect your database.</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>Browse</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
@@ -5334,7 +5322,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message> </message>
<message> <message>
<source>Switch to advanced mode</source> <source>Switch to advanced mode</source>
<translation>انتقل الى النمط المتقدم</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Advanced</source> <source>Advanced</source>
@@ -5372,6 +5360,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Hex</source> <source>Hex</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </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"/>
</message>
<message> <message>
<source>Generated password</source> <source>Generated password</source>
<translation type="unfinished"/> <translation type="unfinished"/>
@@ -5418,7 +5410,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message> </message>
<message> <message>
<source>Copy password</source> <source>Copy password</source>
<translation>انسخ كلمة المرور</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>lower case</source> <source>lower case</source>
@@ -5472,10 +5464,6 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Special Characters</source> <source>Special Characters</source>
<translation>محارف خاصة</translation> <translation>محارف خاصة</translation>
</message> </message>
<message>
<source>Excluded characters: &quot;0&quot;, &quot;O&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;|&quot;, &quot;G&quot;, &quot;6&quot;, &quot;B&quot;, &quot;8&quot;, &quot;&quot;</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>QApplication</name> <name>QApplication</name>
@@ -6094,7 +6082,7 @@ Available commands:
</message> </message>
<message> <message>
<source>file empty</source> <source>file empty</source>
<translation>ملف فارغ</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>%1: (row, col) %2,%3</source> <source>%1: (row, col) %2,%3</source>
@@ -6116,7 +6104,7 @@ Available commands:
<message> <message>
<source>Invalid Key</source> <source>Invalid Key</source>
<comment>TOTP</comment> <comment>TOTP</comment>
<translation>المفتاح غير صالح</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Message encryption failed.</source> <source>Message encryption failed.</source>
@@ -6620,11 +6608,11 @@ Kernel: %3 %4</source>
</message> </message>
<message> <message>
<source>Name: </source> <source>Name: </source>
<translation>الاسم:</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Description: </source> <source>Description: </source>
<translation>الوصف:</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Cipher: </source> <source>Cipher: </source>
@@ -6744,22 +6732,6 @@ Please consider generating a new key file.</source>
<source>Unexpected key file data! Key file may be corrupt.</source> <source>Unexpected key file data! Key file may be corrupt.</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message numerus="yes">
<source>Clearing the clipboard in %1 second(s)</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<source>lock all open databases</source>
<translation type="unfinished"/>
</message>
<message>
<source>Locked databases.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Database failed to lock.</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>QtIOCompressor</name> <name>QtIOCompressor</name>
@@ -6808,7 +6780,7 @@ Please consider generating a new key file.</source>
<message> <message>
<source>Bad</source> <source>Bad</source>
<comment>Password quality</comment> <comment>Password quality</comment>
<translation>سيئ</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Bad password must be changed</source> <source>Bad password must be changed</source>
@@ -6830,7 +6802,7 @@ Please consider generating a new key file.</source>
</message> </message>
<message> <message>
<source>Weak consider changing the password</source> <source>Weak consider changing the password</source>
<translation>ضعيف فكر بتغير كلمة المرور</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source> (Excluded)</source> <source> (Excluded)</source>
@@ -6858,11 +6830,11 @@ Please consider generating a new key file.</source>
</message> </message>
<message> <message>
<source>Score</source> <source>Score</source>
<translation>النتيجة</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Reason</source> <source>Reason</source>
<translation>السبب</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Edit Entry...</source> <source>Edit Entry...</source>
@@ -7462,6 +7434,10 @@ Please consider generating a new key file.</source>
<source>Could not write export container</source> <source>Could not write export container</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Unexpected export error occurred</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>ShareImport</name> <name>ShareImport</name>
@@ -7529,6 +7505,10 @@ Please consider generating a new key file.</source>
<source>File does not exist</source> <source>File does not exist</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Unknown share container type</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>ShareObserver</name> <name>ShareObserver</name>

View File

@@ -139,10 +139,6 @@
<source>You must restart the application to set the new language. Would you like to restart now?</source> <source>You must restart the application to set the new language. Would you like to restart now?</source>
<translation>Трябва да рестартирате приложението, за да настроите нов език. Желаете ли да рестартирате сега?</translation> <translation>Трябва да рестартирате приложението, за да настроите нов език. Желаете ли да рестартирате сега?</translation>
</message> </message>
<message>
<source>Monochrome</source>
<translation>Едноцветен</translation>
</message>
</context> </context>
<context> <context>
<name>ApplicationSettingsWidgetGeneral</name> <name>ApplicationSettingsWidgetGeneral</name>
@@ -2499,14 +2495,6 @@ Unfortunately, any changes made have been lost.</source>
<source>Use this entry only with HTTP Basic Auth</source> <source>Use this entry only with HTTP Basic Auth</source>
<translation>Използвай този запис само с HTTP Basic Auth</translation> <translation>Използвай този запис само с HTTP Basic Auth</translation>
</message> </message>
<message>
<source>Do not send this setting to the browser for HTTP Auth dialogs. If enabled, HTTP Auth dialogs will not show this entry for selection.</source>
<translation>Не изпращай тази настройка към браузъра за HTTP Auth прозорци. При активиране, HTTP Auth прозорците няма да покажат този запис за избор.</translation>
</message>
<message>
<source>Do not use this entry with HTTP Basic Auth</source>
<translation>Не използвай този запис с HTTP Basic Auth</translation>
</message>
</context> </context>
<context> <context>
<name>EditEntryWidgetHistory</name> <name>EditEntryWidgetHistory</name>
@@ -4370,14 +4358,26 @@ Message: %2</source>
<source>Select a key file</source> <source>Select a key file</source>
<translation>Избор на файл-ключ</translation> <translation>Избор на файл-ключ</translation>
</message> </message>
<message>
<source>Key file selection</source>
<translation>Избор на файл-ключ</translation>
</message>
<message> <message>
<source>Browse for key file</source> <source>Browse for key file</source>
<translation>Избор на файл-ключ</translation> <translation>Избор на файл-ключ</translation>
</message> </message>
<message>
<source>Browse...</source>
<translation>Преглед...</translation>
</message>
<message> <message>
<source>Generate a new key file</source> <source>Generate a new key file</source>
<translation>Генериране на нов файл-ключ</translation> <translation>Генериране на нов файл-ключ</translation>
</message> </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> <message>
<source>Invalid Key File</source> <source>Invalid Key File</source>
<translation>Невалиден файл-ключ</translation> <translation>Невалиден файл-ключ</translation>
@@ -4406,18 +4406,6 @@ Are you sure you want to continue with this file?</source>
Помислете за генериране на нов ключ файл.</translation> Помислете за генериране на нов ключ файл.</translation>
</message> </message>
<message>
<source>Generate a new key file or choose an existing one to protect your database.</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>Browse</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
@@ -5417,6 +5405,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Hex</source> <source>Hex</source>
<translation>Шестнадесетичен</translation> <translation>Шестнадесетичен</translation>
</message> </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>Изключени знаци: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;&quot;</translation>
</message>
<message> <message>
<source>Generated password</source> <source>Generated password</source>
<translation>Генерирана парола</translation> <translation>Генерирана парола</translation>
@@ -5517,10 +5509,6 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Special Characters</source> <source>Special Characters</source>
<translation>Специални знаци</translation> <translation>Специални знаци</translation>
</message> </message>
<message>
<source>Excluded characters: &quot;0&quot;, &quot;O&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;|&quot;, &quot;G&quot;, &quot;6&quot;, &quot;B&quot;, &quot;8&quot;, &quot;&quot;</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>QApplication</name> <name>QApplication</name>
@@ -6788,22 +6776,6 @@ Please consider generating a new key file.</source>
<source>Unexpected key file data! Key file may be corrupt.</source> <source>Unexpected key file data! Key file may be corrupt.</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message numerus="yes">
<source>Clearing the clipboard in %1 second(s)</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<source>lock all open databases</source>
<translation type="unfinished"/>
</message>
<message>
<source>Locked databases.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Database failed to lock.</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>QtIOCompressor</name> <name>QtIOCompressor</name>
@@ -7506,6 +7478,10 @@ Please consider generating a new key file.</source>
<source>Could not write export container</source> <source>Could not write export container</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Unexpected export error occurred</source>
<translation>Възникна неочаквана грешка при експортиране</translation>
</message>
</context> </context>
<context> <context>
<name>ShareImport</name> <name>ShareImport</name>
@@ -7573,6 +7549,10 @@ Please consider generating a new key file.</source>
<source>File does not exist</source> <source>File does not exist</source>
<translation>Файлът не съществува</translation> <translation>Файлът не съществува</translation>
</message> </message>
<message>
<source>Unknown share container type</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>ShareObserver</name> <name>ShareObserver</name>

View File

@@ -139,10 +139,6 @@
<source>You must restart the application to set the new language. Would you like to restart now?</source> <source>You must restart the application to set the new language. Would you like to restart now?</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Monochrome</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>ApplicationSettingsWidgetGeneral</name> <name>ApplicationSettingsWidgetGeneral</name>
@@ -322,7 +318,7 @@
</message> </message>
<message> <message>
<source>Use monospaced font for notes</source> <source>Use monospaced font for notes</source>
<translation>Usa lletra monoespaiada per a les notes</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Tray icon type:</source> <source>Tray icon type:</source>
@@ -334,27 +330,27 @@
</message> </message>
<message> <message>
<source>Auto-Type typing delay:</source> <source>Auto-Type typing delay:</source>
<translation>Retard d&apos;escriptura de la compleció automàtica:</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Global Auto-Type shortcut:</source> <source>Global Auto-Type shortcut:</source>
<translation>Drecera global de compleció automàtica:</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Auto-Type start delay:</source> <source>Auto-Type start delay:</source>
<translation>Retard d&apos;inici de la compleció automàtica:</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Automatically save when locking database</source> <source>Automatically save when locking database</source>
<translation>Desa automàticament en bloquejar la base de dades</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Automatically save non-data changes when locking database</source> <source>Automatically save non-data changes when locking database</source>
<translation>Desa automàticament els canvis que no són de dades en bloquejar la base de dades</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Tray icon type</source> <source>Tray icon type</source>
<translation>Tipus d&apos;icona de la safata</translation> <translation type="unfinished"/>
</message> </message>
</context> </context>
<context> <context>
@@ -443,15 +439,15 @@
</message> </message>
<message> <message>
<source>Require password repeat when it is visible</source> <source>Require password repeat when it is visible</source>
<translation>Demana altre cop la contrasenya quan és visible</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Hide passwords when editing them</source> <source>Hide passwords when editing them</source>
<translation>Oculta les contrasenyes a l&apos;editar-les</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Use placeholder for empty password fields</source> <source>Use placeholder for empty password fields</source>
<translation>Usa un marcador per als camps de contrasenya buits</translation> <translation type="unfinished"/>
</message> </message>
</context> </context>
<context> <context>
@@ -588,15 +584,15 @@
</message> </message>
<message> <message>
<source>Allow Selected</source> <source>Allow Selected</source>
<translation>Permet els seleccionats</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Deny All</source> <source>Deny All</source>
<translation>Denega-ho tot</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Disable for this site</source> <source>Disable for this site</source>
<translation>Deshabilita per aquest lloc</translation> <translation type="unfinished"/>
</message> </message>
</context> </context>
<context> <context>
@@ -667,7 +663,7 @@ Moved %2 keys to custom data.</source>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<source>Successfully moved %n keys to custom data.</source> <source>Successfully moved %n keys to custom data.</source>
<translation><numerusform>Les claus %n s&apos;han desplaçat correctament a dades personalitzades.</numerusform><numerusform>S&apos;han mogut correctament %n claus a dades personalitzades.</numerusform></translation> <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message> </message>
<message> <message>
<source>KeePassXC: No entry with KeePassHTTP attributes found!</source> <source>KeePassXC: No entry with KeePassHTTP attributes found!</source>
@@ -767,11 +763,11 @@ chrome-laptop.</source>
<message> <message>
<source>Show a notification when credentials are requested</source> <source>Show a notification when credentials are requested</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment> <extracomment>Credentials mean login data requested via browser extension</extracomment>
<translation>Mostra una notificació quan es sol·licitin les credencials</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Request to unlock the database if it is locked</source> <source>Request to unlock the database if it is locked</source>
<translation>Sol·licita desbloquejar la base de dades si està bloquejada</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Only entries with the same scheme (http://, https://, ...) are returned.</source> <source>Only entries with the same scheme (http://, https://, ...) are returned.</source>
@@ -1189,11 +1185,11 @@ Còpia de seguretat de la base de dades situada a %2</translation>
</message> </message>
<message> <message>
<source>Database save is already in progress.</source> <source>Database save is already in progress.</source>
<translation>El desat de la base de dades està en curs.</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Could not save, database has not been initialized!</source> <source>Could not save, database has not been initialized!</source>
<translation>No s&apos;ha pogut desar, la base de dades no ha estat inicialitzada!</translation> <translation type="unfinished"/>
</message> </message>
</context> </context>
<context> <context>
@@ -1393,7 +1389,7 @@ If you do not have a key file, please leave the field empty.</source>
</message> </message>
<message> <message>
<source>Remove</source> <source>Remove</source>
<translation>Suprimeix</translation> <translation>Suprimiu</translation>
</message> </message>
<message> <message>
<source>Delete the selected key?</source> <source>Delete the selected key?</source>
@@ -1715,7 +1711,7 @@ If you keep this number, your database may be too easy to crack!</source>
</message> </message>
<message> <message>
<source>Don&apos;t expose this database</source> <source>Don&apos;t expose this database</source>
<translation>No exposis aquesta base de dades</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Expose entries under this group:</source> <source>Expose entries under this group:</source>
@@ -1786,11 +1782,11 @@ If you keep this number, your database may be too easy to crack!</source>
</message> </message>
<message> <message>
<source>Maximum size of history per entry</source> <source>Maximum size of history per entry</source>
<translation>Maximitzar el tamany de l&apos;històric per entrada</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Delete Recycle Bin</source> <source>Delete Recycle Bin</source>
<translation>Netejar paperera</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Do you want to delete the current recycle bin and all its contents? <source>Do you want to delete the current recycle bin and all its contents?
@@ -2114,7 +2110,7 @@ Voleu deshabilitar el desat segur i provar-ho un altre cop?</translation>
</message> </message>
<message> <message>
<source>Do you really want to move the group &quot;%1&quot; to the recycle bin?</source> <source>Do you really want to move the group &quot;%1&quot; to the recycle bin?</source>
<translation>Esteu segur que voleu moure el grup &quot;%1&quot; a la paperera de reciclatge?</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Successfully merged the database files.</source> <source>Successfully merged the database files.</source>
@@ -2134,7 +2130,7 @@ Voleu deshabilitar el desat segur i provar-ho un altre cop?</translation>
</message> </message>
<message> <message>
<source>This database is opened in read-only mode. Autosave is disabled.</source> <source>This database is opened in read-only mode. Autosave is disabled.</source>
<translation>Aquesta base de dades s&apos;ha obert en mode de només lectura. El desat automàtic està deshabilitat.</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Save database backup</source> <source>Save database backup</source>
@@ -2245,7 +2241,7 @@ Voleu deshabilitar el desat segur i provar-ho un altre cop?</translation>
</message> </message>
<message> <message>
<source>Are you sure you want to remove this URL?</source> <source>Are you sure you want to remove this URL?</source>
<translation>Esteu segur que voleu suprimir aquesta URL?</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Reveal</source> <source>Reveal</source>
@@ -2329,7 +2325,7 @@ Unfortunately, any changes made have been lost.</source>
</message> </message>
<message> <message>
<source>Remove selected attribute</source> <source>Remove selected attribute</source>
<translation>Suprimeix l&apos;atribut seleccionat</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Edit attribute name</source> <source>Edit attribute name</source>
@@ -2404,7 +2400,7 @@ Unfortunately, any changes made have been lost.</source>
</message> </message>
<message> <message>
<source>Remove selected window association</source> <source>Remove selected window association</source>
<translation>Suprimeix l&apos;associació de finestres seleccionada</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>You can use an asterisk (*) to match everything</source> <source>You can use an asterisk (*) to match everything</source>
@@ -2473,14 +2469,6 @@ Unfortunately, any changes made have been lost.</source>
<source>Use this entry only with HTTP Basic Auth</source> <source>Use this entry only with HTTP Basic Auth</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Do not send this setting to the browser for HTTP Auth dialogs. If enabled, HTTP Auth dialogs will not show this entry for selection.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Do not use this entry with HTTP Basic Auth</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>EditEntryWidgetHistory</name> <name>EditEntryWidgetHistory</name>
@@ -2601,7 +2589,7 @@ Unfortunately, any changes made have been lost.</source>
</message> </message>
<message> <message>
<source>Expires:</source> <source>Expires:</source>
<translation>Caduca:</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Edit Entry</source> <source>Edit Entry</source>
@@ -2616,7 +2604,7 @@ Unfortunately, any changes made have been lost.</source>
</message> </message>
<message> <message>
<source>Remove key from agent after</source> <source>Remove key from agent after</source>
<translation>Suprimeix la clau de l&apos;agent després</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source> seconds</source> <source> seconds</source>
@@ -2685,7 +2673,7 @@ Unfortunately, any changes made have been lost.</source>
</message> </message>
<message> <message>
<source>Remove key from agent after specified seconds</source> <source>Remove key from agent after specified seconds</source>
<translation>Suprimeix la clau de l&apos;agent després dels segons especificats</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Browser for key file</source> <source>Browser for key file</source>
@@ -2880,7 +2868,7 @@ Supported extensions are: %1.</source>
</message> </message>
<message> <message>
<source>Expires:</source> <source>Expires:</source>
<translation>Caduca:</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Use default Auto-Type sequence of parent group</source> <source>Use default Auto-Type sequence of parent group</source>
@@ -3075,7 +3063,7 @@ This may cause the affected plugins to malfunction.</source>
</message> </message>
<message> <message>
<source>Remove selected plugin data</source> <source>Remove selected plugin data</source>
<translation>Suprimeix les dades del connector seleccionat</translation> <translation type="unfinished"/>
</message> </message>
</context> </context>
<context> <context>
@@ -3124,7 +3112,7 @@ This may cause the affected plugins to malfunction.</source>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<source>Are you sure you want to remove %n attachment(s)?</source> <source>Are you sure you want to remove %n attachment(s)?</source>
<translation><numerusform>Esteu segur que voleu eliminar %n fitxer(s) adjunt(s)?</numerusform><numerusform>Esteu segur que voleu suprimir %n adjunt(s)?</numerusform></translation> <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message> </message>
<message> <message>
<source>Save attachments</source> <source>Save attachments</source>
@@ -3178,7 +3166,7 @@ This may cause the affected plugins to malfunction.</source>
</message> </message>
<message> <message>
<source>Remove selected attachment</source> <source>Remove selected attachment</source>
<translation>Suprimeix el fitxer adjunt seleccionat</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Open selected attachment</source> <source>Open selected attachment</source>
@@ -3648,7 +3636,7 @@ If this reoccurs, then your database file may be corrupt.</source>
</message> </message>
<message> <message>
<source>Unable to calculate database key</source> <source>Unable to calculate database key</source>
<translation>Impossible calcular la clau de base dades</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Unable to issue challenge-response: %1</source> <source>Unable to issue challenge-response: %1</source>
@@ -3663,7 +3651,7 @@ If this reoccurs, then your database file may be corrupt.</source>
</message> </message>
<message> <message>
<source>Unable to calculate database key</source> <source>Unable to calculate database key</source>
<translation>Impossible calcular la clau de base dades</translation> <translation type="unfinished"/>
</message> </message>
</context> </context>
<context> <context>
@@ -4194,7 +4182,7 @@ If this reoccurs, then your database file may be corrupt.</source>
</message> </message>
<message> <message>
<source>Unable to calculate database key</source> <source>Unable to calculate database key</source>
<translation>Impossible calcular la clau de base dades</translation> <translation type="unfinished"/>
</message> </message>
</context> </context>
<context> <context>
@@ -4275,7 +4263,7 @@ If this reoccurs, then your database file may be corrupt.</source>
<message> <message>
<source>Remove %1</source> <source>Remove %1</source>
<comment>Remove a key component</comment> <comment>Remove a key component</comment>
<translation>Suprimeix %1</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>%1 set, click to change or remove</source> <source>%1 set, click to change or remove</source>
@@ -4326,14 +4314,26 @@ Message: %2</source>
<source>Select a key file</source> <source>Select a key file</source>
<translation>Seleccioneu un fitxer clau</translation> <translation>Seleccioneu un fitxer clau</translation>
</message> </message>
<message>
<source>Key file selection</source>
<translation>Selecciona el fitxer clau...</translation>
</message>
<message> <message>
<source>Browse for key file</source> <source>Browse for key file</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Browse...</source>
<translation>Navega...</translation>
</message>
<message> <message>
<source>Generate a new key file</source> <source>Generate a new key file</source>
<translation>Genera un fitxer clau nou</translation> <translation>Genera un fitxer clau nou</translation>
</message> </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 utilitzeu un fitxer que pugui canviar perquè faria que no poguéssiu desbloquejar la base de dades!</translation>
</message>
<message> <message>
<source>Invalid Key File</source> <source>Invalid Key File</source>
<translation type="unfinished"/> <translation type="unfinished"/>
@@ -4359,18 +4359,6 @@ Are you sure you want to continue with this file?</source>
<source>You selected a key file in an old format which KeePassXC&lt;br&gt;may stop supporting in the future.&lt;br&gt;&lt;br&gt;Please consider generating a new key file instead.</source> <source>You selected a key file in an old format which KeePassXC&lt;br&gt;may stop supporting in the future.&lt;br&gt;&lt;br&gt;Please consider generating a new key file instead.</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Generate a new key file or choose an existing one to protect your database.</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>Browse</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
@@ -4623,7 +4611,7 @@ Podeu esperar alguns errors i incidències menors. Aquesta versió no està pens
</message> </message>
<message> <message>
<source>&amp;Merge From Database</source> <source>&amp;Merge From Database</source>
<translation>Fusiona des d&apos;una base de dades</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>&amp;New Entry</source> <source>&amp;New Entry</source>
@@ -4679,19 +4667,19 @@ Podeu esperar alguns errors i incidències menors. Aquesta versió no està pens
</message> </message>
<message> <message>
<source>Move u&amp;p</source> <source>Move u&amp;p</source>
<translation>Mou am&amp;unt</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Move entry one step up</source> <source>Move entry one step up</source>
<translation>Mou l&apos;entrada un graó cap amunt</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Move do&amp;wn</source> <source>Move do&amp;wn</source>
<translation>Mou avall</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Move entry one step down</source> <source>Move entry one step down</source>
<translation>Baixa l&apos;entrada una posició</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Copy &amp;Username</source> <source>Copy &amp;Username</source>
@@ -4771,7 +4759,7 @@ Podeu esperar alguns errors i incidències menors. Aquesta versió no està pens
</message> </message>
<message> <message>
<source>Remove key from SSH Agent</source> <source>Remove key from SSH Agent</source>
<translation>Suprimeix la clau de l&apos;agent SSH</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Compact Mode</source> <source>Compact Mode</source>
@@ -4803,7 +4791,7 @@ Podeu esperar alguns errors i incidències menors. Aquesta versió no està pens
</message> </message>
<message> <message>
<source>Don&apos;t show again for this version</source> <source>Don&apos;t show again for this version</source>
<translation>No mostrar un altre cop per a aquesta versió</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Restart Application?</source> <source>Restart Application?</source>
@@ -4815,7 +4803,7 @@ Podeu esperar alguns errors i incidències menors. Aquesta versió no està pens
</message> </message>
<message> <message>
<source>Perform Auto-Type Sequence</source> <source>Perform Auto-Type Sequence</source>
<translation>Fes un seqüència d&apos;autocompleció</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>{USERNAME}</source> <source>{USERNAME}</source>
@@ -4940,7 +4928,7 @@ Podeu esperar alguns errors i incidències menors. Aquesta versió no està pens
</message> </message>
<message> <message>
<source>Removed custom data %1 [%2]</source> <source>Removed custom data %1 [%2]</source>
<translation>S&apos; han suprimit les dades personalitzades %1 [%2]</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Adding custom data %1 [%2]</source> <source>Adding custom data %1 [%2]</source>
@@ -5368,6 +5356,10 @@ Podeu esperar alguns errors i incidències menors. Aquesta versió no està pens
<source>Hex</source> <source>Hex</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </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"/>
</message>
<message> <message>
<source>Generated password</source> <source>Generated password</source>
<translation type="unfinished"/> <translation type="unfinished"/>
@@ -5468,10 +5460,6 @@ Podeu esperar alguns errors i incidències menors. Aquesta versió no està pens
<source>Special Characters</source> <source>Special Characters</source>
<translation>Caràcters especials</translation> <translation>Caràcters especials</translation>
</message> </message>
<message>
<source>Excluded characters: &quot;0&quot;, &quot;O&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;|&quot;, &quot;G&quot;, &quot;6&quot;, &quot;B&quot;, &quot;8&quot;, &quot;&quot;</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>QApplication</name> <name>QApplication</name>
@@ -5548,7 +5536,7 @@ Podeu esperar alguns errors i incidències menors. Aquesta versió no està pens
</message> </message>
<message> <message>
<source>Move</source> <source>Move</source>
<translation>Mou</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Empty</source> <source>Empty</source>
@@ -6060,11 +6048,11 @@ Available commands:
</message> </message>
<message> <message>
<source>Unable to save database to file : %1</source> <source>Unable to save database to file : %1</source>
<translation>No s&apos;ha pogut desar la base de dades al fitxer: %1</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Unable to save database to file: %1</source> <source>Unable to save database to file: %1</source>
<translation>No s&apos;ha pogut desar la base de dades al fitxer: %1</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Successfully recycled entry %1.</source> <source>Successfully recycled entry %1.</source>
@@ -6138,7 +6126,7 @@ Available commands:
</message> </message>
<message> <message>
<source>Failed to save the database: %1.</source> <source>Failed to save the database: %1.</source>
<translation>No s&apos;ha pogut desar la base de dades: %1</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Successfully created new database.</source> <source>Successfully created new database.</source>
@@ -6426,7 +6414,7 @@ Nucli: %3 %4</translation>
</message> </message>
<message> <message>
<source>Path of the entry to move.</source> <source>Path of the entry to move.</source>
<translation>Ruta de l&apos;entrada a moure.</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Path of the destination group.</source> <source>Path of the destination group.</source>
@@ -6442,7 +6430,7 @@ Nucli: %3 %4</translation>
</message> </message>
<message> <message>
<source>Successfully moved entry %1 to group %2.</source> <source>Successfully moved entry %1 to group %2.</source>
<translation>S&apos;ha mogut correctament l&apos;entrada %1 al grup %2</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Open a database.</source> <source>Open a database.</source>
@@ -6450,7 +6438,7 @@ Nucli: %3 %4</translation>
</message> </message>
<message> <message>
<source>Path of the group to remove.</source> <source>Path of the group to remove.</source>
<translation>Ruta del grup a suprimir.</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Cannot remove root group from database.</source> <source>Cannot remove root group from database.</source>
@@ -6738,22 +6726,6 @@ Please consider generating a new key file.</source>
<source>Unexpected key file data! Key file may be corrupt.</source> <source>Unexpected key file data! Key file may be corrupt.</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message numerus="yes">
<source>Clearing the clipboard in %1 second(s)</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<source>lock all open databases</source>
<translation type="unfinished"/>
</message>
<message>
<source>Locked databases.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Database failed to lock.</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>QtIOCompressor</name> <name>QtIOCompressor</name>
@@ -7089,7 +7061,7 @@ Please consider generating a new key file.</source>
</message> </message>
<message> <message>
<source>No agent running, cannot remove identity.</source> <source>No agent running, cannot remove identity.</source>
<translation>No hi ha cap agent en execució, no es pot suprimir la identitat.</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Agent refused this identity. Possible reasons include:</source> <source>Agent refused this identity. Possible reasons include:</source>
@@ -7419,7 +7391,7 @@ Please consider generating a new key file.</source>
</message> </message>
<message> <message>
<source>Remove selected certificate</source> <source>Remove selected certificate</source>
<translation>Suprimeix el certificat seleccionat</translation> <translation type="unfinished"/>
</message> </message>
</context> </context>
<context> <context>
@@ -7456,6 +7428,10 @@ Please consider generating a new key file.</source>
<source>Could not write export container</source> <source>Could not write export container</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Unexpected export error occurred</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>ShareImport</name> <name>ShareImport</name>
@@ -7523,6 +7499,10 @@ Please consider generating a new key file.</source>
<source>File does not exist</source> <source>File does not exist</source>
<translation>El fitxer no existeix</translation> <translation>El fitxer no existeix</translation>
</message> </message>
<message>
<source>Unknown share container type</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>ShareObserver</name> <name>ShareObserver</name>

View File

@@ -139,10 +139,6 @@
<source>You must restart the application to set the new language. Would you like to restart now?</source> <source>You must restart the application to set the new language. Would you like to restart now?</source>
<translation>Aby se změna jazyka projevila, je třeba aplikaci restartovat. Chcete to provést nyní?</translation> <translation>Aby se změna jazyka projevila, je třeba aplikaci restartovat. Chcete to provést nyní?</translation>
</message> </message>
<message>
<source>Monochrome</source>
<translation>Černobílá</translation>
</message>
</context> </context>
<context> <context>
<name>ApplicationSettingsWidgetGeneral</name> <name>ApplicationSettingsWidgetGeneral</name>
@@ -2500,14 +2496,6 @@ Všechny provedené změny byly bohužel ztraceny.</translation>
<source>Use this entry only with HTTP Basic Auth</source> <source>Use this entry only with HTTP Basic Auth</source>
<translation>Tuto položku použít pouze ve spojení se základním HTTP ověřováním se</translation> <translation>Tuto položku použít pouze ve spojení se základním HTTP ověřováním se</translation>
</message> </message>
<message>
<source>Do not send this setting to the browser for HTTP Auth dialogs. If enabled, HTTP Auth dialogs will not show this entry for selection.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Do not use this entry with HTTP Basic Auth</source>
<translation>Tuto položku nepoužívat ve spojení se základním HTTP ověřováním se</translation>
</message>
</context> </context>
<context> <context>
<name>EditEntryWidgetHistory</name> <name>EditEntryWidgetHistory</name>
@@ -4372,14 +4360,26 @@ Zpráva: %2</translation>
<source>Select a key file</source> <source>Select a key file</source>
<translation>Vyberte soubor s klíčem</translation> <translation>Vyberte soubor s klíčem</translation>
</message> </message>
<message>
<source>Key file selection</source>
<translation>Výběr souboru s klíčem</translation>
</message>
<message> <message>
<source>Browse for key file</source> <source>Browse for key file</source>
<translation>Nalistovat soubor s klíčem</translation> <translation>Nalistovat soubor s klíčem</translation>
</message> </message>
<message>
<source>Browse...</source>
<translation>Procházet</translation>
</message>
<message> <message>
<source>Generate a new key file</source> <source>Generate a new key file</source>
<translation>Vytvořit nový soubor s klíčem</translation> <translation>Vytvořit nový soubor s klíčem</translation>
</message> </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> <message>
<source>Invalid Key File</source> <source>Invalid Key File</source>
<translation>Neplatný soubor s klíčem</translation> <translation>Neplatný soubor s klíčem</translation>
@@ -4406,18 +4406,6 @@ Opravdu chcete tento soubor použít?</translation>
<source>You selected a key file in an old format which KeePassXC&lt;br&gt;may stop supporting in the future.&lt;br&gt;&lt;br&gt;Please consider generating a new key file instead.</source> <source>You selected a key file in an old format which KeePassXC&lt;br&gt;may stop supporting in the future.&lt;br&gt;&lt;br&gt;Please consider generating a new key file instead.</source>
<translation>Vybrali jste soubor s klíčem ve starém formátu, který KeePassXC&lt;br&gt;může přestat v budoucnu podporovat.&lt;br&gt;&lt;br&gt;Zvažte prosím místo něj vytvoření nového souboru s klíčem.</translation> <translation>Vybrali jste soubor s klíčem ve starém formátu, který KeePassXC&lt;br&gt;může přestat v budoucnu podporovat.&lt;br&gt;&lt;br&gt;Zvažte prosím místo něj vytvoření nového souboru s klíčem.</translation>
</message> </message>
<message>
<source>Generate a new key file or choose an existing one to protect your database.</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>Browse</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
@@ -5417,6 +5405,10 @@ Očekávejte chyby a drobné problémy, tato verze není určena pro produkční
<source>Hex</source> <source>Hex</source>
<translation>Hex</translation> <translation>Hex</translation>
</message> </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>
</message>
<message> <message>
<source>Generated password</source> <source>Generated password</source>
<translation>Vytvořené heslo</translation> <translation>Vytvořené heslo</translation>
@@ -5517,10 +5509,6 @@ Očekávejte chyby a drobné problémy, tato verze není určena pro produkční
<source>Special Characters</source> <source>Special Characters</source>
<translation>Zvláštní znaky</translation> <translation>Zvláštní znaky</translation>
</message> </message>
<message>
<source>Excluded characters: &quot;0&quot;, &quot;O&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;|&quot;, &quot;G&quot;, &quot;6&quot;, &quot;B&quot;, &quot;8&quot;, &quot;&quot;</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>QApplication</name> <name>QApplication</name>
@@ -6795,22 +6783,6 @@ Zvažte prosím vytvoření nového souboru s klíčem.</translation>
<source>Unexpected key file data! Key file may be corrupt.</source> <source>Unexpected key file data! Key file may be corrupt.</source>
<translation>Neočekávaná data v souboru s klíčem! Soubor s klíčem může být poškozený.</translation> <translation>Neočekávaná data v souboru s klíčem! Soubor s klíčem může být poškozený.</translation>
</message> </message>
<message numerus="yes">
<source>Clearing the clipboard in %1 second(s)</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<source>lock all open databases</source>
<translation type="unfinished"/>
</message>
<message>
<source>Locked databases.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Database failed to lock.</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>QtIOCompressor</name> <name>QtIOCompressor</name>
@@ -7513,6 +7485,10 @@ Zvažte prosím vytvoření nového souboru s klíčem.</translation>
<source>Could not write export container</source> <source>Could not write export container</source>
<translation>Nedaří se zapsat do exportního kontejneru</translation> <translation>Nedaří se zapsat do exportního kontejneru</translation>
</message> </message>
<message>
<source>Unexpected export error occurred</source>
<translation>Došlo k neočekávané chybě exportu</translation>
</message>
</context> </context>
<context> <context>
<name>ShareImport</name> <name>ShareImport</name>
@@ -7580,6 +7556,10 @@ Zvažte prosím vytvoření nového souboru s klíčem.</translation>
<source>File does not exist</source> <source>File does not exist</source>
<translation>Soubor neexistuje</translation> <translation>Soubor neexistuje</translation>
</message> </message>
<message>
<source>Unknown share container type</source>
<translation>Neznámý typ kontejneru pro sdílení</translation>
</message>
</context> </context>
<context> <context>
<name>ShareObserver</name> <name>ShareObserver</name>

View File

@@ -139,10 +139,6 @@
<source>You must restart the application to set the new language. Would you like to restart now?</source> <source>You must restart the application to set the new language. Would you like to restart now?</source>
<translation>Zum Ändern der Sprache müssen Sie die Anwendung neu starten. Möchten Sie jetzt neu starten?</translation> <translation>Zum Ändern der Sprache müssen Sie die Anwendung neu starten. Möchten Sie jetzt neu starten?</translation>
</message> </message>
<message>
<source>Monochrome</source>
<translation>Monochrom</translation>
</message>
</context> </context>
<context> <context>
<name>ApplicationSettingsWidgetGeneral</name> <name>ApplicationSettingsWidgetGeneral</name>
@@ -1996,7 +1992,7 @@ Das ist definitiv ein Programmfehler, bitte benachrichtigen Sie die Entwickler.<
</message> </message>
<message numerus="yes"> <message numerus="yes">
<source>Do you really want to move %n entry(s) to the recycle bin?</source> <source>Do you really want to move %n entry(s) to the recycle bin?</source>
<translation><numerusform>Möchten Sie wirklich %n Eintrag in den Papierkorb verschieben?</numerusform><numerusform>Möchten Sie wirklich %n Einträge in den Papierkorb verschieben?</numerusform></translation> <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>
</message> </message>
<message> <message>
<source>Execute command?</source> <source>Execute command?</source>
@@ -2499,14 +2495,6 @@ Leider sind alle vorgenommenen Änderungen verloren gegangen.</translation>
<source>Use this entry only with HTTP Basic Auth</source> <source>Use this entry only with HTTP Basic Auth</source>
<translation>Diesen Eintrag nur mit &quot;HTTP Basic Auth&quot; verwenden</translation> <translation>Diesen Eintrag nur mit &quot;HTTP Basic Auth&quot; verwenden</translation>
</message> </message>
<message>
<source>Do not send this setting to the browser for HTTP Auth dialogs. If enabled, HTTP Auth dialogs will not show this entry for selection.</source>
<translation>Diese Einstellung nicht an den Browser für HTTP-Auth-Dialoge senden. Wenn aktiviert, wird dieser Eintrag in HTTP-Auth-Dialogen nicht zur Auswahl angezeigt.</translation>
</message>
<message>
<source>Do not use this entry with HTTP Basic Auth</source>
<translation>Diesen Eintrag nicht mit HTTP-Basic-Auth verwenden</translation>
</message>
</context> </context>
<context> <context>
<name>EditEntryWidgetHistory</name> <name>EditEntryWidgetHistory</name>
@@ -4369,14 +4357,26 @@ Message: %2</source>
<source>Select a key file</source> <source>Select a key file</source>
<translation>Schlüsseldatei auswählen</translation> <translation>Schlüsseldatei auswählen</translation>
</message> </message>
<message>
<source>Key file selection</source>
<translation>Auswahl der Schlüsseldatei</translation>
</message>
<message> <message>
<source>Browse for key file</source> <source>Browse for key file</source>
<translation>Schlüsseldatei auswählen</translation> <translation>Schlüsseldatei auswählen</translation>
</message> </message>
<message>
<source>Browse...</source>
<translation>Durchsuchen ...</translation>
</message>
<message> <message>
<source>Generate a new key file</source> <source>Generate a new key file</source>
<translation>Neue Schlüsseldatei erzeugen</translation> <translation>Neue Schlüsseldatei erzeugen</translation>
</message> </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 Datei, die sich ändern kann, sonst können Sie die Datenbank nicht mehr entsperren!</translation>
</message>
<message> <message>
<source>Invalid Key File</source> <source>Invalid Key File</source>
<translation>Ungültige Schlüsseldatei</translation> <translation>Ungültige Schlüsseldatei</translation>
@@ -4403,18 +4403,6 @@ Wollen Sie wirklich mit dieser Datei fortfahren?</translation>
<source>You selected a key file in an old format which KeePassXC&lt;br&gt;may stop supporting in the future.&lt;br&gt;&lt;br&gt;Please consider generating a new key file instead.</source> <source>You selected a key file in an old format which KeePassXC&lt;br&gt;may stop supporting in the future.&lt;br&gt;&lt;br&gt;Please consider generating a new key file instead.</source>
<translation>Sie verwenden ein altes Schlüsseldateiformat, das KeePassXC möglicherweise&lt;br&gt;in Zukunft nicht mehr unterstützen wird.&lt;br&gt;&lt;br&gt;Bitte erwägen Sie, eine neue Schlüsseldatei zu erzeugen.</translation> <translation>Sie verwenden ein altes Schlüsseldateiformat, das KeePassXC möglicherweise&lt;br&gt;in Zukunft nicht mehr unterstützen wird.&lt;br&gt;&lt;br&gt;Bitte erwägen Sie, eine neue Schlüsseldatei zu erzeugen.</translation>
</message> </message>
<message>
<source>Generate a new key file or choose an existing one to protect your database.</source>
<translation>Erzeugen Sie eine neue Schlüsseldatei oder wählen Sie eine vorhandene aus, um Ihre Datenbank zu schützen.</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: Verwenden Sie NICHT eine Datei, die sich ändern kann, da Sie dann Ihre Datenbank nicht mehr freischalten können.</translation>
</message>
<message>
<source>Browse</source>
<translation>Durchsuchen...</translation>
</message>
</context> </context>
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
@@ -5414,6 +5402,10 @@ Rechnen Sie mit Fehlern. Diese Version ist nicht für den Produktiveinsatz gedac
<source>Hex</source> <source>Hex</source>
<translation>Hex</translation> <translation>Hex</translation>
</message> </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>Ausgeschlossene Zeichen: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;&quot;</translation>
</message>
<message> <message>
<source>Generated password</source> <source>Generated password</source>
<translation>Erzeugtes Passwort</translation> <translation>Erzeugtes Passwort</translation>
@@ -5514,10 +5506,6 @@ Rechnen Sie mit Fehlern. Diese Version ist nicht für den Produktiveinsatz gedac
<source>Special Characters</source> <source>Special Characters</source>
<translation>Sonderzeichen</translation> <translation>Sonderzeichen</translation>
</message> </message>
<message>
<source>Excluded characters: &quot;0&quot;, &quot;O&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;|&quot;, &quot;G&quot;, &quot;6&quot;, &quot;B&quot;, &quot;8&quot;, &quot;&quot;</source>
<translation>Ausgeschlossene Zeichen: &quot;0&quot;, &quot;O&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;|&quot;, &quot;G&quot;, &quot;6&quot;, &quot;B&quot;, &quot;8&quot;, &quot;&quot;</translation>
</message>
</context> </context>
<context> <context>
<name>QApplication</name> <name>QApplication</name>
@@ -6791,22 +6779,6 @@ Bitte erwägen Sie, eine neue Schlüsseldatei zu erzeugen.</translation>
<source>Unexpected key file data! Key file may be corrupt.</source> <source>Unexpected key file data! Key file may be corrupt.</source>
<translation>Unerwartete Schlüsseldateidaten! Die Schlüsseldatei ist möglicherweise beschädigt.</translation> <translation>Unerwartete Schlüsseldateidaten! Die Schlüsseldatei ist möglicherweise beschädigt.</translation>
</message> </message>
<message numerus="yes">
<source>Clearing the clipboard in %1 second(s)</source>
<translation><numerusform>Zwischenablage wird in %1 Sekunde(n) gelöscht...</numerusform><numerusform>Zwischenablage wird in %1 Sekunde(n) gelöscht ...</numerusform></translation>
</message>
<message>
<source>lock all open databases</source>
<translation>alle offenen Datenbanken sperren</translation>
</message>
<message>
<source>Locked databases.</source>
<translation>Gesperrte Datenbanken.</translation>
</message>
<message>
<source>Database failed to lock.</source>
<translation>Datenbank kann nicht gesperrt werden.</translation>
</message>
</context> </context>
<context> <context>
<name>QtIOCompressor</name> <name>QtIOCompressor</name>
@@ -7509,6 +7481,10 @@ Bitte erwägen Sie, eine neue Schlüsseldatei zu erzeugen.</translation>
<source>Could not write export container</source> <source>Could not write export container</source>
<translation>Export-Container kann nicht gespeichert werden</translation> <translation>Export-Container kann nicht gespeichert werden</translation>
</message> </message>
<message>
<source>Unexpected export error occurred</source>
<translation>Unerwarteter Fehler beim Export</translation>
</message>
</context> </context>
<context> <context>
<name>ShareImport</name> <name>ShareImport</name>
@@ -7576,6 +7552,10 @@ Bitte erwägen Sie, eine neue Schlüsseldatei zu erzeugen.</translation>
<source>File does not exist</source> <source>File does not exist</source>
<translation>Datei existiert nicht</translation> <translation>Datei existiert nicht</translation>
</message> </message>
<message>
<source>Unknown share container type</source>
<translation>Unbekannter geteilter Containertyp</translation>
</message>
</context> </context>
<context> <context>
<name>ShareObserver</name> <name>ShareObserver</name>

View File

@@ -139,10 +139,6 @@
<source>You must restart the application to set the new language. Would you like to restart now?</source> <source>You must restart the application to set the new language. Would you like to restart now?</source>
<translation>You must restart the application to set the new language. Would you like to restart now?</translation> <translation>You must restart the application to set the new language. Would you like to restart now?</translation>
</message> </message>
<message>
<source>Monochrome</source>
<translation>Monochrome</translation>
</message>
</context> </context>
<context> <context>
<name>ApplicationSettingsWidgetGeneral</name> <name>ApplicationSettingsWidgetGeneral</name>
@@ -2500,14 +2496,6 @@ Unfortunately, any changes made have been lost.</translation>
<source>Use this entry only with HTTP Basic Auth</source> <source>Use this entry only with HTTP Basic Auth</source>
<translation>Use this entry only with HTTP Basic Auth</translation> <translation>Use this entry only with HTTP Basic Auth</translation>
</message> </message>
<message>
<source>Do not send this setting to the browser for HTTP Auth dialogs. If enabled, HTTP Auth dialogs will not show this entry for selection.</source>
<translation>Do not send this setting to the browser for HTTP Auth dialogs. If enabled, HTTP Auth dialogs will not show this entry for selection.</translation>
</message>
<message>
<source>Do not use this entry with HTTP Basic Auth</source>
<translation>Do not use this entry with HTTP Basic Auth</translation>
</message>
</context> </context>
<context> <context>
<name>EditEntryWidgetHistory</name> <name>EditEntryWidgetHistory</name>
@@ -4370,14 +4358,26 @@ Message: %2</translation>
<source>Select a key file</source> <source>Select a key file</source>
<translation>Select a key file</translation> <translation>Select a key file</translation>
</message> </message>
<message>
<source>Key file selection</source>
<translation>Key file selection</translation>
</message>
<message> <message>
<source>Browse for key file</source> <source>Browse for key file</source>
<translation>Browse for key file</translation> <translation>Browse for key file</translation>
</message> </message>
<message>
<source>Browse...</source>
<translation>Browse...</translation>
</message>
<message> <message>
<source>Generate a new key file</source> <source>Generate a new key file</source>
<translation>Generate a new key file</translation> <translation>Generate a new key file</translation>
</message> </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> <message>
<source>Invalid Key File</source> <source>Invalid Key File</source>
<translation>Invalid Key File</translation> <translation>Invalid Key File</translation>
@@ -4404,18 +4404,6 @@ Are you sure you want to continue with this file?</translation>
<source>You selected a key file in an old format which KeePassXC&lt;br&gt;may stop supporting in the future.&lt;br&gt;&lt;br&gt;Please consider generating a new key file instead.</source> <source>You selected a key file in an old format which KeePassXC&lt;br&gt;may stop supporting in the future.&lt;br&gt;&lt;br&gt;Please consider generating a new key file instead.</source>
<translation>You selected a key file in an old format which KeePassXC&lt;br&gt;may stop supporting in the future.&lt;br&gt;&lt;br&gt;Please consider generating a new key file instead.</translation> <translation>You selected a key file in an old format which KeePassXC&lt;br&gt;may stop supporting in the future.&lt;br&gt;&lt;br&gt;Please consider generating a new key file instead.</translation>
</message> </message>
<message>
<source>Generate a new key file or choose an existing one to protect your database.</source>
<translation>Generate a new key file or choose an existing one to protect your database.</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>Browse</source>
<translation>Browse</translation>
</message>
</context> </context>
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
@@ -5415,6 +5403,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Hex</source> <source>Hex</source>
<translation>Hex</translation> <translation>Hex</translation>
</message> </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>Excluded characters: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;&quot;</translation>
</message>
<message> <message>
<source>Generated password</source> <source>Generated password</source>
<translation>Generated password</translation> <translation>Generated password</translation>
@@ -5515,10 +5507,6 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Special Characters</source> <source>Special Characters</source>
<translation>Special Characters</translation> <translation>Special Characters</translation>
</message> </message>
<message>
<source>Excluded characters: &quot;0&quot;, &quot;O&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;|&quot;, &quot;G&quot;, &quot;6&quot;, &quot;B&quot;, &quot;8&quot;, &quot;&quot;</source>
<translation>Excluded characters: &quot;0&quot;, &quot;O&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;|&quot;, &quot;G&quot;, &quot;6&quot;, &quot;B&quot;, &quot;8&quot;, &quot;&quot;</translation>
</message>
</context> </context>
<context> <context>
<name>QApplication</name> <name>QApplication</name>
@@ -6792,22 +6780,6 @@ Please consider generating a new key file.</translation>
<source>Unexpected key file data! Key file may be corrupt.</source> <source>Unexpected key file data! Key file may be corrupt.</source>
<translation>Unexpected key file data! Key file may be corrupt.</translation> <translation>Unexpected key file data! Key file may be corrupt.</translation>
</message> </message>
<message numerus="yes">
<source>Clearing the clipboard in %1 second(s)</source>
<translation><numerusform>Clearing the clipboard in %1 second</numerusform><numerusform>Clearing the clipboard in %1 seconds</numerusform></translation>
</message>
<message>
<source>lock all open databases</source>
<translation>lock all open databases</translation>
</message>
<message>
<source>Locked databases.</source>
<translation>Databases have been locked.</translation>
</message>
<message>
<source>Database failed to lock.</source>
<translation>Database failed to lock.</translation>
</message>
</context> </context>
<context> <context>
<name>QtIOCompressor</name> <name>QtIOCompressor</name>
@@ -7510,6 +7482,10 @@ Please consider generating a new key file.</translation>
<source>Could not write export container</source> <source>Could not write export container</source>
<translation>Could not write export container</translation> <translation>Could not write export container</translation>
</message> </message>
<message>
<source>Unexpected export error occurred</source>
<translation>Unexpected export error occurred</translation>
</message>
</context> </context>
<context> <context>
<name>ShareImport</name> <name>ShareImport</name>
@@ -7577,6 +7553,10 @@ Please consider generating a new key file.</translation>
<source>File does not exist</source> <source>File does not exist</source>
<translation>File does not exist</translation> <translation>File does not exist</translation>
</message> </message>
<message>
<source>Unknown share container type</source>
<translation>Unknown share container type</translation>
</message>
</context> </context>
<context> <context>
<name>ShareObserver</name> <name>ShareObserver</name>

View File

@@ -139,10 +139,6 @@
<source>You must restart the application to set the new language. Would you like to restart now?</source> <source>You must restart the application to set the new language. Would you like to restart now?</source>
<translation>Keele vahetamiseks tuleb KeePassXC uuesti käivitada. Kas teha seda kohe?</translation> <translation>Keele vahetamiseks tuleb KeePassXC uuesti käivitada. Kas teha seda kohe?</translation>
</message> </message>
<message>
<source>Monochrome</source>
<translation>mustvalge</translation>
</message>
</context> </context>
<context> <context>
<name>ApplicationSettingsWidgetGeneral</name> <name>ApplicationSettingsWidgetGeneral</name>
@@ -1353,11 +1349,11 @@ Kui andmebaasi avamiseks pole võtmefaili vaja, jäta see väli tühjaks.</trans
</message> </message>
<message> <message>
<source>Old key file format</source> <source>Old key file format</source>
<translation>Vanas vormingus võtmefail</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>You are using an old key file format which KeePassXC may&lt;br&gt;stop supporting in the future.&lt;br&gt;&lt;br&gt;Please consider generating a new key file by going to:&lt;br&gt;&lt;strong&gt;Database / Database Security / Change Key File.&lt;/strong&gt;&lt;br&gt;</source> <source>You are using an old key file format which KeePassXC may&lt;br&gt;stop supporting in the future.&lt;br&gt;&lt;br&gt;Please consider generating a new key file by going to:&lt;br&gt;&lt;strong&gt;Database / Database Security / Change Key File.&lt;/strong&gt;&lt;br&gt;</source>
<translation>Kasutad vana võtmefailivormingut, mille tugi võidakse&lt;br&gt;KeePassXC-st tulevikus eemaldada.&lt;br&gt;&lt;br&gt;Palun genereeri uus võtmefail selleks vali menüüst:&lt;br&gt;&lt;strong&gt;Andmebaas Andmebaasi turvalisus Muuda võtmefaili.&lt;/strong&gt;&lt;br&gt;</translation> <translation type="unfinished"/>
</message> </message>
</context> </context>
<context> <context>
@@ -2294,13 +2290,12 @@ Kas keelata turvaline salvestamine ja proovida seejärel uuesti?</translation>
</message> </message>
<message> <message>
<source>Invalid Entry</source> <source>Invalid Entry</source>
<translation>Sobimatu kirje</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>An external merge operation has invalidated this entry. <source>An external merge operation has invalidated this entry.
Unfortunately, any changes made have been lost.</source> Unfortunately, any changes made have been lost.</source>
<translation>Väljastpoolt algatatud mestimine on selle kirje kehtetuks muutnud. <translation type="unfinished"/>
Kõik tehtud muudatused läksid kahjuks kaotsi.</translation>
</message> </message>
</context> </context>
<context> <context>
@@ -2499,14 +2494,6 @@ Kõik tehtud muudatused läksid kahjuks kaotsi.</translation>
<source>Use this entry only with HTTP Basic Auth</source> <source>Use this entry only with HTTP Basic Auth</source>
<translation>Seda kirjet kasutatakse vaid HTTP lihtautentimisel</translation> <translation>Seda kirjet kasutatakse vaid HTTP lihtautentimisel</translation>
</message> </message>
<message>
<source>Do not send this setting to the browser for HTTP Auth dialogs. If enabled, HTTP Auth dialogs will not show this entry for selection.</source>
<translation>Märkimisel seda kirjet HTTP autentimisdialoogide puhul brauserile ei saadeta ning HTTP autentimisdialoogides seda kirjet valida ei saa.</translation>
</message>
<message>
<source>Do not use this entry with HTTP Basic Auth</source>
<translation>Seda kirjet HTTP lihtautentimisel ei kasutata</translation>
</message>
</context> </context>
<context> <context>
<name>EditEntryWidgetHistory</name> <name>EditEntryWidgetHistory</name>
@@ -2631,7 +2618,7 @@ Kõik tehtud muudatused läksid kahjuks kaotsi.</translation>
</message> </message>
<message> <message>
<source>Edit Entry</source> <source>Edit Entry</source>
<translation>Muuda kirjet</translation> <translation type="unfinished"/>
</message> </message>
</context> </context>
<context> <context>
@@ -2827,15 +2814,15 @@ Toetatud faililaiendid: %1</translation>
</message> </message>
<message> <message>
<source>%1 is already being exported by this database.</source> <source>%1 is already being exported by this database.</source>
<translation>Selle andmebaasi poolt juba eksporditakse %1</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>%1 is already being imported by this database.</source> <source>%1 is already being imported by this database.</source>
<translation>Selle andmebaasi poolt juba imporditakse %1</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>%1 is being imported and exported by different groups in this database.</source> <source>%1 is being imported and exported by different groups in this database.</source>
<translation>Selle andmebaasi eri grupid kasutavad asukohta %1 nii importimiseks kui ka eksportimiseks.</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>KeeShare is currently disabled. You can enable import/export in the application settings.</source> <source>KeeShare is currently disabled. You can enable import/export in the application settings.</source>
@@ -2935,7 +2922,7 @@ Toetatud faililaiendid: %1</translation>
</message> </message>
<message> <message>
<source>Edit Group</source> <source>Edit Group</source>
<translation>Muuda gruppi</translation> <translation type="unfinished"/>
</message> </message>
</context> </context>
<context> <context>
@@ -3458,12 +3445,12 @@ Kas oled kindel, et tahad selle faili lisada?</translation>
</message> </message>
<message> <message>
<source>Default Sequence</source> <source>Default Sequence</source>
<translation>Vaikejada</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>&lt;tr&gt;&lt;td&gt;&lt;b&gt;%1&lt;/b&gt;:&lt;/td&gt;&lt;td&gt;%2&lt;/td&gt;&lt;/tr&gt;</source> <source>&lt;tr&gt;&lt;td&gt;&lt;b&gt;%1&lt;/b&gt;:&lt;/td&gt;&lt;td&gt;%2&lt;/td&gt;&lt;/tr&gt;</source>
<comment>attributes line</comment> <comment>attributes line</comment>
<translation>&lt;tr&gt;&lt;td&gt;&lt;b&gt;%1&lt;/b&gt;:&lt;/td&gt;&lt;td&gt;%2&lt;/td&gt;&lt;/tr&gt;</translation> <translation type="unfinished"/>
</message> </message>
</context> </context>
<context> <context>
@@ -3885,11 +3872,11 @@ Kui probleem püsib, võib andmebaasifail olla rikutud.</translation>
</message> </message>
<message> <message>
<source>Invalid random stream id size</source> <source>Invalid random stream id size</source>
<translation>sobimatu juhuvoo ID suurus</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Invalid inner random stream cipher</source> <source>Invalid inner random stream cipher</source>
<translation>sobimatu sisemine juhuvoo šiffer</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Not a KeePass database.</source> <source>Not a KeePass database.</source>
@@ -3942,11 +3929,11 @@ Teisendus on ühesuunaline, seega imporditud andmebaasi ei saa vana KeePassX 0.4
</message> </message>
<message> <message>
<source>Multiple group elements</source> <source>Multiple group elements</source>
<translation>mitu grupielementi</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Null group uuid</source> <source>Null group uuid</source>
<translation>nullväärtusega grupi-UUID</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Invalid group icon number</source> <source>Invalid group icon number</source>
@@ -3966,15 +3953,15 @@ Teisendus on ühesuunaline, seega imporditud andmebaasi ei saa vana KeePassX 0.4
</message> </message>
<message> <message>
<source>Null DeleteObject uuid</source> <source>Null DeleteObject uuid</source>
<translation>nullväärtusega DeleteObjecti-UUID</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Missing DeletedObject uuid or time</source> <source>Missing DeletedObject uuid or time</source>
<translation>DeletedObjecti UUID või ajaväärtus on puudu</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Null entry uuid</source> <source>Null entry uuid</source>
<translation>nullväärtusega kirje-UUID</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Invalid entry icon number</source> <source>Invalid entry icon number</source>
@@ -4054,7 +4041,7 @@ Rida %2, veerg %3</translation>
</message> </message>
<message> <message>
<source>Private key is an attachment but no attachments provided.</source> <source>Private key is an attachment but no attachments provided.</source>
<translation>Privaatvõti olevat kaasatud fail, aga kaasatud faile pole.</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Private key is empty</source> <source>Private key is empty</source>
@@ -4246,7 +4233,7 @@ Kui probleem püsib, võib andmebaasifail olla rikutud.</translation>
</message> </message>
<message> <message>
<source>Inactive share %1</source> <source>Inactive share %1</source>
<translation>Mitteaktiivne jagatud ressurss %1</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Imported from %1</source> <source>Imported from %1</source>
@@ -4270,7 +4257,7 @@ Kui probleem püsib, võib andmebaasifail olla rikutud.</translation>
</message> </message>
<message> <message>
<source>Inactive share</source> <source>Inactive share</source>
<translation>Mitteaktiivne jagatud ressurss</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Imported from</source> <source>Imported from</source>
@@ -4368,14 +4355,26 @@ Teade: %2</translation>
<source>Select a key file</source> <source>Select a key file</source>
<translation>Võtmefaili valimine</translation> <translation>Võtmefaili valimine</translation>
</message> </message>
<message>
<source>Key file selection</source>
<translation>Võtmefaili valimine</translation>
</message>
<message> <message>
<source>Browse for key file</source> <source>Browse for key file</source>
<translation>Vali võtmefail</translation> <translation>Vali võtmefail</translation>
</message> </message>
<message>
<source>Browse...</source>
<translation>Sirvi...</translation>
</message>
<message> <message>
<source>Generate a new key file</source> <source>Generate a new key file</source>
<translation>Genereeri uus võtmefail</translation> <translation>Genereeri uus võtmefail</translation>
</message> </message>
<message>
<source>Note: Do not use a file that may change as that will prevent you from unlocking your database!</source>
<translation>NB: ära kasuta faili, mis võib muutuda, kuna sel juhul pole enam võimalik andmebaasi lukku avada!</translation>
</message>
<message> <message>
<source>Invalid Key File</source> <source>Invalid Key File</source>
<translation>Sobimatu võtmefail</translation> <translation>Sobimatu võtmefail</translation>
@@ -4396,23 +4395,11 @@ Kas oled kindel, et soovid selle failiga jätkata?</translation>
</message> </message>
<message> <message>
<source>Old key file format</source> <source>Old key file format</source>
<translation>Vanas vormingus võtmefail</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>You selected a key file in an old format which KeePassXC&lt;br&gt;may stop supporting in the future.&lt;br&gt;&lt;br&gt;Please consider generating a new key file instead.</source> <source>You selected a key file in an old format which KeePassXC&lt;br&gt;may stop supporting in the future.&lt;br&gt;&lt;br&gt;Please consider generating a new key file instead.</source>
<translation>Valisid võtmefaili, mis on vanas vormingus, mille tugi võidakse&lt;br&gt;KeePassXC-st tulevikus eemaldada.&lt;br&gt;&lt;br&gt;Palun genereeri selle asemele uus võtmefail.</translation> <translation type="unfinished"/>
</message>
<message>
<source>Generate a new key file or choose an existing one to protect your database.</source>
<translation>Andmebaasi kaitsmiseks saab genereerida uue võtmefaili või valida mõne olemasoleva.</translation>
</message>
<message>
<source>Note: Do NOT use a file that may change as that will prevent you from unlocking your database.</source>
<translation>NB: ära kasuta faili, mis võib muutuda, kuna sel juhul pole enam võimalik andmebaasi lukku avada!</translation>
</message>
<message>
<source>Browse</source>
<translation>Sirvi</translation>
</message> </message>
</context> </context>
<context> <context>
@@ -4879,7 +4866,7 @@ Eeldatavasti leidub selles programmivigu ja muid väiksemaid hädasid see ve
</message> </message>
<message> <message>
<source>Always on Top</source> <source>Always on Top</source>
<translation>Alati pealmine</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Hide Usernames</source> <source>Hide Usernames</source>
@@ -4928,67 +4915,67 @@ Eeldatavasti leidub selles programmivigu ja muid väiksemaid hädasid see ve
<name>Merger</name> <name>Merger</name>
<message> <message>
<source>Creating missing %1 [%2]</source> <source>Creating missing %1 [%2]</source>
<translation>Puuduva kirje %1 [%2] loomine</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Relocating %1 [%2]</source> <source>Relocating %1 [%2]</source>
<translation>Kirje %1 [%2] teisaldamine</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Overwriting %1 [%2]</source> <source>Overwriting %1 [%2]</source>
<translation>Kirje %1 [%2] ülekirjutamine</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>older entry merged from database &quot;%1&quot;</source> <source>older entry merged from database &quot;%1&quot;</source>
<translation>andmebaasist %1 mestitud vanem kirje</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Adding backup for older target %1 [%2]</source> <source>Adding backup for older target %1 [%2]</source>
<translation>Vanema sihtmärgi jaoks varukoopia lisamine %1 [%2]</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Adding backup for older source %1 [%2]</source> <source>Adding backup for older source %1 [%2]</source>
<translation>Vanema allika jaoks varukoopia lisamine %1 [%2]</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Reapplying older target entry on top of newer source %1 [%2]</source> <source>Reapplying older target entry on top of newer source %1 [%2]</source>
<translation>Uuema lähtekirje %1 [%2] peale vanema sihtkirje taasrakendamine</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Reapplying older source entry on top of newer target %1 [%2]</source> <source>Reapplying older source entry on top of newer target %1 [%2]</source>
<translation>Uuema sihtkirje %1 [%2] peale vanema lähtekirje taasrakendamine</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Synchronizing from newer source %1 [%2]</source> <source>Synchronizing from newer source %1 [%2]</source>
<translation>Sünkroniseerimine uuemast allikast %1 [%2]</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Synchronizing from older source %1 [%2]</source> <source>Synchronizing from older source %1 [%2]</source>
<translation>Sünkroniseerimine vanemast allikast %1 [%2]</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Deleting child %1 [%2]</source> <source>Deleting child %1 [%2]</source>
<translation>Alamobjekti %1 [%2] kustutamine</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Deleting orphan %1 [%2]</source> <source>Deleting orphan %1 [%2]</source>
<translation>Orvuks jäänud objekti %1 [%2] kustutamine</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Changed deleted objects</source> <source>Changed deleted objects</source>
<translation>Muudetud kustutatud objektid</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Adding missing icon %1</source> <source>Adding missing icon %1</source>
<translation>Puuduva ikooni lisamine %1</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Removed custom data %1 [%2]</source> <source>Removed custom data %1 [%2]</source>
<translation>Kohandatud andmed eemaldatud %1 [%2]</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Adding custom data %1 [%2]</source> <source>Adding custom data %1 [%2]</source>
<translation>Kohandatud andmete lisamine %1 [%2]</translation> <translation type="unfinished"/>
</message> </message>
</context> </context>
<context> <context>
@@ -5413,6 +5400,10 @@ Eeldatavasti leidub selles programmivigu ja muid väiksemaid hädasid see ve
<source>Hex</source> <source>Hex</source>
<translation>16nd-süsteemis parool</translation> <translation>16nd-süsteemis parool</translation>
</message> </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>Määrab, kas välistada märgid nagu &quot;0&quot;, &quot;O&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;|&quot;, &quot;&quot;</translation>
</message>
<message> <message>
<source>Generated password</source> <source>Generated password</source>
<translation>Genereeritud parool</translation> <translation>Genereeritud parool</translation>
@@ -5513,10 +5504,6 @@ Eeldatavasti leidub selles programmivigu ja muid väiksemaid hädasid see ve
<source>Special Characters</source> <source>Special Characters</source>
<translation>Erimärgid</translation> <translation>Erimärgid</translation>
</message> </message>
<message>
<source>Excluded characters: &quot;0&quot;, &quot;O&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;|&quot;, &quot;G&quot;, &quot;6&quot;, &quot;B&quot;, &quot;8&quot;, &quot;&quot;</source>
<translation>Välistatud märgid: &quot;0&quot;, &quot;O&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;|&quot;, &quot;G&quot;, &quot;6&quot;, &quot;B&quot;, &quot;8&quot;, &quot;&quot;</translation>
</message>
</context> </context>
<context> <context>
<name>QApplication</name> <name>QApplication</name>
@@ -5640,23 +5627,23 @@ Eeldatavasti leidub selles programmivigu ja muid väiksemaid hädasid see ve
</message> </message>
<message> <message>
<source>Action cancelled or denied</source> <source>Action cancelled or denied</source>
<translation>Toiming tühistatud või keelatud</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>KeePassXC association failed, try again</source> <source>KeePassXC association failed, try again</source>
<translation>KeePassXC seostamine ebaõnnestus, proovi uuesti</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Encryption key is not recognized</source> <source>Encryption key is not recognized</source>
<translation>Krüptimisvõtit ei tuvastatud</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Incorrect action</source> <source>Incorrect action</source>
<translation>Vale toiming</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Empty message received</source> <source>Empty message received</source>
<translation>Saadi tühi sõnum</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>No URL provided</source> <source>No URL provided</source>
@@ -5664,7 +5651,7 @@ Eeldatavasti leidub selles programmivigu ja muid väiksemaid hädasid see ve
</message> </message>
<message> <message>
<source>No logins found</source> <source>No logins found</source>
<translation>Sisselogimisandmeid ei leitud</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Unknown error</source> <source>Unknown error</source>
@@ -5753,7 +5740,7 @@ Eeldatavasti leidub selles programmivigu ja muid väiksemaid hädasid see ve
</message> </message>
<message> <message>
<source>Perform advanced analysis on the password.</source> <source>Perform advanced analysis on the password.</source>
<translation>Parooli põhjalikum analüüsimine.</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source> <source>
@@ -5938,7 +5925,7 @@ Võimalikud käsud:
</message> </message>
<message> <message>
<source>Not changing any field for entry %1.</source> <source>Not changing any field for entry %1.</source>
<translation>Kirje &quot;%1&quot; ühtki välja ei muudeta.</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Enter new password for entry: </source> <source>Enter new password for entry: </source>
@@ -5966,83 +5953,83 @@ Võimalikud käsud:
</message> </message>
<message> <message>
<source>Multi-word extra bits %1</source> <source>Multi-word extra bits %1</source>
<translation>Mitmiksõna lisabitid %1</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Type: Bruteforce</source> <source>Type: Bruteforce</source>
<translation>Tüüp: jõhkra jõuga</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Type: Dictionary</source> <source>Type: Dictionary</source>
<translation>Tüüp: sõnastik</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Type: Dict+Leet</source> <source>Type: Dict+Leet</source>
<translation>Tüüp: sõnastik+1337</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Type: User Words</source> <source>Type: User Words</source>
<translation>Tüüp: kasutaja sõnad</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Type: User+Leet</source> <source>Type: User+Leet</source>
<translation>Tüüp: kasutaja+1337</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Type: Repeated</source> <source>Type: Repeated</source>
<translation>Tüüp: kordus</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Type: Sequence</source> <source>Type: Sequence</source>
<translation>Tüüp: jada</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Type: Spatial</source> <source>Type: Spatial</source>
<translation>Tüüp: ruumiline</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Type: Date</source> <source>Type: Date</source>
<translation>Tüüp: kuupäev</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Type: Bruteforce(Rep)</source> <source>Type: Bruteforce(Rep)</source>
<translation>Tüüp: jõhkra jõuga (korduv)</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Type: Dictionary(Rep)</source> <source>Type: Dictionary(Rep)</source>
<translation>Tüüp: sõnastik (korduv)</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Type: Dict+Leet(Rep)</source> <source>Type: Dict+Leet(Rep)</source>
<translation>Tüüp: sõnastik+1337 (korduv)</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Type: User Words(Rep)</source> <source>Type: User Words(Rep)</source>
<translation>Tüüp: kasutaja sõnad (korduv)</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Type: User+Leet(Rep)</source> <source>Type: User+Leet(Rep)</source>
<translation>Tüüp: kasutaja+1337 (korduv)</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Type: Repeated(Rep)</source> <source>Type: Repeated(Rep)</source>
<translation>Tüüp: kordus (korduv)</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Type: Sequence(Rep)</source> <source>Type: Sequence(Rep)</source>
<translation>Tüüp: jada (korduv)</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Type: Spatial(Rep)</source> <source>Type: Spatial(Rep)</source>
<translation>Tüüp: ruumiline (korduv)</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Type: Date(Rep)</source> <source>Type: Date(Rep)</source>
<translation>Tüüp: kuupäev (korduv)</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Type: Unknown%1</source> <source>Type: Unknown%1</source>
<translation>Tüüp: teadmata %1</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Entropy %1 (%2)</source> <source>Entropy %1 (%2)</source>
@@ -6398,7 +6385,7 @@ Kernel: %3 %4</translation>
</message> </message>
<message> <message>
<source>Exit interactive mode.</source> <source>Exit interactive mode.</source>
<translation>Välju interaktiivsest režiimist.</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Exports the content of a database to standard output in the specified format.</source> <source>Exports the content of a database to standard output in the specified format.</source>
@@ -6414,7 +6401,7 @@ Kernel: %3 %4</translation>
</message> </message>
<message> <message>
<source>Use numbers</source> <source>Use numbers</source>
<translation>Kasuta numbreid</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Invalid password length %1</source> <source>Invalid password length %1</source>
@@ -6450,11 +6437,11 @@ Kernel: %3 %4</translation>
</message> </message>
<message> <message>
<source>Flattens the output to single lines.</source> <source>Flattens the output to single lines.</source>
<translation> Tasandab väljundi üksikuteks ridadeks.</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Only print the changes detected by the merge operation.</source> <source>Only print the changes detected by the merge operation.</source>
<translation>Näitab, mida mestimise käigus tehtaks, tegelikult midagi muutmata.</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Yubikey slot for the second database.</source> <source>Yubikey slot for the second database.</source>
@@ -6554,7 +6541,7 @@ Kernel: %3 %4</translation>
</message> </message>
<message> <message>
<source>Invalid password generator after applying all options</source> <source>Invalid password generator after applying all options</source>
<translation>Kõigi valikute rakendamise järel saadi sobimatu parooligeneraator.</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Show the protected attributes in clear text.</source> <source>Show the protected attributes in clear text.</source>
@@ -6562,11 +6549,11 @@ Kernel: %3 %4</translation>
</message> </message>
<message> <message>
<source>Browser Plugin Failure</source> <source>Browser Plugin Failure</source>
<translation>Brauseriplugina tõrge</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Could not save the native messaging script file for %1.</source> <source>Could not save the native messaging script file for %1.</source>
<translation>Programmiomase teatevahetuse skripti salvestamine brauseri %1 jaoks ebaõnnestus.</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Copy the given attribute to the clipboard. Defaults to &quot;password&quot; if not specified.</source> <source>Copy the given attribute to the clipboard. Defaults to &quot;password&quot; if not specified.</source>
@@ -6586,7 +6573,7 @@ Kernel: %3 %4</translation>
</message> </message>
<message> <message>
<source>ERROR: attribute %1 is ambiguous, it matches %2.</source> <source>ERROR: attribute %1 is ambiguous, it matches %2.</source>
<translation>VIGA: atribuut %1 on mitmeti tõlgendatav, palun täpsusta: %2</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Attribute &quot;%1&quot; not found.</source> <source>Attribute &quot;%1&quot; not found.</source>
@@ -6745,29 +6732,26 @@ Kernel: %3 %4</translation>
</message> </message>
<message> <message>
<source>path to a custom local config file</source> <source>path to a custom local config file</source>
<translation>kohandatud kohaliku seadistusfaili asukoht</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>WARNING: You are using an old key file format which KeePassXC may <source>WARNING: You are using an old key file format which KeePassXC may
stop supporting in the future. stop supporting in the future.
Please consider generating a new key file.</source> Please consider generating a new key file.</source>
<translation>HOIATUS: kasutad võtmefaili, mis on vanas vormingus, mille tugi võidakse <translation type="unfinished"/>
KeePassXC-st tulevikus eemaldada.
Palun genereeri selle asemele uus võtmefail.</translation>
</message> </message>
<message> <message>
<source>Argon2%1 (%2 rounds, %3 KB)</source> <source>Argon2%1 (%2 rounds, %3 KB)</source>
<translation>Argon2%1 (%2 raundi, %3 KB)</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Argon2d (KDBX 4 recommended)</source> <source>Argon2d (KDBX 4 recommended)</source>
<translation>Argon2d (KDBX 4 soovituslik)</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Argon2id (KDBX 4)</source> <source>Argon2id (KDBX 4)</source>
<translation>Argon2id (KDBX 4)</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>TOTP</source> <source>TOTP</source>
@@ -6779,31 +6763,15 @@ Palun genereeri selle asemele uus võtmefail.</translation>
</message> </message>
<message> <message>
<source>Unsupported key file version: %1</source> <source>Unsupported key file version: %1</source>
<translation>Toetamata võtmefaili versioon: %1</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Checksum mismatch! Key file may be corrupt.</source> <source>Checksum mismatch! Key file may be corrupt.</source>
<translation>Kontrollsumma ei klapi. Võtmefail võib olla rikutud.</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Unexpected key file data! Key file may be corrupt.</source> <source>Unexpected key file data! Key file may be corrupt.</source>
<translation>Ootamatud andmed võtmefailis. Võtmefail võib olla rikutud.</translation> <translation type="unfinished"/>
</message>
<message numerus="yes">
<source>Clearing the clipboard in %1 second(s)</source>
<translation><numerusform>Lõikepuhver puhastatakse %1 sekundi pärast</numerusform><numerusform>Lõikepuhver puhastatakse %1 sekundi pärast</numerusform></translation>
</message>
<message>
<source>lock all open databases</source>
<translation>Kõigi avatud andmebaaside lukustamine.</translation>
</message>
<message>
<source>Locked databases.</source>
<translation>Andmebaasid lukustatud.</translation>
</message>
<message>
<source>Database failed to lock.</source>
<translation>Andmebaasi lukustamine ebaõnnestus.</translation>
</message> </message>
</context> </context>
<context> <context>
@@ -6814,15 +6782,15 @@ Palun genereeri selle asemele uus võtmefail.</translation>
</message> </message>
<message> <message>
<source>Error writing to underlying device: </source> <source>Error writing to underlying device: </source>
<translation>Viga alusseadmesse kirjutamisel: </translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Error opening underlying device: </source> <source>Error opening underlying device: </source>
<translation>Viga alusseadme avamisel: </translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Error reading data from underlying device: </source> <source>Error reading data from underlying device: </source>
<translation>Viga alusseadmest andmete lugemisel: </translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Internal zlib error when decompressing: </source> <source>Internal zlib error when decompressing: </source>
@@ -7136,15 +7104,15 @@ Palun genereeri selle asemele uus võtmefail.</translation>
</message> </message>
<message> <message>
<source>No agent running, cannot add identity.</source> <source>No agent running, cannot add identity.</source>
<translation>Ükski agent ei tööta, identiteeti pole võimalik lisada.</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>No agent running, cannot remove identity.</source> <source>No agent running, cannot remove identity.</source>
<translation>Ükski agent ei tööta, identiteeti pole võimalik eemaldada.</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Agent refused this identity. Possible reasons include:</source> <source>Agent refused this identity. Possible reasons include:</source>
<translation>Agent lükkas selle identiteedi tagasi. Võimalikud põhjused:</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>The key has already been added.</source> <source>The key has already been added.</source>
@@ -7152,19 +7120,19 @@ Palun genereeri selle asemele uus võtmefail.</translation>
</message> </message>
<message> <message>
<source>Restricted lifetime is not supported by the agent (check options).</source> <source>Restricted lifetime is not supported by the agent (check options).</source>
<translation>Agent ei toeta piiratud kehtivusaega (kontrolli seadeid).</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>A confirmation request is not supported by the agent (check options).</source> <source>A confirmation request is not supported by the agent (check options).</source>
<translation>Agent ei toeta kinnitustaotlusi (kontrolli seadeid).</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Key identity ownership conflict. Refusing to add.</source> <source>Key identity ownership conflict. Refusing to add.</source>
<translation>Võtme identiteedi omanduse konflikt. Lisamisest keelduti.</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>No agent running, cannot list identities.</source> <source>No agent running, cannot list identities.</source>
<translation>Ükski agent ei tööta, identiteete pole võimalik loetleda.</translation> <translation type="unfinished"/>
</message> </message>
</context> </context>
<context> <context>
@@ -7410,11 +7378,11 @@ Palun genereeri selle asemele uus võtmefail.</translation>
</message> </message>
<message> <message>
<source>Exporting changed certificate</source> <source>Exporting changed certificate</source>
<translation>Muudetud sertifikaadi eksportimine</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>The exported certificate is not the same as the one in use. Do you want to export the current certificate?</source> <source>The exported certificate is not the same as the one in use. Do you want to export the current certificate?</source>
<translation>Eksporditav sertifikaat pole sama, mis kasutusel on. Kas tahad ikkagi praeguse sertifikaadi eksportida?</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Signer:</source> <source>Signer:</source>
@@ -7442,89 +7410,93 @@ Palun genereeri selle asemele uus võtmefail.</translation>
</message> </message>
<message> <message>
<source>Generate new certificate</source> <source>Generate new certificate</source>
<translation>Genereeri uus sertifikaat</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Import existing certificate</source> <source>Import existing certificate</source>
<translation>Impordi olemasolev sertifikaat</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Export own certificate</source> <source>Export own certificate</source>
<translation>Ekspordi oma sertifikaat</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Known shares</source> <source>Known shares</source>
<translation>Teadaolevad jagatud ressursid</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Trust selected certificate</source> <source>Trust selected certificate</source>
<translation>Usalda valitud sertifikaati</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Ask whether to trust the selected certificate every time</source> <source>Ask whether to trust the selected certificate every time</source>
<translation>Küsi iga kord, kas usaldada valitud sertifikaati</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Untrust selected certificate</source> <source>Untrust selected certificate</source>
<translation>Märgi valitud sertifikaat ebausaldusväärseks</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Remove selected certificate</source> <source>Remove selected certificate</source>
<translation>Eemalda valitud sertifikaat</translation> <translation type="unfinished"/>
</message> </message>
</context> </context>
<context> <context>
<name>ShareExport</name> <name>ShareExport</name>
<message> <message>
<source>Overwriting signed share container is not supported - export prevented</source> <source>Overwriting signed share container is not supported - export prevented</source>
<translation>Allkirjastatud jagamisümbriku ülekirjutamist ei toetata midagi ei eksporditud</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Could not write export container (%1)</source> <source>Could not write export container (%1)</source>
<translation>Ei saanud ekspordikonteinerit kirjutada (%1)</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Could not embed signature: Could not open file to write (%1)</source> <source>Could not embed signature: Could not open file to write (%1)</source>
<translation>Allkirja põimimine polnud võimalik: faili ei õnnestunud kirjutamiseks avada (%1)</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Could not embed signature: Could not write file (%1)</source> <source>Could not embed signature: Could not write file (%1)</source>
<translation>Allkirja põimimine polnud võimalik: faili ei õnnestunud kirjutada (%1)</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Could not embed database: Could not open file to write (%1)</source> <source>Could not embed database: Could not open file to write (%1)</source>
<translation>Andmebaasi põimimine polnud võimalik: faili ei õnnestunud kirjutamiseks avada (%1)</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Could not embed database: Could not write file (%1)</source> <source>Could not embed database: Could not write file (%1)</source>
<translation>Andmebaasi põimimine polnud võimalik: faili ei õnnestunud kirjutada (%1)</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Overwriting unsigned share container is not supported - export prevented</source> <source>Overwriting unsigned share container is not supported - export prevented</source>
<translation>Allkirjastamata jagamisümbriku ülekirjutamist ei toetata midagi ei eksporditud</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Could not write export container</source> <source>Could not write export container</source>
<translation>Ei saanud ekspordikonteinerit kirjutada</translation> <translation type="unfinished"/>
</message>
<message>
<source>Unexpected export error occurred</source>
<translation type="unfinished"/>
</message> </message>
</context> </context>
<context> <context>
<name>ShareImport</name> <name>ShareImport</name>
<message> <message>
<source>Import from container without signature</source> <source>Import from container without signature</source>
<translation>Impordi ilma signatuurita konteinerist</translation> <translation type="unfinished"/>
</message> </message>
<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>We cannot verify the source of the shared container because it is not signed. Do you really want to import from %1?</source>
<translation>Selle jagatud ümbriku allikat pole võimalik verifitseerida, kuna see on allkirjastamata. Kas soovid siiski asukohast %1 importida?</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Import from container with certificate</source> <source>Import from container with certificate</source>
<translation>Sertifikaadiga ümbrikust importimine</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Do you want to trust %1 with the fingerprint of %2 from %3?</source> <source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
<translation>Kas %1 on usaldusväärne allkirjastaja? Sertifikaadi sõrmejälg on %2 ja asukoht %3. {1 ?} {2 ?}</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Not this time</source> <source>Not this time</source>
@@ -7544,7 +7516,7 @@ Palun genereeri selle asemele uus võtmefail.</translation>
</message> </message>
<message> <message>
<source>Signed share container are not supported - import prevented</source> <source>Signed share container are not supported - import prevented</source>
<translation>Allkirjastatud jagamisümbrikke ei toetata midagi ei imporditud</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>File is not readable</source> <source>File is not readable</source>
@@ -7552,11 +7524,11 @@ Palun genereeri selle asemele uus võtmefail.</translation>
</message> </message>
<message> <message>
<source>Invalid sharing container</source> <source>Invalid sharing container</source>
<translation>Sobimatu jagamisümbrik</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Untrusted import prevented</source> <source>Untrusted import prevented</source>
<translation>Ebausaldusväärsest allikast importimisest hoiduti</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Successful signed import</source> <source>Successful signed import</source>
@@ -7564,7 +7536,7 @@ Palun genereeri selle asemele uus võtmefail.</translation>
</message> </message>
<message> <message>
<source>Unsigned share container are not supported - import prevented</source> <source>Unsigned share container are not supported - import prevented</source>
<translation>Allkirjastamata jagamisümbrikke ei toetata midagi ei imporditud</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Successful unsigned import</source> <source>Successful unsigned import</source>
@@ -7574,16 +7546,20 @@ Palun genereeri selle asemele uus võtmefail.</translation>
<source>File does not exist</source> <source>File does not exist</source>
<translation>Faili ei ole olemas</translation> <translation>Faili ei ole olemas</translation>
</message> </message>
<message>
<source>Unknown share container type</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>ShareObserver</name> <name>ShareObserver</name>
<message> <message>
<source>Import from %1 failed (%2)</source> <source>Import from %1 failed (%2)</source>
<translation>Import asukohast %1 ebaõnnestus (%2)</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Import from %1 successful (%2)</source> <source>Import from %1 successful (%2)</source>
<translation>Import asukohast %1 õnnestus (%2)</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Imported from %1</source> <source>Imported from %1</source>
@@ -7591,15 +7567,15 @@ Palun genereeri selle asemele uus võtmefail.</translation>
</message> </message>
<message> <message>
<source>Export to %1 failed (%2)</source> <source>Export to %1 failed (%2)</source>
<translation>Eksport asukohta %1 ebaõnnestus (%2)</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Export to %1 successful (%2)</source> <source>Export to %1 successful (%2)</source>
<translation>Eksport asukohta %1 õnnestus (%2)</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Export to %1</source> <source>Export to %1</source>
<translation>Ekspordi asukohta %1</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Multiple import source path to %1 in %2</source> <source>Multiple import source path to %1 in %2</source>
@@ -7844,7 +7820,7 @@ Näide: JBSWY3DPEHPK3PXP</translation>
</message> </message>
<message> <message>
<source>%1 Invalid slot specified - %2</source> <source>%1 Invalid slot specified - %2</source>
<translation>%1: määrati sobimatu pesa %2</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>The YubiKey interface has not been initialized.</source> <source>The YubiKey interface has not been initialized.</source>
@@ -7883,7 +7859,7 @@ Näide: JBSWY3DPEHPK3PXP</translation>
</message> </message>
<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> <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;Kui sul on &lt;a href=&quot;https://www.yubico.com/&quot;&gt;YubiKey&lt;/a&gt; turvavõti, võid lisaturvalisuse nimel seda kasutada.&lt;/p&gt;&lt;p&gt;YubiKey ühe pesa peab programmeerima &lt;a href=&quot;https://www.yubico.com/products/services-software/personalization-tools/challenge-response/&quot;&gt;HMAC-SHA1 pretensiooni ja vastusena&lt;/a&gt;.&lt;/p&gt;</translation> <translation>&lt;p&gt;Kui sul on &lt;a href=&quot;https://www.yubico.com/&quot;&gt;YubiKey&lt;/a&gt;, võid lisaturvalisuse nimel seda kasutada.&lt;/p&gt;&lt;p&gt;Ühe YubiKey pesa peab programmeerima &lt;a href=&quot;https://www.yubico.com/products/services-software/personalization-tools/challenge-response/&quot;&gt;HMAC-SHA1 pretensiooni ja vastusena&lt;/a&gt;.&lt;/p&gt;</translation>
</message> </message>
<message> <message>
<source>Refresh hardware tokens</source> <source>Refresh hardware tokens</source>

View File

@@ -139,10 +139,6 @@
<source>You must restart the application to set the new language. Would you like to restart now?</source> <source>You must restart the application to set the new language. Would you like to restart now?</source>
<translation>Ohjelma täytyy käynnistää uudelleen, jotta uusi kieli voidaan ottaa käyttöön. Haluatko käynnistää uudelleen nyt?</translation> <translation>Ohjelma täytyy käynnistää uudelleen, jotta uusi kieli voidaan ottaa käyttöön. Haluatko käynnistää uudelleen nyt?</translation>
</message> </message>
<message>
<source>Monochrome</source>
<translation>Mustavalkoinen</translation>
</message>
</context> </context>
<context> <context>
<name>ApplicationSettingsWidgetGeneral</name> <name>ApplicationSettingsWidgetGeneral</name>
@@ -1353,11 +1349,11 @@ Jos sinulla ei ole avaintiedostoa, jätä kenttä tyhjäksi.</translation>
</message> </message>
<message> <message>
<source>Old key file format</source> <source>Old key file format</source>
<translation>Vanha avaintiedostomuoto</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>You are using an old key file format which KeePassXC may&lt;br&gt;stop supporting in the future.&lt;br&gt;&lt;br&gt;Please consider generating a new key file by going to:&lt;br&gt;&lt;strong&gt;Database / Database Security / Change Key File.&lt;/strong&gt;&lt;br&gt;</source> <source>You are using an old key file format which KeePassXC may&lt;br&gt;stop supporting in the future.&lt;br&gt;&lt;br&gt;Please consider generating a new key file by going to:&lt;br&gt;&lt;strong&gt;Database / Database Security / Change Key File.&lt;/strong&gt;&lt;br&gt;</source>
<translation>Käytät vanhaa avaintiedostomuotoa joka ei ole&lt;br&gt;tuettu tulevaisuudessa.&lt;br&gt;&lt;br&gt;Ole hyvä ja harkitse uuden avaintiedoston luomista menemällä:&lt;br&gt;&lt;strong&gt;Tietokanta / Tietokannan turvallisuus / Vaihda avaintiedosto&lt;/strong&gt;&lt;br&gt;</translation> <translation type="unfinished"/>
</message> </message>
</context> </context>
<context> <context>
@@ -2293,13 +2289,12 @@ Ota turvallinen tallennus pois käytöstä ja yritä uudelleen?</translation>
</message> </message>
<message> <message>
<source>Invalid Entry</source> <source>Invalid Entry</source>
<translation>Virheellinen tietue</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>An external merge operation has invalidated this entry. <source>An external merge operation has invalidated this entry.
Unfortunately, any changes made have been lost.</source> Unfortunately, any changes made have been lost.</source>
<translation>Ulkopuolinen yhdistämisoperaatio on muuttanut tämän tietueen virheelliseksi. <translation type="unfinished"/>
Valitettavasti kaikki siihen tehdyt muutokset ovat kadonneet.</translation>
</message> </message>
</context> </context>
<context> <context>
@@ -2498,14 +2493,6 @@ Valitettavasti kaikki siihen tehdyt muutokset ovat kadonneet.</translation>
<source>Use this entry only with HTTP Basic Auth</source> <source>Use this entry only with HTTP Basic Auth</source>
<translation>Käytä tietuetta vain HTTP Basic -autentikaatioon</translation> <translation>Käytä tietuetta vain HTTP Basic -autentikaatioon</translation>
</message> </message>
<message>
<source>Do not send this setting to the browser for HTTP Auth dialogs. If enabled, HTTP Auth dialogs will not show this entry for selection.</source>
<translation>Ä lähetä tätä tietuetta HTTP-autentikaatiodialogeihin. Jos asetus on päällä, tämä tietue näkyy vain tavallisissa kirjautumiskentissä.</translation>
</message>
<message>
<source>Do not use this entry with HTTP Basic Auth</source>
<translation>Ä käytä tätä tietuetta HTTP Basic -autentikaatioon</translation>
</message>
</context> </context>
<context> <context>
<name>EditEntryWidgetHistory</name> <name>EditEntryWidgetHistory</name>
@@ -2630,7 +2617,7 @@ Valitettavasti kaikki siihen tehdyt muutokset ovat kadonneet.</translation>
</message> </message>
<message> <message>
<source>Edit Entry</source> <source>Edit Entry</source>
<translation>Muokkaa tietuetta</translation> <translation type="unfinished"/>
</message> </message>
</context> </context>
<context> <context>
@@ -2934,7 +2921,7 @@ Tuetut tyypit ovat: %1.</translation>
</message> </message>
<message> <message>
<source>Edit Group</source> <source>Edit Group</source>
<translation>Muokkaa ryhmää</translation> <translation type="unfinished"/>
</message> </message>
</context> </context>
<context> <context>
@@ -3457,12 +3444,12 @@ Oletko varma, että haluat lisätä tämän tiedoston?</translation>
</message> </message>
<message> <message>
<source>Default Sequence</source> <source>Default Sequence</source>
<translation>Oletussekvenssi</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>&lt;tr&gt;&lt;td&gt;&lt;b&gt;%1&lt;/b&gt;:&lt;/td&gt;&lt;td&gt;%2&lt;/td&gt;&lt;/tr&gt;</source> <source>&lt;tr&gt;&lt;td&gt;&lt;b&gt;%1&lt;/b&gt;:&lt;/td&gt;&lt;td&gt;%2&lt;/td&gt;&lt;/tr&gt;</source>
<comment>attributes line</comment> <comment>attributes line</comment>
<translation>&lt;tr&gt;&lt;td&gt;&lt;b&gt;%1&lt;/b&gt;:&lt;/td&gt;&lt;td&gt;%2&lt;/td&gt;&lt;/tr&gt;</translation> <translation type="unfinished"/>
</message> </message>
</context> </context>
<context> <context>
@@ -4368,14 +4355,26 @@ Viesti: %2</translation>
<source>Select a key file</source> <source>Select a key file</source>
<translation>Valitse avaintiedosto</translation> <translation>Valitse avaintiedosto</translation>
</message> </message>
<message>
<source>Key file selection</source>
<translation>Avaintiedoston valinta</translation>
</message>
<message> <message>
<source>Browse for key file</source> <source>Browse for key file</source>
<translation>Selaa avaintiedostoa</translation> <translation>Selaa avaintiedostoa</translation>
</message> </message>
<message>
<source>Browse...</source>
<translation>Selaa...</translation>
</message>
<message> <message>
<source>Generate a new key file</source> <source>Generate a new key file</source>
<translation>Luo uusi avaintiedosto</translation> <translation>Luo uusi avaintiedosto</translation>
</message> </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> <message>
<source>Invalid Key File</source> <source>Invalid Key File</source>
<translation>Virheellinen avaintiedosto</translation> <translation>Virheellinen avaintiedosto</translation>
@@ -4396,23 +4395,11 @@ Haluatko jatkaa käyttämällä tätä tiedostoa?</translation>
</message> </message>
<message> <message>
<source>Old key file format</source> <source>Old key file format</source>
<translation>Vanha avaintiedostomuoto</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>You selected a key file in an old format which KeePassXC&lt;br&gt;may stop supporting in the future.&lt;br&gt;&lt;br&gt;Please consider generating a new key file instead.</source> <source>You selected a key file in an old format which KeePassXC&lt;br&gt;may stop supporting in the future.&lt;br&gt;&lt;br&gt;Please consider generating a new key file instead.</source>
<translation>Käytät vanhaa avaintiedostomuotoa joka ei ole&lt;br&gt;välttämättä tuettu tulevaisuudessa.&lt;br&gt;&lt;br&gt;Ole hyvä ja harkitse uuden avaintiedoston luomista.</translation> <translation type="unfinished"/>
</message>
<message>
<source>Generate a new key file or choose an existing one to protect your database.</source>
<translation>Kuo uusi avaintiedosto, tai avaa jo olemassa oleva suojataksesi tietokantasi.</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>Browse</source>
<translation>Selaa...</translation>
</message> </message>
</context> </context>
<context> <context>
@@ -4879,7 +4866,7 @@ Bugeja ja ongelmia voi esiintyä. Tämä versio ei ole tarkoitettu päivittäise
</message> </message>
<message> <message>
<source>Always on Top</source> <source>Always on Top</source>
<translation>Aina päällimmäisenä</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Hide Usernames</source> <source>Hide Usernames</source>
@@ -5413,6 +5400,10 @@ Bugeja ja ongelmia voi esiintyä. Tämä versio ei ole tarkoitettu päivittäise
<source>Hex</source> <source>Hex</source>
<translation>Heksa</translation> <translation>Heksa</translation>
</message> </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>Poissuljetut kirjaimet: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;&quot;</translation>
</message>
<message> <message>
<source>Generated password</source> <source>Generated password</source>
<translation>Luotu salasana</translation> <translation>Luotu salasana</translation>
@@ -5513,10 +5504,6 @@ Bugeja ja ongelmia voi esiintyä. Tämä versio ei ole tarkoitettu päivittäise
<source>Special Characters</source> <source>Special Characters</source>
<translation>Erikoismerkit</translation> <translation>Erikoismerkit</translation>
</message> </message>
<message>
<source>Excluded characters: &quot;0&quot;, &quot;O&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;|&quot;, &quot;G&quot;, &quot;6&quot;, &quot;B&quot;, &quot;8&quot;, &quot;&quot;</source>
<translation>Suodata pois kirjaimet &quot;0&quot;, &quot;O&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;|&quot;, &quot;G&quot;, &quot;6&quot;, &quot;B&quot;, &quot;8&quot;, &quot;&quot;</translation>
</message>
</context> </context>
<context> <context>
<name>QApplication</name> <name>QApplication</name>
@@ -6746,29 +6733,26 @@ Ydin: %3 %4</translation>
</message> </message>
<message> <message>
<source>path to a custom local config file</source> <source>path to a custom local config file</source>
<translation>polku mukautettuun asetustiedostoon</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>WARNING: You are using an old key file format which KeePassXC may <source>WARNING: You are using an old key file format which KeePassXC may
stop supporting in the future. stop supporting in the future.
Please consider generating a new key file.</source> Please consider generating a new key file.</source>
<translation>Käytät vanhaa avaintiedostomuotoa joka ei ole <translation type="unfinished"/>
välttämättä tuettu tulevaisuudessa.
Ole hyvä ja harkitse uuden avaintiedoston luomista.</translation>
</message> </message>
<message> <message>
<source>Argon2%1 (%2 rounds, %3 KB)</source> <source>Argon2%1 (%2 rounds, %3 KB)</source>
<translation>Argon2%1 (%2 kierrosta, %3 KB)</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Argon2d (KDBX 4 recommended)</source> <source>Argon2d (KDBX 4 recommended)</source>
<translation>Argon2d (KDBX 4 - suositeltu)</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Argon2id (KDBX 4)</source> <source>Argon2id (KDBX 4)</source>
<translation>Argon2id (KDBX 4)</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>TOTP</source> <source>TOTP</source>
@@ -6780,31 +6764,15 @@ Ole hyvä ja harkitse uuden avaintiedoston luomista.</translation>
</message> </message>
<message> <message>
<source>Unsupported key file version: %1</source> <source>Unsupported key file version: %1</source>
<translation>Avaintiedosto joka ei ole tuettu, versio: %1</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Checksum mismatch! Key file may be corrupt.</source> <source>Checksum mismatch! Key file may be corrupt.</source>
<translation>Tarkistussumma on virheellinen! Avaintiedosto voi olla korruptoitunut.</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Unexpected key file data! Key file may be corrupt.</source> <source>Unexpected key file data! Key file may be corrupt.</source>
<translation>Odottamatonta avaintiedoston dataa havaittu. Avaintiedosto voi olla korruptoitunut.</translation> <translation type="unfinished"/>
</message>
<message numerus="yes">
<source>Clearing the clipboard in %1 second(s)</source>
<translation><numerusform>Tyhjennetään leikepöytä %1 sekunnin kuluttua...</numerusform><numerusform>Tyhjennetään leikepöytä %1 sekunnin kuluttua...</numerusform></translation>
</message>
<message>
<source>lock all open databases</source>
<translation>lukitse kaikki avoimet tietokannat</translation>
</message>
<message>
<source>Locked databases.</source>
<translation>Lukitut tietokannat.</translation>
</message>
<message>
<source>Database failed to lock.</source>
<translation>Tietokannan lukitus ei onnistunut.</translation>
</message> </message>
</context> </context>
<context> <context>
@@ -7508,6 +7476,10 @@ Ole hyvä ja harkitse uuden avaintiedoston luomista.</translation>
<source>Could not write export container</source> <source>Could not write export container</source>
<translation>Vietyä säiliötä ei voitu kirjoittaa</translation> <translation>Vietyä säiliötä ei voitu kirjoittaa</translation>
</message> </message>
<message>
<source>Unexpected export error occurred</source>
<translation>Tapahtui odottamaton vientivirhe</translation>
</message>
</context> </context>
<context> <context>
<name>ShareImport</name> <name>ShareImport</name>
@@ -7575,6 +7547,10 @@ Ole hyvä ja harkitse uuden avaintiedoston luomista.</translation>
<source>File does not exist</source> <source>File does not exist</source>
<translation>Tiedostoa ei ole olemassa</translation> <translation>Tiedostoa ei ole olemassa</translation>
</message> </message>
<message>
<source>Unknown share container type</source>
<translation>Tuntematon jaetun säiliön tyyppi</translation>
</message>
</context> </context>
<context> <context>
<name>ShareObserver</name> <name>ShareObserver</name>

View File

@@ -139,10 +139,6 @@
<source>You must restart the application to set the new language. Would you like to restart now?</source> <source>You must restart the application to set the new language. Would you like to restart now?</source>
<translation>Pour appliquer la nouvelle langue, vous devez redémarrer lapplication. Voulez-vous la démarrer maintenant?</translation> <translation>Pour appliquer la nouvelle langue, vous devez redémarrer lapplication. Voulez-vous la démarrer maintenant?</translation>
</message> </message>
<message>
<source>Monochrome</source>
<translation>Monochrome</translation>
</message>
</context> </context>
<context> <context>
<name>ApplicationSettingsWidgetGeneral</name> <name>ApplicationSettingsWidgetGeneral</name>
@@ -944,7 +940,7 @@ chrome-laptop</translation>
</message> </message>
<message> <message>
<source>&lt;b&gt;Warning:&lt;/b&gt; The following options can be dangerous!</source> <source>&lt;b&gt;Warning:&lt;/b&gt; The following options can be dangerous!</source>
<translation>&lt;b&gt;Avertissement:&lt;/b&gt; Les options suivantes peuvent être dangereuses</translation> <translation>&lt;b&gt;Avertissement :&lt;/b&gt; Les options suivantes peuvent être dangereuses</translation>
</message> </message>
<message> <message>
<source>Executable Files</source> <source>Executable Files</source>
@@ -2499,14 +2495,6 @@ Malheureusement, les changements effectués ont été perdus.</translation>
<source>Use this entry only with HTTP Basic Auth</source> <source>Use this entry only with HTTP Basic Auth</source>
<translation>Nutiliser cette entrée quavec lauthentification HTTP Basic</translation> <translation>Nutiliser cette entrée quavec lauthentification HTTP Basic</translation>
</message> </message>
<message>
<source>Do not send this setting to the browser for HTTP Auth dialogs. If enabled, HTTP Auth dialogs will not show this entry for selection.</source>
<translation>Ne pas envoyer ce paramètre au navigateur pour les boîtes de dialogue dauthentification HTTP. Si cette option est activée, cette entrée ne sera pas présentée comme possibilité de sélection par les boîtes de dialogue dauthentification HTTP.</translation>
</message>
<message>
<source>Do not use this entry with HTTP Basic Auth</source>
<translation>Ne pas utiliser cette entrée avec lauthentification HTTP Basic</translation>
</message>
</context> </context>
<context> <context>
<name>EditEntryWidgetHistory</name> <name>EditEntryWidgetHistory</name>
@@ -4367,14 +4355,26 @@ Message : %2</translation>
<source>Select a key file</source> <source>Select a key file</source>
<translation>Sélectionner un fichier clé</translation> <translation>Sélectionner un fichier clé</translation>
</message> </message>
<message>
<source>Key file selection</source>
<translation>Sélection du fichier clé</translation>
</message>
<message> <message>
<source>Browse for key file</source> <source>Browse for key file</source>
<translation>Rechercher un fichier clé</translation> <translation>Rechercher un fichier clé</translation>
</message> </message>
<message>
<source>Browse...</source>
<translation>Parcourir</translation>
</message>
<message> <message>
<source>Generate a new key file</source> <source>Generate a new key file</source>
<translation>Générer un nouveau fichier clé</translation> <translation>Générer un nouveau fichier clé</translation>
</message> </message>
<message>
<source>Note: Do not use a file that may change as that will prevent you from unlocking your database!</source>
<translation>Note : Nutilisez pas un fichier qui pourrait changer, car cela pourrait vous empêcher de déverrouiller votre base de données.</translation>
</message>
<message> <message>
<source>Invalid Key File</source> <source>Invalid Key File</source>
<translation>Le fichier clé est invalide</translation> <translation>Le fichier clé est invalide</translation>
@@ -4401,18 +4401,6 @@ Voulez-vous vraiment poursuivre avec ce fichier?</translation>
<source>You selected a key file in an old format which KeePassXC&lt;br&gt;may stop supporting in the future.&lt;br&gt;&lt;br&gt;Please consider generating a new key file instead.</source> <source>You selected a key file in an old format which KeePassXC&lt;br&gt;may stop supporting in the future.&lt;br&gt;&lt;br&gt;Please consider generating a new key file instead.</source>
<translation>Vous utilisez un ancien format de fichier clé que KeePassXC &lt;br&gt;pourrait ne plus prendre en charge à lavenir.&lt;br&gt;&lt;br&gt;Veuillez envisager de plutôt générer un nouveau fichier clé.</translation> <translation>Vous utilisez un ancien format de fichier clé que KeePassXC &lt;br&gt;pourrait ne plus prendre en charge à lavenir.&lt;br&gt;&lt;br&gt;Veuillez envisager de plutôt générer un nouveau fichier clé.</translation>
</message> </message>
<message>
<source>Generate a new key file or choose an existing one to protect your database.</source>
<translation>Générez un nouveau fichier clé ou choisissez un fichier clé existant afin de protéger votre base de données.</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 : Nutilisez PAS un fichier qui pourrait être modifié, car cela vous empêchera de déverrouiller votre base de données.</translation>
</message>
<message>
<source>Browse</source>
<translation>Parcourir</translation>
</message>
</context> </context>
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
@@ -4516,7 +4504,7 @@ Voulez-vous vraiment poursuivre avec ce fichier?</translation>
<source>WARNING: You are using an unstable build of KeePassXC! <source>WARNING: You are using an unstable build of KeePassXC!
There is a high risk of corruption, maintain a backup of your databases. There is a high risk of corruption, maintain a backup of your databases.
This version is not meant for production use.</source> 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 du KeePassXC.
Le risque de corruption est élevé, conservez une sauvegarde de vos bases de données. Le risque de corruption est élevé, conservez une sauvegarde de vos bases de données.
Cette version nest pas destinée à un usage régulier.</translation> Cette version nest pas destinée à un usage régulier.</translation>
</message> </message>
@@ -4527,7 +4515,7 @@ Cette version nest pas destinée à un usage régulier.</translation>
<message> <message>
<source>WARNING: Your Qt version may cause KeePassXC to crash with an On-Screen Keyboard! <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> We recommend you use the AppImage available on our downloads page.</source>
<translation>AVERTISSEMENT: Votre version de Qt pourrait faire planter KeePassXC avec un clavier virtuel. <translation>AVERTISSEMENT : Votre version de Qt pourrait faire planter KeePassXC avec un clavier virtuel.
Nous recommandons dutiliser lAppImage proposée sur notre page de téléchargement.</translation> Nous recommandons dutiliser lAppImage proposée sur notre page de téléchargement.</translation>
</message> </message>
<message> <message>
@@ -4878,7 +4866,7 @@ Attendez-vous à des bogues et des problèmes mineurs. Cette version nest pas
</message> </message>
<message> <message>
<source>Always on Top</source> <source>Always on Top</source>
<translation>Toujours sur le dessus</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Hide Usernames</source> <source>Hide Usernames</source>
@@ -5251,7 +5239,7 @@ Attendez-vous à des bogues et des problèmes mineurs. Cette version nest pas
</message> </message>
<message> <message>
<source>Warning: Caps Lock enabled!</source> <source>Warning: Caps Lock enabled!</source>
<translation>Avertissement: Les majuscules sont verrouillées</translation> <translation>Avertissement : Les majuscules sont verrouillées</translation>
</message> </message>
</context> </context>
<context> <context>
@@ -5412,6 +5400,10 @@ Attendez-vous à des bogues et des problèmes mineurs. Cette version nest pas
<source>Hex</source> <source>Hex</source>
<translation>Hexadécimal</translation> <translation>Hexadécimal</translation>
</message> </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>Les caractères exclus sont : « 0 », « 1 », « l », « I », « O », « | », « . »</translation>
</message>
<message> <message>
<source>Generated password</source> <source>Generated password</source>
<translation>Mot de passe généré</translation> <translation>Mot de passe généré</translation>
@@ -5512,10 +5504,6 @@ Attendez-vous à des bogues et des problèmes mineurs. Cette version nest pas
<source>Special Characters</source> <source>Special Characters</source>
<translation>Caractères spéciaux</translation> <translation>Caractères spéciaux</translation>
</message> </message>
<message>
<source>Excluded characters: &quot;0&quot;, &quot;O&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;|&quot;, &quot;G&quot;, &quot;6&quot;, &quot;B&quot;, &quot;8&quot;, &quot;&quot;</source>
<translation>Caractères exclus : « 0 », « O », « 1 », « l », « I », « | », « G », « 6 », « B », « 8 », «  »</translation>
</message>
</context> </context>
<context> <context>
<name>QApplication</name> <name>QApplication</name>
@@ -6788,22 +6776,6 @@ Veuillez envisager de générer un nouveau fichier clé.</translation>
<source>Unexpected key file data! Key file may be corrupt.</source> <source>Unexpected key file data! Key file may be corrupt.</source>
<translation>Les données du fichier clé ne sont pas celles attendues. Le fichier clé pourrait être corrompu.</translation> <translation>Les données du fichier clé ne sont pas celles attendues. Le fichier clé pourrait être corrompu.</translation>
</message> </message>
<message numerus="yes">
<source>Clearing the clipboard in %1 second(s)</source>
<translation><numerusform>Effacement du presse-papiers dans %1 seconde</numerusform><numerusform>Effacement du presse-papiers dans %1 secondes</numerusform></translation>
</message>
<message>
<source>lock all open databases</source>
<translation>verrouiller toutes les bases de données ouvertes</translation>
</message>
<message>
<source>Locked databases.</source>
<translation>Les bases de données ont é verrouillées.</translation>
</message>
<message>
<source>Database failed to lock.</source>
<translation>Échec de verrouillage de la base de données.</translation>
</message>
</context> </context>
<context> <context>
<name>QtIOCompressor</name> <name>QtIOCompressor</name>
@@ -6989,7 +6961,7 @@ Veuillez envisager de générer un nouveau fichier clé.</translation>
</message> </message>
<message> <message>
<source>millions of times</source> <source>millions of times</source>
<translation>des millions de fois</translation> <translation>millions de fois</translation>
</message> </message>
<message> <message>
<source>Edit Entry...</source> <source>Edit Entry...</source>
@@ -7289,7 +7261,7 @@ Veuillez envisager de générer un nouveau fichier clé.</translation>
</message> </message>
<message> <message>
<source>&lt;b&gt;Warning:&lt;/b&gt; </source> <source>&lt;b&gt;Warning:&lt;/b&gt; </source>
<translation>&lt;b&gt;Avertissement:&lt;/b&gt;</translation> <translation>&lt;/b&gt;Avertissement :&lt;/b&gt;</translation>
</message> </message>
<message> <message>
<source>Save current changes to activate the plugin and enable editing of this section.</source> <source>Save current changes to activate the plugin and enable editing of this section.</source>
@@ -7506,6 +7478,10 @@ Veuillez envisager de générer un nouveau fichier clé.</translation>
<source>Could not write export container</source> <source>Could not write export container</source>
<translation>Impossible décrire dans le conteneur dexportation</translation> <translation>Impossible décrire dans le conteneur dexportation</translation>
</message> </message>
<message>
<source>Unexpected export error occurred</source>
<translation>Une erreur dexportation inattendue est survenue</translation>
</message>
</context> </context>
<context> <context>
<name>ShareImport</name> <name>ShareImport</name>
@@ -7573,6 +7549,10 @@ Veuillez envisager de générer un nouveau fichier clé.</translation>
<source>File does not exist</source> <source>File does not exist</source>
<translation>Le fichier nexiste pas</translation> <translation>Le fichier nexiste pas</translation>
</message> </message>
<message>
<source>Unknown share container type</source>
<translation>Le type de conteneur de partage est inconnu</translation>
</message>
</context> </context>
<context> <context>
<name>ShareObserver</name> <name>ShareObserver</name>
@@ -7839,7 +7819,7 @@ Exemple : JBSWY3DPEHPK3PXP</translation>
</message> </message>
<message> <message>
<source>Passive</source> <source>Passive</source>
<translation>Passive</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>%1 Invalid slot specified - %2</source> <source>%1 Invalid slot specified - %2</source>

View File

@@ -139,10 +139,6 @@
<source>You must restart the application to set the new language. Would you like to restart now?</source> <source>You must restart the application to set the new language. Would you like to restart now?</source>
<translation>Morate ponovo pokrenuti aplikaciju kako biste postavili novi jezik. Želite li ju ponovo pokrenuti sada?</translation> <translation>Morate ponovo pokrenuti aplikaciju kako biste postavili novi jezik. Želite li ju ponovo pokrenuti sada?</translation>
</message> </message>
<message>
<source>Monochrome</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>ApplicationSettingsWidgetGeneral</name> <name>ApplicationSettingsWidgetGeneral</name>
@@ -2488,14 +2484,6 @@ Unfortunately, any changes made have been lost.</source>
<source>Use this entry only with HTTP Basic Auth</source> <source>Use this entry only with HTTP Basic Auth</source>
<translation>Koristi ovu stavku samo s HTTP Basic Auth</translation> <translation>Koristi ovu stavku samo s HTTP Basic Auth</translation>
</message> </message>
<message>
<source>Do not send this setting to the browser for HTTP Auth dialogs. If enabled, HTTP Auth dialogs will not show this entry for selection.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Do not use this entry with HTTP Basic Auth</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>EditEntryWidgetHistory</name> <name>EditEntryWidgetHistory</name>
@@ -4338,14 +4326,26 @@ Message: %2</source>
<source>Select a key file</source> <source>Select a key file</source>
<translation>Odaberite datoteku ključa </translation> <translation>Odaberite datoteku ključa </translation>
</message> </message>
<message>
<source>Key file selection</source>
<translation>Odabir datoteke ključa</translation>
</message>
<message> <message>
<source>Browse for key file</source> <source>Browse for key file</source>
<translation>Potraži datoteku ključa</translation> <translation>Potraži datoteku ključa</translation>
</message> </message>
<message>
<source>Browse...</source>
<translation>Pretraživanje...</translation>
</message>
<message> <message>
<source>Generate a new key file</source> <source>Generate a new key file</source>
<translation>Proizvedi novu datoteku ključa</translation> <translation>Proizvedi novu datoteku ključa</translation>
</message> </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> <message>
<source>Invalid Key File</source> <source>Invalid Key File</source>
<translation type="unfinished"/> <translation type="unfinished"/>
@@ -4372,18 +4372,6 @@ Are you sure you want to continue with this file?</source>
<source>You selected a key file in an old format which KeePassXC&lt;br&gt;may stop supporting in the future.&lt;br&gt;&lt;br&gt;Please consider generating a new key file instead.</source> <source>You selected a key file in an old format which KeePassXC&lt;br&gt;may stop supporting in the future.&lt;br&gt;&lt;br&gt;Please consider generating a new key file instead.</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Generate a new key file or choose an existing one to protect your database.</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>Browse</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
@@ -5378,6 +5366,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Hex</source> <source>Hex</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </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>Izostavi znakove: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;&quot;.</translation>
</message>
<message> <message>
<source>Generated password</source> <source>Generated password</source>
<translation>Proizvedena lozinka</translation> <translation>Proizvedena lozinka</translation>
@@ -5478,10 +5470,6 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Special Characters</source> <source>Special Characters</source>
<translation>Posebni znakovi</translation> <translation>Posebni znakovi</translation>
</message> </message>
<message>
<source>Excluded characters: &quot;0&quot;, &quot;O&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;|&quot;, &quot;G&quot;, &quot;6&quot;, &quot;B&quot;, &quot;8&quot;, &quot;&quot;</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>QApplication</name> <name>QApplication</name>
@@ -6748,22 +6736,6 @@ Please consider generating a new key file.</source>
<source>Unexpected key file data! Key file may be corrupt.</source> <source>Unexpected key file data! Key file may be corrupt.</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message numerus="yes">
<source>Clearing the clipboard in %1 second(s)</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<source>lock all open databases</source>
<translation type="unfinished"/>
</message>
<message>
<source>Locked databases.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Database failed to lock.</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>QtIOCompressor</name> <name>QtIOCompressor</name>
@@ -7466,6 +7438,10 @@ Please consider generating a new key file.</source>
<source>Could not write export container</source> <source>Could not write export container</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Unexpected export error occurred</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>ShareImport</name> <name>ShareImport</name>
@@ -7533,6 +7509,10 @@ Please consider generating a new key file.</source>
<source>File does not exist</source> <source>File does not exist</source>
<translation>Datoteka ne postoji</translation> <translation>Datoteka ne postoji</translation>
</message> </message>
<message>
<source>Unknown share container type</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>ShareObserver</name> <name>ShareObserver</name>

View File

@@ -139,10 +139,6 @@
<source>You must restart the application to set the new language. Would you like to restart now?</source> <source>You must restart the application to set the new language. Would you like to restart now?</source>
<translation>Az új nyelv beállításának az érvényre kerüléséhez újra kell indítani az alkalmazást. Legyen azonnal újraindítva?</translation> <translation>Az új nyelv beállításának az érvényre kerüléséhez újra kell indítani az alkalmazást. Legyen azonnal újraindítva?</translation>
</message> </message>
<message>
<source>Monochrome</source>
<translation>Monokróm</translation>
</message>
</context> </context>
<context> <context>
<name>ApplicationSettingsWidgetGeneral</name> <name>ApplicationSettingsWidgetGeneral</name>
@@ -2499,14 +2495,6 @@ Sajnos az esetleges változások elvesztek.</translation>
<source>Use this entry only with HTTP Basic Auth</source> <source>Use this entry only with HTTP Basic Auth</source>
<translation>Bejegyzés alkalmazása csak HTTP Basic Auth-tal</translation> <translation>Bejegyzés alkalmazása csak HTTP Basic Auth-tal</translation>
</message> </message>
<message>
<source>Do not send this setting to the browser for HTTP Auth dialogs. If enabled, HTTP Auth dialogs will not show this entry for selection.</source>
<translation>Ne küldje ezt a beállítást a böngésző HTTP Auth párbeszédablakának. Bejelölve a HTTP Auth párbeszédablakokban ez a bejegyzés nem fog kiválaszthatóként feltűnni.</translation>
</message>
<message>
<source>Do not use this entry with HTTP Basic Auth</source>
<translation>Bejegyzés tiltása HTTP Basic Auth-tal</translation>
</message>
</context> </context>
<context> <context>
<name>EditEntryWidgetHistory</name> <name>EditEntryWidgetHistory</name>
@@ -3406,7 +3394,7 @@ Biztosan hozzáadható ez a fájl?</translation>
</message> </message>
<message> <message>
<source>Autotype</source> <source>Autotype</source>
<translation>Automatikus beírás</translation> <translation>Automatikus típus</translation>
</message> </message>
<message> <message>
<source>Window</source> <source>Window</source>
@@ -4369,14 +4357,26 @@ Message: %2</source>
<source>Select a key file</source> <source>Select a key file</source>
<translation>Kulcsfájl kiválasztása</translation> <translation>Kulcsfájl kiválasztása</translation>
</message> </message>
<message>
<source>Key file selection</source>
<translation>Kulcsfájl kijelölése</translation>
</message>
<message> <message>
<source>Browse for key file</source> <source>Browse for key file</source>
<translation>Kulcsfájl böngészése</translation> <translation>Kulcsfájl böngészése</translation>
</message> </message>
<message>
<source>Browse...</source>
<translation>Tallózás</translation>
</message>
<message> <message>
<source>Generate a new key file</source> <source>Generate a new key file</source>
<translation>Új kulcsfájl előállítása</translation> <translation>Új kulcsfájl előállítása</translation>
</message> </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> <message>
<source>Invalid Key File</source> <source>Invalid Key File</source>
<translation>Érvénytelen kulcsfájl</translation> <translation>Érvénytelen kulcsfájl</translation>
@@ -4403,18 +4403,6 @@ Valóban folytatható a művelet ezzel a fájllal?</translation>
<source>You selected a key file in an old format which KeePassXC&lt;br&gt;may stop supporting in the future.&lt;br&gt;&lt;br&gt;Please consider generating a new key file instead.</source> <source>You selected a key file in an old format which KeePassXC&lt;br&gt;may stop supporting in the future.&lt;br&gt;&lt;br&gt;Please consider generating a new key file instead.</source>
<translation>Egy régi kulcsfájl formátumot használ, amit a KeePassXC lehet&lt;br&gt;hogy nem fog támogatni a jövőben.&lt;br&gt;&lt;br&gt;Fontolja meg, hogy új kulcsfájlt állítson elő.</translation> <translation>Egy régi kulcsfájl formátumot használ, amit a KeePassXC lehet&lt;br&gt;hogy nem fog támogatni a jövőben.&lt;br&gt;&lt;br&gt;Fontolja meg, hogy új kulcsfájlt állítson elő.</translation>
</message> </message>
<message>
<source>Generate a new key file or choose an existing one to protect your database.</source>
<translation>Új kulcsfájl generálása vagy egy meglévő kulcsfájl kijelölése az adatbázis védelméhez.</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>Browse</source>
<translation>Tallózás</translation>
</message>
</context> </context>
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
@@ -4863,19 +4851,19 @@ Néhány hiba és kisebb nehézségek várhatóak, ezért ez a verzió nem aján
</message> </message>
<message> <message>
<source>{USERNAME}</source> <source>{USERNAME}</source>
<translation>{USERNAME}</translation> <translation>{FELHASZNÁLÓNÉV}</translation>
</message> </message>
<message> <message>
<source>{USERNAME}{ENTER}</source> <source>{USERNAME}{ENTER}</source>
<translation>{USERNAME}{ENTER}</translation> <translation>{FELHASZNÁLÓNÉV}{ENTER}</translation>
</message> </message>
<message> <message>
<source>{PASSWORD}</source> <source>{PASSWORD}</source>
<translation>{PASSWORD}</translation> <translation>{JELSZÓ}</translation>
</message> </message>
<message> <message>
<source>{PASSWORD}{ENTER}</source> <source>{PASSWORD}{ENTER}</source>
<translation>{PASSWORD}{ENTER}</translation> <translation>{JELSZÓ}{ENTER}</translation>
</message> </message>
<message> <message>
<source>Always on Top</source> <source>Always on Top</source>
@@ -5413,6 +5401,10 @@ Néhány hiba és kisebb nehézségek várhatóak, ezért ez a verzió nem aján
<source>Hex</source> <source>Hex</source>
<translation>Hexadecimális</translation> <translation>Hexadecimális</translation>
</message> </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>Kihagyott karakterek: 0, 1, l, I, O, |, </translation>
</message>
<message> <message>
<source>Generated password</source> <source>Generated password</source>
<translation>Előállított jelszó</translation> <translation>Előállított jelszó</translation>
@@ -5513,10 +5505,6 @@ Néhány hiba és kisebb nehézségek várhatóak, ezért ez a verzió nem aján
<source>Special Characters</source> <source>Special Characters</source>
<translation>Speciális karakterek</translation> <translation>Speciális karakterek</translation>
</message> </message>
<message>
<source>Excluded characters: &quot;0&quot;, &quot;O&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;|&quot;, &quot;G&quot;, &quot;6&quot;, &quot;B&quot;, &quot;8&quot;, &quot;&quot;</source>
<translation>Kihagyott karakterek: 0, O, 1, l, I, |, G, 6, B, 8, </translation>
</message>
</context> </context>
<context> <context>
<name>QApplication</name> <name>QApplication</name>
@@ -6790,22 +6778,6 @@ Fontolja meg, hogy új kulcsfájlt állítson elő.</translation>
<source>Unexpected key file data! Key file may be corrupt.</source> <source>Unexpected key file data! Key file may be corrupt.</source>
<translation>Váratlan kulcsfájladatok. A kulcsfájl megsérülhetett.</translation> <translation>Váratlan kulcsfájladatok. A kulcsfájl megsérülhetett.</translation>
</message> </message>
<message numerus="yes">
<source>Clearing the clipboard in %1 second(s)</source>
<translation><numerusform>Vágólap törlése %1 másodperc múlva</numerusform><numerusform>Vágólap törlése %1 másodperc múlva</numerusform></translation>
</message>
<message>
<source>lock all open databases</source>
<translation>Összes nyitott adatbázis zárolása</translation>
</message>
<message>
<source>Locked databases.</source>
<translation>Zárolt adatbázisok.</translation>
</message>
<message>
<source>Database failed to lock.</source>
<translation>Adatbázis-zárolás sikertelen.</translation>
</message>
</context> </context>
<context> <context>
<name>QtIOCompressor</name> <name>QtIOCompressor</name>
@@ -7508,6 +7480,10 @@ Fontolja meg, hogy új kulcsfájlt állítson elő.</translation>
<source>Could not write export container</source> <source>Could not write export container</source>
<translation>Az exportálási tároló nem írható</translation> <translation>Az exportálási tároló nem írható</translation>
</message> </message>
<message>
<source>Unexpected export error occurred</source>
<translation>Váratlan exportálás hiba történt</translation>
</message>
</context> </context>
<context> <context>
<name>ShareImport</name> <name>ShareImport</name>
@@ -7575,6 +7551,10 @@ Fontolja meg, hogy új kulcsfájlt állítson elő.</translation>
<source>File does not exist</source> <source>File does not exist</source>
<translation>A fájl nem létezik</translation> <translation>A fájl nem létezik</translation>
</message> </message>
<message>
<source>Unknown share container type</source>
<translation>Ismeretlen megosztási tárolótípus</translation>
</message>
</context> </context>
<context> <context>
<name>ShareObserver</name> <name>ShareObserver</name>

View File

@@ -139,10 +139,6 @@
<source>You must restart the application to set the new language. Would you like to restart now?</source> <source>You must restart the application to set the new language. Would you like to restart now?</source>
<translation>Anda harus memulai ulang aplikasi untuk menerapkan bahasa. Apakah Anda ingin memulai ulang sekarang?</translation> <translation>Anda harus memulai ulang aplikasi untuk menerapkan bahasa. Apakah Anda ingin memulai ulang sekarang?</translation>
</message> </message>
<message>
<source>Monochrome</source>
<translation>Monokrom</translation>
</message>
</context> </context>
<context> <context>
<name>ApplicationSettingsWidgetGeneral</name> <name>ApplicationSettingsWidgetGeneral</name>
@@ -430,7 +426,7 @@
</message> </message>
<message> <message>
<source>Database lock timeout seconds</source> <source>Database lock timeout seconds</source>
<translation>Lama waktu habis penguncian basisdata</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source> min</source> <source> min</source>
@@ -603,7 +599,7 @@
<name>BrowserEntrySaveDialog</name> <name>BrowserEntrySaveDialog</name>
<message> <message>
<source>KeePassXC-Browser Save Entry</source> <source>KeePassXC-Browser Save Entry</source>
<translation>Entri Penyimpanan KeePassXC-Browser</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Ok</source> <source>Ok</source>
@@ -1108,11 +1104,11 @@ chrome-laptop.</translation>
</message> </message>
<message> <message>
<source>First line has field names</source> <source>First line has field names</source>
<translation>Baris pertama memiliki nama ruas</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Not Present</source> <source>Not Present</source>
<translation>Tidak Tersedia</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Column %1</source> <source>Column %1</source>
@@ -2498,14 +2494,6 @@ Unfortunately, any changes made have been lost.</source>
<source>Use this entry only with HTTP Basic Auth</source> <source>Use this entry only with HTTP Basic Auth</source>
<translation>Hanya gunakan entri ini dengan Otentikasi Dasar HTTP</translation> <translation>Hanya gunakan entri ini dengan Otentikasi Dasar HTTP</translation>
</message> </message>
<message>
<source>Do not send this setting to the browser for HTTP Auth dialogs. If enabled, HTTP Auth dialogs will not show this entry for selection.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Do not use this entry with HTTP Basic Auth</source>
<translation>Jangan gunakan entri ini dengan Otentikasi Dasar HTTP</translation>
</message>
</context> </context>
<context> <context>
<name>EditEntryWidgetHistory</name> <name>EditEntryWidgetHistory</name>
@@ -3005,15 +2993,15 @@ Ekstensi yang didukung adalah: %1.</translation>
</message> </message>
<message> <message>
<source>Also apply to child groups</source> <source>Also apply to child groups</source>
<translation>Juga terapkan ke grup di dalamnya</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Also apply to child entries</source> <source>Also apply to child entries</source>
<translation>Juga terapkan ke entri di dalamnya</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Also apply to all children</source> <source>Also apply to all children</source>
<translation>Juga terapkan ke semua grup dan entri</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Existing icon selected.</source> <source>Existing icon selected.</source>
@@ -4367,14 +4355,26 @@ Pesan: %2</translation>
<source>Select a key file</source> <source>Select a key file</source>
<translation>Pilih berkas kunci</translation> <translation>Pilih berkas kunci</translation>
</message> </message>
<message>
<source>Key file selection</source>
<translation>Pemilihan berkas kunci</translation>
</message>
<message> <message>
<source>Browse for key file</source> <source>Browse for key file</source>
<translation>Telusuri berkas kunci</translation> <translation>Telusuri berkas kunci</translation>
</message> </message>
<message>
<source>Browse...</source>
<translation>Telusuri...</translation>
</message>
<message> <message>
<source>Generate a new key file</source> <source>Generate a new key file</source>
<translation>Buat berkas kunci baru</translation> <translation>Buat berkas kunci baru</translation>
</message> </message>
<message>
<source>Note: Do not use a file that may change as that will prevent you from unlocking your database!</source>
<translation>Catatan: Jangan gunakan berkas yang dapat berubah karena itu akan mencegah Anda membuka kunci basisdata Anda!</translation>
</message>
<message> <message>
<source>Invalid Key File</source> <source>Invalid Key File</source>
<translation>Berkas Kunci Tidak Valid</translation> <translation>Berkas Kunci Tidak Valid</translation>
@@ -4401,18 +4401,6 @@ Apakah Anda yakin ingin melanjutkan dengan berkas ini?</translation>
<source>You selected a key file in an old format which KeePassXC&lt;br&gt;may stop supporting in the future.&lt;br&gt;&lt;br&gt;Please consider generating a new key file instead.</source> <source>You selected a key file in an old format which KeePassXC&lt;br&gt;may stop supporting in the future.&lt;br&gt;&lt;br&gt;Please consider generating a new key file instead.</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Generate a new key file or choose an existing one to protect your database.</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>Browse</source>
<translation>Telusuri</translation>
</message>
</context> </context>
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
@@ -4859,7 +4847,7 @@ Jangan kaget jika ada masalah dan bug, versi ini tidak ditujukan untuk penggunaa
</message> </message>
<message> <message>
<source>Perform Auto-Type Sequence</source> <source>Perform Auto-Type Sequence</source>
<translation>Jalankan Sekuens Ketik-Otomatis</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>{USERNAME}</source> <source>{USERNAME}</source>
@@ -5109,19 +5097,19 @@ Jangan kaget jika ada masalah dan bug, versi ini tidak ditujukan untuk penggunaa
<name>OpVaultReader</name> <name>OpVaultReader</name>
<message> <message>
<source>Directory .opvault must exist</source> <source>Directory .opvault must exist</source>
<translation>Direktori .opvault harus ada</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Directory .opvault must be readable</source> <source>Directory .opvault must be readable</source>
<translation>Direktori .opvault harus bisa dibaca</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Directory .opvault/default must exist</source> <source>Directory .opvault/default must exist</source>
<translation>Direktori .opvault/default harus ada</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Directory .opvault/default must be readable</source> <source>Directory .opvault/default must be readable</source>
<translation>Direktori .opvault/default harus bisa dibaca</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Unable to decode masterKey: %1</source> <source>Unable to decode masterKey: %1</source>
@@ -5412,6 +5400,10 @@ Jangan kaget jika ada masalah dan bug, versi ini tidak ditujukan untuk penggunaa
<source>Hex</source> <source>Hex</source>
<translation>Hex</translation> <translation>Hex</translation>
</message> </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>Karakter yang dikecualikan: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;&quot;</translation>
</message>
<message> <message>
<source>Generated password</source> <source>Generated password</source>
<translation>Sandi yang dibuat</translation> <translation>Sandi yang dibuat</translation>
@@ -5450,7 +5442,7 @@ Jangan kaget jika ada masalah dan bug, versi ini tidak ditujukan untuk penggunaa
</message> </message>
<message> <message>
<source>Word Case:</source> <source>Word Case:</source>
<translation>Besar Kecil Kata:</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Regenerate password</source> <source>Regenerate password</source>
@@ -5470,7 +5462,7 @@ Jangan kaget jika ada masalah dan bug, versi ini tidak ditujukan untuk penggunaa
</message> </message>
<message> <message>
<source>Title Case</source> <source>Title Case</source>
<translation>Besar Kecil Judul</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Generate Password</source> <source>Generate Password</source>
@@ -5512,10 +5504,6 @@ Jangan kaget jika ada masalah dan bug, versi ini tidak ditujukan untuk penggunaa
<source>Special Characters</source> <source>Special Characters</source>
<translation>Karakter Spesial</translation> <translation>Karakter Spesial</translation>
</message> </message>
<message>
<source>Excluded characters: &quot;0&quot;, &quot;O&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;|&quot;, &quot;G&quot;, &quot;6&quot;, &quot;B&quot;, &quot;8&quot;, &quot;&quot;</source>
<translation>Pengecualian karakter: &quot;0&quot;, &quot;O&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;|&quot;, &quot;G&quot;, &quot;6&quot;, &quot;B&quot;, &quot;8&quot;, &quot;&quot;</translation>
</message>
</context> </context>
<context> <context>
<name>QApplication</name> <name>QApplication</name>
@@ -5904,7 +5892,7 @@ Perintah yang tersedia:
</message> </message>
<message> <message>
<source>Invalid timeout value %1.</source> <source>Invalid timeout value %1.</source>
<translation>Nilai waktu habis tidak valid %1.</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Entry %1 not found.</source> <source>Entry %1 not found.</source>
@@ -5912,7 +5900,7 @@ Perintah yang tersedia:
</message> </message>
<message> <message>
<source>Entry with path %1 has no TOTP set up.</source> <source>Entry with path %1 has no TOTP set up.</source>
<translation>Entri dengan jalur %1 belum memiliki TOTP.</translation> <translation type="unfinished"/>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<source>Clearing the clipboard in %1 second(s)...</source> <source>Clearing the clipboard in %1 second(s)...</source>
@@ -5924,7 +5912,7 @@ Perintah yang tersedia:
</message> </message>
<message> <message>
<source>Silence password prompt and other secondary outputs.</source> <source>Silence password prompt and other secondary outputs.</source>
<translation>Jangan tampilkan pengingat sandi dan kaluaran sekunder lainnya.</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>count</source> <source>count</source>
@@ -6115,7 +6103,7 @@ Perintah yang tersedia:
</message> </message>
<message> <message>
<source>Successfully recycled entry %1.</source> <source>Successfully recycled entry %1.</source>
<translation>Berhasil mendaur ulang entri: %1.</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Successfully deleted entry %1.</source> <source>Successfully deleted entry %1.</source>
@@ -6193,11 +6181,11 @@ Perintah yang tersedia:
</message> </message>
<message> <message>
<source>Creating KeyFile %1 failed: %2</source> <source>Creating KeyFile %1 failed: %2</source>
<translation>Membuat BerkasKunci %1 gagal: %2</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Loading KeyFile %1 failed: %2</source> <source>Loading KeyFile %1 failed: %2</source>
<translation>Memuat BerkasKunci %1 gagal: %2</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Path of the entry to remove.</source> <source>Path of the entry to remove.</source>
@@ -6329,11 +6317,11 @@ Kernel: %3 %4</translation>
</message> </message>
<message> <message>
<source>Cryptographic libraries:</source> <source>Cryptographic libraries:</source>
<translation>Pustaka kriptografi:</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Cannot generate a password and prompt at the same time!</source> <source>Cannot generate a password and prompt at the same time!</source>
<translation>Tidak bisa membuat sandi dan pengingat secara bersamaan!</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Adds a new group to a database.</source> <source>Adds a new group to a database.</source>
@@ -6389,7 +6377,7 @@ Kernel: %3 %4</translation>
</message> </message>
<message> <message>
<source>Invalid word count %1</source> <source>Invalid word count %1</source>
<translation>Jumlah kata tidak valid %1</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>The word list is too small (&lt; 1000 items)</source> <source>The word list is too small (&lt; 1000 items)</source>
@@ -6433,7 +6421,7 @@ Kernel: %3 %4</translation>
</message> </message>
<message> <message>
<source>Path of the XML database export.</source> <source>Path of the XML database export.</source>
<translation>Jalur ke berkas XML hasil ekspor basisdata.</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Path of the new database.</source> <source>Path of the new database.</source>
@@ -6517,7 +6505,7 @@ Kernel: %3 %4</translation>
</message> </message>
<message> <message>
<source>Failed to open database file %1: not a plain file</source> <source>Failed to open database file %1: not a plain file</source>
<translation>Gagal membuka berkas basisdata %1: bukan berkas biasa</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Failed to open database file %1: not readable</source> <source>Failed to open database file %1: not readable</source>
@@ -6529,7 +6517,7 @@ Kernel: %3 %4</translation>
</message> </message>
<message> <message>
<source>Invalid YubiKey slot %1</source> <source>Invalid YubiKey slot %1</source>
<translation>Slot YubiKey tidak valid %1</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Enter password to encrypt database (optional): </source> <source>Enter password to encrypt database (optional): </source>
@@ -6537,7 +6525,7 @@ Kernel: %3 %4</translation>
</message> </message>
<message> <message>
<source>HIBP file, line %1: parse error</source> <source>HIBP file, line %1: parse error</source>
<translation>Berkas HIBP, baris %1: galat urai</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Secret Service Integration</source> <source>Secret Service Integration</source>
@@ -6561,7 +6549,7 @@ Kernel: %3 %4</translation>
</message> </message>
<message> <message>
<source>Browser Plugin Failure</source> <source>Browser Plugin Failure</source>
<translation>Kegagalan Pengaya Peramban</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Could not save the native messaging script file for %1.</source> <source>Could not save the native messaging script file for %1.</source>
@@ -6577,7 +6565,7 @@ Kernel: %3 %4</translation>
</message> </message>
<message> <message>
<source>Copy an entry&apos;s attribute to the clipboard.</source> <source>Copy an entry&apos;s attribute to the clipboard.</source>
<translation>Salin atribut entri ke papan klip.</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>ERROR: Please specify one of --attribute or --totp, not both.</source> <source>ERROR: Please specify one of --attribute or --totp, not both.</source>
@@ -6785,22 +6773,6 @@ Please consider generating a new key file.</source>
<source>Unexpected key file data! Key file may be corrupt.</source> <source>Unexpected key file data! Key file may be corrupt.</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message numerus="yes">
<source>Clearing the clipboard in %1 second(s)</source>
<translation type="unfinished"><numerusform></numerusform></translation>
</message>
<message>
<source>lock all open databases</source>
<translation>kunci semua basisdata yang terbuka</translation>
</message>
<message>
<source>Locked databases.</source>
<translation>Basisdata terkunci.</translation>
</message>
<message>
<source>Database failed to lock.</source>
<translation>Basisdata gagal dikunci.</translation>
</message>
</context> </context>
<context> <context>
<name>QtIOCompressor</name> <name>QtIOCompressor</name>
@@ -6922,7 +6894,7 @@ Please consider generating a new key file.</source>
</message> </message>
<message> <message>
<source>Perform Online Analysis</source> <source>Perform Online Analysis</source>
<translation>Jalankan Analisis Daring</translation> <translation>Lakukan Analisis Online</translation>
</message> </message>
<message> <message>
<source>Also show entries that have been excluded from reports</source> <source>Also show entries that have been excluded from reports</source>
@@ -7503,6 +7475,10 @@ Please consider generating a new key file.</source>
<source>Could not write export container</source> <source>Could not write export container</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Unexpected export error occurred</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>ShareImport</name> <name>ShareImport</name>
@@ -7570,6 +7546,10 @@ Please consider generating a new key file.</source>
<source>File does not exist</source> <source>File does not exist</source>
<translation>Berkas tidak ada</translation> <translation>Berkas tidak ada</translation>
</message> </message>
<message>
<source>Unknown share container type</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>ShareObserver</name> <name>ShareObserver</name>

View File

@@ -101,7 +101,7 @@
</message> </message>
<message> <message>
<source>Text only</source> <source>Text only</source>
<translation>Solo testo</translation> <translation>Solo icone</translation>
</message> </message>
<message> <message>
<source>Text beside icon</source> <source>Text beside icon</source>
@@ -139,10 +139,6 @@
<source>You must restart the application to set the new language. Would you like to restart now?</source> <source>You must restart the application to set the new language. Would you like to restart now?</source>
<translation>È necessario riavviare l&apos;applicazione per impostare la nuova lingua. Vuoi riavviare ora?</translation> <translation>È necessario riavviare l&apos;applicazione per impostare la nuova lingua. Vuoi riavviare ora?</translation>
</message> </message>
<message>
<source>Monochrome</source>
<translation>Monocromatico</translation>
</message>
</context> </context>
<context> <context>
<name>ApplicationSettingsWidgetGeneral</name> <name>ApplicationSettingsWidgetGeneral</name>
@@ -330,7 +326,7 @@
</message> </message>
<message> <message>
<source>Reset settings to default</source> <source>Reset settings to default</source>
<translation>Ripristina impostazioni predefinite</translation> <translation>Ripristina impostazioni predefinite...</translation>
</message> </message>
<message> <message>
<source>Auto-Type typing delay:</source> <source>Auto-Type typing delay:</source>
@@ -653,7 +649,7 @@ Do you want to overwrite it?</source>
</message> </message>
<message> <message>
<source>Converting attributes to custom data</source> <source>Converting attributes to custom data</source>
<translation>Conversione di attributi in dati personalizzati in corso</translation> <translation>Conversione di attributi in dati personalizzati in corso...</translation>
</message> </message>
<message> <message>
<source>KeePassXC: Converted KeePassHTTP attributes</source> <source>KeePassXC: Converted KeePassHTTP attributes</source>
@@ -1341,7 +1337,7 @@ Se non possiedi un file chiave, lascia vuoto questo campo.</translation>
</message> </message>
<message> <message>
<source>Detecting hardware keys</source> <source>Detecting hardware keys</source>
<translation>Rilevamento delle chiavi hardware in corso</translation> <translation>Rilevamento delle chiavi hardware in corso...</translation>
</message> </message>
<message> <message>
<source>No hardware keys detected</source> <source>No hardware keys detected</source>
@@ -1349,7 +1345,7 @@ Se non possiedi un file chiave, lascia vuoto questo campo.</translation>
</message> </message>
<message> <message>
<source>Select hardware key</source> <source>Select hardware key</source>
<translation>Seleziona chiave hardware</translation> <translation>Seleziona chiave hardware...</translation>
</message> </message>
<message> <message>
<source>Old key file format</source> <source>Old key file format</source>
@@ -1468,7 +1464,7 @@ Le autorizzazioni per accedere alle voci verranno revocate.</translation>
</message> </message>
<message> <message>
<source>Removing stored permissions</source> <source>Removing stored permissions</source>
<translation>Rimozione dei permessi salvati</translation> <translation>Rimozione dei permessi salvati...</translation>
</message> </message>
<message> <message>
<source>Abort</source> <source>Abort</source>
@@ -2499,14 +2495,6 @@ Purtroppo, le modifiche apportate sono state perse.</translation>
<source>Use this entry only with HTTP Basic Auth</source> <source>Use this entry only with HTTP Basic Auth</source>
<translation>Utilizza questa voce solo con l&apos;autenticazione HTTP Basic </translation> <translation>Utilizza questa voce solo con l&apos;autenticazione HTTP Basic </translation>
</message> </message>
<message>
<source>Do not send this setting to the browser for HTTP Auth dialogs. If enabled, HTTP Auth dialogs will not show this entry for selection.</source>
<translation>Non inviare questa impostazione al browser per le finestre di dialogo autenticazione HTTP. Se attivata, le finestre di dialogo autenticazione HTTP non mostreranno questa voce per la selezione.</translation>
</message>
<message>
<source>Do not use this entry with HTTP Basic Auth</source>
<translation>Non utilizzare questa voce con l&apos;autenticazione di base HTTP</translation>
</message>
</context> </context>
<context> <context>
<name>EditEntryWidgetHistory</name> <name>EditEntryWidgetHistory</name>
@@ -3596,7 +3584,7 @@ Siete sicuri di voler aggiungere questo file?</translation>
<name>IconDownloaderDialog</name> <name>IconDownloaderDialog</name>
<message> <message>
<source>Download Favicons</source> <source>Download Favicons</source>
<translation>Scarica i Favicon</translation> <translation>Scarica Favicons</translation>
</message> </message>
<message> <message>
<source>Cancel</source> <source>Cancel</source>
@@ -4369,14 +4357,26 @@ Messaggio: %2</translation>
<source>Select a key file</source> <source>Select a key file</source>
<translation>Seleziona un file chiave</translation> <translation>Seleziona un file chiave</translation>
</message> </message>
<message>
<source>Key file selection</source>
<translation>Selezione del file chiave</translation>
</message>
<message> <message>
<source>Browse for key file</source> <source>Browse for key file</source>
<translation>Cercare il file chiave</translation> <translation>Cercare il file chiave</translation>
</message> </message>
<message>
<source>Browse...</source>
<translation>Sfoglia...</translation>
</message>
<message> <message>
<source>Generate a new key file</source> <source>Generate a new key file</source>
<translation>Generare un nuovo file chiave</translation> <translation>Generare un nuovo file chiave</translation>
</message> </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> <message>
<source>Invalid Key File</source> <source>Invalid Key File</source>
<translation>File chiave non valido</translation> <translation>File chiave non valido</translation>
@@ -4403,18 +4403,6 @@ Sei sicuro di voler continuare con questo file?</translation>
<source>You selected a key file in an old format which KeePassXC&lt;br&gt;may stop supporting in the future.&lt;br&gt;&lt;br&gt;Please consider generating a new key file instead.</source> <source>You selected a key file in an old format which KeePassXC&lt;br&gt;may stop supporting in the future.&lt;br&gt;&lt;br&gt;Please consider generating a new key file instead.</source>
<translation>È stato selezionato un file di chiave in un vecchio formato che KeePassXC&lt;br&gt;potrebbe smettere di supportare in futuro.&lt;br&gt;&lt;br&gt;Prendere in considerazione la possibilità di generare un nuovo file di chiave.</translation> <translation>È stato selezionato un file di chiave in un vecchio formato che KeePassXC&lt;br&gt;potrebbe smettere di supportare in futuro.&lt;br&gt;&lt;br&gt;Prendere in considerazione la possibilità di generare un nuovo file di chiave.</translation>
</message> </message>
<message>
<source>Generate a new key file or choose an existing one to protect your database.</source>
<translation>Genera un nuovo file chiave o scegline uno esistente per proteggere il tuo database.</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ò ti impedirà di sbloccare il tuo database.</translation>
</message>
<message>
<source>Browse</source>
<translation>Sfoglia</translation>
</message>
</context> </context>
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
@@ -4664,7 +4652,7 @@ Aspettatevi alcuni bug e problemi minori, questa versione non è destinata all&a
</message> </message>
<message> <message>
<source>&amp;New Database</source> <source>&amp;New Database</source>
<translation>&amp;Nuovo database</translation> <translation>&amp;Nuovo database</translation>
</message> </message>
<message> <message>
<source>&amp;Merge From Database</source> <source>&amp;Merge From Database</source>
@@ -4672,39 +4660,39 @@ Aspettatevi alcuni bug e problemi minori, questa versione non è destinata all&a
</message> </message>
<message> <message>
<source>&amp;New Entry</source> <source>&amp;New Entry</source>
<translation>&amp;Nuova voce</translation> <translation>&amp;Nuova voce</translation>
</message> </message>
<message> <message>
<source>&amp;Edit Entry</source> <source>&amp;Edit Entry</source>
<translation>&amp;Modifica voce</translation> <translation>&amp;Modifica voce</translation>
</message> </message>
<message> <message>
<source>&amp;Delete Entry</source> <source>&amp;Delete Entry</source>
<translation>&amp;Elimina voce</translation> <translation>&amp;Elimina voce</translation>
</message> </message>
<message> <message>
<source>&amp;New Group</source> <source>&amp;New Group</source>
<translation>&amp;Nuovo gruppo</translation> <translation>&amp;Nuovo gruppo</translation>
</message> </message>
<message> <message>
<source>&amp;Edit Group</source> <source>&amp;Edit Group</source>
<translation>&amp;Modifica gruppo</translation> <translation>&amp;Modifica gruppo</translation>
</message> </message>
<message> <message>
<source>&amp;Delete Group</source> <source>&amp;Delete Group</source>
<translation>&amp;Elimina gruppo</translation> <translation>&amp;Elimina gruppo</translation>
</message> </message>
<message> <message>
<source>Download All &amp;Favicons</source> <source>Download All &amp;Favicons</source>
<translation>Scarica tutte le &amp;Favicon</translation> <translation>Scarica tutte le &amp;Favicons</translation>
</message> </message>
<message> <message>
<source>Sa&amp;ve Database As</source> <source>Sa&amp;ve Database As</source>
<translation>Sal&amp;va database come</translation> <translation>Sal&amp;va database come</translation>
</message> </message>
<message> <message>
<source>Database &amp;Security</source> <source>Database &amp;Security</source>
<translation>Database &amp;Sicurezza</translation> <translation>Database &amp;Sicurezza...</translation>
</message> </message>
<message> <message>
<source>Database &amp;Reports...</source> <source>Database &amp;Reports...</source>
@@ -4716,11 +4704,11 @@ Aspettatevi alcuni bug e problemi minori, questa versione non è destinata all&a
</message> </message>
<message> <message>
<source>&amp;Database Settings</source> <source>&amp;Database Settings</source>
<translation>Impostazioni &amp;database</translation> <translation>Impostazioni &amp;database</translation>
</message> </message>
<message> <message>
<source>&amp;Clone Entry</source> <source>&amp;Clone Entry</source>
<translation>&amp;Clona voce</translation> <translation>&amp;Clona voce</translation>
</message> </message>
<message> <message>
<source>Move u&amp;p</source> <source>Move u&amp;p</source>
@@ -4756,23 +4744,23 @@ Aspettatevi alcuni bug e problemi minori, questa versione non è destinata all&a
</message> </message>
<message> <message>
<source>&amp;CSV File</source> <source>&amp;CSV File</source>
<translation>&amp;File CSV</translation> <translation>&amp;File CSV...</translation>
</message> </message>
<message> <message>
<source>&amp;HTML File</source> <source>&amp;HTML File</source>
<translation>File &amp;HTML</translation> <translation>File &amp;HTML...</translation>
</message> </message>
<message> <message>
<source>KeePass 1 Database</source> <source>KeePass 1 Database</source>
<translation>Database KeePass 1</translation> <translation>Database KeePass 1</translation>
</message> </message>
<message> <message>
<source>1Password Vault</source> <source>1Password Vault</source>
<translation>1Password Vault</translation> <translation>1Password Vault</translation>
</message> </message>
<message> <message>
<source>CSV File</source> <source>CSV File</source>
<translation>File CSV</translation> <translation>File CSV</translation>
</message> </message>
<message> <message>
<source>Show TOTP</source> <source>Show TOTP</source>
@@ -4784,7 +4772,7 @@ Aspettatevi alcuni bug e problemi minori, questa versione non è destinata all&a
</message> </message>
<message> <message>
<source>Set up TOTP</source> <source>Set up TOTP</source>
<translation>Configura TOTP</translation> <translation>Configura TOTP...</translation>
</message> </message>
<message> <message>
<source>Report a &amp;Bug</source> <source>Report a &amp;Bug</source>
@@ -4808,7 +4796,7 @@ Aspettatevi alcuni bug e problemi minori, questa versione non è destinata all&a
</message> </message>
<message> <message>
<source>Save Database Backup...</source> <source>Save Database Backup...</source>
<translation>Salva il backup del database...</translation> <translation>Salva il backup del database </translation>
</message> </message>
<message> <message>
<source>Add key to SSH Agent</source> <source>Add key to SSH Agent</source>
@@ -5414,6 +5402,10 @@ Aspettatevi alcuni bug e problemi minori, questa versione non è destinata all&a
<source>Hex</source> <source>Hex</source>
<translation>Hex</translation> <translation>Hex</translation>
</message> </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>Escludere i caratteri: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;&quot;</translation>
</message>
<message> <message>
<source>Generated password</source> <source>Generated password</source>
<translation>Password generata</translation> <translation>Password generata</translation>
@@ -5514,10 +5506,6 @@ Aspettatevi alcuni bug e problemi minori, questa versione non è destinata all&a
<source>Special Characters</source> <source>Special Characters</source>
<translation>Caratteri speciali</translation> <translation>Caratteri speciali</translation>
</message> </message>
<message>
<source>Excluded characters: &quot;0&quot;, &quot;O&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;|&quot;, &quot;G&quot;, &quot;6&quot;, &quot;B&quot;, &quot;8&quot;, &quot;&quot;</source>
<translation>Caratteri esclusi: &quot;0&quot;, &quot;O&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;|&quot;, &quot;G&quot;, &quot;6&quot;, &quot;B&quot;, &quot;8&quot;, &quot;&quot;</translation>
</message>
</context> </context>
<context> <context>
<name>QApplication</name> <name>QApplication</name>
@@ -6695,7 +6683,7 @@ Kernel: %3 %4</translation>
</message> </message>
<message> <message>
<source>Please touch the button on your YubiKey to continue</source> <source>Please touch the button on your YubiKey to continue</source>
<translation>Premere il pulsante della YubiKey per continuare</translation> <translation>Premere il pulsante della YubiKey per continuare</translation>
</message> </message>
<message> <message>
<source>Do you want to create a database with an empty password? [y/N]: </source> <source>Do you want to create a database with an empty password? [y/N]: </source>
@@ -6791,22 +6779,6 @@ Prendere in considerazione la possibilità di generare un nuovo file di chiave.<
<source>Unexpected key file data! Key file may be corrupt.</source> <source>Unexpected key file data! Key file may be corrupt.</source>
<translation>Dati di file chiave imprevisti! Il file chiave potrebbe essere danneggiato.</translation> <translation>Dati di file chiave imprevisti! Il file chiave potrebbe essere danneggiato.</translation>
</message> </message>
<message numerus="yes">
<source>Clearing the clipboard in %1 second(s)</source>
<translation><numerusform>Cancellazione degli appunti in %1 secondo</numerusform><numerusform>Cancellazione degli appunti in %1 secondi</numerusform></translation>
</message>
<message>
<source>lock all open databases</source>
<translation>blocca tutti i database aperti</translation>
</message>
<message>
<source>Locked databases.</source>
<translation>Database bloccati.</translation>
</message>
<message>
<source>Database failed to lock.</source>
<translation>Impossibile bloccare il database.</translation>
</message>
</context> </context>
<context> <context>
<name>QtIOCompressor</name> <name>QtIOCompressor</name>
@@ -6913,7 +6885,7 @@ Prendere in considerazione la possibilità di generare un nuovo file di chiave.<
</message> </message>
<message> <message>
<source>Edit Entry...</source> <source>Edit Entry...</source>
<translation>Modifica voce</translation> <translation>Modifica voce</translation>
</message> </message>
<message> <message>
<source>Exclude from reports</source> <source>Exclude from reports</source>
@@ -6952,7 +6924,7 @@ Prendere in considerazione la possibilità di generare un nuovo file di chiave.<
</message> </message>
<message> <message>
<source>Password exposed</source> <source>Password exposed</source>
<translation>Password esposta</translation> <translation>Password esposta </translation>
</message> </message>
<message> <message>
<source> (Excluded)</source> <source> (Excluded)</source>
@@ -6996,7 +6968,7 @@ Prendere in considerazione la possibilità di generare un nuovo file di chiave.<
</message> </message>
<message> <message>
<source>Edit Entry...</source> <source>Edit Entry...</source>
<translation>Modifica voce</translation> <translation>Modifica voce</translation>
</message> </message>
<message> <message>
<source>Exclude from reports</source> <source>Exclude from reports</source>
@@ -7509,6 +7481,10 @@ Prendere in considerazione la possibilità di generare un nuovo file di chiave.<
<source>Could not write export container</source> <source>Could not write export container</source>
<translation>Impossibile scrivere il contenitore di esportazione</translation> <translation>Impossibile scrivere il contenitore di esportazione</translation>
</message> </message>
<message>
<source>Unexpected export error occurred</source>
<translation>Si è verificato un errore di esportazione imprevisto</translation>
</message>
</context> </context>
<context> <context>
<name>ShareImport</name> <name>ShareImport</name>
@@ -7576,6 +7552,10 @@ Prendere in considerazione la possibilità di generare un nuovo file di chiave.<
<source>File does not exist</source> <source>File does not exist</source>
<translation>Il file non esiste</translation> <translation>Il file non esiste</translation>
</message> </message>
<message>
<source>Unknown share container type</source>
<translation>Tipo di contenitore di condivisione sconosciuto</translation>
</message>
</context> </context>
<context> <context>
<name>ShareObserver</name> <name>ShareObserver</name>
@@ -7905,7 +7885,7 @@ Esempio: JBSWY3DPEHPK3PXP</translation>
</message> </message>
<message> <message>
<source>Detecting hardware keys</source> <source>Detecting hardware keys</source>
<translation>Rilevamento delle chiavi hardware in corso</translation> <translation>Rilevamento delle chiavi hardware in corso...</translation>
</message> </message>
<message> <message>
<source>No hardware keys detected</source> <source>No hardware keys detected</source>

View File

@@ -139,10 +139,6 @@
<source>You must restart the application to set the new language. Would you like to restart now?</source> <source>You must restart the application to set the new language. Would you like to restart now?</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>Monochrome</source>
<translation></translation>
</message>
</context> </context>
<context> <context>
<name>ApplicationSettingsWidgetGeneral</name> <name>ApplicationSettingsWidgetGeneral</name>
@@ -2499,14 +2495,6 @@ Unfortunately, any changes made have been lost.</source>
<source>Use this entry only with HTTP Basic Auth</source> <source>Use this entry only with HTTP Basic Auth</source>
<translation> HTTP 使</translation> <translation> HTTP 使</translation>
</message> </message>
<message>
<source>Do not send this setting to the browser for HTTP Auth dialogs. If enabled, HTTP Auth dialogs will not show this entry for selection.</source>
<translation> HTTP HTTP </translation>
</message>
<message>
<source>Do not use this entry with HTTP Basic Auth</source>
<translation> HTTP 使</translation>
</message>
</context> </context>
<context> <context>
<name>EditEntryWidgetHistory</name> <name>EditEntryWidgetHistory</name>
@@ -4368,14 +4356,26 @@ Message: %2</source>
<source>Select a key file</source> <source>Select a key file</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>Key file selection</source>
<translation></translation>
</message>
<message> <message>
<source>Browse for key file</source> <source>Browse for key file</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>Browse...</source>
<translation>...</translation>
</message>
<message> <message>
<source>Generate a new key file</source> <source>Generate a new key file</source>
<translation></translation> <translation></translation>
</message> </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> <message>
<source>Invalid Key File</source> <source>Invalid Key File</source>
<translation></translation> <translation></translation>
@@ -4402,18 +4402,6 @@ Are you sure you want to continue with this file?</source>
<source>You selected a key file in an old format which KeePassXC&lt;br&gt;may stop supporting in the future.&lt;br&gt;&lt;br&gt;Please consider generating a new key file instead.</source> <source>You selected a key file in an old format which KeePassXC&lt;br&gt;may stop supporting in the future.&lt;br&gt;&lt;br&gt;Please consider generating a new key file instead.</source>
<translation>KeePassXC &lt;br&gt;&lt;br&gt;&lt;br&gt;</translation> <translation>KeePassXC &lt;br&gt;&lt;br&gt;&lt;br&gt;</translation>
</message> </message>
<message>
<source>Generate a new key file or choose an existing one to protect your database.</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>Browse</source>
<translation></translation>
</message>
</context> </context>
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
@@ -5413,6 +5401,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Hex</source> <source>Hex</source>
<translation>16</translation> <translation>16</translation>
</message> </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>: &quot;0&quot;&quot;1&quot;&quot;l&quot;&quot;I&quot;&quot;O&quot;&quot;|&quot;&quot;&quot;</translation>
</message>
<message> <message>
<source>Generated password</source> <source>Generated password</source>
<translation></translation> <translation></translation>
@@ -5513,10 +5505,6 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Special Characters</source> <source>Special Characters</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>Excluded characters: &quot;0&quot;, &quot;O&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;|&quot;, &quot;G&quot;, &quot;6&quot;, &quot;B&quot;, &quot;8&quot;, &quot;&quot;</source>
<translation>: &quot;0&quot;, &quot;O&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;|&quot;, &quot;G&quot;, &quot;6&quot;, &quot;B&quot;, &quot;8&quot;, &quot;&quot;</translation>
</message>
</context> </context>
<context> <context>
<name>QApplication</name> <name>QApplication</name>
@@ -6790,22 +6778,6 @@ Please consider generating a new key file.</source>
<source>Unexpected key file data! Key file may be corrupt.</source> <source>Unexpected key file data! Key file may be corrupt.</source>
<translation></translation> <translation></translation>
</message> </message>
<message numerus="yes">
<source>Clearing the clipboard in %1 second(s)</source>
<translation><numerusform>%1 </numerusform></translation>
</message>
<message>
<source>lock all open databases</source>
<translation></translation>
</message>
<message>
<source>Locked databases.</source>
<translation></translation>
</message>
<message>
<source>Database failed to lock.</source>
<translation></translation>
</message>
</context> </context>
<context> <context>
<name>QtIOCompressor</name> <name>QtIOCompressor</name>
@@ -7508,6 +7480,10 @@ Please consider generating a new key file.</source>
<source>Could not write export container</source> <source>Could not write export container</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>Unexpected export error occurred</source>
<translation></translation>
</message>
</context> </context>
<context> <context>
<name>ShareImport</name> <name>ShareImport</name>
@@ -7575,6 +7551,10 @@ Please consider generating a new key file.</source>
<source>File does not exist</source> <source>File does not exist</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>Unknown share container type</source>
<translation></translation>
</message>
</context> </context>
<context> <context>
<name>ShareObserver</name> <name>ShareObserver</name>

View File

@@ -137,11 +137,7 @@
</message> </message>
<message> <message>
<source>You must restart the application to set the new language. Would you like to restart now?</source> <source>You must restart the application to set the new language. Would you like to restart now?</source>
<translation> . ?</translation> <translation type="unfinished"/>
</message>
<message>
<source>Monochrome</source>
<translation></translation>
</message> </message>
</context> </context>
<context> <context>
@@ -346,15 +342,15 @@
</message> </message>
<message> <message>
<source>Automatically save when locking database</source> <source>Automatically save when locking database</source>
<translation> </translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Automatically save non-data changes when locking database</source> <source>Automatically save non-data changes when locking database</source>
<translation> </translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Tray icon type</source> <source>Tray icon type</source>
<translation> </translation> <translation type="unfinished"/>
</message> </message>
</context> </context>
<context> <context>
@@ -1354,11 +1350,11 @@ If you do not have a key file, please leave the field empty.</source>
</message> </message>
<message> <message>
<source>Old key file format</source> <source>Old key file format</source>
<translation> </translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>You are using an old key file format which KeePassXC may&lt;br&gt;stop supporting in the future.&lt;br&gt;&lt;br&gt;Please consider generating a new key file by going to:&lt;br&gt;&lt;strong&gt;Database / Database Security / Change Key File.&lt;/strong&gt;&lt;br&gt;</source> <source>You are using an old key file format which KeePassXC may&lt;br&gt;stop supporting in the future.&lt;br&gt;&lt;br&gt;Please consider generating a new key file by going to:&lt;br&gt;&lt;strong&gt;Database / Database Security / Change Key File.&lt;/strong&gt;&lt;br&gt;</source>
<translation>KeePassXC에서 &lt;br&gt; .&lt;br&gt;&lt;br&gt; :&lt;br&gt;&lt;strong&gt; / / &lt;/strong&gt;&lt;br&gt;</translation> <translation type="unfinished"/>
</message> </message>
</context> </context>
<context> <context>
@@ -2294,13 +2290,12 @@ Disable safe saves and try again?</source>
</message> </message>
<message> <message>
<source>Invalid Entry</source> <source>Invalid Entry</source>
<translation> </translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>An external merge operation has invalidated this entry. <source>An external merge operation has invalidated this entry.
Unfortunately, any changes made have been lost.</source> Unfortunately, any changes made have been lost.</source>
<translation> . <translation type="unfinished"/>
.</translation>
</message> </message>
</context> </context>
<context> <context>
@@ -2499,14 +2494,6 @@ Unfortunately, any changes made have been lost.</source>
<source>Use this entry only with HTTP Basic Auth</source> <source>Use this entry only with HTTP Basic Auth</source>
<translation>HTTP Basic </translation> <translation>HTTP Basic </translation>
</message> </message>
<message>
<source>Do not send this setting to the browser for HTTP Auth dialogs. If enabled, HTTP Auth dialogs will not show this entry for selection.</source>
<translation> HTTP . HTTP .</translation>
</message>
<message>
<source>Do not use this entry with HTTP Basic Auth</source>
<translation>HTTP Basic </translation>
</message>
</context> </context>
<context> <context>
<name>EditEntryWidgetHistory</name> <name>EditEntryWidgetHistory</name>
@@ -2631,7 +2618,7 @@ Unfortunately, any changes made have been lost.</source>
</message> </message>
<message> <message>
<source>Edit Entry</source> <source>Edit Entry</source>
<translation> </translation> <translation type="unfinished"/>
</message> </message>
</context> </context>
<context> <context>
@@ -2935,7 +2922,7 @@ Supported extensions are: %1.</source>
</message> </message>
<message> <message>
<source>Edit Group</source> <source>Edit Group</source>
<translation> </translation> <translation type="unfinished"/>
</message> </message>
</context> </context>
<context> <context>
@@ -3457,12 +3444,12 @@ Are you sure to add this file?</source>
</message> </message>
<message> <message>
<source>Default Sequence</source> <source>Default Sequence</source>
<translation> 퀀</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>&lt;tr&gt;&lt;td&gt;&lt;b&gt;%1&lt;/b&gt;:&lt;/td&gt;&lt;td&gt;%2&lt;/td&gt;&lt;/tr&gt;</source> <source>&lt;tr&gt;&lt;td&gt;&lt;b&gt;%1&lt;/b&gt;:&lt;/td&gt;&lt;td&gt;%2&lt;/td&gt;&lt;/tr&gt;</source>
<comment>attributes line</comment> <comment>attributes line</comment>
<translation>&lt;tr&gt;&lt;td&gt;&lt;b&gt;%1&lt;/b&gt;:&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;</translation> <translation type="unfinished"/>
</message> </message>
</context> </context>
<context> <context>
@@ -4368,14 +4355,26 @@ Message: %2</source>
<source>Select a key file</source> <source>Select a key file</source>
<translation> </translation> <translation> </translation>
</message> </message>
<message>
<source>Key file selection</source>
<translation> </translation>
</message>
<message> <message>
<source>Browse for key file</source> <source>Browse for key file</source>
<translation> </translation> <translation> </translation>
</message> </message>
<message>
<source>Browse...</source>
<translation>...</translation>
</message>
<message> <message>
<source>Generate a new key file</source> <source>Generate a new key file</source>
<translation> </translation> <translation> </translation>
</message> </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> <message>
<source>Invalid Key File</source> <source>Invalid Key File</source>
<translation> </translation> <translation> </translation>
@@ -4396,23 +4395,11 @@ Are you sure you want to continue with this file?</source>
</message> </message>
<message> <message>
<source>Old key file format</source> <source>Old key file format</source>
<translation> </translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>You selected a key file in an old format which KeePassXC&lt;br&gt;may stop supporting in the future.&lt;br&gt;&lt;br&gt;Please consider generating a new key file instead.</source> <source>You selected a key file in an old format which KeePassXC&lt;br&gt;may stop supporting in the future.&lt;br&gt;&lt;br&gt;Please consider generating a new key file instead.</source>
<translation>KeePassXC에서 &lt;br&gt; .&lt;br&gt;&lt;br&gt; :</translation> <translation type="unfinished"/>
</message>
<message>
<source>Generate a new key file or choose an existing one to protect your database.</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>Browse</source>
<translation>...</translation>
</message> </message>
</context> </context>
<context> <context>
@@ -4859,27 +4846,27 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message> </message>
<message> <message>
<source>Perform Auto-Type Sequence</source> <source>Perform Auto-Type Sequence</source>
<translation> 퀀 </translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>{USERNAME}</source> <source>{USERNAME}</source>
<translation>{USERNAME}</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>{USERNAME}{ENTER}</source> <source>{USERNAME}{ENTER}</source>
<translation>{USERNAME}{ENTER}</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>{PASSWORD}</source> <source>{PASSWORD}</source>
<translation>{PASSWORD}</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>{PASSWORD}{ENTER}</source> <source>{PASSWORD}{ENTER}</source>
<translation>{PASSWORD}{ENTER}</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Always on Top</source> <source>Always on Top</source>
<translation> </translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Hide Usernames</source> <source>Hide Usernames</source>
@@ -5413,6 +5400,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Hex</source> <source>Hex</source>
<translation>16</translation> <translation>16</translation>
</message> </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> : &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;&quot;</translation>
</message>
<message> <message>
<source>Generated password</source> <source>Generated password</source>
<translation> </translation> <translation> </translation>
@@ -5513,10 +5504,6 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Special Characters</source> <source>Special Characters</source>
<translation> </translation> <translation> </translation>
</message> </message>
<message>
<source>Excluded characters: &quot;0&quot;, &quot;O&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;|&quot;, &quot;G&quot;, &quot;6&quot;, &quot;B&quot;, &quot;8&quot;, &quot;&quot;</source>
<translation> : &quot;0&quot;, &quot;O&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;|&quot;, &quot;G&quot;, &quot;6&quot;, &quot;B&quot;, &quot;8&quot;, &quot;&quot;</translation>
</message>
</context> </context>
<context> <context>
<name>QApplication</name> <name>QApplication</name>
@@ -6746,29 +6733,26 @@ CPU 아키텍처: %2
</message> </message>
<message> <message>
<source>path to a custom local config file</source> <source>path to a custom local config file</source>
<translation> </translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>WARNING: You are using an old key file format which KeePassXC may <source>WARNING: You are using an old key file format which KeePassXC may
stop supporting in the future. stop supporting in the future.
Please consider generating a new key file.</source> Please consider generating a new key file.</source>
<translation>경고: KeePassXC에서 <translation type="unfinished"/>
.
.</translation>
</message> </message>
<message> <message>
<source>Argon2%1 (%2 rounds, %3 KB)</source> <source>Argon2%1 (%2 rounds, %3 KB)</source>
<translation>Argon2%1(%2, %3 KB)</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Argon2d (KDBX 4 recommended)</source> <source>Argon2d (KDBX 4 recommended)</source>
<translation>Argon2d(KDBX 4 )</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Argon2id (KDBX 4)</source> <source>Argon2id (KDBX 4)</source>
<translation>Argon2id(KDBX 4)</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>TOTP</source> <source>TOTP</source>
@@ -6780,31 +6764,15 @@ Please consider generating a new key file.</source>
</message> </message>
<message> <message>
<source>Unsupported key file version: %1</source> <source>Unsupported key file version: %1</source>
<translation> : %1</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Checksum mismatch! Key file may be corrupt.</source> <source>Checksum mismatch! Key file may be corrupt.</source>
<translation> ! .</translation> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>Unexpected key file data! Key file may be corrupt.</source> <source>Unexpected key file data! Key file may be corrupt.</source>
<translation> ! .</translation> <translation type="unfinished"/>
</message>
<message numerus="yes">
<source>Clearing the clipboard in %1 second(s)</source>
<translation><numerusform>%1 ...</numerusform></translation>
</message>
<message>
<source>lock all open databases</source>
<translation> </translation>
</message>
<message>
<source>Locked databases.</source>
<translation> .</translation>
</message>
<message>
<source>Database failed to lock.</source>
<translation> .</translation>
</message> </message>
</context> </context>
<context> <context>
@@ -7508,6 +7476,10 @@ Please consider generating a new key file.</source>
<source>Could not write export container</source> <source>Could not write export container</source>
<translation> </translation> <translation> </translation>
</message> </message>
<message>
<source>Unexpected export error occurred</source>
<translation> </translation>
</message>
</context> </context>
<context> <context>
<name>ShareImport</name> <name>ShareImport</name>
@@ -7575,6 +7547,10 @@ Please consider generating a new key file.</source>
<source>File does not exist</source> <source>File does not exist</source>
<translation> </translation> <translation> </translation>
</message> </message>
<message>
<source>Unknown share container type</source>
<translation> </translation>
</message>
</context> </context>
<context> <context>
<name>ShareObserver</name> <name>ShareObserver</name>

View File

@@ -139,10 +139,6 @@
<source>You must restart the application to set the new language. Would you like to restart now?</source> <source>You must restart the application to set the new language. Would you like to restart now?</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Monochrome</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>ApplicationSettingsWidgetGeneral</name> <name>ApplicationSettingsWidgetGeneral</name>
@@ -2468,14 +2464,6 @@ Unfortunately, any changes made have been lost.</source>
<source>Use this entry only with HTTP Basic Auth</source> <source>Use this entry only with HTTP Basic Auth</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Do not send this setting to the browser for HTTP Auth dialogs. If enabled, HTTP Auth dialogs will not show this entry for selection.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Do not use this entry with HTTP Basic Auth</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>EditEntryWidgetHistory</name> <name>EditEntryWidgetHistory</name>
@@ -4326,14 +4314,26 @@ Message: %2</source>
<source>Select a key file</source> <source>Select a key file</source>
<translation>Pasirinkite rakto failą</translation> <translation>Pasirinkite rakto failą</translation>
</message> </message>
<message>
<source>Key file selection</source>
<translation type="unfinished"/>
</message>
<message> <message>
<source>Browse for key file</source> <source>Browse for key file</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Browse...</source>
<translation>Naršyti...</translation>
</message>
<message> <message>
<source>Generate a new key file</source> <source>Generate a new key file</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </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> <message>
<source>Invalid Key File</source> <source>Invalid Key File</source>
<translation type="unfinished"/> <translation type="unfinished"/>
@@ -4359,18 +4359,6 @@ Are you sure you want to continue with this file?</source>
<source>You selected a key file in an old format which KeePassXC&lt;br&gt;may stop supporting in the future.&lt;br&gt;&lt;br&gt;Please consider generating a new key file instead.</source> <source>You selected a key file in an old format which KeePassXC&lt;br&gt;may stop supporting in the future.&lt;br&gt;&lt;br&gt;Please consider generating a new key file instead.</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Generate a new key file or choose an existing one to protect your database.</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>Browse</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
@@ -5365,6 +5353,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Hex</source> <source>Hex</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </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"/>
</message>
<message> <message>
<source>Generated password</source> <source>Generated password</source>
<translation type="unfinished"/> <translation type="unfinished"/>
@@ -5465,10 +5457,6 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Special Characters</source> <source>Special Characters</source>
<translation>Specialūs simboliai</translation> <translation>Specialūs simboliai</translation>
</message> </message>
<message>
<source>Excluded characters: &quot;0&quot;, &quot;O&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;|&quot;, &quot;G&quot;, &quot;6&quot;, &quot;B&quot;, &quot;8&quot;, &quot;&quot;</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>QApplication</name> <name>QApplication</name>
@@ -6736,22 +6724,6 @@ Please consider generating a new key file.</source>
<source>Unexpected key file data! Key file may be corrupt.</source> <source>Unexpected key file data! Key file may be corrupt.</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message numerus="yes">
<source>Clearing the clipboard in %1 second(s)</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<source>lock all open databases</source>
<translation type="unfinished"/>
</message>
<message>
<source>Locked databases.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Database failed to lock.</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>QtIOCompressor</name> <name>QtIOCompressor</name>
@@ -7454,6 +7426,10 @@ Please consider generating a new key file.</source>
<source>Could not write export container</source> <source>Could not write export container</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Unexpected export error occurred</source>
<translation>Įvyko netikėta eksportavimo klaida</translation>
</message>
</context> </context>
<context> <context>
<name>ShareImport</name> <name>ShareImport</name>
@@ -7521,6 +7497,10 @@ Please consider generating a new key file.</source>
<source>File does not exist</source> <source>File does not exist</source>
<translation>Failo nėra</translation> <translation>Failo nėra</translation>
</message> </message>
<message>
<source>Unknown share container type</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>ShareObserver</name> <name>ShareObserver</name>

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