diff options
52 files changed, 4321 insertions, 1613 deletions
diff --git a/.gitattributes b/.gitattributes index 9f713b466..9d1ecabf4 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,6 +1,7 @@ src/version.h.cmake export-subst .gitattributes export-ignore .gitignore export-ignore +.github export-ignore .travis.yml export-ignore .tx export-ignore snapcraft.yaml export-ignore diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 01b8d6137..67b0e1746 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -1,31 +1,32 @@ -# Contributing to KeePassX Reboot +# Contributing to KeePassXC :+1::tada: First off, thanks for taking the time to contribute! :tada::+1: -The following is a set of guidelines for contributing to KeePassX Reboot on GitHub. +The following is a set of guidelines for contributing to KeePassXC on GitHub. These are just guidelines, not rules. Use your best judgment, and feel free to propose changes to this document in a pull request. -#### Table Of Contents +#### Table of contents [What should I know before I get started?](#what-should-i-know-before-i-get-started) * [Open Source Contribution Policy](#open-source-contribution-policy) -[How Can I Contribute?](#how-can-i-contribute) - * [Feature Requests](#feature-requests) - * [Bug Reports](#bug-reports) - * [Your First Code Contribution](#your-first-code-contribution) - * [Pull Requests](#pull-requests) +[How can I contribute?](#how-can-i-contribute) + * [Feature requests](#feature-requests) + * [Bug reports](#bug-reports) + * [Discuss with the team](#discuss-with-the-team) + * [Your first code contribution](#your-first-code-contribution) + * [Pull requests](#pull-requests) * [Translations](#translations) [Styleguides](#styleguides) - * [Git Branch Strategy](#git_branch_strategy) - * [Git Commit Messages](#git-commit-messages) - * [Coding Styleguide](#coding-styleguide) + * [Git branch strategy](#git-branch-strategy) + * [Git commit messages](#git-commit-messages) + * [Coding styleguide](#coding-styleguide) ## What should I know before I get started? ### Open Source Contribution Policy -[Version 0.3, 2015–11–18](https://medium.com/@jmaynard/a-contribution-policy-for-open-source-that-works-bfc4600c9d83#.i9ntbhmad) +**Source**: [Version 0.3, 2015–11–18](https://medium.com/@jmaynard/a-contribution-policy-for-open-source-that-works-bfc4600c9d83#.i9ntbhmad) #### Policy @@ -49,35 +50,35 @@ If we reject your contribution, it means only that we do not consider it suitabl * 0.3, 2011–11–19: Added “irrevocably” to “we can use” and changed “it” to “your contribution” in the “if rejected” section. Thanks to Patrick Maupin. -## How Can I Contribute? -### Feature Requests +## How can I contribute? +### Feature requests -We're always looking for suggestions to improve our application. If you have a suggestion for improving an existing feature, or would like to suggest a completely new feature for KeePassX Reboot, please use the Issues section or our [Google Groups](https://groups.google.com/forum/#!forum/keepassx-reboot) forum. +We're always looking for suggestions to improve our application. If you have a suggestion to improve an existing feature, or would like to suggest a completely new feature for KeePassXC, please use the [issue tracker on GitHub][issues-section]. For more general discussion, try using our [Google Groups][google-groups] forum. -### Bug Reports +### Bug reports -Our software isn't always perfect, but we strive to always improve our work. You may file bug reports in the Issues section. +Our software isn't always perfect, but we strive to always improve our work. You may file bug reports in the issue tracker. -Before submitting a Bug Report, check if the problem has already been reported. Please refrain from opening a duplicate issue. If you want to highlight a deficiency on an existing issue, simply add a comment. +Before submitting a bug report, check if the problem has already been reported. Please refrain from opening a duplicate issue. If you want to add further information to an existing issue, simply add a comment on that issue. -### Discuss with the Team +### Discuss with the team -You can talk to the KeePassX Reboot Team about Bugs, new feature, Issue and PullRequests at our [Google Groups](https://groups.google.com/forum/#!forum/keepassx-reboot) forum +As with feature requests, you can talk to the KeePassXC team about bugs, new features, other issues and pull requests on the dedicated issue tracker, using the [Google Groups][google-groups] forum, or in the IRC channel on Freenode (`#keepassxc-dev` on `irc.freenode.net`, or use a [webchat link](https://webchat.freenode.net/?channels=%23keepassxc-dev)). -### Your First Code Contribution +### Your first code contribution -Unsure where to begin contributing to KeePassX Reboot? You can start by looking through these `beginner` and `help-wanted` issues: +Unsure where to begin contributing to KeePassXC? You can start by looking through these `beginner` and `help-wanted` issues: -* [Beginner issues][beginner] - issues which should only require a few lines of code, and a test or two. -* [Help wanted issues][help-wanted] - issues which should be a bit more involved than `beginner` issues. +* [Beginner issues][beginner] – issues which should only require a few lines of code, and a test or two. +* ['Help wanted' issues][help-wanted] – issues which should be a bit more involved than `beginner` issues. -Both issue lists are sorted by total number of comments. While not perfect, number of comments is a reasonable proxy for impact a given change will have. +Both issue lists are sorted by total number of comments. While not perfect, looking at the number of comments on an issue can give a general idea of how much an impact a given change will have. -### Pull Requests +### Pull requests Along with our desire to hear your feedback and suggestions, we're also interested in accepting direct assistance in the form of code. -All pull requests must comply with the above requirements and with the [Styleguides](#styleguides). +All pull requests must comply with the above requirements and with the [styleguides](#styleguides). ### Translations @@ -86,19 +87,20 @@ Please join an existing language team or request a new one if there is none. ## Styleguides -### Git Branch Strategy +### Git branch strategy The Branch Strategy is based on [git-flow-lite](http://nvie.com/posts/a-successful-git-branching-model/). -* **master** -> always points to the last release published -* **develop** -> points to the next planned release, tested and reviewed code -* **feature/**[name] -> points to brand new feature in codebase, candidate for merge into develop (subject to rebase) +* **master** – points to the latest public release +* **develop** – points to the development of the next release, contains tested and reviewed code +* **feature/**[name] – points to a branch with a new feature, one which is candidate for merge into develop (subject to rebase) +* **hotfix/**[id]-[description] – points to a branch with a fix for a particular issue ID -### Git Commit Messages +### Git commit messages * Use the present tense ("Add feature" not "Added feature") -* Use the imperative mood ("Move cursor to..." not "Moves cursor to...") +* Use the imperative mood ("Move cursor to…" not "Moves cursor to…") * Limit the first line to 72 characters or less * Reference issues and pull requests liberally * When only changing documentation, include `[ci skip]` in the commit description @@ -114,21 +116,21 @@ The Branch Strategy is based on [git-flow-lite](http://nvie.com/posts/a-successf * :lock: `:lock:` when dealing with security -### Coding Styleguide +### Coding styleguide This project follows the [Qt Coding Style](https://wiki.qt.io/Qt_Coding_Style). All submissions are expected to follow this style. -In particular Code must follow the following specific rules: +In particular, code must stick to the following rules: -#### Naming Convention +#### Naming convention `lowerCamelCase` -For names made of only one word, the fist letter is lowercase. -For names made of multiple concatenated words, the first letter is lowercase and each subsequent concatenated word is capitalized. +For names made of only one word, the first letter should be lowercase. +For names made of multiple concatenated words, the first letter of the whole is lowercase, and the first letter of each subsequent word is capitalized. #### Indention -For C++ files (.cpp .h): 4 spaces -For Qt-UI files (.ui): 2 spaces +For **C++ files** (*.cpp .h*): 4 spaces +For **Qt-UI files** (*.ui*): 2 spaces #### Pointers ```c @@ -165,9 +167,8 @@ Use prefix: `m_*` Example: `m_variable` -#### GUI Widget names -Widget names must be related to the desired program behaviour. -Preferably end the name with the Widget Classname +#### GUI widget names +Widget names must be related to the desired program behavior, and preferably end with the widget's classname. Example: `<widget class="QCheckBox" name="rememberCheckBox">` @@ -175,3 +176,5 @@ Example: `<widget class="QCheckBox" name="rememberCheckBox">` [beginner]:https://github.com/keepassxreboot/keepassx/issues?q=is%3Aopen+is%3Aissue+label%3Abeginner+label%3A%22help+wanted%22+sort%3Acomments-desc [help-wanted]:https://github.com/keepassxreboot/keepassx/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22+sort%3Acomments-desc +[issues-section]:https://github.com/keepassxreboot/keepassxc/issues +[google-groups]:https://groups.google.com/forum/#!forum/keepassx-reboot diff --git a/AppImage-Recipe.sh b/AppImage-Recipe.sh index 9575f077b..dc30cb696 100755 --- a/AppImage-Recipe.sh +++ b/AppImage-Recipe.sh @@ -39,26 +39,54 @@ mkdir -p $APP.AppDir wget -q https://github.com/probonopd/AppImages/raw/master/functions.sh -O ./functions.sh . ./functions.sh +LIB_DIR=./usr/lib +if [ -d ./usr/lib/x86_64-linux-gnu ]; then + LIB_DIR=./usr/lib/x86_64-linux-gnu +fi + cd $APP.AppDir cp -a ../../bin-release/* . -mv ./usr/local/* ./usr -rmdir ./usr/local -patch_strings_in_file /usr/local ./ +cp -a ./usr/local/* ./usr +rm -R ./usr/local +rmdir ./opt 2> /dev/null +patch_strings_in_file /usr/local ././ patch_strings_in_file /usr ./ +# bundle Qt platform plugins and themes +QXCB_PLUGIN="$(find /usr/lib -name 'libqxcb.so' 2> /dev/null)" +if [ "$QXCB_PLUGIN" == "" ]; then + QXCB_PLUGIN="$(find /opt/qt*/plugins -name 'libqxcb.so' 2> /dev/null)" +fi +QT_PLUGIN_PATH="$(dirname $(dirname $QXCB_PLUGIN))" +mkdir -p ".${QT_PLUGIN_PATH}/platforms" +cp "$QXCB_PLUGIN" ".${QT_PLUGIN_PATH}/platforms/" + get_apprun copy_deps delete_blacklisted +# remove dbus and systemd libs as they are not blacklisted +find . -name libdbus-1.so.3 -exec rm {} \; +find . -name libsystemd.so.0 -exec rm {} \; + get_desktop get_icon +cat << EOF > ./usr/bin/keepassxc_env +#!/usr/bin/env bash +#export QT_QPA_PLATFORMTHEME=gtk2 +export LD_LIBRARY_PATH="../opt/qt58/lib:\${LD_LIBRARY_PATH}" +export QT_PLUGIN_PATH="..${QT_PLUGIN_PATH}" +exec keepassxc "\$@" +EOF +chmod +x ./usr/bin/keepassxc_env +sed -i 's/Exec=keepassxc/Exec=keepassxc_env/' keepassxc.desktop get_desktopintegration $LOWERAPP GLIBC_NEEDED=$(glibc_needed) cd .. -generate_appimage +generate_type2_appimage mv ../out/*.AppImage .. rmdir ../out > /dev/null 2>&1 @@ -1,3 +1,13 @@ +2.1.1 (2017-02-06) +========================= + +- Enabled HTTP plugin build; plugin is disabled by default and limited to localhost [#147] +- Escape HTML in dialog boxes [#247] +- Corrected crashes in favicon download and password generator [#233, #226] +- Increase font size of password meter [#228] +- Fixed compatibility with Qt 5.8 [#211] +- Use consistent button heights in password generator [#229] + 2.1.0 (2017-01-22) ========================= diff --git a/CMakeLists.txt b/CMakeLists.txt index 3914049e1..3b5df29b1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -38,8 +38,8 @@ option(WITH_XC_AUTOTYPE "Include Autotype." OFF) option(WITH_XC_HTTP "Include KeePassHTTP." OFF) option(WITH_XC_YUBIKEY "Include Yubikey support." OFF) -set(KEEPASSXC_VERSION "2.1.0") -set(KEEPASSXC_VERSION_NUM "2.1.0") +set(KEEPASSXC_VERSION "2.1.1") +set(KEEPASSXC_VERSION_NUM "2.1.1") if("${CMAKE_C_COMPILER}" MATCHES "clang$" OR "${CMAKE_C_COMPILER_ID}" STREQUAL "Clang") set(CMAKE_COMPILER_IS_CLANG 1) @@ -172,9 +172,13 @@ set(CMAKE_AUTOMOC ON) # Make sure we don't enable asserts there. set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS_NONE QT_NO_DEBUG) +find_package(LibGPGError REQUIRED) + find_package(Gcrypt 1.6.0 REQUIRED) -find_package(LibMicroHTTPD REQUIRED) +if (WITH_XC_HTTP) + find_package(LibMicroHTTPD REQUIRED) +endif(WITH_XC_HTTP) find_package(ZLIB REQUIRED) diff --git a/Dockerfile b/Dockerfile index 3aee19e3c..9623b60dd 100644 --- a/Dockerfile +++ b/Dockerfile @@ -14,21 +14,41 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. -FROM ubuntu:16.04 +FROM ubuntu:14.04 -RUN set -x && apt-get update RUN set -x \ + && apt-get update \ + && apt-get install --yes software-properties-common + +RUN set -x \ + && add-apt-repository --yes ppa:beineri/opt-qt58-trusty + +RUN set -x \ + && apt-get update \ && apt-get install --yes \ + g++ \ cmake \ libgcrypt20-dev \ - qtbase5-dev \ - qttools5-dev-tools \ + qt58base \ + qt58tools \ + qt58x11extras \ libmicrohttpd-dev \ - libqt5x11extras5-dev \ libxi-dev \ libxtst-dev \ - zlib1g-dev + zlib1g-dev \ + wget \ + file \ + fuse \ + python +RUN set -x \ + && apt-get install --yes mesa-common-dev + VOLUME /keepassxc/src VOLUME /keepassxc/out WORKDIR /keepassxc + +ENV CMAKE_PREFIX_PATH=/opt/qt58/lib/cmake +ENV LD_LIBRARY_PATH=/opt/qt58/lib +RUN set -x \ + && echo /opt/qt58/lib > /etc/ld.so.conf.d/qt58.conf @@ -3,57 +3,63 @@ [![Travis Build Status](https://travis-ci.org/keepassxreboot/keepassxc.svg?branch=develop)](https://travis-ci.org/keepassxreboot/keepassxc) [![Coverage Status](https://coveralls.io/repos/github/keepassxreboot/keepassxc/badge.svg)](https://coveralls.io/github/keepassxreboot/keepassxc) ## About +KeePassXC is a fork of [KeePassX](https://www.keepassx.org/) that [aims to incorporate stalled pull requests, features, and bug fixes that have never made it into the main KeePassX repository](https://github.com/keepassxreboot/keepassx/issues/43). -Fork of [KeePassX](https://www.keepassx.org/) that [aims to incorporate stalled Pull Requests, features, and bug fixes that are not being incorporated into the main KeePassX baseline](https://github.com/keepassxreboot/keepassx/issues/43). +## Additional features compared to KeePassX +- Autotype on all three major platforms (Linux, Windows, OS X) +- Stand-alone password generator +- Password strength meter +- Use website's favicons as entry icons +- Merging of databases +- Automatic reload when the database changed on disk +- KeePassHTTP support for use with [PassIFox](https://addons.mozilla.org/en-us/firefox/addon/passifox/) in Mozilla Firefox and [chromeIPass](https://chrome.google.com/webstore/detail/chromeipass/ompiailgknfdndiefoaoiligalphfdae) in Google Chrome or Chromium. -#### Additional Reboot Features - - keepasshttp support for use with [PassIFox](https://addons.mozilla.org/en-us/firefox/addon/passifox/) for Mozilla Firefox and [chromeIPass](https://chrome.google.com/webstore/detail/chromeipass/ompiailgknfdndiefoaoiligalphfdae) for Google Chrome. - -KeePassHttp implementation has been forked from jdachtera's repository, which in turn was based on code from code with Francois Ferrand's [keepassx-http](https://gitorious.org/keepassx/keepassx-http/source/master) repository. - -This is a rebuild from [denk-mal's keepasshttp](https://github.com/denk-mal/keepassx.git) that brings it forward to Qt5 and KeePassX v2.x. +For a full list of features and changes, read the [CHANGELOG](CHANGELOG) document. +### Note about KeePassHTTP +KeePassHTTP is not a highly secure protocol and has certain flaw which allow an attacker to decrypt your passwords when they manage to intercept communication between a KeePassHTTP server and PassIFox/chromeIPass over a network connection (see [here](https://github.com/pfn/keepasshttp/issues/258) and [here](https://github.com/keepassxreboot/keepassxc/issues/147)). KeePassXC therefore strictly limits communication between itself and the browser plugin to your local computer. As long as your computer is not compromised, your passwords are fairly safe that way, but still use it at your own risk! ### Installation +Pre-compiled binaries can be found on the [downloads page](https://keepassxc.org/download). Additionally, individual Linux distributions may ship their own versions, so please check out your distribution's package list to see if KeePassXC is available. -Right now KeePassXC does not have a precompiled executable or an installation package.<br/> -So you must install it from its source code. - -**More detailed instructions are available in the INSTALL file or at the [Wiki page](https://github.com/keepassxreboot/keepassx/wiki/Install-Instruction-from-Source).** - -First you must download the KeePassXC source code as ZIP file or with Git. - -Generally you can build and install KeePassXC with the following commands from a Terminal in the KeePassXC folder -``` -mkdir build -cd build -cmake -DWITH_TESTS=OFF .. -make -sudo make install -``` +### Building KeePassXC yourself +*More detailed instructions are available in the INSTALL file or on the [Wiki page](https://github.com/keepassxreboot/keepassx/wiki/Install-Instruction-from-Source).* -### Clone Repository +First, you must download the KeePassXC [source tarball](https://keepassxc.org/download#source) or check out the latest version from our [Git repository](https://github.com/keepassxreboot/keepassxc). -Clone the repository to a suitable location where you can extend and build this project. +To clone the project from Git, `cd` to a suitable location and run ```bash git clone https://github.com/keepassxreboot/keepassxc.git ``` -**Note:** This will clone the entire contents of the repository at the HEAD revision. +This will clone the entire contents of the repository and check out the current `develop` branch. -To update the project from within the project's folder you can run the following command: +To update the project from within the project's folder, you can run the following command: ```bash git pull ``` +Once you have downloaded the source code, you can `cd` into the source code directory and build and install KeePassXC with + +``` +mkdir build +cd build +cmake -DWITH_TESTS=OFF .. +make -j8 +sudo make install +``` + +To enable autotype, add `-DWITH_XC_AUTOTYPE=ON` to the `cmake` command. KeePassHTTP support is compiled in by adding `-DWITH_XC_HTTP=ON`. If these options are not specified, KeePassXC will be built without these plugins. + ### Contributing -We're always looking for suggestions to improve our application. If you have a suggestion for improving an existing feature, -or would like to suggest a completely new feature for KeePassX Reboot, please use the [Issues](https://github.com/keepassxreboot/keepassxc/issues) section or our [Google Groups](https://groups.google.com/forum/#!forum/keepassx-reboot) forum. +We are always looking for suggestions how to improve our application. If you find any bugs or have an idea for a new feature, please let us know by opening a report in our [issue tracker](https://github.com/keepassxreboot/keepassxc/issues) on GitHub or write to our [Google Groups](https://groups.google.com/forum/#!forum/keepassx-reboot) forum. + +You can of course also directly contribute your own code. We are happy to accept your pull requests. -Please review the [CONTRIBUTING](.github/CONTRIBUTING.md) document for further information. +Please read the [CONTRIBUTING](.github/CONTRIBUTING.md) document for further information. diff --git a/cmake/FindLibGPGError.cmake b/cmake/FindLibGPGError.cmake new file mode 100644 index 000000000..fe9ef9123 --- /dev/null +++ b/cmake/FindLibGPGError.cmake @@ -0,0 +1,9 @@ + +find_path(GPGERROR_INCLUDE_DIR gpg-error.h) + +find_library(GPGERROR_LIBRARIES gpg-error) + +mark_as_advanced(GPGERROR_LIBRARIES GPGERROR_INCLUDE_DIR) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(LibGPGError DEFAULT_MSG GPGERROR_LIBRARIES GPGERROR_INCLUDE_DIR) diff --git a/make_release.sh b/make_release.sh deleted file mode 100755 index 19c661b38..000000000 --- a/make_release.sh +++ /dev/null @@ -1,350 +0,0 @@ -#!/usr/bin/env bash -# -# KeePassXC Release Preparation Helper -# Copyright (C) 2017 KeePassXC team <https://keepassxc.org/> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 2 or (at your option) -# version 3 of the License. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. - -echo -e "\e[1m\e[32mKeePassXC\e[0m Release Preparation Helper" -echo -e "Copyright (C) 2017 KeePassXC Team <https://keepassxc.org/>\n" - - -# default values -RELEASE_NAME="" -APP_NAME="KeePassXC" -APP_NAME_LOWER="keepassxc" -SRC_DIR="." -GPG_KEY="CFB4C2166397D0D2" -GPG_GIT_KEY="" -OUTPUT_DIR="release" -BRANCH="" -RELEASE_BRANCH="master" -TAG_NAME="" -BUILD_SOURCES=false -DOCKER_IMAGE="" -DOCKER_CONTAINER_NAME="${APP_NAME_LOWER}-build-container" -CMAKE_OPTIONS="" -COMPILER="g++" -MAKE_OPTIONS="-j8" -BUILD_PLUGINS="autotype" -INSTALL_PREFIX="/usr/local" - -ORIG_BRANCH="$(git rev-parse --abbrev-ref HEAD 2> /dev/null)" -ORIG_CWD="$(pwd)" - - -# helper functions -printUsage() { - echo -e "\e[1mUsage:\e[0m $(basename $0) [options]" - cat << EOF - -Options: - -v, --version Release version number or name (required) - -a, --app-name Application name (default: '${APP_NAME}') - -s, --source-dir Source directory (default: '${SRC_DIR}') - -k, --gpg-key GPG key used to sign the release tarball - (default: '${GPG_KEY}') - -g, --gpg-git-key GPG key used to sign the merge commit and release tag, - leave empty to let Git choose your default key - (default: '${GPG_GIT_KEY}') - -o, --output-dir Output directory where to build the release - (default: '${OUTPUT_DIR}') - --develop-branch Development branch to merge from (default: 'release/VERSION') - --release-branch Target release branch to merge to (default: '${RELEASE_BRANCH}') - -t, --tag-name Override release tag name (defaults to version number) - -b, --build Build sources after exporting release - -d, --docker-image Use the specified Docker image to compile the application. - The image must have all required build dependencies installed. - This option has no effect if --build is not set. - --container-name Docker container name (default: '${DOCKER_CONTAINER_NAME}') - The container must not exist already - -c, --cmake-options Additional CMake options for compiling the sources - --compiler Compiler to use (default: '${COMPILER}') - -m, --make-options Make options for compiling sources (default: '${MAKE_OPTIONS}') - -i, --install-prefix Install prefix (default: '${INSTALL_PREFIX}') - -p, --plugins Space-separated list of plugins to build - (default: ${BUILD_PLUGINS}) - -h, --help Show this help - -EOF -} - -logInfo() { - echo -e "\e[1m[ \e[34mINFO\e[39m ]\e[0m $1" -} - -logError() { - echo -e "\e[1m[ \e[31mERROR\e[39m ]\e[0m $1" >&2 -} - -exitError() { - logError "$1" - if [ "" != "$ORIG_BRANCH" ]; then - git checkout "$ORIG_BRANCH" > /dev/null 2>&1 - fi - cd "$ORIG_CWD" - exit 1 -} - - -# parse command line options -while [ $# -ge 1 ]; do - arg="$1" - - case "$arg" in - -a|--app-name) - APP_NAME="$2" - shift ;; - - -s|--source-dir) - SRC_DIR"$2" - shift ;; - - -v|--version) - RELEASE_NAME="$2" - shift ;; - - -k|--gpg-key) - GPG_KEY="$2" - shift ;; - - -g|--gpg-git-key) - GPG_GIT_KEY="$2" - shift ;; - - -o|--output-dir) - OUTPUT_DIR="$2" - shift ;; - - --develop-branch) - BRANCH="$2" - shift ;; - - --release-branch) - RELEASE_BRANCH="$2" - shift ;; - - -t|--tag-name) - TAG_NAME="$2" - shift ;; - - -b|--build) - BUILD_SOURCES=true ;; - - -d|--docker-image) - DOCKER_IMAGE="$2" - shift ;; - - --container-name) - DOCKER_CONTAINER_NAME="$2" - shift ;; - - -c|--cmake-options) - CMAKE_OPTIONS="$2" - shift ;; - - -m|--make-options) - MAKE_OPTIONS="$2" - shift ;; - - --compiler) - COMPILER="$2" - shift ;; - - -p|--plugins) - BUILD_PLUGINS="$2" - shift ;; - - -h|--help) - printUsage - exit ;; - - *) - logError "Unknown option '$arg'\n" - printUsage - exit 1 ;; - esac - shift -done - - -if [ "" == "$RELEASE_NAME" ]; then - logError "Missing arguments, --version is required!\n" - printUsage - exit 1 -fi - -if [ "" == "$TAG_NAME" ]; then - TAG_NAME="$RELEASE_NAME" -fi -if [ "" == "$BRANCH" ]; then - BRANCH="release/${RELEASE_NAME}" -fi -APP_NAME_LOWER="$(echo "$APP_NAME" | tr '[:upper:]' '[:lower:]')" -APP_NAME_UPPER="$(echo "$APP_NAME" | tr '[:lower:]' '[:upper:]')" - -SRC_DIR="$(realpath "$SRC_DIR")" -OUTPUT_DIR="$(realpath "$OUTPUT_DIR")" -if [ ! -d "$SRC_DIR" ]; then - exitError "Source directory '${SRC_DIR}' does not exist!" -fi - -logInfo "Changing to source directory..." -cd "${SRC_DIR}" - -logInfo "Performing basic checks..." - -if [ -e "$OUTPUT_DIR" ]; then - exitError "Output directory '$OUTPUT_DIR' already exists. Please choose a different location!" -fi - -if [ ! -d .git ] || [ ! -f CHANGELOG ]; then - exitError "Source directory is not a valid Git repository!" -fi - -git tag | grep -q "$RELEASE_NAME" -if [ $? -eq 0 ]; then - exitError "Release '$RELEASE_NAME' already exists!" -fi - -git diff-index --quiet HEAD -- -if [ $? -ne 0 ]; then - exitError "Current working tree is not clean! Please commit or unstage any changes." -fi - -git checkout "$BRANCH" > /dev/null 2>&1 -if [ $? -ne 0 ]; then - exitError "Source branch '$BRANCH' does not exist!" -fi - -grep -q "${APP_NAME_UPPER}_VERSION \"${RELEASE_NAME}\"" CMakeLists.txt -if [ $? -ne 0 ]; then - exitError "${APP_NAME_UPPER}_VERSION version not updated to '${RELEASE_NAME}' in CMakeLists.txt!" -fi - -grep -q "${APP_NAME_UPPER}_VERSION_NUM \"${RELEASE_NAME}\"" CMakeLists.txt -if [ $? -ne 0 ]; then - exitError "${APP_NAME_UPPER}_VERSION_NUM version not updated to '${RELEASE_NAME}' in CMakeLists.txt!" -fi - -if [ ! -f CHANGELOG ]; then - exitError "No CHANGELOG file found!" -fi - -grep -qPzo "${RELEASE_NAME} \(\d{4}-\d{2}-\d{2}\)\n=+\n" CHANGELOG -if [ $? -ne 0 ]; then - exitError "CHANGELOG does not contain any information about the '${RELEASE_NAME}' release!" -fi - -git checkout "$RELEASE_BRANCH" > /dev/null 2>&1 -if [ $? -ne 0 ]; then - exitError "Release branch '$RELEASE_BRANCH' does not exist!" -fi - -logInfo "All checks pass, getting our hands dirty now!" - -logInfo "Merging '${BRANCH}' into '${RELEASE_BRANCH}'..." - -CHANGELOG=$(grep -Pzo "(?<=${RELEASE_NAME} \(\d{4}-\d{2}-\d{2}\)\n)=+\n\n(?:.|\n)+?\n(?=\n)" \ - CHANGELOG | grep -Pzo '(?<=\n\n)(.|\n)+' | tr -d \\0) -COMMIT_MSG="Release ${RELEASE_NAME}" - -git merge "$BRANCH" --no-ff -m "$COMMIT_MSG" -m "${CHANGELOG}" "$BRANCH" -S"$GPG_GIT_KEY" - -logInfo "Creating tag '${RELEASE_NAME}'..." -if [ "" == "$GPG_GIT_KEY" ]; then - git tag -a "$RELEASE_NAME" -m "$COMMIT_MSG" -m "${CHANGELOG}" -s -else - git tag -a "$RELEASE_NAME" -m "$COMMIT_MSG" -m "${CHANGELOG}" -s -u "$GPG_GIT_KEY" -fi - -logInfo "Merge done, creating target directory..." -mkdir -p "$OUTPUT_DIR" - -if [ $? -ne 0 ]; then - exitError "Failed to create output directory!" -fi - -logInfo "Creating source tarball..." -TARBALL_NAME="${APP_NAME_LOWER}-${RELEASE_NAME}-src.tar.bz2" -git archive --format=tar "$RELEASE_BRANCH" --prefix="${APP_NAME_LOWER}-${RELEASE_NAME}/" \ - | bzip2 -9 > "${OUTPUT_DIR}/${TARBALL_NAME}" - - -if $BUILD_SOURCES; then - logInfo "Creating build directory..." - mkdir -p "${OUTPUT_DIR}/build-release" - mkdir -p "${OUTPUT_DIR}/bin-release" - cd "${OUTPUT_DIR}/build-release" - - logInfo "Configuring sources..." - for p in $BUILD_PLUGINS; do - CMAKE_OPTIONS="${CMAKE_OPTIONS} -DWITH_XC_$(echo $p | tr '[:lower:]' '[:upper:]')=On" - done - - if [ "$COMPILER" == "g++" ]; then - export CC=gcc - elif [ "$COMPILER" == "clang++" ]; then - export CC=clang - fi - export CXX="$COMPILER" - - if [ "" == "$DOCKER_IMAGE" ]; then - cmake -DCMAKE_BUILD_TYPE=Release -DWITH_TESTS=Off $CMAKE_OPTIONS \ - -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" "$SRC_DIR" - - logInfo "Compiling sources..." - make $MAKE_OPTIONS - - logInfo "Installing to bin dir..." - make DESTDIR="${OUTPUT_DIR}/bin-release" install/strip - else - logInfo "Launching Docker container to compile sources..." - - docker run --name "$DOCKER_CONTAINER_NAME" --rm \ - -e "CC=${CC}" -e "CXX=${CXX}" \ - -v "$(realpath "$SRC_DIR"):/keepassxc/src:ro" \ - -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 \ - -DCMAKE_INSTALL_PREFIX=\"${INSTALL_PREFIX}\" /keepassxc/src && \ - make $MAKE_OPTIONS && make DESTDIR=/keepassxc/out/bin-release install/strip" - - logInfo "Build finished, Docker container terminated." - fi - - logInfo "Creating AppImage..." - ${SRC_DIR}/AppImage-Recipe.sh "$APP_NAME" "$RELEASE_NAME" - - cd .. - logInfo "Signing source tarball..." - gpg --output "${TARBALL_NAME}.sig" --armor --local-user "$GPG_KEY" --detach-sig "$TARBALL_NAME" - - logInfo "Signing AppImage..." - APPIMAGE_NAME="${APP_NAME}-${RELEASE_NAME}-x86_64.AppImage" - gpg --output "${APPIMAGE_NAME}.sig" --armor --local-user "$GPG_KEY" --detach-sig "$APPIMAGE_NAME" - - logInfo "Creating digests..." - sha256sum "$TARBALL_NAME" > "${TARBALL_NAME}.DIGEST" - sha256sum "$APPIMAGE_NAME" > "${APPIMAGE_NAME}.DIGEST" -fi - -logInfo "Leaving source directory..." -cd "$ORIG_CWD" -git checkout "$ORIG_BRANCH" > /dev/null 2>&1 - -logInfo "All done!" -logInfo "Please merge the release branch back into the develop branch now and then push your changes." -logInfo "Don't forget to also push the tags using \e[1mgit push --tags\e[0m." diff --git a/release-tool b/release-tool new file mode 100755 index 000000000..7bc54cda0 --- /dev/null +++ b/release-tool @@ -0,0 +1,682 @@ +#!/usr/bin/env bash +# +# KeePassXC Release Preparation Helper +# Copyright (C) 2017 KeePassXC team <https://keepassxc.org/> +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 or (at your option) +# version 3 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +echo -e "\e[1m\e[32mKeePassXC\e[0m Release Preparation Helper" +echo -e "Copyright (C) 2017 KeePassXC Team <https://keepassxc.org/>\n" + + +# ----------------------------------------------------------------------- +# global default values +# ----------------------------------------------------------------------- +RELEASE_NAME="" +APP_NAME="KeePassXC" +SRC_DIR="." +GPG_KEY="CFB4C2166397D0D2" +GPG_GIT_KEY="" +OUTPUT_DIR="release" +SOURCE_BRANCH="" +TARGET_BRANCH="master" +TAG_NAME="" +DOCKER_IMAGE="" +DOCKER_CONTAINER_NAME="keepassxc-build-container" +CMAKE_OPTIONS="" +COMPILER="g++" +MAKE_OPTIONS="-j8" +BUILD_PLUGINS="autotype" +INSTALL_PREFIX="/usr/local" +BUILD_SOURCE_TARBALL=true +ORIG_BRANCH="" +ORIG_CWD="$(pwd)" + +# ----------------------------------------------------------------------- +# helper functions +# ----------------------------------------------------------------------- +printUsage() { + local cmd + if [ "" == "$1" ] || [ "help" == "$1" ]; then + cmd="COMMAND" + elif [ "merge" == "$1" ] || [ "build" == "$1" ] || [ "sign" == "$1" ]; then + cmd="$1" + else + logError "Unknown command: '$1'\n" + cmd="COMMAND" + fi + + echo -e "\e[1mUsage:\e[0m $(basename $0) $cmd [options]" + + if [ "COMMAND" == "$cmd" ]; then + cat << EOF + +Commands: + merge Merge release branch into main branch and create release tags + build Build and package binary release from sources + sign Sign previously compiled release packages + help Show help for the given command +EOF + elif [ "merge" == "$cmd" ]; then + cat << EOF + +Merge release branch into main branch and create release tags + +Options: + -v, --version Release version number or name (required) + -a, --app-name Application name (default: '${APP_NAME}') + -s, --source-dir Source directory (default: '${SRC_DIR}') + -g, --gpg-key GPG key used to sign the merge commit and release tag, + leave empty to let Git choose your default key + (default: '${GPG_GIT_KEY}') + -r, --release-branch Source release branch to merge from (default: 'release/VERSION') + --target-branch Target branch to merge to (default: '${TARGET_BRANCH}') + -t, --tag-name Override release tag name (defaults to version number) + -h, --help Show this help +EOF + elif [ "build" == "$cmd" ]; then + cat << EOF + +Build and package binary release from sources + +Options: + -v, --version Release version number or name (required) + -a, --app-name Application name (default: '${APP_NAME}') + -s, --source-dir Source directory (default: '${SRC_DIR}') + -o, --output-dir Output directory where to build the release + (default: '${OUTPUT_DIR}') + -t, --tag-name Release tag to check out (defaults to version number) + -b, --build Build sources after exporting release + -d, --docker-image Use the specified Docker image to compile the application. + The image must have all required build dependencies installed. + This option has no effect if --build is not set. + --container-name Docker container name (default: '${DOCKER_CONTAINER_NAME}') + The container must not exist already + -c, --cmake-options Additional CMake options for compiling the sources + --compiler Compiler to use (default: '${COMPILER}') + -m, --make-options Make options for compiling sources (default: '${MAKE_OPTIONS}') + -i, --install-prefix Install prefix (default: '${INSTALL_PREFIX}') + -p, --plugins Space-separated list of plugins to build + (default: ${BUILD_PLUGINS}) + -n, --no-source-tarball Don't build source tarball + -h, --help Show this help +EOF + elif [ "sign" == "$cmd" ]; then + cat << EOF + +Sign previously compiled release packages + +Options: + -f, --files Files to sign (required) + -g, --gpg-key GPG key used to sign the files (default: '${GPG_KEY}') + -h, --help Show this help +EOF + fi +} + +logInfo() { + echo -e "\e[1m[ \e[34mINFO\e[39m ]\e[0m $1" +} + +logError() { + echo -e "\e[1m[ \e[31mERROR\e[39m ]\e[0m $1" >&2 +} + +init() { + ORIG_CWD="$(pwd)" + cd "$SRC_DIR" > /dev/null 2>&1 + ORIG_BRANCH="$(git rev-parse --abbrev-ref HEAD 2> /dev/null)" + cd "$ORIG_CWD" +} + +cleanup() { + logInfo "Checking out original branch..." + if [ "" != "$ORIG_BRANCH" ]; then + git checkout "$ORIG_BRANCH" > /dev/null 2>&1 + fi + logInfo "Leaving source directory..." + cd "$ORIG_CWD" +} + +exitError() { + logError "$1" + cleanup + exit 1 +} + +exitTrap() { + exitError "Existing upon user request..." +} + +checkSourceDirExists() { + if [ ! -d "$SRC_DIR" ]; then + exitError "Source directory '${SRC_DIR}' does not exist!" + fi +} + +checkOutputDirDoesNotExist() { + if [ -e "$OUTPUT_DIR" ]; then + exitError "Output directory '$OUTPUT_DIR' already exists. Please choose a different location!" + fi +} + +checkGitRepository() { + if [ ! -d .git ] || [ ! -f CHANGELOG ]; then + exitError "Source directory is not a valid Git repository!" + fi +} + +checkTagExists() { + git tag | grep -q "$TAG_NAME" + if [ $? -ne 0 ]; then + exitError "Tag '${TAG_NAME}' does not exist!" + fi +} + +checkReleaseDoesNotExist() { + git tag | grep -q "$TAG_NAME" + if [ $? -eq 0 ]; then + exitError "Release '$RELEASE_NAME' (tag: '$TAG_NAME') already exists!" + fi +} + +checkWorkingTreeClean() { + git diff-index --quiet HEAD -- + if [ $? -ne 0 ]; then + exitError "Current working tree is not clean! Please commit or unstage any changes." + fi +} + +checkSourceBranchExists() { + git rev-parse "$SOURCE_BRANCH" > /dev/null 2>&1 + if [ $? -ne 0 ]; then + exitError "Source branch '$SOURCE_BRANCH' does not exist!" + fi +} + +checkTargetBranchExists() { + git rev-parse "$TARGET_BRANCH" > /dev/null 2>&1 + if [ $? -ne 0 ]; then + exitError "Target branch '$TARGET_BRANCH' does not exist!" + fi +} + +checkVersionInCMake() { + local app_name_upper="$(echo "$APP_NAME" | tr '[:lower:]' '[:upper:]')" + + grep -q "${app_name_upper}_VERSION \"${RELEASE_NAME}\"" CMakeLists.txt + if [ $? -ne 0 ]; then + exitError "${app_name_upper}_VERSION version not updated to '${RELEASE_NAME}' in CMakeLists.txt!" + fi + + grep -q "${app_name_upper}_VERSION_NUM \"${RELEASE_NAME}\"" CMakeLists.txt + if [ $? -ne 0 ]; then + exitError "${app_name_upper}_VERSION_NUM version not updated to '${RELEASE_NAME}' in CMakeLists.txt!" + fi +} + +checkChangeLog() { + if [ ! -f CHANGELOG ]; then + exitError "No CHANGELOG file found!" + fi + + grep -qPzo "${RELEASE_NAME} \(\d{4}-\d{2}-\d{2}\)\n=+\n" CHANGELOG + if [ $? -ne 0 ]; then + exitError "CHANGELOG does not contain any information about the '${RELEASE_NAME}' release!" + fi +} + +checkTransifexCommandExists() { + command -v tx > /dev/null + if [ 0 -ne $? ]; then + exitError "Transifex tool 'tx' not installed! Please install it using 'pip install transifex-client'" + fi +} + +# re-implement realpath for OS X (thanks mschrag) +# https://superuser.com/questions/205127/ +if $(command -v realpath > /dev/null); then + realpath() { + pushd . > /dev/null + if [ -d "$1" ]; then + cd "$1" + dirs -l +0 + else + cd "$(dirname "$1")" + cur_dir=$(dirs -l +0) + + if [ "$cur_dir" == "/" ]; then + echo "$cur_dir$(basename "$1")" + else + echo "$cur_dir/$(basename "$1")" + fi + fi + popd > /dev/null + } +fi + + +trap exitTrap SIGINT SIGTERM + + +# ----------------------------------------------------------------------- +# merge command +# ----------------------------------------------------------------------- +merge() { + while [ $# -ge 1 ]; do + local arg="$1" + case "$arg" in + -v|--version) + RELEASE_NAME="$2" + shift ;; + + -a|--app-name) + APP_NAME="$2" + shift ;; + + -s|--source-dir) + SRC_DIR="$2" + shift ;; + + -g|--gpg-key) + GPG_GIT_KEY="$2" + shift ;; + + -r|--release-branch) + SOURCE_BRANCH="$2" + shift ;; + + --target-branch) + TARGET_BRANCH="$2" + shift ;; + + -t|--tag-name) + TAG_NAME="$2" + shift ;; + + -h|--help) + printUsage "merge" + exit ;; + + *) + logError "Unknown option '$arg'\n" + printUsage "merge" + exit 1 ;; + esac + shift + done + + if [ "" == "$RELEASE_NAME" ]; then + logError "Missing arguments, --version is required!\n" + printUsage "merge" + exit 1 + fi + + if [ "" == "$TAG_NAME" ]; then + TAG_NAME="$RELEASE_NAME" + fi + + if [ "" == "$SOURCE_BRANCH" ]; then + SOURCE_BRANCH="release/${RELEASE_NAME}" + fi + + init + + SRC_DIR="$(realpath "$SRC_DIR")" + + logInfo "Performing basic checks..." + + checkSourceDirExists + + logInfo "Changing to source directory..." + cd "${SRC_DIR}" + + checkTransifexCommandExists + checkGitRepository + checkReleaseDoesNotExist + checkWorkingTreeClean + checkSourceBranchExists + checkTargetBranchExists + checkVersionInCMake + checkChangeLog + + logInfo "All checks pass, getting our hands dirty now!" + + logInfo "Checking out source branch..." + git checkout "$SOURCE_BRANCH" + + logInfo "Updating language files..." + ./share/translations/update.sh + if [ 0 -ne $? ]; then + exitError "Updating translations failed!" + fi + git diff-index --quiet HEAD -- + if [ $? -ne 0 ]; then + git add ./share/translations/* + logInfo "Committing changes..." + if [ "" == "$GPG_GIT_KEY" ]; then + git commit -m "Update translations" + else + git commit -m "Update translations" -S"$GPG_GIT_KEY" + fi + fi + + logInfo "Checking out target branch '${TARGET_BRANCH}'..." + git checkout "$TARGET_BRANCH" + + logInfo "Merging '${SOURCE_BRANCH}' into '${TARGET_BRANCH}'..." + + CHANGELOG=$(grep -Pzo "(?<=${RELEASE_NAME} \(\d{4}-\d{2}-\d{2}\)\n)=+\n\n?(?:.|\n)+?\n(?=\n)" \ + CHANGELOG | grep -Pzo '(?<=\n\n)(.|\n)+' | tr -d \\0) + COMMIT_MSG="Release ${RELEASE_NAME}" + + git merge "$SOURCE_BRANCH" --no-ff -m "$COMMIT_MSG" -m "${CHANGELOG}" "$SOURCE_BRANCH" -S"$GPG_GIT_KEY" + + logInfo "Creating tag '${TAG_NAME}'..." + if [ "" == "$GPG_GIT_KEY" ]; then + git tag -a "$TAG_NAME" -m "$COMMIT_MSG" -m "${CHANGELOG}" -s + else + git tag -a "$TAG_NAME" -m "$COMMIT_MSG" -m "${CHANGELOG}" -s -u "$GPG_GIT_KEY" + fi + + cleanup + + logInfo "All done!" + logInfo "Please merge the release branch back into the develop branch now and then push your changes." + logInfo "Don't forget to also push the tags using \e[1mgit push --tags\e[0m." +} + +# ----------------------------------------------------------------------- +# build command +# ----------------------------------------------------------------------- +build() { + while [ $# -ge 1 ]; do + local arg="$1" + case "$arg" in + -v|--version) + RELEASE_NAME="$2" + shift ;; + + -a|--app-name) + APP_NAME="$2" + shift ;; + + -s|--source-dir) + SRC_DIR="$2" + shift ;; + + -o|--output-dir) + OUTPUT_DIR="$2" + shift ;; + + -t|--tag-name) + TAG_NAME="$2" + shift ;; + + -d|--docker-image) + DOCKER_IMAGE="$2" + shift ;; + + --container-name) + DOCKER_CONTAINER_NAME="$2" + shift ;; + + -c|--cmake-options) + CMAKE_OPTIONS="$2" + shift ;; + + --compiler) + COMPILER="$2" + shift ;; + + -m|--make-options) + MAKE_OPTIONS="$2" + shift ;; + + -i|--install-prefix) + INSTALL_PREFIX="$2" + shift ;; + + -p|--plugins) + BUILD_PLUGINS="$2" + shift ;; + + -n|--no-source-tarball) + BUILD_SOURCE_TARBALL=false ;; + + -h|--help) + printUsage "build" + exit ;; + + *) + logError "Unknown option '$arg'\n" + printUsage "build" + exit 1 ;; + esac + shift + done + + if [ "" == "$RELEASE_NAME" ]; then + logError "Missing arguments, --version is required!\n" + printUsage "build" + exit 1 + fi + + if [ "" == "$TAG_NAME" ]; then + TAG_NAME="$RELEASE_NAME" + fi + + init + + SRC_DIR="$(realpath "$SRC_DIR")" + OUTPUT_DIR="$(realpath "$OUTPUT_DIR")" + + logInfo "Performing basic checks..." + + checkSourceDirExists + + logInfo "Changing to source directory..." + cd "${SRC_DIR}" + + checkTagExists + checkGitRepository + checkWorkingTreeClean + checkOutputDirDoesNotExist + + logInfo "All checks pass, getting our hands dirty now!" + + logInfo "Checking out release tag '${TAG_NAME}'..." + git checkout "$TAG_NAME" + + logInfo "Creating output directory..." + mkdir -p "$OUTPUT_DIR" + + if [ $? -ne 0 ]; then + exitError "Failed to create output directory!" + fi + + if $BUILD_SOURCE_TARBALL; then + logInfo "Creating source tarball..." + local app_name_lower="$(echo "$APP_NAME" | tr '[:upper:]' '[:lower:]')" + TARBALL_NAME="${app_name_lower}-${RELEASE_NAME}-src.tar.xz" + git archive --format=tar "$TAG_NAME" --prefix="${app_name_lower}-${RELEASE_NAME}/" \ + | xz -6 > "${OUTPUT_DIR}/${TARBALL_NAME}" + fi + + logInfo "Creating build directory..." + mkdir -p "${OUTPUT_DIR}/build-release" + cd "${OUTPUT_DIR}/build-release" + + logInfo "Configuring sources..." + for p in $BUILD_PLUGINS; do + CMAKE_OPTIONS="${CMAKE_OPTIONS} -DWITH_XC_$(echo $p | tr '[:lower:]' '[:upper:]')=On" + done + + if [ "$COMPILER" == "g++" ]; then + export CC=gcc + elif [ "$COMPILER" == "clang++" ]; then + export CC=clang + fi + export CXX="$COMPILER" + + if [ "" == "$DOCKER_IMAGE" ]; then + if [ "$(uname -s)" == "Darwin" ]; then + # Building on OS X + local qt_vers="$(ls /usr/local/Cellar/qt5 2> /dev/null | sort -r | head -n1)" + if [ "" == "$qt_vers" ]; then + exitError "Couldn't find Qt5! Please make sure it is available in '/usr/local/Cellar/qt5'." + fi + export MACOSX_DEPLOYMENT_TARGET=10.7 + + logInfo "Configuring build..." + cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" \ + -DCMAKE_OSX_ARCHITECTURES=x86_64 -DWITH_CXX11=OFF \ + -DCMAKE_PREFIX_PATH="/usr/local/Cellar/qt5/${qt_vers}/lib/cmake" \ + -DQT_BINARY_DIR="/usr/local/Cellar/qt5/${qt_vers}/bin" $CMAKE_OPTIONS "$SRC_DIR" + + logInfo "Compiling and packaging sources..." + make $MAKE_OPTIONS package + + mv "./${APP_NAME}-${RELEASE_NAME}.dmg" ../ + elif [ "$(uname -o)" == "Msys" ]; then + # Building on Windows with Msys + logInfo "Configuring build..." + cmake -DCMAKE_BUILD_TYPE=Release -DWITH_TESTS=Off -G"MSYS Makefiles" \ + -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" $CMAKE_OPTIONS "$SRC_DIR" + + logInfo "Compiling and packaging sources..." + make $MAKE_OPTIONS package + + mv "./${APP_NAME}-${RELEASE_NAME}-"*.{exe,zip} ../ + else + mkdir -p "${OUTPUT_DIR}/bin-release" + + # Building on Linux without Docker container + logInfo "Configuring build..." + cmake -DCMAKE_BUILD_TYPE=Release -DWITH_TESTS=Off $CMAKE_OPTIONS \ + -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" "$SRC_DIR" + + logInfo "Compiling sources..." + make $MAKE_OPTIONS + + logInfo "Installing to bin dir..." + make DESTDIR="${OUTPUT_DIR}/bin-release" install/strip + + logInfo "Creating AppImage..." + ${SRC_DIR}/AppImage-Recipe.sh "$APP_NAME" "$RELEASE_NAME" + fi + else + mkdir -p "${OUTPUT_DIR}/bin-release" + + logInfo "Launching Docker container to compile sources..." + + docker run --name "$DOCKER_CONTAINER_NAME" --rm \ + --cap-add SYS_ADMIN --device /dev/fuse \ + -e "CC=${CC}" -e "CXX=${CXX}" \ + -v "$(realpath "$SRC_DIR"):/keepassxc/src:ro" \ + -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 \ + -DCMAKE_INSTALL_PREFIX=\"${INSTALL_PREFIX}\" /keepassxc/src && \ + make $MAKE_OPTIONS && make DESTDIR=/keepassxc/out/bin-release install/strip && \ + /keepassxc/src/AppImage-Recipe.sh "$APP_NAME" "$RELEASE_NAME"" + + if [ 0 -ne $? ]; then + exitError "Docker build failed!" + fi + + logInfo "Build finished, Docker container terminated." + fi + + cleanup + + logInfo "All done!" +} + + +# ----------------------------------------------------------------------- +# sign command +# ----------------------------------------------------------------------- +sign() { + SIGN_FILES=() + + while [ $# -ge 1 ]; do + local arg="$1" + case "$arg" in + -f|--files) + while [ "${2:0:1}" != "-" ] && [ $# -ge 2 ]; do + SIGN_FILES+=("$2") + shift + done ;; + + -g|--gpg-key) + GPG_KEY="$2" + shift ;; + + -h|--help) + printUsage "sign" + exit ;; + + *) + logError "Unknown option '$arg'\n" + printUsage "sign" + exit 1 ;; + esac + shift + done + + if [ -z "$SIGN_FILES" ]; then + logError "Missing arguments, --files is required!\n" + printUsage "sign" + exit 1 + fi + + for f in "${SIGN_FILES[@]}"; do + if [ ! -f "$f" ]; then + exitError "File '${f}' does not exist!" + fi + + logInfo "Signing file '${f}'..." + gpg --output "${f}.sig" --armor --local-user "$GPG_KEY" --detach-sig "$f" + + if [ 0 -ne $? ]; then + exitError "Signing failed!" + fi + + logInfo "Creating digest for file '${f}'..." + sha256sum "$f" > "${f}.DIGEST" + done + + logInfo "All done!" +} + + +# ----------------------------------------------------------------------- +# parse global command line +# ----------------------------------------------------------------------- +MODE="$1" +shift +if [ "" == "$MODE" ]; then + logError "Missing arguments!\n" + printUsage + exit 1 +elif [ "help" == "$MODE" ]; then + printUsage "$1" + exit +elif [ "merge" == "$MODE" ] || [ "build" == "$MODE" ] || [ "sign" == "$MODE" ]; then + $MODE "$@" +else + printUsage "$MODE" +fi diff --git a/share/translations/keepassx_cs.ts b/share/translations/keepassx_cs.ts index 3a85ff723..b0e4ca8f9 100644 --- a/share/translations/keepassx_cs.ts +++ b/share/translations/keepassx_cs.ts @@ -1,15 +1,7 @@ -<?xml version="1.0" ?><!DOCTYPE TS><TS language="cs" version="2.0"> +<?xml version="1.0" ?><!DOCTYPE TS><TS language="cs" version="2.1"> <context> <name>AboutDialog</name> <message> - <source>About KeePassX</source> - <translation>O KeePassX</translation> - </message> - <message> - <source>KeePassX is distributed under the term of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> - <translation>KeePassX je šířeno za podmínek licence GNU General Public License (GPL) verze 2 a (případně) 3.</translation> - </message> - <message> <source>Revision</source> <translation>Revize</translation> </message> @@ -17,17 +9,56 @@ <source>Using:</source> <translation>S použitím:</translation> </message> + <message> + <source>About KeePassXC</source> + <translation>O aplikaci KeePassXC</translation> + </message> + <message> + <source>KeePassXC is distributed under the term of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> + <translation>KeePassXC je šířeno pod GNU obecnou veřejnou licencí (GPL) verze 2 a (případně) 3.</translation> + </message> + <message> + <source>Extensions: +</source> + <translation>Rozšíření: +</translation> + </message> </context> <context> - <name>AutoType</name> + <name>AccessControlDialog</name> + <message> + <source>Remember this decision</source> + <translation>Zapamatovat si toto rozhodnutí</translation> + </message> <message> - <source>Auto-Type - KeePassX</source> - <translation>Automatické vyplňování – KeePassX</translation> + <source>Allow</source> + <translation>Povolit</translation> </message> <message> + <source>Deny</source> + <translation>Zamítnout</translation> + </message> + <message> + <source>%1 has requested access to passwords for the following item(s). +Please select whether you want to allow access.</source> + <translation>%1 si vyžádalo přístup k heslům u následujících položek. +Umožnit přístup? ()</translation> + </message> + <message> + <source>KeePassXC HTTP Confirm Access</source> + <translation>Potvrzení přístupu KeePassXC HTTP</translation> + </message> +</context> +<context> + <name>AutoType</name> + <message> <source>Couldn't find an entry that matches the window title:</source> <translation>Nedaří se nalézt položku, která by se shodovala s titulkem okna:</translation> </message> + <message> + <source>Auto-Type - KeePassXC</source> + <translation>Automatické vyplňování – KeePassXC</translation> + </message> </context> <context> <name>AutoTypeAssociationsModel</name> @@ -47,13 +78,13 @@ <context> <name>AutoTypeSelectDialog</name> <message> - <source>Auto-Type - KeePassX</source> - <translation>Automatické vyplňování – KeePassX</translation> - </message> - <message> <source>Select entry to Auto-Type:</source> <translation>Vyberte položku, kterou se bude automaticky vyplňovat:</translation> </message> + <message> + <source>Auto-Type - KeePassXC</source> + <translation>Automatické vyplňování – KeePassXC</translation> + </message> </context> <context> <name>ChangeMasterKeyWidget</name> @@ -320,16 +351,6 @@ Uložit změny?</translation> <translation>zamčeno</translation> </message> <message> - <source>The database you are trying to open is locked by another instance of KeePassX. -Do you want to open it anyway? Alternatively the database is opened read-only.</source> - <translation>Pro databázi, kterou se pokoušíte otevřít, existuje zámek úprav (stejnojmenný -.lock soubor). To znamená, že je nejspíš už otevřená v jiném okně KeePassX -(v případě sdíleného úložiště, třeba i na jiném počítači). Pokud tomu tak není, -je zámek nejspíš pozůstatkem předchozího neočekávaného ukončení aplikace -a je možné ho smazat. V každém případě, dotčenou databázi je možné otevřít - i tak, ale pouze pro čtení. Chcete?</translation> - </message> - <message> <source>Lock database</source> <translation>Uzamknout databázi</translation> </message> @@ -372,14 +393,24 @@ Přesto zavřít a zahodit změny?</translation> <translation>Zápis do CSV souboru se nezdařil.</translation> </message> <message> - <source>The database you are trying to save as is locked by another instance of KeePassX. -Do you want to save it anyway?</source> - <translation>Databáze, kterou se pokoušíte uložit, je uzamčena jinou instancí KeePassX. -Přesto uložit?</translation> + <source>Unable to open the database.</source> + <translation>Nepodařilo se otevřít databázi.</translation> </message> <message> - <source>Unable to open the database.</source> - <translation type="unfinished"/> + <source>The database you are trying to open is locked by another instance of KeePassXC. +Do you want to open it anyway? Alternatively the database is opened read-only.</source> + <translation>Databáze kterou se pokoušíte otevřít je právě používaná jinou instancí KeePassXC. +Chcete ji přesto otevřít? Případně je možné databázi otevřít pouze pro čtení.</translation> + </message> + <message> + <source>Merge database</source> + <translation>Sloučit databáze</translation> + </message> + <message> + <source>The database you are trying to save as is locked by another instance of KeePassXC. +Do you want to save it anyway?</source> + <translation>Databáze kterou se pokoušíte uložit je právě používaná jinou instancí KeePassXC. +Chcete ji přesto uložit?</translation> </message> </context> <context> @@ -421,10 +452,6 @@ Přesto uložit?</translation> <translation>Opravdu chcete nenávratně smazat skupinu „%1“?</translation> </message> <message> - <source>Current group</source> - <translation>Stávající skupina</translation> - </message> - <message> <source>Error</source> <translation>Chyba</translation> </message> @@ -434,11 +461,71 @@ Přesto uložit?</translation> </message> <message> <source>Move entry to recycle bin?</source> - <translation type="unfinished"/> + <translation>Přesunout položku do koše?</translation> </message> <message> <source>Do you really want to move entry "%1" to the recycle bin?</source> - <translation type="unfinished"/> + <translation>Opravdu si přejete přesunout položku "%1" do koše?</translation> + </message> + <message> + <source>Searching...</source> + <translation>Hledání…</translation> + </message> + <message> + <source>No current database.</source> + <translation>Aktuálně žádná databáze.</translation> + </message> + <message> + <source>No source database, nothing to do.</source> + <translation>Není zvolena zdrojová databáze, není co dělat.</translation> + </message> + <message> + <source>Search Results (%1)</source> + <translation>Výsledky vyhledávání (%1)</translation> + </message> + <message> + <source>No Results</source> + <translation>Žádné výsledky</translation> + </message> + <message> + <source>Execute command?</source> + <translation>Spustit příkaz?</translation> + </message> + <message> + <source>Do you really want to execute the following command?<br><br>%1<br></source> + <translation>Opravdu chcete spustit následující příkaz?<br><br>%1<br></translation> + </message> + <message> + <source>Remember my choice</source> + <translation>Zapamatovat si pro příště</translation> + </message> + <message> + <source>Autoreload Request</source> + <translation>Požadavek na automatické opětovné načtení</translation> + </message> + <message> + <source>The database file has changed. Do you want to load the changes?</source> + <translation>Soubor s databází byl změněn. Přejete si načíst změny?</translation> + </message> + <message> + <source>Merge Request</source> + <translation>Požadavek na sloučení</translation> + </message> + <message> + <source>The database file has changed and you have unsaved changes.Do you want to merge your changes?</source> + <translation>Soubor s databází byl mezitím změněn a vaše změny nejsou uložené. Přejete si vaše změny sloučit?</translation> + </message> + <message> + <source>Autoreload Failed</source> + <translation>Automatické opětovné načtení se nezdařilo</translation> + </message> + <message> + <source>Could not parse or unlock the new database file while attempting to autoreload this database.</source> + <translation>Nepodařilo se zpracovat nebo odemknout nový soubor s databází během pokusu o její opětovné načtení.</translation> + </message> + <message> + <source>Could not open the new database file while attempting to autoreload this database.</source> + <translation>Nepodařilo se otevřít nový soubor s databází během pokusu o její opětovné načtení.</translation> </message> </context> <context> @@ -630,10 +717,6 @@ Přesto uložit?</translation> <translation>Zopakování hesla:</translation> </message> <message> - <source>Gen.</source> - <translation>Tvoř</translation> - </message> - <message> <source>URL:</source> <translation>URL adresa:</translation> </message> @@ -750,17 +833,25 @@ Přesto uložit?</translation> <source>Can't delete icon!</source> <translation>Ikonu nelze smazat!</translation> </message> - <message numerus="yes"> - <source>Can't delete icon. Still used by %n item(s).</source> - <translation><numerusform>Ikonu není možné smazat. Je používána %n položkou.</numerusform><numerusform>Ikonu není možné smazat. Je používána %n položkami.</numerusform><numerusform>Ikonu není možné smazat. Ještě jí používá %n položek.</numerusform></translation> - </message> <message> <source>Error</source> - <translation type="unfinished"/> + <translation>Chyba</translation> + </message> + <message> + <source>Download favicon</source> + <translation>Stáhnout favicon</translation> </message> <message> - <source>Can't read icon:</source> - <translation type="unfinished"/> + <source>Unable to fetch favicon.</source> + <translation>Favicon se nepodařilo stáhnout.</translation> + </message> + <message> + <source>Can't read icon</source> + <translation>Nepodařilo se načíst ikonu</translation> + </message> + <message> + <source>Can't delete icon. Still used by %1 items.</source> + <translation>Ikonu nelze smazat. Ještě ji používá %1 položek.</translation> </message> </context> <context> @@ -783,6 +874,13 @@ Přesto uložit?</translation> </message> </context> <context> + <name>Entry</name> + <message> + <source> - Clone</source> + <translation>- Klon</translation> + </message> +</context> +<context> <name>EntryAttributesModel</name> <message> <source>Name</source> @@ -835,6 +933,61 @@ Přesto uložit?</translation> </message> </context> <context> + <name>HttpPasswordGeneratorWidget</name> + <message> + <source>Length:</source> + <translation>Délka:</translation> + </message> + <message> + <source>Character Types</source> + <translation>Typy znaků</translation> + </message> + <message> + <source>Upper Case Letters</source> + <translation>Velká písmena</translation> + </message> + <message> + <source>A-Z</source> + <translation>A-Z</translation> + </message> + <message> + <source>Lower Case Letters</source> + <translation>Malá písmena</translation> + </message> + <message> + <source>a-z</source> + <translation>a-z</translation> + </message> + <message> + <source>Numbers</source> + <translation>Čísla</translation> + </message> + <message> + <source>0-9</source> + <translation>0-9</translation> + </message> + <message> + <source>Special Characters</source> + <translation>Zvláštní znaky</translation> + </message> + <message> + <source>/*_& ...</source> + <translation>/*_& ...</translation> + </message> + <message> + <source>Exclude look-alike characters</source> + <translation>Vyloučit podobné znaky</translation> + </message> + <message> + <source>Ensure that the password contains characters from every group</source> + <translation>Heslo musí obsahovat znak z každé skupiny</translation> + </message> + <message> + <source>Accept</source> + <translation>Přijmout</translation> + </message> +</context> +<context> <name>KeePass1OpenWidget</name> <message> <source>Import KeePass1 database</source> @@ -877,7 +1030,7 @@ Přesto uložit?</translation> </message> <message> <source>Wrong key or database file is corrupt.</source> - <translation type="unfinished"/> + <translation>Byl zadán chybný klíč, nebo je poškozen databázový soubor.</translation> </message> </context> <context> @@ -916,8 +1069,8 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev <translation>Při ověřování šifrovacích funkcí byl zjištěn fatální nedostatek.</translation> </message> <message> - <source>KeePassX - Error</source> - <translation>KeePassX – chyba</translation> + <source>KeePassXC - Error</source> + <translation>KeePassXC – chyba</translation> </message> </context> <context> @@ -927,188 +1080,319 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev <translation>Databáze</translation> </message> <message> - <source>Recent databases</source> + <source>Open database</source> + <translation>Otevřít databázi</translation> + </message> + <message> + <source>Database settings</source> + <translation>Nastavení databáze</translation> + </message> + <message> + <source>Copy username to clipboard</source> + <translation>Zkopírovat uživatelské jméno do schránky</translation> + </message> + <message> + <source>Copy password to clipboard</source> + <translation>Zkopírovat heslo do schránky</translation> + </message> + <message> + <source>Settings</source> + <translation>Nastavení</translation> + </message> + <message> + <source>Show toolbar</source> + <translation>Zobrazit lištu nástrojů</translation> + </message> + <message> + <source>read-only</source> + <translation>pouze pro čtení</translation> + </message> + <message> + <source>Toggle window</source> + <translation>Zobrazit/skrýt okno</translation> + </message> + <message> + <source>Tools</source> + <translation>Nástroje</translation> + </message> + <message> + <source>KeePass 2 Database</source> + <translation>Databáze ve formátu KeePass 2</translation> + </message> + <message> + <source>All files</source> + <translation>Všechny soubory</translation> + </message> + <message> + <source>Save repaired database</source> + <translation>Uložit opravenou databázi</translation> + </message> + <message> + <source>Error</source> + <translation>Chyba</translation> + </message> + <message> + <source>Writing the database failed.</source> + <translation>Zápis do databáze se nezdařil.</translation> + </message> + <message> + <source>&Recent databases</source> <translation>Nedávno otevřené databáze</translation> </message> <message> - <source>Help</source> + <source>He&lp</source> <translation>Nápověda</translation> </message> <message> - <source>Entries</source> + <source>E&ntries</source> <translation>Položky</translation> </message> <message> - <source>Copy attribute to clipboard</source> - <translation>Zkopírovat atribut do schránky</translation> + <source>Copy att&ribute to clipboard</source> + <translation>Zkopí&rovat atribut do schránky</translation> </message> <message> - <source>Groups</source> - <translation>Skupiny</translation> + <source>&Groups</source> + <translation>Skupniny</translation> </message> <message> - <source>View</source> + <source>&View</source> <translation>Zobrazit</translation> </message> <message> - <source>Quit</source> - <translation>Ukončit aplikaci</translation> + <source>&Quit</source> + <translation>Ukončit</translation> </message> <message> - <source>About</source> - <translation>O aplikaci</translation> + <source>&About</source> + <translation>O &aplikaci</translation> </message> <message> - <source>Open database</source> - <translation>Otevřít databázi</translation> + <source>&Open database</source> + <translation>&Otevřít databázi</translation> </message> <message> - <source>Save database</source> + <source>&Save database</source> <translation>Uložit databázi</translation> </message> <message> - <source>Close database</source> + <source>&Close database</source> <translation>Zavřít databázi</translation> </message> <message> - <source>New database</source> - <translation>Nová databáze</translation> + <source>&New database</source> + <translation>&Nová databáze</translation> + </message> + <message> + <source>Merge from KeePassX database</source> + <translation>Sloučit s databází KeePassX</translation> </message> <message> - <source>Add new entry</source> - <translation>Přidat novou položku</translation> + <source>&Add new entry</source> + <translation>Přid&at novou položku</translation> </message> <message> - <source>View/Edit entry</source> - <translation>Zobrazit/upravit položku</translation> + <source>&View/Edit entry</source> + <translation>Zobrazit/Upra&vit položku</translation> </message> <message> - <source>Delete entry</source> + <source>&Delete entry</source> <translation>Smazat položku</translation> </message> <message> - <source>Add new group</source> - <translation>Přidat novou skupinu</translation> + <source>&Add new group</source> + <translation>Přid&at novou skupinu</translation> </message> <message> - <source>Edit group</source> + <source>&Edit group</source> <translation>Upravit skupinu</translation> </message> <message> - <source>Delete group</source> + <source>&Delete group</source> <translation>Smazat skupinu</translation> </message> <message> - <source>Save database as</source> + <source>Sa&ve database as</source> <translation>Uložit databázi jako</translation> </message> <message> - <source>Change master key</source> - <translation>Změnit hlavní klíč</translation> + <source>Change &master key</source> + <translation>Z&měnit hlavní klíč</translation> </message> <message> - <source>Database settings</source> - <translation>Nastavení databáze</translation> + <source>&Database settings</source> + <translation>Nastavení &databáze</translation> </message> <message> - <source>Import KeePass 1 database</source> - <translation>Importovat databázi aplikace KeePass verze 1</translation> + <source>&Import KeePass 1 database</source> + <translation>&Importovat databázi ve formátu KeePass 1</translation> </message> <message> - <source>Clone entry</source> + <source>&Clone entry</source> <translation>Klonovat položku</translation> </message> <message> - <source>Find</source> + <source>&Find</source> <translation>Najít</translation> </message> <message> - <source>Copy username to clipboard</source> - <translation>Zkopírovat uživatelské jméno do schránky</translation> + <source>Copy &username</source> + <translation>Zkopírovat &uživatelské jméno</translation> </message> <message> - <source>Copy password to clipboard</source> - <translation>Zkopírovat heslo do schránky</translation> + <source>Cop&y password</source> + <translation>Zkopírovat heslo</translation> </message> <message> - <source>Settings</source> - <translation>Nastavení</translation> + <source>&Settings</source> + <translation>Na&stavení</translation> </message> <message> - <source>Perform Auto-Type</source> - <translation>Provést automatické vyplnění</translation> + <source>&Perform Auto-Type</source> + <translation>&Provést automatické vyplnění</translation> </message> <message> - <source>Open URL</source> - <translation>Otevřít URL adresu</translation> + <source>&Open URL</source> + <translation>&Otevřít URL adresu</translation> </message> <message> - <source>Lock databases</source> - <translation>Uzamknout databáze</translation> + <source>&Lock databases</source> + <translation>Uzamknout databázi</translation> </message> <message> - <source>Title</source> - <translation>Titulek</translation> + <source>&Title</source> + <translation>Nadpis</translation> </message> <message> - <source>URL</source> - <translation>URL adresa</translation> + <source>&URL</source> + <translation>&URL adresa</translation> </message> <message> - <source>Notes</source> - <translation>Poznámky</translation> + <source>&Notes</source> + <translation>Poz&námky</translation> </message> <message> - <source>Show toolbar</source> - <translation>Zobrazit lištu nástrojů</translation> + <source>&Export to CSV file</source> + <translation>&Exportovat do CSV souboru</translation> </message> <message> - <source>read-only</source> - <translation>pouze pro čtení</translation> + <source>Re&pair database</source> + <translation>O&pravit databázi</translation> </message> <message> - <source>Toggle window</source> - <translation>Zobrazit/skrýt okno</translation> + <source>Password Generator</source> + <translation>Generátor hesel</translation> </message> +</context> +<context> + <name>OptionDialog</name> <message> - <source>Tools</source> - <translation>Nástroje</translation> + <source>Dialog</source> + <translation>Dialog</translation> </message> <message> - <source>Copy username</source> - <translation>Zkopírovat uživatelské jméno</translation> + <source>General</source> + <translation>Obecné</translation> </message> <message> - <source>Copy password</source> - <translation>Zkopírovat heslo</translation> + <source>Sh&ow a notification when credentials are requested</source> + <translation>Z&obrazit oznámení když jsou požadovány přihlašovací údaje</translation> </message> <message> - <source>Export to CSV file</source> - <translation>Exportovat do CSV souboru</translation> + <source>&Return only best matching entries for an URL instead +of all entries for the whole domain</source> + <translation>V%rátit pouze položky, které nejlépe odpovídají dané +URL adrese namísto položek pro celou doménu</translation> </message> <message> - <source>Repair database</source> - <translation>Opravit databázi</translation> + <source>&Match URL schemes +Only entries with the same scheme (http://, https://, ftp://, ...) are returned</source> + <translation>&Odpovídající schémata URL adres +Jsou vráceny pouze položky se stejným schématem (http://, https://, ftp://, atp.)</translation> </message> <message> - <source>KeePass 2 Database</source> - <translation>Databáze ve formátu KeePass 2</translation> + <source>Sort matching entries by &username</source> + <translation>Seřadit odpovídající položky dle &uživatelského jména</translation> </message> <message> - <source>All files</source> - <translation>Všechny soubory</translation> + <source>R&emove all shared encryption-keys from active database</source> + <translation>Z právě otevřené databáze od&ebrat veškeré sdílené šifrovací klíče</translation> </message> <message> - <source>Save repaired database</source> - <translation>Uložit opravenou databázi</translation> + <source>Re&move all stored permissions from entries in active database</source> + <translation>Z právě otevřené databáze odebrat veškerá uložená oprávnění</translation> </message> <message> - <source>Error</source> - <translation>Chyba</translation> + <source>Password generator</source> + <translation>Generátor hesel</translation> </message> <message> - <source>Writing the database failed.</source> - <translation>Zápis do databáze se nezdařil.</translation> + <source>Advanced</source> + <translation>Pokročilé</translation> + </message> + <message> + <source>Activate the following only, if you know what you are doing!</source> + <translation>Následující zapněte pouze pokud víte, co děláte!</translation> + </message> + <message> + <source>Always allow &access to entries</source> + <translation>Vždy umožnit přístup k veškerým položkám</translation> + </message> + <message> + <source>Always allow &updating entries</source> + <translation>Vždy umožnit akt&ualizovat položky</translation> + </message> + <message> + <source>Searc&h in all opened databases for matching entries</source> + <translation>Vy&hledat odpovídající položky ve všech otevřených databázích</translation> + </message> + <message> + <source>Only the selected database has to be connected with a client!</source> + <translation>Je třeba, aby ke klientovi byly připojené pouze vybrané databáze!</translation> + </message> + <message> + <source>&Return also advanced string fields which start with "KPH: "</source> + <translation>V&rátit také pokročilé textové řetězce které začínají na „KPH:“</translation> + </message> + <message> + <source>Automatic creates or updates are not supported for string fields!</source> + <translation>Automatická vytváření nebo aktualizace nejsou u textových kolonek podporované!</translation> + </message> + <message> + <source>HTTP Port:</source> + <translation>HTTP port:</translation> + </message> + <message> + <source>Default port: 19455</source> + <translation>Výchozí port: 19455</translation> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>Vyžádat odemknutí zamčené databáze</translation> + </message> + <message> + <source>Sort &matching entries by title</source> + <translation>Seřadit odpovídající položky dle názvu</translation> + </message> + <message> + <source>Enable KeepassXC HTTP protocol +This is required for accessing your databases from ChromeIPass or PassIFox</source> + <translation>Zapnout protokol KeePassXC HTTP +Toto je zapotřebí pro přístup do databáze z ChromeIPass nebo PassIFox</translation> + </message> + <message> + <source>KeePassXC will listen to this port on 127.0.0.1</source> + <translation>Na tomto portu bude KeePassXC očekávat spojení na adrese 127.0.0.1</translation> + </message> + <message> + <source>Cannot bind to privileged ports</source> + <translation>S oprávněními uživatele není možné navázat na porty, pro které je třeba oprávnění správce systému</translation> + </message> + <message> + <source>Cannot bind to privileged ports below 1024! +Using default port 19455.</source> + <translation>Není možné navázat na porty s číslem nižším, než 1024! +Náhradně bude použit port 19455.</translation> </message> </context> <context> @@ -1118,10 +1402,6 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev <translation>Heslo:</translation> </message> <message> - <source>Length:</source> - <translation>Délka:</translation> - </message> - <message> <source>Character Types</source> <translation>Typy znaků</translation> </message> @@ -1146,70 +1426,71 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev <translation>Vynechat podobně vypadající znaky (předejití záměně)</translation> </message> <message> - <source>Ensure that the password contains characters from every group</source> - <translation>Zajistit, aby heslo obsahovalo znaky ze všech zvolených skupin znaků</translation> - </message> - <message> <source>Accept</source> <translation>Přijmout</translation> </message> -</context> -<context> - <name>QCommandLineParser</name> <message> - <source>Displays version information.</source> - <translation>Zobrazí informace o verzi.</translation> + <source>%p%</source> + <translation>%p%</translation> </message> <message> - <source>Displays this help.</source> - <translation>Zobrazí tuto nápovědu.</translation> + <source>strength</source> + <translation>odolnost</translation> </message> <message> - <source>Unknown option '%1'.</source> - <translation>Neznámá předvolba %1.</translation> + <source>entropy</source> + <translation>náhodnost</translation> </message> <message> - <source>Unknown options: %1.</source> - <translation>Neznámé předvolby: %1.</translation> + <source>&Length:</source> + <translation>Dé&lka:</translation> </message> <message> - <source>Missing value after '%1'.</source> - <translation>Chybějící hodnota, následující za %1.</translation> + <source>Pick characters from every group</source> + <translation>Použít znaky ze všech skupin</translation> </message> <message> - <source>Unexpected value after '%1'.</source> - <translation>Neočekávaná hodnota, následující za %1.</translation> + <source>Generate</source> + <translation>Vytvořit</translation> </message> <message> - <source>[options]</source> - <translation>[předvolby]</translation> + <source>Close</source> + <translation>Zavřít</translation> </message> <message> - <source>Usage: %1</source> - <translation>Použití: %1</translation> + <source>Apply</source> + <translation>Použít</translation> </message> <message> - <source>Options:</source> - <translation>Předvolby:</translation> + <source>Entropy: %1 bit</source> + <translation>Náhodnost: %1 bit</translation> </message> <message> - <source>Arguments:</source> - <translation>Argumenty:</translation> + <source>Password Quality: %1</source> + <translation>Odolnost hesla: %1</translation> </message> -</context> -<context> - <name>QSaveFile</name> <message> - <source>Existing file %1 is not writable</source> - <translation>Do stávajícího souboru %1 nelze zapisovat</translation> + <source>Poor</source> + <translation>Velmi nízká</translation> </message> <message> - <source>Writing canceled by application</source> - <translation>Zápis byl zrušen aplikací</translation> + <source>Weak</source> + <translation>Slabá</translation> </message> <message> - <source>Partial write. Partition full?</source> - <translation>Zápis nebylo možné zcela dokončit. Nedostatek volného místa?</translation> + <source>Good</source> + <translation>Dobrá</translation> + </message> + <message> + <source>Excellent</source> + <translation>Skvělá</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <source>Http</source> + <translation>Http</translation> </message> </context> <context> @@ -1249,20 +1530,111 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev <context> <name>SearchWidget</name> <message> - <source>Find:</source> - <translation>Najít:</translation> + <source>Case Sensitive</source> + <translation>Rozlišovat velikost písmen</translation> </message> <message> - <source>Case sensitive</source> - <translation>Rozlišovat malá/velká písmena</translation> + <source>Search</source> + <translation>Hledat</translation> </message> <message> - <source>Current group</source> - <translation>Stávající skupina</translation> + <source>Find</source> + <translation>Najít</translation> </message> <message> - <source>Root group</source> - <translation>Kořenová skupina</translation> + <source>Clear</source> + <translation>Vyčistit</translation> + </message> +</context> +<context> + <name>Service</name> + <message> + <source>A shared encryption-key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation>Už existuje sdílený šifrovací klíč s názvem „%1“. +Přejete si ho přepsat?</translation> + </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>Přejete si aktualizovat informaci v %1 – %2?</translation> + </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>Právě otevřená databáze je uzamčená! +Buď jí odemkněte, nebo vyberte jinou, odemčenou.</translation> + </message> + <message> + <source>Successfully removed %1 encryption-%2 from KeePassX/Http Settings.</source> + <translation>Z nastavení KeePassX/Http bylo úspěšně odebráno %1 šifrování-%2.</translation> + </message> + <message> + <source>No shared encryption-keys found in KeePassHttp Settings.</source> + <translation>V nastavení KeePassHttp nebyly nalezeny žádné sdílené šifrovací klíče.</translation> + </message> + <message> + <source>The active database does not contain an entry of KeePassHttp Settings.</source> + <translation>Právě otevřená databáze neobsahuje žádnou položku nastavení KeePassHttp.</translation> + </message> + <message> + <source>Removing stored permissions...</source> + <translation>Odstraňuji uložená oprávnění...</translation> + </message> + <message> + <source>Abort</source> + <translation>Přerušit</translation> + </message> + <message> + <source>Successfully removed permissions from %1 %2.</source> + <translation>Oprávnění %1 %2 úspěšně odebrána.</translation> + </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation>Právě otevřená databáze neobsahuje položku s oprávněními.</translation> + </message> + <message> + <source>KeePassXC: New key association request</source> + <translation>KeePassXC: nový požadavek na přiřazení klíče</translation> + </message> + <message> + <source>You have received an association request for the above key. +If you would like to allow it access to your KeePassXC database +give it a unique name to identify and accept it.</source> + <translation>Pokud jste obdrželi požadavek na přiřazení pro výše uvedený klíč. +Pokud chcete umožnit přístup do KeePassXC databáze, dejte jí +jedinečný název pro její identifikaci a potvrďte ho.</translation> + </message> + <message> + <source>KeePassXC: Overwrite existing key?</source> + <translation>KeePassXC: Přepsat stávající klíč?</translation> + </message> + <message> + <source>KeePassXC: Update Entry</source> + <translation>KeePassXC: Aktualizovat položku</translation> + </message> + <message> + <source>KeePassXC: Database locked!</source> + <translation>KeePassXC: Databáze uzamčena!</translation> + </message> + <message> + <source>KeePassXC: Removed keys from database</source> + <translation>KeePassXC: Odebrány klíče z databáze</translation> + </message> + <message> + <source>KeePassXC: No keys found</source> + <translation>KeePassXC: Klíče nebyly nalezeny</translation> + </message> + <message> + <source>KeePassXC: Settings not available!</source> + <translation>KeePassXC: Nastavení nejsou k dispozici!</translation> + </message> + <message> + <source>KeePassXC: Removed permissions</source> + <translation>KeePassXC: Odebraná oprávnění</translation> + </message> + <message> + <source>KeePassXC: No entry with permissions found!</source> + <translation>KeePassXC: Nebyla nalezena položka s oprávněními!</translation> </message> </context> <context> @@ -1287,10 +1659,6 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev <translation>Pamatovat si nedávno otevřené databáze</translation> </message> <message> - <source>Open previous databases on startup</source> - <translation>Při spuštění aplikace otevřít minule otevřené databáze</translation> - </message> - <message> <source>Automatically save on exit</source> <translation>Před ukončením aplikace automaticky uložit případné změny</translation> </message> @@ -1300,7 +1668,7 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev </message> <message> <source>Minimize when copying to clipboard</source> - <translation>Po zkopírování údaje do schránky automaticky minimalizovat okno KeePassX (do popředí se tak dostane okno, do kterého se zkopírovaný údaj bude vkládat)</translation> + <translation>Po zkopírování údaje do schránky automaticky minimalizovat</translation> </message> <message> <source>Use group icon on entry creation</source> @@ -1331,12 +1699,20 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev <translation>Pamatovat si nedávno otevřené soubory s klíči</translation> </message> <message> - <source>Hide window to system tray instead of App Exit</source> - <translation type="unfinished"/> + <source>Load previous databases on startup</source> + <translation>Při spuštění aplikace načíst minule otevřené databáze</translation> + </message> + <message> + <source>Automatically reload the database when modified externally</source> + <translation>V okamžiku zásahu do databáze zvenčí ji načíst znovu</translation> </message> <message> - <source>Hide window to system tray on App start</source> - <translation type="unfinished"/> + <source>Hide window to system tray instead of app exit</source> + <translation>Namísto zavření minimalizovat okno aplikace do oznamovací oblasti systémového panelu</translation> + </message> + <message> + <source>Minimize window at application startup</source> + <translation>Spouštět aplikaci s minimalizovaným oknem</translation> </message> </context> <context> @@ -1361,6 +1737,14 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev <source>Always ask before performing auto-type</source> <translation>Před provedením automatického vyplnění se vždy dotázat</translation> </message> + <message> + <source>Lock databases after minimizing the window</source> + <translation>Při minimalizaci okna uzamknout databáze</translation> + </message> + <message> + <source>Don't require password repeat when it is visible</source> + <translation>Pokud jsou zobrazená, nevyžadovat zopakování hesel</translation> + </message> </context> <context> <name>UnlockDatabaseWidget</name> @@ -1379,14 +1763,6 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev <context> <name>main</name> <message> - <source>KeePassX - cross-platform password manager</source> - <translation>KeePassX – správce hesel, fungující napříč rozličnými operačními systémy</translation> - </message> - <message> - <source>filename of the password database to open (*.kdbx)</source> - <translation>který soubor s databází hesel (*.kdbx) otevřít</translation> - </message> - <message> <source>path to a custom config file</source> <translation>umístění souboru s vlastními nastaveními</translation> </message> @@ -1394,5 +1770,17 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev <source>key file of the database</source> <translation>soubor s klíčem k databázi</translation> </message> + <message> + <source>filename(s) of the password database(s) to open (*.kdbx)</source> + <translation>názvy databází s hesly (*.kdbx) které otevřít ()()</translation> + </message> + <message> + <source>KeePassXC - cross-platform password manager</source> + <translation>KeePassXC – aplikace pro správu hesel, fungující na vícero operačních systémech</translation> + </message> + <message> + <source>read password of the database from stdin</source> + <translation>načíst heslo k databázi ze standardního vstupu</translation> + </message> </context> </TS>
\ No newline at end of file diff --git a/share/translations/keepassx_de.ts b/share/translations/keepassx_de.ts index 2742de484..20bd5daeb 100644 --- a/share/translations/keepassx_de.ts +++ b/share/translations/keepassx_de.ts @@ -1,15 +1,7 @@ -<?xml version="1.0" ?><!DOCTYPE TS><TS language="de" version="2.0"> +<?xml version="1.0" ?><!DOCTYPE TS><TS language="de" version="2.1"> <context> <name>AboutDialog</name> <message> - <source>About KeePassX</source> - <translation>Über KeePassX</translation> - </message> - <message> - <source>KeePassX is distributed under the term of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> - <translation>KeePassX steht unter der GNU General Public License (GPL) version 2 (version 3).</translation> - </message> - <message> <source>Revision</source> <translation>Überarbeitung</translation> </message> @@ -17,17 +9,56 @@ <source>Using:</source> <translation>In Benutzung:</translation> </message> + <message> + <source>About KeePassXC</source> + <translation>Über KeePassXC</translation> + </message> + <message> + <source>KeePassXC is distributed under the term of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> + <translation>KeePassXC steht unter der GNU General Public License (GPL) version 2 (version 3).</translation> + </message> + <message> + <source>Extensions: +</source> + <translation>Erweiterungen: +</translation> + </message> </context> <context> - <name>AutoType</name> + <name>AccessControlDialog</name> <message> - <source>Auto-Type - KeePassX</source> - <translation>Auto-Type - KeePassX</translation> + <source>Remember this decision</source> + <translation>Diese Entscheidung merken</translation> </message> <message> + <source>Allow</source> + <translation>Erlauben</translation> + </message> + <message> + <source>Deny</source> + <translation>Ablehnen</translation> + </message> + <message> + <source>%1 has requested access to passwords for the following item(s). +Please select whether you want to allow access.</source> + <translation>%1 hat Zugriff auf Passwörter für folgende Element(e) angefordert. +Bitte wählen Sie, ob Sie den Zugriff erlauben möchten.</translation> + </message> + <message> + <source>KeePassXC HTTP Confirm Access</source> + <translation>KeePassXC HTTP Erlaube Zugriff</translation> + </message> +</context> +<context> + <name>AutoType</name> + <message> <source>Couldn't find an entry that matches the window title:</source> <translation>Konnte keinen Eintrag finden, welcher mit dem Fenstertitel übereinstimmt:</translation> </message> + <message> + <source>Auto-Type - KeePassXC</source> + <translation>Auto-Type - KeePassXC</translation> + </message> </context> <context> <name>AutoTypeAssociationsModel</name> @@ -47,13 +78,13 @@ <context> <name>AutoTypeSelectDialog</name> <message> - <source>Auto-Type - KeePassX</source> - <translation>Auto-Type - KeePassX</translation> - </message> - <message> <source>Select entry to Auto-Type:</source> <translation>Wählen Sie einen Eintrag für Auto-Type:</translation> </message> + <message> + <source>Auto-Type - KeePassXC</source> + <translation>Auto-Type - KeePassXC</translation> + </message> </context> <context> <name>ChangeMasterKeyWidget</name> @@ -319,11 +350,6 @@ Save changes?</source> <translation>gesperrt</translation> </message> <message> - <source>The database you are trying to open is locked by another instance of KeePassX. -Do you want to open it anyway? Alternatively the database is opened read-only.</source> - <translation>Die Datenbank, die geöffnet werden soll, ist aktuell von einer anderen Instanz von KeePassX blockiert. Soll sie dennoch geöffnet werden? Andererseits wird die Datenbank schreibgeschützt geöffnet.</translation> - </message> - <message> <source>Lock database</source> <translation>Datenbank sperren</translation> </message> @@ -366,14 +392,24 @@ Discard changes and close anyway?</source> <translation>Die CSV Datei konnte nicht gespeichert werden.</translation> </message> <message> - <source>The database you are trying to save as is locked by another instance of KeePassX. -Do you want to save it anyway?</source> - <translation>Die Datenbank, die gespeichert werden soll, ist von einer anderen Instanz von KeePassX blockiert. -Soll sie dennoch gespeichert werden? </translation> + <source>Unable to open the database.</source> + <translation>Öffnen der Datenbank ist nicht möglich.</translation> </message> <message> - <source>Unable to open the database.</source> - <translation type="unfinished"/> + <source>The database you are trying to open is locked by another instance of KeePassXC. +Do you want to open it anyway? Alternatively the database is opened read-only.</source> + <translation>Die Datenbank, die geöffnet werden soll, ist aktuell von einer anderen Instanz von KeePassXC blockiert. +Soll sie dennoch geöffnet werden? Alternativ wird die Datenbank schreibgeschützt geöffnet.</translation> + </message> + <message> + <source>Merge database</source> + <translation>Datenbank zusammenführen</translation> + </message> + <message> + <source>The database you are trying to save as is locked by another instance of KeePassXC. +Do you want to save it anyway?</source> + <translation>Die Datenbank, die gespeichert werden soll, ist von einer anderen Instanz von KeePassXC blockiert. +Soll sie dennoch gespeichert werden? </translation> </message> </context> <context> @@ -415,10 +451,6 @@ Soll sie dennoch gespeichert werden? </translation> <translation>Wollen Sie die Gruppe "%1" wirklich löschen?</translation> </message> <message> - <source>Current group</source> - <translation>Aktuelle Gruppe</translation> - </message> - <message> <source>Error</source> <translation>Fehler</translation> </message> @@ -428,11 +460,71 @@ Soll sie dennoch gespeichert werden? </translation> </message> <message> <source>Move entry to recycle bin?</source> - <translation type="unfinished"/> + <translation>Eintrag in den Papierkorb verschieben?</translation> </message> <message> <source>Do you really want to move entry "%1" to the recycle bin?</source> - <translation type="unfinished"/> + <translation>Möchten Sie wirklich Eintrag "%1" in den Papierkorb verschieben?</translation> + </message> + <message> + <source>Searching...</source> + <translation>Am suchen...</translation> + </message> + <message> + <source>No current database.</source> + <translation>Keine aktuelle Datenbank</translation> + </message> + <message> + <source>No source database, nothing to do.</source> + <translation>Keine Quelldatenbank, es gibt nichts zu tun.</translation> + </message> + <message> + <source>Search Results (%1)</source> + <translation>Suchergebnisse (%1)</translation> + </message> + <message> + <source>No Results</source> + <translation>Keine Ergebnisse</translation> + </message> + <message> + <source>Execute command?</source> + <translation>Befehl ausführen?</translation> + </message> + <message> + <source>Do you really want to execute the following command?<br><br>%1<br></source> + <translation>Den folgenden Befehl wirklich ausführen?<br><br>%1<br></translation> + </message> + <message> + <source>Remember my choice</source> + <translation>Meine Auswahl merken</translation> + </message> + <message> + <source>Autoreload Request</source> + <translation>Autoreload Anfrage</translation> + </message> + <message> + <source>The database file has changed. Do you want to load the changes?</source> + <translation>Die Datenbank wurde verändert. Möchten Sie die Änderungen laden?</translation> + </message> + <message> + <source>Merge Request</source> + <translation>Zusammenführ-Anfrage</translation> + </message> + <message> + <source>The database file has changed and you have unsaved changes.Do you want to merge your changes?</source> + <translation>Die Datenbank wurde verändert und Sie haben ungespeicherte Änderungen. Möchten Sie Ihre Änderungen zusammenfügen?</translation> + </message> + <message> + <source>Autoreload Failed</source> + <translation>Autoreload fehlgeschlagen</translation> + </message> + <message> + <source>Could not parse or unlock the new database file while attempting to autoreload this database.</source> + <translation>Kann Datenbank nicht durchsuchen oder entsperren während dem Autoreload-Versuch dieser Datenbank.</translation> + </message> + <message> + <source>Could not open the new database file while attempting to autoreload this database.</source> + <translation>Kann die Datenbank nicht öffnen während dem Versuch, diese Datenbank automatisch neu zu laden.</translation> </message> </context> <context> @@ -623,10 +715,6 @@ Soll sie dennoch gespeichert werden? </translation> <translation>Wiederholen:</translation> </message> <message> - <source>Gen.</source> - <translation>Gen.</translation> - </message> - <message> <source>URL:</source> <translation>URL:</translation> </message> @@ -743,17 +831,25 @@ Soll sie dennoch gespeichert werden? </translation> <source>Can't delete icon!</source> <translation>Symbol kann nicht gelöscht werden!</translation> </message> - <message numerus="yes"> - <source>Can't delete icon. Still used by %n item(s).</source> - <translation><numerusform>Symbol kann nicht gelöscht werden. Es wird von %n Eintrag verwendet.</numerusform><numerusform>Symbol kann nicht gelöscht werden. Es wird von %n Einträgen verwendet.</numerusform></translation> - </message> <message> <source>Error</source> - <translation type="unfinished"/> + <translation>Fehler</translation> + </message> + <message> + <source>Download favicon</source> + <translation>Favicon herunterladen</translation> </message> <message> - <source>Can't read icon:</source> - <translation type="unfinished"/> + <source>Unable to fetch favicon.</source> + <translation>Abrufen des Favicons nicht möglich</translation> + </message> + <message> + <source>Can't read icon</source> + <translation>Icon kann nicht gelesen werden</translation> + </message> + <message> + <source>Can't delete icon. Still used by %1 items.</source> + <translation>Symbol kann nicht gelöscht werden. Es wird noch von %1 Einträgen verwendet.</translation> </message> </context> <context> @@ -776,6 +872,13 @@ Soll sie dennoch gespeichert werden? </translation> </message> </context> <context> + <name>Entry</name> + <message> + <source> - Clone</source> + <translation>- Klone</translation> + </message> +</context> +<context> <name>EntryAttributesModel</name> <message> <source>Name</source> @@ -828,6 +931,61 @@ Soll sie dennoch gespeichert werden? </translation> </message> </context> <context> + <name>HttpPasswordGeneratorWidget</name> + <message> + <source>Length:</source> + <translation>Länge:</translation> + </message> + <message> + <source>Character Types</source> + <translation>Zeichenarten</translation> + </message> + <message> + <source>Upper Case Letters</source> + <translation>Großbuchstaben</translation> + </message> + <message> + <source>A-Z</source> + <translation>A-Z</translation> + </message> + <message> + <source>Lower Case Letters</source> + <translation>Kleinbuchstaben</translation> + </message> + <message> + <source>a-z</source> + <translation>a-z</translation> + </message> + <message> + <source>Numbers</source> + <translation>Zahlen</translation> + </message> + <message> + <source>0-9</source> + <translation>0-9</translation> + </message> + <message> + <source>Special Characters</source> + <translation>Sonderzeichen</translation> + </message> + <message> + <source>/*_& ...</source> + <translation>/*_& ...</translation> + </message> + <message> + <source>Exclude look-alike characters</source> + <translation>Gleich aussehende Zeichen ausschließen</translation> + </message> + <message> + <source>Ensure that the password contains characters from every group</source> + <translation>Sicherstellen, dass das Passwort Zeichen aus allen Gruppen enthält.</translation> + </message> + <message> + <source>Accept</source> + <translation>Akzeptieren</translation> + </message> +</context> +<context> <name>KeePass1OpenWidget</name> <message> <source>Import KeePass1 database</source> @@ -870,7 +1028,7 @@ Soll sie dennoch gespeichert werden? </translation> </message> <message> <source>Wrong key or database file is corrupt.</source> - <translation type="unfinished"/> + <translation>Falscher Schlüssel oder die Datenbank ist beschädigt.</translation> </message> </context> <context> @@ -909,8 +1067,8 @@ Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann <translation>Fataler Fehler beim Testen der kryptografischen Funktionen.</translation> </message> <message> - <source>KeePassX - Error</source> - <translation>KeePassX - Fehler</translation> + <source>KeePassXC - Error</source> + <translation>KeePassXC - Fehler</translation> </message> </context> <context> @@ -920,188 +1078,319 @@ Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann <translation>Datenbank</translation> </message> <message> - <source>Recent databases</source> - <translation>Aktuelle Datenbanken</translation> + <source>Open database</source> + <translation>Datenbank öffnen</translation> </message> <message> - <source>Help</source> - <translation>Hilfe</translation> + <source>Database settings</source> + <translation>Datenbankeinstellungen</translation> </message> <message> - <source>Entries</source> - <translation>Einträge</translation> + <source>Copy username to clipboard</source> + <translation>Benutzername in die Zwischenablage kopieren</translation> </message> <message> - <source>Copy attribute to clipboard</source> - <translation>Eingenschaft in die Zwischenablage kopieren</translation> + <source>Copy password to clipboard</source> + <translation>Passwort in die Zwischenablage kopieren</translation> </message> <message> - <source>Groups</source> - <translation>Gruppen</translation> + <source>Settings</source> + <translation>Einstellungen</translation> </message> <message> - <source>View</source> - <translation>Ansicht</translation> + <source>Show toolbar</source> + <translation>Symbolleiste anzeigen</translation> </message> <message> - <source>Quit</source> - <translation>Beenden</translation> + <source>read-only</source> + <translation>Nur Lesezugriff</translation> </message> <message> - <source>About</source> - <translation>Über</translation> + <source>Toggle window</source> + <translation>Fenster zeigen/verstecken</translation> </message> <message> - <source>Open database</source> - <translation>Datenbank öffnen</translation> + <source>Tools</source> + <translation>Tools</translation> </message> <message> - <source>Save database</source> - <translation>Datenbank speichern</translation> + <source>KeePass 2 Database</source> + <translation>KeePass 2 Datenbank</translation> </message> <message> - <source>Close database</source> - <translation>Datenbank schließen</translation> + <source>All files</source> + <translation>Alle Dateien</translation> </message> <message> - <source>New database</source> - <translation>Neue Datenbank</translation> + <source>Save repaired database</source> + <translation>Reparierte Datenbank speichern</translation> </message> <message> - <source>Add new entry</source> - <translation>Neuen Eintrag hinzufügen</translation> + <source>Error</source> + <translation>Fehler</translation> </message> <message> - <source>View/Edit entry</source> - <translation>Eintrag anzeigen/bearbeiten</translation> + <source>Writing the database failed.</source> + <translation>Schreiben der Datenbank fehlgeschlagen.</translation> </message> <message> - <source>Delete entry</source> - <translation>Eintrag löschen</translation> + <source>&Recent databases</source> + <translation>&Letzte Datenbanken</translation> </message> <message> - <source>Add new group</source> - <translation>Neue Gruppe hinzufügen</translation> + <source>He&lp</source> + <translation>Hi&lfe</translation> </message> <message> - <source>Edit group</source> - <translation>Gruppe bearbeiten</translation> + <source>E&ntries</source> + <translation>Ei&nträge</translation> </message> <message> - <source>Delete group</source> - <translation>Gruppe löschen</translation> + <source>Copy att&ribute to clipboard</source> + <translation>Eigenschaft in &Zwischenablage kopieren</translation> </message> <message> - <source>Save database as</source> - <translation>Datenbank speichern als</translation> + <source>&Groups</source> + <translation>&Gruppen</translation> </message> <message> - <source>Change master key</source> - <translation>Hauptschlüssel ändern</translation> + <source>&View</source> + <translation>&Ansicht</translation> </message> <message> - <source>Database settings</source> - <translation>Datenbankeinstellungen</translation> + <source>&Quit</source> + <translation>&Beenden</translation> </message> <message> - <source>Import KeePass 1 database</source> - <translation>KeePass 1 Datenbank importieren</translation> + <source>&About</source> + <translation>&Über</translation> </message> <message> - <source>Clone entry</source> - <translation>Eintrag klonen</translation> + <source>&Open database</source> + <translation>&Öffne Datenbank</translation> </message> <message> - <source>Find</source> - <translation>Suchen</translation> + <source>&Save database</source> + <translation>Datenbank &speichern</translation> </message> <message> - <source>Copy username to clipboard</source> - <translation>Benutzername in die Zwischenablage kopieren</translation> + <source>&Close database</source> + <translation>&Datenbank schließen</translation> </message> <message> - <source>Copy password to clipboard</source> - <translation>Passwort in die Zwischenablage kopieren</translation> + <source>&New database</source> + <translation>&Neue Datenbank</translation> </message> <message> - <source>Settings</source> - <translation>Einstellungen</translation> + <source>Merge from KeePassX database</source> + <translation>Von KeePassX-Datenbank zusammenführen</translation> </message> <message> - <source>Perform Auto-Type</source> - <translation>Auto-Type ausführen</translation> + <source>&Add new entry</source> + <translation>Neuen Eintrag &hinzufügen</translation> </message> <message> - <source>Open URL</source> - <translation>URL öffnen</translation> + <source>&View/Edit entry</source> + <translation>Eintrag &anzeigen/bearbeiten</translation> </message> <message> - <source>Lock databases</source> - <translation>Datenbank sperren</translation> + <source>&Delete entry</source> + <translation>Eintrag &löschen</translation> </message> <message> - <source>Title</source> - <translation>Titel</translation> + <source>&Add new group</source> + <translation>&Neue Gruppe hinzufügen</translation> </message> <message> - <source>URL</source> - <translation>URL</translation> + <source>&Edit group</source> + <translation>Gruppe b&earbeiten</translation> </message> <message> - <source>Notes</source> - <translation>Notizen</translation> + <source>&Delete group</source> + <translation>Gruppe &löschen</translation> </message> <message> - <source>Show toolbar</source> - <translation>Symbolleiste anzeigen</translation> + <source>Sa&ve database as</source> + <translation>Datenbank s&peichern als</translation> </message> <message> - <source>read-only</source> - <translation>Nur Lesezugriff</translation> + <source>Change &master key</source> + <translation>&Hauptschlüssel ändern</translation> </message> <message> - <source>Toggle window</source> - <translation>Fenster zeigen/verstecken</translation> + <source>&Database settings</source> + <translation>&Datenbankeinstellungen</translation> </message> <message> - <source>Tools</source> - <translation>Tools</translation> + <source>&Import KeePass 1 database</source> + <translation>&KeePass 1 Datenbank importieren</translation> </message> <message> - <source>Copy username</source> - <translation>Benutzername kopieren</translation> + <source>&Clone entry</source> + <translation>Eintrag &klonen</translation> </message> <message> - <source>Copy password</source> - <translation>Passwort kopieren</translation> + <source>&Find</source> + <translation>&Suchen</translation> </message> <message> - <source>Export to CSV file</source> - <translation>Als CSV Datei exportieren</translation> + <source>Copy &username</source> + <translation>&Benutzername kopieren</translation> </message> <message> - <source>Repair database</source> - <translation>Datenbank reparieren</translation> + <source>Cop&y password</source> + <translation>Passwort kop&ieren</translation> </message> <message> - <source>KeePass 2 Database</source> - <translation>KeePass 2 Datenbank</translation> + <source>&Settings</source> + <translation>&Einstellungen</translation> </message> <message> - <source>All files</source> - <translation>Alle Dateien</translation> + <source>&Perform Auto-Type</source> + <translation>&Auto-Type ausführen</translation> </message> <message> - <source>Save repaired database</source> - <translation>Reparierte Datenbank speichern</translation> + <source>&Open URL</source> + <translation>URL &öffnen</translation> </message> <message> - <source>Error</source> - <translation>Fehler</translation> + <source>&Lock databases</source> + <translation>Datenbank &sperren</translation> </message> <message> - <source>Writing the database failed.</source> - <translation>Schreiben der Datenbank fehlgeschlagen.</translation> + <source>&Title</source> + <translation>&Titel</translation> + </message> + <message> + <source>&URL</source> + <translation>&URL</translation> + </message> + <message> + <source>&Notes</source> + <translation>&Notizen</translation> + </message> + <message> + <source>&Export to CSV file</source> + <translation>Als CSV Datei &exportieren</translation> + </message> + <message> + <source>Re&pair database</source> + <translation>Datenbank re&parieren</translation> + </message> + <message> + <source>Password Generator</source> + <translation>Passwortgenerator</translation> + </message> +</context> +<context> + <name>OptionDialog</name> + <message> + <source>Dialog</source> + <translation>Dialog</translation> + </message> + <message> + <source>General</source> + <translation>Allgemein</translation> + </message> + <message> + <source>Sh&ow a notification when credentials are requested</source> + <translation>Zeig&e eine Benachrichtigung, wenn Anmeldedaten angefordert werden.</translation> + </message> + <message> + <source>&Return only best matching entries for an URL instead +of all entries for the whole domain</source> + <translation>Zeige nur die passendsten Einträge für eine URL, statt +alle Einträge der ganzen Domäne. </translation> + </message> + <message> + <source>&Match URL schemes +Only entries with the same scheme (http://, https://, ftp://, ...) are returned</source> + <translation>Passendes URL Schema +Nur Einträge mit dem gleichen Schema (hhtp://, https://, ftp://, ...) werden angezeigt</translation> + </message> + <message> + <source>Sort matching entries by &username</source> + <translation>Sortiere gefundene Einträge nach &Benutzername</translation> + </message> + <message> + <source>R&emove all shared encryption-keys from active database</source> + <translation>Entferne alle freigegebenen Chiffrierschlüssel aus der aktiven Datenbank</translation> + </message> + <message> + <source>Re&move all stored permissions from entries in active database</source> + <translation>Entferne alle gespeicherten Berechtigungen von Einträgen in der aktiven Datenbank</translation> + </message> + <message> + <source>Password generator</source> + <translation>Passwortgenerator</translation> + </message> + <message> + <source>Advanced</source> + <translation>Fortgeschritten</translation> + </message> + <message> + <source>Activate the following only, if you know what you are doing!</source> + <translation>Aktivieren Sie das Nachfolgende nur dann, wenn Sie sich sicher sind, was sie tun! </translation> + </message> + <message> + <source>Always allow &access to entries</source> + <translation>&Zugriff auf Einträge immer erlauben</translation> + </message> + <message> + <source>Always allow &updating entries</source> + <translation>&Aktualisierung von Einträgen immer erlauben</translation> + </message> + <message> + <source>Searc&h in all opened databases for matching entries</source> + <translation>Suche in allen offenen Datenbanken nach übereinstimmenden Einträgen</translation> + </message> + <message> + <source>Only the selected database has to be connected with a client!</source> + <translation>Nur die ausgewählte Datenbank muss mit dem Client verbunden sein.</translation> + </message> + <message> + <source>&Return also advanced string fields which start with "KPH: "</source> + <translation>Zeige auch erweiterte Zeichenfelder, welche mit "KPH: " beginnen</translation> + </message> + <message> + <source>Automatic creates or updates are not supported for string fields!</source> + <translation>Automatisches Erstellen und Aktualisieren von Zeichenfeldern wird nicht unterstützt!</translation> + </message> + <message> + <source>HTTP Port:</source> + <translation>HTTP Port:</translation> + </message> + <message> + <source>Default port: 19455</source> + <translation>Standard Port:19455</translation> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>Verlange Entsperrung, wenn die Datenbank gesperrt ist.</translation> + </message> + <message> + <source>Sort &matching entries by title</source> + <translation>Sortiere gefundene Einträge nach Titel</translation> + </message> + <message> + <source>Enable KeepassXC HTTP protocol +This is required for accessing your databases from ChromeIPass or PassIFox</source> + <translation>Aktiviere KeePassXC HTTP Protokoll +Dies wird benötigt um von ChromeIPass oder PassIFox auf Deine Datenbank zu zugreifen</translation> + </message> + <message> + <source>KeePassXC will listen to this port on 127.0.0.1</source> + <translation>KeePassXC überwacht diesen Port auf 127.0..0.1</translation> + </message> + <message> + <source>Cannot bind to privileged ports</source> + <translation>Kann nicht zu privilegierte Ports verbinden</translation> + </message> + <message> + <source>Cannot bind to privileged ports below 1024! +Using default port 19455.</source> + <translation>Kann nicht zu privilegierten Ports unter 1024 verbinden! +Benutze Standardport 19455.</translation> </message> </context> <context> @@ -1111,10 +1400,6 @@ Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann <translation>Passwort:</translation> </message> <message> - <source>Length:</source> - <translation>Länge:</translation> - </message> - <message> <source>Character Types</source> <translation>Zeichenarten</translation> </message> @@ -1139,70 +1424,71 @@ Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann <translation>Gleich aussehende Zeichen ausschließen</translation> </message> <message> - <source>Ensure that the password contains characters from every group</source> - <translation>Sicher stellen, dass das Passwort Zeichen aller Gruppen enthält</translation> - </message> - <message> <source>Accept</source> <translation>Akzeptieren</translation> </message> -</context> -<context> - <name>QCommandLineParser</name> <message> - <source>Displays version information.</source> - <translation>Versionsinformationen anzeigen.</translation> + <source>%p%</source> + <translation>%p%</translation> </message> <message> - <source>Displays this help.</source> - <translation>Zeigt diese Hilfe an.</translation> + <source>strength</source> + <translation>Stärke</translation> </message> <message> - <source>Unknown option '%1'.</source> - <translation>Unbekannte Option '%1'.</translation> + <source>entropy</source> + <translation>Entropie</translation> </message> <message> - <source>Unknown options: %1.</source> - <translation>Unbekannte Optionen: '%1'.</translation> + <source>&Length:</source> + <translation>&Länge:</translation> </message> <message> - <source>Missing value after '%1'.</source> - <translation>Fehlender Wert nach '%1'.</translation> + <source>Pick characters from every group</source> + <translation>Zeichen aus allen Gruppen wählen</translation> </message> <message> - <source>Unexpected value after '%1'.</source> - <translation>Unerwarteter Wert nach '%1'.</translation> + <source>Generate</source> + <translation>Generiere</translation> </message> <message> - <source>[options]</source> - <translation>[Optionen]</translation> + <source>Close</source> + <translation>Schließen</translation> </message> <message> - <source>Usage: %1</source> - <translation>Verwendung: %1</translation> + <source>Apply</source> + <translation>Anwenden</translation> </message> <message> - <source>Options:</source> - <translation>Optionen:</translation> + <source>Entropy: %1 bit</source> + <translation>Entropie: %1 bit</translation> </message> <message> - <source>Arguments:</source> - <translation>Argumente:</translation> + <source>Password Quality: %1</source> + <translation>Passwort Qualität: %1</translation> </message> -</context> -<context> - <name>QSaveFile</name> <message> - <source>Existing file %1 is not writable</source> - <translation>Bestehende Datei(en) %1 ist nicht schreibbar</translation> + <source>Poor</source> + <translation>Schlecht</translation> </message> <message> - <source>Writing canceled by application</source> - <translation>Schreiben von der Applikation abgebrochen</translation> + <source>Weak</source> + <translation>Schwach</translation> </message> <message> - <source>Partial write. Partition full?</source> - <translation>Unvollständiger Schreibvorgang. Partition voll?</translation> + <source>Good</source> + <translation>Gut</translation> + </message> + <message> + <source>Excellent</source> + <translation>Exzellent</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <source>Http</source> + <translation>Http</translation> </message> </context> <context> @@ -1242,20 +1528,112 @@ Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann <context> <name>SearchWidget</name> <message> - <source>Find:</source> - <translation>Suchen nach:</translation> + <source>Case Sensitive</source> + <translation>Groß- /Kleinschreibung beachten</translation> </message> <message> - <source>Case sensitive</source> - <translation>Groß-/Kleinschreibung unterscheiden</translation> + <source>Search</source> + <translation>Suche</translation> </message> <message> - <source>Current group</source> - <translation>Aktuelle Gruppe</translation> + <source>Find</source> + <translation>Suchen</translation> </message> <message> - <source>Root group</source> - <translation>Root-Gruppe</translation> + <source>Clear</source> + <translation>löschen</translation> + </message> +</context> +<context> + <name>Service</name> + <message> + <source>A shared encryption-key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation>Ein freigegebener Chiffrierschlüssel mit dem Namen "%1" existiert schon. +Willst Du ihn überschreiben?</translation> + </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>Möchten Sie wirklich die Informationen in %1 - %2 aktualisieren?</translation> + </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>Die aktive Datenbank ist gesperrt! +Bitte entsperren Sie die markierte Datenbank oder wählen Sie eine andere, die entsperrt ist.</translation> + </message> + <message> + <source>Successfully removed %1 encryption-%2 from KeePassX/Http Settings.</source> + <translation>%1 Verschlüsselungs-%2 erfolgreich von KeePassX/Http Einstellungen entfernt.</translation> + </message> + <message> + <source>No shared encryption-keys found in KeePassHttp Settings.</source> + <translation>Kein freigegebener Chiffrierschlüssel in den KeePassHttp-Einstellungen gefunden.</translation> + </message> + <message> + <source>The active database does not contain an entry of KeePassHttp Settings.</source> + <translation>Die aktive Datenbank enthält keinen Eintrag für KeePassHttp Einstellungen.</translation> + </message> + <message> + <source>Removing stored permissions...</source> + <translation>Gespeicherte Berechtigungen werden gelöscht...</translation> + </message> + <message> + <source>Abort</source> + <translation>Abbrechen</translation> + </message> + <message> + <source>Successfully removed permissions from %1 %2.</source> + <translation>Berechtigungen wurden von %1 %2 erfolgreich gelöscht.</translation> + </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation>The aktive Datenbank enthält keinen Eintrag mit Zugangsdaten.</translation> + </message> + <message> + <source>KeePassXC: New key association request</source> + <translation>KeePassXC: Neue Schlüsselverbindungsanfrage</translation> + </message> + <message> + <source>You have received an association request for the above key. +If you would like to allow it access to your KeePassXC database +give it a unique name to identify and accept it.</source> + <translation>Sie haben eine Verbindungsanfrage für den obigen Schlüssel +erhalten. Wenn Sie den Zugriff auf Ihre KeePassXC-Datenbank +erlauben möchten, geben Sie der Verbindungen einen eindeutigen +Namen und akzeptieren Sie.</translation> + </message> + <message> + <source>KeePassXC: Overwrite existing key?</source> + <translation>KeePassXC: Bestehenden Schlüssel überschreiben?</translation> + </message> + <message> + <source>KeePassXC: Update Entry</source> + <translation>KeePassXC: Eintrag aktualisiert</translation> + </message> + <message> + <source>KeePassXC: Database locked!</source> + <translation>KeePassXC: Datenbank gesperrt!</translation> + </message> + <message> + <source>KeePassXC: Removed keys from database</source> + <translation>KeePassXC: Entfernte Schlüssel von der Datenbank</translation> + </message> + <message> + <source>KeePassXC: No keys found</source> + <translation>KeePassXC: Kein Schlüssel gefunden</translation> + </message> + <message> + <source>KeePassXC: Settings not available!</source> + <translation>KeePassXC: Einstellung nicht verfügbar!</translation> + </message> + <message> + <source>KeePassXC: Removed permissions</source> + <translation>KeePassXC: Entfernte Zugangsdaten</translation> + </message> + <message> + <source>KeePassXC: No entry with permissions found!</source> + <translation>KeePassXC: Kein Eintrag mit Zugangsdaten gefunden!</translation> </message> </context> <context> @@ -1280,10 +1658,6 @@ Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann <translation>Letzte Datenbank merken</translation> </message> <message> - <source>Open previous databases on startup</source> - <translation>Letzte Datenbank beim Starten öffnen</translation> - </message> - <message> <source>Automatically save on exit</source> <translation>Automatisch speichern beim Schließen</translation> </message> @@ -1324,12 +1698,20 @@ Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann <translation>Letzte Schlüsseldateien merken</translation> </message> <message> - <source>Hide window to system tray instead of App Exit</source> - <translation>Fenster zu Taskleistensymbol minimieren statt Programm beenden</translation> + <source>Load previous databases on startup</source> + <translation>Letzte Datenbank beim Starten laden</translation> + </message> + <message> + <source>Automatically reload the database when modified externally</source> + <translation>Datenbank nach externer Modifikation automatisch neu laden.</translation> </message> <message> - <source>Hide window to system tray on App start</source> - <translation>Fenster zu Taskleistensymbol minimieren wenn Programm started</translation> + <source>Hide window to system tray instead of app exit</source> + <translation>Fenster zur Taskleiste minimieren statt das Programm zu beenden</translation> + </message> + <message> + <source>Minimize window at application startup</source> + <translation>Fenster beim Programmstart minimieren</translation> </message> </context> <context> @@ -1354,6 +1736,14 @@ Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann <source>Always ask before performing auto-type</source> <translation>Immer vor einem Auto-type fragen</translation> </message> + <message> + <source>Lock databases after minimizing the window</source> + <translation>Datenbank sperren nach dem Minimieren des Fensters</translation> + </message> + <message> + <source>Don't require password repeat when it is visible</source> + <translation>Keine erneute Eingabe verlangen wenn Passwort sichtbar.</translation> + </message> </context> <context> <name>UnlockDatabaseWidget</name> @@ -1372,14 +1762,6 @@ Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann <context> <name>main</name> <message> - <source>KeePassX - cross-platform password manager</source> - <translation>KeePassX - plattformübergreifender Passwortmanager</translation> - </message> - <message> - <source>filename of the password database to open (*.kdbx)</source> - <translation>Dateiname für die zu öffnende Passwortdatenbank (*.kdbx)</translation> - </message> - <message> <source>path to a custom config file</source> <translation>Pfad zu einer benutzerdefinierten Konfigurationsdatei</translation> </message> @@ -1387,5 +1769,17 @@ Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann <source>key file of the database</source> <translation>Schlüsseldatei der Datenbank</translation> </message> + <message> + <source>filename(s) of the password database(s) to open (*.kdbx)</source> + <translation>Dateiname(n) der zu öffnenden Passwortdatenbank(en) (*.kdbx)</translation> + </message> + <message> + <source>KeePassXC - cross-platform password manager</source> + <translation>KeePassXC - plattformübergreifender Passwortmanager</translation> + </message> + <message> + <source>read password of the database from stdin</source> + <translation>passwort der datenbank von stdin lesen</translation> + </message> </context> </TS>
\ No newline at end of file diff --git a/share/translations/keepassx_en.ts b/share/translations/keepassx_en.ts index bbf574b47..d55617134 100644 --- a/share/translations/keepassx_en.ts +++ b/share/translations/keepassx_en.ts @@ -19,6 +19,11 @@ <source>KeePassXC is distributed under the term of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> <translation type="unfinished"></translation> </message> + <message> + <source>Extensions: +</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>AccessControlDialog</name> @@ -475,6 +480,46 @@ Do you want to save it anyway?</source> <source>No Results</source> <translation type="unfinished"></translation> </message> + <message> + <source>Execute command?</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Do you really want to execute the following command?<br><br>%1<br></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Remember my choice</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Autoreload Request</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>The database file has changed. Do you want to load the changes?</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Merge Request</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>The database file has changed and you have unsaved changes.Do you want to merge your changes?</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Autoreload Failed</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Could not parse or unlock the new database file while attempting to autoreload this database.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Could not open the new database file while attempting to autoreload this database.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>EditEntryWidget</name> @@ -670,10 +715,6 @@ Do you want to save it anyway?</source> <translation type="unfinished"></translation> </message> <message> - <source>Gen.</source> - <translation type="unfinished"></translation> - </message> - <message> <source>URL:</source> <translation type="unfinished"></translation> </message> @@ -831,6 +872,13 @@ Do you want to save it anyway?</source> </message> </context> <context> + <name>Entry</name> + <message> + <source> - Clone</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>EntryAttributesModel</name> <message> <source>Name</source> @@ -1226,6 +1274,10 @@ This is a one-way migration. You won't be able to open the imported databas <source>Re&pair database</source> <translation type="unfinished"></translation> </message> + <message> + <source>Password Generator</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>OptionDialog</name> @@ -1300,32 +1352,37 @@ Only entries with the same scheme (http://, https://, ftp://, ...) are returned< <translation type="unfinished"></translation> </message> <message> - <source>HTTP Host:</source> + <source>HTTP Port:</source> <translation type="unfinished"></translation> </message> <message> - <source>Default host: localhost</source> + <source>Default port: 19455</source> <translation type="unfinished"></translation> </message> <message> - <source>HTTP Port:</source> + <source>Re&quest to unlock the database if it is locked</source> <translation type="unfinished"></translation> </message> <message> - <source>Default port: 19455</source> + <source>Sort &matching entries by title</source> <translation type="unfinished"></translation> </message> <message> - <source>Enable KeepassXC Http protocol + <source>Enable KeepassXC HTTP protocol This is required for accessing your databases from ChromeIPass or PassIFox</source> <translation type="unfinished"></translation> </message> <message> - <source>Re&quest to unlock the database if it is locked</source> + <source>KeePassXC will listen to this port on 127.0.0.1</source> <translation type="unfinished"></translation> </message> <message> - <source>Sort &matching entries by title</source> + <source>Cannot bind to privileged ports</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Cannot bind to privileged ports below 1024! +Using default port 19455.</source> <translation type="unfinished"></translation> </message> </context> @@ -1336,10 +1393,6 @@ This is required for accessing your databases from ChromeIPass or PassIFox</sour <translation type="unfinished"></translation> </message> <message> - <source>Length:</source> - <translation type="unfinished"></translation> - </message> - <message> <source>Character Types</source> <translation type="unfinished"></translation> </message> @@ -1364,11 +1417,63 @@ This is required for accessing your databases from ChromeIPass or PassIFox</sour <translation type="unfinished"></translation> </message> <message> - <source>Ensure that the password contains characters from every group</source> + <source>Accept</source> <translation type="unfinished"></translation> </message> <message> - <source>Accept</source> + <source>%p%</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>strength</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>entropy</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Length:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Pick characters from every group</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Generate</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Close</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Apply</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Entropy: %1 bit</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Password Quality: %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Poor</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Weak</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Good</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Excellent</source> <translation type="unfinished"></translation> </message> </context> @@ -1416,15 +1521,19 @@ This is required for accessing your databases from ChromeIPass or PassIFox</sour <context> <name>SearchWidget</name> <message> - <source>Find:</source> + <source>Case Sensitive</source> <translation type="unfinished"></translation> </message> <message> - <source>Case Sensitive</source> + <source>Search</source> <translation type="unfinished"></translation> </message> <message> - <source>Search Current Group</source> + <source>Find</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Clear</source> <translation type="unfinished"></translation> </message> </context> @@ -1537,10 +1646,6 @@ give it a unique name to identify and accept it.</source> <translation type="unfinished"></translation> </message> <message> - <source>Open previous databases on startup</source> - <translation type="unfinished"></translation> - </message> - <message> <source>Automatically save on exit</source> <translation type="unfinished"></translation> </message> @@ -1581,11 +1686,19 @@ give it a unique name to identify and accept it.</source> <translation type="unfinished"></translation> </message> <message> - <source>Hide window to system tray instead of App Exit</source> + <source>Load previous databases on startup</source> <translation type="unfinished"></translation> </message> <message> - <source>Hide window to system tray on App start</source> + <source>Automatically reload the database when modified externally</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Hide window to system tray instead of app exit</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Minimize window at application startup</source> <translation type="unfinished"></translation> </message> </context> @@ -1615,6 +1728,10 @@ give it a unique name to identify and accept it.</source> <source>Lock databases after minimizing the window</source> <translation type="unfinished"></translation> </message> + <message> + <source>Don't require password repeat when it is visible</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UnlockDatabaseWidget</name> diff --git a/share/translations/keepassx_lt.ts b/share/translations/keepassx_lt.ts index 41aa94df7..824101c51 100644 --- a/share/translations/keepassx_lt.ts +++ b/share/translations/keepassx_lt.ts @@ -1,15 +1,7 @@ -<?xml version="1.0" ?><!DOCTYPE TS><TS language="lt" version="2.0"> +<?xml version="1.0" ?><!DOCTYPE TS><TS language="lt" version="2.1"> <context> <name>AboutDialog</name> <message> - <source>About KeePassX</source> - <translation>Apie KeePassX</translation> - </message> - <message> - <source>KeePassX is distributed under the term of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> - <translation>KeePassX yra platinama GNU Bendrosios Viešosios Licencijos (GPL) versijos 2 arba (jūsų pasirinkimu) versijos 3 sąlygomis.</translation> - </message> - <message> <source>Revision</source> <translation>Poversijis</translation> </message> @@ -17,17 +9,56 @@ <source>Using:</source> <translation>Naudojama:</translation> </message> + <message> + <source>About KeePassXC</source> + <translation>Apie KeePassXC</translation> + </message> + <message> + <source>KeePassXC is distributed under the term of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> + <translation>KeePassXC yra platinama GNU Bendrosios Viešosios Licencijos (GPL) versijos 2 arba (jūsų pasirinkimu) versijos 3 sąlygomis.</translation> + </message> + <message> + <source>Extensions: +</source> + <translation>Plėtiniai: +</translation> + </message> </context> <context> - <name>AutoType</name> + <name>AccessControlDialog</name> + <message> + <source>Remember this decision</source> + <translation>Prisiminti šį sprendimą</translation> + </message> <message> - <source>Auto-Type - KeePassX</source> - <translation>Automatinis rinkimas - KeePassX</translation> + <source>Allow</source> + <translation>Leisti</translation> </message> <message> + <source>Deny</source> + <translation>Atmesti</translation> + </message> + <message> + <source>%1 has requested access to passwords for the following item(s). +Please select whether you want to allow access.</source> + <translation>%1 užklausė prieigos prie slaptažodžių šiam elementui(-ams). +Pasirinkite, ar norite leisti prieigą.</translation> + </message> + <message> + <source>KeePassXC HTTP Confirm Access</source> + <translation>KeePassXC HTTP prieigos patvirtinimas</translation> + </message> +</context> +<context> + <name>AutoType</name> + <message> <source>Couldn't find an entry that matches the window title:</source> <translation>Nepavyko rasti įrašo, kuris atitiktų lango antraštę:</translation> </message> + <message> + <source>Auto-Type - KeePassXC</source> + <translation>Automatinis rinkimas - KeePassXC</translation> + </message> </context> <context> <name>AutoTypeAssociationsModel</name> @@ -47,13 +78,13 @@ <context> <name>AutoTypeSelectDialog</name> <message> - <source>Auto-Type - KeePassX</source> - <translation>Automatinis rinkimas - KeePassX</translation> - </message> - <message> <source>Select entry to Auto-Type:</source> <translation>Pasirinkite įrašą automatiniam rinkimui:</translation> </message> + <message> + <source>Auto-Type - KeePassXC</source> + <translation>Automatinis rinkimas - KeePassXC</translation> + </message> </context> <context> <name>ChangeMasterKeyWidget</name> @@ -320,12 +351,6 @@ Save changes?</source> <translation>užrakinta</translation> </message> <message> - <source>The database you are trying to open is locked by another instance of KeePassX. -Do you want to open it anyway? Alternatively the database is opened read-only.</source> - <translation>Duomenų bazė, kurią bandote atverti, yra užrakinta kito KeePassX egzemplioriaus. -Ar vis tiek norite ją atverti? Kitu atveju duomenų bazė bus atverta tik skaitymui.</translation> - </message> - <message> <source>Lock database</source> <translation>Užrakinti duomenų bazę</translation> </message> @@ -368,14 +393,24 @@ Vis tiek atmesti pakeitimus ir užverti?</translation> <translation>CSV failo įrašymas nepavyko.</translation> </message> <message> - <source>The database you are trying to save as is locked by another instance of KeePassX. -Do you want to save it anyway?</source> - <translation>Duomenų bazė, kurią bandote įrašyti yra užrakinta kito KeePassX programos egzemplioriaus. -Ar vis tiek norite ją įrašyti?</translation> + <source>Unable to open the database.</source> + <translation>Nepavyko atverti duomenų bazės.</translation> </message> <message> - <source>Unable to open the database.</source> - <translation type="unfinished"/> + <source>The database you are trying to open is locked by another instance of KeePassXC. +Do you want to open it anyway? Alternatively the database is opened read-only.</source> + <translation>Duomenų bazė, kurią bandote atverti, yra užrakinta kito KeePassXC egzemplioriaus. +Ar vis tiek norite ją atverti? Tokiu atveju duomenų bazė bus atverta tik skaitymui.</translation> + </message> + <message> + <source>Merge database</source> + <translation>Sulieti duomenų bazę</translation> + </message> + <message> + <source>The database you are trying to save as is locked by another instance of KeePassXC. +Do you want to save it anyway?</source> + <translation>Duomenų bazė, kurią bandote įrašyti yra užrakinta kito KeePassXC programos egzemplioriaus. +Ar vis tiek norite ją įrašyti?</translation> </message> </context> <context> @@ -417,10 +452,6 @@ Ar vis tiek norite ją įrašyti?</translation> <translation>Ar tikrai norite ištrinti grupę "%1"?</translation> </message> <message> - <source>Current group</source> - <translation>Esama grupė</translation> - </message> - <message> <source>Error</source> <translation>Klaida</translation> </message> @@ -430,11 +461,71 @@ Ar vis tiek norite ją įrašyti?</translation> </message> <message> <source>Move entry to recycle bin?</source> - <translation type="unfinished"/> + <translation>Perkelti įrašą į šiukšlinę?</translation> </message> <message> <source>Do you really want to move entry "%1" to the recycle bin?</source> - <translation type="unfinished"/> + <translation>Ar tikrai norite perkelti įrašą "%1" į šiukšlinę?</translation> + </message> + <message> + <source>Searching...</source> + <translation>Ieškoma...</translation> + </message> + <message> + <source>No current database.</source> + <translation>Nėra esamos duomenų bazės.</translation> + </message> + <message> + <source>No source database, nothing to do.</source> + <translation>Nėra šaltinio duomenų bazės, nėra ką atlikti.</translation> + </message> + <message> + <source>Search Results (%1)</source> + <translation>Paieškos rezultatai (%1)</translation> + </message> + <message> + <source>No Results</source> + <translation>Nėra rezultatų</translation> + </message> + <message> + <source>Execute command?</source> + <translation>Vykdyti komandą?</translation> + </message> + <message> + <source>Do you really want to execute the following command?<br><br>%1<br></source> + <translation>Ar tikrai norite vykdyti šią komandą?<br><br>%1<br></translation> + </message> + <message> + <source>Remember my choice</source> + <translation>Prisiminti mano pasirinkimą</translation> + </message> + <message> + <source>Autoreload Request</source> + <translation>Automatinio įkėlimo iš naujo užklausa</translation> + </message> + <message> + <source>The database file has changed. Do you want to load the changes?</source> + <translation>Duomenų bazės failas pasikeitė. Ar norite įkelti pakeitimus?</translation> + </message> + <message> + <source>Merge Request</source> + <translation>Suliejimo užklausa</translation> + </message> + <message> + <source>The database file has changed and you have unsaved changes.Do you want to merge your changes?</source> + <translation>Duomenų bazės failas pasikeitė ir jūs turite neįrašytų pakeitimų. Ar norite sulieti savo pakeitimus?</translation> + </message> + <message> + <source>Autoreload Failed</source> + <translation>Automatinis įkėlimas iš naujo nepavyko</translation> + </message> + <message> + <source>Could not parse or unlock the new database file while attempting to autoreload this database.</source> + <translation>Nepavyko išanalizuoti ar atrakinti naujos duomenų bazės failo, bandant automatiškai iš naujo įkelti šią duomenų bazę.</translation> + </message> + <message> + <source>Could not open the new database file while attempting to autoreload this database.</source> + <translation>Nepavyko atverti naujos duomenų bazės failo, bandant automatiškai iš naujo įkelti šią duomenų bazę.</translation> </message> </context> <context> @@ -626,10 +717,6 @@ Ar vis tiek norite ją įrašyti?</translation> <translation>Pakartokite:</translation> </message> <message> - <source>Gen.</source> - <translation>Kurti</translation> - </message> - <message> <source>URL:</source> <translation>URL:</translation> </message> @@ -746,17 +833,25 @@ Ar vis tiek norite ją įrašyti?</translation> <source>Can't delete icon!</source> <translation>Nepavyksta ištrinti piktogramos!</translation> </message> - <message numerus="yes"> - <source>Can't delete icon. Still used by %n item(s).</source> - <translation><numerusform>Nepavyksta ištrinti piktogramos. Vis dar naudojama %n elemento.</numerusform><numerusform>Nepavyksta ištrinti piktogramos. Vis dar naudojama %n elementų.</numerusform><numerusform>Nepavyksta ištrinti piktogramos. Vis dar naudojama %n elementų.</numerusform></translation> - </message> <message> <source>Error</source> - <translation type="unfinished"/> + <translation>Klaida</translation> </message> <message> - <source>Can't read icon:</source> - <translation type="unfinished"/> + <source>Download favicon</source> + <translation>Atsisiųsti svetainės piktogramą</translation> + </message> + <message> + <source>Unable to fetch favicon.</source> + <translation>Nepavyko gauti svetainės piktogramos.</translation> + </message> + <message> + <source>Can't read icon</source> + <translation>Nepavyksta perskaityti piktogramos</translation> + </message> + <message> + <source>Can't delete icon. Still used by %1 items.</source> + <translation>Nepavyksta ištrinti piktogramos. Vis dar naudojama %1 elementų.</translation> </message> </context> <context> @@ -779,6 +874,13 @@ Ar vis tiek norite ją įrašyti?</translation> </message> </context> <context> + <name>Entry</name> + <message> + <source> - Clone</source> + <translation> - Dublikatas</translation> + </message> +</context> +<context> <name>EntryAttributesModel</name> <message> <source>Name</source> @@ -831,6 +933,61 @@ Ar vis tiek norite ją įrašyti?</translation> </message> </context> <context> + <name>HttpPasswordGeneratorWidget</name> + <message> + <source>Length:</source> + <translation>Ilgis:</translation> + </message> + <message> + <source>Character Types</source> + <translation>Simbolių tipai</translation> + </message> + <message> + <source>Upper Case Letters</source> + <translation>Viršutinio registro raidės</translation> + </message> + <message> + <source>A-Z</source> + <translation>A-Z</translation> + </message> + <message> + <source>Lower Case Letters</source> + <translation>Apatinio registro raidės</translation> + </message> + <message> + <source>a-z</source> + <translation>a-z</translation> + </message> + <message> + <source>Numbers</source> + <translation>Skaičiai</translation> + </message> + <message> + <source>0-9</source> + <translation>0-9</translation> + </message> + <message> + <source>Special Characters</source> + <translation>Specialūs simboliai</translation> + </message> + <message> + <source>/*_& ...</source> + <translation>/*_& ...</translation> + </message> + <message> + <source>Exclude look-alike characters</source> + <translation>Pašalinti panašiai atrodančius simbolius</translation> + </message> + <message> + <source>Ensure that the password contains characters from every group</source> + <translation>Užtikrinti, kad slaptažodyje būtų simboliai iš kiekvienos grupės</translation> + </message> + <message> + <source>Accept</source> + <translation>Priimti</translation> + </message> +</context> +<context> <name>KeePass1OpenWidget</name> <message> <source>Import KeePass1 database</source> @@ -873,7 +1030,7 @@ Ar vis tiek norite ją įrašyti?</translation> </message> <message> <source>Wrong key or database file is corrupt.</source> - <translation type="unfinished"/> + <translation>Neteisingas raktas arba duomenų bazės failas yra pažeistas.</translation> </message> </context> <context> @@ -912,8 +1069,8 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų <translation>Lemtingoji klaida, testuojant šifravimo funkcijas.</translation> </message> <message> - <source>KeePassX - Error</source> - <translation>KeePassX - Klaida</translation> + <source>KeePassXC - Error</source> + <translation>KeePassXC - Klaida</translation> </message> </context> <context> @@ -923,188 +1080,319 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų <translation>Duomenų bazė</translation> </message> <message> - <source>Recent databases</source> - <translation>Paskiausios duomenų bazės</translation> + <source>Open database</source> + <translation>Atverti duomenų bazę</translation> </message> <message> - <source>Help</source> - <translation>Pagalba</translation> + <source>Database settings</source> + <translation>Duomenų bazės nustatymai</translation> </message> <message> - <source>Entries</source> - <translation>Įrašai</translation> + <source>Copy username to clipboard</source> + <translation>Kopijuoti naudotojo vardą į iškarpinę</translation> </message> <message> - <source>Copy attribute to clipboard</source> - <translation>Kopijuoti požymį į iškarpinę</translation> + <source>Copy password to clipboard</source> + <translation>Kopijuoti slaptažodį į iškarpinę</translation> </message> <message> - <source>Groups</source> - <translation>Grupės</translation> + <source>Settings</source> + <translation>Nustatymai</translation> </message> <message> - <source>View</source> - <translation>Rodinys</translation> + <source>Show toolbar</source> + <translation>Rodyti įrankių juostą</translation> </message> <message> - <source>Quit</source> - <translation>Baigti</translation> + <source>read-only</source> + <translation>tik skaitymui</translation> </message> <message> - <source>About</source> - <translation>Apie</translation> + <source>Toggle window</source> + <translation>Perjungti langą</translation> </message> <message> - <source>Open database</source> - <translation>Atverti duomenų bazę</translation> + <source>Tools</source> + <translation>Įrankiai</translation> </message> <message> - <source>Save database</source> - <translation>Įrašyti duomenų bazę</translation> + <source>KeePass 2 Database</source> + <translation>KeePass 2 duomenų bazė</translation> </message> <message> - <source>Close database</source> - <translation>Užverti duomenų bazę</translation> + <source>All files</source> + <translation>Visi failai</translation> </message> <message> - <source>New database</source> - <translation>Nauja duomenų bazė</translation> + <source>Save repaired database</source> + <translation>Įrašyti pataisytą duomenų bazę</translation> </message> <message> - <source>Add new entry</source> - <translation>Pridėti naują įrašą</translation> + <source>Error</source> + <translation>Klaida</translation> </message> <message> - <source>View/Edit entry</source> - <translation>Žiūrėti/Keisti įrašą</translation> + <source>Writing the database failed.</source> + <translation>Duomenų bazės rašymas nepavyko.</translation> </message> <message> - <source>Delete entry</source> - <translation>Ištrinti įrašą</translation> + <source>&Recent databases</source> + <translation>&Paskiausiai naudotos duomenų bazės</translation> </message> <message> - <source>Add new group</source> - <translation>Pridėti naują grupę</translation> + <source>He&lp</source> + <translation>Pa&galba</translation> </message> <message> - <source>Edit group</source> - <translation>Keisti grupę</translation> + <source>E&ntries</source> + <translation>Į&rašai</translation> </message> <message> - <source>Delete group</source> - <translation>Ištrinti grupę</translation> + <source>Copy att&ribute to clipboard</source> + <translation>Kopijuoti &požymį į iškarpinę</translation> </message> <message> - <source>Save database as</source> - <translation>Įrašyti duomenų bazę kaip</translation> + <source>&Groups</source> + <translation>&Grupės</translation> </message> <message> - <source>Change master key</source> - <translation>Pakeisti pagrindinį raktą</translation> + <source>&View</source> + <translation>R&odinys</translation> </message> <message> - <source>Database settings</source> - <translation>Duomenų bazės nustatymai</translation> + <source>&Quit</source> + <translation>&Baigti</translation> </message> <message> - <source>Import KeePass 1 database</source> - <translation>Importuoti KeePass 1 duomenų bazę</translation> + <source>&About</source> + <translation>&Apie</translation> </message> <message> - <source>Clone entry</source> - <translation>Dublikuoti įrašą</translation> + <source>&Open database</source> + <translation>&Atverti duomenų bazę</translation> </message> <message> - <source>Find</source> - <translation>Rasti</translation> + <source>&Save database</source> + <translation>Į&rašyti duomenų bazę</translation> </message> <message> - <source>Copy username to clipboard</source> - <translation>Kopijuoti naudotojo vardą į iškarpinę</translation> + <source>&Close database</source> + <translation>&Užverti duomenų bazę</translation> </message> <message> - <source>Copy password to clipboard</source> - <translation>Kopijuoti slaptažodį į iškarpinę</translation> + <source>&New database</source> + <translation>&Nauja duomenų bazė</translation> </message> <message> - <source>Settings</source> - <translation>Nustatymai</translation> + <source>Merge from KeePassX database</source> + <translation>Sulieti su KeePassX duomenų baze</translation> </message> <message> - <source>Perform Auto-Type</source> - <translation>Atlikti automatinį rinkimą</translation> + <source>&Add new entry</source> + <translation>&Pridėti naują įrašą</translation> </message> <message> - <source>Open URL</source> - <translation>Atverti URL</translation> + <source>&View/Edit entry</source> + <translation>&Rodyti/Taisyti įrašą</translation> </message> <message> - <source>Lock databases</source> - <translation>Užrakinti duomenų bazes</translation> + <source>&Delete entry</source> + <translation>&Ištrinti įrašą</translation> </message> <message> - <source>Title</source> - <translation>Antraštė</translation> + <source>&Add new group</source> + <translation>&Pridėti naują grupę</translation> </message> <message> - <source>URL</source> - <translation>URL</translation> + <source>&Edit group</source> + <translation>&Taisyti grupę</translation> </message> <message> - <source>Notes</source> - <translation>Pastabos</translation> + <source>&Delete group</source> + <translation>&Ištrinti grupę</translation> </message> <message> - <source>Show toolbar</source> - <translation>Rodyti įrankių juostą</translation> + <source>Sa&ve database as</source> + <translation>Įraš&yti duomenų bazę kaip</translation> </message> <message> - <source>read-only</source> - <translation>tik skaitymui</translation> + <source>Change &master key</source> + <translation>Pakeisti &pagrindinį raktą</translation> </message> <message> - <source>Toggle window</source> - <translation>Perjungti langą</translation> + <source>&Database settings</source> + <translation>&Duomenų bazės nustatymai</translation> </message> <message> - <source>Tools</source> - <translation>Įrankiai</translation> + <source>&Import KeePass 1 database</source> + <translation>&Importuoti KeePass 1 duomenų bazę</translation> </message> <message> - <source>Copy username</source> - <translation>Kopijuoti naudotojo vardą</translation> + <source>&Clone entry</source> + <translation>&Dublikuoti įrašą</translation> </message> <message> - <source>Copy password</source> - <translation>Kopijuoti slaptažodį</translation> + <source>&Find</source> + <translation>&Rasti</translation> </message> <message> - <source>Export to CSV file</source> - <translation>Eksportuoti į CSV failą</translation> + <source>Copy &username</source> + <translation>Kopijuoti &naudotojo vardą</translation> </message> <message> - <source>Repair database</source> - <translation>Taisyti duomenų bazę</translation> + <source>Cop&y password</source> + <translation>Kopijuoti &slaptažodį</translation> </message> <message> - <source>KeePass 2 Database</source> - <translation>KeePass 2 duomenų bazė</translation> + <source>&Settings</source> + <translation>&Nustatymai</translation> </message> <message> - <source>All files</source> - <translation>Visi failai</translation> + <source>&Perform Auto-Type</source> + <translation>&Atlikti automatinį rinkimą</translation> </message> <message> - <source>Save repaired database</source> - <translation>Įrašyti pataisytą duomenų bazę</translation> + <source>&Open URL</source> + <translation>Atverti &URL</translation> </message> <message> - <source>Error</source> - <translation>Klaida</translation> + <source>&Lock databases</source> + <translation>&Užrakinti duomenų bazes</translation> </message> <message> - <source>Writing the database failed.</source> - <translation>Duomenų bazės rašymas nepavyko.</translation> + <source>&Title</source> + <translation>&Antraštė</translation> + </message> + <message> + <source>&URL</source> + <translation>&URL</translation> + </message> + <message> + <source>&Notes</source> + <translation>&Pastabos</translation> + </message> + <message> + <source>&Export to CSV file</source> + <translation>&Eksportuoti į CSV failą</translation> + </message> + <message> + <source>Re&pair database</source> + <translation>Pa&taisyti duomenų bazę</translation> + </message> + <message> + <source>Password Generator</source> + <translation>Slaptažodžių generatorius</translation> + </message> +</context> +<context> + <name>OptionDialog</name> + <message> + <source>Dialog</source> + <translation>Dialogas</translation> + </message> + <message> + <source>General</source> + <translation>Bendra</translation> + </message> + <message> + <source>Sh&ow a notification when credentials are requested</source> + <translation>R&odyti pranešimą, kai reikalaujama prisijungimo duomenų</translation> + </message> + <message> + <source>&Return only best matching entries for an URL instead +of all entries for the whole domain</source> + <translation>&Vietoj visų įrašų, skirtų visai sričiai, +grąžinti tik geriausiai atitinkančius įrašus, skirtus URL</translation> + </message> + <message> + <source>&Match URL schemes +Only entries with the same scheme (http://, https://, ftp://, ...) are returned</source> + <translation>&Atitikti URL schemas +Bus grąžinami įrašai tik su ta pačia schema (http://, https://, ftp://, ...)</translation> + </message> + <message> + <source>Sort matching entries by &username</source> + <translation>Rikiuoti atitinkančius įrašus pagal na&udotojo vardą</translation> + </message> + <message> + <source>R&emove all shared encryption-keys from active database</source> + <translation>Ša&linti iš aktyvios duomenų bazės visus bendrinamus šifravimo raktus</translation> + </message> + <message> + <source>Re&move all stored permissions from entries in active database</source> + <translation>Šal&inti iš įrašų aktyvioje duomenų bazėje visus saugomus leidimus</translation> + </message> + <message> + <source>Password generator</source> + <translation>Slaptažodžių generatorius</translation> + </message> + <message> + <source>Advanced</source> + <translation>Išplėstiniai</translation> + </message> + <message> + <source>Activate the following only, if you know what you are doing!</source> + <translation>Aktyvuokite tai tik tuo atveju, jeigu žinote ką darote!</translation> + </message> + <message> + <source>Always allow &access to entries</source> + <translation>Visada leisti &prieigą prie įrašų</translation> + </message> + <message> + <source>Always allow &updating entries</source> + <translation>Visada leisti įrašų at&naujinimą</translation> + </message> + <message> + <source>Searc&h in all opened databases for matching entries</source> + <translation>Ieš&koti atitinkančių įrašų visose atvertose duomenų bazėse</translation> + </message> + <message> + <source>Only the selected database has to be connected with a client!</source> + <translation>Su klientu turi būti sujungta tik pasirinkta duomenų bazė!</translation> + </message> + <message> + <source>&Return also advanced string fields which start with "KPH: "</source> + <translation>&Taip pat grąžinti ir išplėstines eilutes, kurios prasideda "KPH: "</translation> + </message> + <message> + <source>Automatic creates or updates are not supported for string fields!</source> + <translation>Šiems eilutės laukams automatiniai kūrimai ir atnaujinimai neprieinami!</translation> + </message> + <message> + <source>HTTP Port:</source> + <translation>HTTP prievadas:</translation> + </message> + <message> + <source>Default port: 19455</source> + <translation>Numatytasis prievadas: 19455</translation> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>Už&klausti atrakinti duomenų bazę, jeigu ji yra užrakinta</translation> + </message> + <message> + <source>Sort &matching entries by title</source> + <translation>Rikiuoti atitinkančius įrašus pagal &antraštę</translation> + </message> + <message> + <source>Enable KeepassXC HTTP protocol +This is required for accessing your databases from ChromeIPass or PassIFox</source> + <translation>Įjungti KeepassXC HTTP protokolą +Tai reikalinga, norint prie savo duomenų bazių gauti prieigą iš ChromeIPass ar PassIFox</translation> + </message> + <message> + <source>KeePassXC will listen to this port on 127.0.0.1</source> + <translation>KeePassXC klausysis šio prievado ties 127.0.0.1</translation> + </message> + <message> + <source>Cannot bind to privileged ports</source> + <translation>Nepavyksta susieti su privilegijuotais prievadais</translation> + </message> + <message> + <source>Cannot bind to privileged ports below 1024! +Using default port 19455.</source> + <translation>Nepavyksta susieti su privilegijuotais prievadais žemiau 1024! +Naudojamas numatytasis prievadas 19455.</translation> </message> </context> <context> @@ -1114,10 +1402,6 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų <translation>Slaptažodis:</translation> </message> <message> - <source>Length:</source> - <translation>Ilgis:</translation> - </message> - <message> <source>Character Types</source> <translation>Simbolių tipai</translation> </message> @@ -1142,70 +1426,71 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų <translation>Pašalinti panašiai atrodančius simbolius</translation> </message> <message> - <source>Ensure that the password contains characters from every group</source> - <translation>Užtikrinti, kad slaptažodyje yra simboliai iš kiekvienos grupės</translation> - </message> - <message> <source>Accept</source> <translation>Priimti</translation> </message> -</context> -<context> - <name>QCommandLineParser</name> <message> - <source>Displays version information.</source> - <translation>Rodo versijos informaciją.</translation> + <source>%p%</source> + <translation>%p%</translation> </message> <message> - <source>Displays this help.</source> - <translation>Rodo šią pagalbą.</translation> + <source>strength</source> + <translation>stiprumas</translation> </message> <message> - <source>Unknown option '%1'.</source> - <translation>Nežinoma parinktis "%1".</translation> + <source>entropy</source> + <translation>entropija</translation> </message> <message> - <source>Unknown options: %1.</source> - <translation>Nežinomos parinktys: %1.</translation> + <source>&Length:</source> + <translation>&Ilgis:</translation> </message> <message> - <source>Missing value after '%1'.</source> - <translation>Trūksta reikšmės po "%1".</translation> + <source>Pick characters from every group</source> + <translation>Parinkti simbolius iš kiekvienos grupės</translation> </message> <message> - <source>Unexpected value after '%1'.</source> - <translation>Netikėta reikšmė po "%1".</translation> + <source>Generate</source> + <translation>Generuoti</translation> </message> <message> - <source>[options]</source> - <translation>[parinktys]</translation> + <source>Close</source> + <translation>Užverti</translation> </message> <message> - <source>Usage: %1</source> - <translation>Naudojimas: %1</translation> + <source>Apply</source> + <translation>Taikyti</translation> </message> <message> - <source>Options:</source> - <translation>Parinktys:</translation> + <source>Entropy: %1 bit</source> + <translation>Entropija: %1 bit</translation> </message> <message> - <source>Arguments:</source> - <translation>Argumentai:</translation> + <source>Password Quality: %1</source> + <translation>Slaptažodžio kokybė: %1</translation> + </message> + <message> + <source>Poor</source> + <translation>Blogas</translation> </message> -</context> -<context> - <name>QSaveFile</name> <message> - <source>Existing file %1 is not writable</source> - <translation>Esamas failas %1 nėra įrašomas</translation> + <source>Weak</source> + <translation>Silpnas</translation> </message> <message> - <source>Writing canceled by application</source> - <translation>Programa atšaukė įrašymą</translation> + <source>Good</source> + <translation>Geras</translation> </message> <message> - <source>Partial write. Partition full?</source> - <translation>Dalinis įrašymas. Pilnas skaidinys?</translation> + <source>Excellent</source> + <translation>Puikus</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <source>Http</source> + <translation>Http</translation> </message> </context> <context> @@ -1245,20 +1530,112 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų <context> <name>SearchWidget</name> <message> - <source>Find:</source> - <translation>Rasti:</translation> + <source>Case Sensitive</source> + <translation>Skirti raidžių dydį</translation> + </message> + <message> + <source>Search</source> + <translation>Ieškoti</translation> + </message> + <message> + <source>Find</source> + <translation>Rasti</translation> + </message> + <message> + <source>Clear</source> + <translation>Išvalyti</translation> + </message> +</context> +<context> + <name>Service</name> + <message> + <source>A shared encryption-key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation>Bendrinamas šifravimo raktas, pavadinimu "%1" jau yra. +Ar norite jį perrašyti?</translation> + </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>Ar norite atnaujinti informaciją ties %1 - %2?</translation> + </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>Aktyvi duomenų bazė yra užrakinta! +Prašome atrakinti pasirinktą duomenų bazę arba pasirinkti kitą, kuri būtų atrakinta.</translation> + </message> + <message> + <source>Successfully removed %1 encryption-%2 from KeePassX/Http Settings.</source> + <translation>Sėkmingai pašalinta %1 šifravimo-%2 iš KeePassX/Http nustatymų.</translation> + </message> + <message> + <source>No shared encryption-keys found in KeePassHttp Settings.</source> + <translation>KeePassHttp nustatymuose nerasta jokių bendrinamų šifravimo raktų.</translation> + </message> + <message> + <source>The active database does not contain an entry of KeePassHttp Settings.</source> + <translation>Aktyvioje duomenų bazėje nėra KeePassHttp nustatymų įrašo.</translation> + </message> + <message> + <source>Removing stored permissions...</source> + <translation>Šalinami saugomi leidimai...</translation> + </message> + <message> + <source>Abort</source> + <translation>Nutraukti</translation> + </message> + <message> + <source>Successfully removed permissions from %1 %2.</source> + <translation>Leidimai sėkmingai pašalinti iš %1 %2.</translation> + </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation>Aktyvioje duomenų bazėje nėra įrašo su leidimais.</translation> + </message> + <message> + <source>KeePassXC: New key association request</source> + <translation>KeePassXC: Naujo rakto susiejimo užklausa</translation> + </message> + <message> + <source>You have received an association request for the above key. +If you would like to allow it access to your KeePassXC database +give it a unique name to identify and accept it.</source> + <translation>Jūs gavote susiejimo užklausą aukščiau esančiam raktui. +Jei norite leisti jam gauti prieigą prie savo KeePassXC +duomenų bazės, suteikite jam unikalų pavadinimą, kad atpažintumėte +ir priimtumėte jį.</translation> + </message> + <message> + <source>KeePassXC: Overwrite existing key?</source> + <translation>KeePassXC: Perrašyti esamą raktą?</translation> + </message> + <message> + <source>KeePassXC: Update Entry</source> + <translation>KeePassXC: Atnaujinti įrašą</translation> + </message> + <message> + <source>KeePassXC: Database locked!</source> + <translation>KeePassXC: Duomenų bazė užrakinta!</translation> + </message> + <message> + <source>KeePassXC: Removed keys from database</source> + <translation>KeePassXC: Pašalinti raktai iš duomenų bazės</translation> </message> <message> - <source>Case sensitive</source> - <translation>Skiriant raidžių registrą</translation> + <source>KeePassXC: No keys found</source> + <translation>KeePassXC: Raktų nerasta</translation> </message> <message> - <source>Current group</source> - <translation>Esama grupė</translation> + <source>KeePassXC: Settings not available!</source> + <translation>KeePassXC: Nustatymai neprieinami!</translation> </message> <message> - <source>Root group</source> - <translation>Šakninė grupė</translation> + <source>KeePassXC: Removed permissions</source> + <translation>KeePassXC: Pašalinti leidimai</translation> + </message> + <message> + <source>KeePassXC: No entry with permissions found!</source> + <translation>KeePassXC: Nerasta jokių įrašų su leidimais!</translation> </message> </context> <context> @@ -1283,10 +1660,6 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų <translation>Prisiminti paskutines duomenų bazes</translation> </message> <message> - <source>Open previous databases on startup</source> - <translation>Paleidžiant programą, atverti ankstesnes duomenų bazes</translation> - </message> - <message> <source>Automatically save on exit</source> <translation>Išeinant, automatiškai įrašyti</translation> </message> @@ -1327,12 +1700,20 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų <translation>Prisiminti paskutinius rakto failus</translation> </message> <message> - <source>Hide window to system tray instead of App Exit</source> - <translation type="unfinished"/> + <source>Load previous databases on startup</source> + <translation>Paleidžiant programą, įkelti ankstesnes duomenų bazes</translation> + </message> + <message> + <source>Automatically reload the database when modified externally</source> + <translation>Išoriškai modifikavus duomenų bazę, automatiškai įkelti ją iš naujo</translation> </message> <message> - <source>Hide window to system tray on App start</source> - <translation type="unfinished"/> + <source>Hide window to system tray instead of app exit</source> + <translation>Neužverti lango, bet vietoj to, suskleisti jį į sistemos dėklą</translation> + </message> + <message> + <source>Minimize window at application startup</source> + <translation>Paleidus programą, suskleisti langą</translation> </message> </context> <context> @@ -1357,6 +1738,14 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų <source>Always ask before performing auto-type</source> <translation>Visuomet klausti prieš atliekant automatinį rinkimą</translation> </message> + <message> + <source>Lock databases after minimizing the window</source> + <translation>Suskleidus langą, užrakinti duomenų bazes</translation> + </message> + <message> + <source>Don't require password repeat when it is visible</source> + <translation>Nereikalauti pakartoti slaptažodį, kai šis yra matomas</translation> + </message> </context> <context> <name>UnlockDatabaseWidget</name> @@ -1375,14 +1764,6 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų <context> <name>main</name> <message> - <source>KeePassX - cross-platform password manager</source> - <translation>KeePassX - daugiaplatformė slaptažodžių tvarkytuvė</translation> - </message> - <message> - <source>filename of the password database to open (*.kdbx)</source> - <translation>norimos atverti slaptažodžių duomenų bazės failo pavadinimas (*.kdbx)</translation> - </message> - <message> <source>path to a custom config file</source> <translation>kelias į tinkintą konfigūracijos failą</translation> </message> @@ -1390,5 +1771,17 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų <source>key file of the database</source> <translation>duomenų bazės rakto failas</translation> </message> + <message> + <source>filename(s) of the password database(s) to open (*.kdbx)</source> + <translation>norimos atverti slaptažodžių duomenų bazės(-ių) failo pavadinimas(-ai) (*.kdbx)</translation> + </message> + <message> + <source>KeePassXC - cross-platform password manager</source> + <translation>KeePassXC - daugiaplatformė slaptažodžių tvarkytuvė</translation> + </message> + <message> + <source>read password of the database from stdin</source> + <translation>nuskaityti duomenų bazės slaptažodį iš stdin</translation> + </message> </context> </TS>
\ No newline at end of file diff --git a/share/translations/keepassx_pt_BR.ts b/share/translations/keepassx_pt_BR.ts index 07400920e..22acf42be 100644 --- a/share/translations/keepassx_pt_BR.ts +++ b/share/translations/keepassx_pt_BR.ts @@ -1,15 +1,7 @@ -<?xml version="1.0" ?><!DOCTYPE TS><TS language="pt_BR" version="2.0"> +<?xml version="1.0" ?><!DOCTYPE TS><TS language="pt_BR" version="2.1"> <context> <name>AboutDialog</name> <message> - <source>About KeePassX</source> - <translation>Sobre KeePassX</translation> - </message> - <message> - <source>KeePassX is distributed under the term of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> - <translation>KeePassX é distribuído nos termos da Licença Pública Geral (GPL), versão 2 ou (à sua escolha) versão 3, do GNU.</translation> - </message> - <message> <source>Revision</source> <translation>Revisão</translation> </message> @@ -17,17 +9,56 @@ <source>Using:</source> <translation>Usando:</translation> </message> + <message> + <source>About KeePassXC</source> + <translation>Sobre KeePassXC</translation> + </message> + <message> + <source>KeePassXC is distributed under the term of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> + <translation>KeePassXC é distribuído nos termos da Licença Pública Geral (GPL), versão 2 ou (à sua escolha) versão 3, do GNU.</translation> + </message> + <message> + <source>Extensions: +</source> + <translation>Extensões: +</translation> + </message> </context> <context> - <name>AutoType</name> + <name>AccessControlDialog</name> + <message> + <source>Remember this decision</source> + <translation>Lembrar esta escolha</translation> + </message> <message> - <source>Auto-Type - KeePassX</source> - <translation>Auto-Digitação - KeePassX</translation> + <source>Allow</source> + <translation>Permitir</translation> </message> <message> + <source>Deny</source> + <translation>Negar</translation> + </message> + <message> + <source>%1 has requested access to passwords for the following item(s). +Please select whether you want to allow access.</source> + <translation>%1 solicitou acesso a senhas para o(s) seguinte(s) iten(s). +Selecione se deseja permitir o acesso.</translation> + </message> + <message> + <source>KeePassXC HTTP Confirm Access</source> + <translation>KeePassXC HTTP Confirmar Acesso</translation> + </message> +</context> +<context> + <name>AutoType</name> + <message> <source>Couldn't find an entry that matches the window title:</source> <translation>Não foi possível localizar uma entrada que corresponda ao título da janela:</translation> </message> + <message> + <source>Auto-Type - KeePassXC</source> + <translation>Auto-Digitação - KeePassXC</translation> + </message> </context> <context> <name>AutoTypeAssociationsModel</name> @@ -47,13 +78,13 @@ <context> <name>AutoTypeSelectDialog</name> <message> - <source>Auto-Type - KeePassX</source> - <translation>Auto-Digitação - KeePassX</translation> - </message> - <message> <source>Select entry to Auto-Type:</source> <translation>Escolha uma entrada para Auto-Digitar:</translation> </message> + <message> + <source>Auto-Type - KeePassXC</source> + <translation>Auto-Digitação - KeePassXC</translation> + </message> </context> <context> <name>ChangeMasterKeyWidget</name> @@ -320,12 +351,6 @@ Salvar alterações?</translation> <translation>trancado</translation> </message> <message> - <source>The database you are trying to open is locked by another instance of KeePassX. -Do you want to open it anyway? Alternatively the database is opened read-only.</source> - <translation>O banco de dados que você está tentando abrir está bloqueado por outra instância do KeePassX. -Você quer abri-lo de qualquer forma? Alternativamente, o banco de dados é aberto como somente leitura.</translation> - </message> - <message> <source>Lock database</source> <translation>Trancar Banco de Dados</translation> </message> @@ -368,14 +393,24 @@ Descartar alterações e fechar mesmo assim?</translation> <translation>Falha ao gravar arquivo CSV.</translation> </message> <message> - <source>The database you are trying to save as is locked by another instance of KeePassX. -Do you want to save it anyway?</source> - <translation>O banco de dados que você está tentando salvar como está travado por uma outra instância de KeePassX. -Você deseja salvá-lo mesmo assim?</translation> + <source>Unable to open the database.</source> + <translation>Não foi possível abrir o banco de dados.</translation> </message> <message> - <source>Unable to open the database.</source> - <translation type="unfinished"/> + <source>The database you are trying to open is locked by another instance of KeePassXC. +Do you want to open it anyway? Alternatively the database is opened read-only.</source> + <translation>A base de dados que você está tentando abrir está bloqueada por outra instância de KeePassXC. +Mesmo assim deseja abrir? Alternativamente, a base de dados é aberta somente para leitura.</translation> + </message> + <message> + <source>Merge database</source> + <translation>Juntar banco de dados</translation> + </message> + <message> + <source>The database you are trying to save as is locked by another instance of KeePassXC. +Do you want to save it anyway?</source> + <translation>A base de dados que você está tentando abrir está bloqueada por outra instância de KeePassXC. +Mesmo assim deseja salvá-la?</translation> </message> </context> <context> @@ -417,10 +452,6 @@ Você deseja salvá-lo mesmo assim?</translation> <translation>Você realmente quer apagar o grupo "%1" para sempre?</translation> </message> <message> - <source>Current group</source> - <translation>Grupo atual</translation> - </message> - <message> <source>Error</source> <translation>Erro</translation> </message> @@ -430,11 +461,71 @@ Você deseja salvá-lo mesmo assim?</translation> </message> <message> <source>Move entry to recycle bin?</source> - <translation type="unfinished"/> + <translation>Mover entrada para a lixeira?</translation> </message> <message> <source>Do you really want to move entry "%1" to the recycle bin?</source> - <translation type="unfinished"/> + <translation>Pretende realmente mover a entrada "%1" para a lixeira?</translation> + </message> + <message> + <source>Searching...</source> + <translation>Pesquisando...</translation> + </message> + <message> + <source>No current database.</source> + <translation>Nenhuma base de dados atual.</translation> + </message> + <message> + <source>No source database, nothing to do.</source> + <translation>Nenhuma base de dados de origem, nada a fazer.</translation> + </message> + <message> + <source>Search Results (%1)</source> + <translation>Resultados da Pesquisa (%1)</translation> + </message> + <message> + <source>No Results</source> + <translation>Sem Resultados</translation> + </message> + <message> + <source>Execute command?</source> + <translation>Executar comando?</translation> + </message> + <message> + <source>Do you really want to execute the following command?<br><br>%1<br></source> + <translation>Você quer realmente executar o comando seguinte?<br><br>%1<br></translation> + </message> + <message> + <source>Remember my choice</source> + <translation>Lembrar minha escolha</translation> + </message> + <message> + <source>Autoreload Request</source> + <translation>Recarregar Automaticamente Pedido</translation> + </message> + <message> + <source>The database file has changed. Do you want to load the changes?</source> + <translation>A base de dados foi alterada. Deseja carregar as alterações?</translation> + </message> + <message> + <source>Merge Request</source> + <translation>Juntar Pedido</translation> + </message> + <message> + <source>The database file has changed and you have unsaved changes.Do you want to merge your changes?</source> + <translation>A base de dados foi alterada e tem alterações não gravadas. Deseja juntar as suas alterações?</translation> + </message> + <message> + <source>Autoreload Failed</source> + <translation>Carregamento Automático Falhou</translation> + </message> + <message> + <source>Could not parse or unlock the new database file while attempting to autoreload this database.</source> + <translation>Não foi possível analisar ou desbloquear o novo arquivo da base de dados ao tentar recarregar automaticamente essa base de dados.</translation> + </message> + <message> + <source>Could not open the new database file while attempting to autoreload this database.</source> + <translation>Não foi possível abrir a nova base de dados ao tentar recarregar automaticamente essa base de dados.</translation> </message> </context> <context> @@ -626,10 +717,6 @@ Você deseja salvá-lo mesmo assim?</translation> <translation>Repetir:</translation> </message> <message> - <source>Gen.</source> - <translation>Gerar</translation> - </message> - <message> <source>URL:</source> <translation>URL:</translation> </message> @@ -746,17 +833,25 @@ Você deseja salvá-lo mesmo assim?</translation> <source>Can't delete icon!</source> <translation>Não é possível apagar o ícone!</translation> </message> - <message numerus="yes"> - <source>Can't delete icon. Still used by %n item(s).</source> - <translation><numerusform>Não é possível apagar o ícone. Ainda usado por %n item.</numerusform><numerusform>Não é possível apagar o ícone. Ainda usado por %n itens.</numerusform></translation> - </message> <message> <source>Error</source> - <translation type="unfinished"/> + <translation>Erro</translation> + </message> + <message> + <source>Download favicon</source> + <translation>Baixar favicon</translation> + </message> + <message> + <source>Unable to fetch favicon.</source> + <translation>Não foi possível obter favicon.</translation> </message> <message> - <source>Can't read icon:</source> - <translation type="unfinished"/> + <source>Can't read icon</source> + <translation>Não foi possível ler ícone</translation> + </message> + <message> + <source>Can't delete icon. Still used by %1 items.</source> + <translation>Não é possível apagar ícone. Ainda usado por %1 itens.</translation> </message> </context> <context> @@ -779,6 +874,13 @@ Você deseja salvá-lo mesmo assim?</translation> </message> </context> <context> + <name>Entry</name> + <message> + <source> - Clone</source> + <translation> - Clone</translation> + </message> +</context> +<context> <name>EntryAttributesModel</name> <message> <source>Name</source> @@ -831,6 +933,61 @@ Você deseja salvá-lo mesmo assim?</translation> </message> </context> <context> + <name>HttpPasswordGeneratorWidget</name> + <message> + <source>Length:</source> + <translation>Comprimento:</translation> + </message> + <message> + <source>Character Types</source> + <translation>Tipo de Caracteres</translation> + </message> + <message> + <source>Upper Case Letters</source> + <translation>Letras Maiúsculas</translation> + </message> + <message> + <source>A-Z</source> + <translation>A-Z</translation> + </message> + <message> + <source>Lower Case Letters</source> + <translation>Letras Minúsculas</translation> + </message> + <message> + <source>a-z</source> + <translation>a-z</translation> + </message> + <message> + <source>Numbers</source> + <translation>Números</translation> + </message> + <message> + <source>0-9</source> + <translation>0-9</translation> + </message> + <message> + <source>Special Characters</source> + <translation>Caracteres Especiais</translation> + </message> + <message> + <source>/*_& ...</source> + <translation>/*_& ...</translation> + </message> + <message> + <source>Exclude look-alike characters</source> + <translation>Excluir caracteres semelhantes</translation> + </message> + <message> + <source>Ensure that the password contains characters from every group</source> + <translation>Verificar se a senha contém caracteres de todos os grupos</translation> + </message> + <message> + <source>Accept</source> + <translation>Aceitar</translation> + </message> +</context> +<context> <name>KeePass1OpenWidget</name> <message> <source>Import KeePass1 database</source> @@ -873,7 +1030,7 @@ Você deseja salvá-lo mesmo assim?</translation> </message> <message> <source>Wrong key or database file is corrupt.</source> - <translation type="unfinished"/> + <translation>Chave errada ou base de dados corrompida.</translation> </message> </context> <context> @@ -912,8 +1069,8 @@ Esta é uma migração de uma via. Você não poderá abrir o banco de dados imp <translation>Erro fatal enquanto testava as funções criptográficas.</translation> </message> <message> - <source>KeePassX - Error</source> - <translation>KeePassX - Erro</translation> + <source>KeePassXC - Error</source> + <translation>KeePassXC - Erro</translation> </message> </context> <context> @@ -923,188 +1080,319 @@ Esta é uma migração de uma via. Você não poderá abrir o banco de dados imp <translation>Banco de Dados</translation> </message> <message> - <source>Recent databases</source> - <translation>Bancos de dados recentes</translation> + <source>Open database</source> + <translation>Abrir banco de dados</translation> </message> <message> - <source>Help</source> - <translation>Ajuda</translation> + <source>Database settings</source> + <translation>Configurações do Banco de Dados</translation> </message> <message> - <source>Entries</source> - <translation>Entradas</translation> + <source>Copy username to clipboard</source> + <translation>Copiar nome de usuário para área de transferência</translation> </message> <message> - <source>Copy attribute to clipboard</source> - <translation>Copiar atributo para a área de transferência</translation> + <source>Copy password to clipboard</source> + <translation>Copiar senha para área de transferência</translation> </message> <message> - <source>Groups</source> - <translation>Grupos</translation> + <source>Settings</source> + <translation>Configurações</translation> </message> <message> - <source>View</source> - <translation>Ver</translation> + <source>Show toolbar</source> + <translation>Mostrar barra de ferramentas</translation> </message> <message> - <source>Quit</source> - <translation>Sair</translation> + <source>read-only</source> + <translation>somente leitura</translation> </message> <message> - <source>About</source> - <translation>Sobre</translation> + <source>Toggle window</source> + <translation>Alternar Janela</translation> </message> <message> - <source>Open database</source> - <translation>Abrir banco de dados</translation> + <source>Tools</source> + <translation>Ferramentas</translation> </message> <message> - <source>Save database</source> - <translation>Salvar banco de dados</translation> + <source>KeePass 2 Database</source> + <translation>Banco de dados Keepass 2</translation> </message> <message> - <source>Close database</source> - <translation>Fechar banco de dados</translation> + <source>All files</source> + <translation>Todos arquivos</translation> </message> <message> - <source>New database</source> - <translation>Novo banco de dados</translation> + <source>Save repaired database</source> + <translation>Salvar banco de dados reparado</translation> </message> <message> - <source>Add new entry</source> - <translation>Adicionar nova entrada</translation> + <source>Error</source> + <translation>Erro</translation> </message> <message> - <source>View/Edit entry</source> - <translation>Ver/Editar entrada</translation> + <source>Writing the database failed.</source> + <translation>Escrita do banco de dados falhou.</translation> </message> <message> - <source>Delete entry</source> - <translation>Excluir entrada</translation> + <source>&Recent databases</source> + <translation>&Bancos de dados recentes</translation> </message> <message> - <source>Add new group</source> - <translation>Adicionar novo grupo</translation> + <source>He&lp</source> + <translation>&Ajuda</translation> </message> <message> - <source>Edit group</source> - <translation>Editar grupo</translation> + <source>E&ntries</source> + <translation>E&ntradas</translation> </message> <message> - <source>Delete group</source> - <translation>Excluir grupo</translation> + <source>Copy att&ribute to clipboard</source> + <translation>Copiar at&ributo para área de transferência</translation> </message> <message> - <source>Save database as</source> - <translation>Salvar banco de dados como</translation> + <source>&Groups</source> + <translation>&Grupos</translation> </message> <message> - <source>Change master key</source> - <translation>Alterar chave-mestra</translation> + <source>&View</source> + <translation>&Ver</translation> </message> <message> - <source>Database settings</source> - <translation>Configurações do Banco de Dados</translation> + <source>&Quit</source> + <translation>&Sair</translation> </message> <message> - <source>Import KeePass 1 database</source> - <translation>Importar banco de dados KeePass1</translation> + <source>&About</source> + <translation>&Sobre</translation> </message> <message> - <source>Clone entry</source> - <translation>Clonar entrada</translation> + <source>&Open database</source> + <translation>&Abrir base de dados</translation> </message> <message> - <source>Find</source> - <translation>Localizar</translation> + <source>&Save database</source> + <translation>&Salvar base de dados</translation> </message> <message> - <source>Copy username to clipboard</source> - <translation>Copiar nome de usuário para área de transferência</translation> + <source>&Close database</source> + <translation>&Fechar base de dados</translation> </message> <message> - <source>Copy password to clipboard</source> - <translation>Copiar senha para área de transferência</translation> + <source>&New database</source> + <translation>&Nova base de dados</translation> </message> <message> - <source>Settings</source> - <translation>Configurações</translation> + <source>Merge from KeePassX database</source> + <translation>Juntar base de dados a partir de KeePassX</translation> </message> <message> - <source>Perform Auto-Type</source> - <translation>Realizar Auto-Digitação</translation> + <source>&Add new entry</source> + <translation>&Adicionar nova entrada</translation> </message> <message> - <source>Open URL</source> - <translation>Abrir URL</translation> + <source>&View/Edit entry</source> + <translation>&Ver/Editar entrada</translation> </message> <message> - <source>Lock databases</source> - <translation>Trancar bancos de dados</translation> + <source>&Delete entry</source> + <translation>&Apagar entrada</translation> </message> <message> - <source>Title</source> - <translation>Título</translation> + <source>&Add new group</source> + <translation>&Adicionar novo grupo</translation> </message> <message> - <source>URL</source> - <translation>URL</translation> + <source>&Edit group</source> + <translation>&Editar grupo</translation> </message> <message> - <source>Notes</source> - <translation>Notas</translation> + <source>&Delete group</source> + <translation>&Apagar grupo</translation> </message> <message> - <source>Show toolbar</source> - <translation>Mostrar barra de ferramentas</translation> + <source>Sa&ve database as</source> + <translation>Sal&var base de dados como</translation> </message> <message> - <source>read-only</source> - <translation>somente leitura</translation> + <source>Change &master key</source> + <translation>Alterar chave &mestra</translation> </message> <message> - <source>Toggle window</source> - <translation>Alternar Janela</translation> + <source>&Database settings</source> + <translation>&Definições da base de dados</translation> </message> <message> - <source>Tools</source> - <translation>Ferramentas</translation> + <source>&Import KeePass 1 database</source> + <translation>&Importar base de dados KeePass 1</translation> </message> <message> - <source>Copy username</source> - <translation>Copiar nome de usuário</translation> + <source>&Clone entry</source> + <translation>&Clonar entrada</translation> </message> <message> - <source>Copy password</source> - <translation>Copiar senha</translation> + <source>&Find</source> + <translation>&Encontrar</translation> </message> <message> - <source>Export to CSV file</source> - <translation>Exportar para arquivo CSV</translation> + <source>Copy &username</source> + <translation>Copiar nome de &usuário</translation> </message> <message> - <source>Repair database</source> - <translation>Reparar banco de dados</translation> + <source>Cop&y password</source> + <translation>Cop&iar senha</translation> </message> <message> - <source>KeePass 2 Database</source> - <translation>Banco de dados Keepass 2</translation> + <source>&Settings</source> + <translation>&Configurações</translation> </message> <message> - <source>All files</source> - <translation>Todos arquivos</translation> + <source>&Perform Auto-Type</source> + <translation>&Executar escrita automática</translation> </message> <message> - <source>Save repaired database</source> - <translation>Salvar banco de dados reparado</translation> + <source>&Open URL</source> + <translation>&Abrir URL</translation> </message> <message> - <source>Error</source> - <translation>Erro</translation> + <source>&Lock databases</source> + <translation>&Trancar base de dados</translation> </message> <message> - <source>Writing the database failed.</source> - <translation>Escrita do banco de dados falhou.</translation> + <source>&Title</source> + <translation>&Título</translation> + </message> + <message> + <source>&URL</source> + <translation>&URL</translation> + </message> + <message> + <source>&Notes</source> + <translation>&Notas</translation> + </message> + <message> + <source>&Export to CSV file</source> + <translation>&Exportar para arquivo CSV</translation> + </message> + <message> + <source>Re&pair database</source> + <translation>Re&parar banco de dados</translation> + </message> + <message> + <source>Password Generator</source> + <translation>Gerador de Senha</translation> + </message> +</context> +<context> + <name>OptionDialog</name> + <message> + <source>Dialog</source> + <translation>Diálogo</translation> + </message> + <message> + <source>General</source> + <translation>Geral</translation> + </message> + <message> + <source>Sh&ow a notification when credentials are requested</source> + <translation>M&ostrar uma notificação quando as credenciais forem solicitadas</translation> + </message> + <message> + <source>&Return only best matching entries for an URL instead +of all entries for the whole domain</source> + <translation>&Mostrar apenas as melhores entradas correspondentes para um URL em vez de +todas as entradas para o domínio completo</translation> + </message> + <message> + <source>&Match URL schemes +Only entries with the same scheme (http://, https://, ftp://, ...) are returned</source> + <translation>&Esquemas de URL coincidentes +Somente entradas com o mesmo esquema (http://, https://, ftp://, ...) são mostradas</translation> + </message> + <message> + <source>Sort matching entries by &username</source> + <translation>Ordenar entradas coincidentes por nome de &usuário</translation> + </message> + <message> + <source>R&emove all shared encryption-keys from active database</source> + <translation>R&emover todas as chaves criptografadas compartilhadas da base de dados ativa</translation> + </message> + <message> + <source>Re&move all stored permissions from entries in active database</source> + <translation>R&emover todas as permissões armazenadas de entradas na base de dados ativa</translation> + </message> + <message> + <source>Password generator</source> + <translation>Gerador de senha</translation> + </message> + <message> + <source>Advanced</source> + <translation>Avançado</translation> + </message> + <message> + <source>Activate the following only, if you know what you are doing!</source> + <translation>Ativar apenas os seguintes, se souber o que está fazendo!</translation> + </message> + <message> + <source>Always allow &access to entries</source> + <translation>Permitir sempre &acesso as entradas</translation> + </message> + <message> + <source>Always allow &updating entries</source> + <translation>Permitir sempre &atualizar as entradas</translation> + </message> + <message> + <source>Searc&h in all opened databases for matching entries</source> + <translation>Procurar em todas as base de dados abertas por entradas semel&hantes</translation> + </message> + <message> + <source>Only the selected database has to be connected with a client!</source> + <translation>Somente a base de dados selecionada tem que ser conectada com um cliente!</translation> + </message> + <message> + <source>&Return also advanced string fields which start with "KPH: "</source> + <translation>&Mostrar também campos avançados que começam com "KPH: "</translation> + </message> + <message> + <source>Automatic creates or updates are not supported for string fields!</source> + <translation>Criação automática ou atualizações não são suportadas para os valores dos campos!</translation> + </message> + <message> + <source>HTTP Port:</source> + <translation>Porta HTTP:</translation> + </message> + <message> + <source>Default port: 19455</source> + <translation>Porta padrão: 19455</translation> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>Pe&dir para desbloquear a base de dados se estiver bloqueada</translation> + </message> + <message> + <source>Sort &matching entries by title</source> + <translation>Ordenar &entradas por título</translation> + </message> + <message> + <source>Enable KeepassXC HTTP protocol +This is required for accessing your databases from ChromeIPass or PassIFox</source> + <translation>Habilitar KeepassXC protocolo HTTP +Isso é necessário para acessar os seus bancos de dados de ChromeIPass ou de PassIFox</translation> + </message> + <message> + <source>KeePassXC will listen to this port on 127.0.0.1</source> + <translation>KeePassXC irá escutar esta porta em 127.0.0.1</translation> + </message> + <message> + <source>Cannot bind to privileged ports</source> + <translation>Não é possível ligar a portas privilegiadas</translation> + </message> + <message> + <source>Cannot bind to privileged ports below 1024! +Using default port 19455.</source> + <translation>Não é possível ligar a portas privilegiadas abaixo de 1024! +Usando porta padrão 19455.</translation> </message> </context> <context> @@ -1114,10 +1402,6 @@ Esta é uma migração de uma via. Você não poderá abrir o banco de dados imp <translation>Senha:</translation> </message> <message> - <source>Length:</source> - <translation>Tamanho:</translation> - </message> - <message> <source>Character Types</source> <translation>Tipos de Caracteres</translation> </message> @@ -1142,70 +1426,71 @@ Esta é uma migração de uma via. Você não poderá abrir o banco de dados imp <translation>Excluir caracteres similares</translation> </message> <message> - <source>Ensure that the password contains characters from every group</source> - <translation>Assegurar que a senha contenha caracteres de todos os grupos</translation> - </message> - <message> <source>Accept</source> <translation>Aceitar</translation> </message> -</context> -<context> - <name>QCommandLineParser</name> <message> - <source>Displays version information.</source> - <translation>Mostrar informações da versão.</translation> + <source>%p%</source> + <translation>%p%</translation> </message> <message> - <source>Displays this help.</source> - <translation>Mostrar esta ajuda.</translation> + <source>strength</source> + <translation>força</translation> </message> <message> - <source>Unknown option '%1'.</source> - <translation>Opção desconhecida '%1'.</translation> + <source>entropy</source> + <translation>entropia</translation> </message> <message> - <source>Unknown options: %1.</source> - <translation>Opções desconhecidas: %1.</translation> + <source>&Length:</source> + <translation>&Tamanho:</translation> </message> <message> - <source>Missing value after '%1'.</source> - <translation>Falta valor após '%1'.</translation> + <source>Pick characters from every group</source> + <translation>Selecione caracteres de todos os grupos</translation> </message> <message> - <source>Unexpected value after '%1'.</source> - <translation>Valor inesperado após '%1'.</translation> + <source>Generate</source> + <translation>Gerar</translation> </message> <message> - <source>[options]</source> - <translation>[opções]</translation> + <source>Close</source> + <translation>Fechar</translation> </message> <message> - <source>Usage: %1</source> - <translation>Utilização: %1</translation> + <source>Apply</source> + <translation>Aplicar</translation> </message> <message> - <source>Options:</source> - <translation>Opções:</translation> + <source>Entropy: %1 bit</source> + <translation>Entropia: %1 bit</translation> </message> <message> - <source>Arguments:</source> - <translation>Argumentos:</translation> + <source>Password Quality: %1</source> + <translation>Qualidade da senha: %1</translation> + </message> + <message> + <source>Poor</source> + <translation>Pobre</translation> </message> -</context> -<context> - <name>QSaveFile</name> <message> - <source>Existing file %1 is not writable</source> - <translation>O arquivo existente %1 não é gravável</translation> + <source>Weak</source> + <translation>Fraco</translation> </message> <message> - <source>Writing canceled by application</source> - <translation>Escrita cancelada pelo aplicativo</translation> + <source>Good</source> + <translation>Bom</translation> </message> <message> - <source>Partial write. Partition full?</source> - <translation>Escrita parcial. Partição cheia?</translation> + <source>Excellent</source> + <translation>Excelente</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <source>Http</source> + <translation>Http</translation> </message> </context> <context> @@ -1245,20 +1530,111 @@ Esta é uma migração de uma via. Você não poderá abrir o banco de dados imp <context> <name>SearchWidget</name> <message> - <source>Find:</source> - <translation>Localizar:</translation> + <source>Case Sensitive</source> + <translation>Diferenciar maiúsculas e minúsculas</translation> </message> <message> - <source>Case sensitive</source> - <translation>Diferenciar maiúsculas e minúsculas</translation> + <source>Search</source> + <translation>Pesquisar</translation> </message> <message> - <source>Current group</source> - <translation>Grupo atual</translation> + <source>Find</source> + <translation>Localizar</translation> </message> <message> - <source>Root group</source> - <translation>Grupo Raiz</translation> + <source>Clear</source> + <translation>Limpar</translation> + </message> +</context> +<context> + <name>Service</name> + <message> + <source>A shared encryption-key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation>Já existe uma chave de criptografia compartilhada com o nome "%1". +Deseja substituí-la?</translation> + </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>Deseja atualizar as informações em %1 - %2?</translation> + </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>A base de dados ativa está bloqueada! +Desbloqueie base de dados selecionada ou escolha outra que esteja desbloqueada.</translation> + </message> + <message> + <source>Successfully removed %1 encryption-%2 from KeePassX/Http Settings.</source> + <translation>Removido com sucesso %1 criptografia-%2 do KeePassX/Http Configurações.</translation> + </message> + <message> + <source>No shared encryption-keys found in KeePassHttp Settings.</source> + <translation>Nenhuma chave de criptografia compartilhada encontrada nas Configurações do KeePassHttp.</translation> + </message> + <message> + <source>The active database does not contain an entry of KeePassHttp Settings.</source> + <translation>A base de dados ativa não contém uma entrada de Configurações KeePassHttp.</translation> + </message> + <message> + <source>Removing stored permissions...</source> + <translation>Removendo permissões armazenadas...</translation> + </message> + <message> + <source>Abort</source> + <translation>Cancelar</translation> + </message> + <message> + <source>Successfully removed permissions from %1 %2.</source> + <translation>Foram removidas com êxito as permissões de %1 %2.</translation> + </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation>A base de dados ativa não contém uma entrada com permissões.</translation> + </message> + <message> + <source>KeePassXC: New key association request</source> + <translation>KeePassXC: Nova associação de chaves requisitada</translation> + </message> + <message> + <source>You have received an association request for the above key. +If you would like to allow it access to your KeePassXC database +give it a unique name to identify and accept it.</source> + <translation>Recebeu uma solicitação de associação para a chave acima. +Se quiser permitir o acesso a sua base de dados KeePassXC +dar-lhe um nome único para identificá-lo e aceitá-lo.</translation> + </message> + <message> + <source>KeePassXC: Overwrite existing key?</source> + <translation>KeePassXC: Substituir chave existente?</translation> + </message> + <message> + <source>KeePassXC: Update Entry</source> + <translation>KeePassXC: Atualizar entrada</translation> + </message> + <message> + <source>KeePassXC: Database locked!</source> + <translation>KeePassXC: Banco de dados bloqueado!</translation> + </message> + <message> + <source>KeePassXC: Removed keys from database</source> + <translation>KeePassXC: Chaves removidas do banco de dados</translation> + </message> + <message> + <source>KeePassXC: No keys found</source> + <translation>KeePassXC: Nenhuma chave localizada</translation> + </message> + <message> + <source>KeePassXC: Settings not available!</source> + <translation>KeePassXC: Configurações não disponíveis!</translation> + </message> + <message> + <source>KeePassXC: Removed permissions</source> + <translation>KeePassXC: Permissões removidas</translation> + </message> + <message> + <source>KeePassXC: No entry with permissions found!</source> + <translation>KeePassXC: Nenhuma entrada com permissões localizada!</translation> </message> </context> <context> @@ -1283,10 +1659,6 @@ Esta é uma migração de uma via. Você não poderá abrir o banco de dados imp <translation>Lembrar dos últimos bancos de dados</translation> </message> <message> - <source>Open previous databases on startup</source> - <translation>Abrir bancos de dados anteriores na inicialização</translation> - </message> - <message> <source>Automatically save on exit</source> <translation>Salvar automaticamente ao sair</translation> </message> @@ -1327,12 +1699,20 @@ Esta é uma migração de uma via. Você não poderá abrir o banco de dados imp <translation>Lembrar dos últimos arquivos-chave</translation> </message> <message> - <source>Hide window to system tray instead of App Exit</source> - <translation type="unfinished"/> + <source>Load previous databases on startup</source> + <translation>Abrir bancos de dados anteriores na inicialização</translation> + </message> + <message> + <source>Automatically reload the database when modified externally</source> + <translation>Automaticamente recarregar o banco de dados quando houver modificações externas</translation> </message> <message> - <source>Hide window to system tray on App start</source> - <translation type="unfinished"/> + <source>Hide window to system tray instead of app exit</source> + <translation>Ocultar janela na bandeja de sistema em vez de sair do programa</translation> + </message> + <message> + <source>Minimize window at application startup</source> + <translation>Iniciar programa com janela minimizada</translation> </message> </context> <context> @@ -1357,6 +1737,14 @@ Esta é uma migração de uma via. Você não poderá abrir o banco de dados imp <source>Always ask before performing auto-type</source> <translation>Sempre perguntar antes de realizar auto-digitação</translation> </message> + <message> + <source>Lock databases after minimizing the window</source> + <translation>Bloquear bancos de dados após minimizar a janela</translation> + </message> + <message> + <source>Don't require password repeat when it is visible</source> + <translation>Quando a senha for visível não pedir para repeti-la</translation> + </message> </context> <context> <name>UnlockDatabaseWidget</name> @@ -1375,14 +1763,6 @@ Esta é uma migração de uma via. Você não poderá abrir o banco de dados imp <context> <name>main</name> <message> - <source>KeePassX - cross-platform password manager</source> - <translation>KeePassX - gerenciador de senhas multiplataforma</translation> - </message> - <message> - <source>filename of the password database to open (*.kdbx)</source> - <translation>nome de arquivo do banco de dados de senhas a ser aberto (*.kdbx)</translation> - </message> - <message> <source>path to a custom config file</source> <translation>caminho para um arquivo de configuração personalizado</translation> </message> @@ -1390,5 +1770,17 @@ Esta é uma migração de uma via. Você não poderá abrir o banco de dados imp <source>key file of the database</source> <translation>arquivo-chave do banco de dados</translation> </message> + <message> + <source>filename(s) of the password database(s) to open (*.kdbx)</source> + <translation>nome(s) de arquivo(s) do banco de dados de senhas a ser aberto (*.kdbx)</translation> + </message> + <message> + <source>KeePassXC - cross-platform password manager</source> + <translation>KeePassXC - gerenciador de senhas multiplataforma</translation> + </message> + <message> + <source>read password of the database from stdin</source> + <translation>ler a senha do banco de dados da entrada padrão</translation> + </message> </context> </TS>
\ No newline at end of file diff --git a/share/translations/keepassx_ru.ts b/share/translations/keepassx_ru.ts index 733d64c85..f3321c9b3 100644 --- a/share/translations/keepassx_ru.ts +++ b/share/translations/keepassx_ru.ts @@ -1,15 +1,7 @@ -<?xml version="1.0" ?><!DOCTYPE TS><TS language="ru" version="2.0"> +<?xml version="1.0" ?><!DOCTYPE TS><TS language="ru" version="2.1"> <context> <name>AboutDialog</name> <message> - <source>About KeePassX</source> - <translation>О KeePassX</translation> - </message> - <message> - <source>KeePassX is distributed under the term of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> - <translation>KeePassX распространяется на условиях Стандартной общественной лицензии GNU (GPL) версии 2 или (на ваше усмотрение) версии 3.</translation> - </message> - <message> <source>Revision</source> <translation>Ревизия</translation> </message> @@ -17,17 +9,55 @@ <source>Using:</source> <translation>С помощью:</translation> </message> + <message> + <source>About KeePassXC</source> + <translation>О KeePassXC</translation> + </message> + <message> + <source>KeePassXC is distributed under the term of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> + <translation>KeePassXC распространяется на условиях Стандартной общественной лицензии GNU (GPL) версии 2 или (на ваше усмотрение) версии 3.</translation> + </message> + <message> + <source>Extensions: +</source> + <translation>Расширения: +</translation> + </message> </context> <context> - <name>AutoType</name> + <name>AccessControlDialog</name> + <message> + <source>Remember this decision</source> + <translation>Запомнить это решение</translation> + </message> <message> - <source>Auto-Type - KeePassX</source> - <translation>Автоввод — KeePassX</translation> + <source>Allow</source> + <translation>Разрешить</translation> </message> <message> + <source>Deny</source> + <translation>Запретить</translation> + </message> + <message> + <source>%1 has requested access to passwords for the following item(s). +Please select whether you want to allow access.</source> + <translation>%1 запросил доступ к паролям для следующего элемента(ов). Выберете, хотите ли вы разрешить доступ.</translation> + </message> + <message> + <source>KeePassXC HTTP Confirm Access</source> + <translation>Подтверждение доступа KeePassXC HTTP</translation> + </message> +</context> +<context> + <name>AutoType</name> + <message> <source>Couldn't find an entry that matches the window title:</source> <translation>Невозможно найти запись, соответствующую заголовку окна:</translation> </message> + <message> + <source>Auto-Type - KeePassXC</source> + <translation>Автоввод — KeePassXC</translation> + </message> </context> <context> <name>AutoTypeAssociationsModel</name> @@ -47,13 +77,13 @@ <context> <name>AutoTypeSelectDialog</name> <message> - <source>Auto-Type - KeePassX</source> - <translation>Автоввод — KeePassX</translation> - </message> - <message> <source>Select entry to Auto-Type:</source> <translation>Выберите запись для автоввода:</translation> </message> + <message> + <source>Auto-Type - KeePassXC</source> + <translation>Автоввод — KeePassXC</translation> + </message> </context> <context> <name>ChangeMasterKeyWidget</name> @@ -187,7 +217,7 @@ </message> <message> <source>Database opened fine. Nothing to do.</source> - <translation type="unfinished"/> + <translation>Хранилище открылось. Больше нечего делать.</translation> </message> <message> <source>Unable to open the database.</source> @@ -320,11 +350,6 @@ Save changes?</source> <translation>заблокировано</translation> </message> <message> - <source>The database you are trying to open is locked by another instance of KeePassX. -Do you want to open it anyway? Alternatively the database is opened read-only.</source> - <translation>Хранилище, которое Вы хотите открыть, заблокировано другой запущенной копией KeePassX. Всё равно открыть? В качестве альтернативы хранилище будет открыто в режиме для чтения.</translation> - </message> - <message> <source>Lock database</source> <translation>Заблокировать хранилище</translation> </message> @@ -367,14 +392,24 @@ Discard changes and close anyway?</source> <translation>Не удалось записать CSV файл.</translation> </message> <message> - <source>The database you are trying to save as is locked by another instance of KeePassX. -Do you want to save it anyway?</source> - <translation>Данное хранилище заблокировано другой запущенной копией KeePassX. -Вы уверены, что хотите продолжить сохранение?</translation> + <source>Unable to open the database.</source> + <translation>Не удаётся открыть хранилище.</translation> </message> <message> - <source>Unable to open the database.</source> - <translation type="unfinished"/> + <source>The database you are trying to open is locked by another instance of KeePassXC. +Do you want to open it anyway? Alternatively the database is opened read-only.</source> + <translation>Хранилище, которое Вы хотите открыть, заблокировано другой запущенной копией KeePassXC. +Всё равно открыть? В качестве альтернативы хранилище будет открыто в режиме для чтения.</translation> + </message> + <message> + <source>Merge database</source> + <translation>Объединить хранилище</translation> + </message> + <message> + <source>The database you are trying to save as is locked by another instance of KeePassXC. +Do you want to save it anyway?</source> + <translation>Хранилище, которые вы пытаетесь сохранить, заблокировано другим экземпляром KeePassXC. +Хотите сохранить во всех случаях?</translation> </message> </context> <context> @@ -416,10 +451,6 @@ Do you want to save it anyway?</source> <translation>Вы действительно хотите навсегда удалить группу «%1»?</translation> </message> <message> - <source>Current group</source> - <translation>Текущая группа</translation> - </message> - <message> <source>Error</source> <translation>Ошибка</translation> </message> @@ -429,11 +460,71 @@ Do you want to save it anyway?</source> </message> <message> <source>Move entry to recycle bin?</source> - <translation type="unfinished"/> + <translation>Переместить запись в корзину?</translation> </message> <message> <source>Do you really want to move entry "%1" to the recycle bin?</source> - <translation type="unfinished"/> + <translation>Действительно переместить запись "%1" в корзину?</translation> + </message> + <message> + <source>Searching...</source> + <translation>Поиск...</translation> + </message> + <message> + <source>No current database.</source> + <translation>Нет текущего хранилища.</translation> + </message> + <message> + <source>No source database, nothing to do.</source> + <translation>Нет исходного хранилища, нечего обрабатывать.</translation> + </message> + <message> + <source>Search Results (%1)</source> + <translation>Результаты поиска (%1)</translation> + </message> + <message> + <source>No Results</source> + <translation>Нет результатов</translation> + </message> + <message> + <source>Execute command?</source> + <translation>Выполнить комманду?</translation> + </message> + <message> + <source>Do you really want to execute the following command?<br><br>%1<br></source> + <translation>Вы действительно хотите выполнить следующую команду?<br><br>%1<br></translation> + </message> + <message> + <source>Remember my choice</source> + <translation>Запомнить выбор</translation> + </message> + <message> + <source>Autoreload Request</source> + <translation>Запрос на автоматическую загрузку</translation> + </message> + <message> + <source>The database file has changed. Do you want to load the changes?</source> + <translation>Хранилище было изменено. Вы хотите загрузить изменения?</translation> + </message> + <message> + <source>Merge Request</source> + <translation>Запрос на слияние</translation> + </message> + <message> + <source>The database file has changed and you have unsaved changes.Do you want to merge your changes?</source> + <translation>Файл хранилища был изменён, а так же присутствуют несохранённые изменения. Вы хотите объеденить изменения?</translation> + </message> + <message> + <source>Autoreload Failed</source> + <translation>Ошибка автоматической загрузки</translation> + </message> + <message> + <source>Could not parse or unlock the new database file while attempting to autoreload this database.</source> + <translation>Не удаётся разобрать или разблокировать новый файл хранилища при попытке автоматической загрузки этого хранилища.</translation> + </message> + <message> + <source>Could not open the new database file while attempting to autoreload this database.</source> + <translation>Не удаётся открыть новый файл хранилища при попытке автоматической загрузки этого файла.</translation> </message> </context> <context> @@ -625,10 +716,6 @@ Do you want to save it anyway?</source> <translation>Пароль ещё раз:</translation> </message> <message> - <source>Gen.</source> - <translation>Генеральный.</translation> - </message> - <message> <source>URL:</source> <translation>URL:</translation> </message> @@ -745,17 +832,25 @@ Do you want to save it anyway?</source> <source>Can't delete icon!</source> <translation>Не могу удалить значок!</translation> </message> - <message numerus="yes"> - <source>Can't delete icon. Still used by %n item(s).</source> - <translation><numerusform>Не могу удалить иконку, %n запись всё ещё использует её.</numerusform><numerusform>Не могу удалить иконку, %n записи всё ещё использует её.</numerusform><numerusform>Не могу удалить иконку, %n записей всё ещё использует её.</numerusform><numerusform>Не могу удалить значок, %n записей всё ещё использует его.</numerusform></translation> - </message> <message> <source>Error</source> - <translation type="unfinished"/> + <translation>Ошибка</translation> </message> <message> - <source>Can't read icon:</source> - <translation type="unfinished"/> + <source>Download favicon</source> + <translation>Скачать значок сайта</translation> + </message> + <message> + <source>Unable to fetch favicon.</source> + <translation>Не удалось получить значок сайта</translation> + </message> + <message> + <source>Can't read icon</source> + <translation>Не могу прочитать значок</translation> + </message> + <message> + <source>Can't delete icon. Still used by %1 items.</source> + <translation>Не удается удалить значок, она продолжает использоваться %1 записями.</translation> </message> </context> <context> @@ -778,6 +873,13 @@ Do you want to save it anyway?</source> </message> </context> <context> + <name>Entry</name> + <message> + <source> - Clone</source> + <translation>- Колинировать</translation> + </message> +</context> +<context> <name>EntryAttributesModel</name> <message> <source>Name</source> @@ -830,6 +932,61 @@ Do you want to save it anyway?</source> </message> </context> <context> + <name>HttpPasswordGeneratorWidget</name> + <message> + <source>Length:</source> + <translation>Длина:</translation> + </message> + <message> + <source>Character Types</source> + <translation>Виды символов</translation> + </message> + <message> + <source>Upper Case Letters</source> + <translation>Заглавные буквы</translation> + </message> + <message> + <source>A-Z</source> + <translation>A-Z</translation> + </message> + <message> + <source>Lower Case Letters</source> + <translation>Строчные буквы</translation> + </message> + <message> + <source>a-z</source> + <translation>a-z</translation> + </message> + <message> + <source>Numbers</source> + <translation>Цифры</translation> + </message> + <message> + <source>0-9</source> + <translation>0-9</translation> + </message> + <message> + <source>Special Characters</source> + <translation>Особые символы</translation> + </message> + <message> + <source>/*_& ...</source> + <translation>/*_& ...</translation> + </message> + <message> + <source>Exclude look-alike characters</source> + <translation>Исключить выглядящие похожие символы</translation> + </message> + <message> + <source>Ensure that the password contains characters from every group</source> + <translation>Убедитесь, что пароль содержит символы всех видов</translation> + </message> + <message> + <source>Accept</source> + <translation>Принять</translation> + </message> +</context> +<context> <name>KeePass1OpenWidget</name> <message> <source>Import KeePass1 database</source> @@ -872,7 +1029,7 @@ Do you want to save it anyway?</source> </message> <message> <source>Wrong key or database file is corrupt.</source> - <translation type="unfinished"/> + <translation>Неверный ключ или файл хранилища повреждён.</translation> </message> </context> <context> @@ -911,8 +1068,8 @@ This is a one-way migration. You won't be able to open the imported databas <translation>Неисправимая ошибка в процессе тестирования криптографических функций.</translation> </message> <message> - <source>KeePassX - Error</source> - <translation>KeePassX — Ошибка</translation> + <source>KeePassXC - Error</source> + <translation>KeePassXC — Ошибка</translation> </message> </context> <context> @@ -922,188 +1079,318 @@ This is a one-way migration. You won't be able to open the imported databas <translation>Хранилище</translation> </message> <message> - <source>Recent databases</source> + <source>Open database</source> + <translation>Открыть хранилище</translation> + </message> + <message> + <source>Database settings</source> + <translation>Параметры хранилища</translation> + </message> + <message> + <source>Copy username to clipboard</source> + <translation>Скопировать имя пользователя в буфер обмена</translation> + </message> + <message> + <source>Copy password to clipboard</source> + <translation>Скопировать пароль в буфер обмена</translation> + </message> + <message> + <source>Settings</source> + <translation>Настройки</translation> + </message> + <message> + <source>Show toolbar</source> + <translation>Показать панель инструментов</translation> + </message> + <message> + <source>read-only</source> + <translation>только для чтения</translation> + </message> + <message> + <source>Toggle window</source> + <translation>Переключить окно</translation> + </message> + <message> + <source>Tools</source> + <translation>Инструменты</translation> + </message> + <message> + <source>KeePass 2 Database</source> + <translation>Хранилище KeePass 2</translation> + </message> + <message> + <source>All files</source> + <translation>Все файлы</translation> + </message> + <message> + <source>Save repaired database</source> + <translation>Сохранить восстановленное хранилище</translation> + </message> + <message> + <source>Error</source> + <translation>Ошибка</translation> + </message> + <message> + <source>Writing the database failed.</source> + <translation>Не удалось записать хранилище.</translation> + </message> + <message> + <source>&Recent databases</source> <translation>Недавние хранилища</translation> </message> <message> - <source>Help</source> + <source>He&lp</source> <translation>Помощь</translation> </message> <message> - <source>Entries</source> - <translation>Записи</translation> + <source>E&ntries</source> + <translation>&Записи</translation> </message> <message> - <source>Copy attribute to clipboard</source> + <source>Copy att&ribute to clipboard</source> <translation>Скопировать атрибут в буфер обмена</translation> </message> <message> - <source>Groups</source> + <source>&Groups</source> <translation>Группы</translation> </message> <message> - <source>View</source> + <source>&View</source> <translation>Вид</translation> </message> <message> - <source>Quit</source> + <source>&Quit</source> <translation>Выход</translation> </message> <message> - <source>About</source> + <source>&About</source> <translation>О программе</translation> </message> <message> - <source>Open database</source> + <source>&Open database</source> <translation>Открыть хранилище</translation> </message> <message> - <source>Save database</source> + <source>&Save database</source> <translation>Сохранить хранилище</translation> </message> <message> - <source>Close database</source> + <source>&Close database</source> <translation>Закрыть хранилище</translation> </message> <message> - <source>New database</source> + <source>&New database</source> <translation>Новое хранилище</translation> </message> <message> - <source>Add new entry</source> + <source>Merge from KeePassX database</source> + <translation>Объединить из хранилища KeePassX</translation> + </message> + <message> + <source>&Add new entry</source> <translation>Добавить новую запись</translation> </message> <message> - <source>View/Edit entry</source> + <source>&View/Edit entry</source> <translation>Посмотреть/редактировать запись</translation> </message> <message> - <source>Delete entry</source> + <source>&Delete entry</source> <translation>Удалить запись</translation> </message> <message> - <source>Add new group</source> + <source>&Add new group</source> <translation>Добавить новую группу</translation> </message> <message> - <source>Edit group</source> + <source>&Edit group</source> <translation>Редактировать группу</translation> </message> <message> - <source>Delete group</source> + <source>&Delete group</source> <translation>Удалить группу</translation> </message> <message> - <source>Save database as</source> + <source>Sa&ve database as</source> <translation>Сохранить хранилище как</translation> </message> <message> - <source>Change master key</source> - <translation>Сменить мастер-пароль</translation> + <source>Change &master key</source> + <translation>Изменить мастер-пароль</translation> </message> <message> - <source>Database settings</source> + <source>&Database settings</source> <translation>Параметры хранилища</translation> </message> <message> - <source>Import KeePass 1 database</source> + <source>&Import KeePass 1 database</source> <translation>Импортировать хранилище KeePass 1</translation> </message> <message> - <source>Clone entry</source> + <source>&Clone entry</source> <translation>Клонировать запись</translation> </message> <message> - <source>Find</source> + <source>&Find</source> <translation>Найти</translation> </message> <message> - <source>Copy username to clipboard</source> - <translation>Скопировать имя пользователя в буфер обмена</translation> + <source>Copy &username</source> + <translation>Скопировать имя пользователя</translation> </message> <message> - <source>Copy password to clipboard</source> - <translation>Скопировать пароль в буфер обмена</translation> + <source>Cop&y password</source> + <translation>Скопировать пароль</translation> </message> <message> - <source>Settings</source> + <source>&Settings</source> <translation>Настройки</translation> </message> <message> - <source>Perform Auto-Type</source> + <source>&Perform Auto-Type</source> <translation>Произвести автоввод</translation> </message> <message> - <source>Open URL</source> + <source>&Open URL</source> <translation>Открыть URL</translation> </message> <message> - <source>Lock databases</source> + <source>&Lock databases</source> <translation>Заблокировать хранилище</translation> </message> <message> - <source>Title</source> + <source>&Title</source> <translation>Заголовок</translation> </message> <message> - <source>URL</source> + <source>&URL</source> <translation>URL</translation> </message> <message> - <source>Notes</source> + <source>&Notes</source> <translation>Примечания</translation> </message> <message> - <source>Show toolbar</source> - <translation>Показать панель инструментов</translation> + <source>&Export to CSV file</source> + <translation>Экспортировать в файл CSV</translation> </message> <message> - <source>read-only</source> - <translation>только для чтения</translation> + <source>Re&pair database</source> + <translation>Восстановление хранилища</translation> </message> <message> - <source>Toggle window</source> - <translation>Переключить окно</translation> + <source>Password Generator</source> + <translation>Генератор паролей</translation> </message> +</context> +<context> + <name>OptionDialog</name> <message> - <source>Tools</source> - <translation>Инструменты</translation> + <source>Dialog</source> + <translation>Диалог</translation> </message> <message> - <source>Copy username</source> - <translation>Скопировать имя пользователя</translation> + <source>General</source> + <translation>Общие</translation> </message> <message> - <source>Copy password</source> - <translation>Скопировать пароль</translation> + <source>Sh&ow a notification when credentials are requested</source> + <translation>Показывать уведомление при запросе данных для входа</translation> </message> <message> - <source>Export to CSV file</source> - <translation>Экспортировать в файл CSV</translation> + <source>&Return only best matching entries for an URL instead +of all entries for the whole domain</source> + <translation>Возвращать только наиболее совпавшие с URL записи, а не все записи для домена</translation> </message> <message> - <source>Repair database</source> - <translation>Восстановление хранилища</translation> + <source>&Match URL schemes +Only entries with the same scheme (http://, https://, ftp://, ...) are returned</source> + <translation>Совпадение со схемой URL +Возвращать только записи с соответствующей схемой (http://, https://, ftp://, ...) </translation> </message> <message> - <source>KeePass 2 Database</source> - <translation type="unfinished"/> + <source>Sort matching entries by &username</source> + <translation>Сортировать совпавшие записи по &имени пользователя</translation> </message> <message> - <source>All files</source> - <translation>Все файлы</translation> + <source>R&emove all shared encryption-keys from active database</source> + <translation>Удалить все общие ключи шифрования из активного хранилища</translation> </message> <message> - <source>Save repaired database</source> - <translation>Сохранить восстановленное хранилище</translation> + <source>Re&move all stored permissions from entries in active database</source> + <translation>Удалить все сохраненные права доступа из активного хранилища </translation> </message> <message> - <source>Error</source> - <translation>Ошибка</translation> + <source>Password generator</source> + <translation>Генератор паролей</translation> </message> <message> - <source>Writing the database failed.</source> - <translation type="unfinished"/> + <source>Advanced</source> + <translation>Расширенные</translation> + </message> + <message> + <source>Activate the following only, if you know what you are doing!</source> + <translation>Включайте эти настройки только если знаете что делаете!</translation> + </message> + <message> + <source>Always allow &access to entries</source> + <translation>Всегда разрешать доступ к записям</translation> + </message> + <message> + <source>Always allow &updating entries</source> + <translation>Всегда разрешать обновление записей</translation> + </message> + <message> + <source>Searc&h in all opened databases for matching entries</source> + <translation>Искать соответствующие записи по всем открытым хранилищам</translation> + </message> + <message> + <source>Only the selected database has to be connected with a client!</source> + <translation>Только выбранное хранилище должно быть соединено с клиентом!</translation> + </message> + <message> + <source>&Return also advanced string fields which start with "KPH: "</source> + <translation>Возвращать дополнительные строковые поля, начинающиеся с "KPH: "</translation> + </message> + <message> + <source>Automatic creates or updates are not supported for string fields!</source> + <translation>Автоматическое создание или обновление не поддерживается строковыми полями!</translation> + </message> + <message> + <source>HTTP Port:</source> + <translation>Порт HTTP:</translation> + </message> + <message> + <source>Default port: 19455</source> + <translation>Порт по умолчанию: 19455</translation> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>Запрашивать разблокировку хранилища, если оно заблокировано</translation> + </message> + <message> + <source>Sort &matching entries by title</source> + <translation>Сортировать совпавшие записи по названию</translation> + </message> + <message> + <source>Enable KeepassXC HTTP protocol +This is required for accessing your databases from ChromeIPass or PassIFox</source> + <translation>Включить протокол KeepassXC HTTP +Это требуется для доступа к хранилищам из ChromeIPass или PassIFox</translation> + </message> + <message> + <source>KeePassXC will listen to this port on 127.0.0.1</source> + <translation>KeePassXC будет слушать указнный порт на 127.0.0.1</translation> + </message> + <message> + <source>Cannot bind to privileged ports</source> + <translation>Не удается выполнить привязку к привилегированным портам</translation> + </message> + <message> + <source>Cannot bind to privileged ports below 1024! +Using default port 19455.</source> + <translation>Не удается привязать к привилегированные порты ниже 1024! +Используется порт по умолчанию 19455.</translation> </message> </context> <context> @@ -1113,10 +1400,6 @@ This is a one-way migration. You won't be able to open the imported databas <translation>Пароль:</translation> </message> <message> - <source>Length:</source> - <translation>Длина:</translation> - </message> - <message> <source>Character Types</source> <translation>Виды символов</translation> </message> @@ -1141,70 +1424,71 @@ This is a one-way migration. You won't be able to open the imported databas <translation>Исключить похожие символы</translation> </message> <message> - <source>Ensure that the password contains characters from every group</source> - <translation>Убедитесь, что пароль содержит символы всех видов</translation> - </message> - <message> <source>Accept</source> <translation>Принять</translation> </message> -</context> -<context> - <name>QCommandLineParser</name> <message> - <source>Displays version information.</source> - <translation>Показывает информацию о версии.</translation> + <source>%p%</source> + <translation>%p%</translation> </message> <message> - <source>Displays this help.</source> - <translation>Показывает эту справку.</translation> + <source>strength</source> + <translation>надёжность</translation> </message> <message> - <source>Unknown option '%1'.</source> - <translation>Неизвестная опция «%1».</translation> + <source>entropy</source> + <translation>энтропия</translation> </message> <message> - <source>Unknown options: %1.</source> - <translation>Неизвестные опции %1.</translation> + <source>&Length:</source> + <translation>Длина:</translation> </message> <message> - <source>Missing value after '%1'.</source> - <translation>Пропущено значение после «%1».</translation> + <source>Pick characters from every group</source> + <translation>Выберете символы из каждой группы</translation> </message> <message> - <source>Unexpected value after '%1'.</source> - <translation>Непредвиденное значение после «%1».</translation> + <source>Generate</source> + <translation>Генерировать</translation> </message> <message> - <source>[options]</source> - <translation>[опции]</translation> + <source>Close</source> + <translation>Закрыть</translation> </message> <message> - <source>Usage: %1</source> - <translation>Использование: %1</translation> + <source>Apply</source> + <translation>Применить</translation> </message> <message> - <source>Options:</source> - <translation>Опции:</translation> + <source>Entropy: %1 bit</source> + <translation>Энтропия: %1 бит</translation> </message> <message> - <source>Arguments:</source> - <translation>Аргументы:</translation> + <source>Password Quality: %1</source> + <translation>Качество пароля: %1</translation> </message> -</context> -<context> - <name>QSaveFile</name> <message> - <source>Existing file %1 is not writable</source> - <translation>Существующий файл %1 непригоден для записи</translation> + <source>Poor</source> + <translation>Плохой</translation> </message> <message> - <source>Writing canceled by application</source> - <translation>Запись отменена приложением</translation> + <source>Weak</source> + <translation>Слабый</translation> </message> <message> - <source>Partial write. Partition full?</source> - <translation>Частичная запись. Раздел переполнен?</translation> + <source>Good</source> + <translation>Хороший</translation> + </message> + <message> + <source>Excellent</source> + <translation>Отличный</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <source>Http</source> + <translation>Http</translation> </message> </context> <context> @@ -1244,20 +1528,110 @@ This is a one-way migration. You won't be able to open the imported databas <context> <name>SearchWidget</name> <message> - <source>Find:</source> - <translation>Найти:</translation> + <source>Case Sensitive</source> + <translation>Чувствительно к регистру</translation> </message> <message> - <source>Case sensitive</source> - <translation>Чувствительно к регистру</translation> + <source>Search</source> + <translation>Поиск</translation> </message> <message> - <source>Current group</source> - <translation>Текущая группа</translation> + <source>Find</source> + <translation>Найти</translation> </message> <message> - <source>Root group</source> - <translation>Корневая группа</translation> + <source>Clear</source> + <translation>Очистить</translation> + </message> +</context> +<context> + <name>Service</name> + <message> + <source>A shared encryption-key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation>Общий ключ шифрования с именем "%1" уже существует. +Вы хотите его перезаписать?</translation> + </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>Вы хотите обновить информацию в %1 - %2?</translation> + </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>Активное хранилище заблокировано! +Разблокируйте выбранное хранилище или выберите другое, незаблокированное.</translation> + </message> + <message> + <source>Successfully removed %1 encryption-%2 from KeePassX/Http Settings.</source> + <translation>Успешно удалено %1 шифрование-%2 из настроек KeePassXC/Http.</translation> + </message> + <message> + <source>No shared encryption-keys found in KeePassHttp Settings.</source> + <translation>Не найдено общих ключей шифрования в настройках KeePassHttp.</translation> + </message> + <message> + <source>The active database does not contain an entry of KeePassHttp Settings.</source> + <translation>Активное хранилизе не содержит записей настроек KeePassHttp.</translation> + </message> + <message> + <source>Removing stored permissions...</source> + <translation>Удаляются сохранённые права доступа...</translation> + </message> + <message> + <source>Abort</source> + <translation>Отмена</translation> + </message> + <message> + <source>Successfully removed permissions from %1 %2.</source> + <translation>Права доступа из %1 %2 успешно удалены.</translation> + </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation>Активное хранилище не содержит записей с назначенными правами доступа.</translation> + </message> + <message> + <source>KeePassXC: New key association request</source> + <translation>KeePassXC: Запрос на ассоциацию нового ключа</translation> + </message> + <message> + <source>You have received an association request for the above key. +If you would like to allow it access to your KeePassXC database +give it a unique name to identify and accept it.</source> + <translation>Вы получили запрос на ассоциацию указанного ключа. +Если вы хотите разрешить доступ к вашему хранилищу KeePassXC, дайте ему уникальное имя и примите запрос.</translation> + </message> + <message> + <source>KeePassXC: Overwrite existing key?</source> + <translation>KeePassXC: Перезаписать существующий ключ?</translation> + </message> + <message> + <source>KeePassXC: Update Entry</source> + <translation>KeePassXC: Обновить запись</translation> + </message> + <message> + <source>KeePassXC: Database locked!</source> + <translation>KeePassXC: Хранилище заблокировано!</translation> + </message> + <message> + <source>KeePassXC: Removed keys from database</source> + <translation>KeePassXC: Ключи удалены из хранилища</translation> + </message> + <message> + <source>KeePassXC: No keys found</source> + <translation>KeePassXC: Ключи не найдены</translation> + </message> + <message> + <source>KeePassXC: Settings not available!</source> + <translation>KeePassXC% Настройки недоступны!</translation> + </message> + <message> + <source>KeePassXC: Removed permissions</source> + <translation>KeePassXC: Права доступа удалены</translation> + </message> + <message> + <source>KeePassXC: No entry with permissions found!</source> + <translation>KeePassXC: Не найдено записей с назначенными правами доступа!</translation> </message> </context> <context> @@ -1282,10 +1656,6 @@ This is a one-way migration. You won't be able to open the imported databas <translation>Помнить последнее хранилище</translation> </message> <message> - <source>Open previous databases on startup</source> - <translation>Открывать предыдущее хранилище при запуске</translation> - </message> - <message> <source>Automatically save on exit</source> <translation>Автоматически сохранять при выходе</translation> </message> @@ -1326,12 +1696,20 @@ This is a one-way migration. You won't be able to open the imported databas <translation>Запоминать последние файл-ключи</translation> </message> <message> - <source>Hide window to system tray instead of App Exit</source> - <translation type="unfinished"/> + <source>Load previous databases on startup</source> + <translation>Открывать предыдущие хранилища при запуске</translation> + </message> + <message> + <source>Automatically reload the database when modified externally</source> + <translation>Автоматически перечитывать хранилище при его изменении внешними приложениями </translation> </message> <message> - <source>Hide window to system tray on App start</source> - <translation type="unfinished"/> + <source>Hide window to system tray instead of app exit</source> + <translation>Прятать окно в системный лоток вместо выхода</translation> + </message> + <message> + <source>Minimize window at application startup</source> + <translation>Сворачивать окно при запуске приложения</translation> </message> </context> <context> @@ -1356,6 +1734,14 @@ This is a one-way migration. You won't be able to open the imported databas <source>Always ask before performing auto-type</source> <translation>Всегда спрашивать перед тем, как производить автоввод</translation> </message> + <message> + <source>Lock databases after minimizing the window</source> + <translation>Заблокировать хранилище при сворачивании окна</translation> + </message> + <message> + <source>Don't require password repeat when it is visible</source> + <translation>Не требовать поворный ввод пароля когда он показывается</translation> + </message> </context> <context> <name>UnlockDatabaseWidget</name> @@ -1374,14 +1760,6 @@ This is a one-way migration. You won't be able to open the imported databas <context> <name>main</name> <message> - <source>KeePassX - cross-platform password manager</source> - <translation>KeePassX — кросс-платформенный менеджер паролей</translation> - </message> - <message> - <source>filename of the password database to open (*.kdbx)</source> - <translation>имя файла открываемого хранилища паролей (*.kdbx)</translation> - </message> - <message> <source>path to a custom config file</source> <translation>путь к своему файлу настроек</translation> </message> @@ -1389,5 +1767,17 @@ This is a one-way migration. You won't be able to open the imported databas <source>key file of the database</source> <translation>файл-ключ хранилища</translation> </message> + <message> + <source>filename(s) of the password database(s) to open (*.kdbx)</source> + <translation>имена(имя) файлов хранилищ(а) для открытия (*.kdbx)</translation> + </message> + <message> + <source>KeePassXC - cross-platform password manager</source> + <translation>KeePassXC — кросс-платформенный менеджер паролей</translation> + </message> + <message> + <source>read password of the database from stdin</source> + <translation>читать пароли хранилища из стандартного ввода "stdin"</translation> + </message> </context> </TS>
\ No newline at end of file diff --git a/share/windows/installer-header.bmp b/share/windows/installer-header.bmp Binary files differnew file mode 100644 index 000000000..f9e17cae7 --- /dev/null +++ b/share/windows/installer-header.bmp diff --git a/share/windows/installer-wizard.bmp b/share/windows/installer-wizard.bmp Binary files differnew file mode 100644 index 000000000..76d04518f --- /dev/null +++ b/share/windows/installer-wizard.bmp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 30332c71e..8c3948842 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -218,6 +218,7 @@ target_link_libraries(${PROGNAME} Qt5::Widgets Qt5::Network ${GCRYPT_LIBRARIES} + ${GPGERROR_LIBRARIES} ${ZLIB_LIBRARIES}) set_target_properties(${PROGNAME} PROPERTIES ENABLE_EXPORTS ON) @@ -257,9 +258,25 @@ if(APPLE) endif() if(MINGW) - set(CPACK_GENERATOR "ZIP") + string(REPLACE "AMD" "Win" OUTPUT_FILE_POSTFIX "${CMAKE_HOST_SYSTEM_PROCESSOR}") + set(CPACK_GENERATOR "ZIP;NSIS") set(CPACK_STRIP_FILES ON) - set(CPACK_PACKAGE_FILE_NAME "${PROGNAME}-${KEEPASSXC_VERSION_NUM}") + set(CPACK_PACKAGE_FILE_NAME "${PROGNAME}-${KEEPASSXC_VERSION}-${OUTPUT_FILE_POSTFIX}") + set(CPACK_PACKAGE_INSTALL_DIRECTORY ${PROGNAME}) + set(CPACK_PACKAGE_VERSION ${KEEPASSXC_VERSION}) + set(CPACK_PACKAGE_VENDOR "${PROGNAME} Team") + string(REGEX REPLACE "/" "\\\\\\\\" CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/share/windows/installer-header.bmp") + set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE.GPL-2") + set(CPACK_NSIS_MUI_ICON "${CMAKE_SOURCE_DIR}/share/windows/keepassxc.ico") + set(CPACK_NSIS_MUI_UNIICON "${CPACK_NSIS_MUI_ICON}") + set(CPACK_NSIS_INSTALLED_ICON_NAME "\\\\${PROGNAME}.exe") + string(REGEX REPLACE "/" "\\\\\\\\" CPACK_NSIS_MUI_WELCOMEFINISHPAGE_BITMAP "${CMAKE_SOURCE_DIR}/share/windows/installer-wizard.bmp") + set(CPACK_NSIS_MUI_UNWELCOMEFINISHPAGE_BITMAP "${CPACK_NSIS_MUI_WELCOMEFINISHPAGE_BITMAP}") + set(CPACK_NSIS_CREATE_ICONS_EXTRA "CreateShortCut '$SMPROGRAMS\\\\$STARTMENU_FOLDER\\\\${PROGNAME}.lnk' '$INSTDIR\\\\${PROGNAME}.exe'") + set(CPACK_NSIS_DELETE_ICONS_EXTRA "Delete '$SMPROGRAMS\\\\$START_MENU\\\\${PROGNAME}.lnk'") + set(CPACK_NSIS_URL_INFO_ABOUT "https://keepassxc.org") + set(CPACK_NSIS_PACKAGE_NAME "${PROGNAME} v${KEEPASSXC_VERSION}") + set(CPACK_NSIS_MUI_FINISHPAGE_RUN "../${PROGNAME}.exe") include(CPack) install(CODE " @@ -267,5 +284,9 @@ if(MINGW) " COMPONENT Runtime) include(DeployQt4) - install_qt4_executable(${PROGNAME}.exe "qjpeg;qgif;qico;qtaccessiblewidgets") + install_qt4_executable(${PROGNAME}.exe) + add_custom_command(TARGET ${PROGNAME} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${Qt5Core_DIR}/../../../share/qt5/plugins/platforms/qwindows$<$<CONFIG:Debug>:d>.dll + $<TARGET_FILE_DIR:${PROGNAME}>) + install(FILES $<TARGET_FILE_DIR:${PROGNAME}>/qwindows$<$<CONFIG:Debug>:d>.dll DESTINATION "platforms") endif() diff --git a/src/autotype/mac/AutoTypeMac.cpp b/src/autotype/mac/AutoTypeMac.cpp index 90563a23a..e55c336cb 100644 --- a/src/autotype/mac/AutoTypeMac.cpp +++ b/src/autotype/mac/AutoTypeMac.cpp @@ -98,7 +98,9 @@ QString AutoTypePlatformMac::activeWindowTitle() if (windowLayer(window) == 0) { // First toplevel window in list (front to back order) title = windowTitle(window); - break; + if (!title.isEmpty()) { + break; + } } } diff --git a/src/core/Entry.cpp b/src/core/Entry.cpp index b2b06e7c8..46e2670ac 100644 --- a/src/core/Entry.cpp +++ b/src/core/Entry.cpp @@ -353,6 +353,12 @@ void Entry::setTitle(const QString& title) void Entry::setUrl(const QString& url) { + bool remove = url != m_attributes->value(EntryAttributes::URLKey) && + (m_attributes->value(EntryAttributes::RememberCmdExecAttr) == "1" || + m_attributes->value(EntryAttributes::RememberCmdExecAttr) == "0"); + if (remove) { + m_attributes->remove(EntryAttributes::RememberCmdExecAttr); + } m_attributes->set(EntryAttributes::URLKey, url, m_attributes->isProtected(EntryAttributes::URLKey)); } @@ -508,7 +514,8 @@ Entry* Entry::clone(CloneFlags flags) const entry->m_data.timeInfo.setLocationChanged(now); } - + if (flags & CloneRenameTitle) + entry->setTitle(entry->title() + tr(" - Clone")); return entry; } diff --git a/src/core/Entry.h b/src/core/Entry.h index 66b9362a6..ae60b596c 100644 --- a/src/core/Entry.h +++ b/src/core/Entry.h @@ -115,7 +115,8 @@ public: CloneNoFlags = 0, CloneNewUuid = 1, // generate a random uuid for the clone CloneResetTimeInfo = 2, // set all TimeInfo attributes to the current time - CloneIncludeHistory = 4 // clone the history items + CloneIncludeHistory = 4, // clone the history items + CloneRenameTitle = 8 // add "-Clone" after the original title }; Q_DECLARE_FLAGS(CloneFlags, CloneFlag) diff --git a/src/core/EntryAttributes.cpp b/src/core/EntryAttributes.cpp index 195a8f14a..b633cae32 100644 --- a/src/core/EntryAttributes.cpp +++ b/src/core/EntryAttributes.cpp @@ -24,6 +24,7 @@ const QString EntryAttributes::URLKey = "URL"; const QString EntryAttributes::NotesKey = "Notes"; const QStringList EntryAttributes::DefaultAttributes(QStringList() << TitleKey << UserNameKey << PasswordKey << URLKey << NotesKey); +const QString EntryAttributes::RememberCmdExecAttr = "_EXEC_CMD"; EntryAttributes::EntryAttributes(QObject* parent) : QObject(parent) diff --git a/src/core/EntryAttributes.h b/src/core/EntryAttributes.h index 1c0ddaaeb..211b6d483 100644 --- a/src/core/EntryAttributes.h +++ b/src/core/EntryAttributes.h @@ -52,6 +52,7 @@ public: static const QString URLKey; static const QString NotesKey; static const QStringList DefaultAttributes; + static const QString RememberCmdExecAttr; static bool isDefaultAttribute(const QString& key); Q_SIGNALS: diff --git a/src/core/EntrySearcher.cpp b/src/core/EntrySearcher.cpp index c0360a36c..01e152e2a 100644 --- a/src/core/EntrySearcher.cpp +++ b/src/core/EntrySearcher.cpp @@ -42,7 +42,11 @@ QList<Entry*> EntrySearcher::searchEntries(const QString& searchTerm, const Grou const QList<Group*> children = group->children(); for (Group* childGroup : children) { if (childGroup->searchingEnabled() != Group::Disable) { - searchResult.append(searchEntries(searchTerm, childGroup, caseSensitivity)); + if (matchGroup(searchTerm, childGroup, caseSensitivity)) { + searchResult.append(childGroup->entriesRecursive()); + } else { + searchResult.append(searchEntries(searchTerm, childGroup, caseSensitivity)); + } } } @@ -69,3 +73,21 @@ bool EntrySearcher::wordMatch(const QString& word, Entry* entry, Qt::CaseSensiti entry->url().contains(word, caseSensitivity) || entry->notes().contains(word, caseSensitivity); } + +bool EntrySearcher::matchGroup(const QString& searchTerm, const Group* group, Qt::CaseSensitivity caseSensitivity) +{ + const QStringList wordList = searchTerm.split(QRegExp("\\s"), QString::SkipEmptyParts); + for (const QString& word : wordList) { + if (!wordMatch(word, group, caseSensitivity)) { + return false; + } + } + + return true; +} + +bool EntrySearcher::wordMatch(const QString& word, const Group* group, Qt::CaseSensitivity caseSensitivity) +{ + return group->name().contains(word, caseSensitivity) || + group->notes().contains(word, caseSensitivity); +} diff --git a/src/core/EntrySearcher.h b/src/core/EntrySearcher.h index c7075dc9b..4e8d4eabe 100644 --- a/src/core/EntrySearcher.h +++ b/src/core/EntrySearcher.h @@ -33,6 +33,8 @@ private: QList<Entry*> searchEntries(const QString& searchTerm, const Group* group, Qt::CaseSensitivity caseSensitivity); QList<Entry*> matchEntry(const QString& searchTerm, Entry* entry, Qt::CaseSensitivity caseSensitivity); bool wordMatch(const QString& word, Entry* entry, Qt::CaseSensitivity caseSensitivity); + bool matchGroup(const QString& searchTerm, const Group* group, Qt::CaseSensitivity caseSensitivity); + bool wordMatch(const QString& word, const Group* group, Qt::CaseSensitivity caseSensitivity); }; #endif // KEEPASSX_ENTRYSEARCHER_H diff --git a/src/format/KeePass2XmlReader.cpp b/src/format/KeePass2XmlReader.cpp index dfb03bd06..dca387b19 100644 --- a/src/format/KeePass2XmlReader.cpp +++ b/src/format/KeePass2XmlReader.cpp @@ -388,7 +388,7 @@ void KeePass2XmlReader::parseBinaries() QString id = attr.value("ID").toString(); QByteArray data; - if (attr.value("Compressed").compare("True", Qt::CaseInsensitive) == 0) { + if (attr.value("Compressed").compare(QLatin1String("True"), Qt::CaseInsensitive) == 0) { data = readCompressedBinary(); } else { diff --git a/src/gui/Application.cpp b/src/gui/Application.cpp index d982f22ca..26d9d2283 100644 --- a/src/gui/Application.cpp +++ b/src/gui/Application.cpp @@ -17,12 +17,20 @@ */ #include "Application.h" +#include "MainWindow.h" #include <QAbstractNativeEventFilter> #include <QFileOpenEvent> +#include <QSocketNotifier> #include "autotype/AutoType.h" +#if defined(Q_OS_UNIX) +#include <signal.h> +#include <unistd.h> +#include <sys/socket.h> +#endif + #if defined(Q_OS_UNIX) && !defined(Q_OS_OSX) class XcbEventFilter : public QAbstractNativeEventFilter { @@ -65,12 +73,18 @@ public: Application::Application(int& argc, char** argv) : QApplication(argc, argv) , m_mainWindow(nullptr) +#ifdef Q_OS_UNIX + , m_unixSignalNotifier(nullptr) +#endif { #if defined(Q_OS_UNIX) && !defined(Q_OS_OSX) installNativeEventFilter(new XcbEventFilter()); #elif defined(Q_OS_WIN) installNativeEventFilter(new WinEventFilter()); #endif +#if defined(Q_OS_UNIX) + registerUnixSignals(); +#endif } void Application::setMainWindow(QWidget* mainWindow) @@ -98,3 +112,57 @@ bool Application::event(QEvent* event) return QApplication::event(event); } + +#if defined(Q_OS_UNIX) +int Application::unixSignalSocket[2]; + +void Application::registerUnixSignals() +{ + int result = ::socketpair(AF_UNIX, SOCK_STREAM, 0, unixSignalSocket); + Q_ASSERT(0 == result); + if (0 != result) { + // do not register handles when socket creation failed, otherwise + // application will be unresponsive to signals such as SIGINT or SIGTERM + return; + } + + QVector<int> const handledSignals = { SIGQUIT, SIGINT, SIGTERM, SIGHUP }; + for (auto s: handledSignals) { + struct sigaction sigAction; + + sigAction.sa_handler = handleUnixSignal; + sigemptyset(&sigAction.sa_mask); + sigAction.sa_flags = 0 | SA_RESTART; + sigaction(s, &sigAction, nullptr); + } + + m_unixSignalNotifier = new QSocketNotifier(unixSignalSocket[1], QSocketNotifier::Read, this); + connect(m_unixSignalNotifier, SIGNAL(activated(int)), this, SLOT(quitBySignal())); +} + +void Application::handleUnixSignal(int sig) +{ + switch (sig) { + case SIGQUIT: + case SIGINT: + case SIGTERM: + { + char buf = 0; + ::write(unixSignalSocket[0], &buf, sizeof(buf)); + return; + } + case SIGHUP: + return; + } +} + +void Application::quitBySignal() +{ + m_unixSignalNotifier->setEnabled(false); + char buf; + ::read(unixSignalSocket[1], &buf, sizeof(buf)); + + if (nullptr != m_mainWindow) + static_cast<MainWindow*>(m_mainWindow)->appExit(); +} +#endif diff --git a/src/gui/Application.h b/src/gui/Application.h index 149b61ddf..9bfe4d549 100644 --- a/src/gui/Application.h +++ b/src/gui/Application.h @@ -21,6 +21,8 @@ #include <QApplication> +class QSocketNotifier; + class Application : public QApplication { Q_OBJECT @@ -34,8 +36,23 @@ public: Q_SIGNALS: void openFile(const QString& filename); +private Q_SLOTS: +#if defined(Q_OS_UNIX) + void quitBySignal(); +#endif + private: QWidget* m_mainWindow; + +#if defined(Q_OS_UNIX) + /** + * Register Unix signals such as SIGINT and SIGTERM for clean shutdown. + */ + void registerUnixSignals(); + QSocketNotifier* m_unixSignalNotifier; + static void handleUnixSignal(int sig); + static int unixSignalSocket[2]; +#endif }; #endif // KEEPASSX_APPLICATION_H diff --git a/src/gui/DatabaseTabWidget.cpp b/src/gui/DatabaseTabWidget.cpp index af6907001..fed4535bb 100644 --- a/src/gui/DatabaseTabWidget.cpp +++ b/src/gui/DatabaseTabWidget.cpp @@ -246,7 +246,7 @@ bool DatabaseTabWidget::closeDatabase(Database* db) QMessageBox::StandardButton result = MessageBox::question( this, tr("Close?"), - tr("\"%1\" is in edit mode.\nDiscard changes and close anyway?").arg(dbName), + tr("\"%1\" is in edit mode.\nDiscard changes and close anyway?").arg(dbName.toHtmlEscaped()), QMessageBox::Discard | QMessageBox::Cancel, QMessageBox::Cancel); if (result == QMessageBox::Cancel) { return false; @@ -262,7 +262,7 @@ bool DatabaseTabWidget::closeDatabase(Database* db) QMessageBox::StandardButton result = MessageBox::question( this, tr("Save changes?"), - tr("\"%1\" was modified.\nSave changes?").arg(dbName), + tr("\"%1\" was modified.\nSave changes?").arg(dbName.toHtmlEscaped()), QMessageBox::Yes | QMessageBox::Discard | QMessageBox::Cancel, QMessageBox::Yes); if (result == QMessageBox::Yes) { if (!saveDatabase(db)) { diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index 985374c49..4a1298deb 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -19,6 +19,7 @@ #include <QAction> #include <QDesktopServices> +#include <QCheckBox> #include <QHBoxLayout> #include <QLabel> #include <QFile> @@ -312,8 +313,10 @@ void DatabaseWidget::cloneEntry() return; } - Entry* entry = currentEntry->clone(Entry::CloneNewUuid | Entry::CloneResetTimeInfo); + Entry* entry = currentEntry->clone(Entry::CloneNewUuid | Entry::CloneResetTimeInfo | Entry::CloneRenameTitle); entry->setGroup(currentEntry->group()); + if (isInSearchMode()) + search(m_lastSearchText); m_entryView->setFocus(); m_entryView->setCurrentEntry(entry); } @@ -341,7 +344,7 @@ void DatabaseWidget::deleteEntries() result = MessageBox::question( this, tr("Delete entry?"), tr("Do you really want to delete the entry \"%1\" for good?") - .arg(selectedEntries.first()->title()), + .arg(selectedEntries.first()->title().toHtmlEscaped()), QMessageBox::Yes | QMessageBox::No); } else { @@ -365,7 +368,7 @@ void DatabaseWidget::deleteEntries() result = MessageBox::question( this, tr("Move entry to recycle bin?"), tr("Do you really want to move entry \"%1\" to the recycle bin?") - .arg(selectedEntries.first()->title()), + .arg(selectedEntries.first()->title().toHtmlEscaped()), QMessageBox::Yes | QMessageBox::No); } else { @@ -494,8 +497,46 @@ void DatabaseWidget::openUrlForEntry(Entry* entry) } if (urlString.startsWith("cmd://")) { + // check if decision to execute command was stored + if (entry->attributes()->hasKey(EntryAttributes::RememberCmdExecAttr)) { + if (entry->attributes()->value(EntryAttributes::RememberCmdExecAttr) == "1") { + QProcess::startDetached(urlString.mid(6)); + } + return; + } + + // otherwise ask user if (urlString.length() > 6) { - QProcess::startDetached(urlString.mid(6)); + QString cmdTruncated = urlString.mid(6); + if (cmdTruncated.length() > 400) + cmdTruncated = cmdTruncated.left(400) + " […]"; + QMessageBox msgbox(QMessageBox::Icon::Question, + tr("Execute command?"), + tr("Do you really want to execute the following command?<br><br>%1<br>") + .arg(cmdTruncated.toHtmlEscaped()), + QMessageBox::Yes | QMessageBox::No, + this + ); + msgbox.setDefaultButton(QMessageBox::No); + + QCheckBox* checkbox = new QCheckBox(tr("Remember my choice"), &msgbox); + msgbox.setCheckBox(checkbox); + bool remember = false; + QObject::connect(checkbox, &QCheckBox::stateChanged, [&](int state) { + if (static_cast<Qt::CheckState>(state) == Qt::CheckState::Checked) { + remember = true; + } + }); + + int result = msgbox.exec(); + if (result == QMessageBox::Yes) { + QProcess::startDetached(urlString.mid(6)); + } + + if (remember) { + entry->attributes()->set(EntryAttributes::RememberCmdExecAttr, + result == QMessageBox::Yes ? "1" : "0"); + } } } else { @@ -532,7 +573,7 @@ void DatabaseWidget::deleteGroup() QMessageBox::StandardButton result = MessageBox::question( this, tr("Delete group?"), tr("Do you really want to delete the group \"%1\" for good?") - .arg(currentGroup->name()), + .arg(currentGroup->name().toHtmlEscaped()), QMessageBox::Yes | QMessageBox::No); if (result == QMessageBox::Yes) { delete currentGroup; @@ -722,15 +763,10 @@ void DatabaseWidget::unlockDatabase(bool accepted) replaceDatabase(db); - const QList<Group*> groups = m_db->rootGroup()->groupsRecursive(true); - for (Group* group : groups) { - if (group->uuid() == m_groupBeforeLock) { - m_groupView->setCurrentGroup(group); - break; - } - } - + restoreGroupEntryFocus(m_groupBeforeLock, m_entryBeforeLock); m_groupBeforeLock = Uuid(); + m_entryBeforeLock = Uuid(); + setCurrentWidget(m_mainWidget); m_unlockDatabaseWidget->clearForms(); Q_EMIT unlockedDatabase(); @@ -755,7 +791,7 @@ void DatabaseWidget::entryActivationSignalReceived(Entry* entry, EntryModel::Mod void DatabaseWidget::switchToEntryEdit() { Entry* entry = m_entryView->currentEntry(); - Q_ASSERT(entry); + if (!entry) { return; } @@ -766,7 +802,7 @@ void DatabaseWidget::switchToEntryEdit() void DatabaseWidget::switchToGroupEdit() { Group* group = m_groupView->currentGroup(); - Q_ASSERT(group); + if (!group) { return; } @@ -943,6 +979,10 @@ void DatabaseWidget::lock() m_groupBeforeLock = m_db->rootGroup()->uuid(); } + if (m_entryView->currentEntry()) { + m_entryBeforeLock = m_entryView->currentEntry()->uuid(); + } + clearAllWidgets(); m_unlockDatabaseWidget->load(m_filename); setCurrentWidget(m_unlockDatabaseWidget); @@ -1028,7 +1068,22 @@ void DatabaseWidget::reloadDatabaseFile() } } + Uuid groupBeforeReload; + if (m_groupView && m_groupView->currentGroup()) { + groupBeforeReload = m_groupView->currentGroup()->uuid(); + } + else { + groupBeforeReload = m_db->rootGroup()->uuid(); + } + + Uuid entryBeforeReload; + if (m_entryView && m_entryView->currentEntry()) { + entryBeforeReload = m_entryView->currentEntry()->uuid(); + } + replaceDatabase(db); + restoreGroupEntryFocus(groupBeforeReload, entryBeforeReload); + } else { MessageBox::critical(this, tr("Autoreload Failed"), @@ -1061,6 +1116,35 @@ QStringList DatabaseWidget::customEntryAttributes() const return entry->attributes()->customKeys(); } +/* + * Restores the focus on the group and entry that was focused + * before the database was locked or reloaded. + */ +void DatabaseWidget::restoreGroupEntryFocus(Uuid groupUuid, Uuid entryUuid) +{ + Group* restoredGroup = nullptr; + const QList<Group*> groups = m_db->rootGroup()->groupsRecursive(true); + for (Group* group : groups) { + if (group->uuid() == groupUuid) { + restoredGroup = group; + break; + } + } + + if (restoredGroup != nullptr) { + m_groupView->setCurrentGroup(restoredGroup); + + const QList<Entry*> entries = restoredGroup->entries(); + for (Entry* entry : entries) { + if (entry->uuid() == entryUuid) { + m_entryView->setCurrentEntry(entry); + break; + } + } + } + +} + bool DatabaseWidget::isGroupSelected() const { return m_groupView->currentGroup() != nullptr; diff --git a/src/gui/DatabaseWidget.h b/src/gui/DatabaseWidget.h index f55fa2027..79e58cecf 100644 --- a/src/gui/DatabaseWidget.h +++ b/src/gui/DatabaseWidget.h @@ -163,6 +163,7 @@ private Q_SLOTS: // Database autoreload slots void onWatchedFileChanged(); void reloadDatabaseFile(); + void restoreGroupEntryFocus(Uuid groupUuid, Uuid EntryUuid); private: void setClipboardTextAndMinimize(const QString& text); @@ -190,6 +191,7 @@ private: Group* m_newParent; QString m_filename; Uuid m_groupBeforeLock; + Uuid m_entryBeforeLock; // Search state QString m_lastSearchText; diff --git a/src/gui/EditWidgetIcons.cpp b/src/gui/EditWidgetIcons.cpp index e0ac5227b..145957ab9 100644 --- a/src/gui/EditWidgetIcons.cpp +++ b/src/gui/EditWidgetIcons.cpp @@ -190,6 +190,10 @@ void EditWidgetIcons::abortFaviconDownload(bool clearRedirect) void EditWidgetIcons::onRequestFinished(QNetworkReply *reply) { + if (m_database == nullptr) { + return; + } + if (!reply->error()) { QImage image; image.loadFromData(reply->readAll()); diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index cc94ca9a9..819bda5dc 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -364,7 +364,7 @@ void MainWindow::setMenuActionState(DatabaseWidget::Mode mode) bool groupSelected = dbWidget->isGroupSelected(); m_ui->actionEntryNew->setEnabled(!inSearch); - m_ui->actionEntryClone->setEnabled(singleEntrySelected && !inSearch); + m_ui->actionEntryClone->setEnabled(singleEntrySelected); m_ui->actionEntryEdit->setEnabled(singleEntrySelected); m_ui->actionEntryDelete->setEnabled(entriesSelected); m_ui->actionEntryCopyTitle->setEnabled(singleEntrySelected && dbWidget->currentEntryHasTitle()); diff --git a/src/gui/MainWindow.h b/src/gui/MainWindow.h index cf2c9cd96..ab9924a75 100644 --- a/src/gui/MainWindow.h +++ b/src/gui/MainWindow.h @@ -42,6 +42,7 @@ public: public Q_SLOTS: void openDatabase(const QString& fileName, const QString& pw = QString(), const QString& keyFile = QString()); + void appExit(); protected: void closeEvent(QCloseEvent* event) override; @@ -68,7 +69,6 @@ private Q_SLOTS: void applySettingsChanges(); void trayIconTriggered(QSystemTrayIcon::ActivationReason reason); void toggleWindow(); - void appExit(); void lockDatabasesAfterInactivity(); void repairDatabase(); diff --git a/src/gui/MainWindow.ui b/src/gui/MainWindow.ui index 05b80caa2..188ef1586 100644 --- a/src/gui/MainWindow.ui +++ b/src/gui/MainWindow.ui @@ -155,15 +155,15 @@ <addaction name="actionEntryCopyNotes"/> <addaction name="separator"/> </widget> - <addaction name="actionEntryNew"/> - <addaction name="actionEntryClone"/> - <addaction name="actionEntryEdit"/> - <addaction name="actionEntryDelete"/> <addaction name="actionEntryCopyUsername"/> <addaction name="actionEntryCopyPassword"/> <addaction name="menuEntryCopyAttribute"/> <addaction name="actionEntryAutoType"/> <addaction name="actionEntryOpenUrl"/> + <addaction name="actionEntryEdit"/> + <addaction name="actionEntryClone"/> + <addaction name="actionEntryDelete"/> + <addaction name="actionEntryNew"/> </widget> <widget class="QMenu" name="menuGroups"> <property name="title"> diff --git a/src/gui/PasswordGeneratorWidget.cpp b/src/gui/PasswordGeneratorWidget.cpp index 6495d83a2..4a4b438e3 100644 --- a/src/gui/PasswordGeneratorWidget.cpp +++ b/src/gui/PasswordGeneratorWidget.cpp @@ -45,11 +45,15 @@ PasswordGeneratorWidget::PasswordGeneratorWidget(QWidget* parent) connect(m_ui->optionButtons, SIGNAL(buttonClicked(int)), SLOT(updateGenerator())); - // set font size of password quality and entropy labels dynamically to 80% of the default font size + // set font size of password quality and entropy labels dynamically to 80% of + // the default font size, but make it no smaller than 8pt QFont defaultFont; - defaultFont.setPointSize(static_cast<int>(defaultFont.pointSize() * 0.8f)); - m_ui->entropyLabel->setFont(defaultFont); - m_ui->strengthLabel->setFont(defaultFont); + int smallerSize = static_cast<int>(defaultFont.pointSize() * 0.8f); + if (smallerSize >= 8) { + defaultFont.setPointSize(smallerSize); + m_ui->entropyLabel->setFont(defaultFont); + m_ui->strengthLabel->setFont(defaultFont); + } loadSettings(); reset(); @@ -132,8 +136,10 @@ void PasswordGeneratorWidget::updatePasswordStrength(const QString& password) void PasswordGeneratorWidget::generatePassword() { - QString password = m_generator->generatePassword(); - m_ui->editNewPassword->setText(password); + if (m_generator->isValid()) { + QString password = m_generator->generatePassword(); + m_ui->editNewPassword->setText(password); + } } void PasswordGeneratorWidget::applyPassword() @@ -279,5 +285,11 @@ void PasswordGeneratorWidget::updateGenerator() m_generator->setCharClasses(classes); m_generator->setFlags(flags); + if (m_generator->isValid()) { + m_ui->buttonGenerate->setEnabled(true); + } else { + m_ui->buttonGenerate->setEnabled(false); + } + regeneratePassword(); } diff --git a/src/gui/PasswordGeneratorWidget.ui b/src/gui/PasswordGeneratorWidget.ui index a2e798abf..b7413f56b 100644 --- a/src/gui/PasswordGeneratorWidget.ui +++ b/src/gui/PasswordGeneratorWidget.ui @@ -104,11 +104,6 @@ QProgressBar::chunk { <height>30</height> </size> </property> - <property name="font"> - <font> - <pointsize>8</pointsize> - </font> - </property> <property name="text"> <string>strength</string> </property> @@ -144,11 +139,6 @@ QProgressBar::chunk { <height>0</height> </size> </property> - <property name="font"> - <font> - <pointsize>8</pointsize> - </font> - </property> <property name="text"> <string>entropy</string> </property> @@ -295,6 +285,12 @@ QProgressBar::chunk { </item> <item> <widget class="QToolButton" name="checkBoxNumbers"> + <property name="minimumSize"> + <size> + <width>0</width> + <height>26</height> + </size> + </property> <property name="focusPolicy"> <enum>Qt::StrongFocus</enum> </property> @@ -314,6 +310,12 @@ QProgressBar::chunk { </item> <item> <widget class="QToolButton" name="checkBoxSpecialChars"> + <property name="minimumSize"> + <size> + <width>0</width> + <height>26</height> + </size> + </property> <property name="focusPolicy"> <enum>Qt::StrongFocus</enum> </property> diff --git a/src/gui/SearchWidget.cpp b/src/gui/SearchWidget.cpp index 4ac01b3fc..933686dfa 100644 --- a/src/gui/SearchWidget.cpp +++ b/src/gui/SearchWidget.cpp @@ -41,6 +41,7 @@ SearchWidget::SearchWidget(QWidget *parent) connect(this, SIGNAL(escapePressed()), m_ui->searchEdit, SLOT(clear())); new QShortcut(Qt::CTRL + Qt::Key_F, this, SLOT(searchFocus()), nullptr, Qt::ApplicationShortcut); + new QShortcut(Qt::Key_Escape, m_ui->searchEdit, SLOT(clear()), nullptr, Qt::ApplicationShortcut); m_ui->searchEdit->installEventFilter(this); diff --git a/src/gui/entry/EditEntryWidget.cpp b/src/gui/entry/EditEntryWidget.cpp index d9ba5bd83..f2372a0d5 100644 --- a/src/gui/entry/EditEntryWidget.cpp +++ b/src/gui/entry/EditEntryWidget.cpp @@ -89,6 +89,7 @@ void EditEntryWidget::setupMain() add(tr("Entry"), m_mainWidget); m_mainUi->togglePasswordButton->setIcon(filePath()->onOffIcon("actions", "password-show")); + m_mainUi->togglePasswordGeneratorButton->setIcon(filePath()->icon("actions", "password-generator", false)); connect(m_mainUi->togglePasswordButton, SIGNAL(toggled(bool)), m_mainUi->passwordEdit, SLOT(setShowPassword(bool))); connect(m_mainUi->togglePasswordGeneratorButton, SIGNAL(toggled(bool)), SLOT(togglePasswordGeneratorButton(bool))); connect(m_mainUi->expireCheck, SIGNAL(toggled(bool)), m_mainUi->expireDatePicker, SLOT(setEnabled(bool))); @@ -271,14 +272,15 @@ void EditEntryWidget::loadEntry(Entry* entry, bool create, bool history, const Q m_history = history; if (history) { - setHeadline(QString("%1 > %2").arg(parentName, tr("Entry history"))); + setHeadline(QString("%1 > %2").arg(parentName.toHtmlEscaped(), tr("Entry history"))); } else { if (create) { - setHeadline(QString("%1 > %2").arg(parentName, tr("Add entry"))); + setHeadline(QString("%1 > %2").arg(parentName.toHtmlEscaped(), tr("Add entry"))); } else { - setHeadline(QString("%1 > %2 > %3").arg(parentName, entry->title(), tr("Edit entry"))); + setHeadline(QString("%1 > %2 > %3").arg(parentName.toHtmlEscaped(), + entry->title().toHtmlEscaped(), tr("Edit entry"))); } } @@ -433,6 +435,9 @@ void EditEntryWidget::saveEntry() void EditEntryWidget::updateEntryData(Entry* entry) const { + entry->attributes()->copyCustomKeysFrom(m_entryAttributes); + entry->attachments()->copyDataFrom(m_entryAttachments); + entry->setTitle(m_mainUi->titleEdit->text()); entry->setUsername(m_mainUi->usernameEdit->text()); entry->setUrl(m_mainUi->urlEdit->text()); @@ -442,9 +447,6 @@ void EditEntryWidget::updateEntryData(Entry* entry) const entry->setNotes(m_mainUi->notesEdit->toPlainText()); - entry->attributes()->copyCustomKeysFrom(m_entryAttributes); - entry->attachments()->copyDataFrom(m_entryAttachments); - IconStruct iconStruct = m_iconsWidget->state(); if (iconStruct.number < 0) { diff --git a/src/gui/entry/EditEntryWidgetMain.ui b/src/gui/entry/EditEntryWidgetMain.ui index 083f1c033..b896963c0 100644 --- a/src/gui/entry/EditEntryWidgetMain.ui +++ b/src/gui/entry/EditEntryWidgetMain.ui @@ -77,9 +77,6 @@ </item> <item> <widget class="QToolButton" name="togglePasswordGeneratorButton"> - <property name="text"> - <string>Generate</string> - </property> <property name="checkable"> <bool>true</bool> </property> diff --git a/src/http/HttpSettings.cpp b/src/http/HttpSettings.cpp index 0d6b6f1f1..e51f87cfb 100644 --- a/src/http/HttpSettings.cpp +++ b/src/http/HttpSettings.cpp @@ -18,7 +18,7 @@ PasswordGenerator HttpSettings::m_generator; bool HttpSettings::isEnabled() { - return config()->get("Http/Enabled", true).toBool(); + return config()->get("Http/Enabled", false).toBool(); } void HttpSettings::setEnabled(bool enabled) @@ -126,18 +126,6 @@ void HttpSettings::setSupportKphFields(bool supportKphFields) config()->set("Http/SupportKphFields", supportKphFields); } -QString HttpSettings::httpHost() -{ - static const QString host = "localhost"; - - return config()->get("Http/Host", host).toString().toUtf8(); -} - -void HttpSettings::setHttpHost(QString host) -{ - config()->set("Http/Host", host); -} - int HttpSettings::httpPort() { static const int PORT = 19455; diff --git a/src/http/HttpSettings.h b/src/http/HttpSettings.h index c1987f7ea..bea5648c9 100644 --- a/src/http/HttpSettings.h +++ b/src/http/HttpSettings.h @@ -42,8 +42,6 @@ public: static void setSearchInAllDatabases(bool searchInAllDatabases); static bool supportKphFields(); static void setSupportKphFields(bool supportKphFields); - static QString httpHost(); - static void setHttpHost(QString host); static int httpPort(); static void setHttpPort(int port); diff --git a/src/http/OptionDialog.cpp b/src/http/OptionDialog.cpp index e92c6e1a5..5245d333b 100644 --- a/src/http/OptionDialog.cpp +++ b/src/http/OptionDialog.cpp @@ -15,6 +15,8 @@ #include "ui_OptionDialog.h" #include "HttpSettings.h" +#include <QMessageBox> + OptionDialog::OptionDialog(QWidget *parent) : QWidget(parent), ui(new Ui::OptionDialog()) @@ -41,7 +43,6 @@ void OptionDialog::loadSettings() ui->sortByUsername->setChecked(true); else ui->sortByTitle->setChecked(true); - ui->httpHost->setText(settings.httpHost()); ui->httpPort->setText(QString::number(settings.httpPort())); /* @@ -70,8 +71,14 @@ void OptionDialog::saveSettings() settings.setUnlockDatabase(ui->unlockDatabase->isChecked()); settings.setMatchUrlScheme(ui->matchUrlScheme->isChecked()); settings.setSortByUsername(ui->sortByUsername->isChecked()); - settings.setHttpHost(ui->httpHost->text()); - settings.setHttpPort(ui->httpPort->text().toInt()); + + int port = ui->httpPort->text().toInt(); + if (port < 1024) { + QMessageBox::warning(this, tr("Cannot bind to privileged ports"), + tr("Cannot bind to privileged ports below 1024!\nUsing default port 19455.")); + port = 19455; + } + settings.setHttpPort(port); /* settings.setPasswordUseLowercase(ui->checkBoxLower->isChecked()); diff --git a/src/http/OptionDialog.ui b/src/http/OptionDialog.ui index ee09f9537..963280860 100644 --- a/src/http/OptionDialog.ui +++ b/src/http/OptionDialog.ui @@ -7,7 +7,7 @@ <x>0</x> <y>0</y> <width>605</width> - <height>389</height> + <height>429</height> </rect> </property> <property name="windowTitle"> @@ -17,7 +17,7 @@ <item> <widget class="QCheckBox" name="enableHttpServer"> <property name="text"> - <string>Enable KeepassXC Http protocol + <string>Enable KeepassXC HTTP protocol This is required for accessing your databases from ChromeIPass or PassIFox</string> </property> </widget> @@ -28,7 +28,7 @@ This is required for accessing your databases from ChromeIPass or PassIFox</stri <enum>QTabWidget::Rounded</enum> </property> <property name="currentIndex"> - <number>0</number> + <number>2</number> </property> <widget class="QWidget" name="tab"> <attribute name="title"> @@ -201,32 +201,41 @@ Only entries with the same scheme (http://, https://, ftp://, ...) are returned< </widget> </item> <item> - <layout class="QHBoxLayout" name="horizontalLayout_1"> - <item> - <widget class="QLabel" name="label_5"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> + <spacer name="verticalSpacer_4"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Fixed</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <layout class="QGridLayout" name="gridLayout"> + <item row="1" column="1"> + <widget class="QLineEdit" name="httpPort"> + <property name="inputMask"> + <string notr="true">d0000</string> </property> - <property name="text"> - <string>HTTP Host:</string> + <property name="placeholderText"> + <string>Default port: 19455</string> </property> </widget> </item> - <item> - <widget class="QLineEdit" name="httpHost"> - <property name="placeholderText"> - <string>Default host: localhost</string> + <item row="2" column="1"> + <widget class="QLabel" name="label_5"> + <property name="text"> + <string>KeePassXC will listen to this port on 127.0.0.1</string> </property> </widget> </item> - </layout> - </item> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_2"> - <item> + <item row="1" column="0"> <widget class="QLabel" name="label_4"> <property name="sizePolicy"> <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> @@ -237,15 +246,8 @@ Only entries with the same scheme (http://, https://, ftp://, ...) are returned< <property name="text"> <string>HTTP Port:</string> </property> - </widget> - </item> - <item> - <widget class="QLineEdit" name="httpPort"> - <property name="inputMask"> - <string notr="true">d0000</string> - </property> - <property name="placeholderText"> - <string>Default port: 19455</string> + <property name="alignment"> + <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set> </property> </widget> </item> diff --git a/src/http/Server.cpp b/src/http/Server.cpp index 16423d8cf..f09493829 100644 --- a/src/http/Server.cpp +++ b/src/http/Server.cpp @@ -331,68 +331,34 @@ void Server::start(void) if (m_started) return; - bool nohost = true; + // local loopback hardcoded, since KeePassHTTP handshake + // is not safe against interception + QHostAddress address("127.0.0.1"); int port = HttpSettings::httpPort(); - - QHostInfo info = QHostInfo::fromName(HttpSettings::httpHost()); - if (!info.addresses().isEmpty()) { - void* addrx = NULL; - unsigned int flags = MHD_USE_SELECT_INTERNALLY; - QHostAddress address = info.addresses().first(); - - if (address.protocol() == QAbstractSocket::IPv4Protocol) { - struct sockaddr_in *addr = static_cast<struct sockaddr_in*>(calloc(1, sizeof(struct sockaddr_in))); - addrx = static_cast<void*>(addr); - addr->sin_family = AF_INET; - addr->sin_port = htons(HttpSettings::httpPort()); - addr->sin_addr.s_addr = htonl(address.toIPv4Address()); - nohost = false; - } else { - struct sockaddr_in6 *addr = static_cast<struct sockaddr_in6*>(calloc(1, sizeof(struct sockaddr_in6))); - addrx = static_cast<void*>(addr); - addr->sin6_family = AF_INET6; - addr->sin6_port = htons(HttpSettings::httpPort()); - memcpy(&addr->sin6_addr, address.toIPv6Address().c, 16); - nohost = false; - flags |= MHD_USE_IPv6; - } - - if (nohost) { - qWarning("HTTPPlugin: Faled to get configured host!"); - } else { - if (NULL == (daemon = MHD_start_daemon(flags, port, NULL, NULL, - &this->request_handler_wrapper, this, - MHD_OPTION_NOTIFY_COMPLETED, - this->request_completed, NULL, - MHD_OPTION_SOCK_ADDR, - addrx, - MHD_OPTION_END))) { - nohost = true; - qWarning("HTTPPlugin: Failed to bind to configured host!"); - } else { - nohost = false; - //qWarning("HTTPPlugin: Binded to configured host."); - } - - } - - if (addrx != NULL) - free(addrx); - } - - if (nohost) { - if (NULL == (daemon = MHD_start_daemon(MHD_USE_SELECT_INTERNALLY, port, NULL, NULL, - &this->request_handler_wrapper, this, - MHD_OPTION_NOTIFY_COMPLETED, - this->request_completed, NULL, - MHD_OPTION_END))) { - qWarning("HTTPPlugin: Fatal! Failed to bind to both configured and default hosts!"); - } else { - qWarning("HTTPPlugin: Bound to fallback address 0.0.0.0/:::!"); - } + + void* addrx = NULL; + unsigned int flags = MHD_USE_SELECT_INTERNALLY; + + struct sockaddr_in *addr = static_cast<struct sockaddr_in*>(calloc(1, sizeof(struct sockaddr_in))); + addrx = static_cast<void*>(addr); + addr->sin_family = AF_INET; + addr->sin_port = htons(port); + addr->sin_addr.s_addr = htonl(address.toIPv4Address()); + + if (NULL == (daemon = MHD_start_daemon(flags, port, NULL, NULL, + &this->request_handler_wrapper, this, + MHD_OPTION_NOTIFY_COMPLETED, + this->request_completed, NULL, + MHD_OPTION_SOCK_ADDR, + addrx, + MHD_OPTION_END))) { + qWarning("HTTPPlugin: Failed to bind to localhost!"); + } else { + m_started = true; } - m_started = true; + if (addrx != NULL) + free(addrx); } diff --git a/src/http/Service.cpp b/src/http/Service.cpp index ceec292d6..0ac0fd836 100644 --- a/src/http/Service.cpp +++ b/src/http/Service.cpp @@ -480,7 +480,8 @@ void Service::updateEntry(const QString &, const QString &uuid, const QString &l //ShowNotification(QString("%0: You have an entry change prompt waiting, click to activate").arg(requestId)); if ( HttpSettings::alwaysAllowUpdate() || QMessageBox::warning(0, tr("KeePassXC: Update Entry"), - tr("Do you want to update the information in %1 - %2?").arg(QUrl(url).host()).arg(u), + tr("Do you want to update the information in %1 - %2?") + .arg(QUrl(url).host().toHtmlEscaped()).arg(u.toHtmlEscaped()), QMessageBox::Yes|QMessageBox::No) == QMessageBox::Yes ) { entry->beginUpdate(); entry->setUsername(login); diff --git a/src/main.cpp b/src/main.cpp index a94d65eaa..224e54d1e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -28,6 +28,16 @@ #include "gui/MainWindow.h" #include "gui/MessageBox.h" +#ifdef QT_STATIC +#include <QtPlugin> + +#ifdef Q_OS_WIN +Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin) +#elif Q_OS_LINUX +Q_IMPORT_PLUGIN(QXcbIntegrationPlugin) +#endif +#endif + int main(int argc, char** argv) { #ifdef QT_NO_DEBUG diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 0ea73b2fe..5840a5b4b 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -92,6 +92,7 @@ set(TEST_LIBRARIES Qt5::Widgets Qt5::Test ${GCRYPT_LIBRARIES} + ${GPGERROR_LIBRARIES} ${ZLIB_LIBRARIES} ) diff --git a/tests/gui/TestGui.cpp b/tests/gui/TestGui.cpp index c23226a28..0c776e021 100644 --- a/tests/gui/TestGui.cpp +++ b/tests/gui/TestGui.cpp @@ -481,8 +481,7 @@ void TestGui::testSearch() QCOMPARE(entry->title(), origTitle.append("_edited")); // Cancel search, should return to normal view - QTest::mouseClick(searchTextEdit, Qt::LeftButton); - QTest::keyClick(searchTextEdit, Qt::Key_Escape); + QTest::keyClick(m_mainWindow, Qt::Key_Escape); QTRY_COMPARE(m_dbWidget->currentMode(), DatabaseWidget::ViewMode); } @@ -567,7 +566,7 @@ void TestGui::testCloneEntry() QCOMPARE(entryView->model()->rowCount(), 2); Entry* entryClone = entryView->entryFromIndex(entryView->model()->index(1, 1)); QVERIFY(entryOrg->uuid() != entryClone->uuid()); - QCOMPARE(entryClone->title(), entryOrg->title()); + QCOMPARE(entryClone->title(), entryOrg->title() + QString(" - Clone")); } void TestGui::testDragAndDropEntry() diff --git a/utils/CMakeLists.txt b/utils/CMakeLists.txt index 846e39230..83f00b4bc 100644 --- a/utils/CMakeLists.txt +++ b/utils/CMakeLists.txt @@ -20,6 +20,7 @@ target_link_libraries(kdbx-extract keepassx_core Qt5::Core ${GCRYPT_LIBRARIES} + ${GPGERROR_LIBRARIES} ${ZLIB_LIBRARIES}) add_executable(kdbx-merge kdbx-merge.cpp) @@ -27,6 +28,7 @@ target_link_libraries(kdbx-merge keepassx_core Qt5::Core ${GCRYPT_LIBRARIES} + ${GPGERROR_LIBRARIES} ${ZLIB_LIBRARIES}) diff --git a/utils/entropy-meter.cpp b/utils/entropy-meter.cpp index a5e6e50e9..74f6bc11a 100644 --- a/utils/entropy-meter.cpp +++ b/utils/entropy-meter.cpp @@ -101,9 +101,10 @@ int main(int argc, char **argv) break; } } - if (line[0]) + if (line[0]) { calculate(line,advanced); printf("> "); + } } } else |