Release 2.4.1

- Fix database deletion when using unsafe saves to a different file system [#2889]
- Fix opening databases with legacy key files that contain '/' [#2872]
- Fix opening database files from the command line [#2919]
- Fix crash when editing master key [#2836]
- Fix multiple issues with apply button behavior [#2947]
- Fix issues on application startup (tab order, --pw-stdin, etc.) [#2830]
- Fix building without WITH_XC_KEESHARE
- Fix reference entry coloring on macOS dark mode [#2984]
- Hide window when performing entry auto-type on macOS [#2969]
- Improve UX of update checker; reduce checks to every 7 days [#2968]
- KeeShare improvements [#2946, #2978, #2824]
- Re-enable Ctrl+C to copy password from search box [#2947]
- Add KeePassXC-Browser integration for Brave browser [#2933]
- SSH Agent: Re-Add keys on database unlock [#2982]
- SSH Agent: Only remove keys on app exit if they are removed on lock [#2985]
- CLI: Add --no-password option [#2708]
- CLI: Improve database extraction to XML [#2698]
- CLI: Don't call mandb on build [#2774]
- CLI: Add debug info [#2714]
- Improve support for Snap theming [#2832]
- Add support for building on Haiku OS [#2859]
- Ctrl+PgDn now goes to the next tab and Ctrl+PgUp to the previous
- Fix compiling on GCC 5 / Xenial [#2990]
- Add .gitrev output to tarball for third-party builds [#2970]
- Add WITH_XC_UPDATECHECK compile flag to toggle the update checker [#2968]
This commit is contained in:
Jonathan White 2019-04-12 18:12:12 -04:00
commit 7bafe65d17
No known key found for this signature in database
GPG Key ID: 440FC65F2E0C6E01
134 changed files with 3105 additions and 2137 deletions

View File

@ -1,3 +1,32 @@
2.4.1 (2019-04-12)
=========================
- Fix database deletion when using unsafe saves to a different file system [#2889]
- Fix opening databases with legacy key files that contain '/' [#2872]
- Fix opening database files from the command line [#2919]
- Fix crash when editing master key [#2836]
- Fix multiple issues with apply button behavior [#2947]
- Fix issues on application startup (tab order, --pw-stdin, etc.) [#2830]
- Fix building without WITH_XC_KEESHARE
- Fix reference entry coloring on macOS dark mode [#2984]
- Hide window when performing entry auto-type on macOS [#2969]
- Improve UX of update checker; reduce checks to every 7 days [#2968]
- KeeShare improvements [#2946, #2978, #2824]
- Re-enable Ctrl+C to copy password from search box [#2947]
- Add KeePassXC-Browser integration for Brave browser [#2933]
- SSH Agent: Re-Add keys on database unlock [#2982]
- SSH Agent: Only remove keys on app exit if they are removed on lock [#2985]
- CLI: Add --no-password option [#2708]
- CLI: Improve database extraction to XML [#2698]
- CLI: Don't call mandb on build [#2774]
- CLI: Add debug info [#2714]
- Improve support for Snap theming [#2832]
- Add support for building on Haiku OS [#2859]
- Ctrl+PgDn now goes to the next tab and Ctrl+PgUp to the previous
- Fix compiling on GCC 5 / Xenial [#2990]
- Add .gitrev output to tarball for third-party builds [#2970]
- Add WITH_XC_UPDATECHECK compile flag to toggle the update checker [#2968]
2.4.0 (2019-03-19)
=========================

View File

@ -49,6 +49,7 @@ option(WITH_XC_YUBIKEY "Include YubiKey support." OFF)
option(WITH_XC_SSHAGENT "Include SSH agent support." OFF)
option(WITH_XC_KEESHARE "Sharing integration with KeeShare" OFF)
option(WITH_XC_KEESHARE_SECURE "Sharing integration with secured KeeShare containers" OFF)
option(WITH_XC_UPDATECHECK "Include automatic update checks; disable for controlled distributions" ON)
if(APPLE)
option(WITH_XC_TOUCHID "Include TouchID support for macOS." OFF)
endif()
@ -76,10 +77,15 @@ else()
set(WITH_XC_CRYPTO_SSH OFF)
endif()
if(WITH_XC_UPDATECHECK)
set(WITH_XC_NETWORKING ON)
endif()
set(KEEPASSXC_VERSION_MAJOR "2")
set(KEEPASSXC_VERSION_MINOR "4")
set(KEEPASSXC_VERSION_PATCH "0")
set(KEEPASSXC_VERSION_PATCH "1")
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(KEEPASSXC_BUILD_TYPE "Snapshot" CACHE STRING "Set KeePassXC build type to distinguish between stable releases and snapshots")
set_property(CACHE KEEPASSXC_BUILD_TYPE PROPERTY STRINGS Snapshot Release PreRelease)
@ -91,8 +97,10 @@ execute_process(COMMAND git rev-parse --short=7 HEAD
OUTPUT_VARIABLE GIT_HEAD
ERROR_QUIET)
string(STRIP "${GIT_HEAD}" GIT_HEAD)
if(GIT_HEAD STREQUAL "")
if(GIT_HEAD STREQUAL "" AND NOT GIT_HEAD_OVERRIDE STREQUAL "")
string(SUBSTRING "${GIT_HEAD_OVERRIDE}" 0 7 GIT_HEAD)
elseif(EXISTS ${CMAKE_SOURCE_DIR}/.gitrev)
file(READ ${CMAKE_SOURCE_DIR}/.gitrev GIT_HEAD)
endif()
message(STATUS "Found Git HEAD Revision: ${GIT_HEAD}\n")
@ -116,13 +124,16 @@ if(OVERRIDE_VERSION)
elseif(OVERRIDE_VERSION MATCHES "^[\\.0-9]+$")
set(KEEPASSXC_BUILD_TYPE Release)
set(KEEPASSXC_VERSION ${OVERRIDE_VERSION})
else()
set(KEEPASSXC_BUILD_TYPE Snapshot)
set(KEEPASSXC_VERSION ${OVERRIDE_VERSION})
endif()
else()
if(KEEPASSXC_BUILD_TYPE STREQUAL "PreRelease")
set(KEEPASSXC_VERSION "${KEEPASSXC_VERSION}-preview")
elseif(KEEPASSXC_BUILD_TYPE STREQUAL "Snapshot")
set(KEEPASSXC_VERSION "${KEEPASSXC_VERSION}-snapshot")
endif()
endif()
if(KEEPASSXC_BUILD_TYPE STREQUAL "PreRelease" AND NOT OVERRIDE_VERSION)
set(KEEPASSXC_VERSION "${KEEPASSXC_VERSION}-preview")
elseif(KEEPASSXC_BUILD_TYPE STREQUAL "Snapshot")
set(KEEPASSXC_VERSION "${KEEPASSXC_VERSION}-snapshot")
endif()
if(KEEPASSXC_BUILD_TYPE STREQUAL "Release")
@ -192,11 +203,13 @@ if(CMAKE_BUILD_TYPE STREQUAL "Debug")
add_gcc_compiler_flags("-Werror")
endif()
if (NOT HAIKU)
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")
else()
add_gcc_compiler_flags("-fstack-protector --param=ssp-buffer-size=4")
endif()
endif()
add_gcc_compiler_cxxflags("-fno-exceptions -fno-rtti")
add_gcc_compiler_cxxflags("-Wnon-virtual-dtor -Wold-style-cast -Woverloaded-virtual")

View File

@ -29,7 +29,7 @@ so please check out your distribution's package list to see if KeePassXC is avai
- Using website favicons as entry icons
- Merging of databases
- Automatic reload when the database changed on disk
- Browser integration with KeePassXC-Browser using [native messaging](https://developer.chrome.com/extensions/nativeMessaging) for [Mozilla Firefox](https://addons.mozilla.org/en-US/firefox/addon/keepassxc-browser/) and [Google Chrome or Chromium](https://chrome.google.com/webstore/detail/keepassxc-browser/oboonakemofpalcgghocfoadofidjkkk)
- Browser integration with KeePassXC-Browser using [native messaging](https://developer.chrome.com/extensions/nativeMessaging) for [Mozilla Firefox](https://addons.mozilla.org/en-US/firefox/addon/keepassxc-browser/) and [Google Chrome, Chromium, Vivaldi, or Brave](https://chrome.google.com/webstore/detail/keepassxc-browser/oboonakemofpalcgghocfoadofidjkkk)
- Synchronize passwords using KeeShare. See [Using Sharing](./docs/QUICKSTART.md#using-sharing) for more details.
- Many bug fixes

View File

@ -810,20 +810,20 @@ build() {
shift
done
if [[ ${build_appsign} && ! -f ${build_key} ]]; then
exitError "--appsign specified with invalid key file\n"
fi
init
OUTPUT_DIR="$(realpath "$OUTPUT_DIR")"
# Resolve appsign key to absolute path if under Windows
if [[ "${build_key}" && "$(uname -o)" == "Msys" ]]; then
build_key="$(realpath "${build_key}")"
fi
if ${build_snapshot}; then
TAG_NAME="HEAD"
local branch=`git rev-parse --abbrev-ref HEAD`
logInfo "Using current branch ${branch} to build..."
RELEASE_NAME="${RELEASE_NAME}-snapshot"
CMAKE_OPTIONS="${CMAKE_OPTIONS} -DKEEPASSXC_BUILD_TYPE=Snapshot"
CMAKE_OPTIONS="${CMAKE_OPTIONS} -DKEEPASSXC_BUILD_TYPE=Snapshot -DOVERRIDE_VERSION=${RELEASE_NAME}"
else
checkWorkingTreeClean
@ -852,14 +852,13 @@ build() {
git archive --format=tar "$TAG_NAME" --prefix="${prefix}/" --output="${OUTPUT_DIR}/${tarball_name}"
if ! ${build_snapshot}; then
# add .version file to tar
mkdir "${prefix}"
echo -n ${RELEASE_NAME} > "${prefix}/.version"
tar --append --file="${OUTPUT_DIR}/${tarball_name}" "${prefix}/.version"
rm "${prefix}/.version"
rmdir "${prefix}" 2> /dev/null
fi
# add .version and .gitrev files to tarball
mkdir "${prefix}"
echo -n ${RELEASE_NAME} > "${prefix}/.version"
echo -n `git rev-parse --short=7 HEAD` > "${prefix}/.gitrev"
tar --append --file="${OUTPUT_DIR}/${tarball_name}" "${prefix}/.version" "${prefix}/.gitrev"
rm "${prefix}/.version" "${prefix}/.gitrev"
rmdir "${prefix}" 2> /dev/null
xz -6 "${OUTPUT_DIR}/${tarball_name}"
fi
@ -885,6 +884,8 @@ build() {
# linuxdeploy requires /usr as install prefix
INSTALL_PREFIX="/usr"
fi
# Do not build tests cases
CMAKE_OPTIONS="${CMAKE_OPTIONS} -DWITH_TESTS=OFF"
if [ "$COMPILER" == "g++" ]; then
export CC=gcc
@ -908,7 +909,7 @@ build() {
make ${MAKE_OPTIONS} package
# Appsign the executables if desired
if [[ ${build_appsign} ]]; then
if ${build_appsign}; then
logInfo "Signing executable files"
appsign "-f" "./${APP_NAME}-${RELEASE_NAME}.dmg" "-k" "${build_key}"
fi
@ -917,14 +918,14 @@ build() {
elif [ "$(uname -o)" == "Msys" ]; then
# Building on Windows with Msys2
logInfo "Configuring build..."
cmake -DCMAKE_BUILD_TYPE=Release -DWITH_TESTS=Off -G"MSYS Makefiles" \
cmake -DCMAKE_BUILD_TYPE=Release -G"MSYS Makefiles" \
-DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" ${CMAKE_OPTIONS} "$SRC_DIR"
logInfo "Compiling and packaging sources..."
mingw32-make ${MAKE_OPTIONS} preinstall
# Appsign the executables if desired
if [[ ${build_appsign} ]]; then
if ${build_appsign} && [ -f "${build_key}" ]; then
logInfo "Signing executable files"
appsign "-f" $(find src | grep -P '\.exe$|\.dll$') "-k" "${build_key}"
fi
@ -949,7 +950,7 @@ build() {
# Building on Linux without Docker container
logInfo "Configuring build..."
cmake -DCMAKE_BUILD_TYPE=Release -DWITH_TESTS=Off ${CMAKE_OPTIONS} \
cmake -DCMAKE_BUILD_TYPE=Release ${CMAKE_OPTIONS} \
-DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" "$SRC_DIR"
logInfo "Compiling sources..."
@ -981,7 +982,7 @@ build() {
-v "$(realpath "$OUTPUT_DIR"):/keepassxc/out:rw" \
"$DOCKER_IMAGE" \
bash -c "cd /keepassxc/out/build-release && \
cmake -DCMAKE_BUILD_TYPE=Release -DWITH_TESTS=Off ${CMAKE_OPTIONS} \
cmake -DCMAKE_BUILD_TYPE=Release ${CMAKE_OPTIONS} \
-DCMAKE_INSTALL_PREFIX=${INSTALL_PREFIX} /keepassxc/src && \
make ${MAKE_OPTIONS} && make DESTDIR=/keepassxc/out/KeePassXC.AppDir install/strip"
fi
@ -1143,7 +1144,7 @@ appsign() {
fi
logInfo "Signing app using codesign..."
codesign --sign "${key}" --verbose --deep --entitlements ${orig_dir}/share/macosx/keepassxc.entitlements ./app/KeePassXC.app
codesign --sign "${key}" --verbose --deep --entitlements "${SRC_DIR}/share/macosx/keepassxc.entitlements" ./app/KeePassXC.app
if [ 0 -ne $? ]; then
cd "${orig_dir}"

View File

@ -23,7 +23,7 @@ file(GLOB DATABASE_ICONS icons/database/*.png)
install(FILES ${DATABASE_ICONS} DESTINATION ${DATA_INSTALL_DIR}/icons/database)
if(UNIX AND NOT APPLE)
if(UNIX AND NOT APPLE AND NOT HAIKU)
install(DIRECTORY icons/application/ DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor
FILES_MATCHING PATTERN "keepassx*.png" PATTERN "keepassx*.svg"
PATTERN "status" EXCLUDE PATTERN "actions" EXCLUDE PATTERN "categories" EXCLUDE)
@ -33,7 +33,7 @@ if(UNIX AND NOT APPLE)
install(FILES linux/org.keepassxc.KeePassXC.desktop DESTINATION ${CMAKE_INSTALL_DATADIR}/applications)
install(FILES linux/org.keepassxc.KeePassXC.appdata.xml DESTINATION ${CMAKE_INSTALL_DATADIR}/metainfo)
install(FILES linux/keepassxc.xml DESTINATION ${CMAKE_INSTALL_DATADIR}/mime/packages)
endif(UNIX AND NOT APPLE)
endif(UNIX AND NOT APPLE AND NOT HAIKU)
if(APPLE)
install(FILES macosx/keepassxc.icns DESTINATION ${DATA_INSTALL_DIR})

View File

@ -50,6 +50,37 @@
</screenshots>
<releases>
<release version="2.4.1" date="2019-04-12">
<description>
<ul>
<li>Fix database deletion when using unsafe saves to a different file system [#2889]</li>
<li>Fix opening databases with legacy key files that contain '/' [#2872]</li>
<li>Fix opening database files from the command line [#2919]</li>
<li>Fix crash when editing master key [#2836]</li>
<li>Fix multiple issues with apply button behavior [#2947]</li>
<li>Fix issues on application startup (tab order, --pw-stdin, etc.) [#2830]</li>
<li>Fix building without WITH_XC_KEESHARE</li>
<li>Fix reference entry coloring on macOS dark mode [#2984]</li>
<li>Hide window when performing entry auto-type on macOS [#2969]</li>
<li>Improve UX of update checker; reduce checks to every 7 days [#2968]</li>
<li>KeeShare improvements [#2946, #2978, #2824]</li>
<li>Re-enable Ctrl+C to copy password from search box [#2947]</li>
<li>Add KeePassXC-Browser integration for Brave browser [#2933]</li>
<li>SSH Agent: Re-Add keys on database unlock [#2982]</li>
<li>SSH Agent: Only remove keys on app exit if they are removed on lock [#2985]</li>
<li>CLI: Add --no-password option [#2708]</li>
<li>CLI: Improve database extraction to XML [#2698]</li>
<li>CLI: Don't call mandb on build [#2774]</li>
<li>CLI: Add debug info [#2714]</li>
<li>Improve support for Snap theming [#2832]</li>
<li>Add support for building on Haiku OS [#2859]</li>
<li>Ctrl+PgDn now goes to the next tab and Ctrl+PgUp to the previous</li>
<li>Fix compiling on GCC 5 / Xenial [#2990]</li>
<li>Add .gitrev output to tarball for third-party builds [#2970]</li>
<li>Add WITH_XC_UPDATECHECK compile flag to enable/disable the update checker [#2968]</li>
</ul>
</description>
</release>
<release version="2.4.0" date="2019-03-19">
<description>
<ul>

View File

@ -104,7 +104,7 @@
</message>
<message>
<source>Startup</source>
<translation type="unfinished"/>
<translation>Inicialització</translation>
</message>
<message>
<source>Start only a single instance of KeePassXC</source>
@ -128,7 +128,7 @@
</message>
<message>
<source>File Management</source>
<translation type="unfinished"/>
<translation>Gestió de fitxers</translation>
</message>
<message>
<source>Safely save database files (may be incompatible with Dropbox, etc)</source>
@ -136,7 +136,7 @@
</message>
<message>
<source>Backup database file before saving</source>
<translation type="unfinished"/>
<translation>Fes una còpia de seguretat abans de desar</translation>
</message>
<message>
<source>Automatically save after every change</source>
@ -156,7 +156,7 @@
</message>
<message>
<source>Entry Management</source>
<translation type="unfinished"/>
<translation>Gestió d&apos;entrades</translation>
</message>
<message>
<source>Use group icon on entry creation</source>
@ -168,7 +168,7 @@
</message>
<message>
<source>Hide the entry preview panel</source>
<translation type="unfinished"/>
<translation>Oculta el panell de previsualització d&apos;entrades</translation>
</message>
<message>
<source>General</source>
@ -176,7 +176,7 @@
</message>
<message>
<source>Hide toolbar (icons)</source>
<translation type="unfinished"/>
<translation>Oculta la barra d&apos;eines (les icones)</translation>
</message>
<message>
<source>Minimize instead of app exit</source>
@ -233,11 +233,11 @@
</message>
<message>
<source>Check for updates at application startup</source>
<translation type="unfinished"/>
<translation>Comprova si hi ha actualitzacions a l&apos;inici</translation>
</message>
<message>
<source>Include pre-releases when checking for updates</source>
<translation type="unfinished"/>
<translation>Inclou versions provisionals quan es comprovi si hi ha actualitzacions</translation>
</message>
<message>
<source>Movable toolbar</source>
@ -245,7 +245,7 @@
</message>
<message>
<source>Button style</source>
<translation type="unfinished"/>
<translation>Estil de botó</translation>
</message>
</context>
<context>
@ -433,7 +433,7 @@ Seleccioneu si voleu permetre l&apos;accés.</translation>
</message>
<message>
<source>Ok</source>
<translation type="unfinished"/>
<translation>D&apos;acord</translation>
</message>
<message>
<source>Cancel</source>
@ -589,7 +589,7 @@ Please select the correct database for saving credentials.</source>
</message>
<message>
<source>&amp;Tor Browser</source>
<translation type="unfinished"/>
<translation>Navegador &amp;Tor</translation>
</message>
<message>
<source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: </source>
@ -597,7 +597,7 @@ Please select the correct database for saving credentials.</source>
</message>
<message>
<source>Executable Files</source>
<translation type="unfinished"/>
<translation>Fitxers executables</translation>
</message>
<message>
<source>All Files</source>
@ -3507,7 +3507,7 @@ We recommend you use the AppImage available on our downloads page.</source>
</message>
<message>
<source>Check for Updates...</source>
<translation type="unfinished"/>
<translation>Comprova si hi ha actualitzacions...</translation>
</message>
<message>
<source>Share entry</source>
@ -3520,15 +3520,15 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Check for updates on startup?</source>
<translation type="unfinished"/>
<translation>Voleu comprovar si hi ha actualitzacions a l&apos;inici?</translation>
</message>
<message>
<source>Would you like KeePassXC to check for updates on startup?</source>
<translation type="unfinished"/>
<translation>Voleu que KeePassXC comprovi si hi ha actualitzacions a l&apos;inici?</translation>
</message>
<message>
<source>You can always check for updates manually from the application menu.</source>
<translation type="unfinished"/>
<translation>Sempre pots comprovar si hi ha actualitzacions manualment als menús de l&apos;aplicació.</translation>
</message>
</context>
<context>
@ -5194,7 +5194,7 @@ Available commands:
</message>
<message>
<source>Export to %1</source>
<translation type="unfinished"/>
<translation>Exporta a %1</translation>
</message>
<message>
<source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
@ -5261,7 +5261,7 @@ Available commands:
</message>
<message>
<source>Closing in %1 seconds.</source>
<translation type="unfinished"/>
<translation>Tancant en %1 segons.</translation>
</message>
</context>
<context>
@ -5288,7 +5288,7 @@ Available commands:
</message>
<message>
<source>Custom Settings</source>
<translation type="unfinished"/>
<translation>Paràmetres a mida</translation>
</message>
<message>
<source>Time step:</source>
@ -5309,7 +5309,7 @@ Available commands:
</message>
<message>
<source>7 digits</source>
<translation type="unfinished"/>
<translation>7 dígits</translation>
</message>
<message>
<source>8 digits</source>
@ -5320,11 +5320,11 @@ Available commands:
<name>UpdateCheckDialog</name>
<message>
<source>Checking for updates</source>
<translation type="unfinished"/>
<translation>Comprovant si hi ha actualitzacions</translation>
</message>
<message>
<source>Checking for updates...</source>
<translation type="unfinished"/>
<translation>Comprovant si hi ha actualitzacions...</translation>
</message>
<message>
<source>Close</source>
@ -5332,7 +5332,7 @@ Available commands:
</message>
<message>
<source>Update Error!</source>
<translation type="unfinished"/>
<translation>Error d&apos;actualització!</translation>
</message>
<message>
<source>An error occurred in retrieving update information.</source>
@ -5340,15 +5340,15 @@ Available commands:
</message>
<message>
<source>Please try again later.</source>
<translation type="unfinished"/>
<translation>Si us plau, proveu-ho altre cop més tard.</translation>
</message>
<message>
<source>Software Update</source>
<translation type="unfinished"/>
<translation>Actualització de programari</translation>
</message>
<message>
<source>A new version of KeePassXC is available!</source>
<translation type="unfinished"/>
<translation>Hi ha disponible una nova versió de KeePassXC!</translation>
</message>
<message>
<source>KeePassXC %1 is now available you have %2.</source>
@ -5356,11 +5356,11 @@ Available commands:
</message>
<message>
<source>Download it at keepassxc.org</source>
<translation type="unfinished"/>
<translation>Descarregueu-ho a keepassxc.org</translation>
</message>
<message>
<source>You&apos;re up-to-date!</source>
<translation type="unfinished"/>
<translation>Esteu actualitzats!</translation>
</message>
<message>
<source>KeePassXC %1 is currently the newest version available</source>
@ -5395,7 +5395,7 @@ Available commands:
</message>
<message>
<source>Welcome to KeePassXC %1</source>
<translation type="unfinished"/>
<translation>Benvinguts/des al KeePassXC %1</translation>
</message>
</context>
<context>

View File

@ -611,15 +611,15 @@ Vyberte databázi, do které chcete přihlašovací údaje uložit.</translation
</message>
<message>
<source>Due to Snap sandboxing, you must run a script to enable browser integration.&lt;br /&gt;You can obtain this script from %1</source>
<translation type="unfinished"/>
<translation>Z důvodu, že software ze Snap balíčku je provozován v ohraničeném prostředí, je třeba spustit skript, který zapíná napojení na webový prohlížeč. &lt;br /&gt;Tento skript je možné získat z %1</translation>
</message>
<message>
<source>Please see special instructions for browser extension use below</source>
<translation type="unfinished"/>
<translation>Níže si přečtěte konkrétní pokyny pro rozšíření do webového prohlížeče</translation>
</message>
<message>
<source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</source>
<translation type="unfinished"/>
<translation>Aby fungovalo napojení na prohlížeč, je třeba KeePassXC. &lt;br /&gt; Stáhnete ho pro %1 a %2. %3</translation>
</message>
</context>
<context>
@ -696,19 +696,23 @@ Přesunuto %2 klíčů do uživatelsky určených dat.</translation>
</message>
<message>
<source>KeePassXC: Create a new group</source>
<translation type="unfinished"/>
<translation>KeePassXC: vytvořit novou skupinu</translation>
</message>
<message>
<source>A request for creating a new group &quot;%1&quot; has been received.
Do you want to create this group?
</source>
<translation type="unfinished"/>
<translation>Byl obdržen požadavek na vytvoření nové skupiny %1.
Chcete tuto skupinu vytvořit?
</translation>
</message>
<message>
<source>Your KeePassXC-Browser settings need to be moved into the database settings.
This is necessary to maintain your current browser connections.
Would you like to migrate your existing settings now?</source>
<translation type="unfinished"/>
<translation>Vaše nastavení KeePassXC-Browser je třeba přesunout do nastavení databáze.
Toto je nezbytné pro zachování vašich stávajících spojení prohlížeče.
Chcete přenést vaše stávající nastavení nyní?</translation>
</message>
</context>
<context>
@ -872,7 +876,7 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>Key not transformed. This is a bug, please report it to the developers!</source>
<translation type="unfinished"/>
<translation>Klíč nebyl přeměněn. Toto je chyba, nahlaste to vývojářům.</translation>
</message>
</context>
<context>
@ -1630,7 +1634,7 @@ Vypnout bezpečné ukládání a zkusit to znovu?</translation>
</message>
<message>
<source>Shared group...</source>
<translation type="unfinished"/>
<translation>Sdílená skupina</translation>
</message>
</context>
<context>
@ -2075,15 +2079,15 @@ Vypnout bezpečné ukládání a zkusit to znovu?</translation>
</message>
<message>
<source>The export container %1 is already referenced.</source>
<translation type="unfinished"/>
<translation>Exportní kontejner %1 je odkazován.</translation>
</message>
<message>
<source>The import container %1 is already imported.</source>
<translation type="unfinished"/>
<translation>Importní kontejner %1 byl naimportován.</translation>
</message>
<message>
<source>The container %1 imported and export by different groups.</source>
<translation type="unfinished"/>
<translation>Kontejner %1 naimportován a exportován různými skupinami.</translation>
</message>
</context>
<context>
@ -3156,19 +3160,19 @@ Line %2, column %3</source>
</message>
<message>
<source>Disabled share %1</source>
<translation type="unfinished"/>
<translation>Sdílení %1 vypnuto</translation>
</message>
<message>
<source>Import from share %1</source>
<translation type="unfinished"/>
<translation>Importovat ze sdílení %1</translation>
</message>
<message>
<source>Export to share %1</source>
<translation type="unfinished"/>
<translation>Exportovat do sdílení %1</translation>
</message>
<message>
<source>Synchronize with share %1</source>
<translation type="unfinished"/>
<translation>Synchronizovat se sdílením %1</translation>
</message>
</context>
<context>
@ -4053,7 +4057,7 @@ Očekávejte chyby a drobné problémy, tato verze není určena pro produkční
</message>
<message>
<source>Regenerate</source>
<translation>Regenerovat</translation>
<translation>Vytvoř nové</translation>
</message>
</context>
<context>
@ -4856,7 +4860,7 @@ Příkazy k dispozici:
</message>
<message>
<source>Cannot create new group</source>
<translation type="unfinished"/>
<translation>Novou skupinu se nedaří vytvořit</translation>
</message>
</context>
<context>
@ -5132,7 +5136,7 @@ Příkazy k dispozici:
</message>
<message>
<source>Signer:</source>
<translation type="unfinished"/>
<translation>Podepsal(a):</translation>
</message>
</context>
<context>
@ -5255,27 +5259,27 @@ Příkazy k dispozici:
</message>
<message>
<source>Multiple import source path to %1 in %2</source>
<translation type="unfinished"/>
<translation>Popis umístění zdroje pro vícero importů do %1 v %2</translation>
</message>
<message>
<source>Conflicting export target path %1 in %2</source>
<translation type="unfinished"/>
<translation>Kolidující popis umístění %1 cíle exportu v %2</translation>
</message>
<message>
<source>Could not embed signature: Could not open file to write (%1)</source>
<translation type="unfinished"/>
<translation>Nedaří se zapouzdřit podpis: Soubor se nedaří otevřít pro zápis (%1)</translation>
</message>
<message>
<source>Could not embed signature: Could not write file (%1)</source>
<translation type="unfinished"/>
<translation>Nedaří se zapouzdřit podpis: Do souboru se nedaří zapsat (%1)</translation>
</message>
<message>
<source>Could not embed database: Could not open file to write (%1)</source>
<translation type="unfinished"/>
<translation>Nedaří se zapouzdřit databázi: Soubor se nedaří otevřít pro zápis (%1)</translation>
</message>
<message>
<source>Could not embed database: Could not write file (%1)</source>
<translation type="unfinished"/>
<translation>Nedaří se zapouzdřit databázi: Do souboru se nedaří zapsat (%1)</translation>
</message>
</context>
<context>

View File

@ -192,7 +192,7 @@
</message>
<message>
<source>Hide window to system tray when minimized</source>
<translation>Fenster verstecken wenn minimiert</translation>
<translation>Fenster verstecken, wenn minimiert</translation>
</message>
<message>
<source>Language</source>
@ -293,11 +293,11 @@
</message>
<message>
<source>Re-lock previously locked database after performing Auto-Type</source>
<translation>Datenbank nach Auto-Type automatisch wieder sperren.</translation>
<translation>Datenbank nach Auto-Type automatisch wieder sperren</translation>
</message>
<message>
<source>Don&apos;t require password repeat when it is visible</source>
<translation>Keine erneute Passworteingabe verlangen, wenn das Passwort sichtbar ist.</translation>
<translation>Keine erneute Passworteingabe verlangen, wenn das Passwort sichtbar ist</translation>
</message>
<message>
<source>Don&apos;t hide passwords when editing them</source>
@ -313,7 +313,7 @@
</message>
<message>
<source>Hide entry notes by default</source>
<translation>Eintrags-Notizen standardmäßig verstecken</translation>
<translation>Eintragsnotizen standardmäßig verstecken</translation>
</message>
<message>
<source>Privacy</source>
@ -443,7 +443,7 @@ Bitte wählen Sie, ob Sie den Zugriff erlauben möchten.</translation>
<source>You have multiple databases open.
Please select the correct database for saving credentials.</source>
<translation>Du hast mehrere Datenbanken geöffnet.
Bitte wähle die richtige Datenbank zum speichern der Anmeldedaten.</translation>
Bitte wähle die richtige Datenbank zum Speichern der Anmeldedaten.</translation>
</message>
</context>
<context>
@ -594,7 +594,7 @@ Bitte wähle die richtige Datenbank zum speichern der Anmeldedaten.</translation
</message>
<message>
<source>&lt;b&gt;Warning&lt;/b&gt;, the keepassxc-proxy application was not found!&lt;br /&gt;Please check the KeePassXC installation directory or confirm the custom path in advanced options.&lt;br /&gt;Browser integration WILL NOT WORK without the proxy application.&lt;br /&gt;Expected Path: </source>
<translation>&lt;b&gt;Achtung&lt;/b&gt;, die keepassxc-proxy Anwendung wurde nicht gefunden!&lt;br /&gt;Bitte überprüfe den KeePassXC-Ordner oder bestätige den benutzerdefinierten Ort in den erweiterten Einstellungen.&lt;br /&gt;Die Browseranbindung wird nicht funktionieren, wenn das Proxyprogramm nicht eingebunden ist.&lt;br /&gt;Vermuteter Pfad:</translation>
<translation>&lt;b&gt;Achtung&lt;/b&gt;, die KeePassXC-Proxy Anwendung wurde nicht gefunden!&lt;br /&gt;Bitte überprüfen Sie den KeePassXC-Ordner oder bestätigen Sie den benutzerdefinierten Ort in den erweiterten Einstellungen.&lt;br /&gt;Die Browseranbindung wird nicht funktionieren, wenn das Proxyprogramm nicht eingebunden ist.&lt;br /&gt;Vermuteter Pfad:</translation>
</message>
<message>
<source>Executable Files</source>
@ -607,19 +607,19 @@ Bitte wähle die richtige Datenbank zum speichern der Anmeldedaten.</translation
<message>
<source>Do not ask permission for HTTP &amp;Basic Auth</source>
<extracomment>An extra HTTP Basic Auth setting</extracomment>
<translation>Nicht nach HTTP Basic Auth fragen</translation>
<translation>Niemals fragen, bevor für &quot;HTTP Basic Auth&quot; auf Anmeldedaten zugegriffen wird</translation>
</message>
<message>
<source>Due to Snap sandboxing, you must run a script to enable browser integration.&lt;br /&gt;You can obtain this script from %1</source>
<translation type="unfinished"/>
<translation>Aufgrund von Snap Sandboxing müssen Sie ein Skript ausführen, um die Browser-Integration zu aktivieren.&lt;br /&gt;Sie können dieses Skript erhalten unter %1</translation>
</message>
<message>
<source>Please see special instructions for browser extension use below</source>
<translation type="unfinished"/>
<translation>Bitte beachten Sie die untenstehenden speziellen Anweisungen für die Verwendung der Browser-Erweiterung</translation>
</message>
<message>
<source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</source>
<translation type="unfinished"/>
<translation>KeePassXC-Browser wird für die Funktion der Browserintegration benötigt. &lt;br /&gt;Laden Sie es für %1 und %2. %3 herunter.</translation>
</message>
</context>
<context>
@ -670,7 +670,7 @@ Möchten Sie diesen überschreiben?</translation>
</message>
<message>
<source>KeePassXC: Converted KeePassHTTP attributes</source>
<translation>KeepassXC: KeePassHTTP-Attribute wurden umgewandelt</translation>
<translation>KeePassXC: KeePassHTTP-Attribute wurden umgewandelt</translation>
</message>
<message>
<source>Successfully converted attributes from %1 entry(s).
@ -696,19 +696,23 @@ Moved %2 keys to custom data.</source>
</message>
<message>
<source>KeePassXC: Create a new group</source>
<translation type="unfinished"/>
<translation>KeePassXC: Neue Gruppe erstellen</translation>
</message>
<message>
<source>A request for creating a new group &quot;%1&quot; has been received.
Do you want to create this group?
</source>
<translation type="unfinished"/>
<translation>Eine Anfrage zur Erstellung einer neuen Gruppe &quot;%1&quot; ist eingegangen.
Möchten Sie diese Gruppe erstellen?
</translation>
</message>
<message>
<source>Your KeePassXC-Browser settings need to be moved into the database settings.
This is necessary to maintain your current browser connections.
Would you like to migrate your existing settings now?</source>
<translation type="unfinished"/>
<translation>Ihre KeePassXC-Browser-Einstellungen müssen in die Datenbankeinstellungen verschoben werden.
Dies ist notwendig, um Ihre aktuellen Browserverbindungen aufrechtzuerhalten.
Möchten Sie Ihre bestehenden Einstellungen jetzt migrieren?</translation>
</message>
</context>
<context>
@ -871,7 +875,7 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>Key not transformed. This is a bug, please report it to the developers!</source>
<translation type="unfinished"/>
<translation>Schlüssel nicht umgewandelt. Dies ist ein Fehler, bitte melden Sie ihn den Entwicklern!</translation>
</message>
</context>
<context>
@ -1630,7 +1634,7 @@ Sicheres Speichern deaktivieren und erneut versuchen?</translation>
</message>
<message>
<source>Shared group...</source>
<translation type="unfinished"/>
<translation>Gemeinsame Gruppe...</translation>
</message>
</context>
<context>
@ -2075,15 +2079,15 @@ Sicheres Speichern deaktivieren und erneut versuchen?</translation>
</message>
<message>
<source>The export container %1 is already referenced.</source>
<translation type="unfinished"/>
<translation>Der Exportcontainer %1 wird bereits referenziert.</translation>
</message>
<message>
<source>The import container %1 is already imported.</source>
<translation type="unfinished"/>
<translation>Der Importcontainer %1 ist bereits importiert.</translation>
</message>
<message>
<source>The container %1 imported and export by different groups.</source>
<translation type="unfinished"/>
<translation>Der Container %1 wird von unterschiedlichen Gruppen importiert und exportiert.</translation>
</message>
</context>
<context>
@ -3154,19 +3158,19 @@ Zeile %2, Spalte %3</translation>
</message>
<message>
<source>Disabled share %1</source>
<translation type="unfinished"/>
<translation>Freigabe %1 deaktiviert</translation>
</message>
<message>
<source>Import from share %1</source>
<translation type="unfinished"/>
<translation>Von Freigabe %1 importieren</translation>
</message>
<message>
<source>Export to share %1</source>
<translation type="unfinished"/>
<translation>Zu Freigabe %1 exportieren</translation>
</message>
<message>
<source>Synchronize with share %1</source>
<translation type="unfinished"/>
<translation>Mit Freigabe %1 synchronisieren</translation>
</message>
</context>
<context>
@ -3447,8 +3451,8 @@ Diese Version ist nicht für den Produktiveinsatz gedacht.</translation>
<message>
<source>WARNING: Your Qt version may cause KeePassXC to crash with an On-Screen Keyboard!
We recommend you use the AppImage available on our downloads page.</source>
<translation>WARNUNG: Deine Qt Version könnte KeePassXC mit einer Bildschirmtastatur zu abstürzen bringen!
Wir empfehlen dir die Verwendung des auf unserer Downloadseite verfügbaren AppImage.</translation>
<translation>WARNUNG: Deine Qt-Version könnte KeePassXC mit einer Bildschirmtastatur zu abstürzen bringen!
Wir empfehlen die Verwendung des verfügbaren App-Images auf unserer Downloadseite.</translation>
</message>
<message>
<source>&amp;Import</source>
@ -3815,7 +3819,7 @@ Da sie Fehler beinhalten könnte, ist diese Version nicht für den Produktiveins
</message>
<message>
<source>&lt;p&gt;A password is the primary method for securing your database.&lt;/p&gt;&lt;p&gt;Good passwords are long and unique. KeePassXC can generate one for you.&lt;/p&gt;</source>
<translation>&lt;p&gt;Ein Passwort ist die primäre Methode, Ihre Datenbank abzusichern.&lt;/p&gt;&lt;p&gt;Gute Passwörter sind lang und einzigartig. KeepassXC kann eins für Sie generieren.&lt;/p&gt;</translation>
<translation>&lt;p&gt;Ein Passwort ist die primäre Methode, Ihre Datenbank abzusichern.&lt;/p&gt;&lt;p&gt;Gute Passwörter sind lang und einzigartig. KeePassXC kann eins für Sie generieren.&lt;/p&gt;</translation>
</message>
<message>
<source>Passwords do not match.</source>
@ -4854,7 +4858,7 @@ Verfügbare Kommandos:
</message>
<message>
<source>Cannot create new group</source>
<translation type="unfinished"/>
<translation>Neue Gruppe kann nicht erstellt werden</translation>
</message>
</context>
<context>
@ -5130,7 +5134,7 @@ Verfügbare Kommandos:
</message>
<message>
<source>Signer:</source>
<translation type="unfinished"/>
<translation>Unterzeichner:</translation>
</message>
</context>
<context>
@ -5177,7 +5181,7 @@ Verfügbare Kommandos:
</message>
<message>
<source>Signed share container are not supported - import prevented</source>
<translation>Unterzeichnete geteilte Container werden nicht unterstützt. Import verhindert.</translation>
<translation>Unterzeichnete geteilte Container werden nicht unterstützt - Import verhindert</translation>
</message>
<message>
<source>File is not readable</source>
@ -5201,7 +5205,7 @@ Verfügbare Kommandos:
</message>
<message>
<source>Unsigned share container are not supported - import prevented</source>
<translation>Nicht unterzeichnete geteilte Container werden nicht unterstützt. Import verhindert.</translation>
<translation>Nicht unterzeichnete geteilte Container werden nicht unterstützt - Import verhindert</translation>
</message>
<message>
<source>Successful unsigned import</source>
@ -5213,11 +5217,11 @@ Verfügbare Kommandos:
</message>
<message>
<source>Unknown share container type</source>
<translation>Unbekannter geteilter Container-Typ</translation>
<translation>Unbekannter geteilter Containertyp</translation>
</message>
<message>
<source>Overwriting signed share container is not supported - export prevented</source>
<translation>Überschreiben von unterzeichneten geteilten Containern nicht unterstützt. Export verhindert.</translation>
<translation>Überschreiben von unterzeichneten geteilten Containern nicht unterstützt - Export verhindert</translation>
</message>
<message>
<source>Could not write export container (%1)</source>
@ -5225,7 +5229,7 @@ Verfügbare Kommandos:
</message>
<message>
<source>Overwriting unsigned share container is not supported - export prevented</source>
<translation>Überschreiben von nicht unterzeichneten geteilten Containern nicht unterstützt. Export verhindert.</translation>
<translation>Überschreiben von nicht unterzeichneten geteilten Containern nicht unterstützt - Export verhindert</translation>
</message>
<message>
<source>Could not write export container</source>
@ -5253,27 +5257,27 @@ Verfügbare Kommandos:
</message>
<message>
<source>Multiple import source path to %1 in %2</source>
<translation type="unfinished"/>
<translation>Multipler Import-Quellpfad zu %1 in %2</translation>
</message>
<message>
<source>Conflicting export target path %1 in %2</source>
<translation type="unfinished"/>
<translation>Konflikt beim Export-Zielpfad %1 in %2 </translation>
</message>
<message>
<source>Could not embed signature: Could not open file to write (%1)</source>
<translation type="unfinished"/>
<translation>Signatur konnte nicht eingebunden werden: Zum Schreiben konnte die Datei (%1) nicht geöffnet werden </translation>
</message>
<message>
<source>Could not embed signature: Could not write file (%1)</source>
<translation type="unfinished"/>
<translation>Signatur konnte nicht eingebunden werden: Datei konnte nicht geschrieben werden (%1)</translation>
</message>
<message>
<source>Could not embed database: Could not open file to write (%1)</source>
<translation type="unfinished"/>
<translation>Datenbank konnte nicht eingebunden werden: Zum Schreiben konnte die Datei (%1) nicht geöffnet werden </translation>
</message>
<message>
<source>Could not embed database: Could not write file (%1)</source>
<translation type="unfinished"/>
<translation>Datenbank konnte nicht eingebunden werden: Datei konnte nicht geschrieben werden (%1)</translation>
</message>
</context>
<context>
@ -5411,7 +5415,7 @@ Verfügbare Kommandos:
</message>
<message>
<source>You&apos;re up-to-date!</source>
<translation>Version aktuel</translation>
<translation>Version aktuell</translation>
</message>
<message>
<source>KeePassXC %1 is currently the newest version available</source>

View File

@ -112,18 +112,6 @@
<source>Start only a single instance of KeePassXC</source>
<translation>Start only a single instance of KeePassXC</translation>
</message>
<message>
<source>Remember last databases</source>
<translation>Remember last databases</translation>
</message>
<message>
<source>Remember last key files and security dongles</source>
<translation>Remember last key files and security dongles</translation>
</message>
<message>
<source>Load previous databases on startup</source>
<translation>Load previous databases on startup</translation>
</message>
<message>
<source>Minimize window at application startup</source>
<translation>Minimize window at application startup</translation>
@ -196,10 +184,6 @@
<source>Hide window to system tray when minimized</source>
<translation>Hide window to system tray when minimized</translation>
</message>
<message>
<source>Language</source>
<translation>Language</translation>
</message>
<message>
<source>Auto-Type</source>
<translation>Auto-Type</translation>
@ -233,21 +217,41 @@
<source>Auto-Type start delay</source>
<translation>Auto-Type start delay</translation>
</message>
<message>
<source>Check for updates at application startup</source>
<translation>Check for updates at application startup</translation>
</message>
<message>
<source>Include pre-releases when checking for updates</source>
<translation>Include pre-releases when checking for updates</translation>
</message>
<message>
<source>Movable toolbar</source>
<translation>Movable toolbar</translation>
</message>
<message>
<source>Button style</source>
<translation>Button style</translation>
<source>Remember previously used databases</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Load previously open databases on startup</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Remember database key files and security dongles</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Check for updates at application startup once per week</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Include beta releases when checking for updates</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Button style:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Language:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>(restart program to activate)</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
@ -623,6 +627,10 @@ Please select the correct database for saving credentials.</translation>
<source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&amp;Brave</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>BrowserService</name>
@ -891,6 +899,11 @@ Would you like to migrate your existing settings now?</source>
<source>Key not transformed. This is a bug, please report it to the developers!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1
Backup database located at %2</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DatabaseOpenDialog</name>
@ -960,16 +973,12 @@ Please consider generating a new key file.</translation>
<translation>TouchID for quick unlock</translation>
</message>
<message>
<source>Unable to open the database:
%1</source>
<translation>Unable to open the database:
%1</translation>
<source>Failed to open key file: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Can&apos;t open key file:
%1</source>
<translation>Can&apos;t open key file:
%1</translation>
<source>Select slot...</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
@ -1458,10 +1467,6 @@ This is definitely a bug, please report it to the developers.</source>
<translation>The created database has no key or KDF, refusing to save it.
This is definitely a bug, please report it to the developers.</translation>
</message>
<message>
<source>The database file does not exist or is not accessible.</source>
<translation>The database file does not exist or is not accessible.</translation>
</message>
<message>
<source>Select CSV file</source>
<translation>Select CSV file</translation>
@ -1485,6 +1490,10 @@ This is definitely a bug, please report it to the developers.</translation>
<comment>Database tab name modifier</comment>
<translation>%1 [Read-only]</translation>
</message>
<message>
<source>Failed to open %1. It either does not exist or is not accessible.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DatabaseWidget</name>
@ -1629,12 +1638,6 @@ Error: %1</translation>
Disable safe saves and try again?</source>
<translation>KeePassXC has failed to save the database multiple times. This is likely caused by file sync services holding a lock on the save file.
Disable safe saves and try again?</translation>
</message>
<message>
<source>Writing the database failed.
%1</source>
<translation>Writing the database failed.
%1</translation>
</message>
<message>
<source>Passwords</source>
@ -1683,6 +1686,10 @@ Disable safe saves and try again?</translation>
<source>Shared group...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Writing the database failed: %1</source>
<translation type="unfinished">Writing the database failed: %1</translation>
</message>
</context>
<context>
<name>EditEntryWidget</name>
@ -1885,6 +1892,14 @@ Disable safe saves and try again?</translation>
<source>Use a specific sequence for this association:</source>
<translation>Use a specific sequence for this association:</translation>
</message>
<message>
<source>Open AutoType help webpage</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>AutoType help button</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>EditEntryWidgetHistory</name>
@ -2054,6 +2069,10 @@ Disable safe saves and try again?</translation>
<source>Inherit from parent group (%1)</source>
<translation>Inherit from parent group (%1)</translation>
</message>
<message>
<source>Entry has unsaved changes</source>
<translation type="unfinished">Entry has unsaved changes</translation>
</message>
</context>
<context>
<name>EditGroupWidgetKeeShare</name>
@ -2081,34 +2100,6 @@ Disable safe saves and try again?</translation>
<source>Inactive</source>
<translation>Inactive</translation>
</message>
<message>
<source>Import from path</source>
<translation>Import from path</translation>
</message>
<message>
<source>Export to path</source>
<translation>Export to path</translation>
</message>
<message>
<source>Synchronize with path</source>
<translation>Synchronize with path</translation>
</message>
<message>
<source>Your KeePassXC version does not support sharing your container type. Please use %1.</source>
<translation>Your KeePassXC version does not support sharing your container type. Please use %1.</translation>
</message>
<message>
<source>Database sharing is disabled</source>
<translation>Database sharing is disabled</translation>
</message>
<message>
<source>Database export is disabled</source>
<translation>Database export is disabled</translation>
</message>
<message>
<source>Database import is disabled</source>
<translation>Database import is disabled</translation>
</message>
<message>
<source>KeeShare unsigned container</source>
<translation>KeeShare unsigned container</translation>
@ -2134,15 +2125,45 @@ Disable safe saves and try again?</translation>
<translation type="unfinished">Clear</translation>
</message>
<message>
<source>The export container %1 is already referenced.</source>
<source>Import</source>
<translation type="unfinished">Import</translation>
</message>
<message>
<source>Export</source>
<translation type="unfinished">Export</translation>
</message>
<message>
<source>Synchronize</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The import container %1 is already imported.</source>
<source>Your KeePassXC version does not support sharing this container type.
Supported extensions are: %1.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The container %1 imported and export by different groups.</source>
<source>%1 is already being exported by this database.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 is already being imported by this database.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 is being imported and exported by different groups in this database.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>KeeShare is currently disabled. You can enable import/export in the application settings.</source>
<comment>KeeShare is a proper noun</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Database export is currently disabled by application settings.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Database import is currently disabled by application settings.</source>
<translation type="unfinished"></translation>
</message>
</context>
@ -2668,10 +2689,6 @@ This may cause the affected plugins to malfunction.</translation>
<source>Unable to issue challenge-response.</source>
<translation>Unable to issue challenge-response.</translation>
</message>
<message>
<source>Wrong key or database file is corrupt.</source>
<translation>Wrong key or database file is corrupt.</translation>
</message>
<message>
<source>missing database headers</source>
<translation>missing database headers</translation>
@ -2692,6 +2709,11 @@ This may cause the affected plugins to malfunction.</translation>
<source>Invalid header data length</source>
<translation>Invalid header data length</translation>
</message>
<message>
<source>Invalid credentials were provided, please try again.
If this reoccurs, then your database file may be corrupt.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Kdbx3Writer</name>
@ -2722,10 +2744,6 @@ This may cause the affected plugins to malfunction.</translation>
<source>Header SHA256 mismatch</source>
<translation>Header SHA256 mismatch</translation>
</message>
<message>
<source>Wrong key or database file is corrupt. (HMAC mismatch)</source>
<translation>Wrong key or database file is corrupt. (HMAC mismatch)</translation>
</message>
<message>
<source>Unknown cipher</source>
<translation>Unknown cipher</translation>
@ -2826,6 +2844,15 @@ This may cause the affected plugins to malfunction.</translation>
<extracomment>Translation: variant map = data structure for storing meta data</extracomment>
<translation>Invalid variant map field type size</translation>
</message>
<message>
<source>Invalid credentials were provided, please try again.
If this reoccurs, then your database file may be corrupt.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>(HMAC mismatch)</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Kdbx4Writer</name>
@ -3111,10 +3138,6 @@ Line %2, column %3</translation>
<source>Unable to calculate master key</source>
<translation>Unable to calculate master key</translation>
</message>
<message>
<source>Wrong key or database file is corrupt.</source>
<translation>Wrong key or database file is corrupt.</translation>
</message>
<message>
<source>Key transformation failed</source>
<translation>Key transformation failed</translation>
@ -3211,39 +3234,56 @@ Line %2, column %3</translation>
<source>unable to seek to content position</source>
<translation>unable to seek to content position</translation>
</message>
<message>
<source>Invalid credentials were provided, please try again.
If this reoccurs, then your database file may be corrupt.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>KeeShare</name>
<message>
<source>Disabled share</source>
<translation>Disabled share</translation>
</message>
<message>
<source>Import from</source>
<translation>Import from</translation>
</message>
<message>
<source>Export to</source>
<translation>Export to</translation>
</message>
<message>
<source>Synchronize with</source>
<translation>Synchronize with</translation>
</message>
<message>
<source>Disabled share %1</source>
<source>Invalid sharing reference</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Import from share %1</source>
<source>Inactive share %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Export to share %1</source>
<source>Imported from %1</source>
<translation type="unfinished">Imported from %1</translation>
</message>
<message>
<source>Exported to %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Synchronize with share %1</source>
<source>Synchronized with %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Import is disabled in settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Export is disabled in settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Inactive share</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Imported from</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Exported to</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Synchronized with</source>
<translation type="unfinished"></translation>
</message>
</context>
@ -4939,6 +4979,84 @@ Available commands:
<source>Cannot create new group</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Deactivate password key for the database.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Displays debugging information.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Deactivate password key for the database to merge from.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Version %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Build Type: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Revision: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Distribution: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Debugging mode is disabled.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Debugging mode is enabled.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Operating system: %1
CPU architecture: %2
Kernel: %3 %4</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Auto-Type</source>
<translation type="unfinished">Auto-Type</translation>
</message>
<message>
<source>KeeShare (signed and unsigned sharing)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>KeeShare (only signed sharing)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>KeeShare (only unsigned sharing)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>YubiKey</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>TouchID</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>None</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enabled extensions:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Cryptographic libraries:</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>QtIOCompressor</name>

View File

@ -50,7 +50,7 @@
<name>AgentSettingsWidget</name>
<message>
<source>Enable SSH Agent (requires restart)</source>
<translation>Habilitar el Agente SSH (requiere reinicio)</translation>
<translation>Habilitar el Agente de SSH (requiere reinicio)</translation>
</message>
<message>
<source>Use OpenSSH for Windows instead of Pageant</source>
@ -184,7 +184,7 @@
</message>
<message>
<source>Show a system tray icon</source>
<translation>Mostrar icono en la bandeja de del sistema</translation>
<translation>Mostrar icono en la bandeja del sistema</translation>
</message>
<message>
<source>Dark system tray icon</source>
@ -204,11 +204,11 @@
</message>
<message>
<source>Use entry title to match windows for global Auto-Type</source>
<translation>Use título de entrada para acertar ventanas en Auto-Tipeado global.</translation>
<translation>Use título de entrada para acertar ventanas en Auto-Escritura global.</translation>
</message>
<message>
<source>Use entry URL to match windows for global Auto-Type</source>
<translation>Use URL para acertar ventanas en Auto-Tipedo global</translation>
<translation>Use URL para acertar ventanas en Auto-Escritura global</translation>
</message>
<message>
<source>Always ask before performing Auto-Type</source>
@ -340,7 +340,7 @@
</message>
<message>
<source>The Syntax of your Auto-Type statement is incorrect!</source>
<translation>¡La sintaxis de la declaración de su auto-escritura es incorrecta!</translation>
<translation>¡La sintaxis de la declaración de su Auto-Escritura es incorrecta!</translation>
</message>
<message>
<source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source>
@ -404,7 +404,7 @@
<name>BrowserAccessControlDialog</name>
<message>
<source>KeePassXC-Browser Confirm Access</source>
<translation>KeePassXC-Navegador Confirmar Acceso</translation>
<translation>KeePassXC-Browser Confirmar Acceso</translation>
</message>
<message>
<source>Remember this decision</source>
@ -454,7 +454,7 @@ Por favor, seleccione la base de datos correcta para guardar las credenciales.</
</message>
<message>
<source>This is required for accessing your databases with KeePassXC-Browser</source>
<translation>Esto es necesario para acceder a las bases de datos con KeePassXC-Navegador</translation>
<translation>Esto es necesario para acceder a las bases de datos con KeePassXC-Browser</translation>
</message>
<message>
<source>Enable KeepassXC browser integration</source>
@ -611,15 +611,15 @@ Por favor, seleccione la base de datos correcta para guardar las credenciales.</
</message>
<message>
<source>Due to Snap sandboxing, you must run a script to enable browser integration.&lt;br /&gt;You can obtain this script from %1</source>
<translation type="unfinished"/>
<translation>Debido al modo aislado de Snap, debes ejecutar un código para permitir la integración con el navegador.&lt;br/&gt;Puedes obtener este código desde %1</translation>
</message>
<message>
<source>Please see special instructions for browser extension use below</source>
<translation type="unfinished"/>
<translation>Por favor ve las instrucciones especiales para el uso de extensiones del navegador debajo.</translation>
</message>
<message>
<source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</source>
<translation type="unfinished"/>
<translation>KeePassXC-Browser es necesario para que la integración con el navegador funcione. &lt;br /&gt;Descárguelo para %1 y %2. %3</translation>
</message>
</context>
<context>
@ -697,19 +697,23 @@ Movió %2 claves a datos personalizados.</translation>
</message>
<message>
<source>KeePassXC: Create a new group</source>
<translation type="unfinished"/>
<translation>KeePassXC: Crear un grupo nuevo</translation>
</message>
<message>
<source>A request for creating a new group &quot;%1&quot; has been received.
Do you want to create this group?
</source>
<translation type="unfinished"/>
<translation>Una solicitud para crear un nuevo grupo &quot;%1&quot; se ha recibido.
¿Quiere crear este grupo?
</translation>
</message>
<message>
<source>Your KeePassXC-Browser settings need to be moved into the database settings.
This is necessary to maintain your current browser connections.
Would you like to migrate your existing settings now?</source>
<translation type="unfinished"/>
<translation>Sus configuraciones de KeePassXC-Browser necesitan moverse a las configuraciones de base de datos.
Es necesario para mantener sus conexiones presentes del navegador.
¿Le gustaría migrar sus configuraciones existentes ahora?</translation>
</message>
</context>
<context>
@ -873,7 +877,7 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>Key not transformed. This is a bug, please report it to the developers!</source>
<translation type="unfinished"/>
<translation>Llave no está transformada. Esto es un bug, por favor, ¡informe sobre él a los desarrolladores!</translation>
</message>
</context>
<context>
@ -1006,7 +1010,7 @@ Considere generar un nuevo archivo llave.</translation>
</message>
<message>
<source>Move KeePassHTTP attributes to KeePassXC-Browser &amp;custom data</source>
<translation>Mueva los atributos de KeePassHTTP a los datos &amp;personalizados de KeePassXC-Browser</translation>
<translation>Mover los atributos de KeePassHTTP a los datos &amp;personalizados de KeePassXC-Browser</translation>
</message>
<message>
<source>Stored keys</source>
@ -1631,7 +1635,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Shared group...</source>
<translation type="unfinished"/>
<translation>Grupo compartido...</translation>
</message>
</context>
<context>
@ -2076,15 +2080,15 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>The export container %1 is already referenced.</source>
<translation type="unfinished"/>
<translation>El contenedor de exportación %1 ya es referenciado.</translation>
</message>
<message>
<source>The import container %1 is already imported.</source>
<translation type="unfinished"/>
<translation>El contenedor de importación %1 ya es importado.</translation>
</message>
<message>
<source>The container %1 imported and export by different groups.</source>
<translation type="unfinished"/>
<translation>El contenedor %1 se importa y se exporta por grupos diferentes.</translation>
</message>
</context>
<context>
@ -2928,7 +2932,7 @@ Esta migración es en único sentido. No podrá abrir la base de datos importada
</message>
<message>
<source>Auto-type association window or sequence missing</source>
<translation>Falta de secuencia o ventana de Asociación de auto-tipeado</translation>
<translation>Falta de secuencia o ventana de asociación de Auto-Escritura</translation>
</message>
<message>
<source>Invalid bool value</source>
@ -3155,19 +3159,19 @@ Linea %2, columna %3</translation>
</message>
<message>
<source>Disabled share %1</source>
<translation type="unfinished"/>
<translation>Deshabilitada cuota %1</translation>
</message>
<message>
<source>Import from share %1</source>
<translation type="unfinished"/>
<translation>Importar de cuota %1</translation>
</message>
<message>
<source>Export to share %1</source>
<translation type="unfinished"/>
<translation>Exportar a cuota %1</translation>
</message>
<message>
<source>Synchronize with share %1</source>
<translation type="unfinished"/>
<translation>Sincronizar con cuota %1</translation>
</message>
</context>
<context>
@ -3518,7 +3522,7 @@ Le recomendamos que utilice la AppImage disponible en nuestra página de descarg
</message>
<message>
<source>Perform &amp;Auto-Type</source>
<translation>Relizar &amp;Auto-Escritura</translation>
<translation>Realizar &amp;Auto-Escritura</translation>
</message>
<message>
<source>Open &amp;URL</source>
@ -4205,7 +4209,7 @@ Espere algunos errores y problemas menores, esta versión no está destinada par
</message>
<message>
<source>Path of the entry to add.</source>
<translation>Camino de la entrada para añadir.</translation>
<translation>Ruta de la entrada para añadir.</translation>
</message>
<message>
<source>Copy an entry&apos;s password to the clipboard.</source>
@ -4214,7 +4218,7 @@ Espere algunos errores y problemas menores, esta versión no está destinada par
<message>
<source>Path of the entry to clip.</source>
<comment>clip = copy to clipboard</comment>
<translation>Camino de la entrada para copiar.</translation>
<translation>Ruta de la entrada para copiar.</translation>
</message>
<message>
<source>Timeout in seconds before clearing the clipboard.</source>
@ -4234,7 +4238,7 @@ Espere algunos errores y problemas menores, esta versión no está destinada par
</message>
<message>
<source>Path of the entry to edit.</source>
<translation>Camino de la entrada para editar.</translation>
<translation>Ruta de la entrada para editar.</translation>
</message>
<message>
<source>Estimate the entropy of a password.</source>
@ -4805,7 +4809,7 @@ Comandos disponibles:
</message>
<message>
<source>Path of the entry to remove.</source>
<translation>Camino de la entrada a quitar.</translation>
<translation>Ruta de la entrada a quitar.</translation>
</message>
<message>
<source>Existing single-instance lock file is invalid. Launching new instance.</source>
@ -4857,7 +4861,7 @@ Comandos disponibles:
</message>
<message>
<source>Cannot create new group</source>
<translation type="unfinished"/>
<translation>No se puede crear el nuevo grupo</translation>
</message>
</context>
<context>
@ -5133,7 +5137,7 @@ Comandos disponibles:
</message>
<message>
<source>Signer:</source>
<translation type="unfinished"/>
<translation>Firmante:</translation>
</message>
</context>
<context>
@ -5256,27 +5260,27 @@ Comandos disponibles:
</message>
<message>
<source>Multiple import source path to %1 in %2</source>
<translation type="unfinished"/>
<translation>Ruta de origen de importación múltiple a %1 en %2</translation>
</message>
<message>
<source>Conflicting export target path %1 in %2</source>
<translation type="unfinished"/>
<translation>Ruta de destino de exportación contradictoria %1 en %2</translation>
</message>
<message>
<source>Could not embed signature: Could not open file to write (%1)</source>
<translation type="unfinished"/>
<translation>No se puede incrustar la firma: no se puede abrir el archivo para escribir (%1)</translation>
</message>
<message>
<source>Could not embed signature: Could not write file (%1)</source>
<translation type="unfinished"/>
<translation>No se puede incrustar la firma: no se puede escribir el archivo (%1)</translation>
</message>
<message>
<source>Could not embed database: Could not open file to write (%1)</source>
<translation type="unfinished"/>
<translation>No se puede incrustar la base de datos: no se puede abrir el archivo para escribir (%1)</translation>
</message>
<message>
<source>Could not embed database: Could not write file (%1)</source>
<translation type="unfinished"/>
<translation>No se puede incrustar la base de datos: no se puede escribir el archivo (%1)</translation>
</message>
</context>
<context>

View File

@ -611,15 +611,15 @@ Valitse oikea tietokanta tietueen tallentamiseksi</translation>
</message>
<message>
<source>Due to Snap sandboxing, you must run a script to enable browser integration.&lt;br /&gt;You can obtain this script from %1</source>
<translation type="unfinished"/>
<translation>Snap:in hiekkalaatikon takia sinun täytyy suorittaa komentosarja jotta voit aktivoida selainintegraation.&lt;br /&gt;Voit ladata komentosarjan osoitteesta %1</translation>
</message>
<message>
<source>Please see special instructions for browser extension use below</source>
<translation type="unfinished"/>
<translation>Katso yksityiskohtaisemmat ohjeet selainlaajennuksen käyttöön alta</translation>
</message>
<message>
<source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</source>
<translation type="unfinished"/>
<translation>KeePassXC-Browser tarvitaan selainintegraation toimimista varten.&lt;br /&gt;Dataa se seuraaville selaimille: %1 ja %2. %3</translation>
</message>
</context>
<context>
@ -695,19 +695,22 @@ Siirrettiin %2 avainta mukautettuihin tietoihin.</translation>
</message>
<message>
<source>KeePassXC: Create a new group</source>
<translation type="unfinished"/>
<translation>KeePassXC: Luo uusi ryhmä</translation>
</message>
<message>
<source>A request for creating a new group &quot;%1&quot; has been received.
Do you want to create this group?
</source>
<translation type="unfinished"/>
<translation>Vastaanotettiin pyyntö luoda uusi ryhmä &quot;%1&quot;.
Haluatko varmasti luoda tämän ryhmän?</translation>
</message>
<message>
<source>Your KeePassXC-Browser settings need to be moved into the database settings.
This is necessary to maintain your current browser connections.
Would you like to migrate your existing settings now?</source>
<translation type="unfinished"/>
<translation>KeePassXC-Browser:in asetukset täytyy siirtää tietokannan asetuksiin.
Tämä on välttämätöntä, jotta yhteys selainlaajennukseen säilyy muuttumattomana.
Haluat siirtää asetukset nyt?</translation>
</message>
</context>
<context>
@ -871,7 +874,7 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>Key not transformed. This is a bug, please report it to the developers!</source>
<translation type="unfinished"/>
<translation>Avainmuunnosta ei voitu suorittaa. Ole hyvä ja ilmoita tästä virheestä sovelluksen kehittäjille.</translation>
</message>
</context>
<context>
@ -1630,7 +1633,7 @@ Ota turvallinen tallennus pois käytöstä ja yritä uudelleen?</translation>
</message>
<message>
<source>Shared group...</source>
<translation type="unfinished"/>
<translation>Jaettu ryhmä...</translation>
</message>
</context>
<context>
@ -2075,15 +2078,15 @@ Ota turvallinen tallennus pois käytöstä ja yritä uudelleen?</translation>
</message>
<message>
<source>The export container %1 is already referenced.</source>
<translation type="unfinished"/>
<translation>Vientisäiliöön %1 on jo viitattu.</translation>
</message>
<message>
<source>The import container %1 is already imported.</source>
<translation type="unfinished"/>
<translation>Tuontisäiliö %1 on jo tuotu.</translation>
</message>
<message>
<source>The container %1 imported and export by different groups.</source>
<translation type="unfinished"/>
<translation>Säiliö %1 on tuotu ja viety eri ryhmien perusteella.</translation>
</message>
</context>
<context>
@ -3154,19 +3157,19 @@ Rivi %2, sarake %3</translation>
</message>
<message>
<source>Disabled share %1</source>
<translation type="unfinished"/>
<translation>Jako %1 otettu pois käytöstä</translation>
</message>
<message>
<source>Import from share %1</source>
<translation type="unfinished"/>
<translation>Tuo jaosta %1</translation>
</message>
<message>
<source>Export to share %1</source>
<translation type="unfinished"/>
<translation>Vie jaosta %1</translation>
</message>
<message>
<source>Synchronize with share %1</source>
<translation type="unfinished"/>
<translation>Synkronoi jaon %1 kanssa</translation>
</message>
</context>
<context>
@ -4855,7 +4858,7 @@ Käytettävissä olevat komennot:
</message>
<message>
<source>Cannot create new group</source>
<translation type="unfinished"/>
<translation>Uutta ryhmää ei voitu luoda</translation>
</message>
</context>
<context>
@ -5131,7 +5134,7 @@ Käytettävissä olevat komennot:
</message>
<message>
<source>Signer:</source>
<translation type="unfinished"/>
<translation>Allekirjoittaja:</translation>
</message>
</context>
<context>
@ -5250,31 +5253,31 @@ Käytettävissä olevat komennot:
</message>
<message>
<source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
<translation type="unfinished"/>
<translation>Haluatko luottaa kohteeseen %1 sormenjäljellä %2, joka on peräisin kohteesta %3? {1 ?} {2 ?}</translation>
</message>
<message>
<source>Multiple import source path to %1 in %2</source>
<translation type="unfinished"/>
<translation>Useampi lähde kohteeseen %1 tuonnissa %2</translation>
</message>
<message>
<source>Conflicting export target path %1 in %2</source>
<translation type="unfinished"/>
<translation>Ristiriita viennin %2 kohdepolussa %1</translation>
</message>
<message>
<source>Could not embed signature: Could not open file to write (%1)</source>
<translation type="unfinished"/>
<translation>Allekirjoitusta ei voitu sisällyttää: Tiedostoa ei voitu avata kirjoitusta varten (%1)</translation>
</message>
<message>
<source>Could not embed signature: Could not write file (%1)</source>
<translation type="unfinished"/>
<translation>Allekirjoitusta ei voitu sisällyttää: Tiedostoon kirjoitus epäonnistui (%1)</translation>
</message>
<message>
<source>Could not embed database: Could not open file to write (%1)</source>
<translation type="unfinished"/>
<translation>Tietokantaa ei voitu sisällyttää: Tiedostoa ei voitu avata kirjoitusta varten (%1)</translation>
</message>
<message>
<source>Could not embed database: Could not write file (%1)</source>
<translation type="unfinished"/>
<translation>Tietokantaa ei voitu sisällyttää: Tiedostoon kirjoitus epäonnistui (%1)</translation>
</message>
</context>
<context>

View File

@ -615,11 +615,11 @@ Veuillez sélectionner la base de donnée souhaitée pour enregistrer les identi
</message>
<message>
<source>Please see special instructions for browser extension use below</source>
<translation type="unfinished"/>
<translation>Veuillez regarder les instructions spéciales pour l&apos;extension du navigateur utilisé ci-dessous</translation>
</message>
<message>
<source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</source>
<translation type="unfinished"/>
<translation>KeePassXC-Browser est nécessaire pour que l&apos;intégration au navigateur fonctionne. &lt;br /&gt;Téléchargez-le pour %1 et%2. %3</translation>
</message>
</context>
<context>
@ -696,13 +696,15 @@ Moved %2 keys to custom data.</source>
</message>
<message>
<source>KeePassXC: Create a new group</source>
<translation type="unfinished"/>
<translation>KeePassXC : Créer un nouveau groupe</translation>
</message>
<message>
<source>A request for creating a new group &quot;%1&quot; has been received.
Do you want to create this group?
</source>
<translation type="unfinished"/>
<translation>Une demande de création pour un nouveau groupe &quot;%1&quot; a é reçue.
Voulez-vous créer ce groupe ?
</translation>
</message>
<message>
<source>Your KeePassXC-Browser settings need to be moved into the database settings.
@ -1628,7 +1630,7 @@ Désactiver les enregistrements sécurisés et ressayer?</translation>
</message>
<message>
<source>Shared group...</source>
<translation type="unfinished"/>
<translation>Groupe partagé ...</translation>
</message>
</context>
<context>
@ -2033,7 +2035,7 @@ Désactiver les enregistrements sécurisés et ressayer?</translation>
</message>
<message>
<source>Your KeePassXC version does not support sharing your container type. Please use %1.</source>
<translation type="unfinished"/>
<translation>Votre version de KeePassXC ne supporte pas le partage de ce type de conteneur. Veuillez utiliser %1.</translation>
</message>
<message>
<source>Database sharing is disabled</source>
@ -2073,15 +2075,15 @@ Désactiver les enregistrements sécurisés et ressayer?</translation>
</message>
<message>
<source>The export container %1 is already referenced.</source>
<translation type="unfinished"/>
<translation>Le conteneur d&apos;export %1 est déjà référencé.</translation>
</message>
<message>
<source>The import container %1 is already imported.</source>
<translation type="unfinished"/>
<translation>Le conteneur d&apos;import %1 est déjà importé.</translation>
</message>
<message>
<source>The container %1 imported and export by different groups.</source>
<translation type="unfinished"/>
<translation>Le conteneur %1 est importé et exporté par des groupes différents.</translation>
</message>
</context>
<context>
@ -3151,19 +3153,19 @@ Ligne %2, colonne %3</translation>
</message>
<message>
<source>Disabled share %1</source>
<translation type="unfinished"/>
<translation>Partage %1 désactivé</translation>
</message>
<message>
<source>Import from share %1</source>
<translation type="unfinished"/>
<translation>Importer du partage %1</translation>
</message>
<message>
<source>Export to share %1</source>
<translation type="unfinished"/>
<translation>Exporter vers le partage %1</translation>
</message>
<message>
<source>Synchronize with share %1</source>
<translation type="unfinished"/>
<translation>Synchroniser avec le partage %1</translation>
</message>
</context>
<context>
@ -4685,7 +4687,7 @@ Commandes disponibles :
</message>
<message>
<source>Successfully recycled entry %1.</source>
<translation type="unfinished"/>
<translation>Entrée %1 recyclée avec succès.</translation>
</message>
<message>
<source>Successfully deleted entry %1.</source>
@ -4783,7 +4785,7 @@ Commandes disponibles :
</message>
<message>
<source>Insert password to encrypt database (Press enter to leave blank): </source>
<translation type="unfinished"/>
<translation>Introduire le mot de passe pour chiffrer la base de données (Presser retour pour laisser vide) :</translation>
</message>
<message>
<source>Creating KeyFile %1 failed: %2</source>
@ -4851,7 +4853,7 @@ Commandes disponibles :
</message>
<message>
<source>Cannot create new group</source>
<translation type="unfinished"/>
<translation>Impossible de créer de nouveau groupe</translation>
</message>
</context>
<context>
@ -4943,7 +4945,7 @@ Commandes disponibles :
</message>
<message>
<source>exclude term from results</source>
<translation type="unfinished"/>
<translation>exclure le terme des résultats</translation>
</message>
<message>
<source>match term exactly</source>
@ -4951,7 +4953,7 @@ Commandes disponibles :
</message>
<message>
<source>use regex in term</source>
<translation type="unfinished"/>
<translation>utiliser les expressions régulières dans le terminal</translation>
</message>
<message>
<source>Fields</source>
@ -5107,7 +5109,7 @@ Commandes disponibles :
</message>
<message>
<source>KeeShare key file</source>
<translation type="unfinished"/>
<translation>fichier-clé KeeShare</translation>
</message>
<message>
<source>All files</source>
@ -5134,7 +5136,7 @@ Commandes disponibles :
<name>ShareObserver</name>
<message>
<source>Import from container without signature</source>
<translation type="unfinished"/>
<translation>Importer depuis le conteneur sans signature</translation>
</message>
<message>
<source>We cannot verify the source of the shared container because it is not signed. Do you really want to import from %1?</source>
@ -5142,7 +5144,7 @@ Commandes disponibles :
</message>
<message>
<source>Import from container with certificate</source>
<translation type="unfinished"/>
<translation>Importer depuis le conteneur avec certificat</translation>
</message>
<message>
<source>Not this time</source>
@ -5234,15 +5236,15 @@ Commandes disponibles :
</message>
<message>
<source>Export to %1 failed (%2)</source>
<translation type="unfinished"/>
<translation>Échec de l&apos;export vers %1 (%2)</translation>
</message>
<message>
<source>Export to %1 successful (%2)</source>
<translation type="unfinished"/>
<translation>Réussite de l&apos;export vers %1 (%2)</translation>
</message>
<message>
<source>Export to %1</source>
<translation type="unfinished"/>
<translation>Exporter vers %1</translation>
</message>
<message>
<source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>

View File

@ -611,15 +611,15 @@ Válassza ki a helyes adatbázist a hitelesítő adatok mentéséhez.</translati
</message>
<message>
<source>Due to Snap sandboxing, you must run a script to enable browser integration.&lt;br /&gt;You can obtain this script from %1</source>
<translation type="unfinished"/>
<translation>A Snap homokozó miatt egy parancsfájlt kell futtatni a böngészőintegráció engedélyezéséhez.&lt;br /&gt;Ezt innen szerezheti be: %1</translation>
</message>
<message>
<source>Please see special instructions for browser extension use below</source>
<translation type="unfinished"/>
<translation>Olvassa el a böngészőkiegészítő használatáról szóló különleges utasításokat alább</translation>
</message>
<message>
<source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</source>
<translation type="unfinished"/>
<translation>A böngészőintegráció működéséhez a KeePassXC-böngészőre van szükség. &lt;br /&gt;Letölthető ezen böngészőkre: %1 és %2. %3</translation>
</message>
</context>
<context>
@ -695,19 +695,22 @@ Moved %2 keys to custom data.</source>
</message>
<message>
<source>KeePassXC: Create a new group</source>
<translation type="unfinished"/>
<translation>KeePassXC: Új csoport létrehozása</translation>
</message>
<message>
<source>A request for creating a new group &quot;%1&quot; has been received.
Do you want to create this group?
</source>
<translation type="unfinished"/>
<translation>Az új %1 csoport létrehozási kérése fogadva.
Biztos, hogy létrehozza ezt a csoportot?</translation>
</message>
<message>
<source>Your KeePassXC-Browser settings need to be moved into the database settings.
This is necessary to maintain your current browser connections.
Would you like to migrate your existing settings now?</source>
<translation type="unfinished"/>
<translation>A KeePassXC-Browser beállításait át kell helyezni az adatbázis-beállításokba.
Ez szükséges a jelenlegi böngészőkapcsolatok fenntartásához.
Biztos, hogy migrálja most a meglévő beállításokat?</translation>
</message>
</context>
<context>
@ -871,7 +874,7 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>Key not transformed. This is a bug, please report it to the developers!</source>
<translation type="unfinished"/>
<translation>A kulcs nincs átalakítva. Ez egy hiba, jelezze a fejlesztőknek!</translation>
</message>
</context>
<context>
@ -1531,7 +1534,7 @@ Egyesíti a módosításokat?</translation>
</message>
<message numerus="yes">
<source>Delete entry(s)?</source>
<translation><numerusform>Törli az bejegyzést?</numerusform><numerusform>Törli az bejegyzéseket?</numerusform></translation>
<translation><numerusform>Törli a bejegyzést?</numerusform><numerusform>Törli a bejegyzéseket?</numerusform></translation>
</message>
<message numerus="yes">
<source>Move entry(s) to recycle bin?</source>
@ -1601,11 +1604,11 @@ Letiltható a biztonságos mentés és úgy megkísérelhető a mentés?</transl
</message>
<message>
<source>Replace references to entry?</source>
<translation>Lecserélhető a bejegyzésre való hivatkozás?</translation>
<translation>Lecseréli a bejegyzésre mutató hivatkozásokat?</translation>
</message>
<message numerus="yes">
<source>Entry &quot;%1&quot; has %2 reference(s). Do you want to overwrite references with values, skip this entry, or delete anyway?</source>
<translation><numerusform>A(z) %1 bejegyzésnek van %2 hivatkozása. Felül lehet írni a hivatkozást az értékekkel, vagy legyen átugorva, ill. legyen mindenképpen törölve?</numerusform><numerusform>A(z) %1 bejegyzésnek van %2 hivatkozása. Felül lehet írni a hivatkozásokat az értékekkel, vagy legyenek átugorva, ill. legyenek mindenképpen törölve?</numerusform></translation>
<translation><numerusform>A(z) %1 bejegyzésnek van %2 hivatkozása. Felülírja a hivatkozásokat az értékekkel, átugorja a bejegyzést, vagy törli mindenképp?</numerusform><numerusform>A(z) %1 bejegyzésnek van %2 hivatkozása. Felülírja a hivatkozásokat az értékekkel, átugorja a bejegyzést, vagy törli mindenképp?</numerusform></translation>
</message>
<message>
<source>Delete group</source>
@ -1613,11 +1616,11 @@ Letiltható a biztonságos mentés és úgy megkísérelhető a mentés?</transl
</message>
<message>
<source>Move group to recycle bin?</source>
<translation>Legyen a csoport áthelyezve a kukába?</translation>
<translation>Áthelyezi a csoportot a kukába?</translation>
</message>
<message>
<source>Do you really want to move the group &quot;%1&quot; to the recycle bin?</source>
<translation>Valóban legyen a(z) %1 csoport áthelyezve a kukába?</translation>
<translation>Valóban áthelyezi a(z) %1 csoportok a kukába?</translation>
</message>
<message>
<source>Successfully merged the database files.</source>
@ -1629,7 +1632,7 @@ Letiltható a biztonságos mentés és úgy megkísérelhető a mentés?</transl
</message>
<message>
<source>Shared group...</source>
<translation type="unfinished"/>
<translation>Megosztott csoport</translation>
</message>
</context>
<context>
@ -1798,7 +1801,7 @@ Letiltható a biztonságos mentés és úgy megkísérelhető a mentés?</transl
</message>
<message>
<source>Inherit default Auto-Type sequence from the &amp;group</source>
<translation>Az alapértelmezett automatikus beírási sorrend öröklése a cso&amp;porttól</translation>
<translation>Az alapértelmezett automatikus beírási sorrend öröklése a &amp;csoporttól</translation>
</message>
<message>
<source>&amp;Use custom Auto-Type sequence:</source>
@ -2074,15 +2077,15 @@ Letiltható a biztonságos mentés és úgy megkísérelhető a mentés?</transl
</message>
<message>
<source>The export container %1 is already referenced.</source>
<translation type="unfinished"/>
<translation>A(z) %1 exportálása konténerre már van hivatkozás.</translation>
</message>
<message>
<source>The import container %1 is already imported.</source>
<translation type="unfinished"/>
<translation>A(z) %1 importálási konténer már be lett importálva.</translation>
</message>
<message>
<source>The container %1 imported and export by different groups.</source>
<translation type="unfinished"/>
<translation>A(z) %1 konténer importálva, és exportálás különböző csoportoknak.</translation>
</message>
</context>
<context>
@ -3153,19 +3156,19 @@ Line %2, column %3</source>
</message>
<message>
<source>Disabled share %1</source>
<translation type="unfinished"/>
<translation>%1 megosztás letiltva</translation>
</message>
<message>
<source>Import from share %1</source>
<translation type="unfinished"/>
<translation>Importálás a(z) %1 megosztásból</translation>
</message>
<message>
<source>Export to share %1</source>
<translation type="unfinished"/>
<translation>Exportálás a(z) %1 megosztásba</translation>
</message>
<message>
<source>Synchronize with share %1</source>
<translation type="unfinished"/>
<translation>Szinkronizálás a(z) %1 megosztásssal</translation>
</message>
</context>
<context>
@ -3285,11 +3288,11 @@ Message: %2</source>
</message>
<message>
<source>E&amp;ntries</source>
<translation>Be&amp;jegyzések</translation>
<translation>&amp;Bejegyzések</translation>
</message>
<message>
<source>&amp;Groups</source>
<translation>Cso&amp;portok</translation>
<translation>&amp;Csoportok</translation>
</message>
<message>
<source>&amp;Tools</source>
@ -4852,7 +4855,7 @@ Elérhető parancsok:
</message>
<message>
<source>Cannot create new group</source>
<translation type="unfinished"/>
<translation>Nem hozható létre új csoport</translation>
</message>
</context>
<context>
@ -5128,7 +5131,7 @@ Elérhető parancsok:
</message>
<message>
<source>Signer:</source>
<translation type="unfinished"/>
<translation>Aláíró:</translation>
</message>
</context>
<context>
@ -5251,27 +5254,27 @@ Elérhető parancsok:
</message>
<message>
<source>Multiple import source path to %1 in %2</source>
<translation type="unfinished"/>
<translation>Több importálási forrásútvonal ehhez: %1, itt: %2</translation>
</message>
<message>
<source>Conflicting export target path %1 in %2</source>
<translation type="unfinished"/>
<translation>Ütköző %1 exportálási célútvonal itt: %2</translation>
</message>
<message>
<source>Could not embed signature: Could not open file to write (%1)</source>
<translation type="unfinished"/>
<translation>Az aláírás nem ágyazható be: A fájl nem nyitható meg írásra (%1)</translation>
</message>
<message>
<source>Could not embed signature: Could not write file (%1)</source>
<translation type="unfinished"/>
<translation>Az aláírás nem ágyazható be: A fájl nem írható (%1)</translation>
</message>
<message>
<source>Could not embed database: Could not open file to write (%1)</source>
<translation type="unfinished"/>
<translation>Az adatbázis nem ágyazható be: A fájl nem nyitható meg írásra (%1)</translation>
</message>
<message>
<source>Could not embed database: Could not write file (%1)</source>
<translation type="unfinished"/>
<translation>Az adatbázis nem ágyazható be: A fájl nem írható (%1)</translation>
</message>
</context>
<context>

View File

@ -180,7 +180,7 @@
</message>
<message>
<source>Minimize instead of app exit</source>
<translation type="unfinished"/>
<translation>sembunyikan jendela ke baki sistem</translation>
</message>
<message>
<source>Show a system tray icon</source>
@ -614,7 +614,7 @@ Please select the correct database for saving credentials.</source>
</message>
<message>
<source>Please see special instructions for browser extension use below</source>
<translation type="unfinished"/>
<translation>Lihat instruksi untuk penggunaan browser extension</translation>
</message>
<message>
<source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</source>

View File

@ -611,15 +611,15 @@ Please select the correct database for saving credentials.</source>
</message>
<message>
<source>Due to Snap sandboxing, you must run a script to enable browser integration.&lt;br /&gt;You can obtain this script from %1</source>
<translation type="unfinished"/>
<translation>Snap &lt;br /&gt;: %1</translation>
</message>
<message>
<source>Please see special instructions for browser extension use below</source>
<translation type="unfinished"/>
<translation>使</translation>
</message>
<message>
<source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</source>
<translation type="unfinished"/>
<translation> KeePassXC-Browser &lt;br /&gt;KeePassXC-Browser %1 %2 2%3</translation>
</message>
</context>
<context>
@ -676,11 +676,11 @@ Do you want to overwrite it?</source>
<source>Successfully converted attributes from %1 entry(s).
Moved %2 keys to custom data.</source>
<translation>%1
%2 </translation>
%2 </translation>
</message>
<message numerus="yes">
<source>Successfully moved %n keys to custom data.</source>
<translation><numerusform>%n </numerusform></translation>
<translation><numerusform>%n </numerusform></translation>
</message>
<message>
<source>KeePassXC: No entry with KeePassHTTP attributes found!</source>
@ -696,19 +696,23 @@ Moved %2 keys to custom data.</source>
</message>
<message>
<source>KeePassXC: Create a new group</source>
<translation type="unfinished"/>
<translation>KeePassXC: 新しいグループを作成</translation>
</message>
<message>
<source>A request for creating a new group &quot;%1&quot; has been received.
Do you want to create this group?
</source>
<translation type="unfinished"/>
<translation> &quot;%1&quot;
</translation>
</message>
<message>
<source>Your KeePassXC-Browser settings need to be moved into the database settings.
This is necessary to maintain your current browser connections.
Would you like to migrate your existing settings now?</source>
<translation type="unfinished"/>
<translation>KeePassXC-Browser
</translation>
</message>
</context>
<context>
@ -872,7 +876,7 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>Key not transformed. This is a bug, please report it to the developers!</source>
<translation type="unfinished"/>
<translation></translation>
</message>
</context>
<context>
@ -1005,7 +1009,7 @@ Please consider generating a new key file.</source>
</message>
<message>
<source>Move KeePassHTTP attributes to KeePassXC-Browser &amp;custom data</source>
<translation>KeePassHTTP KeePassXC-Browser (&amp;C)</translation>
<translation>KeePassHTTP KeePassXC-Browser (&amp;C)</translation>
</message>
<message>
<source>Stored keys</source>
@ -1631,7 +1635,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Shared group...</source>
<translation type="unfinished"/>
<translation>...</translation>
</message>
</context>
<context>
@ -2076,11 +2080,11 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>The export container %1 is already referenced.</source>
<translation type="unfinished"/>
<translation> %1 </translation>
</message>
<message>
<source>The import container %1 is already imported.</source>
<translation type="unfinished"/>
<translation> %1 </translation>
</message>
<message>
<source>The container %1 imported and export by different groups.</source>
@ -4856,7 +4860,7 @@ Available commands:
</message>
<message>
<source>Cannot create new group</source>
<translation type="unfinished"/>
<translation></translation>
</message>
</context>
<context>
@ -5132,7 +5136,7 @@ Available commands:
</message>
<message>
<source>Signer:</source>
<translation type="unfinished"/>
<translation>:</translation>
</message>
</context>
<context>
@ -5263,19 +5267,19 @@ Available commands:
</message>
<message>
<source>Could not embed signature: Could not open file to write (%1)</source>
<translation type="unfinished"/>
<translation>署名を埋め込めませんでした: ファイルを書き込み用に開くことができません (%1)</translation>
</message>
<message>
<source>Could not embed signature: Could not write file (%1)</source>
<translation type="unfinished"/>
<translation>署名を埋め込めませんでした: ファイルに書き込むことができません (%1)</translation>
</message>
<message>
<source>Could not embed database: Could not open file to write (%1)</source>
<translation type="unfinished"/>
<translation>データベースを埋め込めませんでした: ファイルを書き込み用に開くことができません (%1)</translation>
</message>
<message>
<source>Could not embed database: Could not write file (%1)</source>
<translation type="unfinished"/>
<translation>データベースを埋め込めませんでした: ファイルに書き込むことができません (%1)</translation>
</message>
</context>
<context>

File diff suppressed because it is too large Load Diff

View File

@ -693,7 +693,7 @@ Moved %2 keys to custom data.</source>
</message>
<message>
<source>KeePassXC: Create a new group</source>
<translation type="unfinished"/>
<translation>KeePassXC: Lag en ny gruppe</translation>
</message>
<message>
<source>A request for creating a new group &quot;%1&quot; has been received.
@ -803,7 +803,7 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>column %1</source>
<translation type="unfinished"/>
<translation>kolonne %1</translation>
</message>
<message>
<source>Error(s) detected in CSV file!</source>
@ -852,7 +852,7 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>Unable to open file %1.</source>
<translation type="unfinished"/>
<translation>Kan ikke åpne filen %1.</translation>
</message>
<message>
<source>Error while reading the database: %1</source>
@ -860,7 +860,7 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>Could not save, database has no file name.</source>
<translation type="unfinished"/>
<translation>Kunne ikke lagre, databasen har ingen filnavn.</translation>
</message>
<message>
<source>File cannot be written as it is opened in read-only mode.</source>
@ -959,7 +959,7 @@ Vurder å opprette en ny nøkkelfil.</translation>
<name>DatabaseSettingsDialog</name>
<message>
<source>Advanced Settings</source>
<translation type="unfinished"/>
<translation>Avanserte Innstillinger</translation>
</message>
<message>
<source>General</source>
@ -1056,7 +1056,7 @@ This may prevent connection to the browser plugin.</source>
</message>
<message>
<source>Forget all site-specific settings on entries</source>
<translation type="unfinished"/>
<translation>Glem alle side-spesifikke innstillinger og oppføringer</translation>
</message>
<message>
<source>Do you really want forget all site-specific settings on every entry?
@ -1294,7 +1294,7 @@ Dersom du beholder dette antallet så kan databasen være for lett å knekke!</t
</message>
<message>
<source>Breadcrumb</source>
<translation type="unfinished"/>
<translation>Brødsmule</translation>
</message>
<message>
<source>Type</source>
@ -1306,11 +1306,11 @@ Dersom du beholder dette antallet så kan databasen være for lett å knekke!</t
</message>
<message>
<source>Last Signer</source>
<translation type="unfinished"/>
<translation>Siste Signatur</translation>
</message>
<message>
<source>Certificates</source>
<translation>Sertifikat</translation>
<translation>Sertifikater</translation>
</message>
<message>
<source> &gt; </source>
@ -1355,11 +1355,11 @@ Are you sure you want to continue without a password?</source>
<name>DatabaseSettingsWidgetMetaDataSimple</name>
<message>
<source>Database Name:</source>
<translation type="unfinished"/>
<translation>Databasenavn:</translation>
</message>
<message>
<source>Description:</source>
<translation type="unfinished"/>
<translation>Beskrivelse:</translation>
</message>
</context>
<context>
@ -2043,11 +2043,11 @@ Deaktivere sikker lagring og prøve igjen?</translation>
</message>
<message>
<source>Select import source</source>
<translation type="unfinished"/>
<translation>Velg kilde for importering</translation>
</message>
<message>
<source>Select export target</source>
<translation type="unfinished"/>
<translation>Velg eksporteringsmål</translation>
</message>
<message>
<source>Select import/export file</source>
@ -2153,7 +2153,7 @@ Deaktivere sikker lagring og prøve igjen?</translation>
</message>
<message>
<source>Select Image(s)</source>
<translation type="unfinished"/>
<translation>Velg Bilde(-r)</translation>
</message>
<message numerus="yes">
<source>Successfully loaded %1 of %n icon(s)</source>
@ -2382,7 +2382,7 @@ Dette kan føre til feil for de berørte programtilleggene.</translation>
</message>
<message>
<source>Created</source>
<translation>Oppretta</translation>
<translation>Opprettet</translation>
</message>
<message>
<source>Modified</source>
@ -2494,7 +2494,7 @@ Dette kan føre til feil for de berørte programtilleggene.</translation>
</message>
<message>
<source>Share</source>
<translation type="unfinished"/>
<translation>Del</translation>
</message>
</context>
<context>
@ -3122,19 +3122,19 @@ Line %2, column %3</source>
</message>
<message>
<source>Import from</source>
<translation type="unfinished"/>
<translation>Importer fra</translation>
</message>
<message>
<source>Export to</source>
<translation type="unfinished"/>
<translation>Eksporter til</translation>
</message>
<message>
<source>Synchronize with</source>
<translation type="unfinished"/>
<translation>Synkroniser med</translation>
</message>
<message>
<source>Disabled share %1</source>
<translation type="unfinished"/>
<translation>Deaktiver deling %1</translation>
</message>
<message>
<source>Import from share %1</source>
@ -3153,7 +3153,7 @@ Line %2, column %3</source>
<name>KeyComponentWidget</name>
<message>
<source>Key Component</source>
<translation type="unfinished"/>
<translation>Nøkkelkomponent</translation>
</message>
<message>
<source>Key Component Description</source>
@ -3170,7 +3170,7 @@ Line %2, column %3</source>
<message>
<source>Add %1</source>
<comment>Add a key component</comment>
<translation type="unfinished"/>
<translation>Legg til %1</translation>
</message>
<message>
<source>Change %1</source>
@ -3200,7 +3200,7 @@ Line %2, column %3</source>
</message>
<message>
<source>Key File</source>
<translation type="unfinished"/>
<translation>Nøkkelfil</translation>
</message>
<message>
<source>&lt;p&gt;You can add a key file containing random bytes for additional security.&lt;/p&gt;&lt;p&gt;You must keep it secret and never lose it or you will be locked out!&lt;/p&gt;</source>
@ -3477,7 +3477,7 @@ Vi anbefaler at du bruker det AppImage som er tilgjengelig på nedlastingssiden.
</message>
<message>
<source>Add a new group</source>
<translation type="unfinished"/>
<translation>Legg til ny gruppe</translation>
</message>
<message>
<source>Change master &amp;key...</source>
@ -3636,7 +3636,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Advanced Settings</source>
<translation type="unfinished"/>
<translation>Avanserte Innstillinger</translation>
</message>
<message>
<source>Simple Settings</source>
@ -4351,7 +4351,7 @@ Tilgjengelige kommandoer:
</message>
<message>
<source>Created</source>
<translation>Oppretta</translation>
<translation>Opprettet</translation>
</message>
<message>
<source>Browser Integration</source>
@ -4586,7 +4586,7 @@ Tilgjengelige kommandoer:
</message>
<message>
<source>Unable to open file %1.</source>
<translation type="unfinished"/>
<translation>Kan ikke åpne filen %1.</translation>
</message>
<message>
<source>Error while reading the database:
@ -4998,7 +4998,7 @@ Tilgjengelige kommandoer:
</message>
<message>
<source>Own certificate</source>
<translation type="unfinished"/>
<translation>Egne sertifikat</translation>
</message>
<message>
<source>Fingerprint:</source>
@ -5006,7 +5006,7 @@ Tilgjengelige kommandoer:
</message>
<message>
<source>Certificate:</source>
<translation type="unfinished"/>
<translation>Sertifikat</translation>
</message>
<message>
<source>Signer</source>
@ -5030,7 +5030,7 @@ Tilgjengelige kommandoer:
</message>
<message>
<source>Imported certificates</source>
<translation>Importerte sertikikat</translation>
<translation>Importerte sertifikater</translation>
</message>
<message>
<source>Trust</source>

View File

@ -421,7 +421,7 @@
<message>
<source>%1 has requested access to passwords for the following item(s).
Please select whether you want to allow access.</source>
<translation>%1 vraagt toegang tot jouw wachtwoorden voor het volgende.
<translation>%1 vraagt toegang tot jouw wachtwoorden voor de volgende item(s).
Geef aan of je toegang wilt verlenen of niet.</translation>
</message>
</context>
@ -611,15 +611,15 @@ Selecteer de database voor het opslaan van de inloggegevens.</translation>
</message>
<message>
<source>Due to Snap sandboxing, you must run a script to enable browser integration.&lt;br /&gt;You can obtain this script from %1</source>
<translation type="unfinished"/>
<translation>Vanwege de Snap sandboxing, moet je een script uitvoeren waarmee browser integratie mogelijk wordt. &lt;br /&gt; Je kunt dit script vinden op %1</translation>
</message>
<message>
<source>Please see special instructions for browser extension use below</source>
<translation type="unfinished"/>
<translation>Raadpleeg onderstaand speciale instructies voor gebruik van browserextensie </translation>
</message>
<message>
<source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</source>
<translation type="unfinished"/>
<translation>KeePassXC-Browser is vereist om de integratie van de browser te laten werken. &lt;br /&gt; download het voor %1 en %2. %3</translation>
</message>
</context>
<context>
@ -696,19 +696,23 @@ Moved %2 keys to custom data.</source>
</message>
<message>
<source>KeePassXC: Create a new group</source>
<translation type="unfinished"/>
<translation>KeePassXC: Een nieuwe groep maken</translation>
</message>
<message>
<source>A request for creating a new group &quot;%1&quot; has been received.
Do you want to create this group?
</source>
<translation type="unfinished"/>
<translation>Een aanvraag voor het maken van een nieuwe groep &apos;%1&apos; werd ontvangen.
Wil je deze groep maken?
</translation>
</message>
<message>
<source>Your KeePassXC-Browser settings need to be moved into the database settings.
This is necessary to maintain your current browser connections.
Would you like to migrate your existing settings now?</source>
<translation type="unfinished"/>
<translation>De KeePassXC-Browser instellingen moeten worden verplaatst naar de instellingen-database.
Dit is nodig om de huidige browser verbindingen te behouden.
Wil je de bestaande instellingen nu migreren?</translation>
</message>
</context>
<context>
@ -872,7 +876,7 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>Key not transformed. This is a bug, please report it to the developers!</source>
<translation type="unfinished"/>
<translation>Toets niet getransformeerd. Dit is een bug, rapporteer deze alstublieft aan de ontwikkelaars!</translation>
</message>
</context>
<context>
@ -1069,7 +1073,7 @@ Hierdoor werkt de verbinding met de browser plugin mogelijk niet meer.</translat
<message>
<source>Do you really want forget all site-specific settings on every entry?
Permissions to access entries will be revoked.</source>
<translation>Wilt u echt alle site-specifieke instellingen bij items vergeten? Machtigingen voor toegang zullen worden ingetrokken.</translation>
<translation>Wil je echt alle site-specifieke instellingen bij items vergeten? Machtigingen voor toegang zullen worden ingetrokken.</translation>
</message>
<message>
<source>Removing stored permissions</source>
@ -1339,7 +1343,7 @@ Als je dit aantal aanhoudt is het mogelijk heel gemakkelijk om de database te kr
</message>
<message>
<source>You must add at least one encryption key to secure your database!</source>
<translation>Je moet minstens één coderingssleutel aan uw database toevoegen om deze te beveiligen!</translation>
<translation>Je moet minstens één coderingssleutel aan de database toevoegen om deze te beveiligen!</translation>
</message>
<message>
<source>No password set</source>
@ -1527,7 +1531,7 @@ Wil je de wijzigingen samenvoegen?</translation>
</message>
<message numerus="yes">
<source>Do you really want to delete %n entry(s) for good?</source>
<translation><numerusform>Wilt u echt %n item(s) voorgoed verwijderen?</numerusform><numerusform>Wilt u echt %n item(s) voorgoed verwijderen?</numerusform></translation>
<translation><numerusform>Wilt u echt %n item(s) voorgoed verwijderen?</numerusform><numerusform>Wil je echt %n item(s) voorgoed verwijderen?</numerusform></translation>
</message>
<message numerus="yes">
<source>Delete entry(s)?</source>
@ -1605,7 +1609,7 @@ Veilig opslaan afschakelen en opnieuw proberen?</translation>
</message>
<message numerus="yes">
<source>Entry &quot;%1&quot; has %2 reference(s). Do you want to overwrite references with values, skip this entry, or delete anyway?</source>
<translation><numerusform>Vermelding &quot;%1&quot; heeft %2 reference(s). Wilt u verwijzingen vervangen door waarden, dit bericht overslaan of verwijderen toch?</numerusform><numerusform>Item &quot;%1&quot; heeft %2 referentie(s). Wilt u verwijzingen vervangen door waarden, dit bericht overslaan of toch verwijderen ?</numerusform></translation>
<translation><numerusform>Vermelding &quot;%1&quot; heeft %2 reference(s). Wilt u verwijzingen vervangen door waarden, dit bericht overslaan of verwijderen toch?</numerusform><numerusform>Item &quot;%1&quot; heeft %2 referentie(s). Wil je de verwijzingen vervangen door waarden, dit bericht overslaan, of toch verwijderen ?</numerusform></translation>
</message>
<message>
<source>Delete group</source>
@ -1617,7 +1621,7 @@ Veilig opslaan afschakelen en opnieuw proberen?</translation>
</message>
<message>
<source>Do you really want to move the group &quot;%1&quot; to the recycle bin?</source>
<translation>Wilt u echt de groep &apos;%1&apos; naar de prullenbak verplaatsen?</translation>
<translation>Wil je echt de groep &apos;%1&apos; naar de prullenbak verplaatsen?</translation>
</message>
<message>
<source>Successfully merged the database files.</source>
@ -1629,7 +1633,7 @@ Veilig opslaan afschakelen en opnieuw proberen?</translation>
</message>
<message>
<source>Shared group...</source>
<translation type="unfinished"/>
<translation>Gedeelde groep...</translation>
</message>
</context>
<context>
@ -2034,7 +2038,7 @@ Veilig opslaan afschakelen en opnieuw proberen?</translation>
</message>
<message>
<source>Your KeePassXC version does not support sharing your container type. Please use %1.</source>
<translation>Uw KeePassXC-versie biedt geen ondersteuning voor het delen van uw Containertype. Gebruik %1.</translation>
<translation>Deze KeePassXC-versie biedt geen ondersteuning voor het delen van jouw container type. Gebruik %1.</translation>
</message>
<message>
<source>Database sharing is disabled</source>
@ -2074,15 +2078,15 @@ Veilig opslaan afschakelen en opnieuw proberen?</translation>
</message>
<message>
<source>The export container %1 is already referenced.</source>
<translation type="unfinished"/>
<translation>Er wordt al verwezen naar export container %1.</translation>
</message>
<message>
<source>The import container %1 is already imported.</source>
<translation type="unfinished"/>
<translation>Import container %1 is al geïmporteerd.</translation>
</message>
<message>
<source>The container %1 imported and export by different groups.</source>
<translation type="unfinished"/>
<translation>De container %1 is geïmporteerd en geëxporteerd door verschillende groepen.</translation>
</message>
</context>
<context>
@ -3151,19 +3155,19 @@ Lijn %2, kolom %3</translation>
</message>
<message>
<source>Disabled share %1</source>
<translation type="unfinished"/>
<translation>Delen uitgeschakeld %1</translation>
</message>
<message>
<source>Import from share %1</source>
<translation type="unfinished"/>
<translation>Geïmporteerd van %1</translation>
</message>
<message>
<source>Export to share %1</source>
<translation type="unfinished"/>
<translation>Ge-exporteerd naar %1</translation>
</message>
<message>
<source>Synchronize with share %1</source>
<translation type="unfinished"/>
<translation>Synchroniseren met %1</translation>
</message>
</context>
<context>
@ -3423,7 +3427,7 @@ Bericht: %2</translation>
</message>
<message>
<source>Please touch the button on your YubiKey!</source>
<translation>Druk de knop op uw YubiKey!</translation>
<translation>Druk op de knop van je YubiKey!</translation>
</message>
<message>
<source>WARNING: You are using an unstable build of KeePassXC!
@ -3554,7 +3558,7 @@ Wij raden je aan om de AppImage te gebruiken welke beschikbaar is op onze downlo
<message>
<source>NOTE: You are using a pre-release version of KeePassXC!
Expect some bugs and minor issues, this version is not meant for production use.</source>
<translation>Opmerking: U gebruikt een pre-release versie van KeePassXC!
<translation>Opmerking: Je gebruikt een pre-release versie van KeePassXC!
Verwacht een aantal bugs en kleine problemen, deze versie is niet bedoeld voor productiedoeleinden.</translation>
</message>
<message>
@ -3567,7 +3571,7 @@ Verwacht een aantal bugs en kleine problemen, deze versie is niet bedoeld voor p
</message>
<message>
<source>You can always check for updates manually from the application menu.</source>
<translation>U kunt altijd handmatig controleren op updates vanuit het programmamenu.</translation>
<translation>Je kunt altijd handmatig controleren of er updates zijn vanuit het programmamenu.</translation>
</message>
</context>
<context>
@ -4851,7 +4855,7 @@ Beschikbare opdrachten:
</message>
<message>
<source>Cannot create new group</source>
<translation type="unfinished"/>
<translation>Kon nieuwe groep niet maken</translation>
</message>
</context>
<context>
@ -5123,11 +5127,11 @@ Beschikbare opdrachten:
</message>
<message>
<source>The exported certificate is not the same as the one in use. Do you want to export the current certificate?</source>
<translation>Het geëxporteerde certificaat is niet hetzelfde als die in gebruik is. Wilt u het huidige certificaat exporteren?</translation>
<translation>Het geëxporteerde certificaat is niet hetzelfde als die in gebruik is. Wil je het huidige certificaat exporteren?</translation>
</message>
<message>
<source>Signer:</source>
<translation type="unfinished"/>
<translation>Ondertekenaar:</translation>
</message>
</context>
<context>
@ -5246,31 +5250,31 @@ Beschikbare opdrachten:
</message>
<message>
<source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
<translation>Wilt u %1 met de vingerafdruk van %2 vanaf %3 vertrouwen? {1 ?} {2 ?} </translation>
<translation>Wil je %1 met de vingerafdruk van %2 vanaf %3 vertrouwen? {1 ?} {2 ?} </translation>
</message>
<message>
<source>Multiple import source path to %1 in %2</source>
<translation type="unfinished"/>
<translation>Meerdere import bronpaden naar %1 in %2</translation>
</message>
<message>
<source>Conflicting export target path %1 in %2</source>
<translation type="unfinished"/>
<translation>Conflicterende exporteerdoelpad %1 in %2</translation>
</message>
<message>
<source>Could not embed signature: Could not open file to write (%1)</source>
<translation type="unfinished"/>
<translation>Kon handtekening niet insluiten: Kan bestand niet openen om naar te schrijven (%1)</translation>
</message>
<message>
<source>Could not embed signature: Could not write file (%1)</source>
<translation type="unfinished"/>
<translation>Kon handtekening niet insluiten: Kan niet schrijven naar bestand (%1)</translation>
</message>
<message>
<source>Could not embed database: Could not open file to write (%1)</source>
<translation type="unfinished"/>
<translation>Kon database niet insluiten: Kan bestand niet openen om naar te schrijven (%1) </translation>
</message>
<message>
<source>Could not embed database: Could not write file (%1)</source>
<translation type="unfinished"/>
<translation>Kon database niet insluiten: Kan niet schrijven naar bestand (%1)</translation>
</message>
</context>
<context>
@ -5301,7 +5305,7 @@ Beschikbare opdrachten:
<message>
<source>NOTE: These TOTP settings are custom and may not work with other authenticators.</source>
<comment>TOTP QR code dialog warning</comment>
<translation>Let op: deze TOTP-instellingen zijn op maat en werken mogelijk niet met andere authenticators.</translation>
<translation>Let op: deze TOTP-instellingen zijn applicatie specifiek en werken mogelijk niet met andere authenticators.</translation>
</message>
<message>
<source>There was an error creating the QR code.</source>

View File

@ -611,15 +611,15 @@ Wybierz właściwą bazę danych do zapisania danych uwierzytelniających.</tran
</message>
<message>
<source>Due to Snap sandboxing, you must run a script to enable browser integration.&lt;br /&gt;You can obtain this script from %1</source>
<translation type="unfinished"/>
<translation>Ze względu na sandboxing Snap należy uruchomić skrypt, aby umożliwić integrację przeglądarki.&lt;br /&gt;Możesz uzyskać ten skrypt z %1</translation>
</message>
<message>
<source>Please see special instructions for browser extension use below</source>
<translation type="unfinished"/>
<translation>Zobacz poniżej specjalne instrukcje dotyczące używania rozszerzenia przeglądarki</translation>
</message>
<message>
<source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</source>
<translation type="unfinished"/>
<translation>KeePassXC-Browser jest potrzebny do integracji przeglądarki. &lt;br /&gt;Pobierz go dla %1 i %2. %3</translation>
</message>
</context>
<context>
@ -696,19 +696,23 @@ Przeniesiono %2 klucze do niestandardowych danych.</translation>
</message>
<message>
<source>KeePassXC: Create a new group</source>
<translation type="unfinished"/>
<translation>KeePassXC: Utwórz nową grupę</translation>
</message>
<message>
<source>A request for creating a new group &quot;%1&quot; has been received.
Do you want to create this group?
</source>
<translation type="unfinished"/>
<translation>Otrzymano żądanie utworzenia nowej grupy &quot;%1&quot;.
Czy chcesz stworzyć grupę?
</translation>
</message>
<message>
<source>Your KeePassXC-Browser settings need to be moved into the database settings.
This is necessary to maintain your current browser connections.
Would you like to migrate your existing settings now?</source>
<translation type="unfinished"/>
<translation>Twoje ustawienia KeePassXC-Browser należy przenieść do ustawień bazy danych.
Jest to konieczne, aby utrzymać bieżące połączenia przeglądarki.
Czy chcesz teraz migrować istniejące ustawienia?</translation>
</message>
</context>
<context>
@ -872,7 +876,7 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>Key not transformed. This is a bug, please report it to the developers!</source>
<translation type="unfinished"/>
<translation>Klucz nie został przekształcony. To jest błąd, zgłoś go deweloperom!</translation>
</message>
</context>
<context>
@ -1631,7 +1635,7 @@ Wyłączyć bezpieczne zapisywanie i spróbować ponownie?</translation>
</message>
<message>
<source>Shared group...</source>
<translation type="unfinished"/>
<translation>Grupa współdzielona...</translation>
</message>
</context>
<context>
@ -2076,15 +2080,15 @@ Wyłączyć bezpieczne zapisywanie i spróbować ponownie?</translation>
</message>
<message>
<source>The export container %1 is already referenced.</source>
<translation type="unfinished"/>
<translation>Odwołanie do kontenera eksportu %1 już istnieje.</translation>
</message>
<message>
<source>The import container %1 is already imported.</source>
<translation type="unfinished"/>
<translation>Kontener importu %1 jest już zaimportowany.</translation>
</message>
<message>
<source>The container %1 imported and export by different groups.</source>
<translation type="unfinished"/>
<translation>Kontener %1 importowany i eksportowany przez różne grupy.</translation>
</message>
</context>
<context>
@ -3157,19 +3161,19 @@ Wiersz %2, kolumna %3</translation>
</message>
<message>
<source>Disabled share %1</source>
<translation type="unfinished"/>
<translation>Wyłączony udział %1</translation>
</message>
<message>
<source>Import from share %1</source>
<translation type="unfinished"/>
<translation>Importuj z udziału %1</translation>
</message>
<message>
<source>Export to share %1</source>
<translation type="unfinished"/>
<translation>Eksportuj do udziału %1</translation>
</message>
<message>
<source>Synchronize with share %1</source>
<translation type="unfinished"/>
<translation>Synchronizuj z udziałem %1</translation>
</message>
</context>
<context>
@ -4858,7 +4862,7 @@ Dostępne polecenia:
</message>
<message>
<source>Cannot create new group</source>
<translation type="unfinished"/>
<translation>Nie można utworzyć nowej grupy</translation>
</message>
</context>
<context>
@ -5134,7 +5138,7 @@ Dostępne polecenia:
</message>
<message>
<source>Signer:</source>
<translation type="unfinished"/>
<translation>Podpisujący:</translation>
</message>
</context>
<context>
@ -5257,27 +5261,27 @@ Dostępne polecenia:
</message>
<message>
<source>Multiple import source path to %1 in %2</source>
<translation type="unfinished"/>
<translation>Wiele ścieżek źródłowych importu do %1 w %2</translation>
</message>
<message>
<source>Conflicting export target path %1 in %2</source>
<translation type="unfinished"/>
<translation>Sprzeczna ścieżka docelowa eksportu %1 w %2</translation>
</message>
<message>
<source>Could not embed signature: Could not open file to write (%1)</source>
<translation type="unfinished"/>
<translation>Nie można osadzić podpisu: Nie można otworzyć pliku do zapisu (%1)</translation>
</message>
<message>
<source>Could not embed signature: Could not write file (%1)</source>
<translation type="unfinished"/>
<translation>Nie można osadzić podpisu: Nie można zapisać pliku (%1)</translation>
</message>
<message>
<source>Could not embed database: Could not open file to write (%1)</source>
<translation type="unfinished"/>
<translation>Nie można osadzić bazy danych: Nie można otworzyć pliku do zapisu (%1)</translation>
</message>
<message>
<source>Could not embed database: Could not write file (%1)</source>
<translation type="unfinished"/>
<translation>Nie można osadzić bazy danych: nie można zapisać pliku (%1)</translation>
</message>
</context>
<context>

View File

@ -611,15 +611,15 @@ Selecione a base de dados correta para guardar as credenciais.</translation>
</message>
<message>
<source>Due to Snap sandboxing, you must run a script to enable browser integration.&lt;br /&gt;You can obtain this script from %1</source>
<translation type="unfinished"/>
<translation>Devido a &apos;Snap sandboxing&apos;, tem que executar um script para ativar a integração com o navegador.&lt;br /&gt;Pode obter este script em %1.</translation>
</message>
<message>
<source>Please see special instructions for browser extension use below</source>
<translation type="unfinished"/>
<translation>Por favor consulte as instruções para a utilização da extensão abaixo</translation>
</message>
<message>
<source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</source>
<translation type="unfinished"/>
<translation>Necessita do KeePassXC-Browser para que a integração funcione corretamente.&lt;br /&gt;Pode descarregar para %1 e para %2. %3</translation>
</message>
</context>
<context>
@ -696,19 +696,23 @@ Moved %2 keys to custom data.</source>
</message>
<message>
<source>KeePassXC: Create a new group</source>
<translation type="unfinished"/>
<translation>KeePassXC: criar um novo grupo</translation>
</message>
<message>
<source>A request for creating a new group &quot;%1&quot; has been received.
Do you want to create this group?
</source>
<translation type="unfinished"/>
<translation>Foi recebido um pedido para a criação do grupo &quot;%1&quot;.
Quer criar este grupo?
</translation>
</message>
<message>
<source>Your KeePassXC-Browser settings need to be moved into the database settings.
This is necessary to maintain your current browser connections.
Would you like to migrate your existing settings now?</source>
<translation type="unfinished"/>
<translation>Tem que mover as suas definições do KeePassXC-Browser para as definições da base de dados.
Este procedimento é necessário para manter as ligações existentes.
Quer migrar as definições agora?</translation>
</message>
</context>
<context>
@ -872,7 +876,7 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>Key not transformed. This is a bug, please report it to the developers!</source>
<translation type="unfinished"/>
<translation>Chave não transformada. Isto é um erro e deve ser reportado aos programadores!</translation>
</message>
</context>
<context>
@ -1631,7 +1635,7 @@ Desativar salvaguardas e tentar novamente?</translation>
</message>
<message>
<source>Shared group...</source>
<translation type="unfinished"/>
<translation>Grupo partilhado...</translation>
</message>
</context>
<context>
@ -2077,11 +2081,11 @@ Por favor utilize %1.</translation>
</message>
<message>
<source>The export container %1 is already referenced.</source>
<translation type="unfinished"/>
<translation>O contentor de exportação %1 está referenciado.</translation>
</message>
<message>
<source>The import container %1 is already imported.</source>
<translation type="unfinished"/>
<translation>O contentor de importação %1 está referenciado.</translation>
</message>
<message>
<source>The container %1 imported and export by different groups.</source>
@ -3156,19 +3160,19 @@ Linha %2, coluna %3</translation>
</message>
<message>
<source>Disabled share %1</source>
<translation type="unfinished"/>
<translation>Desativar partilha %1</translation>
</message>
<message>
<source>Import from share %1</source>
<translation type="unfinished"/>
<translation>Importar da partilha %1</translation>
</message>
<message>
<source>Export to share %1</source>
<translation type="unfinished"/>
<translation>Exportar para a partilha %1</translation>
</message>
<message>
<source>Synchronize with share %1</source>
<translation type="unfinished"/>
<translation>Sincronizar com a partilha %1</translation>
</message>
</context>
<context>
@ -4858,7 +4862,7 @@ Comandos disponíveis:
</message>
<message>
<source>Cannot create new group</source>
<translation type="unfinished"/>
<translation>Não foi possível criar o novo grupo</translation>
</message>
</context>
<context>
@ -5134,7 +5138,7 @@ Comandos disponíveis:
</message>
<message>
<source>Signer:</source>
<translation type="unfinished"/>
<translation>Signatário:</translation>
</message>
</context>
<context>
@ -5257,27 +5261,27 @@ Comandos disponíveis:
</message>
<message>
<source>Multiple import source path to %1 in %2</source>
<translation type="unfinished"/>
<translation>Diversos caminhos de importação para %1 em %2</translation>
</message>
<message>
<source>Conflicting export target path %1 in %2</source>
<translation type="unfinished"/>
<translation>Conflito no caminho de exportação para %1 em %2</translation>
</message>
<message>
<source>Could not embed signature: Could not open file to write (%1)</source>
<translation type="unfinished"/>
<translation>Assinatura não incorporada. Não foi possível abrir o ficheiro para escrita (%1)</translation>
</message>
<message>
<source>Could not embed signature: Could not write file (%1)</source>
<translation type="unfinished"/>
<translation>Assinatura não incorporada. Não foi possível escrever no ficheiro (%1)</translation>
</message>
<message>
<source>Could not embed database: Could not open file to write (%1)</source>
<translation type="unfinished"/>
<translation>Base de dados não incorporada. Não foi possível abrir o ficheiro para escrita (%1)</translation>
</message>
<message>
<source>Could not embed database: Could not write file (%1)</source>
<translation type="unfinished"/>
<translation>Base de dados não incorporada. Não foi possível escrever no ficheiro (%1)</translation>
</message>
</context>
<context>

View File

@ -611,15 +611,15 @@ Por favor, selecione o banco de dados correto para salvar as credenciais.</trans
</message>
<message>
<source>Due to Snap sandboxing, you must run a script to enable browser integration.&lt;br /&gt;You can obtain this script from %1</source>
<translation type="unfinished"/>
<translation>Devido ao sandbox do Snap, você deve executar um script para ativar a integração do navegador.&lt;br /&gt;Você pode obter este script de %1</translation>
</message>
<message>
<source>Please see special instructions for browser extension use below</source>
<translation type="unfinished"/>
<translation>Por favor, veja as instruções especiais para o uso da extensão do navegador abaixo</translation>
</message>
<message>
<source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</source>
<translation type="unfinished"/>
<translation>O KeePassXC-Browser é necessário para que a integração do navegador funcione. &lt;br /&gt;Faça o download para %1 e %2. %3</translation>
</message>
</context>
<context>
@ -695,19 +695,23 @@ Movido %2 chaves para dados personalizados.</translation>
</message>
<message>
<source>KeePassXC: Create a new group</source>
<translation type="unfinished"/>
<translation>KeePassXC: Crie um novo grupo</translation>
</message>
<message>
<source>A request for creating a new group &quot;%1&quot; has been received.
Do you want to create this group?
</source>
<translation type="unfinished"/>
<translation>Um pedido para criar um novo grupo &quot;%1&quot; foi recebido.
Você quer criar este grupo?
</translation>
</message>
<message>
<source>Your KeePassXC-Browser settings need to be moved into the database settings.
This is necessary to maintain your current browser connections.
Would you like to migrate your existing settings now?</source>
<translation type="unfinished"/>
<translation>As configurações do seu navegador KeePassXC precisam ser movidas para as configurações do banco de dados.
Isso é necessário para manter as conexões atuais do navegador.
Gostaria de migrar suas configurações existentes agora?</translation>
</message>
</context>
<context>
@ -813,7 +817,7 @@ Would you like to migrate your existing settings now?</source>
</message>
<message numerus="yes">
<source>[%n more message(s) skipped]</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
<translation><numerusform>[%n mais mensagem(ns) ignoradas]</numerusform><numerusform>[%n mais mensagem(ns) ignoradas]</numerusform></translation>
</message>
<message>
<source>CSV import: writer has errors:
@ -871,7 +875,7 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>Key not transformed. This is a bug, please report it to the developers!</source>
<translation type="unfinished"/>
<translation>Chave não transformada. Este é um bug, por favor denuncie para os desenvolvedores!</translation>
</message>
</context>
<context>
@ -999,11 +1003,11 @@ Por favor, considere-se gerar um novo arquivo de chave.</translation>
</message>
<message>
<source>Forg&amp;et all site-specific settings on entries</source>
<translation type="unfinished"/>
<translation>Esq&amp;uecer todas as configurações específicas do site nas entradas</translation>
</message>
<message>
<source>Move KeePassHTTP attributes to KeePassXC-Browser &amp;custom data</source>
<translation type="unfinished"/>
<translation>Mover os atributos do KeePassHTTP para o KeePassXC-Browser &amp;dados personalizados</translation>
</message>
<message>
<source>Stored keys</source>
@ -1068,7 +1072,8 @@ Isso pode impedir a conexão com o plugin do navegador.</translation>
<message>
<source>Do you really want forget all site-specific settings on every entry?
Permissions to access entries will be revoked.</source>
<translation type="unfinished"/>
<translation>Você realmente quer esquecer todas as configurações específicas do site em cada entrada?
Permissões para acessar entradas serão revogadas.</translation>
</message>
<message>
<source>Removing stored permissions</source>
@ -1084,7 +1089,7 @@ Permissions to access entries will be revoked.</source>
</message>
<message numerus="yes">
<source>Successfully removed permissions from %n entry(s).</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
<translation><numerusform>Permissões removidas com sucesso de %n entrada(s).</numerusform><numerusform>Permissões removidas com sucesso de %n entrada(s).</numerusform></translation>
</message>
<message>
<source>KeePassXC: No entry with permissions found!</source>
@ -1101,7 +1106,8 @@ Permissions to access entries will be revoked.</source>
<message>
<source>Do you really want to move all legacy browser integration data to the latest standard?
This is necessary to maintain compatibility with the browser plugin.</source>
<translation type="unfinished"/>
<translation>Você realmente deseja mover todos os dados de integração do navegador herdados para o padrão mais recente?
Isso é necessário para manter a compatibilidade com o plugin do navegador.</translation>
</message>
</context>
<context>
@ -1160,7 +1166,7 @@ This is necessary to maintain compatibility with the browser plugin.</source>
</message>
<message>
<source>Higher values offer more protection, but opening the database will take longer.</source>
<translation type="unfinished"/>
<translation>Valores mais altos oferecem mais proteção, mas a abertura do banco de dados levará mais tempo.</translation>
</message>
<message>
<source>Database format:</source>
@ -1313,7 +1319,7 @@ Se você manter este número, seu banco de dados pode ser facilmente crackeado!<
</message>
<message>
<source>Last Signer</source>
<translation type="unfinished"/>
<translation>Último Signatário</translation>
</message>
<message>
<source>Certificates</source>
@ -1566,7 +1572,8 @@ Salvar alterações?</translation>
<message>
<source>Could not open the new database file while attempting to autoreload.
Error: %1</source>
<translation type="unfinished"/>
<translation>Não foi possível abrir o novo arquivo de banco de dados ao tentar executar o carregamento automático.
Erro: %1</translation>
</message>
<message>
<source>Disable safe saves?</source>
@ -1581,7 +1588,8 @@ Deseja desabilitar salvamento seguro e tentar novamente?</translation>
<message>
<source>Writing the database failed.
%1</source>
<translation type="unfinished"/>
<translation>Escrevendo o banco de dados falhou.
%1</translation>
</message>
<message>
<source>Passwords</source>
@ -1625,7 +1633,7 @@ Deseja desabilitar salvamento seguro e tentar novamente?</translation>
</message>
<message>
<source>Shared group...</source>
<translation type="unfinished"/>
<translation>Grupo compartilhado...</translation>
</message>
</context>
<context>
@ -2168,7 +2176,7 @@ Deseja desabilitar salvamento seguro e tentar novamente?</translation>
</message>
<message numerus="yes">
<source>Successfully loaded %1 of %n icon(s)</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
<translation><numerusform>Carregado com sucesso %1 de %n ícone(s)</numerusform><numerusform>Carregado com sucesso %1 de %n ícone(s)</numerusform></translation>
</message>
<message>
<source>No icons were loaded</source>
@ -3124,7 +3132,7 @@ Linha %2, coluna %3</translation>
</message>
<message>
<source>unable to seek to content position</source>
<translation type="unfinished"/>
<translation>incapaz de buscar a posição de conteúdo</translation>
</message>
</context>
<context>
@ -3147,19 +3155,19 @@ Linha %2, coluna %3</translation>
</message>
<message>
<source>Disabled share %1</source>
<translation type="unfinished"/>
<translation>Desabilitar compartilhamento %1</translation>
</message>
<message>
<source>Import from share %1</source>
<translation type="unfinished"/>
<translation>Importar do compartilhamento %1</translation>
</message>
<message>
<source>Export to share %1</source>
<translation type="unfinished"/>
<translation>Exportar para compartilhamento %1</translation>
</message>
<message>
<source>Synchronize with share %1</source>
<translation type="unfinished"/>
<translation>Sincronizar com compartilhamento %1</translation>
</message>
</context>
<context>
@ -3178,7 +3186,7 @@ Linha %2, coluna %3</translation>
</message>
<message>
<source>Key Component set, click to change or remove</source>
<translation type="unfinished"/>
<translation>Componente Chave definido, clique para alterar ou remover</translation>
</message>
<message>
<source>Add %1</source>
@ -3615,11 +3623,11 @@ Espere alguns bugs e problemas menores, esta versão não é para uso em produç
</message>
<message>
<source>Changed deleted objects</source>
<translation type="unfinished"/>
<translation>Objetos excluídos alterados</translation>
</message>
<message>
<source>Adding missing icon %1</source>
<translation type="unfinished"/>
<translation>Adicionando ícone ausente %1</translation>
</message>
</context>
<context>
@ -3805,7 +3813,7 @@ Espere alguns bugs e problemas menores, esta versão não é para uso em produç
</message>
<message>
<source>&lt;p&gt;A password is the primary method for securing your database.&lt;/p&gt;&lt;p&gt;Good passwords are long and unique. KeePassXC can generate one for you.&lt;/p&gt;</source>
<translation type="unfinished"/>
<translation>&lt;p&gt;Uma senha é o principal método para proteger seu banco de dados.&lt;/p&gt;&lt;p&gt;Boas senhas são longas e únicas. KeePassXC pode gerar uma para você.&lt;/p&gt;</translation>
</message>
<message>
<source>Passwords do not match.</source>
@ -4447,7 +4455,7 @@ Comandos disponíveis:
</message>
<message>
<source>Entry&apos;s password copied to the clipboard!</source>
<translation type="unfinished"/>
<translation>Entrada da senha copiada para a área de transferência!</translation>
</message>
<message numerus="yes">
<source>Clearing the clipboard in %1 second(s)...</source>
@ -4646,11 +4654,11 @@ Comandos disponíveis:
</message>
<message>
<source>Exclude similar looking characters</source>
<translation type="unfinished"/>
<translation>Excluir caracteres parecidos</translation>
</message>
<message>
<source>Include characters from every selected group</source>
<translation type="unfinished"/>
<translation>Incluir caracteres de cada grupo selecionado</translation>
</message>
<message>
<source>Recursively list the elements of the group.</source>
@ -4741,7 +4749,7 @@ Comandos disponíveis:
</message>
<message>
<source>Message encryption failed.</source>
<translation type="unfinished"/>
<translation>Criptografia de mensagens falhou.</translation>
</message>
<message>
<source>No groups found</source>
@ -4753,7 +4761,7 @@ Comandos disponíveis:
</message>
<message>
<source>File %1 already exists.</source>
<translation type="unfinished"/>
<translation>Arquivo %1 existe.</translation>
</message>
<message>
<source>Loading the key file failed</source>
@ -4841,7 +4849,7 @@ Comandos disponíveis:
</message>
<message>
<source>Cannot create new group</source>
<translation type="unfinished"/>
<translation>Não é possível criar um novo grupo</translation>
</message>
</context>
<context>
@ -4906,11 +4914,11 @@ Comandos disponíveis:
</message>
<message>
<source>Restricted lifetime is not supported by the agent (check options).</source>
<translation type="unfinished"/>
<translation>Vida útil limitada não é suportado pelo agente (verificar opções).</translation>
</message>
<message>
<source>A confirmation request is not supported by the agent (check options).</source>
<translation type="unfinished"/>
<translation>Uma solicitação de confirmação não é suportado pelo agente (verificar opções).</translation>
</message>
</context>
<context>
@ -4921,7 +4929,7 @@ Comandos disponíveis:
</message>
<message>
<source>Search terms are as follows: [modifiers][field:][&quot;]term[&quot;]</source>
<translation type="unfinished"/>
<translation>Termos de pesquisa são as seguintes: [modifiers][field:][&quot;]term[&quot;]</translation>
</message>
<message>
<source>Every search term must match (ie, logical AND)</source>
@ -5024,7 +5032,7 @@ Comandos disponíveis:
</message>
<message>
<source>Signer</source>
<translation type="unfinished"/>
<translation>Signatário</translation>
</message>
<message>
<source>Key:</source>
@ -5093,11 +5101,11 @@ Comandos disponíveis:
<message>
<source>key.share</source>
<comment>Filetype for KeeShare key</comment>
<translation type="unfinished"/>
<translation>key.share</translation>
</message>
<message>
<source>KeeShare key file</source>
<translation type="unfinished"/>
<translation>Arquivo chave KeeShare</translation>
</message>
<message>
<source>All files</source>
@ -5117,7 +5125,7 @@ Comandos disponíveis:
</message>
<message>
<source>Signer:</source>
<translation type="unfinished"/>
<translation>Signatário:</translation>
</message>
</context>
<context>
@ -5152,11 +5160,11 @@ Comandos disponíveis:
</message>
<message>
<source>Import from %1 failed (%2)</source>
<translation type="unfinished"/>
<translation>Importação de %1 falhou (%2)</translation>
</message>
<message>
<source>Import from %1 successful (%2)</source>
<translation type="unfinished"/>
<translation>Importado de %1 com sucesso (%2)</translation>
</message>
<message>
<source>Imported from %1</source>
@ -5444,11 +5452,11 @@ Comandos disponíveis:
</message>
<message>
<source>YubiKey Challenge-Response</source>
<translation type="unfinished"/>
<translation>YubiKey Desafio-Resposta</translation>
</message>
<message>
<source>&lt;p&gt;If you own a &lt;a href=&quot;https://www.yubico.com/&quot;&gt;YubiKey&lt;/a&gt;, you can use it for additional security.&lt;/p&gt;&lt;p&gt;The YubiKey requires one of its slots to be programmed as &lt;a href=&quot;https://www.yubico.com/products/services-software/personalization-tools/challenge-response/&quot;&gt;HMAC-SHA1 Challenge-Response&lt;/a&gt;.&lt;/p&gt;</source>
<translation type="unfinished"/>
<translation>&lt;p&gt;Se você possui uma &lt;a href=&quot;https://www.yubico.com/&quot;&gt;YubiKey&lt;/a&gt;, você pode usá-la para segurança adicional.&lt;/p&gt;&lt;p&gt;A YubiKey requer que um de seus slots seja programado como &lt;a href=&quot;https://www.yubico.com/products/services-software/personalization-tools/challenge-response/&quot;&gt;HMAC-SHA1 Desafio-Resposta&lt;/a&gt;.&lt;/p&gt;</translation>
</message>
<message>
<source>No YubiKey detected, please ensure it&apos;s plugged in.</source>

View File

@ -54,7 +54,7 @@
</message>
<message>
<source>Use OpenSSH for Windows instead of Pageant</source>
<translation>Utilizar OpeSSH for Windows em vez de Pageant</translation>
<translation>Utilizar OpenSSH for Windows em vez de Pageant</translation>
</message>
</context>
<context>
@ -120,7 +120,7 @@
</message>
<message>
<source>Load previous databases on startup</source>
<translation>Ao iniciar, carregar as últimas base de dados utilizadas</translation>
<translation>Ao iniciar, carregar últimas base de dados utilizadas</translation>
</message>
<message>
<source>Minimize window at application startup</source>
@ -512,12 +512,12 @@ Selecione a base de dados correta para guardar as credenciais.</translation>
<message>
<source>Sort &amp;matching credentials by title</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
<translation>Ordenar credenciais coi&amp;ncidentes por título</translation>
<translation>Ordenar por título as credenciais coi&amp;ncidentes</translation>
</message>
<message>
<source>Sort matching credentials by &amp;username</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
<translation>Ordenar credenciais coincidentes por nome de &amp;utilizador</translation>
<translation>Ordenar por nome de &amp;utilizador as credenciais coincidentes</translation>
</message>
<message>
<source>Advanced</source>
@ -611,15 +611,15 @@ Selecione a base de dados correta para guardar as credenciais.</translation>
</message>
<message>
<source>Due to Snap sandboxing, you must run a script to enable browser integration.&lt;br /&gt;You can obtain this script from %1</source>
<translation type="unfinished"/>
<translation>Devido a &apos;Snap sandboxing&apos;, tem que executar um script para ativar a integração com o navegador.&lt;br /&gt;Pode obter este script em %1.</translation>
</message>
<message>
<source>Please see special instructions for browser extension use below</source>
<translation type="unfinished"/>
<translation>Por favor consulte as instruções para a utilização da extensão abaixo</translation>
</message>
<message>
<source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</source>
<translation type="unfinished"/>
<translation>Necessita de KeePassXC-Browser para que a integração funcione corretamente.&lt;br /&gt;Pode descarregar para %1 e %2. %3</translation>
</message>
</context>
<context>
@ -696,19 +696,23 @@ Moved %2 keys to custom data.</source>
</message>
<message>
<source>KeePassXC: Create a new group</source>
<translation type="unfinished"/>
<translation>KeePassXC: Criar um novo grupo</translation>
</message>
<message>
<source>A request for creating a new group &quot;%1&quot; has been received.
Do you want to create this group?
</source>
<translation type="unfinished"/>
<translation>Foi recebido um pedido para a criação do grupo &quot;%1&quot;.
Deseja criar este grupo?
</translation>
</message>
<message>
<source>Your KeePassXC-Browser settings need to be moved into the database settings.
This is necessary to maintain your current browser connections.
Would you like to migrate your existing settings now?</source>
<translation type="unfinished"/>
<translation>Tem que mover as suas definições KeePassXC-Browser para as definições da base de dados.
Este procedimento é necessário para manter as ligações existentes.
Gostaria de migrar agora as definições?</translation>
</message>
</context>
<context>
@ -872,7 +876,7 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>Key not transformed. This is a bug, please report it to the developers!</source>
<translation type="unfinished"/>
<translation>Chave não transformada. Isto é um erro e deve ser reportado aos programadores!</translation>
</message>
</context>
<context>
@ -1631,7 +1635,7 @@ Desativar salvaguardas e tentar novamente?</translation>
</message>
<message>
<source>Shared group...</source>
<translation type="unfinished"/>
<translation>Grupo partilhado...</translation>
</message>
</context>
<context>
@ -2077,15 +2081,15 @@ Por favor utilize %1.</translation>
</message>
<message>
<source>The export container %1 is already referenced.</source>
<translation type="unfinished"/>
<translation>O contentor de exportação %1 está referenciado.</translation>
</message>
<message>
<source>The import container %1 is already imported.</source>
<translation type="unfinished"/>
<translation>O contentor de importação %1 está referenciado.</translation>
</message>
<message>
<source>The container %1 imported and export by different groups.</source>
<translation type="unfinished"/>
<translation>Erro ao exportar. A partilha %1 está a ser importada por outro grupo.</translation>
</message>
</context>
<context>
@ -2869,7 +2873,7 @@ Esta é uma migração unidirecional. Não será possível abrir a base de dados
</message>
<message>
<source>Invalid group icon number</source>
<translation>Número inválido de ícone de grupo</translation>
<translation>Número inválido no ícone de grupo</translation>
</message>
<message>
<source>Invalid EnableAutoType value</source>
@ -3017,7 +3021,7 @@ Linha %2, coluna %3</translation>
</message>
<message>
<source>Invalid transform seed size</source>
<translation>Tamanho inválido da semente de transformação</translation>
<translation>Tamanho inválido na semente de transformação</translation>
</message>
<message>
<source>Invalid number of transform rounds</source>
@ -3156,19 +3160,19 @@ Linha %2, coluna %3</translation>
</message>
<message>
<source>Disabled share %1</source>
<translation type="unfinished"/>
<translation>Desativar partilha %1</translation>
</message>
<message>
<source>Import from share %1</source>
<translation type="unfinished"/>
<translation>Importar da partilha %1</translation>
</message>
<message>
<source>Export to share %1</source>
<translation type="unfinished"/>
<translation>Exportar para a partilha %1</translation>
</message>
<message>
<source>Synchronize with share %1</source>
<translation type="unfinished"/>
<translation>Sincronizar com a partilha %1</translation>
</message>
</context>
<context>
@ -3639,7 +3643,7 @@ Pode encontrar erros graves e esta versão não deve ser utilizada em ambientes
<name>NewDatabaseWizard</name>
<message>
<source>Create a new KeePassXC database...</source>
<translation>A criar uma nova base de dados do KeePassXC...</translation>
<translation>Criar uma nova base de dados do KeePassXC...</translation>
</message>
<message>
<source>Root</source>
@ -3659,7 +3663,7 @@ Pode encontrar erros graves e esta versão não deve ser utilizada em ambientes
</message>
<message>
<source>Here you can adjust the database encryption settings. Don&apos;t worry, you can change them later in the database settings.</source>
<translation>Aqui pode ajustar as definições de cifra da sua base de dados. Não se preocupe porque pode sempre reverter as alterações nas definições.</translation>
<translation>Aqui pode ajustar as definições de cifra da sua base de dados. Não se preocupe porque, a qualquer momento, poderá alterar esta opção nas definições da base de dados.</translation>
</message>
<message>
<source>Advanced Settings</source>
@ -3678,7 +3682,7 @@ Pode encontrar erros graves e esta versão não deve ser utilizada em ambientes
</message>
<message>
<source>Here you can adjust the database encryption settings. Don&apos;t worry, you can change them later in the database settings.</source>
<translation>Aqui pode ajustar as definições de cifra da sua base de dados. Não se preocupe porque pode sempre reverter as alterações nas definições.</translation>
<translation>Aqui pode ajustar as definições de cifra da sua base de dados. Não se preocupe porque, a qualquer momento, poderá alterar esta opção nas definições da base de dados.</translation>
</message>
</context>
<context>
@ -4858,7 +4862,7 @@ Comandos disponíveis:
</message>
<message>
<source>Cannot create new group</source>
<translation type="unfinished"/>
<translation>Não foi possível criar o novo grupo</translation>
</message>
</context>
<context>
@ -5110,7 +5114,7 @@ Comandos disponíveis:
<message>
<source>key.share</source>
<comment>Filetype for KeeShare key</comment>
<translation>partilha da chave</translation>
<translation>chave.partilha</translation>
</message>
<message>
<source>KeeShare key file</source>
@ -5134,7 +5138,7 @@ Comandos disponíveis:
</message>
<message>
<source>Signer:</source>
<translation type="unfinished"/>
<translation>Signatário:</translation>
</message>
</context>
<context>
@ -5233,7 +5237,7 @@ Comandos disponíveis:
</message>
<message>
<source>Could not write export container</source>
<translation>Não foi possível escrever contentor de exportação</translation>
<translation>Não foi possível escrever o contentor de exportação</translation>
</message>
<message>
<source>Unexpected export error occurred</source>
@ -5257,27 +5261,27 @@ Comandos disponíveis:
</message>
<message>
<source>Multiple import source path to %1 in %2</source>
<translation type="unfinished"/>
<translation>Diversos caminhos de importação para %1 em %2</translation>
</message>
<message>
<source>Conflicting export target path %1 in %2</source>
<translation type="unfinished"/>
<translation>Conflito no caminho de exportação para %1 em %2</translation>
</message>
<message>
<source>Could not embed signature: Could not open file to write (%1)</source>
<translation type="unfinished"/>
<translation>Assinatura não incorporada. Não foi possível abrir o ficheiro para escrita (%1)</translation>
</message>
<message>
<source>Could not embed signature: Could not write file (%1)</source>
<translation type="unfinished"/>
<translation>Assinatura não incorporada. Não foi possível escrever no ficheiro (%1)</translation>
</message>
<message>
<source>Could not embed database: Could not open file to write (%1)</source>
<translation type="unfinished"/>
<translation>Base de dados não incorporada. Não foi possível abrir o ficheiro para escrita (%1)</translation>
</message>
<message>
<source>Could not embed database: Could not write file (%1)</source>
<translation type="unfinished"/>
<translation>Base de dados não incorporada. Não foi possível escrever no ficheiro (%1)</translation>
</message>
</context>
<context>

View File

@ -176,7 +176,7 @@
</message>
<message>
<source>Hide toolbar (icons)</source>
<translation>Скрыть панель инструментов (иконки)</translation>
<translation>Скрывать панель инструментов (значки)</translation>
</message>
<message>
<source>Minimize instead of app exit</source>
@ -611,15 +611,15 @@ Please select the correct database for saving credentials.</source>
</message>
<message>
<source>Due to Snap sandboxing, you must run a script to enable browser integration.&lt;br /&gt;You can obtain this script from %1</source>
<translation type="unfinished"/>
<translation>Из-за того, что Snap - это песочница, Вы должны запустить скрипт, чтобы разрешить браузерную интеграцию.&lt;br /&gt;Вы можете получить этот скрипт с %1</translation>
</message>
<message>
<source>Please see special instructions for browser extension use below</source>
<translation type="unfinished"/>
<translation>Пожалуйста, смотрите особые инструкции по использованию расширения браузера ниже</translation>
</message>
<message>
<source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</source>
<translation type="unfinished"/>
<translation>KeePassXC-Browser необходим для работы интеграции браузера. &lt;br /&gt;Скачайте его для %1 и %2. %3</translation>
</message>
</context>
<context>
@ -696,19 +696,23 @@ Moved %2 keys to custom data.</source>
</message>
<message>
<source>KeePassXC: Create a new group</source>
<translation type="unfinished"/>
<translation>KeePassXC: Создать новую группу</translation>
</message>
<message>
<source>A request for creating a new group &quot;%1&quot; has been received.
Do you want to create this group?
</source>
<translation type="unfinished"/>
<translation>Был получен запрос для создания новой группы &quot;%1&quot;.
Вы хотите создать эту группу?
</translation>
</message>
<message>
<source>Your KeePassXC-Browser settings need to be moved into the database settings.
This is necessary to maintain your current browser connections.
Would you like to migrate your existing settings now?</source>
<translation type="unfinished"/>
<translation>Нужно переместить Ваши настройки KeePassXC-Browser в настройки базы данных.
Это необходимо, чтобы поддерживать Ваши текущие соединения браузера.
Желаете ли Вы мигрировать Ваши существующие настройки сейчас?</translation>
</message>
</context>
<context>
@ -871,7 +875,7 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>Key not transformed. This is a bug, please report it to the developers!</source>
<translation type="unfinished"/>
<translation>Ключ не преобразован. Это ошибка, пожалуйста, сообщите о нём разработчикам!</translation>
</message>
</context>
<context>
@ -1629,7 +1633,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Shared group...</source>
<translation type="unfinished"/>
<translation>Общая группа...</translation>
</message>
</context>
<context>
@ -2074,15 +2078,15 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>The export container %1 is already referenced.</source>
<translation type="unfinished"/>
<translation>На контейнер экспорта %1 уже есть ссылка.</translation>
</message>
<message>
<source>The import container %1 is already imported.</source>
<translation type="unfinished"/>
<translation>Контейнер импорта %1 уже импортирован.</translation>
</message>
<message>
<source>The container %1 imported and export by different groups.</source>
<translation type="unfinished"/>
<translation>Контейнер %1 импортируется и экспортируется разными группами.</translation>
</message>
</context>
<context>
@ -2160,7 +2164,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Custom icon successfully downloaded</source>
<translation>Пользовательская иконка успешно загружена</translation>
<translation>Пользовательский значок успешно загружен</translation>
</message>
<message>
<source>Hint: You can enable DuckDuckGo as a fallback under Tools&gt;Settings&gt;Security</source>
@ -2172,7 +2176,7 @@ Disable safe saves and try again?</source>
</message>
<message numerus="yes">
<source>Successfully loaded %1 of %n icon(s)</source>
<translation><numerusform>Успешно загружено %1 из %n иконки</numerusform><numerusform>Успешно загружено %1 из %n иконок</numerusform><numerusform>Успешно загружено %1 из %n иконок</numerusform><numerusform>Успешно загружено %1 из %n иконки(ок)</numerusform></translation>
<translation><numerusform>Успешно загружен %1 из %n значка</numerusform><numerusform>Успешно загружены %1 из %n значков</numerusform><numerusform>Успешно загружены %1 из %n значков</numerusform><numerusform>Успешно загружены %1 из %n значков</numerusform></translation>
</message>
<message>
<source>No icons were loaded</source>
@ -2180,15 +2184,15 @@ Disable safe saves and try again?</source>
</message>
<message numerus="yes">
<source>%n icon(s) already exist in the database</source>
<translation><numerusform>%n иконка уже существует в базе данных</numerusform><numerusform>%n иконки уже существуют в базе данных</numerusform><numerusform>%n иконок уже существуют в базе данных</numerusform><numerusform>%n иконка(ок) уже существует(ют) в базе данных</numerusform></translation>
<translation><numerusform>%n значок уже существует в базе данных</numerusform><numerusform>%n значка уже существуют в базе данных</numerusform><numerusform>%n значков уже существуют в базе данных</numerusform><numerusform>%n значков уже существуют в базе данных</numerusform></translation>
</message>
<message numerus="yes">
<source>The following icon(s) failed:</source>
<translation><numerusform>Следующие иконки не удалось:</numerusform><numerusform>Следующие иконки не удалось:</numerusform><numerusform>Следующие иконки не удалось:</numerusform><numerusform>Следующие иконки не удалось:</numerusform></translation>
<translation><numerusform>Следующий значок потерпел неудачу:</numerusform><numerusform>Следующие значки потерпели неудачу:</numerusform><numerusform>Следующие значки потерпели неудачу:</numerusform><numerusform>Следующие значки потерпели неудачу:</numerusform></translation>
</message>
<message numerus="yes">
<source>This icon is used by %n entry(s), and will be replaced by the default icon. Are you sure you want to delete it?</source>
<translation><numerusform>Эта иконка используется %n записью и будет замещена иконкой по умолчанию. Вы уверены, что хотите удалить её?</numerusform><numerusform>Эта иконка используется %n записями и будет замещена иконкой по умолчанию. Вы уверены, что хотите удалить её?</numerusform><numerusform>Эта иконка используется %n записями и будет замещена иконкой по умолчанию. Вы уверены, что хотите удалить её?</numerusform><numerusform>Эта иконка используется %n записью(ями) и будет замещена иконкой по умолчанию. Вы уверены, что хотите удалить её?</numerusform></translation>
<translation><numerusform>Этот значок используется %n записью и будет замещён значком по умолчанию. Вы уверены, что хотите удалить его?</numerusform><numerusform>Этот значок используется %n записями и будет замещён значком по умолчанию. Вы уверены, что хотите удалить его?</numerusform><numerusform>Этот значок используется %n записями и будет замещён значком по умолчанию. Вы уверены, что хотите удалить его?</numerusform><numerusform>Этот значок используется %n записями и будет замещён значком по умолчанию. Вы уверены, что хотите удалить его?</numerusform></translation>
</message>
</context>
<context>
@ -3154,19 +3158,19 @@ Line %2, column %3</source>
</message>
<message>
<source>Disabled share %1</source>
<translation type="unfinished"/>
<translation>Отключённая часть %1</translation>
</message>
<message>
<source>Import from share %1</source>
<translation type="unfinished"/>
<translation>Импортировать из части %1</translation>
</message>
<message>
<source>Export to share %1</source>
<translation type="unfinished"/>
<translation>Экспортировать в часть %1</translation>
</message>
<message>
<source>Synchronize with share %1</source>
<translation type="unfinished"/>
<translation>Синхронизировать с частью %1</translation>
</message>
</context>
<context>
@ -3629,7 +3633,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message>
<message>
<source>Adding missing icon %1</source>
<translation>Добавление отсутствующей иконки %1</translation>
<translation>Добавление отсутствующего значка %1</translation>
</message>
</context>
<context>
@ -4855,7 +4859,7 @@ Available commands:
</message>
<message>
<source>Cannot create new group</source>
<translation type="unfinished"/>
<translation>Не удаётся создать новую группу</translation>
</message>
</context>
<context>
@ -5131,7 +5135,7 @@ Available commands:
</message>
<message>
<source>Signer:</source>
<translation type="unfinished"/>
<translation>Подписавшийся:</translation>
</message>
</context>
<context>
@ -5254,27 +5258,27 @@ Available commands:
</message>
<message>
<source>Multiple import source path to %1 in %2</source>
<translation type="unfinished"/>
<translation>Множественный путь источника импорта к %1 в %2</translation>
</message>
<message>
<source>Conflicting export target path %1 in %2</source>
<translation type="unfinished"/>
<translation>Конфликтный путь цели экспорта %1 в %2</translation>
</message>
<message>
<source>Could not embed signature: Could not open file to write (%1)</source>
<translation type="unfinished"/>
<translation>Не удалось встроить подпись: Не удалось открыть файл для записи (%1)</translation>
</message>
<message>
<source>Could not embed signature: Could not write file (%1)</source>
<translation type="unfinished"/>
<translation>Не удалось встроить подпись: Не удалось записать файл (%1)</translation>
</message>
<message>
<source>Could not embed database: Could not open file to write (%1)</source>
<translation type="unfinished"/>
<translation>Не удалось встроить базу данных: Не удалось открыть файл для записи (%1)</translation>
</message>
<message>
<source>Could not embed database: Could not write file (%1)</source>
<translation type="unfinished"/>
<translation>Не удалось встроить базу данных: Не удалось записать файл (%1)</translation>
</message>
</context>
<context>

File diff suppressed because it is too large Load Diff

View File

@ -39,7 +39,7 @@
</message>
<message>
<source>Project Maintainers:</source>
<translation>Projekt Ansvariga:</translation>
<translation>Projekt ansvariga:</translation>
</message>
<message>
<source>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</source>
@ -93,7 +93,7 @@
</message>
<message>
<source>Follow style</source>
<translation type="unfinished"/>
<translation>Följ stil</translation>
</message>
</context>
<context>
@ -116,7 +116,7 @@
</message>
<message>
<source>Remember last key files and security dongles</source>
<translation type="unfinished"/>
<translation>Kom ihåg senaste nyckel-fil och säkerhets-enhet</translation>
</message>
<message>
<source>Load previous databases on startup</source>
@ -132,7 +132,7 @@
</message>
<message>
<source>Safely save database files (may be incompatible with Dropbox, etc)</source>
<translation type="unfinished"/>
<translation>Spara databasfiler säkert (kan vara inkompatibelt med Dropbox, etc)</translation>
</message>
<message>
<source>Backup database file before saving</source>
@ -168,7 +168,7 @@
</message>
<message>
<source>Hide the entry preview panel</source>
<translation type="unfinished"/>
<translation>Göm post förhandsvisningspanelen</translation>
</message>
<message>
<source>General</source>
@ -176,11 +176,11 @@
</message>
<message>
<source>Hide toolbar (icons)</source>
<translation type="unfinished"/>
<translation>Göm verktygsfält (ikonerna)</translation>
</message>
<message>
<source>Minimize instead of app exit</source>
<translation type="unfinished"/>
<translation>Minimera istället för att avsluta</translation>
</message>
<message>
<source>Show a system tray icon</source>
@ -200,7 +200,7 @@
</message>
<message>
<source>Auto-Type</source>
<translation>Autoskriv</translation>
<translation>Auto-skriv</translation>
</message>
<message>
<source>Use entry title to match windows for global Auto-Type</source>
@ -220,7 +220,7 @@
</message>
<message>
<source>Auto-Type typing delay</source>
<translation type="unfinished"/>
<translation>Auto-skriv fördröjning</translation>
</message>
<message>
<source> ms</source>
@ -229,23 +229,23 @@
</message>
<message>
<source>Auto-Type start delay</source>
<translation type="unfinished"/>
<translation>Auto-skriv start fördröjning</translation>
</message>
<message>
<source>Check for updates at application startup</source>
<translation type="unfinished"/>
<translation>Leta efter uppdateringar vid start</translation>
</message>
<message>
<source>Include pre-releases when checking for updates</source>
<translation type="unfinished"/>
<translation>Inkludera förhandsversioner vid sökning efter uppdateringar</translation>
</message>
<message>
<source>Movable toolbar</source>
<translation type="unfinished"/>
<translation>Rörligt verktygsfält</translation>
</message>
<message>
<source>Button style</source>
<translation type="unfinished"/>
<translation>Knapp-stil</translation>
</message>
</context>
<context>
@ -273,7 +273,7 @@
</message>
<message>
<source>Forget TouchID after inactivity of</source>
<translation type="unfinished"/>
<translation>Glöm TouchID efter inaktivitet i</translation>
</message>
<message>
<source>Convenience</source>
@ -285,7 +285,7 @@
</message>
<message>
<source>Forget TouchID when session is locked or lid is closed</source>
<translation type="unfinished"/>
<translation>Glöm TouchID när sessionen låses eller locket stängs</translation>
</message>
<message>
<source>Lock databases after minimizing the window</source>
@ -293,7 +293,7 @@
</message>
<message>
<source>Re-lock previously locked database after performing Auto-Type</source>
<translation type="unfinished"/>
<translation>Lås tidigare låst databas efter att ha utfört Auto-skriv</translation>
</message>
<message>
<source>Don&apos;t require password repeat when it is visible</source>
@ -309,7 +309,7 @@
</message>
<message>
<source>Hide passwords in the entry preview panel</source>
<translation type="unfinished"/>
<translation>Göm lösenord i förhandsgranskningsrutan</translation>
</message>
<message>
<source>Hide entry notes by default</source>
@ -321,7 +321,7 @@
</message>
<message>
<source>Use DuckDuckGo as fallback for downloading website icons</source>
<translation type="unfinished"/>
<translation>Använd DuckDuckGo som alternativ vid nedladdning av webbplatsikoner</translation>
</message>
</context>
<context>
@ -429,7 +429,7 @@ Vill du tillåta det?</translation>
<name>BrowserEntrySaveDialog</name>
<message>
<source>KeePassXC-Browser Save Entry</source>
<translation type="unfinished"/>
<translation>KeePassXC-Browser spara post</translation>
</message>
<message>
<source>Ok</source>
@ -442,7 +442,8 @@ Vill du tillåta det?</translation>
<message>
<source>You have multiple databases open.
Please select the correct database for saving credentials.</source>
<translation type="unfinished"/>
<translation>Du ha flera databaser öppna.
Välj databas för att spara uppgifter.</translation>
</message>
</context>
<context>
@ -539,7 +540,7 @@ Please select the correct database for saving credentials.</source>
<message>
<source>Searc&amp;h in all opened databases for matching credentials</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment>
<translation type="unfinished"/>
<translation>Sök i alla öppna databaser efter matchande uppgifter</translation>
</message>
<message>
<source>Automatically creating or updating string fields is not supported.</source>
@ -547,7 +548,7 @@ Please select the correct database for saving credentials.</source>
</message>
<message>
<source>&amp;Return advanced string fields which start with &quot;KPH: &quot;</source>
<translation type="unfinished"/>
<translation>Returnera avancerade text-fält som börjar med &quot;KPH: &quot;</translation>
</message>
<message>
<source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source>
@ -873,7 +874,7 @@ Would you like to migrate your existing settings now?</source>
<name>DatabaseOpenDialog</name>
<message>
<source>Unlock Database - KeePassXC</source>
<translation type="unfinished"/>
<translation>Lås upp databas - KeePassXC</translation>
</message>
</context>
<context>
@ -969,7 +970,7 @@ Please consider generating a new key file.</source>
</message>
<message>
<source>Master Key</source>
<translation type="unfinished"/>
<translation>Huvud-lösenord</translation>
</message>
<message>
<source>Encryption Settings</source>
@ -1029,7 +1030,7 @@ This may prevent connection to the browser plugin.</source>
</message>
<message>
<source>Disconnect all browsers</source>
<translation type="unfinished"/>
<translation>Koppla från alla webbläsare</translation>
</message>
<message>
<source>Do you really want to disconnect all browsers?
@ -1131,7 +1132,7 @@ This is necessary to maintain compatibility with the browser plugin.</source>
</message>
<message>
<source>Decryption Time:</source>
<translation type="unfinished"/>
<translation>Dektypterings-tid:</translation>
</message>
<message>
<source>?? s</source>
@ -1512,7 +1513,7 @@ Do you want to merge your changes?</source>
</message>
<message numerus="yes">
<source>Delete entry(s)?</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
<translation><numerusform>Ta bort post?</numerusform><numerusform>Ta bort poster?</numerusform></translation>
</message>
<message numerus="yes">
<source>Move entry(s) to recycle bin?</source>
@ -1606,7 +1607,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Shared group...</source>
<translation type="unfinished"/>
<translation>Delad grupp...</translation>
</message>
</context>
<context>
@ -1884,7 +1885,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Public key</source>
<translation type="unfinished"/>
<translation>Publik nyckel</translation>
</message>
<message>
<source>Add key to agent when database is opened/unlocked</source>
@ -2097,7 +2098,7 @@ Disable safe saves and try again?</source>
<name>EditWidgetIcons</name>
<message>
<source>&amp;Use default icon</source>
<translation type="unfinished"/>
<translation>Använd standard ikon</translation>
</message>
<message>
<source>Use custo&amp;m icon</source>
@ -3109,15 +3110,15 @@ Line %2, column %3</source>
</message>
<message>
<source>Import from</source>
<translation type="unfinished"/>
<translation>Importera från</translation>
</message>
<message>
<source>Export to</source>
<translation type="unfinished"/>
<translation>Exportera till</translation>
</message>
<message>
<source>Synchronize with</source>
<translation type="unfinished"/>
<translation>Synkronisera med</translation>
</message>
<message>
<source>Disabled share %1</source>
@ -3187,7 +3188,7 @@ Line %2, column %3</source>
</message>
<message>
<source>Key File</source>
<translation type="unfinished"/>
<translation>Nyckel-fil</translation>
</message>
<message>
<source>&lt;p&gt;You can add a key file containing random bytes for additional security.&lt;/p&gt;&lt;p&gt;You must keep it secret and never lose it or you will be locked out!&lt;/p&gt;</source>
@ -3250,7 +3251,7 @@ Message: %2</source>
</message>
<message>
<source>E&amp;ntries</source>
<translation type="unfinished"/>
<translation>Poster</translation>
</message>
<message>
<source>&amp;Groups</source>
@ -3441,11 +3442,11 @@ We recommend you use the AppImage available on our downloads page.</source>
</message>
<message>
<source>&amp;New entry</source>
<translation type="unfinished"/>
<translation>Ny post</translation>
</message>
<message>
<source>Add a new entry</source>
<translation type="unfinished"/>
<translation>Lägg till ny post</translation>
</message>
<message>
<source>&amp;Edit entry</source>

View File

@ -50,7 +50,7 @@
<name>AgentSettingsWidget</name>
<message>
<source>Enable SSH Agent (requires restart)</source>
<translation>SSH Aracısını etkinleştir (yeniden başlatma gerektirir)</translation>
<translation>SSH İstemcisini etkinleştir (yeniden başlatma gerektirir)</translation>
</message>
<message>
<source>Use OpenSSH for Windows instead of Pageant</source>
@ -93,7 +93,7 @@
</message>
<message>
<source>Follow style</source>
<translation>Takip tarzı</translation>
<translation>Takip tipi</translation>
</message>
</context>
<context>
@ -245,7 +245,7 @@
</message>
<message>
<source>Button style</source>
<translation>Düğme tarzı</translation>
<translation>Düğme tipi</translation>
</message>
</context>
<context>
@ -367,7 +367,7 @@
</message>
<message>
<source>Default sequence</source>
<translation>Varsayılan sıra</translation>
<translation>Öntanımlı sıra</translation>
</message>
</context>
<context>
@ -491,7 +491,7 @@ Lütfen kimlik bilgilerini kaydetmek için doğru veritabanını seç.</translat
</message>
<message>
<source>Re&amp;quest to unlock the database if it is locked</source>
<translation>Eğer kilitliyse veri tabanını açmayı is&amp;te</translation>
<translation>Eğer kilitliyse veritabanının kilidini açma is&amp;teği</translation>
</message>
<message>
<source>Only entries with the same scheme (http://, https://, ...) are returned.</source>
@ -535,7 +535,7 @@ Lütfen kimlik bilgilerini kaydetmek için doğru veritabanını seç.</translat
</message>
<message>
<source>Only the selected database has to be connected with a client.</source>
<translation>Yalnızca seçilen veri tabanı istemciyle bağlanmış olmalıdır.</translation>
<translation>Yalnızca seçilen veritabanı istemciyle bağlanmış olmalıdır.</translation>
</message>
<message>
<source>Searc&amp;h in all opened databases for matching credentials</source>
@ -611,15 +611,15 @@ Lütfen kimlik bilgilerini kaydetmek için doğru veritabanını seç.</translat
</message>
<message>
<source>Due to Snap sandboxing, you must run a script to enable browser integration.&lt;br /&gt;You can obtain this script from %1</source>
<translation type="unfinished"/>
<translation>Snap sanal alanı nedeniyle, tarayıcı bütünleşmesini etkinleştirmek için bir komut dosyası çalıştırmalısınız.&lt;br /&gt;Bu betiği %1 adresinden edinebilirsiniz.</translation>
</message>
<message>
<source>Please see special instructions for browser extension use below</source>
<translation type="unfinished"/>
<translation>Lütfen aşağıdaki tarayıcı uzantısı kullanımına ilişkin özel talimatlara bakın</translation>
</message>
<message>
<source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</source>
<translation type="unfinished"/>
<translation>Tarayıcı bütünleşmesinin çalışması için KeePassXC-Tarayıcı gereklidir. &lt;br /&gt;%1 ve %2 için indirin. %3</translation>
</message>
</context>
<context>
@ -696,19 +696,23 @@ Moved %2 keys to custom data.</source>
</message>
<message>
<source>KeePassXC: Create a new group</source>
<translation type="unfinished"/>
<translation>KeePassXC: Yeni bir küme oluştur</translation>
</message>
<message>
<source>A request for creating a new group &quot;%1&quot; has been received.
Do you want to create this group?
</source>
<translation type="unfinished"/>
<translation>&quot;%1&quot; adlı yeni bir küme oluşturma isteği alındı.
Bu kümeyi oluşturmak ister misiniz?
</translation>
</message>
<message>
<source>Your KeePassXC-Browser settings need to be moved into the database settings.
This is necessary to maintain your current browser connections.
Would you like to migrate your existing settings now?</source>
<translation type="unfinished"/>
<translation>KeePassXC-Tarayıcı ayarlarınızın veritabanı ayarlarına taşınması gerekir.
Bu, mevcut tarayıcı bağlantılarınızı korumak için gereklidir.
Mevcut ayarlarınızı şimdi taşımak ister misiniz?</translation>
</message>
</context>
<context>
@ -872,7 +876,7 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>Key not transformed. This is a bug, please report it to the developers!</source>
<translation type="unfinished"/>
<translation>Anahtar dönüştürülmedi. Bu bir hatadır, lütfen geliştiricilere bildirin!</translation>
</message>
</context>
<context>
@ -997,7 +1001,7 @@ Lütfen yeni bir anahtar dosyası oluşturmayı düşünün.</translation>
</message>
<message>
<source>&amp;Disconnect all browsers</source>
<translation>&amp;Tüm tarayıcıları kapatın</translation>
<translation>&amp;Tüm tarayıcıların bağlantısını kes</translation>
</message>
<message>
<source>Forg&amp;et all site-specific settings on entries</source>
@ -1039,13 +1043,13 @@ Bu işlem, tarayıcı eklentisine bağlantıyı engelleyebilir.</translation>
</message>
<message>
<source>Disconnect all browsers</source>
<translation>Tüm tarayıcıları kapatın</translation>
<translation>Tüm tarayıcıların bağlantısını kes</translation>
</message>
<message>
<source>Do you really want to disconnect all browsers?
This may prevent connection to the browser plugin.</source>
<translation>Tüm tarayıcıların bağlantısını kesmek istiyor musunuz?
Bu işlem, tarayıcı eklentisine bağlantıyı engelleyebilir.</translation>
Bu işlem, tarayıcı eklentisi bağlantısını engelleyebilir.</translation>
</message>
<message>
<source>KeePassXC: No keys found</source>
@ -1095,7 +1099,7 @@ Girişlere erişim izinleri iptal edilecek.</translation>
</message>
<message>
<source>The active database does not contain an entry with permissions.</source>
<translation>Etkin veritabanı izinleri olan bir girdi içermiyor.</translation>
<translation>Etkin veritabanı, izinleri olan bir girdi içermiyor.</translation>
</message>
<message>
<source>Move KeePassHTTP attributes to custom data</source>
@ -1254,15 +1258,15 @@ Eğer bu sayı ile devam ederseniz, veritabanınız çok kolay çözülerek kır
<name>DatabaseSettingsWidgetGeneral</name>
<message>
<source>Database Meta Data</source>
<translation>Veritabanı Meta Verileri</translation>
<translation>Veritabanı Üst Veri</translation>
</message>
<message>
<source>Database name:</source>
<translation>Veri tabanı adı:</translation>
<translation>Veritabanı adı:</translation>
</message>
<message>
<source>Database description:</source>
<translation>Veri tabanı ayrıntısı:</translation>
<translation>Veritabanı ıklaması:</translation>
</message>
<message>
<source>Default username:</source>
@ -1379,7 +1383,7 @@ Parola olmadan devam etmek istediğinize emin misiniz?</translation>
<name>DatabaseTabWidget</name>
<message>
<source>KeePass 2 Database</source>
<translation>KeePass 2 Veri Tabanı</translation>
<translation>KeePass 2 Veritabanı</translation>
</message>
<message>
<source>All files</source>
@ -1387,7 +1391,7 @@ Parola olmadan devam etmek istediğinize emin misiniz?</translation>
</message>
<message>
<source>Open database</source>
<translation>Veri tabanı </translation>
<translation>Veritabanı </translation>
</message>
<message>
<source>CSV file</source>
@ -1395,19 +1399,19 @@ Parola olmadan devam etmek istediğinize emin misiniz?</translation>
</message>
<message>
<source>Merge database</source>
<translation>Veri tabanı birleştir</translation>
<translation>Veritabanını birleştir</translation>
</message>
<message>
<source>Open KeePass 1 database</source>
<translation>KeePass 1 veri tabanı </translation>
<translation>KeePass 1 veritabanı </translation>
</message>
<message>
<source>KeePass 1 database</source>
<translation>KeePass 1 veri tabanı</translation>
<translation>KeePass 1 veritabanı</translation>
</message>
<message>
<source>Export database to CSV file</source>
<translation>Veri tabanını CSV dosyasına dışa aktar</translation>
<translation>Veritabanını CSV dosyasına dışa aktar</translation>
</message>
<message>
<source>Writing the CSV file failed.</source>
@ -1487,11 +1491,11 @@ Bu kesinlikle bir hatadır, lütfen geliştiricilere bildirin.</translation>
</message>
<message>
<source>No current database.</source>
<translation>Geçerli veri tabanı yok.</translation>
<translation>Geçerli veritabanı yok.</translation>
</message>
<message>
<source>No source database, nothing to do.</source>
<translation>Kaynak veri tabanı yok, yapılacak bir şey yok.</translation>
<translation>Kaynak veritabanı yok, yapılacak bir şey yok.</translation>
</message>
<message>
<source>Search Results (%1)</source>
@ -1507,7 +1511,7 @@ Bu kesinlikle bir hatadır, lütfen geliştiricilere bildirin.</translation>
</message>
<message>
<source>The database file has changed. Do you want to load the changes?</source>
<translation>Veri tabanı dosyası değiştirildi. Değişiklikleri yüklemek ister misiniz?</translation>
<translation>Veritabanı dosyası değiştirildi. Değişiklikleri yüklemek ister misiniz?</translation>
</message>
<message>
<source>Merge Request</source>
@ -1586,7 +1590,7 @@ Güvenli kaydetme devre dışı bırakılsın ve tekrar denensin mi?</translatio
<message>
<source>Writing the database failed.
%1</source>
<translation>Veritabanını yazma başarısız
<translation>Veritabanına yazma başarısız
%1</translation>
</message>
<message>
@ -1631,7 +1635,7 @@ Güvenli kaydetme devre dışı bırakılsın ve tekrar denensin mi?</translatio
</message>
<message>
<source>Shared group...</source>
<translation type="unfinished"/>
<translation>Paylaşılan küme...</translation>
</message>
</context>
<context>
@ -1662,7 +1666,7 @@ Güvenli kaydetme devre dışı bırakılsın ve tekrar denensin mi?</translatio
</message>
<message>
<source>SSH Agent</source>
<translation>SSH Aracısı</translation>
<translation>SSH İstemcisi</translation>
</message>
<message>
<source>n/a</source>
@ -1893,7 +1897,7 @@ Güvenli kaydetme devre dışı bırakılsın ve tekrar denensin mi?</translatio
</message>
<message>
<source>Remove key from agent after</source>
<translation>Sonra ajandan anahtarı kaldır</translation>
<translation>Anahtarı istemciden sonra kaldır</translation>
</message>
<message>
<source> seconds</source>
@ -1905,7 +1909,7 @@ Güvenli kaydetme devre dışı bırakılsın ve tekrar denensin mi?</translatio
</message>
<message>
<source>Remove key from agent when database is closed/locked</source>
<translation>Veritabanı kapalı/kilitliyken ajandan anahtarı kaldır</translation>
<translation>Veritabanı kapalı/kilitliyken istemciden anahtarı kaldır</translation>
</message>
<message>
<source>Public key</source>
@ -1913,7 +1917,7 @@ Güvenli kaydetme devre dışı bırakılsın ve tekrar denensin mi?</translatio
</message>
<message>
<source>Add key to agent when database is opened/unlocked</source>
<translation>Veritabanı kapalı/kilitliyken ajana anahtarı ekle</translation>
<translation>Veritabanı kapalı/kilitliyken istemciye anahtar ekle</translation>
</message>
<message>
<source>Comment</source>
@ -2076,15 +2080,15 @@ Güvenli kaydetme devre dışı bırakılsın ve tekrar denensin mi?</translatio
</message>
<message>
<source>The export container %1 is already referenced.</source>
<translation type="unfinished"/>
<translation>%1 dışa aktarma kapsayıcı zaten referans alındı.</translation>
</message>
<message>
<source>The import container %1 is already imported.</source>
<translation type="unfinished"/>
<translation>%1 içe aktarma kapsayıcı zaten içe aktarıldı</translation>
</message>
<message>
<source>The container %1 imported and export by different groups.</source>
<translation type="unfinished"/>
<translation>%1 kapsayıcı, farklı kümelere göre içe ve dışa aktarıldı.</translation>
</message>
</context>
<context>
@ -2190,7 +2194,7 @@ Güvenli kaydetme devre dışı bırakılsın ve tekrar denensin mi?</translatio
</message>
<message numerus="yes">
<source>This icon is used by %n entry(s), and will be replaced by the default icon. Are you sure you want to delete it?</source>
<translation><numerusform>Bu simge %n girişi tarafından kullanılır ve varsayılan simge ile değiştirilir. Silmek istediğinize emin misiniz?</numerusform><numerusform>Bu simge %n girişi tarafından kullanılır ve varsayılan simge ile değiştirilir. Silmek istediğinize emin misiniz?</numerusform></translation>
<translation><numerusform>Bu simge %n girişi tarafından kullanılır ve öntanımlı simge ile değiştirilir. Silmek istediğinize emin misiniz?</numerusform><numerusform>Bu simge %n girişi tarafından kullanılır ve öntanımlı simge ile değiştirilir. Silmek istediğinize emin misiniz?</numerusform></translation>
</message>
</context>
<context>
@ -2449,7 +2453,7 @@ Bu etkilenen eklentilerin bozulmasına neden olabilir.</translation>
</message>
<message>
<source>Expiration</source>
<translation>Geçerlilik</translation>
<translation>Süre bitimi</translation>
</message>
<message>
<source>URL</source>
@ -2594,7 +2598,7 @@ Bu etkilenen eklentilerin bozulmasına neden olabilir.</translation>
</message>
<message>
<source>Wrong key or database file is corrupt.</source>
<translation>Yanlış anahtar veya veri tabanı dosyası bozuk.</translation>
<translation>Yanlış anahtar veya veritabanı dosyası bozuk.</translation>
</message>
<message>
<source>missing database headers</source>
@ -2632,7 +2636,7 @@ Bu etkilenen eklentilerin bozulmasına neden olabilir.</translation>
<name>Kdbx4Reader</name>
<message>
<source>missing database headers</source>
<translation>eksik veri tabanı başlıkları</translation>
<translation>eksik veritabanı başlıkları</translation>
</message>
<message>
<source>Unable to calculate master key</source>
@ -2648,7 +2652,7 @@ Bu etkilenen eklentilerin bozulmasına neden olabilir.</translation>
</message>
<message>
<source>Wrong key or database file is corrupt. (HMAC mismatch)</source>
<translation>Yanlış anahtar veya veri tabanı dosyası bozuk. (HMAC uyuşmuyor)</translation>
<translation>Yanlış anahtar veya veritabanı dosyası bozuk. (HMAC uyuşmuyor)</translation>
</message>
<message>
<source>Unknown cipher</source>
@ -2812,21 +2816,21 @@ Bu etkilenen eklentilerin bozulmasına neden olabilir.</translation>
</message>
<message>
<source>Not a KeePass database.</source>
<translation>KeePass veri tabanı değil.</translation>
<translation>KeePass veritabanı değil.</translation>
</message>
<message>
<source>The selected file is an old KeePass 1 database (.kdb).
You can import it by clicking on Database &gt; 'Import KeePass 1 database...'.
This is a one-way migration. You won&apos;t be able to open the imported database with the old KeePassX 0.4 version.</source>
<translation>Seçilen dosya eski bir KeePass1 veri tabanıdır (.kdb).
<translation>Seçilen dosya eski bir KeePass1 veritabanıdır (.kdb).
Veri tabanı &gt; &apos;KeePass1 veri tabanı içe aktar...&apos;a tıklayarak içe aktarabilirsiniz.
Bu tek yönlü bir yer değiştirmedir. İçe aktarılan veri tabanını eski KeePassX 0.4 sürümüyle açamayacaksınız.</translation>
Veritabanı &gt; &apos;KeePass1 veritabanı içe aktar...&apos; üzerine tıklayarak içe aktarabilirsiniz.
Bu tek yönlü bir yer değiştirmedir. İçe aktarılan veritabanını eski KeePassX 0.4 sürümüyle açamayacaksınız.</translation>
</message>
<message>
<source>Unsupported KeePass 2 database version.</source>
<translation>Desteklenmeyen KeePass 2 veri tabanı sürümü.</translation>
<translation>Desteklenmeyen KeePass 2 veritabanı sürümü.</translation>
</message>
<message>
<source>Invalid cipher uuid length: %1 (length=%2)</source>
@ -2853,7 +2857,7 @@ Bu tek yönlü bir yer değiştirmedir. İçe aktarılan veri tabanını eski Ke
</message>
<message>
<source>Missing icon uuid or data</source>
<translation>Simge uuid&apos;si veya verisi eksik</translation>
<translation>Simge UUID&apos;si veya verisi eksik</translation>
</message>
<message>
<source>Missing custom data key or value</source>
@ -2885,15 +2889,15 @@ Bu tek yönlü bir yer değiştirmedir. İçe aktarılan veri tabanını eski Ke
</message>
<message>
<source>Null DeleteObject uuid</source>
<translation>Boş &quot;DeleteObject&quot; &quot;uuid&quot;</translation>
<translation>Boş &quot;DeleteObject&quot; UUID</translation>
</message>
<message>
<source>Missing DeletedObject uuid or time</source>
<translation>Hatalı &quot;DeleteObject&quot; evrensel benzersiz tanımlayıcı &quot;uuid&quot; veya zamanı</translation>
<translation>DeletedObject UUID veya zaman eksik</translation>
</message>
<message>
<source>Null entry uuid</source>
<translation>Boş evrensel benzersiz tanımlayıcı &quot;uuid&quot; girdisi</translation>
<translation>Boş UUID girdisi</translation>
</message>
<message>
<source>Invalid entry icon number</source>
@ -2905,12 +2909,11 @@ Bu tek yönlü bir yer değiştirmedir. İçe aktarılan veri tabanını eski Ke
</message>
<message>
<source>No entry uuid found</source>
<translation>
Evrensel benzersiz tanımlayıcı &quot;uuid&quot; girdisi bulunamadı</translation>
<translation>UUID girdisi bulunamadı</translation>
</message>
<message>
<source>History element with different uuid</source>
<translation>Farklı evrensel benzersiz tanımlayıcı &quot;uuid&quot; ile geçmiş öğesi</translation>
<translation>Farklı UUID ile tarih elemanı</translation>
</message>
<message>
<source>Duplicate custom attribute found</source>
@ -2954,7 +2957,7 @@ Evrensel benzersiz tanımlayıcı &quot;uuid&quot; girdisi bulunamadı</translat
</message>
<message>
<source>Invalid uuid value</source>
<translation>Geçersiz Evrensel Benzersiz Tanımlayıcı &quot;uuid&quot; değeri</translation>
<translation>Geçersiz UUID değeri</translation>
</message>
<message>
<source>Unable to decompress binary</source>
@ -2974,11 +2977,11 @@ Satır %2, sütun %3</translation>
<name>KeePass1OpenWidget</name>
<message>
<source>Import KeePass1 database</source>
<translation>KeePass1 veri tabanı içe aktar</translation>
<translation>KeePass1 veritabanı içe aktar</translation>
</message>
<message>
<source>Unable to open the database.</source>
<translation>Veri tabanı ılamıyor.</translation>
<translation>Veritabanı ılamıyor.</translation>
</message>
</context>
<context>
@ -2989,7 +2992,7 @@ Satır %2, sütun %3</translation>
</message>
<message>
<source>Not a KeePass database.</source>
<translation>KeePass veri tabanı değil.</translation>
<translation>KeePass veritabanı değil.</translation>
</message>
<message>
<source>Unsupported encryption algorithm.</source>
@ -2997,7 +3000,7 @@ Satır %2, sütun %3</translation>
</message>
<message>
<source>Unsupported KeePass database version.</source>
<translation>Desteklenmeyen KeePass veri tabanı sürümü.</translation>
<translation>Desteklenmeyen KeePass veritabanı sürümü.</translation>
</message>
<message>
<source>Unable to read encryption IV</source>
@ -3038,7 +3041,7 @@ Satır %2, sütun %3</translation>
</message>
<message>
<source>Wrong key or database file is corrupt.</source>
<translation>Yanlış anahtar veya veri tabanı dosyası bozuk.</translation>
<translation>Yanlış anahtar veya veritabanı dosyası bozuk.</translation>
</message>
<message>
<source>Key transformation failed</source>
@ -3157,19 +3160,19 @@ Satır %2, sütun %3</translation>
</message>
<message>
<source>Disabled share %1</source>
<translation type="unfinished"/>
<translation>Paylaşım devre dışı %1</translation>
</message>
<message>
<source>Import from share %1</source>
<translation type="unfinished"/>
<translation>%1 paylaşımından içe aktar</translation>
</message>
<message>
<source>Export to share %1</source>
<translation type="unfinished"/>
<translation>%1 paylaşımına aktar</translation>
</message>
<message>
<source>Synchronize with share %1</source>
<translation type="unfinished"/>
<translation>%1 paylaşımına eşitle</translation>
</message>
</context>
<context>
@ -3255,7 +3258,7 @@ Message: %2</source>
</message>
<message>
<source>All files</source>
<translation>Bütün dosyalar</translation>
<translation>Tüm dosyalar</translation>
</message>
<message>
<source>Create Key File...</source>
@ -3278,11 +3281,11 @@ Message: %2</source>
<name>MainWindow</name>
<message>
<source>&amp;Database</source>
<translation>&amp;Veri tabanı</translation>
<translation>&amp;Veritabanı</translation>
</message>
<message>
<source>&amp;Recent databases</source>
<translation>&amp;Son veri tabanları</translation>
<translation>&amp;Son veritabanları</translation>
</message>
<message>
<source>&amp;Help</source>
@ -3310,15 +3313,15 @@ Message: %2</source>
</message>
<message>
<source>&amp;Open database...</source>
<translation>&amp;Veri tabanı ...</translation>
<translation>&amp;Veritabanı ...</translation>
</message>
<message>
<source>&amp;Save database</source>
<translation>Veri tabanını k&amp;aydet</translation>
<translation>Veritabanını k&amp;aydet</translation>
</message>
<message>
<source>&amp;Close database</source>
<translation>Veri tabanını &amp;kapat</translation>
<translation>Veritabanını &amp;kapat</translation>
</message>
<message>
<source>&amp;Delete entry</source>
@ -3334,11 +3337,11 @@ Message: %2</source>
</message>
<message>
<source>Sa&amp;ve database as...</source>
<translation>Veri tabanını farklı ka&amp;ydet...</translation>
<translation>Veritabanını farklı ka&amp;ydet...</translation>
</message>
<message>
<source>Database settings</source>
<translation>Veri tabnı ayarları</translation>
<translation>Veritabanı ayarları</translation>
</message>
<message>
<source>&amp;Clone entry</source>
@ -3362,11 +3365,11 @@ Message: %2</source>
</message>
<message>
<source>Password Generator</source>
<translation>Parola Oluşturucu</translation>
<translation>Parola oluşturucu</translation>
</message>
<message>
<source>&amp;Lock databases</source>
<translation>Veri tabanlarını &amp;kilitle</translation>
<translation>Veritabanlarını &amp;kilitle</translation>
</message>
<message>
<source>&amp;Title</source>
@ -3476,7 +3479,7 @@ Keepassxc indirme sayfasında mevcut Appımage kullanmanızı öneririz.</transl
</message>
<message>
<source>&amp;Merge from database...</source>
<translation>Veritabanından &amp;birleştir ...</translation>
<translation>Veritabanından &amp;birleştir...</translation>
</message>
<message>
<source>Merge from another KDBX database</source>
@ -3516,7 +3519,7 @@ Keepassxc indirme sayfasında mevcut Appımage kullanmanızı öneririz.</transl
</message>
<message>
<source>Copy &amp;password</source>
<translation>Kopyala &amp;parola</translation>
<translation>&amp;Parolayı kopyala</translation>
</message>
<message>
<source>Perform &amp;Auto-Type</source>
@ -3593,7 +3596,7 @@ Bazı hatalar ve küçük sorunlar olabilir, bu sürüm şu an dağıtımda değ
</message>
<message>
<source>older entry merged from database &quot;%1&quot;</source>
<translation>eski giriş &quot;%1&quot; veritabanından birleştirildi</translation>
<translation>eski giriş &quot;%1&quot; veritabanıyla birleştirildi</translation>
</message>
<message>
<source>Adding backup for older target %1 [%2]</source>
@ -3668,7 +3671,7 @@ Bazı hatalar ve küçük sorunlar olabilir, bu sürüm şu an dağıtımda değ
</message>
<message>
<source>Simple Settings</source>
<translation>Temel Ayarlar</translation>
<translation>Basit Ayarlar</translation>
</message>
</context>
<context>
@ -4159,15 +4162,15 @@ Bazı hatalar ve küçük sorunlar olabilir, bu sürüm şu an dağıtımda değ
</message>
<message>
<source>Add a new entry to a database.</source>
<translation>Veri tabanına yeni girdi ekle.</translation>
<translation>Veritabanına yeni girdi ekle.</translation>
</message>
<message>
<source>Path of the database.</source>
<translation>Veri tabanının yolu.</translation>
<translation>Veritabanının yolu.</translation>
</message>
<message>
<source>Key file of the database.</source>
<translation>Veri tabanının anahtar dosyası.</translation>
<translation>Veritabanının anahtar dosyası.</translation>
</message>
<message>
<source>path</source>
@ -4252,11 +4255,11 @@ Bazı hatalar ve küçük sorunlar olabilir, bu sürüm şu an dağıtımda değ
</message>
<message>
<source>Extract and print the content of a database.</source>
<translation>Veri tabanının içeriğini çıkar ve yazdır.</translation>
<translation>Veritabanının içeriğini çıkar ve yazdır.</translation>
</message>
<message>
<source>Path of the database to extract.</source>
<translation>Veri tabanının çıkarılacağı yol.</translation>
<translation>Veritabanının çıkarılacağı yol.</translation>
</message>
<message>
<source>Insert password to unlock %1: </source>
@ -4328,7 +4331,7 @@ Kullanılabilir komutlar:
</message>
<message>
<source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source>
<translation>Gösterilecek özniteliklerin isimleri. Bu seçenek, her bir özniteliğin verilen sıraya göre bir satırda gösterilmesiyle birden fazla kez belirtilebilir. Eğer hiçbir öznitelik belirtilmediyse, varsayılan özniteliklerin bir özeti verilir.</translation>
<translation>Gösterilecek özniteliklerin isimleri. Bu seçenek, her bir özniteliğin verilen sıraya göre bir satırda gösterilmesiyle birden fazla kez belirtilebilir. Eğer hiçbir öznitelik belirtilmediyse, öntanımlı özniteliklerin bir özeti verilir.</translation>
</message>
<message>
<source>attribute</source>
@ -4340,7 +4343,7 @@ Kullanılabilir komutlar:
</message>
<message>
<source>NULL device</source>
<translation>NULL aygıtı</translation>
<translation>Geçersiz aygıt</translation>
</message>
<message>
<source>error reading from device</source>
@ -4400,7 +4403,7 @@ Kullanılabilir komutlar:
</message>
<message>
<source>SSH Agent</source>
<translation>SSH Aracısı</translation>
<translation>SSH İstemcisi</translation>
</message>
<message>
<source>Generate a new random diceware passphrase.</source>
@ -4414,11 +4417,11 @@ Kullanılabilir komutlar:
<source>Wordlist for the diceware generator.
[Default: EFF English]</source>
<translation>Diceware oluşturucu için Kelime Listesi.
[Varsayılan: EFF İngilizce]</translation>
[Öntanımlı: EFF İngilizce]</translation>
</message>
<message>
<source>Generate a new random password.</source>
<translation>Yeni bir karışık şifre oluştur.</translation>
<translation>Yeni bir karışık parola oluştur.</translation>
</message>
<message>
<source>Invalid value for password length %1.</source>
@ -4495,7 +4498,7 @@ Kullanılabilir komutlar:
</message>
<message>
<source>Enter new password for entry: </source>
<translation>Girdi için yeni şifre girin: </translation>
<translation>Girdi için yeni parola gir: </translation>
</message>
<message>
<source>Writing the database failed: %1</source>
@ -4759,7 +4762,7 @@ Kullanılabilir komutlar:
</message>
<message>
<source>Message encryption failed.</source>
<translation>Mesaj şifreleme başarısız.</translation>
<translation>İleti şifreleme başarısız.</translation>
</message>
<message>
<source>No groups found</source>
@ -4859,7 +4862,7 @@ Kullanılabilir komutlar:
</message>
<message>
<source>Cannot create new group</source>
<translation type="unfinished"/>
<translation>Yeni küme oluşturulamıyor</translation>
</message>
</context>
<context>
@ -5119,7 +5122,7 @@ Kullanılabilir komutlar:
</message>
<message>
<source>All files</source>
<translation>Bütün dosyalar</translation>
<translation>Tüm dosyalar</translation>
</message>
<message>
<source>Select path</source>
@ -5135,7 +5138,7 @@ Kullanılabilir komutlar:
</message>
<message>
<source>Signer:</source>
<translation type="unfinished"/>
<translation>İmzalayan:</translation>
</message>
</context>
<context>
@ -5258,27 +5261,27 @@ Kullanılabilir komutlar:
</message>
<message>
<source>Multiple import source path to %1 in %2</source>
<translation type="unfinished"/>
<translation>%2 içinde %1&apos;e çoklu içe aktarma kaynak yolu</translation>
</message>
<message>
<source>Conflicting export target path %1 in %2</source>
<translation type="unfinished"/>
<translation>Çakışan aktarma hedef yolu %1 %2</translation>
</message>
<message>
<source>Could not embed signature: Could not open file to write (%1)</source>
<translation type="unfinished"/>
<translation>İmza gömülemedi: Yazılacak dosya ılamadı (%1)</translation>
</message>
<message>
<source>Could not embed signature: Could not write file (%1)</source>
<translation type="unfinished"/>
<translation>İmza gömülemedi: Dosya yazılamadı (%1)</translation>
</message>
<message>
<source>Could not embed database: Could not open file to write (%1)</source>
<translation type="unfinished"/>
<translation>Veritabanı gömülemedi: Yazılacak dosya ılamadı (%1)</translation>
</message>
<message>
<source>Could not embed database: Could not write file (%1)</source>
<translation type="unfinished"/>
<translation>Veritabanı gömülemedi: dosya yazılamadı (%1)</translation>
</message>
</context>
<context>
@ -5332,7 +5335,7 @@ Kullanılabilir komutlar:
</message>
<message>
<source>Default RFC 6238 token settings</source>
<translation>Varsayılan RFC 6238 anahtar ayarları</translation>
<translation>Öntanımlı RFC 6238 anahtar ayarları</translation>
</message>
<message>
<source>Steam token settings</source>
@ -5427,7 +5430,7 @@ Kullanılabilir komutlar:
<name>WelcomeWidget</name>
<message>
<source>Start storing your passwords securely in a KeePassXC database</source>
<translation>Parolalarınızı KeePassXC veri tabanında güvenle depolamaya başlayın</translation>
<translation>Parolalarınızı KeePassXC veritabanında güvenle depolamaya başlayın</translation>
</message>
<message>
<source>Create new database</source>
@ -5462,11 +5465,11 @@ Kullanılabilir komutlar:
</message>
<message>
<source>YubiKey Challenge-Response</source>
<translation>YubiKey Challenge-Response</translation>
<translation>YubiKey Karşılama Yanıtı</translation>
</message>
<message>
<source>&lt;p&gt;If you own a &lt;a href=&quot;https://www.yubico.com/&quot;&gt;YubiKey&lt;/a&gt;, you can use it for additional security.&lt;/p&gt;&lt;p&gt;The YubiKey requires one of its slots to be programmed as &lt;a href=&quot;https://www.yubico.com/products/services-software/personalization-tools/challenge-response/&quot;&gt;HMAC-SHA1 Challenge-Response&lt;/a&gt;.&lt;/p&gt;</source>
<translation>&lt;p&gt;Eğer bir &lt;a href=&quot;https://www.yubico.com/&quot;&gt;YubiKey&lt;/a&gt;sahibiyseniz ek güvenlik için kullanabilirsiniz.&lt;/p&gt;&lt;p&gt;YubiKey, yuvalarından birinin programlanması gerekir &lt;a href=&quot;https://www.yubico.com/products/services-software/personalization-tools/challenge-response/&quot;&gt;HMAC-SHA1 Challenge-Response&lt;/a&gt;.&lt;/p&gt;</translation>
<translation>&lt;p&gt;Eğer bir &lt;a href=&quot;https://www.yubico.com/&quot;&gt;YubiKey&lt;/a&gt; sahibiyseniz ek güvenlik için kullanabilirsiniz.&lt;/p&gt;&lt;p&gt;YubiKey yuvalarından birinin programlanması gerekir &lt;a href=&quot;https://www.yubico.com/products/services-software/personalization-tools/challenge-response/&quot;&gt;HMAC-SHA1 Karşılama-Yanıtı&lt;/a&gt;.&lt;/p&gt;</translation>
</message>
<message>
<source>No YubiKey detected, please ensure it&apos;s plugged in.</source>

View File

@ -611,15 +611,15 @@ Please select the correct database for saving credentials.</source>
</message>
<message>
<source>Due to Snap sandboxing, you must run a script to enable browser integration.&lt;br /&gt;You can obtain this script from %1</source>
<translation type="unfinished"/>
<translation>Через заходи безпеки у Snap Вам необхідно виконати сценарій для сполучення з переглядачем. &lt;br /&gt;Ви можете знайти файл сценарію у %1</translation>
</message>
<message>
<source>Please see special instructions for browser extension use below</source>
<translation type="unfinished"/>
<translation>Нижче Ви можете знайти інструкції для використання додатку для браузера</translation>
</message>
<message>
<source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</source>
<translation type="unfinished"/>
<translation>Для сполучення з переглядачем необхідний KeePassXC-Browser. &lt;br /&gt;Завантажте його для %1 та %2. %3</translation>
</message>
</context>
<context>
@ -696,19 +696,23 @@ Moved %2 keys to custom data.</source>
</message>
<message>
<source>KeePassXC: Create a new group</source>
<translation type="unfinished"/>
<translation>KeePassXC: Створити нову групу</translation>
</message>
<message>
<source>A request for creating a new group &quot;%1&quot; has been received.
Do you want to create this group?
</source>
<translation type="unfinished"/>
<translation>Отримано запит для створення нової групи &quot;%1&quot;.
Ви хочете створити цю групу?
</translation>
</message>
<message>
<source>Your KeePassXC-Browser settings need to be moved into the database settings.
This is necessary to maintain your current browser connections.
Would you like to migrate your existing settings now?</source>
<translation type="unfinished"/>
<translation>Ваші параметри KeePassXC-Переглядача мають бути переміщені до параметрів сховища.
Це необхідно для підтримання сполучень з Вашим поточним переглядачем.
Бажаєте перемістити параметри зараз?</translation>
</message>
</context>
<context>
@ -872,7 +876,7 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>Key not transformed. This is a bug, please report it to the developers!</source>
<translation type="unfinished"/>
<translation>Ключ не перетворено через ваду в програмі. Будь ласка, повідомте про це розробникам!</translation>
</message>
</context>
<context>
@ -1631,7 +1635,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Shared group...</source>
<translation type="unfinished"/>
<translation>Спільна група...</translation>
</message>
</context>
<context>
@ -2076,15 +2080,15 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>The export container %1 is already referenced.</source>
<translation type="unfinished"/>
<translation>На експортну оболонку %1 вже існує посилання.</translation>
</message>
<message>
<source>The import container %1 is already imported.</source>
<translation type="unfinished"/>
<translation>Оболонку %1 вже імпортовано.</translation>
</message>
<message>
<source>The container %1 imported and export by different groups.</source>
<translation type="unfinished"/>
<translation>Оболонку %1 імпортують та експортують різні групи.</translation>
</message>
</context>
<context>
@ -3157,19 +3161,19 @@ Line %2, column %3</source>
</message>
<message>
<source>Disabled share %1</source>
<translation type="unfinished"/>
<translation>Вимкнутий спільний ресурс %1</translation>
</message>
<message>
<source>Import from share %1</source>
<translation type="unfinished"/>
<translation>Імпортувати зі спільного ресурсу %1</translation>
</message>
<message>
<source>Export to share %1</source>
<translation type="unfinished"/>
<translation>Експортувати до спільного ресурсу %1</translation>
</message>
<message>
<source>Synchronize with share %1</source>
<translation type="unfinished"/>
<translation>Узгодити зі спільним ресурсом %1</translation>
</message>
</context>
<context>
@ -4858,7 +4862,7 @@ Available commands:
</message>
<message>
<source>Cannot create new group</source>
<translation type="unfinished"/>
<translation>Неможливо створити нову групу</translation>
</message>
</context>
<context>
@ -5134,7 +5138,7 @@ Available commands:
</message>
<message>
<source>Signer:</source>
<translation type="unfinished"/>
<translation>Підписувач:</translation>
</message>
</context>
<context>
@ -5253,31 +5257,31 @@ Available commands:
</message>
<message>
<source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
<translation type="unfinished"/>
<translation>Довірити %1, що має відбиток %2 з %3? {1 ?} {2 ?}</translation>
</message>
<message>
<source>Multiple import source path to %1 in %2</source>
<translation type="unfinished"/>
<translation>Шлях до %1 має декілька джерел імпорту в %2.</translation>
</message>
<message>
<source>Conflicting export target path %1 in %2</source>
<translation type="unfinished"/>
<translation>Суперечливий шлях для експорту %1 у %2</translation>
</message>
<message>
<source>Could not embed signature: Could not open file to write (%1)</source>
<translation type="unfinished"/>
<translation>Неможливо вкласти підпис: неможливо відкрити файл для запису (%1)</translation>
</message>
<message>
<source>Could not embed signature: Could not write file (%1)</source>
<translation type="unfinished"/>
<translation>Неможливо вкласти підпис: неможливо записати файл (%1)</translation>
</message>
<message>
<source>Could not embed database: Could not open file to write (%1)</source>
<translation type="unfinished"/>
<translation>Неможливо вкласти сховище: неможливо відкрити файл для запису (%1)</translation>
</message>
<message>
<source>Could not embed database: Could not write file (%1)</source>
<translation type="unfinished"/>
<translation>Неможливо вкласти сховище: неможливо записати файл (%1)</translation>
</message>
</context>
<context>

View File

@ -611,15 +611,15 @@ Please select the correct database for saving credentials.</source>
</message>
<message>
<source>Due to Snap sandboxing, you must run a script to enable browser integration.&lt;br /&gt;You can obtain this script from %1</source>
<translation type="unfinished"/>
<translation>&lt;br /&gt; %1 </translation>
</message>
<message>
<source>Please see special instructions for browser extension use below</source>
<translation type="unfinished"/>
<translation>使</translation>
</message>
<message>
<source>KeePassXC-Browser is needed for the browser integration to work. &lt;br /&gt;Download it for %1 and %2. %3</source>
<translation type="unfinished"/>
<translation>KeePassXC-Browser才能工作&lt;br /&gt;%1 %2. %3</translation>
</message>
</context>
<context>
@ -696,19 +696,22 @@ Moved %2 keys to custom data.</source>
</message>
<message>
<source>KeePassXC: Create a new group</source>
<translation type="unfinished"/>
<translation>keepassxc: 创建新群组</translation>
</message>
<message>
<source>A request for creating a new group &quot;%1&quot; has been received.
Do you want to create this group?
</source>
<translation type="unfinished"/>
<translation> &quot;%1&quot;
</translation>
</message>
<message>
<source>Your KeePassXC-Browser settings need to be moved into the database settings.
This is necessary to maintain your current browser connections.
Would you like to migrate your existing settings now?</source>
<translation type="unfinished"/>
<translation>keepassxc浏览器设置需要移动到数据库设置中
</translation>
</message>
</context>
<context>
@ -872,7 +875,7 @@ Would you like to migrate your existing settings now?</source>
</message>
<message>
<source>Key not transformed. This is a bug, please report it to the developers!</source>
<translation type="unfinished"/>
<translation>bug</translation>
</message>
</context>
<context>
@ -1630,7 +1633,7 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>Shared group...</source>
<translation type="unfinished"/>
<translation>...</translation>
</message>
</context>
<context>
@ -2075,15 +2078,15 @@ Disable safe saves and try again?</source>
</message>
<message>
<source>The export container %1 is already referenced.</source>
<translation type="unfinished"/>
<translation> %1 </translation>
</message>
<message>
<source>The import container %1 is already imported.</source>
<translation type="unfinished"/>
<translation> %1 </translation>
</message>
<message>
<source>The container %1 imported and export by different groups.</source>
<translation type="unfinished"/>
<translation> %1 </translation>
</message>
</context>
<context>
@ -3151,19 +3154,19 @@ Line %2, column %3</source>
</message>
<message>
<source>Disabled share %1</source>
<translation type="unfinished"/>
<translation> %1</translation>
</message>
<message>
<source>Import from share %1</source>
<translation type="unfinished"/>
<translation> %1 </translation>
</message>
<message>
<source>Export to share %1</source>
<translation type="unfinished"/>
<translation> %1</translation>
</message>
<message>
<source>Synchronize with share %1</source>
<translation type="unfinished"/>
<translation> %1 </translation>
</message>
</context>
<context>
@ -4853,7 +4856,7 @@ Available commands:
</message>
<message>
<source>Cannot create new group</source>
<translation type="unfinished"/>
<translation></translation>
</message>
</context>
<context>
@ -5129,7 +5132,7 @@ Available commands:
</message>
<message>
<source>Signer:</source>
<translation type="unfinished"/>
<translation>:</translation>
</message>
</context>
<context>
@ -5252,27 +5255,27 @@ Available commands:
</message>
<message>
<source>Multiple import source path to %1 in %2</source>
<translation type="unfinished"/>
<translation> %1 in %2</translation>
</message>
<message>
<source>Conflicting export target path %1 in %2</source>
<translation type="unfinished"/>
<translation> %1 in %2</translation>
</message>
<message>
<source>Could not embed signature: Could not open file to write (%1)</source>
<translation type="unfinished"/>
<translation>无法嵌入签名:无法打开要写入的文件 (%1)</translation>
</message>
<message>
<source>Could not embed signature: Could not write file (%1)</source>
<translation type="unfinished"/>
<translation>无法嵌入签名:无法写入文件 (%1)</translation>
</message>
<message>
<source>Could not embed database: Could not open file to write (%1)</source>
<translation type="unfinished"/>
<translation>无法嵌入数据库:无法打开要写入的文件 (%1)</translation>
</message>
<message>
<source>Could not embed database: Could not write file (%1)</source>
<translation type="unfinished"/>
<translation>无法嵌入数据库:无法写入文件 (%1)</translation>
</message>
</context>
<context>

View File

@ -1,5 +1,5 @@
name: keepassxc
version: 2.4.0
version: 2.4.1
grade: stable
summary: Community-driven port of the Windows application “KeePass Password Safe”
description: |
@ -9,6 +9,12 @@ description: |
confinement: strict
base: core18
plugs:
icon-themes: # fix mouse cursor theme
interface: content
target: $SNAP/data-dir/icons
default-provider: gtk-common-themes
apps:
keepassxc:
command: desktop-launch keepassxc
@ -67,6 +73,7 @@ parts:
- libquazip5-1
- libusb-1.0-0
- qtwayland5
- qt5-style-plugins # for mouse cursor theme fix
override-build: |
snapcraftctl build
sed -i 's|Icon=keepassxc|Icon=${SNAP}/usr/share/icons/hicolor/256x256/apps/keepassxc.png|g' $SNAPCRAFT_PART_INSTALL/usr/share/applications/org.keepassxc.KeePassXC.desktop

View File

@ -195,6 +195,7 @@ add_feature_info(SSHAgent WITH_XC_SSHAGENT "SSH agent integration compatible wit
add_feature_info(KeeShare WITH_XC_KEESHARE "Sharing integration with KeeShare")
add_feature_info(KeeShare-Secure WITH_XC_KEESHARE_SECURE "Sharing integration with KeeShare with secure sources")
add_feature_info(YubiKey WITH_XC_YUBIKEY "YubiKey HMAC-SHA1 challenge-response")
add_feature_info(UpdateCheck WITH_XC_UPDATECHECK "Automatic update checking")
if(APPLE)
add_feature_info(TouchID WITH_XC_TOUCHID "TouchID integration")
endif()
@ -293,6 +294,9 @@ if(APPLE)
target_link_libraries(keepassx_core "-framework LocalAuthentication")
endif()
endif()
if(HAIKU)
target_link_libraries(keepassx_core network)
endif()
if(UNIX AND NOT APPLE)
target_link_libraries(keepassx_core Qt5::DBus)
endif()

View File

@ -214,7 +214,7 @@ void AutoType::executeAutoTypeActions(const Entry* entry, QWidget* hideWindow, c
if (hideWindow) {
#if defined(Q_OS_MACOS)
m_plugin->raiseLastActiveWindow();
m_plugin->hideOwnWindow();
#else
hideWindow->showMinimized();
#endif

View File

@ -43,7 +43,7 @@ public:
virtual AutoTypeExecutor* createExecutor() = 0;
#if defined(Q_OS_MACOS)
virtual bool raiseLastActiveWindow() = 0;
virtual bool hideOwnWindow() = 0;
virtual bool raiseOwnWindow() = 0;
#endif

View File

@ -1,5 +1,5 @@
if(WITH_XC_AUTOTYPE)
if(UNIX AND NOT APPLE)
if(UNIX AND NOT APPLE AND NOT HAIKU)
find_package(X11)
find_package(Qt5X11Extras 5.2)
if(PRINT_SUMMARY)

View File

@ -165,9 +165,9 @@ bool AutoTypePlatformMac::raiseWindow(WId pid)
//
// Activate last active window
//
bool AutoTypePlatformMac::raiseLastActiveWindow()
bool AutoTypePlatformMac::hideOwnWindow()
{
return macUtils()->raiseLastActiveWindow();
return macUtils()->hideOwnWindow();
}
//

View File

@ -44,7 +44,7 @@ public:
bool raiseWindow(WId pid) override;
AutoTypeExecutor* createExecutor() override;
bool raiseLastActiveWindow() override;
bool hideOwnWindow() override;
bool raiseOwnWindow() override;
void sendChar(const QChar& ch, bool isKeyDown);

View File

@ -111,7 +111,7 @@ bool AutoTypePlatformTest::raiseWindow(WId window)
}
#if defined(Q_OS_MACOS)
bool AutoTypePlatformTest::raiseLastActiveWindow()
bool AutoTypePlatformTest::hideOwnWindow()
{
return false;
}

View File

@ -44,7 +44,7 @@ public:
AutoTypeExecutor* createExecutor() override;
#if defined(Q_OS_MACOS)
bool raiseLastActiveWindow() override;
bool hideOwnWindow() override;
bool raiseOwnWindow() override;
#endif

View File

@ -47,7 +47,7 @@ BrowserOptionDialog::BrowserOptionDialog(QWidget* parent)
tr("KeePassXC-Browser is needed for the browser integration to work. <br />Download it for %1 and %2. %3")
.arg("<a href=\"https://addons.mozilla.org/en-US/firefox/addon/keepassxc-browser/\">Firefox</a>",
"<a href=\"https://chrome.google.com/webstore/detail/keepassxc-browser/oboonakemofpalcgghocfoadofidjkkk\">"
"Google Chrome / Chromium / Vivaldi</a>",
"Google Chrome / Chromium / Vivaldi / Brave</a>",
snapInstructions));
// clang-format on
@ -75,9 +75,11 @@ BrowserOptionDialog::BrowserOptionDialog(QWidget* parent)
connect(m_ui->customProxyLocationBrowseButton, SIGNAL(clicked()), this, SLOT(showProxyLocationFileDialog()));
#ifdef Q_OS_WIN
// Brave uses Chrome's registry settings
m_ui->braveSupport->setHidden(true);
// Vivaldi uses Chrome's registry settings
m_ui->vivaldiSupport->setHidden(true);
m_ui->chromeSupport->setText("Chrome and Vivaldi");
m_ui->chromeSupport->setText("Chrome, Vivaldi, and Brave");
// Tor Browser uses Firefox's registry settings
m_ui->torBrowserSupport->setHidden(true);
m_ui->firefoxSupport->setText("Firefox and Tor Browser");
@ -122,6 +124,7 @@ void BrowserOptionDialog::loadSettings()
m_ui->chromiumSupport->setChecked(settings->chromiumSupport());
m_ui->firefoxSupport->setChecked(settings->firefoxSupport());
#ifndef Q_OS_WIN
m_ui->braveSupport->setChecked(settings->braveSupport());
m_ui->vivaldiSupport->setChecked(settings->vivaldiSupport());
m_ui->torBrowserSupport->setChecked(settings->torBrowserSupport());
#endif
@ -183,6 +186,7 @@ void BrowserOptionDialog::saveSettings()
settings->setChromiumSupport(m_ui->chromiumSupport->isChecked());
settings->setFirefoxSupport(m_ui->firefoxSupport->isChecked());
#ifndef Q_OS_WIN
settings->setBraveSupport(m_ui->braveSupport->isChecked());
settings->setVivaldiSupport(m_ui->vivaldiSupport->isChecked());
settings->setTorBrowserSupport(m_ui->torBrowserSupport->isChecked());
#endif

View File

@ -150,6 +150,16 @@
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QCheckBox" name="braveSupport">
<property name="text">
<string>&amp;Brave</string>
</property>
<property name="checked">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>

View File

@ -238,6 +238,17 @@ void BrowserSettings::setVivaldiSupport(bool enabled)
HostInstaller::SupportedBrowsers::VIVALDI, enabled, supportBrowserProxy(), customProxyLocation());
}
bool BrowserSettings::braveSupport()
{
return m_hostInstaller.checkIfInstalled(HostInstaller::SupportedBrowsers::BRAVE);
}
void BrowserSettings::setBraveSupport(bool enabled)
{
m_hostInstaller.installBrowser(
HostInstaller::SupportedBrowsers::BRAVE, enabled, supportBrowserProxy(), customProxyLocation());
}
bool BrowserSettings::torBrowserSupport()
{
return m_hostInstaller.checkIfInstalled(HostInstaller::SupportedBrowsers::TOR_BROWSER);

View File

@ -72,6 +72,8 @@ public:
void setFirefoxSupport(bool enabled);
bool vivaldiSupport();
void setVivaldiSupport(bool enabled);
bool braveSupport();
void setBraveSupport(bool enabled);
bool torBrowserSupport();
void setTorBrowserSupport(bool enabled);

View File

@ -39,12 +39,14 @@ HostInstaller::HostInstaller()
, TARGET_DIR_FIREFOX("/Library/Application Support/Mozilla/NativeMessagingHosts")
, TARGET_DIR_VIVALDI("/Library/Application Support/Vivaldi/NativeMessagingHosts")
, TARGET_DIR_TOR_BROWSER("/Library/Application Support/TorBrowser-Data/Browser/Mozilla/NativeMessagingHosts")
, TARGET_DIR_BRAVE("/Library/Application Support/BraveSoftware/Brave-Browser/NativeMessagingHosts")
#elif defined(Q_OS_LINUX)
, TARGET_DIR_CHROME("/.config/google-chrome/NativeMessagingHosts")
, TARGET_DIR_CHROMIUM("/.config/chromium/NativeMessagingHosts")
, TARGET_DIR_FIREFOX("/.mozilla/native-messaging-hosts")
, TARGET_DIR_VIVALDI("/.config/vivaldi/NativeMessagingHosts")
, TARGET_DIR_TOR_BROWSER("/.tor-browser/app/Browser/TorBrowser/Data/Browser/.mozilla/native-messaging-hosts")
, TARGET_DIR_BRAVE("/.config/BraveSoftware/Brave-Browser/NativeMessagingHosts")
#elif defined(Q_OS_WIN)
// clang-format off
, TARGET_DIR_CHROME("HKEY_CURRENT_USER\\Software\\Google\\Chrome\\NativeMessagingHosts\\org.keepassxc.keepassxc_browser")
@ -53,6 +55,7 @@ HostInstaller::HostInstaller()
, TARGET_DIR_FIREFOX("HKEY_CURRENT_USER\\Software\\Mozilla\\NativeMessagingHosts\\org.keepassxc.keepassxc_browser")
, TARGET_DIR_VIVALDI(TARGET_DIR_CHROME)
, TARGET_DIR_TOR_BROWSER(TARGET_DIR_FIREFOX)
, TARGET_DIR_BRAVE(TARGET_DIR_CHROME)
#endif
{
}
@ -140,7 +143,8 @@ void HostInstaller::installBrowser(SupportedBrowsers browser,
*/
void HostInstaller::updateBinaryPaths(const bool& proxy, const QString& location)
{
for (int i = 0; i < 4; ++i) {
// Where 6 is the number of entries in the SupportedBrowsers enum declared in HostInstaller.h
for (int i = 0; i < 6; ++i) {
if (checkIfInstalled(static_cast<SupportedBrowsers>(i))) {
installBrowser(static_cast<SupportedBrowsers>(i), true, proxy, location);
}
@ -166,6 +170,8 @@ QString HostInstaller::getTargetPath(SupportedBrowsers browser) const
return TARGET_DIR_VIVALDI;
case SupportedBrowsers::TOR_BROWSER:
return TARGET_DIR_TOR_BROWSER;
case SupportedBrowsers::BRAVE:
return TARGET_DIR_BRAVE;
default:
return QString();
}
@ -188,9 +194,11 @@ QString HostInstaller::getBrowserName(SupportedBrowsers browser) const
case SupportedBrowsers::FIREFOX:
return "firefox";
case SupportedBrowsers::VIVALDI:
return "vivaldi";
return "vivaldi";
case SupportedBrowsers::TOR_BROWSER:
return "tor-browser";
case SupportedBrowsers::BRAVE:
return "brave";
default:
return QString();
}

View File

@ -34,7 +34,8 @@ public:
CHROMIUM = 1,
FIREFOX = 2,
VIVALDI = 3,
TOR_BROWSER = 4
TOR_BROWSER = 4,
BRAVE = 5
};
public:
@ -66,6 +67,7 @@ private:
const QString TARGET_DIR_FIREFOX;
const QString TARGET_DIR_VIVALDI;
const QString TARGET_DIR_TOR_BROWSER;
const QString TARGET_DIR_BRAVE;
};
#endif // HOSTINSTALLER_H

View File

@ -50,6 +50,7 @@ int Add::execute(const QStringList& arguments)
parser.addPositionalArgument("database", QObject::tr("Path of the database."));
parser.addOption(Command::QuietOption);
parser.addOption(Command::KeyFileOption);
parser.addOption(Command::NoPasswordOption);
QCommandLineOption username(QStringList() << "u"
<< "username",
@ -91,6 +92,7 @@ int Add::execute(const QStringList& arguments)
const QString& entryPath = args.at(1);
auto db = Utils::unlockDatabase(databasePath,
!parser.isSet(Command::NoPasswordOption),
parser.value(Command::KeyFileOption),
parser.isSet(Command::QuietOption) ? Utils::DEVNULL : Utils::STDOUT,
Utils::STDERR);

View File

@ -94,5 +94,4 @@ endif()
if(APPLE OR UNIX)
install(FILES keepassxc-cli.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1/)
execute_process(COMMAND mandb -q)
endif()

View File

@ -49,6 +49,7 @@ int Clip::execute(const QStringList& arguments)
parser.addPositionalArgument("database", QObject::tr("Path of the database."));
parser.addOption(Command::QuietOption);
parser.addOption(Command::KeyFileOption);
parser.addOption(Command::NoPasswordOption);
QCommandLineOption totp(QStringList() << "t"
<< "totp",
@ -67,6 +68,7 @@ int Clip::execute(const QStringList& arguments)
}
auto db = Utils::unlockDatabase(args.at(0),
!parser.isSet(Command::NoPasswordOption),
parser.value(Command::KeyFileOption),
parser.isSet(Command::QuietOption) ? Utils::DEVNULL : Utils::STDOUT,
Utils::STDERR);

View File

@ -46,6 +46,10 @@ const QCommandLineOption Command::KeyFileOption = QCommandLineOption(QStringList
QObject::tr("Key file of the database."),
QObject::tr("path"));
const QCommandLineOption Command::NoPasswordOption =
QCommandLineOption(QStringList() << "no-password",
QObject::tr("Deactivate password key for the database."));
QMap<QString, Command*> commands;
Command::~Command()

View File

@ -40,6 +40,7 @@ public:
static const QCommandLineOption QuietOption;
static const QCommandLineOption KeyFileOption;
static const QCommandLineOption NoPasswordOption;
};
#endif // KEEPASSXC_COMMAND_H

View File

@ -49,6 +49,7 @@ int Edit::execute(const QStringList& arguments)
parser.addPositionalArgument("database", QObject::tr("Path of the database."));
parser.addOption(Command::QuietOption);
parser.addOption(Command::KeyFileOption);
parser.addOption(Command::NoPasswordOption);
QCommandLineOption username(QStringList() << "u"
<< "username",
@ -95,6 +96,7 @@ int Edit::execute(const QStringList& arguments)
const QString& entryPath = args.at(1);
auto db = Utils::unlockDatabase(databasePath,
!parser.isSet(Command::NoPasswordOption),
parser.value(Command::KeyFileOption),
parser.isSet(Command::QuietOption) ? Utils::DEVNULL : Utils::STDOUT,
Utils::STDERR);

View File

@ -51,6 +51,7 @@ int Extract::execute(const QStringList& arguments)
parser.addPositionalArgument("database", QObject::tr("Path of the database to extract."));
parser.addOption(Command::QuietOption);
parser.addOption(Command::KeyFileOption);
parser.addOption(Command::NoPasswordOption);
parser.addHelpOption();
parser.process(arguments);
@ -59,17 +60,19 @@ int Extract::execute(const QStringList& arguments)
errorTextStream << parser.helpText().replace("keepassxc-cli", "keepassxc-cli extract");
return EXIT_FAILURE;
}
if (!parser.isSet(Command::QuietOption)) {
outputTextStream << QObject::tr("Insert password to unlock %1: ").arg(args.at(0)) << flush;
}
auto compositeKey = QSharedPointer<CompositeKey>::create();
QString line = Utils::getPassword(parser.isSet(Command::QuietOption) ? Utils::DEVNULL : Utils::STDOUT);
auto passwordKey = QSharedPointer<PasswordKey>::create();
passwordKey->setPassword(line);
compositeKey->addKey(passwordKey);
if (!parser.isSet(Command::NoPasswordOption)) {
if (!parser.isSet(Command::QuietOption)) {
outputTextStream << QObject::tr("Insert password to unlock %1: ").arg(args.at(0)) << flush;
}
QString line = Utils::getPassword(parser.isSet(Command::QuietOption) ? Utils::DEVNULL : Utils::STDOUT);
auto passwordKey = QSharedPointer<PasswordKey>::create();
passwordKey->setPassword(line);
compositeKey->addKey(passwordKey);
}
QString keyFilePath = parser.value(Command::KeyFileOption);
if (!keyFilePath.isEmpty()) {

View File

@ -48,6 +48,7 @@ int List::execute(const QStringList& arguments)
parser.addPositionalArgument("group", QObject::tr("Path of the group to list. Default is /"), "[group]");
parser.addOption(Command::QuietOption);
parser.addOption(Command::KeyFileOption);
parser.addOption(Command::NoPasswordOption);
QCommandLineOption recursiveOption(QStringList() << "R"
<< "recursive",
@ -65,6 +66,7 @@ int List::execute(const QStringList& arguments)
bool recursive = parser.isSet(recursiveOption);
auto db = Utils::unlockDatabase(args.at(0),
!parser.isSet(Command::NoPasswordOption),
parser.value(Command::KeyFileOption),
parser.isSet(Command::QuietOption) ? Utils::DEVNULL : Utils::STDOUT,
Utils::STDERR);

View File

@ -50,6 +50,7 @@ int Locate::execute(const QStringList& arguments)
parser.addPositionalArgument("term", QObject::tr("Search term."));
parser.addOption(Command::QuietOption);
parser.addOption(Command::KeyFileOption);
parser.addOption(Command::NoPasswordOption);
parser.addHelpOption();
parser.process(arguments);
@ -60,6 +61,7 @@ int Locate::execute(const QStringList& arguments)
}
auto db = Utils::unlockDatabase(args.at(0),
!parser.isSet(Command::NoPasswordOption),
parser.value(Command::KeyFileOption),
parser.isSet(Command::QuietOption) ? Utils::DEVNULL : Utils::STDOUT,
Utils::STDERR);

View File

@ -52,6 +52,7 @@ int Merge::execute(const QStringList& arguments)
QObject::tr("Use the same credentials for both database files."));
parser.addOption(samePasswordOption);
parser.addOption(Command::KeyFileOption);
parser.addOption(Command::NoPasswordOption);
QCommandLineOption keyFileFromOption(QStringList() << "f"
<< "key-file-from",
@ -59,6 +60,10 @@ int Merge::execute(const QStringList& arguments)
QObject::tr("path"));
parser.addOption(keyFileFromOption);
QCommandLineOption noPasswordFromOption(QStringList() << "no-password-from",
QObject::tr("Deactivate password key for the database to merge from."));
parser.addOption(noPasswordFromOption);
parser.addHelpOption();
parser.process(arguments);
@ -69,6 +74,7 @@ int Merge::execute(const QStringList& arguments)
}
auto db1 = Utils::unlockDatabase(args.at(0),
!parser.isSet(Command::NoPasswordOption),
parser.value(Command::KeyFileOption),
parser.isSet(Command::QuietOption) ? Utils::DEVNULL : Utils::STDOUT,
Utils::STDERR);
@ -79,6 +85,7 @@ int Merge::execute(const QStringList& arguments)
QSharedPointer<Database> db2;
if (!parser.isSet("same-credentials")) {
db2 = Utils::unlockDatabase(args.at(1),
!parser.isSet(noPasswordFromOption),
parser.value(keyFileFromOption),
parser.isSet(Command::QuietOption) ? Utils::DEVNULL : Utils::STDOUT,
Utils::STDERR);

View File

@ -51,6 +51,7 @@ int Remove::execute(const QStringList& arguments)
parser.addPositionalArgument("database", QObject::tr("Path of the database."));
parser.addOption(Command::QuietOption);
parser.addOption(Command::KeyFileOption);
parser.addOption(Command::NoPasswordOption);
parser.addPositionalArgument("entry", QObject::tr("Path of the entry to remove."));
parser.addHelpOption();
parser.process(arguments);
@ -62,6 +63,7 @@ int Remove::execute(const QStringList& arguments)
}
auto db = Utils::unlockDatabase(args.at(0),
!parser.isSet(Command::NoPasswordOption),
parser.value(Command::KeyFileOption),
parser.isSet(Command::QuietOption) ? Utils::DEVNULL : Utils::STDOUT,
Utils::STDERR);

View File

@ -48,6 +48,8 @@ int Show::execute(const QStringList& arguments)
parser.addPositionalArgument("database", QObject::tr("Path of the database."));
parser.addOption(Command::QuietOption);
parser.addOption(Command::KeyFileOption);
parser.addOption(Command::NoPasswordOption);
QCommandLineOption totp(QStringList() << "t"
<< "totp",
QObject::tr("Show the entry's current TOTP."));
@ -72,6 +74,7 @@ int Show::execute(const QStringList& arguments)
}
auto db = Utils::unlockDatabase(args.at(0),
!parser.isSet(Command::NoPasswordOption),
parser.value(Command::KeyFileOption),
parser.isSet(Command::QuietOption) ? Utils::DEVNULL : Utils::STDOUT,
Utils::STDERR);

View File

@ -98,6 +98,7 @@ namespace Utils
} // namespace Test
QSharedPointer<Database> unlockDatabase(const QString& databaseFilename,
const bool isPasswordProtected,
const QString& keyFilename,
FILE* outputDescriptor,
FILE* errorDescriptor)
@ -106,12 +107,13 @@ namespace Utils
TextStream out(outputDescriptor);
TextStream err(errorDescriptor);
out << QObject::tr("Insert password to unlock %1: ").arg(databaseFilename) << flush;
QString line = Utils::getPassword(outputDescriptor);
auto passwordKey = QSharedPointer<PasswordKey>::create();
passwordKey->setPassword(line);
compositeKey->addKey(passwordKey);
if (isPasswordProtected) {
out << QObject::tr("Insert password to unlock %1: ").arg(databaseFilename) << flush;
QString line = Utils::getPassword(outputDescriptor);
auto passwordKey = QSharedPointer<PasswordKey>::create();
passwordKey->setPassword(line);
compositeKey->addKey(passwordKey);
}
if (!keyFilename.isEmpty()) {
auto fileKey = QSharedPointer<FileKey>::create();

View File

@ -36,6 +36,7 @@ namespace Utils
QString getPassword(FILE* outputDescriptor = STDOUT);
int clipText(const QString& text);
QSharedPointer<Database> unlockDatabase(const QString& databaseFilename,
const bool isPasswordProtected = true,
const QString& keyFilename = {},
FILE* outputDescriptor = STDOUT,
FILE* errorDescriptor = STDERR);

View File

@ -56,9 +56,15 @@ Shows the title, username, password, URL and notes of a database entry. Can also
.SS "General options"
.IP "--debug-info"
Displays debugging information.
.IP "-k, --key-file <path>"
Specifies a path to a key file for unlocking the database. In a merge operation this option is used to specify the key file path for the first database.
.IP "--no-password"
Deactivate password key for the database.
.IP "-q, --quiet <path>"
Silence password prompt and other secondary outputs.
@ -66,7 +72,7 @@ Silence password prompt and other secondary outputs.
Displays help information.
.IP "-v, --version"
Shows the program version.
Displays the program version.
.SS "Merge options"
@ -74,6 +80,9 @@ Shows the program version.
.IP "-f, --key-file-from <path>"
Path of the key file for the second database.
.IP "--no-password-from"
Deactivate password key for the database to merge from.
.IP "-s, --same-credentials"
Use the same credentials for unlocking both database.

View File

@ -26,6 +26,7 @@
#include "config-keepassx.h"
#include "core/Bootstrap.h"
#include "core/Tools.h"
#include "crypto/Crypto.h"
#if defined(WITH_ASAN) && defined(WITH_LSAN)
@ -60,6 +61,9 @@ int main(int argc, char** argv)
parser.addPositionalArgument("command", QObject::tr("Name of the command to execute."));
QCommandLineOption debugInfoOption(QStringList() << "debug-info",
QObject::tr("Displays debugging information."));
parser.addOption(debugInfoOption);
parser.addHelpOption();
parser.addVersionOption();
// TODO : use the setOptionsAfterPositionalArgumentsMode (Qt 5.6) function
@ -72,6 +76,10 @@ int main(int argc, char** argv)
// Switch to parser.showVersion() when available (QT 5.4).
out << KEEPASSXC_VERSION << endl;
return EXIT_SUCCESS;
} else if (parser.isSet(debugInfoOption)) {
QString debugInfo = Tools::debugInfo().append("\n").append(Crypto::debugInfo());
out << debugInfo << endl;
return EXIT_SUCCESS;
}
parser.showHelp();
}

View File

@ -20,6 +20,7 @@
#cmakedefine WITH_XC_KEESHARE
#cmakedefine WITH_XC_KEESHARE_INSECURE
#cmakedefine WITH_XC_KEESHARE_SECURE
#cmakedefine WITH_XC_UPDATECHECK
#cmakedefine WITH_XC_TOUCHID
#cmakedefine KEEPASSXC_BUILD_TYPE "@KEEPASSXC_BUILD_TYPE@"

View File

@ -112,6 +112,10 @@ namespace Bootstrap
mainWindow.openDatabase(filename);
}
}
auto lastActiveFile = config()->get("LastActiveDatabase").toString();
if (!lastActiveFile.isEmpty()) {
mainWindow.openDatabase(lastActiveFile);
}
}
}

View File

@ -30,6 +30,7 @@ QDateTime Clock::currentDateTime()
uint Clock::currentSecondsSinceEpoch()
{
// TODO: change to toSecsSinceEpoch() when min Qt >= 5.8
return instance().currentDateTimeImpl().toTime_t();
}

View File

@ -222,6 +222,7 @@ bool Database::save(const QString& filePath, QString* error, bool atomic, bool b
return true;
}
}
if (error) {
*error = saveFile.errorString();
}
@ -241,27 +242,34 @@ bool Database::save(const QString& filePath, QString* error, bool atomic, bool b
// Delete the original db and move the temp file in place
QFile::remove(filePath);
#ifdef Q_OS_LINUX
// workaround to make this workaround work, see: https://bugreports.qt.io/browse/QTBUG-64008
if (tempFile.copy(filePath)) {
// successfully saved database file
return true;
}
#else
if (tempFile.rename(filePath)) {
// successfully saved database file
// Note: call into the QFile rename instead of QTemporaryFile
// due to an undocumented difference in how the function handles
// errors. This prevents errors when saving across file systems.
if (tempFile.QFile::rename(filePath)) {
// successfully saved the database
tempFile.setAutoRemove(false);
setFilePath(filePath);
return true;
} else if (!backup || !restoreDatabase(filePath)) {
// Failed to copy new database in place, and
// failed to restore from backup or backups disabled
tempFile.setAutoRemove(false);
if (error) {
*error = tr("%1\nBackup database located at %2").arg(tempFile.errorString(), tempFile.fileName());
}
markAsModified();
return false;
}
#endif
}
if (error) {
*error = tempFile.errorString();
}
}
// Saving failed
markAsModified();
return false;
}
@ -320,6 +328,28 @@ bool Database::backupDatabase(const QString& filePath)
return QFile::copy(filePath, backupFilePath);
}
/**
* Restores the database file from the backup file with
* name <filename>.old.<extension> to filePath. This will
* overwrite the existing file!
*
* @param filePath Path to the file to restore
* @return true on success
*/
bool Database::restoreDatabase(const QString& filePath)
{
static auto re = QRegularExpression("^(.*?)(\\.[^.]+)?$");
auto match = re.match(filePath);
auto backupFilePath = match.captured(1) + ".old" + match.captured(2);
// Only try to restore if the backup file actually exists
if (QFile::exists(backupFilePath)) {
QFile::remove(filePath);
return QFile::copy(backupFilePath, filePath);
}
return false;
}
bool Database::isReadOnly() const
{
return m_data.isReadOnly;
@ -388,11 +418,31 @@ const Metadata* Database::metadata() const
return m_metadata;
}
/**
* Returns the original file path that was provided for
* this database. This path may not exist, may contain
* unresolved symlinks, or have malformed slashes.
*
* @return original file path
*/
QString Database::filePath() const
{
return m_data.filePath;
}
/**
* Returns the canonical file path of this databases'
* set file path. This returns an empty string if the
* file does not exist or cannot be resolved.
*
* @return canonical file path
*/
QString Database::canonicalFilePath() const
{
QFileInfo fileInfo(m_data.filePath);
return fileInfo.canonicalFilePath();
}
void Database::setFilePath(const QString& filePath)
{
if (filePath == m_data.filePath) {

View File

@ -82,6 +82,7 @@ public:
QUuid uuid() const;
QString filePath() const;
QString canonicalFilePath() const;
void setFilePath(const QString& filePath);
Metadata* metadata();
@ -171,6 +172,7 @@ private:
bool writeDatabase(QIODevice* device, QString* error = nullptr);
bool backupDatabase(const QString& filePath);
bool restoreDatabase(const QString& filePath);
Metadata* const m_metadata;
DatabaseData m_data;

View File

@ -120,9 +120,9 @@ BulkFileWatcher::BulkFileWatcher(QObject* parent)
{
connect(&m_fileWatcher, SIGNAL(fileChanged(QString)), SLOT(handleFileChanged(QString)));
connect(&m_fileWatcher, SIGNAL(directoryChanged(QString)), SLOT(handleDirectoryChanged(QString)));
connect(&m_fileWatchUnblockTimer, SIGNAL(timeout()), this, SLOT(observeFileChanges()));
connect(&m_watchedFilesIgnoreTimer, SIGNAL(timeout()), this, SLOT(observeFileChanges()));
connect(&m_pendingSignalsTimer, SIGNAL(timeout()), this, SLOT(emitSignals()));
m_fileWatchUnblockTimer.setSingleShot(true);
m_watchedFilesIgnoreTimer.setSingleShot(true);
m_pendingSignalsTimer.setSingleShot(true);
}
@ -135,7 +135,7 @@ void BulkFileWatcher::clear()
}
m_watchedPaths.clear();
m_watchedFilesInDirectory.clear();
m_ignoreFilesChangess.clear();
m_watchedFilesIgnored.clear();
}
void BulkFileWatcher::removePath(const QString& path)
@ -166,7 +166,7 @@ void BulkFileWatcher::addPath(const QString& path)
const bool directorySuccess = m_fileWatcher.addPath(directoryPath);
m_watchedPaths[directoryPath] = directorySuccess;
}
m_watchedFilesInDirectory[directoryPath][filePath] = info.exists();
m_watchedFilesInDirectory[directoryPath][filePath] = info.exists() ? info.lastModified().toMSecsSinceEpoch() : 0;
}
void BulkFileWatcher::handleFileChanged(const QString& path)
@ -174,13 +174,15 @@ void BulkFileWatcher::handleFileChanged(const QString& path)
const QFileInfo info(path);
const QString filePath = info.absoluteFilePath();
const QString directoryPath = info.absolutePath();
const QMap<QString, bool>& watchedFiles = m_watchedFilesInDirectory[directoryPath];
const bool created = !watchedFiles[filePath] && info.exists();
const bool deleted = watchedFiles[filePath] && !info.exists();
const bool changed = !created && !deleted;
const QMap<QString, qint64>& watchedFiles = m_watchedFilesInDirectory[directoryPath];
const qint64 lastModificationTime = info.lastModified().toMSecsSinceEpoch();
const bool created = watchedFiles[filePath] == 0 && info.exists();
const bool deleted = watchedFiles[filePath] != 0 && !info.exists();
const bool changed = !created && !deleted && lastModificationTime != watchedFiles[filePath];
addPath(path);
if (m_ignoreFilesChangess[info.canonicalFilePath()] > Clock::currentDateTimeUtc()) {
if (m_watchedFilesIgnored[info.canonicalFilePath()] > Clock::currentDateTimeUtc()) {
// changes are blocked
return;
}
@ -203,35 +205,36 @@ void BulkFileWatcher::handleDirectoryChanged(const QString& path)
qDebug("Directory changed %s", qPrintable(path));
const QFileInfo directoryInfo(path);
const QString directoryPath = directoryInfo.absoluteFilePath();
QMap<QString, bool>& watchedFiles = m_watchedFilesInDirectory[directoryPath];
QMap<QString, qint64>& watchedFiles = m_watchedFilesInDirectory[directoryPath];
for (const QString& filename : watchedFiles.keys()) {
const QFileInfo fileInfo(filename);
const QString filePath = fileInfo.absoluteFilePath();
const bool existed = watchedFiles[filePath];
if (!fileInfo.exists() && existed) {
qDebug("Remove watch file %s", qPrintable(filePath));
const qint64 previousModificationTime = watchedFiles[filePath];
const qint64 lastModificationTime = fileInfo.lastModified().toMSecsSinceEpoch();
if (!fileInfo.exists() && previousModificationTime != 0) {
qDebug("Remove watch file %s", qPrintable(fileInfo.absoluteFilePath()));
m_fileWatcher.removePath(filePath);
m_watchedPaths.remove(filePath);
watchedFiles.remove(filePath);
scheduleSignal(Removed, filePath);
}
if (!existed && fileInfo.exists()) {
qDebug("Add watch file %s", qPrintable(filePath));
if (previousModificationTime == 0 && fileInfo.exists()) {
qDebug("Add watch file %s", qPrintable(fileInfo.absoluteFilePath()));
if (!m_watchedPaths.value(filePath)) {
const bool success = m_fileWatcher.addPath(filePath);
m_watchedPaths[filePath] = success;
watchedFiles[filePath] = fileInfo.exists();
watchedFiles[filePath] = lastModificationTime;
}
scheduleSignal(Created, filePath);
}
if (existed && fileInfo.exists()) {
if (fileInfo.exists() && previousModificationTime != lastModificationTime) {
// this case is handled using
qDebug("Refresh watch file %s", qPrintable(fileInfo.absoluteFilePath()));
m_fileWatcher.removePath(fileInfo.absolutePath());
m_fileWatcher.addPath(fileInfo.absolutePath());
scheduleSignal(Updated, filePath);
}
m_watchedFilesInDirectory[directoryPath][filePath] = fileInfo.exists();
m_watchedFilesInDirectory[directoryPath][filePath] = fileInfo.exists() ? lastModificationTime : 0;
}
}
@ -242,13 +245,16 @@ void BulkFileWatcher::emitSignals()
for (const auto& path : queued.keys()) {
const auto& signal = queued[path];
if (signal.last() == Removed) {
qDebug("Emit %s removed", qPrintable(path));
emit fileRemoved(path);
continue;
}
if (signal.first() == Created) {
qDebug("Emit %s created", qPrintable(path));
emit fileCreated(path);
continue;
}
qDebug("Emit %s changed", qPrintable(path));
emit fileChanged(path);
}
}
@ -268,7 +274,7 @@ void BulkFileWatcher::scheduleSignal(Signal signal, const QString& path)
void BulkFileWatcher::ignoreFileChanges(const QString& path)
{
const QFileInfo info(path);
m_ignoreFilesChangess[info.canonicalFilePath()] = Clock::currentDateTimeUtc().addMSecs(FileChangeDelay);
m_watchedFilesIgnored[info.canonicalFilePath()] = Clock::currentDateTimeUtc().addMSecs(FileChangeDelay);
}
void BulkFileWatcher::observeFileChanges(bool delayed)
@ -278,19 +284,19 @@ void BulkFileWatcher::observeFileChanges(bool delayed)
timeout = TimerResolution;
} else {
const QDateTime current = Clock::currentDateTimeUtc();
for (const QString& key : m_ignoreFilesChangess.keys()) {
if (m_ignoreFilesChangess[key] < current) {
for (const QString& key : m_watchedFilesIgnored.keys()) {
if (m_watchedFilesIgnored[key] < current) {
// We assume that there was no concurrent change of the database
// during our block - so no need to reimport
qDebug("Remove block from %s", qPrintable(key));
m_ignoreFilesChangess.remove(key);
m_watchedFilesIgnored.remove(key);
continue;
}
qDebug("Keep block from %s", qPrintable(key));
timeout = static_cast<int>(current.msecsTo(m_ignoreFilesChangess[key]));
timeout = qMin(timeout, static_cast<int>(current.msecsTo(m_watchedFilesIgnored[key])));
}
}
if (timeout > 0 && !m_fileWatchUnblockTimer.isActive()) {
m_fileWatchUnblockTimer.start(timeout);
if (timeout > 0 && !m_watchedFilesIgnoreTimer.isActive()) {
m_watchedFilesIgnoreTimer.start(timeout);
}
}

View File

@ -93,11 +93,11 @@ private:
private:
QMap<QString, bool> m_watchedPaths;
QMap<QString, QDateTime> m_ignoreFilesChangess;
QMap<QString, QDateTime> m_watchedFilesIgnored;
QFileSystemWatcher m_fileWatcher;
QMap<QString, QMap<QString, bool>> m_watchedFilesInDirectory;
QMap<QString, QMap<QString, qint64>> m_watchedFilesInDirectory;
// needed for Import/Export-References to prevent update after self-write
QTimer m_fileWatchUnblockTimer;
QTimer m_watchedFilesIgnoreTimer;
// needed to tolerate multiple signals for same event
QTimer m_pendingSignalsTimer;
QMap<QString, QList<Signal>> m_pendingSignals;

View File

@ -618,8 +618,8 @@ Merger::ChangeList Merger::mergeMetadata(const MergeContext& context)
const auto keys = sourceMetadata->customIcons().keys();
for (QUuid customIconId : keys) {
QImage customIcon = sourceMetadata->customIcon(customIconId);
if (!targetMetadata->containsCustomIcon(customIconId)) {
QImage customIcon = sourceMetadata->customIcon(customIconId);
targetMetadata->addCustomIcon(customIconId, customIcon);
changes << tr("Adding missing icon %1").arg(QString::fromLatin1(customIconId.toRfc4122().toHex()));
}

View File

@ -382,10 +382,12 @@ void Metadata::addCustomIcon(const QUuid& uuid, const QImage& icon)
Q_ASSERT(!uuid.isNull());
Q_ASSERT(!m_customIcons.contains(uuid));
m_customIcons.insert(uuid, icon);
m_customIcons[uuid] = icon;
// reset cache in case there is also an icon with that uuid
m_customIconCacheKeys[uuid] = QPixmapCache::Key();
m_customIconScaledCacheKeys[uuid] = QPixmapCache::Key();
// remove all uuids to prevent duplicates in release mode
m_customIconsOrder.removeAll(uuid);
m_customIconsOrder.append(uuid);
// Associate image hash to uuid
QByteArray hash = hashImage(icon);

View File

@ -18,6 +18,8 @@
*/
#include "Tools.h"
#include "config-keepassx.h"
#include "core/Config.h"
#include "core/Translator.h"
@ -28,8 +30,10 @@
#include <QLocale>
#include <QRegularExpression>
#include <QStringList>
#include <QSysInfo>
#include <QUuid>
#include <cctype>
#include "git-info.h"
#ifdef Q_OS_WIN
#include <windows.h> // for Sleep()
@ -41,6 +45,78 @@
namespace Tools
{
QString debugInfo()
{
QString debugInfo = "KeePassXC - ";
debugInfo.append(QObject::tr("Version %1").arg(KEEPASSXC_VERSION).append("\n"));
#ifndef KEEPASSXC_BUILD_TYPE_RELEASE
debugInfo.append(QObject::tr("Build Type: %1").arg(KEEPASSXC_BUILD_TYPE).append("\n"));
#endif
QString commitHash;
if (!QString(GIT_HEAD).isEmpty()) {
commitHash = GIT_HEAD;
}
if (!commitHash.isEmpty()) {
debugInfo.append(QObject::tr("Revision: %1").arg(commitHash.left(7)).append("\n"));
}
#ifdef KEEPASSXC_DIST
debugInfo.append(QObject::tr("Distribution: %1").arg(KEEPASSXC_DIST_TYPE).append("\n"));
#endif
// Qt related debugging information.
debugInfo.append("\n");
debugInfo.append("Qt ").append(QString::fromLocal8Bit(qVersion())).append("\n");
#ifdef QT_NO_DEBUG
debugInfo.append(QObject::tr("Debugging mode is disabled.").append("\n"));
#else
debugInfo.append(QObject::tr("Debugging mode is enabled.").append("\n"));
#endif
debugInfo.append("\n");
#if QT_VERSION >= QT_VERSION_CHECK(5, 4, 0)
debugInfo.append(QObject::tr("Operating system: %1\nCPU architecture: %2\nKernel: %3 %4")
.arg(QSysInfo::prettyProductName(),
QSysInfo::currentCpuArchitecture(),
QSysInfo::kernelType(),
QSysInfo::kernelVersion()));
debugInfo.append("\n\n");
#endif
QString extensions;
#ifdef WITH_XC_AUTOTYPE
extensions += "\n- " + QObject::tr("Auto-Type");
#endif
#ifdef WITH_XC_BROWSER
extensions += "\n- " + QObject::tr("Browser Integration");
#endif
#ifdef WITH_XC_SSHAGENT
extensions += "\n- " + QObject::tr("SSH Agent");
#endif
#if defined(WITH_XC_KEESHARE_SECURE) && defined(WITH_XC_KEESHARE_INSECURE)
extensions += "\n- " + QObject::tr("KeeShare (signed and unsigned sharing)");
#elif defined(WITH_XC_KEESHARE_SECURE)
extensions += "\n- " + QObject::tr("KeeShare (only signed sharing)");
#elif defined(WITH_XC_KEESHARE_INSECURE)
extensions += "\n- " + QObject::tr("KeeShare (only unsigned sharing)");
#endif
#ifdef WITH_XC_YUBIKEY
extensions += "\n- " + QObject::tr("YubiKey");
#endif
#ifdef WITH_XC_TOUCHID
extensions += "\n- " + QObject::tr("TouchID");
#endif
if (extensions.isEmpty())
extensions = " " + QObject::tr("None");
debugInfo.append(QObject::tr("Enabled extensions:").append(extensions).append("\n"));
return debugInfo;
}
QString humanReadableFileSize(qint64 bytes, quint32 precision)
{
constexpr auto kibibyte = 1024;
@ -129,7 +205,7 @@ namespace Tools
bool isBase64(const QByteArray& ba)
{
constexpr auto pattern = R"(^(?:[a-z0-9+]{4})*(?:[a-z0-9+]{3}=|[a-z0-9+]{2}==)?$)";
constexpr auto pattern = R"(^(?:[a-z0-9+/]{4})*(?:[a-z0-9+/]{3}=|[a-z0-9+/]{2}==)?$)";
QRegExp regexp(pattern, Qt::CaseInsensitive, QRegExp::RegExp2);
QString base64 = QString::fromLatin1(ba.constData(), ba.size());

View File

@ -32,6 +32,7 @@ class QRegularExpression;
namespace Tools
{
QString debugInfo();
QString humanReadableFileSize(qint64 bytes, quint32 precision = 2);
bool readFromDevice(QIODevice* device, QByteArray& data, int size = 16384);
bool readAllFromDevice(QIODevice* device, QByteArray& data);

View File

@ -25,7 +25,7 @@
#include "crypto/CryptoHash.h"
#include "crypto/SymmetricCipher.h"
bool Crypto::m_initalized(false);
bool Crypto::m_initialized(false);
QString Crypto::m_errorStr;
QString Crypto::m_backendVersion;
@ -35,8 +35,8 @@ Crypto::Crypto()
bool Crypto::init()
{
if (m_initalized) {
qWarning("Crypto::init: already initalized");
if (m_initialized) {
qWarning("Crypto::init: already initialized");
return true;
}
@ -48,19 +48,19 @@ bool Crypto::init()
}
// has to be set before testing Crypto classes
m_initalized = true;
m_initialized = true;
if (!backendSelfTest() || !selfTest()) {
m_initalized = false;
m_initialized = false;
return false;
}
return true;
}
bool Crypto::initalized()
bool Crypto::initialized()
{
return m_initalized;
return m_initialized;
}
QString Crypto::errorString()
@ -68,9 +68,13 @@ QString Crypto::errorString()
return m_errorStr;
}
QString Crypto::backendVersion()
QString Crypto::debugInfo()
{
return QString("libgcrypt ").append(m_backendVersion);
Q_ASSERT(Crypto::initialized());
QString debugInfo = QObject::tr("Cryptographic libraries:").append("\n");
debugInfo.append(" libgcrypt ").append(m_backendVersion).append("\n");
return debugInfo;
}
bool Crypto::backendSelfTest()

View File

@ -24,10 +24,10 @@ class Crypto
{
public:
static bool init();
static bool initalized();
static bool initialized();
static bool backendSelfTest();
static QString errorString();
static QString backendVersion();
static QString debugInfo();
private:
Crypto();
@ -42,7 +42,7 @@ private:
static bool testSalsa20();
static bool testChaCha20();
static bool m_initalized;
static bool m_initialized;
static QString m_errorStr;
static QString m_backendVersion;
};

View File

@ -33,7 +33,7 @@ CryptoHash::CryptoHash(Algorithm algo, bool hmac)
{
Q_D(CryptoHash);
Q_ASSERT(Crypto::initalized());
Q_ASSERT(Crypto::initialized());
int algoGcrypt = -1;
unsigned int flagsGcrypt = GCRY_MD_FLAG_SECURE;

View File

@ -93,7 +93,7 @@ Random::Random(RandomBackend* backend)
void RandomBackendGcrypt::randomize(void* data, int len)
{
Q_ASSERT(Crypto::initalized());
Q_ASSERT(Crypto::initialized());
gcry_randomize(data, len, GCRY_STRONG_RANDOM);
}

View File

@ -90,7 +90,7 @@ void SymmetricCipherGcrypt::setError(const gcry_error_t& err)
bool SymmetricCipherGcrypt::init()
{
Q_ASSERT(Crypto::initalized());
Q_ASSERT(Crypto::initialized());
gcry_error_t error;

View File

@ -8,7 +8,7 @@
#endif
#include <sys/types.h>
#ifdef _WIN32
#if defined(_WIN32) || defined(__HAIKU__)
#include <stdint.h>
typedef uint32_t u_int32_t;

View File

@ -78,7 +78,8 @@ bool Kdbx3Reader::readDatabaseImpl(QIODevice* device,
QByteArray realStart = cipherStream.read(32);
if (realStart != m_streamStartBytes) {
raiseError(tr("Wrong key or database file is corrupt."));
raiseError(tr("Invalid credentials were provided, please try again.\n"
"If this reoccurs, then your database file may be corrupt."));
return false;
}

View File

@ -71,7 +71,8 @@ bool Kdbx4Reader::readDatabaseImpl(QIODevice* device,
// clang-format off
QByteArray hmacKey = KeePass2::hmacKey(m_masterSeed, db->transformedMasterKey());
if (headerHmac != CryptoHash::hmac(headerData, HmacBlockStream::getHmacKey(UINT64_MAX, hmacKey), CryptoHash::Sha256)) {
raiseError(tr("Wrong key or database file is corrupt. (HMAC mismatch)"));
raiseError(tr("Invalid credentials were provided, please try again.\n"
"If this reoccurs, then your database file may be corrupt.") + " " + tr("(HMAC mismatch)"));
return false;
}
HmacBlockStream hmacStream(device, hmacKey);

View File

@ -1028,10 +1028,8 @@ bool KdbxXmlReader::readBool()
QDateTime KdbxXmlReader::readDateTime()
{
static QRegularExpression b64regex("^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$");
QString str = readString();
if (b64regex.match(str).hasMatch()) {
if (Tools::isBase64(str.toLatin1())) {
QByteArray secsBytes = QByteArray::fromBase64(str.toUtf8()).leftJustified(8, '\0', true).left(8);
qint64 secs = Endian::bytesToSizedInt<quint64>(secsBytes, KeePass2::BYTEORDER);
return QDateTime(QDate(1, 1, 1), QTime(0, 0, 0, 0), Qt::UTC).addSecs(secs);

View File

@ -372,7 +372,8 @@ KeePass1Reader::testKeys(const QString& password, const QByteArray& keyfileData,
}
if (!cipherStream) {
raiseError(tr("Wrong key or database file is corrupt."));
raiseError(tr("Invalid credentials were provided, please try again.\n"
"If this reoccurs, then your database file may be corrupt."));
}
return cipherStream.take();

View File

@ -21,11 +21,11 @@
#include "config-keepassx.h"
#include "core/FilePath.h"
#include "core/Tools.h"
#include "crypto/Crypto.h"
#include "git-info.h"
#include <QClipboard>
#include <QSysInfo>
static const QString aboutMaintainers = R"(
<p><ul>
@ -175,67 +175,7 @@ AboutDialog::AboutDialog(QWidget* parent)
m_ui->iconLabel->setPixmap(filePath()->applicationIcon().pixmap(48));
QString commitHash;
if (!QString(GIT_HEAD).isEmpty()) {
commitHash = GIT_HEAD;
}
QString debugInfo = "KeePassXC - ";
debugInfo.append(tr("Version %1").arg(KEEPASSXC_VERSION).append("\n"));
#ifndef KEEPASSXC_BUILD_TYPE_RELEASE
debugInfo.append(tr("Build Type: %1").arg(KEEPASSXC_BUILD_TYPE).append("\n"));
#endif
if (!commitHash.isEmpty()) {
debugInfo.append(tr("Revision: %1").arg(commitHash.left(7)).append("\n"));
}
#ifdef KEEPASSXC_DIST
debugInfo.append(tr("Distribution: %1").arg(KEEPASSXC_DIST_TYPE).append("\n"));
#endif
debugInfo.append("\n").append(
QString("%1\n- Qt %2\n- %3\n\n")
.arg(tr("Libraries:"), QString::fromLocal8Bit(qVersion()), Crypto::backendVersion()));
#if QT_VERSION >= QT_VERSION_CHECK(5, 4, 0)
debugInfo.append(tr("Operating system: %1\nCPU architecture: %2\nKernel: %3 %4")
.arg(QSysInfo::prettyProductName(),
QSysInfo::currentCpuArchitecture(),
QSysInfo::kernelType(),
QSysInfo::kernelVersion()));
debugInfo.append("\n\n");
#endif
QString extensions;
#ifdef WITH_XC_AUTOTYPE
extensions += "\n- " + tr("Auto-Type");
#endif
#ifdef WITH_XC_BROWSER
extensions += "\n- " + tr("Browser Integration");
#endif
#ifdef WITH_XC_SSHAGENT
extensions += "\n- " + tr("SSH Agent");
#endif
#if defined(WITH_XC_KEESHARE_SECURE) && defined(WITH_XC_KEESHARE_INSECURE)
extensions += "\n- " + tr("KeeShare (signed and unsigned sharing)");
#elif defined(WITH_XC_KEESHARE_SECURE)
extensions += "\n- " + tr("KeeShare (only signed sharing)");
#elif defined(WITH_XC_KEESHARE_INSECURE)
extensions += "\n- " + tr("KeeShare (only unsigned sharing)");
#endif
#ifdef WITH_XC_YUBIKEY
extensions += "\n- " + tr("YubiKey");
#endif
#ifdef WITH_XC_TOUCHID
extensions += "\n- " + tr("TouchID");
#endif
if (extensions.isEmpty())
extensions = " " + tr("None");
debugInfo.append(tr("Enabled extensions:").append(extensions));
QString debugInfo = Tools::debugInfo().append("\n").append(Crypto::debugInfo());
m_ui->debugInfo->setPlainText(debugInfo);
m_ui->maintainers->setText(aboutMaintainers);

View File

@ -81,7 +81,8 @@ ApplicationSettingsWidget::ApplicationSettingsWidget(QWidget* parent)
// clang-format off
connect(m_generalUi->autoSaveAfterEveryChangeCheckBox, SIGNAL(toggled(bool)), SLOT(autoSaveToggled(bool)));
connect(m_generalUi->systrayShowCheckBox, SIGNAL(toggled(bool)), SLOT(systrayToggled(bool)));
connect(m_generalUi->toolbarHideCheckBox, SIGNAL(toggled(bool)), SLOT(enableToolbarSettings(bool)));
connect(m_generalUi->toolbarHideCheckBox, SIGNAL(toggled(bool)), SLOT(toolbarSettingsToggled(bool)));
connect(m_generalUi->rememberLastDatabasesCheckBox, SIGNAL(toggled(bool)), SLOT(rememberDatabasesToggled(bool)));
connect(m_secUi->clearClipboardCheckBox, SIGNAL(toggled(bool)),
m_secUi->clearClipboardSpinBox, SLOT(setEnabled(bool)));
@ -91,8 +92,15 @@ ApplicationSettingsWidget::ApplicationSettingsWidget(QWidget* parent)
m_secUi->touchIDResetSpinBox, SLOT(setEnabled(bool)));
// clang-format on
#ifndef WITH_XC_NETWORKING
#ifdef WITH_XC_UPDATECHECK
connect(m_generalUi->checkForUpdatesOnStartupCheckBox, SIGNAL(toggled(bool)), SLOT(checkUpdatesToggled(bool)));
#else
m_generalUi->checkForUpdatesOnStartupCheckBox->setVisible(false);
m_generalUi->checkForUpdatesIncludeBetasCheckBox->setVisible(false);
m_generalUi->checkUpdatesSpacer->changeSize(0,0, QSizePolicy::Fixed, QSizePolicy::Fixed);
#endif
#ifndef WITH_XC_NETWORKING
m_secUi->privacy->setVisible(false);
#endif
@ -294,11 +302,13 @@ void ApplicationSettingsWidget::saveSettings()
// Security: clear storage if related settings are disabled
if (!config()->get("RememberLastDatabases").toBool()) {
config()->set("LastDatabases", QVariant());
config()->set("LastDatabases", {});
config()->set("OpenPreviousDatabasesOnStartup", {});
config()->set("LastActiveDatabase", {});
}
if (!config()->get("RememberLastKeyFiles").toBool()) {
config()->set("LastKeyFiles", QVariant());
config()->set("LastKeyFiles", {});
config()->set("LastDir", "");
}
@ -330,9 +340,25 @@ void ApplicationSettingsWidget::systrayToggled(bool checked)
m_generalUi->systrayMinimizeToTrayCheckBox->setEnabled(checked);
}
void ApplicationSettingsWidget::enableToolbarSettings(bool checked)
void ApplicationSettingsWidget::toolbarSettingsToggled(bool checked)
{
m_generalUi->toolbarMovableCheckBox->setEnabled(!checked);
m_generalUi->toolButtonStyleComboBox->setEnabled(!checked);
m_generalUi->toolButtonStyleLabel->setEnabled(!checked);
}
void ApplicationSettingsWidget::rememberDatabasesToggled(bool checked)
{
if (!checked) {
m_generalUi->rememberLastKeyFilesCheckBox->setChecked(false);
m_generalUi->openPreviousDatabasesOnStartupCheckBox->setChecked(false);
}
m_generalUi->rememberLastKeyFilesCheckBox->setEnabled(checked);
m_generalUi->openPreviousDatabasesOnStartupCheckBox->setEnabled(checked);
}
void ApplicationSettingsWidget::checkUpdatesToggled(bool checked)
{
m_generalUi->checkForUpdatesIncludeBetasCheckBox->setEnabled(checked);
}

View File

@ -55,7 +55,9 @@ private slots:
void reject();
void autoSaveToggled(bool checked);
void systrayToggled(bool checked);
void enableToolbarSettings(bool checked);
void toolbarSettingsToggled(bool checked);
void rememberDatabasesToggled(bool checked);
void checkUpdatesToggled(bool checked);
private:
QWidget* const m_secWidget;

View File

@ -49,33 +49,6 @@
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="rememberLastDatabasesCheckBox">
<property name="text">
<string>Remember last databases</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="rememberLastKeyFilesCheckBox">
<property name="text">
<string>Remember last key files and security dongles</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="openPreviousDatabasesOnStartupCheckBox">
<property name="text">
<string>Load previous databases on startup</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="systrayMinimizeOnStartup">
<property name="text">
@ -84,12 +57,124 @@
</widget>
</item>
<item>
<widget class="QCheckBox" name="checkForUpdatesOnStartupCheckBox">
<widget class="QCheckBox" name="rememberLastDatabasesCheckBox">
<property name="text">
<string>Check for updates at application startup</string>
<string>Remember previously used databases</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="rememberDbSubLayout_2">
<property name="spacing">
<number>0</number>
</property>
<property name="sizeConstraint">
<enum>QLayout::SetMaximumSize</enum>
</property>
<item>
<spacer name="toolbarMovableSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QCheckBox" name="openPreviousDatabasesOnStartupCheckBox">
<property name="text">
<string>Load previously open databases on startup</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="rememberDbSubLayout">
<property name="spacing">
<number>0</number>
</property>
<property name="sizeConstraint">
<enum>QLayout::SetMaximumSize</enum>
</property>
<item>
<spacer name="toolbarMovableSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QCheckBox" name="rememberLastKeyFilesCheckBox">
<property name="text">
<string>Remember database key files and security dongles</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QCheckBox" name="checkForUpdatesOnStartupCheckBox">
<property name="text">
<string>Check for updates at application startup once per week</string>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="checkUpdatesSubLayout">
<property name="spacing">
<number>0</number>
</property>
<item>
<spacer name="checkUpdatesSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QCheckBox" name="checkForUpdatesIncludeBetasCheckBox">
<property name="text">
<string>Include beta releases when checking for updates</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
@ -186,13 +271,6 @@
<string>General</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_7">
<item>
<widget class="QCheckBox" name="checkForUpdatesIncludeBetasCheckBox">
<property name="text">
<string>Include pre-releases when checking for updates</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="toolbarHideCheckBox">
<property name="text">
@ -218,7 +296,7 @@
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<width>20</width>
<height>20</height>
</size>
</property>
@ -245,7 +323,7 @@
<item>
<layout class="QHBoxLayout" name="toolButtonStyleLayout">
<property name="spacing">
<number>15</number>
<number>0</number>
</property>
<item>
<spacer name="toolButtonStyleSpacer">
@ -257,7 +335,7 @@
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<width>20</width>
<height>20</height>
</size>
</property>
@ -274,8 +352,11 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="styleSheet">
<string notr="true">margin-right: 5px</string>
</property>
<property name="text">
<string>Button style</string>
<string>Button style:</string>
</property>
</widget>
</item>
@ -326,7 +407,7 @@
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<width>20</width>
<height>20</height>
</size>
</property>
@ -377,7 +458,7 @@
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<width>20</width>
<height>20</height>
</size>
</property>
@ -407,18 +488,18 @@
<item>
<layout class="QHBoxLayout" name="languageLabelLayout_2">
<property name="spacing">
<number>15</number>
<number>8</number>
</property>
<item alignment="Qt::AlignRight">
<widget class="QLabel" name="languageLabel_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Language</string>
<string>Language:</string>
</property>
</widget>
</item>
@ -432,6 +513,13 @@
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="languageLabel_3">
<property name="text">
<string>(restart program to activate)</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>

View File

@ -45,7 +45,6 @@ DatabaseOpenWidget::DatabaseOpenWidget(QWidget* parent)
m_ui->setupUi(this);
m_ui->messageWidget->setHidden(true);
m_ui->checkPassword->setChecked(true);
QFont font = m_ui->labelHeadline->font();
font.setBold(true);
@ -159,7 +158,7 @@ void DatabaseOpenWidget::clearForms()
m_ui->editPassword->setText("");
m_ui->comboKeyFile->clear();
m_ui->comboKeyFile->setEditText("");
m_ui->checkPassword->setChecked(true);
m_ui->checkPassword->setChecked(false);
m_ui->checkKeyFile->setChecked(false);
m_ui->checkChallengeResponse->setChecked(false);
m_ui->checkTouchID->setChecked(false);
@ -174,13 +173,8 @@ QSharedPointer<Database> DatabaseOpenWidget::database()
void DatabaseOpenWidget::enterKey(const QString& pw, const QString& keyFile)
{
if (!pw.isEmpty()) {
m_ui->editPassword->setText(pw);
}
if (!keyFile.isEmpty()) {
m_ui->comboKeyFile->setEditText(keyFile);
}
m_ui->editPassword->setText(pw);
m_ui->comboKeyFile->setEditText(keyFile);
openDatabase();
}
@ -191,9 +185,7 @@ void DatabaseOpenWidget::openDatabase()
return;
}
if (!m_ui->editPassword->isPasswordVisible()) {
m_ui->editPassword->setShowPassword(false);
}
m_ui->editPassword->setShowPassword(false);
QCoreApplication::processEvents();
m_db.reset(new Database());
@ -202,8 +194,7 @@ void DatabaseOpenWidget::openDatabase()
bool ok = m_db->open(m_filename, masterKey, &error, false);
QApplication::restoreOverrideCursor();
if (!ok) {
m_ui->messageWidget->showMessage(tr("Unable to open the database:\n%1").arg(error),
MessageWidget::MessageType::Error);
m_ui->messageWidget->showMessage(error, MessageWidget::MessageType::Error);
return;
}
@ -231,7 +222,7 @@ void DatabaseOpenWidget::openDatabase()
}
emit dialogFinished(true);
} else {
m_ui->messageWidget->showMessage(tr("Unable to open the database:\n%1").arg(error), MessageWidget::Error);
m_ui->messageWidget->showMessage(error, MessageWidget::Error);
m_ui->editPassword->setText("");
#ifdef WITH_XC_TOUCHID
@ -276,7 +267,7 @@ QSharedPointer<CompositeKey> DatabaseOpenWidget::databaseKey()
QString keyFilename = m_ui->comboKeyFile->currentText();
QString errorMsg;
if (!key->load(keyFilename, &errorMsg)) {
m_ui->messageWidget->showMessage(tr("Can't open key file:\n%1").arg(errorMsg), MessageWidget::Error);
m_ui->messageWidget->showMessage(tr("Failed to open key file: %1").arg(errorMsg), MessageWidget::Error);
return {};
}
if (key->type() != FileKey::Hashed && !config()->get("Messages/NoLegacyKeyFileWarning").toBool()) {
@ -339,17 +330,20 @@ void DatabaseOpenWidget::reject()
void DatabaseOpenWidget::activatePassword()
{
m_ui->checkPassword->setChecked(true);
bool hasPassword = !m_ui->editPassword->text().isEmpty();
m_ui->checkPassword->setChecked(hasPassword);
}
void DatabaseOpenWidget::activateKeyFile()
{
m_ui->checkKeyFile->setChecked(true);
bool hasKeyFile = !m_ui->comboKeyFile->lineEdit()->text().isEmpty();
m_ui->checkKeyFile->setChecked(hasKeyFile);
}
void DatabaseOpenWidget::activateChallengeResponse()
{
m_ui->checkChallengeResponse->setChecked(true);
bool hasCR = m_ui->comboChallengeResponse->currentData().toInt() != -1;
m_ui->checkChallengeResponse->setChecked(hasCR);
}
void DatabaseOpenWidget::browseKeyFile()
@ -372,6 +366,7 @@ void DatabaseOpenWidget::pollYubikey()
m_ui->checkChallengeResponse->setChecked(false);
m_ui->comboChallengeResponse->setEnabled(false);
m_ui->comboChallengeResponse->clear();
m_ui->comboChallengeResponse->addItem(tr("Select slot..."), -1);
m_ui->yubikeyProgress->setVisible(true);
// YubiKey init is slow, detect asynchronously to not block the UI
@ -388,6 +383,7 @@ void DatabaseOpenWidget::yubikeyDetected(int slot, bool blocking)
QHash<QString, QVariant> lastChallengeResponse = config()->get("LastChallengeResponse").toHash();
if (lastChallengeResponse.contains(m_filename)) {
m_ui->checkChallengeResponse->setChecked(true);
m_ui->comboChallengeResponse->setCurrentIndex(1);
}
}
}

View File

@ -137,25 +137,29 @@ void DatabaseTabWidget::openDatabase()
* database has been opened already.
*
* @param filePath database file path
* @param password optional, password to unlock database
* @param inBackground optional, don't focus tab after opening
* @param password optional, password to unlock database
* @param keyfile optional, path to keyfile to unlock database
*
*/
void DatabaseTabWidget::addDatabaseTab(const QString& filePath, bool inBackground, const QString& password)
void DatabaseTabWidget::addDatabaseTab(const QString& filePath,
bool inBackground,
const QString& password,
const QString& keyfile)
{
QFileInfo fileInfo(filePath);
QString canonicalFilePath = fileInfo.canonicalFilePath();
if (canonicalFilePath.isEmpty()) {
emit messageGlobal(tr("The database file does not exist or is not accessible."), MessageWidget::Error);
emit messageGlobal(tr("Failed to open %1. It either does not exist or is not accessible.").arg(filePath),
MessageWidget::Error);
return;
}
for (int i = 0, c = count(); i < c; ++i) {
auto* dbWidget = databaseWidgetFromIndex(i);
Q_ASSERT(dbWidget);
if (dbWidget && dbWidget->database()->filePath() == canonicalFilePath) {
if (!password.isEmpty()) {
dbWidget->performUnlockDatabase(password);
}
if (dbWidget && dbWidget->database()->canonicalFilePath() == canonicalFilePath) {
dbWidget->performUnlockDatabase(password, keyfile);
if (!inBackground) {
// switch to existing tab if file is already open
setCurrentIndex(indexOf(dbWidget));
@ -166,9 +170,7 @@ void DatabaseTabWidget::addDatabaseTab(const QString& filePath, bool inBackgroun
auto* dbWidget = new DatabaseWidget(QSharedPointer<Database>::create(filePath), this);
addDatabaseTab(dbWidget, inBackground);
if (!password.isEmpty()) {
dbWidget->performUnlockDatabase(password);
}
dbWidget->performUnlockDatabase(password, keyfile);
updateLastDatabases(filePath);
}

View File

@ -48,7 +48,10 @@ public:
bool hasLockableDatabases() const;
public slots:
void addDatabaseTab(const QString& filePath, bool inBackground = false, const QString& password = {});
void addDatabaseTab(const QString& filePath,
bool inBackground = false,
const QString& password = {},
const QString& keyfile = {});
void addDatabaseTab(DatabaseWidget* dbWidget, bool inBackground = false);
bool closeDatabaseTab(int index);
bool closeDatabaseTab(DatabaseWidget* dbWidget);

View File

@ -78,9 +78,7 @@ DatabaseWidget::DatabaseWidget(QSharedPointer<Database> db, QWidget* parent)
, m_previewView(new EntryPreviewWidget(this))
, m_previewSplitter(new QSplitter(m_mainWidget))
, m_searchingLabel(new QLabel(this))
#ifdef WITH_XC_KEESHARE
, m_shareLabel(new QLabel(this))
#endif
, m_csvImportWizard(new CsvImportWizard(this))
, m_editEntryWidget(new EditEntryWidget(this))
, m_editGroupWidget(new EditGroupWidget(this))
@ -89,6 +87,7 @@ DatabaseWidget::DatabaseWidget(QSharedPointer<Database> db, QWidget* parent)
, m_databaseOpenWidget(new DatabaseOpenWidget(this))
, m_keepass1OpenWidget(new KeePass1OpenWidget(this))
, m_groupView(new GroupView(m_db.data(), m_mainSplitter))
, m_saveAttempts(0)
, m_fileWatcher(new DelayingFileWatcher(this))
{
m_messageWidget->setHidden(true);
@ -260,12 +259,11 @@ bool DatabaseWidget::isSearchActive() const
bool DatabaseWidget::isEditWidgetModified() const
{
if (currentWidget() == m_editEntryWidget) {
return m_editEntryWidget->hasBeenModified();
} else {
// other edit widget don't have a hasBeenModified() method yet
// assume that they already have been modified
return true;
return m_editEntryWidget->isModified();
} else if (currentWidget() == m_editGroupWidget) {
return m_editGroupWidget->isModified();
}
return false;
}
QList<int> DatabaseWidget::mainSplitterSizes() const
@ -859,6 +857,7 @@ void DatabaseWidget::loadDatabase(bool accepted)
replaceDatabase(openWidget->database());
switchToMainView();
m_fileWatcher->restart();
m_saveAttempts = 0;
emit databaseUnlocked();
} else {
m_fileWatcher->stop();
@ -1112,7 +1111,9 @@ void DatabaseWidget::search(const QString& searchtext)
}
m_searchingLabel->setVisible(true);
#ifdef WITH_XC_KEESHARE
m_shareLabel->setVisible(false);
#endif
emit searchModeActivated();
}
@ -1245,7 +1246,7 @@ bool DatabaseWidget::lock()
clipboard()->clearCopiedText();
if (currentMode() == DatabaseWidget::Mode::EditMode) {
if (isEditWidgetModified()) {
auto result = MessageBox::question(this,
tr("Lock Database?"),
tr("You are editing an entry. Discard changes and lock anyway?"),
@ -1510,7 +1511,7 @@ EntryView* DatabaseWidget::entryView()
* @param attempt current save attempt or -1 to disable attempts
* @return true on success
*/
bool DatabaseWidget::save(int attempt)
bool DatabaseWidget::save()
{
// Never allow saving a locked database; it causes corruption
Q_ASSERT(!isLocked());
@ -1525,6 +1526,8 @@ bool DatabaseWidget::save(int attempt)
}
blockAutoReload(true);
++m_saveAttempts;
// TODO: Make this async, but lock out the database widget to prevent re-entrance
bool useAtomicSaves = config()->get("UseAtomicSaves", true).toBool();
QString errorMessage;
@ -1532,14 +1535,11 @@ bool DatabaseWidget::save(int attempt)
blockAutoReload(false);
if (ok) {
m_saveAttempts = 0;
return true;
}
if (attempt >= 0 && attempt <= 2) {
return save(attempt + 1);
}
if (attempt > 2 && useAtomicSaves) {
if (m_saveAttempts > 2 && useAtomicSaves) {
// Saving failed 3 times, issue a warning and attempt to resolve
auto result = MessageBox::question(this,
tr("Disable safe saves?"),
@ -1550,11 +1550,15 @@ bool DatabaseWidget::save(int attempt)
MessageBox::Disable);
if (result == MessageBox::Disable) {
config()->set("UseAtomicSaves", false);
return save(attempt + 1);
return save();
}
}
showMessage(tr("Writing the database failed.\n%1").arg(errorMessage), MessageWidget::Error);
showMessage(tr("Writing the database failed: %1").arg(errorMessage),
MessageWidget::Error,
true,
MessageWidget::LongAutoHideTimeout);
return false;
}
@ -1583,8 +1587,9 @@ bool DatabaseWidget::saveAs()
// Ensure we don't recurse back into this function
m_db->setReadOnly(false);
m_db->setFilePath(newFilePath);
m_saveAttempts = 0;
if (!save(-1)) {
if (!save()) {
// Failed to save, try again
continue;
}

View File

@ -144,7 +144,7 @@ signals:
public slots:
bool lock();
bool save(int attempt = 0);
bool save();
bool saveAs();
void replaceDatabase(QSharedPointer<Database> db);
@ -235,9 +235,7 @@ private:
QPointer<EntryPreviewWidget> m_previewView;
QPointer<QSplitter> m_previewSplitter;
QPointer<QLabel> m_searchingLabel;
#ifdef WITH_XC_KEESHARE
QPointer<QLabel> m_shareLabel;
#endif
QPointer<CsvImportWizard> m_csvImportWizard;
QPointer<EditEntryWidget> m_editEntryWidget;
QPointer<EditGroupWidget> m_editGroupWidget;
@ -255,6 +253,8 @@ private:
QUuid m_groupBeforeLock;
QUuid m_entryBeforeLock;
int m_saveAttempts;
// Search state
EntrySearcher* m_EntrySearcher;
QString m_lastSearchText;

View File

@ -30,6 +30,7 @@ EditWidget::EditWidget(QWidget* parent)
{
m_ui->setupUi(this);
setReadOnly(false);
setModified(false);
m_ui->messageWidget->setHidden(true);
@ -43,6 +44,7 @@ EditWidget::EditWidget(QWidget* parent)
connect(m_ui->buttonBox, SIGNAL(accepted()), SIGNAL(accepted()));
connect(m_ui->buttonBox, SIGNAL(rejected()), SIGNAL(rejected()));
connect(m_ui->buttonBox, SIGNAL(clicked(QAbstractButton*)), SLOT(buttonClicked(QAbstractButton*)));
}
EditWidget::~EditWidget()
@ -106,9 +108,6 @@ void EditWidget::setReadOnly(bool readOnly)
m_ui->buttonBox->setStandardButtons(QDialogButtonBox::Close);
} else {
m_ui->buttonBox->setStandardButtons(QDialogButtonBox::Ok | QDialogButtonBox::Cancel | QDialogButtonBox::Apply);
// Find and connect the apply button
QPushButton* applyButton = m_ui->buttonBox->button(QDialogButtonBox::Apply);
connect(applyButton, SIGNAL(clicked()), SIGNAL(apply()));
}
}
@ -117,6 +116,17 @@ bool EditWidget::readOnly() const
return m_readOnly;
}
void EditWidget::setModified(bool state)
{
m_modified = state;
enableApplyButton(state);
}
bool EditWidget::isModified() const
{
return m_modified;
}
void EditWidget::enableApplyButton(bool enabled)
{
QPushButton* applyButton = m_ui->buttonBox->button(QDialogButtonBox::Apply);
@ -125,6 +135,27 @@ void EditWidget::enableApplyButton(bool enabled)
}
}
void EditWidget::showApplyButton(bool state)
{
if (!m_readOnly) {
auto buttons = m_ui->buttonBox->standardButtons();
if (state) {
buttons |= QDialogButtonBox::Apply;
} else {
buttons &= ~QDialogButtonBox::Apply;
}
m_ui->buttonBox->setStandardButtons(buttons);
}
}
void EditWidget::buttonClicked(QAbstractButton* button)
{
auto stdButton = m_ui->buttonBox->standardButton(button);
if (stdButton == QDialogButtonBox::Apply) {
emit apply();
}
}
void EditWidget::showMessage(const QString& text, MessageWidget::MessageType type)
{
// Show error messages for a longer time to make sure the user can read them

View File

@ -49,6 +49,8 @@ public:
void setReadOnly(bool readOnly);
bool readOnly() const;
void enableApplyButton(bool enabled);
void showApplyButton(bool state);
virtual bool isModified() const;
signals:
void apply();
@ -58,10 +60,13 @@ signals:
protected slots:
void showMessage(const QString& text, MessageWidget::MessageType type);
void hideMessage();
void setModified(bool state = true);
void buttonClicked(QAbstractButton* button);
private:
const QScopedPointer<Ui::EditWidget> m_ui;
bool m_readOnly;
bool m_modified;
Q_DISABLE_COPY(EditWidget)
};

View File

@ -41,7 +41,7 @@
#include "keys/FileKey.h"
#include "keys/PasswordKey.h"
#ifdef WITH_XC_NETWORKING
#ifdef WITH_XC_UPDATECHECK
#include "gui/MessageBox.h"
#include "gui/UpdateCheckDialog.h"
#include "updatecheck/UpdateChecker.h"
@ -253,9 +253,9 @@ MainWindow::MainWindow()
new QShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_M, this, SLOT(hideWindow()));
// Control database tabs
new QShortcut(Qt::CTRL + Qt::Key_Tab, this, SLOT(selectNextDatabaseTab()));
new QShortcut(Qt::CTRL + Qt::Key_PageUp, this, SLOT(selectNextDatabaseTab()));
new QShortcut(Qt::CTRL + Qt::Key_PageDown, this, SLOT(selectNextDatabaseTab()));
new QShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_Tab, this, SLOT(selectPreviousDatabaseTab()));
new QShortcut(Qt::CTRL + Qt::Key_PageDown, this, SLOT(selectPreviousDatabaseTab()));
new QShortcut(Qt::CTRL + Qt::Key_PageUp, this, SLOT(selectPreviousDatabaseTab()));
// Toggle password and username visibility in entry view
new QShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_C, this, SLOT(togglePasswordsHidden()));
new QShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_B, this, SLOT(toggleUsernamesHidden()));
@ -372,12 +372,12 @@ MainWindow::MainWindow()
setUnifiedTitleAndToolBarOnMac(true);
#endif
#ifdef WITH_XC_NETWORKING
#ifdef WITH_XC_UPDATECHECK
connect(m_ui->actionCheckForUpdates, SIGNAL(triggered()), SLOT(showUpdateCheckDialog()));
connect(UpdateChecker::instance(),
SIGNAL(updateCheckFinished(bool, QString, bool)),
SLOT(hasUpdateAvailable(bool, QString, bool)));
QTimer::singleShot(3000, this, SLOT(showUpdateCheckStartup()));
QTimer::singleShot(500, this, SLOT(showUpdateCheckStartup()));
#else
m_ui->actionCheckForUpdates->setVisible(false);
#endif
@ -391,8 +391,10 @@ MainWindow::MainWindow()
connect(m_ui->tabWidget, SIGNAL(messageDismissGlobal()), this, SLOT(hideGlobalMessage()));
#ifndef Q_OS_HAIKU
m_screenLockListener = new ScreenLockListener(this);
connect(m_screenLockListener, SIGNAL(screenLocked()), SLOT(handleScreenLock()));
#endif
updateTrayIcon();
@ -494,28 +496,9 @@ void MainWindow::clearLastDatabases()
}
}
void MainWindow::openDatabase(const QString& filePath, const QString& pw, const QString& keyFile)
void MainWindow::openDatabase(const QString& filePath, const QString& password, const QString& keyfile)
{
if (pw.isEmpty() && keyFile.isEmpty()) {
m_ui->tabWidget->addDatabaseTab(filePath);
return;
}
auto db = QSharedPointer<Database>::create();
auto key = QSharedPointer<CompositeKey>::create();
if (!pw.isEmpty()) {
key->addKey(QSharedPointer<PasswordKey>::create(pw));
}
if (!keyFile.isEmpty()) {
auto fileKey = QSharedPointer<FileKey>::create();
fileKey->load(keyFile);
key->addKey(fileKey);
}
if (db->open(filePath, key, nullptr, false)) {
auto* dbWidget = new DatabaseWidget(db, this);
m_ui->tabWidget->addDatabaseTab(dbWidget);
dbWidget->switchToMainView(true);
}
m_ui->tabWidget->addDatabaseTab(filePath, false, password, keyfile);
}
void MainWindow::setMenuActionState(DatabaseWidget::Mode mode)
@ -687,7 +670,7 @@ void MainWindow::showAboutDialog()
void MainWindow::showUpdateCheckStartup()
{
#ifdef WITH_XC_NETWORKING
#ifdef WITH_XC_UPDATECHECK
if (!config()->get("UpdateCheckMessageShown", false).toBool()) {
auto result =
MessageBox::question(this,
@ -710,7 +693,7 @@ void MainWindow::showUpdateCheckStartup()
void MainWindow::hasUpdateAvailable(bool hasUpdate, const QString& version, bool isManuallyRequested)
{
#ifdef WITH_XC_NETWORKING
#ifdef WITH_XC_UPDATECHECK
if (hasUpdate && !isManuallyRequested) {
auto* updateCheckDialog = new UpdateCheckDialog(this);
updateCheckDialog->showUpdateCheckResponse(hasUpdate, version);
@ -725,7 +708,7 @@ void MainWindow::hasUpdateAvailable(bool hasUpdate, const QString& version, bool
void MainWindow::showUpdateCheckDialog()
{
#ifdef WITH_XC_NETWORKING
#ifdef WITH_XC_UPDATECHECK
updateCheck()->checkForUpdates(true);
auto* updateCheckDialog = new UpdateCheckDialog(this);
updateCheckDialog->show();
@ -920,24 +903,27 @@ void MainWindow::saveWindowInformation()
bool MainWindow::saveLastDatabases()
{
bool accept;
m_openDatabases.clear();
bool openPreviousDatabasesOnStartup = config()->get("OpenPreviousDatabasesOnStartup").toBool();
if (config()->get("OpenPreviousDatabasesOnStartup").toBool()) {
auto currentDbWidget = m_ui->tabWidget->currentDatabaseWidget();
if (currentDbWidget) {
config()->set("LastActiveDatabase", currentDbWidget->database()->filePath());
} else {
config()->set("LastActiveDatabase", {});
}
if (openPreviousDatabasesOnStartup) {
connect(
m_ui->tabWidget, SIGNAL(databaseClosed(const QString&)), this, SLOT(rememberOpenDatabases(const QString&)));
QStringList openDatabases;
for (int i=0; i < m_ui->tabWidget->count(); ++i) {
auto dbWidget = m_ui->tabWidget->databaseWidgetFromIndex(i);
openDatabases.append(dbWidget->database()->filePath());
}
config()->set("LastOpenedDatabases", openDatabases);
} else {
config()->set("LastActiveDatabase", {});
config()->set("LastOpenedDatabases", {});
}
accept = m_ui->tabWidget->closeAllDatabaseTabs();
if (openPreviousDatabasesOnStartup) {
disconnect(
m_ui->tabWidget, SIGNAL(databaseClosed(const QString&)), this, SLOT(rememberOpenDatabases(const QString&)));
config()->set("LastOpenedDatabases", m_openDatabases);
}
return accept;
return m_ui->tabWidget->closeAllDatabaseTabs();
}
void MainWindow::updateTrayIcon()
@ -1002,11 +988,6 @@ void MainWindow::setShortcut(QAction* action, QKeySequence::StandardKey standard
}
}
void MainWindow::rememberOpenDatabases(const QString& filePath)
{
m_openDatabases.prepend(filePath);
}
void MainWindow::applySettingsChanges()
{
int timeout = config()->get("security/lockdatabaseidlesec").toInt() * 1000;

View File

@ -56,7 +56,7 @@ public:
};
public slots:
void openDatabase(const QString& filePath, const QString& pw = {}, const QString& keyFile = {});
void openDatabase(const QString& filePath, const QString& password = {}, const QString& keyfile = {});
void appExit();
void displayGlobalMessage(const QString& text,
MessageWidget::MessageType type,
@ -105,7 +105,6 @@ private slots:
void updateCopyAttributesMenu();
void showEntryContextMenu(const QPoint& globalPos);
void showGroupContextMenu(const QPoint& globalPos);
void rememberOpenDatabases(const QString& filePath);
void applySettingsChanges();
void trayIconTriggered(QSystemTrayIcon::ActivationReason reason);
void lockDatabasesAfterInactivity();
@ -137,7 +136,6 @@ private:
QAction* m_searchWidgetAction;
QActionGroup* m_lastDatabasesActions;
QActionGroup* m_copyAdditionalAttributeActions;
QStringList m_openDatabases;
InactivityTimer* m_inactivityTimer;
InactivityTimer* m_touchIDinactivityTimer;
int m_countDefaultAttributes;

View File

@ -23,6 +23,7 @@
#include <QUrl>
const int MessageWidget::DefaultAutoHideTimeout = 6000;
const int MessageWidget::LongAutoHideTimeout = 15000;
const int MessageWidget::DisableAutoHide = -1;
MessageWidget::MessageWidget(QWidget* parent)

View File

@ -33,6 +33,7 @@ public:
int autoHideTimeout() const;
static const int DefaultAutoHideTimeout;
static const int LongAutoHideTimeout;
static const int DisableAutoHide;
signals:

View File

@ -1,5 +1,4 @@
/*
* Copyright (C) 2016 Jonathan White <support@dmapps.us>
* Copyright (C) 2017 KeePassXC Team <team@keepassxc.org>
*
* This program is free software: you can redistribute it and/or modify
@ -97,6 +96,13 @@ bool SearchWidget::eventFilter(QObject* obj, QEvent* event)
if (keyEvent->key() == Qt::Key_Escape) {
emit escapePressed();
return true;
} else if (keyEvent->matches(QKeySequence::Copy)) {
// If Control+C is pressed in the search edit when no text
// is selected, copy the password of the current entry.
if (!m_ui->searchEdit->hasSelectedText()) {
emit copyPressed();
return true;
}
} else if (keyEvent->matches(QKeySequence::MoveToNextLine)) {
if (m_ui->searchEdit->cursorPosition() == m_ui->searchEdit->text().length()) {
// If down is pressed at EOL, move the focus to the entry view

View File

@ -77,11 +77,8 @@ void DatabaseSettingsWidgetMasterKey::load(QSharedPointer<Database> db)
// database has no key, we are about to add a new one
m_passwordEditWidget->changeVisiblePage(KeyComponentWidget::Page::Edit);
m_passwordEditWidget->setPasswordVisible(true);
m_isDirty = true;
return;
}
bool isDirty = false;
bool hasAdditionalKeys = false;
for (const auto& key : m_db->key()->keys()) {
if (key->uuid() == PasswordKey::UUID) {
@ -103,7 +100,11 @@ void DatabaseSettingsWidgetMasterKey::load(QSharedPointer<Database> db)
setAdditionalKeyOptionsVisible(hasAdditionalKeys);
m_isDirty = isDirty;
connect(m_passwordEditWidget->findChild<QPushButton*>("removeButton"), SIGNAL(clicked()), SLOT(markDirty()));
connect(m_keyFileEditWidget->findChild<QPushButton*>("removeButton"), SIGNAL(clicked()), SLOT(markDirty()));
#ifdef WITH_XC_YUBIKEY
connect(m_yubiKeyEditWidget->findChild<QPushButton*>("removeButton"), SIGNAL(clicked()), SLOT(markDirty()));
#endif
}
void DatabaseSettingsWidgetMasterKey::initialize()

View File

@ -198,11 +198,18 @@ void EditEntryWidget::setupIcon()
connect(this, SIGNAL(rejected()), m_iconsWidget, SLOT(abortRequests()));
}
void EditEntryWidget::openAutotypeHelp()
{
QDesktopServices::openUrl(QUrl("https://github.com/keepassxreboot/keepassxc/wiki/Autotype-Custom-Sequence"));
}
void EditEntryWidget::setupAutoType()
{
m_autoTypeUi->setupUi(m_autoTypeWidget);
addPage(tr("Auto-Type"), FilePath::instance()->icon("actions", "key-enter"), m_autoTypeWidget);
m_autoTypeUi->openHelpButton->setIcon(filePath()->icon("actions", "system-help"));
m_autoTypeDefaultSequenceGroup->addButton(m_autoTypeUi->inheritSequenceButton);
m_autoTypeDefaultSequenceGroup->addButton(m_autoTypeUi->customSequenceButton);
m_autoTypeAssocModel->setAutoTypeAssociations(m_autoTypeAssoc);
@ -213,6 +220,9 @@ void EditEntryWidget::setupAutoType()
connect(m_autoTypeUi->enableButton, SIGNAL(toggled(bool)), SLOT(updateAutoTypeEnabled()));
connect(m_autoTypeUi->customSequenceButton, SIGNAL(toggled(bool)),
m_autoTypeUi->sequenceEdit, SLOT(setEnabled(bool)));
connect(m_autoTypeUi->customSequenceButton, SIGNAL(toggled(bool)),
m_autoTypeUi->openHelpButton, SLOT(setEnabled(bool)));
connect(m_autoTypeUi->openHelpButton, SIGNAL(clicked()), SLOT(openAutotypeHelp()));
connect(m_autoTypeUi->customWindowSequenceButton, SIGNAL(toggled(bool)),
m_autoTypeUi->windowSequenceEdit, SLOT(setEnabled(bool)));
connect(m_autoTypeUi->assocAddButton, SIGNAL(clicked()), SLOT(insertAutoTypeAssoc()));
@ -266,55 +276,54 @@ void EditEntryWidget::setupHistory()
void EditEntryWidget::setupEntryUpdate()
{
// Entry tab
connect(m_mainUi->titleEdit, SIGNAL(textChanged(QString)), this, SLOT(setUnsavedChanges()));
connect(m_mainUi->usernameEdit, SIGNAL(textChanged(QString)), this, SLOT(setUnsavedChanges()));
connect(m_mainUi->passwordEdit, SIGNAL(textChanged(QString)), this, SLOT(setUnsavedChanges()));
connect(m_mainUi->passwordRepeatEdit, SIGNAL(textChanged(QString)), this, SLOT(setUnsavedChanges()));
connect(m_mainUi->urlEdit, SIGNAL(textChanged(QString)), this, SLOT(setUnsavedChanges()));
connect(m_mainUi->titleEdit, SIGNAL(textChanged(QString)), this, SLOT(setModified()));
connect(m_mainUi->usernameEdit, SIGNAL(textChanged(QString)), this, SLOT(setModified()));
connect(m_mainUi->passwordEdit, SIGNAL(textChanged(QString)), this, SLOT(setModified()));
connect(m_mainUi->passwordRepeatEdit, SIGNAL(textChanged(QString)), this, SLOT(setModified()));
connect(m_mainUi->urlEdit, SIGNAL(textChanged(QString)), this, SLOT(setModified()));
#ifdef WITH_XC_NETWORKING
connect(m_mainUi->urlEdit, SIGNAL(textChanged(QString)), this, SLOT(updateFaviconButtonEnable(QString)));
#endif
connect(m_mainUi->expireCheck, SIGNAL(stateChanged(int)), this, SLOT(setUnsavedChanges()));
connect(m_mainUi->notesEnabled, SIGNAL(stateChanged(int)), this, SLOT(setUnsavedChanges()));
connect(m_mainUi->expireDatePicker, SIGNAL(dateTimeChanged(QDateTime)), this, SLOT(setUnsavedChanges()));
connect(m_mainUi->notesEdit, SIGNAL(textChanged()), this, SLOT(setUnsavedChanges()));
connect(m_mainUi->expireCheck, SIGNAL(stateChanged(int)), this, SLOT(setModified()));
connect(m_mainUi->notesEnabled, SIGNAL(stateChanged(int)), this, SLOT(setModified()));
connect(m_mainUi->expireDatePicker, SIGNAL(dateTimeChanged(QDateTime)), this, SLOT(setModified()));
connect(m_mainUi->notesEdit, SIGNAL(textChanged()), this, SLOT(setModified()));
// Advanced tab
connect(m_advancedUi->attributesEdit, SIGNAL(textChanged()), this, SLOT(setUnsavedChanges()));
connect(m_advancedUi->protectAttributeButton, SIGNAL(stateChanged(int)), this, SLOT(setUnsavedChanges()));
connect(m_advancedUi->fgColorCheckBox, SIGNAL(stateChanged(int)), this, SLOT(setUnsavedChanges()));
connect(m_advancedUi->bgColorCheckBox, SIGNAL(stateChanged(int)), this, SLOT(setUnsavedChanges()));
connect(m_advancedUi->attachmentsWidget, SIGNAL(widgetUpdated()), this, SLOT(setUnsavedChanges()));
connect(m_advancedUi->attributesEdit, SIGNAL(textChanged()), this, SLOT(setModified()));
connect(m_advancedUi->protectAttributeButton, SIGNAL(stateChanged(int)), this, SLOT(setModified()));
connect(m_advancedUi->fgColorCheckBox, SIGNAL(stateChanged(int)), this, SLOT(setModified()));
connect(m_advancedUi->bgColorCheckBox, SIGNAL(stateChanged(int)), this, SLOT(setModified()));
connect(m_advancedUi->attachmentsWidget, SIGNAL(widgetUpdated()), this, SLOT(setModified()));
// Icon tab
connect(m_iconsWidget, SIGNAL(widgetUpdated()), this, SLOT(setUnsavedChanges()));
connect(m_iconsWidget, SIGNAL(widgetUpdated()), this, SLOT(setModified()));
// Auto-Type tab
connect(m_autoTypeUi->enableButton, SIGNAL(stateChanged(int)), this, SLOT(setUnsavedChanges()));
connect(m_autoTypeUi->customWindowSequenceButton, SIGNAL(stateChanged(int)), this, SLOT(setUnsavedChanges()));
connect(m_autoTypeUi->inheritSequenceButton, SIGNAL(toggled(bool)), this, SLOT(setUnsavedChanges()));
connect(m_autoTypeUi->customSequenceButton, SIGNAL(toggled(bool)), this, SLOT(setUnsavedChanges()));
connect(m_autoTypeUi->windowSequenceEdit, SIGNAL(textChanged(QString)), this, SLOT(setUnsavedChanges()));
connect(m_autoTypeUi->sequenceEdit, SIGNAL(textChanged(QString)), this, SLOT(setUnsavedChanges()));
connect(m_autoTypeUi->windowTitleCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(setUnsavedChanges()));
connect(m_autoTypeUi->windowTitleCombo, SIGNAL(editTextChanged(QString)), this, SLOT(setUnsavedChanges()));
connect(m_autoTypeUi->enableButton, SIGNAL(stateChanged(int)), this, SLOT(setModified()));
connect(m_autoTypeUi->customWindowSequenceButton, SIGNAL(stateChanged(int)), this, SLOT(setModified()));
connect(m_autoTypeUi->inheritSequenceButton, SIGNAL(toggled(bool)), this, SLOT(setModified()));
connect(m_autoTypeUi->customSequenceButton, SIGNAL(toggled(bool)), this, SLOT(setModified()));
connect(m_autoTypeUi->windowSequenceEdit, SIGNAL(textChanged(QString)), this, SLOT(setModified()));
connect(m_autoTypeUi->sequenceEdit, SIGNAL(textChanged(QString)), this, SLOT(setModified()));
connect(m_autoTypeUi->windowTitleCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(setModified()));
connect(m_autoTypeUi->windowTitleCombo, SIGNAL(editTextChanged(QString)), this, SLOT(setModified()));
// Properties and History tabs don't need extra connections
#ifdef WITH_XC_SSHAGENT
// SSH Agent tab
if (config()->get("SSHAgent", false).toBool()) {
connect(m_sshAgentUi->attachmentRadioButton, SIGNAL(toggled(bool)), this, SLOT(setUnsavedChanges()));
connect(m_sshAgentUi->externalFileRadioButton, SIGNAL(toggled(bool)), this, SLOT(setUnsavedChanges()));
connect(m_sshAgentUi->attachmentComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(setUnsavedChanges()));
connect(m_sshAgentUi->attachmentComboBox, SIGNAL(editTextChanged(QString)), this, SLOT(setUnsavedChanges()));
connect(m_sshAgentUi->externalFileEdit, SIGNAL(textChanged(QString)), this, SLOT(setUnsavedChanges()));
connect(m_sshAgentUi->addKeyToAgentCheckBox, SIGNAL(stateChanged(int)), this, SLOT(setUnsavedChanges()));
connect(m_sshAgentUi->removeKeyFromAgentCheckBox, SIGNAL(stateChanged(int)), this, SLOT(setUnsavedChanges()));
connect(
m_sshAgentUi->requireUserConfirmationCheckBox, SIGNAL(stateChanged(int)), this, SLOT(setUnsavedChanges()));
connect(m_sshAgentUi->lifetimeCheckBox, SIGNAL(stateChanged(int)), this, SLOT(setUnsavedChanges()));
connect(m_sshAgentUi->lifetimeSpinBox, SIGNAL(valueChanged(int)), this, SLOT(setUnsavedChanges()));
connect(m_sshAgentUi->attachmentRadioButton, SIGNAL(toggled(bool)), this, SLOT(setModified()));
connect(m_sshAgentUi->externalFileRadioButton, SIGNAL(toggled(bool)), this, SLOT(setModified()));
connect(m_sshAgentUi->attachmentComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(setModified()));
connect(m_sshAgentUi->attachmentComboBox, SIGNAL(editTextChanged(QString)), this, SLOT(setModified()));
connect(m_sshAgentUi->externalFileEdit, SIGNAL(textChanged(QString)), this, SLOT(setModified()));
connect(m_sshAgentUi->addKeyToAgentCheckBox, SIGNAL(stateChanged(int)), this, SLOT(setModified()));
connect(m_sshAgentUi->removeKeyFromAgentCheckBox, SIGNAL(stateChanged(int)), this, SLOT(setModified()));
connect(m_sshAgentUi->requireUserConfirmationCheckBox, SIGNAL(stateChanged(int)), this, SLOT(setModified()));
connect(m_sshAgentUi->lifetimeCheckBox, SIGNAL(stateChanged(int)), this, SLOT(setModified()));
connect(m_sshAgentUi->lifetimeSpinBox, SIGNAL(valueChanged(int)), this, SLOT(setModified()));
}
#endif
}
@ -588,15 +597,14 @@ void EditEntryWidget::addKeyToAgent()
m_sshAgentUi->commentTextLabel->setText(key.comment());
m_sshAgentUi->publicKeyEdit->document()->setPlainText(key.publicKey());
int lifetime = 0;
bool confirm = m_sshAgentUi->requireUserConfirmationCheckBox->isChecked();
KeeAgentSettings settings;
if (m_sshAgentUi->lifetimeCheckBox->isChecked()) {
lifetime = m_sshAgentUi->lifetimeSpinBox->value();
}
settings.setRemoveAtDatabaseClose(m_sshAgentUi->removeKeyFromAgentCheckBox->isChecked());
settings.setUseConfirmConstraintWhenAdding(m_sshAgentUi->requireUserConfirmationCheckBox->isChecked());
settings.setUseLifetimeConstraintWhenAdding(m_sshAgentUi->lifetimeCheckBox->isChecked());
settings.setLifetimeConstraintDuration(m_sshAgentUi->lifetimeSpinBox->value());
if (!SSHAgent::instance()->addIdentity(
key, m_sshAgentUi->removeKeyFromAgentCheckBox->isChecked(), static_cast<quint32>(lifetime), confirm)) {
if (!SSHAgent::instance()->addIdentity(key, settings)) {
showMessage(SSHAgent::instance()->errorString(), MessageWidget::Error);
return;
}
@ -693,8 +701,10 @@ void EditEntryWidget::loadEntry(Entry* entry,
setCurrentPage(0);
setPageHidden(m_historyWidget, m_history || m_entry->historyItems().count() < 1);
// Force the user to Save/Apply/Discard new entries
setUnsavedChanges(m_create);
// Force the user to Save/Discard new entries
showApplyButton(!m_create);
setModified(false);
}
void EditEntryWidget::setForms(Entry* entry, bool restore)
@ -871,7 +881,6 @@ bool EditEntryWidget::commitEntry()
}
updateEntryData(m_entry);
setUnsavedChanges(false);
if (!m_create) {
m_entry->endUpdate();
@ -886,6 +895,7 @@ bool EditEntryWidget::commitEntry()
m_historyModel->setEntries(m_entry->historyItems());
showMessage(tr("Entry updated successfully."), MessageWidget::Positive);
setModified(false);
return true;
}
@ -958,7 +968,7 @@ void EditEntryWidget::cancel()
m_entry->setIcon(Entry::DefaultIconNumber);
}
if (!m_saved) {
if (isModified()) {
auto result = MessageBox::question(this,
QString(),
tr("Entry has unsaved changes"),
@ -970,19 +980,26 @@ void EditEntryWidget::cancel()
}
if (result == MessageBox::Save) {
commitEntry();
m_saved = true;
setModified(false);
}
}
clear();
emit editFinished(m_saved);
emit editFinished(!isModified());
}
void EditEntryWidget::clear()
{
m_entry = nullptr;
m_db.reset();
m_mainUi->titleEdit->setText("");
m_mainUi->passwordEdit->setText("");
m_mainUi->passwordRepeatEdit->setText("");
m_mainUi->urlEdit->setText("");
m_mainUi->notesEdit->clear();
m_entryAttributes->clear();
m_advancedUi->attachmentsWidget->clearAttachments();
m_autoTypeAssoc->clear();
@ -991,22 +1008,6 @@ void EditEntryWidget::clear()
hideMessage();
}
bool EditEntryWidget::hasBeenModified() const
{
// entry has been modified if a history item is to be deleted
if (!m_historyModel->deletedEntries().isEmpty()) {
return true;
}
// check if updating the entry would modify it
auto* entry = new Entry();
entry->copyDataFrom(m_entry.data());
entry->beginUpdate();
updateEntryData(entry);
return entry->endUpdate();
}
void EditEntryWidget::togglePasswordGeneratorButton(bool checked)
{
if (checked) {
@ -1053,7 +1054,7 @@ void EditEntryWidget::insertAttribute()
m_advancedUi->attributesView->setCurrentIndex(index);
m_advancedUi->attributesView->edit(index);
setUnsavedChanges(true);
setModified(true);
}
void EditEntryWidget::editCurrentAttribute()
@ -1064,7 +1065,7 @@ void EditEntryWidget::editCurrentAttribute()
if (index.isValid()) {
m_advancedUi->attributesView->edit(index);
setUnsavedChanges(true);
setModified(true);
}
}
@ -1084,7 +1085,7 @@ void EditEntryWidget::removeCurrentAttribute()
if (result == MessageBox::Remove) {
m_entryAttributes->remove(m_attributesModel->keyByIndex(index));
setUnsavedChanges(true);
setModified(true);
}
}
}
@ -1185,6 +1186,7 @@ void EditEntryWidget::updateAutoTypeEnabled()
m_autoTypeUi->inheritSequenceButton->setEnabled(!m_history && autoTypeEnabled);
m_autoTypeUi->customSequenceButton->setEnabled(!m_history && autoTypeEnabled);
m_autoTypeUi->sequenceEdit->setEnabled(autoTypeEnabled && m_autoTypeUi->customSequenceButton->isChecked());
m_autoTypeUi->openHelpButton->setEnabled(autoTypeEnabled && m_autoTypeUi->customSequenceButton->isChecked());
m_autoTypeUi->assocView->setEnabled(autoTypeEnabled);
m_autoTypeUi->assocAddButton->setEnabled(!m_history);
@ -1205,7 +1207,7 @@ void EditEntryWidget::insertAutoTypeAssoc()
m_autoTypeUi->assocView->setCurrentIndex(newIndex);
loadCurrentAssoc(newIndex);
m_autoTypeUi->windowTitleCombo->setFocus();
setUnsavedChanges(true);
setModified(true);
}
void EditEntryWidget::removeAutoTypeAssoc()
@ -1214,7 +1216,7 @@ void EditEntryWidget::removeAutoTypeAssoc()
if (currentIndex.isValid()) {
m_autoTypeAssoc->remove(currentIndex.row());
setUnsavedChanges(true);
setModified(true);
}
}
@ -1277,7 +1279,7 @@ void EditEntryWidget::restoreHistoryEntry()
QModelIndex index = m_sortModel->mapToSource(m_historyUi->historyView->currentIndex());
if (index.isValid()) {
setForms(m_historyModel->entryFromIndex(index), true);
setUnsavedChanges(true);
setModified(true);
}
}
@ -1291,7 +1293,7 @@ void EditEntryWidget::deleteHistoryEntry()
} else {
m_historyUi->deleteAllButton->setEnabled(false);
}
setUnsavedChanges(true);
setModified(true);
}
}
@ -1299,7 +1301,7 @@ void EditEntryWidget::deleteAllHistoryEntries()
{
m_historyModel->deleteAll();
m_historyUi->deleteAllButton->setEnabled(m_historyModel->rowCount() > 0);
setUnsavedChanges(true);
setModified(true);
}
QMenu* EditEntryWidget::createPresetsMenu()
@ -1352,12 +1354,6 @@ void EditEntryWidget::pickColor()
QColor newColor = QColorDialog::getColor(oldColor);
if (newColor.isValid()) {
setupColorButton(isForeground, newColor);
setUnsavedChanges(true);
setModified(true);
}
}
void EditEntryWidget::setUnsavedChanges(bool hasUnsaved)
{
m_saved = !hasUnsaved;
enableApplyButton(hasUnsaved);
}

View File

@ -68,7 +68,6 @@ public:
QString entryTitle() const;
void clear();
bool hasBeenModified() const;
signals:
void editFinished(bool accepted);
@ -90,6 +89,7 @@ private slots:
void protectCurrentAttribute(bool state);
void revealCurrentAttribute();
void updateAutoTypeEnabled();
void openAutotypeHelp();
void insertAutoTypeAssoc();
void removeAutoTypeAssoc();
void loadCurrentAssoc(const QModelIndex& current);
@ -105,7 +105,6 @@ private slots:
void useExpiryPreset(QAction* action);
void toggleHideNotes(bool visible);
void pickColor();
void setUnsavedChanges(bool hasUnsaved = true);
#ifdef WITH_XC_SSHAGENT
void updateSSHAgent();
void updateSSHAgentAttachment();
@ -147,7 +146,6 @@ private:
bool m_create;
bool m_history;
bool m_saved;
#ifdef WITH_XC_SSHAGENT
bool m_sshAgentEnabled;
KeeAgentSettings m_sshAgentSettings;

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