diff options
author | Saturneric <[email protected]> | 2021-08-25 10:00:48 +0000 |
---|---|---|
committer | Saturneric <[email protected]> | 2021-08-25 10:00:48 +0000 |
commit | 5b55ebfe6758e3aa7a3b66dbaa5231002291eb44 (patch) | |
tree | 28fe92ffec2d5608b5e6af665ec3b8f06922364a | |
parent | Merge branch 'develop' (diff) | |
parent | Update Documents. (diff) | |
download | GpgFrontend-5b55ebfe6758e3aa7a3b66dbaa5231002291eb44.tar.gz GpgFrontend-5b55ebfe6758e3aa7a3b66dbaa5231002291eb44.zip |
Merge branch 'develop'
99 files changed, 13417 insertions, 8396 deletions
diff --git a/.github/workflows/release-ci.yml b/.github/workflows/release-ci.yml index e4371bfc..2823e056 100644 --- a/.github/workflows/release-ci.yml +++ b/.github/workflows/release-ci.yml @@ -42,6 +42,16 @@ jobs: sudo apt-get -y install libglu1-mesa-dev libfontconfig1-dev libx11-xcb-dev libicu-dev libxcb-* if: matrix.os == 'ubuntu-16.04' + - name: Codesign Configuration (macOS) + run: | + echo ${{secrets.MACOS_CERTIFICATE}} | base64 --decode > certificate.p12 + security create-keychain -p gpgfrontend build.keychain + security default-keychain -s build.keychain + security unlock-keychain -p gpgfrontend build.keychain + security import certificate.p12 -k build.keychain -P ${{secrets.MAOS_CERTIFICATE_PWD}} -T /usr/bin/codesign + security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k gpgfrontend build.keychain + if: matrix.os == 'macos-latest' + - name: Install Dependence (macOS) run: | brew install cmake git autoconf automake qt@5 gcc texinfo gettext libgpg-error libassuan gpgme openssl @@ -132,13 +142,25 @@ jobs: run: cmake --build ${{github.workspace}}/build --config $env.BUILD_TYPE}} -- -j 2 if: matrix.os == 'ubuntu-16.04' || matrix.os == 'macos-latest' - - name: Package App Bundle (macOS) + - name: Build & Sign App Bundle (macOS) run: | macdeployqt ${{github.workspace}}/build/release/GpgFrontend.app + codesign --deep --force --options=runtime -s "Developer ID Application: Yu Hu (4279AWUL3X)" ${{github.workspace}}/build/release/GpgFrontend.app -v mkdir ${{github.workspace}}/build/tmp/ + if: matrix.os == 'macos-latest' + + - name: Package & Sign App Bundle (macOS) + run: | hdiutil create ${{github.workspace}}/build/tmp/tmp.dmg -ov -volname "GpgFrontend" -fs HFS+ -srcfolder ${{github.workspace}}/build/release/ mkdir ${{github.workspace}}/build/artifactOut hdiutil convert ${{github.workspace}}/build/tmp/tmp.dmg -format UDZO -o ${{github.workspace}}/build/artifactOut/GpgFrontend.dmg + codesign -s "Developer ID Application: Yu Hu (4279AWUL3X)" ${{github.workspace}}/build/artifactOut/GpgFrontend.dmg + mv ${{github.workspace}}/build/artifactOut/GpgFrontend.dmg ${{github.workspace}}/build/artifactOut/GpgFrontend-${{steps.vars.outputs.sha_short}}-x86_64.dmg + if: matrix.os == 'macos-latest' + + - name: Notarize Release Build (macOS) + run: | + xcrun altool --notarize-app -f ${{github.workspace}}/build/artifactOut/GpgFrontend-${{steps.vars.outputs.sha_short}}-x86_64.dmg --primary-bundle-id pub.gpgfrontend.gpgfrontend -u ${{secrets.APPLE_DEVELOPER_ID}} -p ${{secrets.APPLE_DEVELOPER_ID_SECRET}} if: matrix.os == 'macos-latest' - name: Package App Image (Linux) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3ad2246c..31e2babb 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -42,6 +42,16 @@ jobs: sudo apt-get -y install libglu1-mesa-dev libfontconfig1-dev libx11-xcb-dev libicu-dev libxcb-* if: matrix.os == 'ubuntu-16.04' + - name: Codesign Configuration (macOS) + run: | + echo ${{secrets.MACOS_CERTIFICATE}} | base64 --decode > certificate.p12 + security create-keychain -p gpgfrontend build.keychain + security default-keychain -s build.keychain + security unlock-keychain -p gpgfrontend build.keychain + security import certificate.p12 -k build.keychain -P ${{secrets.MAOS_CERTIFICATE_PWD}} -T /usr/bin/codesign + security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k gpgfrontend build.keychain + if: matrix.os == 'macos-latest' + - name: Install Dependence (macOS) run: | brew install cmake git autoconf automake qt@5 gcc texinfo gettext libgpg-error libassuan gpgme openssl @@ -136,14 +146,25 @@ jobs: id: vars run: echo "::set-output name=sha_short::$(git rev-parse --short HEAD)" - - name: Package App Bundle (macOS) + - name: Build & Sign App Bundle (macOS) run: | macdeployqt ${{github.workspace}}/build/release/GpgFrontend.app + codesign --deep --force --options=runtime -s "Developer ID Application: Yu Hu (4279AWUL3X)" ${{github.workspace}}/build/release/GpgFrontend.app -v mkdir ${{github.workspace}}/build/tmp/ + if: matrix.os == 'macos-latest' + + - name: Package & Sign App Bundle (macOS) + run: | hdiutil create ${{github.workspace}}/build/tmp/tmp.dmg -ov -volname "GpgFrontend" -fs HFS+ -srcfolder ${{github.workspace}}/build/release/ mkdir ${{github.workspace}}/build/artifactOut hdiutil convert ${{github.workspace}}/build/tmp/tmp.dmg -format UDZO -o ${{github.workspace}}/build/artifactOut/GpgFrontend.dmg - mv ${{github.workspace}}/build/artifactOut/GpgFrontend.dmg ${{github.workspace}}/build/artifactOut/GpgFrontend-${{steps.vars.outputs.sha_short}}-x86_64.dmg + codesign -s "Developer ID Application: Yu Hu (4279AWUL3X)" ${{github.workspace}}/build/artifactOut/GpgFrontend.dmg + mv ${{github.workspace}}/build/artifactOut/GpgFrontend.dmg ${{github.workspace}}/build/artifactOut/GpgFrontend-${{steps.vars.outputs.sha_short}}-x86_64.dmg + if: matrix.os == 'macos-latest' + + - name: Notarize Release Build (macOS) + run: | + xcrun altool --notarize-app -f ${{github.workspace}}/build/artifactOut/GpgFrontend-${{steps.vars.outputs.sha_short}}-x86_64.dmg --primary-bundle-id pub.gpgfrontend.gpgfrontend -u ${{secrets.APPLE_DEVELOPER_ID}} -p ${{secrets.APPLE_DEVELOPER_ID_SECRET}} if: matrix.os == 'macos-latest' - name: Package App Image (Linux) @@ -109,9 +109,8 @@ Read the animated pictures in the [Document](https://gpgfrontend.pub/#/quick-sta 0. If command `gpg` is not available, please use homebrew to install it first. 1. [Download GpgFrontend](https://github.com/saturneric/GpgFrontend/releases) macOS edition from the latest release 2. Double-Click GpgFrontend.dmg to load it - - macOS will automatically decompress the zip file and then you will be able to see the dmg 3. Double click and run it - (due to macOS security policy, you may need a little more step). + - Every Release App is Now Code-Signed By Develop ID Certificate and Checked By Apple Inc. 4. If it satisfies you, you can drag it into your Application folder. #### Debian/Ubuntu/CentOS diff --git a/include/GpgFrontend.h.in b/include/GpgFrontend.h.in index 555f4589..6460967c 100644 --- a/include/GpgFrontend.h.in +++ b/include/GpgFrontend.h.in @@ -25,6 +25,9 @@ #ifndef GPGFRONTEND_H_IN #define GPGFRONTEND_H_IN +/** + * STD Headers + */ #include <iostream> #include <string> #include <cmath> @@ -33,22 +36,37 @@ #include <utility> #include <list> +/** + * QT Headers + */ #include <QtCore> #include <QtWidgets> #include <QtNetwork/QtNetwork> #include <QtPrintSupport/QtPrintSupport> +/** + * GpgME Headers + */ #include <gpgme.h> +/** + * Platform Vars + */ #define WINDOWS 0 #define MACOS 1 #define LINUX 2 +#define OS_PLATFORM @OS_PLATFORM@ + +/** + * Build Options Vars + */ #define RELEASE 0 #define DEBUG 1 -#define OS_PLATFORM @OS_PLATFORM@ - +/** + * Resources File(s) Path Vars + */ #if OS_PLATFORM == MACOS && BUILD_FLAG == RELEASE # define RESOURCE_DIR(appDir) (appDir + "/../Resources/") #elif OS_PLATFORM == LINUX && BUILD_FLAG == RELEASE diff --git a/include/GpgFrontendBuildInfo.h.in b/include/GpgFrontendBuildInfo.h.in index 1da57de9..bf1d3f8a 100644 --- a/include/GpgFrontendBuildInfo.h.in +++ b/include/GpgFrontendBuildInfo.h.in @@ -25,19 +25,30 @@ #ifndef GPGFRONTEND_BUILD_INFO_H_IN #define GPGFRONTEND_BUILD_INFO_H_IN +/** + * Logic Version (*.*.*) + */ #define VERSION_MAJOR @CMAKE_PROJECT_VERSION_MAJOR@ #define VERSION_MINOR @CMAKE_PROJECT_VERSION_MINOR@ #define VERSION_PATCH @CMAKE_PROJECT_VERSION_PATCH@ +/** + * Code Version (According to Git) + */ #define GIT_BRANCH_NAME "@GIT_BRANCH_NAME@" #define GIT_COMMIT_HASH "@GIT_COMMIT_HASH@" +/** + * Generated Information (According to CMake) + */ #define PROJECT_NAME "@PROJECT_NAME@" #define BUILD_VERSION "@BUILD_VERSION@" #define GIT_VERSION "@GIT_VERSION@" +/** + * Build Information + */ #define BUILD_FLAG @BUILD_FLAG@ - #define BUILD_TIMESTAMP "@BUILD_TIMESTAMP@" #endif // GPGFRONTEND_BUILD_INFO_H_IN diff --git a/include/MainWindow.h b/include/MainWindow.h index 20f9a0b5..176a8914 100644 --- a/include/MainWindow.h +++ b/include/MainWindow.h @@ -314,6 +314,16 @@ private: void saveSettings(); /** + * @details Get full crypto text + */ + QString getCryptText(const QString& shortenCryptoText); + + /** + * @details Shorten crypto text + */ + void shortenCryptText(); + + /** * @brief return true, if restart is needed */ [[nodiscard]] bool getRestartNeeded() const; diff --git a/include/advance/UnknownSignersChecker.h b/include/advance/UnknownSignersChecker.h new file mode 100644 index 00000000..8f644de6 --- /dev/null +++ b/include/advance/UnknownSignersChecker.h @@ -0,0 +1,52 @@ +/** + * This file is part of GPGFrontend. + * + * GPGFrontend 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 3 of the License, or + * (at your option) any later version. + * + * Foobar 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 Foobar. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from gpg4usb-team. + * Their source code version also complies with GNU General Public License. + * + * The source code version of this software was modified and released + * by Saturneric<[email protected]> starting on May 12, 2021. + * + */ + +#ifndef GPGFRONTEND_ZH_CN_TS_UNKNOWNSIGNERSCHECKER_H +#define GPGFRONTEND_ZH_CN_TS_UNKNOWNSIGNERSCHECKER_H + +#include "server/api/PubkeyGetter.h" + +class UnknownSignersChecker : public QObject { +Q_OBJECT +public: + + UnknownSignersChecker(GpgME::GpgContext *ctx, gpgme_verify_result_t result); + + void start(); + +private: + + QString appPath; + QSettings settings; + GpgME::GpgContext *mCtx; + gpgme_verify_result_t mResult; + + QVector<QString> unknownFprs; + + void check_signer(gpgme_signature_t sign); + +}; + + +#endif //GPGFRONTEND_ZH_CN_TS_UNKNOWNSIGNERSCHECKER_H diff --git a/include/gpg/GpgConstants.h b/include/gpg/GpgConstants.h index 64286ca4..61037170 100644 --- a/include/gpg/GpgConstants.h +++ b/include/gpg/GpgConstants.h @@ -37,6 +37,7 @@ public: static const char *PGP_SIGNED_END; static const char *PGP_SIGNATURE_BEGIN; static const char *PGP_SIGNATURE_END; + static const char *GPG_FRONTEND_SHORT_CRYPTO_HEAD; }; #endif // CONSTANTS_H diff --git a/include/gpg/GpgContext.h b/include/gpg/GpgContext.h index fc4d8692..75949f25 100644 --- a/include/gpg/GpgContext.h +++ b/include/gpg/GpgContext.h @@ -25,11 +25,12 @@ #ifndef __SGPGMEPP_CONTEXT_H__ #define __SGPGMEPP_CONTEXT_H__ -#include <GpgFrontend.h> +#include "GpgFrontend.h" #include "GpgConstants.h" #include "GpgGenKeyInfo.h" #include "GpgKey.h" +#include "GpgInfo.h" using GpgKeyList = std::list<GpgKey>; @@ -63,10 +64,14 @@ public: namespace GpgME { + /** + * Custom Encapsulation of GpgME APIs + */ class GpgContext : public QObject { Q_OBJECT public: + GpgContext(); ~GpgContext() override; @@ -81,17 +86,18 @@ namespace GpgME { bool exportKeys(const QVector<GpgKey> &keys, QByteArray &outBuffer); - bool generateKey(GenKeyInfo *params); + gpgme_error_t generateKey(GenKeyInfo *params); - bool generateSubkey(const GpgKey &key, GenKeyInfo *params); + gpgme_error_t generateSubkey(const GpgKey &key, GenKeyInfo *params); void deleteKeys(QStringList *uidList); gpg_error_t encrypt(QVector<GpgKey> &keys, const QByteArray &inBuffer, QByteArray *outBuffer, gpgme_encrypt_result_t *result); - gpgme_error_t encryptSign(QVector<GpgKey> &keys, const QByteArray &inBuffer, QByteArray *outBuffer, - gpgme_encrypt_result_t *encr_result, gpgme_sign_result_t *sign_result); + gpgme_error_t encryptSign(QVector<GpgKey> &keys, QVector<GpgKey> &signers, const QByteArray &inBuffer, + QByteArray *outBuffer, gpgme_encrypt_result_t *encr_result, + gpgme_sign_result_t *sign_result); gpgme_error_t decrypt(const QByteArray &inBuffer, QByteArray *outBuffer, gpgme_decrypt_result_t *result); @@ -103,19 +109,20 @@ namespace GpgME { bool exportSecretKey(const GpgKey &key, QByteArray *outBuffer); - void getSigners(QVector<GpgKey> &signer); + void getSigners(QVector<GpgKey> &signer, gpgme_ctx_t ctx); - void setSigners(const QVector<GpgKey> &keys); + static void setSigners(const QVector<GpgKey> &keys, gpgme_ctx_t ctx); - bool signKey(const GpgKey &target, const QString &uid, const QDateTime *expires); + bool signKey(const GpgKey &target, const QVector<GpgKey> &keys, const QString &uid, + const QDateTime *expires); bool revSign(const GpgKey &key, const GpgKeySignature &signature); gpgme_error_t verify(QByteArray *inBuffer, QByteArray *sigBuffer, gpgme_verify_result_t *result); gpg_error_t - sign(const QVector<GpgKey> &keys, const QByteArray &inBuffer, QByteArray *outBuffer, bool detached = false, - gpgme_sign_result_t *result = nullptr); + sign(const QVector<GpgKey> &keys, const QByteArray &inBuffer, QByteArray *outBuffer, + gpgme_sig_mode_t mode, gpgme_sign_result_t *result = nullptr, bool default_ctx = true); bool addUID(const GpgKey &key, const GpgUID &uid); @@ -125,7 +132,7 @@ namespace GpgME { bool setExpire(const GpgKey &key, const GpgSubKey *subkey, QDateTime *expires); - QProcess * generateRevokeCert(const GpgKey &key, const QString &outputFileName); + void generateRevokeCert(const GpgKey &key, const QString &outputFileName); static bool checkIfKeyCanSign(const GpgKey &key); @@ -146,7 +153,7 @@ namespace GpgME { GpgKey getKeyByFpr(const QString &fpr); - const GpgKey &getKeyById(const QString &id); + GpgKey getKeyById(const QString &id); static QString gpgErrString(gpgme_error_t err); @@ -179,20 +186,25 @@ namespace GpgME { void slotUpdateKeyList(const QString &key_id); private: + + GpgInfo info; + gpgme_ctx_t mCtx{}; gpgme_data_t in{}; gpgme_error_t err; bool debug; bool good = true; - static gpgme_error_t readToBuffer(gpgme_data_t dataIn, QByteArray *outBuffer); - QByteArray mPasswordCache; QSettings settings; GpgKeyList mKeyList; QMap<QString, GpgKey *> mKeyMap; + gpgme_ctx_t create_ctx(); + + static gpgme_error_t readToBuffer(gpgme_data_t dataIn, QByteArray *outBuffer); + void fetch_keys(); static void checkErr(gpgme_error_t gpgmeError); @@ -207,12 +219,8 @@ namespace GpgME { const char *passphrase_info, int last_was_bad, int fd); - QProcess * executeGpgCommand(const QStringList &arguments, - QByteArray *stdOut, - QByteArray *stdErr, const std::function<void(QProcess *)> &interactFunc); + void executeGpgCommand(const QStringList &arguments, const std::function<void(QProcess *)> &interactFunc); - QString gpgExec; - QString gpgKeys; }; } // namespace GpgME diff --git a/src/ui/keygen/KeygenThread.cpp b/include/gpg/GpgInfo.h index d7b9d840..914491dd 100644 --- a/src/ui/keygen/KeygenThread.cpp +++ b/include/gpg/GpgInfo.h @@ -20,17 +20,24 @@ * The source code version of this software was modified and released * by Saturneric<[email protected]> starting on May 12, 2021. * +*/ + +#ifndef GPGFRONTEND_ZH_CN_TS_GPGINFO_H +#define GPGFRONTEND_ZH_CN_TS_GPGINFO_H + +#include "GpgFrontend.h" + +/** + * Use to record some info about gnupg */ +class GpgInfo { +public: -#include "ui/keygen/KeygenThread.h" + /** + * executable binary path of gnupg + */ + QString appPath; +}; -KeyGenThread::KeyGenThread(GenKeyInfo* keyGenParams, GpgME::GpgContext *ctx) -: mCtx(ctx), keyGenParams(keyGenParams), QThread(nullptr) { - connect(this, &KeyGenThread::finished, this, &KeyGenThread::deleteLater); -} -void KeyGenThread::run() { - bool success = mCtx->generateKey(keyGenParams); - emit signalKeyGenerated(success); - emit finished({}); -} +#endif //GPGFRONTEND_ZH_CN_TS_GPGINFO_H diff --git a/include/gpg/GpgKeySignature.h b/include/gpg/GpgKeySignature.h index 05a212a7..0dd2f893 100644 --- a/include/gpg/GpgKeySignature.h +++ b/include/gpg/GpgKeySignature.h @@ -54,9 +54,12 @@ struct GpgKeySignature { explicit GpgKeySignature(gpgme_key_sig_t key_sig); GpgKeySignature(GpgKeySignature &&) noexcept = default; + GpgKeySignature(const GpgKeySignature &) = default; - GpgKeySignature& operator=(GpgKeySignature &&) noexcept = default; - GpgKeySignature& operator=(const GpgKeySignature &) = default; + + GpgKeySignature &operator=(GpgKeySignature &&) noexcept = default; + + GpgKeySignature &operator=(const GpgKeySignature &) = default; }; diff --git a/include/gpg/GpgUID.h b/include/gpg/GpgUID.h index 99fe828f..6fb09446 100644 --- a/include/gpg/GpgUID.h +++ b/include/gpg/GpgUID.h @@ -28,7 +28,6 @@ #include <utility> #include "GpgFrontend.h" - #include "GpgKeySignature.h" struct GpgUID { @@ -41,9 +40,9 @@ struct GpgUID { QString uid{}; - bool revoked; + bool revoked{}; - bool invalid; + bool invalid{}; QVector<GpgKeySignature> signatures; diff --git a/include/gpg/result_analyse/DecryptResultAnalyse.h b/include/gpg/result_analyse/DecryptResultAnalyse.h index 6ec7d3be..b1d0c7b4 100644 --- a/include/gpg/result_analyse/DecryptResultAnalyse.h +++ b/include/gpg/result_analyse/DecryptResultAnalyse.h @@ -1,6 +1,26 @@ -// -// Created by eric on 2021/6/9. -// +/** + * This file is part of GPGFrontend. + * + * GPGFrontend 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 3 of the License, or + * (at your option) any later version. + * + * Foobar 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 Foobar. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from gpg4usb-team. + * Their source code version also complies with GNU General Public License. + * + * The source code version of this software was modified and released + * by Saturneric<[email protected]> starting on May 12, 2021. + * + */ #ifndef GPGFRONTEND_DECRYPTRESULTANALYSE_H #define GPGFRONTEND_DECRYPTRESULTANALYSE_H @@ -8,7 +28,8 @@ #include "gpg/GpgContext.h" #include "ResultAnalyse.h" -class DecryptResultAnalyse: public ResultAnalyse{ +class DecryptResultAnalyse : public ResultAnalyse { +Q_OBJECT public: explicit DecryptResultAnalyse(GpgME::GpgContext *ctx, gpgme_error_t error, gpgme_decrypt_result_t result); diff --git a/include/gpg/result_analyse/EncryptResultAnalyse.h b/include/gpg/result_analyse/EncryptResultAnalyse.h index 4717728b..447555c5 100644 --- a/include/gpg/result_analyse/EncryptResultAnalyse.h +++ b/include/gpg/result_analyse/EncryptResultAnalyse.h @@ -1,13 +1,34 @@ -// -// Created by eric on 2021/6/9. -// +/** + * This file is part of GPGFrontend. + * + * GPGFrontend 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 3 of the License, or + * (at your option) any later version. + * + * Foobar 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 Foobar. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from gpg4usb-team. + * Their source code version also complies with GNU General Public License. + * + * The source code version of this software was modified and released + * by Saturneric<[email protected]> starting on May 12, 2021. + * + */ #ifndef GPGFRONTEND_ENCRYPTRESULTANALYSE_H #define GPGFRONTEND_ENCRYPTRESULTANALYSE_H #include "ResultAnalyse.h" -class EncryptResultAnalyse : public ResultAnalyse{ +class EncryptResultAnalyse : public ResultAnalyse { +Q_OBJECT public: explicit EncryptResultAnalyse(gpgme_error_t error, gpgme_encrypt_result_t result); diff --git a/include/gpg/result_analyse/ResultAnalyse.h b/include/gpg/result_analyse/ResultAnalyse.h index debfb71a..da2e5676 100644 --- a/include/gpg/result_analyse/ResultAnalyse.h +++ b/include/gpg/result_analyse/ResultAnalyse.h @@ -1,13 +1,33 @@ -// -// Created by eric on 2021/6/8. -// - +/** + * This file is part of GPGFrontend. + * + * GPGFrontend 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 3 of the License, or + * (at your option) any later version. + * + * Foobar 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 Foobar. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from gpg4usb-team. + * Their source code version also complies with GNU General Public License. + * + * The source code version of this software was modified and released + * by Saturneric<[email protected]> starting on May 12, 2021. + * + */ #ifndef GPGFRONTEND_RESULTANALYSE_H #define GPGFRONTEND_RESULTANALYSE_H #include "GpgFrontend.h" -class ResultAnalyse { +class ResultAnalyse : public QObject { +Q_OBJECT public: ResultAnalyse() = default; diff --git a/include/gpg/result_analyse/SignResultAnalyse.h b/include/gpg/result_analyse/SignResultAnalyse.h index e837140d..ebb15dfb 100644 --- a/include/gpg/result_analyse/SignResultAnalyse.h +++ b/include/gpg/result_analyse/SignResultAnalyse.h @@ -1,6 +1,26 @@ -// -// Created by eric on 2021/6/8. -// +/** + * This file is part of GPGFrontend. + * + * GPGFrontend 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 3 of the License, or + * (at your option) any later version. + * + * Foobar 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 Foobar. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from gpg4usb-team. + * Their source code version also complies with GNU General Public License. + * + * The source code version of this software was modified and released + * by Saturneric<[email protected]> starting on May 12, 2021. + * + */ #ifndef GPGFRONTEND_SIGNRESULTANALYSE_H #define GPGFRONTEND_SIGNRESULTANALYSE_H @@ -8,10 +28,13 @@ #include "GpgFrontend.h" #include "ResultAnalyse.h" +#include "gpg/GpgContext.h" -class SignResultAnalyse : public ResultAnalyse{ +class SignResultAnalyse : public ResultAnalyse { +Q_OBJECT public: - explicit SignResultAnalyse(gpgme_error_t error, gpgme_sign_result_t result); + + explicit SignResultAnalyse(GpgME::GpgContext *ctx, gpgme_error_t error, gpgme_sign_result_t result); private: diff --git a/include/gpg/result_analyse/VerifyResultAnalyse.h b/include/gpg/result_analyse/VerifyResultAnalyse.h index 2041940b..c009741a 100644 --- a/include/gpg/result_analyse/VerifyResultAnalyse.h +++ b/include/gpg/result_analyse/VerifyResultAnalyse.h @@ -1,6 +1,26 @@ -// -// Created by eric on 2021/6/7. -// +/** + * This file is part of GPGFrontend. + * + * GPGFrontend 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 3 of the License, or + * (at your option) any later version. + * + * Foobar 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 Foobar. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from gpg4usb-team. + * Their source code version also complies with GNU General Public License. + * + * The source code version of this software was modified and released + * by Saturneric<[email protected]> starting on May 12, 2021. + * + */ #ifndef GPGFRONTEND_VERIFYRESULTANALYSE_H #define GPGFRONTEND_VERIFYRESULTANALYSE_H diff --git a/include/server/BaseAPI.h b/include/server/BaseAPI.h new file mode 100644 index 00000000..0b724bbc --- /dev/null +++ b/include/server/BaseAPI.h @@ -0,0 +1,73 @@ +/** + * This file is part of GPGFrontend. + * + * GPGFrontend 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 3 of the License, or + * (at your option) any later version. + * + * Foobar 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 Foobar. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from gpg4usb-team. + * Their source code version also complies with GNU General Public License. + * + * The source code version of this software was modified and released + * by Saturneric<[email protected]> starting on May 12, 2021. + * + */ + +#ifndef GPGFRONTEND_ZH_CN_TS_BASEAPI_H +#define GPGFRONTEND_ZH_CN_TS_BASEAPI_H + +#include "GpgFrontend.h" +#include "ComUtils.h" + +#include "rapidjson/document.h" + +class BaseAPI : public QObject { +Q_OBJECT +public: + + explicit BaseAPI(ComUtils::ServiceType serviceType); + + ~BaseAPI() override; + + void start(); + + void refresh(); + + [[nodiscard]] bool result() const; + +private: + + ComUtils *utils; + + QUrl reqUrl; + + QNetworkRequest request; + + QNetworkReply *send_json_data(); + +protected: + + bool good = false; + + rapidjson::Document document; + + const ComUtils &getUtils() { return *utils; }; + + virtual void construct_json() = 0; + + virtual void deal_reply() = 0; + + +}; + + +#endif //GPGFRONTEND_ZH_CN_TS_BASEAPI_H diff --git a/include/server/ComUtils.h b/include/server/ComUtils.h new file mode 100644 index 00000000..a4cf543f --- /dev/null +++ b/include/server/ComUtils.h @@ -0,0 +1,79 @@ +/** + * This file is part of GPGFrontend. + * + * GPGFrontend 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 3 of the License, or + * (at your option) any later version. + * + * Foobar 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 Foobar. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from gpg4usb-team. + * Their source code version also complies with GNU General Public License. + * + * The source code version of this software was modified and released + * by Saturneric<[email protected]> starting on May 12, 2021. + * + */ + +#ifndef GPGFRONTEND_ZH_CN_TS_COMUTILS_H +#define GPGFRONTEND_ZH_CN_TS_COMUTILS_H + +#include "GpgFrontend.h" +#include "gpg/GpgContext.h" +#include "rapidjson/document.h" + +class ComUtils : public QWidget { +Q_OBJECT +public: + + enum ServiceType { GetServiceToken, ShortenCryptText, GetFullCryptText, UploadPubkey, GetPubkey }; + + explicit ComUtils(QWidget *parent) : QWidget(parent), appPath(qApp->applicationDirPath()), + settings(RESOURCE_DIR(appPath) + "/conf/gpgfrontend.ini", + QSettings::IniFormat) { + + } + + [[nodiscard]] QString getUrl(ServiceType type) const; + + bool checkServerReply(const QByteArray &reply); + + [[nodiscard]] QString getDataValueStr(const QString &key) const; + + [[nodiscard]] bool checkDataValueStr(const QString &key) const; + + [[nodiscard]] const rapidjson::Value &getDataValue(const QString &key) const; + + [[nodiscard]] bool checkDataValue(const QString &key) const; + + [[nodiscard]] bool checkServiceTokenFormat(const QString& serviceToken) const; + + static QByteArray getSignStringBase64(GpgME::GpgContext *ctx, const QString &str, const GpgKey& key); + + [[nodiscard]] bool good() const { return is_good; } + + QNetworkAccessManager &getNetworkManager() {return networkMgr;} + + void clear(); + +private: + + QString appPath; + QSettings settings; + rapidjson::Document replyDoc; + rapidjson::Value dataVal; + QNetworkAccessManager networkMgr; + QRegularExpression re_uuid{R"(\b[0-9a-f]{8}\b-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-\b[0-9a-f]{12}\b)"}; + + bool is_good = false; +}; + + +#endif //GPGFRONTEND_ZH_CN_TS_COMUTILS_H diff --git a/include/ui/keygen/SubkeyGenerateThread.h b/include/server/api/PubkeyGetter.h index b442acea..9d3bdb60 100644 --- a/include/ui/keygen/SubkeyGenerateThread.h +++ b/include/server/api/PubkeyGetter.h @@ -18,34 +18,40 @@ * Their source code version also complies with GNU General Public License. * * The source code version of this software was modified and released - * by Saturneric<[email protected]><[email protected]> starting on May 12, 2021. + * by Saturneric<[email protected]> starting on May 12, 2021. * */ -#ifndef GPGFRONTEND_SUBKEYGENERATETHREAD_H -#define GPGFRONTEND_SUBKEYGENERATETHREAD_H +#ifndef GPGFRONTEND_ZH_CN_TS_PUBKEYGETTER_H +#define GPGFRONTEND_ZH_CN_TS_PUBKEYGETTER_H +#include "GpgFrontend.h" +#include "server/BaseAPI.h" #include "gpg/GpgContext.h" -class SubkeyGenerateThread : public QThread { - Q_OBJECT +class ComUtils; +/** + * Get and Import Pubkey from server + */ +class PubkeyGetter : public BaseAPI { public: - SubkeyGenerateThread(GpgKey key, GenKeyInfo *keyGenParams, GpgME::GpgContext *ctx); -signals: - - void signalKeyGenerated(bool success); + PubkeyGetter(GpgME::GpgContext *ctx, const QVector<QString> &fprs); private: - const GpgKey mKey; - GenKeyInfo *keyGenParams; + GpgME::GpgContext *mCtx; + const QVector<QString> &mFprs; + protected: - void run() override; + void construct_json() final; + + void deal_reply() final; + }; -#endif //GPGFRONTEND_SUBKEYGENERATETHREAD_H +#endif //GPGFRONTEND_ZH_CN_TS_PUBKEYGETTER_H diff --git a/include/server/api/PubkeyUploader.h b/include/server/api/PubkeyUploader.h new file mode 100644 index 00000000..7521cdd3 --- /dev/null +++ b/include/server/api/PubkeyUploader.h @@ -0,0 +1,58 @@ +/** + * This file is part of GPGFrontend. + * + * GPGFrontend 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 3 of the License, or + * (at your option) any later version. + * + * Foobar 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 Foobar. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from gpg4usb-team. + * Their source code version also complies with GNU General Public License. + * + * The source code version of this software was modified and released + * by Saturneric<[email protected]> starting on May 12, 2021. + * + */ + +#ifndef GPGFRONTEND_ZH_CN_TS_PUBKEYUPLOADER_H +#define GPGFRONTEND_ZH_CN_TS_PUBKEYUPLOADER_H + +#include "GpgFrontend.h" +#include "server/BaseAPI.h" +#include "gpg/GpgContext.h" + +#include "rapidjson/document.h" + +/** + * Upload pubkey into server + */ +class PubkeyUploader : public BaseAPI { +public: + + PubkeyUploader(GpgME::GpgContext *ctx, const QVector<GpgKey> &keys); + +private: + + const QVector<GpgKey> &mKeys; + + GpgME::GpgContext *mCtx; + +protected: + + void construct_json() final; + + void deal_reply() final; + + +}; + + +#endif //GPGFRONTEND_ZH_CN_TS_PUBKEYUPLOADER_H diff --git a/include/ui/FileEncryptionDialog.h b/include/ui/FileEncryptionDialog.h index f4adb18f..be9ddd22 100755 --- a/include/ui/FileEncryptionDialog.h +++ b/include/ui/FileEncryptionDialog.h @@ -102,14 +102,14 @@ public slots: void slotShowKeyList(); private: - QLineEdit *outputFileEdit; /**< TODO */ - QLineEdit *inputFileEdit; /**< TODO */ - QLineEdit *signFileEdit; /**< TODO */ - DialogAction mAction; /**< TODO */ - QLabel *statusLabel; /**< TODO */ + QLineEdit *outputFileEdit; + QLineEdit *inputFileEdit; + QLineEdit *signFileEdit; + DialogAction mAction; + QLabel *statusLabel; protected: - GpgME::GpgContext *mCtx; /**< TODO */ - KeyList *mKeyList; /**< TODO */ + GpgME::GpgContext *mCtx; + KeyList *mKeyList; }; diff --git a/include/ui/KeyImportDetailDialog.h b/include/ui/KeyImportDetailDialog.h index 0c6f5813..216cdcd0 100644 --- a/include/ui/KeyImportDetailDialog.h +++ b/include/ui/KeyImportDetailDialog.h @@ -27,7 +27,6 @@ #include "gpg/GpgContext.h" - class KeyImportDetailDialog : public QDialog { Q_OBJECT diff --git a/include/ui/KeyMgmt.h b/include/ui/KeyMgmt.h index 59592bdf..fa352149 100755 --- a/include/ui/KeyMgmt.h +++ b/include/ui/KeyMgmt.h @@ -26,7 +26,6 @@ #define __KEYMGMT_H__ #include "ui/widgets/KeyList.h" -#include "ui/keygen/KeygenThread.h" #include "ui/keypair_details/KeyDetailsDialog.h" #include "KeyImportDetailDialog.h" #include "KeyServerImportDialog.h" diff --git a/include/ui/SettingsDialog.h b/include/ui/SettingsDialog.h index 133a8ec7..72f80917 100755 --- a/include/ui/SettingsDialog.h +++ b/include/ui/SettingsDialog.h @@ -42,17 +42,19 @@ private: QString appPath; QSettings settings; - QCheckBox *rememberPasswordCheckBox; + QComboBox *serverSelectBox; QCheckBox *saveCheckedKeysCheckBox; QCheckBox *importConfirmationCheckBox; QComboBox *langSelectBox; QComboBox *ownKeySelectBox; + QPushButton *getServiceTokenButton; + QLabel *serviceTokenLabel; QHash<QString, QString> lang; QHash<QString, QString> keyIds; QVector<QString> keyIdsList; - QString ownKeyId; + QString serviceToken; KeyList *mKeyList; - GpgME::GpgContext *mCtx; /** The current gpg context */ + GpgME::GpgContext *mCtx; private slots: @@ -60,6 +62,8 @@ private slots: void slotLanguageChanged(); + void slotGetServiceToken(); + signals: void signalRestartNeeded(bool needed); @@ -151,14 +155,17 @@ private: QString appPath; QSettings settings; - QComboBox *comboBox; QLineEdit *newKeyServerEdit; + QTableWidget *keyServerTable; + QStringList keyServerStrList; private slots: void addKeyServer(); + void refreshTable(); + signals: void signalRestartNeeded(bool needed); @@ -181,6 +188,7 @@ private: QSettings settings; QCheckBox *steganoCheckBox; + QCheckBox *autoPubkeyExchangeCheckBox; signals: @@ -196,7 +204,7 @@ public: void applySettings(); private: - static QString getRelativePath(const QString& dir1, const QString& dir2); + static QString getRelativePath(const QString &dir1, const QString &dir2); QString appPath; QSettings settings; diff --git a/src/ui/keygen/SubkeyGenerateThread.cpp b/include/ui/ShowCopyDialog.h index 125f35f8..45b06e2d 100644 --- a/src/ui/keygen/SubkeyGenerateThread.cpp +++ b/include/ui/ShowCopyDialog.h @@ -18,19 +18,29 @@ * Their source code version also complies with GNU General Public License. * * The source code version of this software was modified and released - * by Saturneric<[email protected]><[email protected]> starting on May 12, 2021. + * by Saturneric<[email protected]> starting on May 12, 2021. * */ -#include "ui/keygen/SubkeyGenerateThread.h" +#ifndef GPGFRONTEND_ZH_CN_TS_SHOWCOPYDIALOG_H +#define GPGFRONTEND_ZH_CN_TS_SHOWCOPYDIALOG_H -SubkeyGenerateThread::SubkeyGenerateThread(GpgKey key, GenKeyInfo *keyGenParams, GpgME::GpgContext *ctx) - : mKey(std::move(key)), keyGenParams(keyGenParams) , mCtx(ctx) { - connect(this, &SubkeyGenerateThread::finished, this, &SubkeyGenerateThread::deleteLater); -} +#include "GpgFrontend.h" -void SubkeyGenerateThread::run() { - bool success = mCtx->generateSubkey(mKey, keyGenParams); - emit signalKeyGenerated(success); - emit finished({}); -} +class ShowCopyDialog : public QDialog { +Q_OBJECT +public: + explicit ShowCopyDialog(const QString &text, const QString &info = "", QWidget *parent = nullptr); + +private slots: + + void slotCopyText(); + +private: + QLabel *infoLabel; + QTextEdit *textEdit; + QPushButton *copyButton; +}; + + +#endif //GPGFRONTEND_ZH_CN_TS_SHOWCOPYDIALOG_H diff --git a/include/ui/Wizard.h b/include/ui/Wizard.h index b2451bf2..79c7e321 100644 --- a/include/ui/Wizard.h +++ b/include/ui/Wizard.h @@ -30,14 +30,6 @@ #include "gpg/GpgConstants.h" #include "SettingsDialog.h" -class QCheckBox; - -class QLabel; - -class QLineEdit; - -class QRadioButton; - class Wizard : public QWizard { Q_OBJECT Q_ENUMS(WizardPages) @@ -50,8 +42,6 @@ public: Wizard(GpgME::GpgContext *ctx, KeyMgmt *keyMgmt, QWidget *parent = nullptr); - static bool importPubAndSecKeysFromDir(const QString& dir, KeyMgmt *keyMgmt); - private: GpgME::GpgContext *mCtx; KeyMgmt *mKeyMgmt; @@ -102,62 +92,6 @@ private: int nextPage; }; -class ImportFromGpg4usbPage : public QWizardPage { -Q_OBJECT - -public: - ImportFromGpg4usbPage(GpgME::GpgContext *ctx, KeyMgmt *keyMgmt, QWidget *parent = nullptr); - -private slots: - - /** - * @details Import keys from gnupg-homedir, private or/and public depend on the checked boxes - */ - void slotImportFromOlderGpg4usb(); - - bool slotImportConfFromGpg4usb(const QString& dir); - -private: - [[nodiscard]] int nextId() const override; - - QString appPath; - QSettings settings; - - KeyMgmt *mKeyMgmt; - GpgME::GpgContext *mCtx; - QCheckBox *gpg4usbKeyCheckBox; - QCheckBox *gpg4usbConfigCheckBox; -}; - -class ImportFromGnupgPage : public QWizardPage { -Q_OBJECT - -public: - ImportFromGnupgPage(GpgME::GpgContext *ctx, KeyMgmt *keyMgmt, QWidget *parent = nullptr); - -private slots: - - /** - * @details Import keys from gnupg-homedir, private or/and public depend on the checked boxes - */ - void slotrImportKeysFromGnupg(); - -private: - KeyMgmt *mKeyMgmt; - - [[nodiscard]] int nextId() const override; - - /** - * @details String containing the gnupg-homedir - * @returns String containg the gnupg-homedir, but NULL, if the in windows registry entry - * doesn't exist or in linux ~/.gnupg doesn't exist - */ - static QString getGnuPGHome(); - - GpgME::GpgContext *mCtx; - QPushButton *importFromGnupgButton; -}; - class KeyGenPage : public QWizardPage { Q_OBJECT diff --git a/include/ui/help/AboutDialog.h b/include/ui/help/AboutDialog.h index 74391b5a..dee2c018 100644 --- a/include/ui/help/AboutDialog.h +++ b/include/ui/help/AboutDialog.h @@ -72,6 +72,12 @@ public: explicit UpdateTab(QWidget *parent = nullptr); void getLatestVersion(); + +private slots: + void processReplyDataFromUpdateServer(const QByteArray& data);; + +signals: + void replyFromUpdateServer(QByteArray data); }; /** @@ -83,6 +89,13 @@ Q_OBJECT public: explicit AboutDialog(int defaultIndex, QWidget *parent); + + +protected: + void showEvent(QShowEvent *ev) override; + +private: + UpdateTab *updateTab; }; #endif // __ABOUTDIALOG_H__ diff --git a/include/ui/help/VersionCheckThread.h b/include/ui/help/VersionCheckThread.h index 10c9da87..7ee90077 100644 --- a/include/ui/help/VersionCheckThread.h +++ b/include/ui/help/VersionCheckThread.h @@ -1,6 +1,26 @@ -// -// Created by Administrator on 2021/7/12. -// +/** + * This file is part of GPGFrontend. + * + * GPGFrontend 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 3 of the License, or + * (at your option) any later version. + * + * Foobar 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 Foobar. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from gpg4usb-team. + * Their source code version also complies with GNU General Public License. + * + * The source code version of this software was modified and released + * by Saturneric<[email protected]> starting on May 12, 2021. + * + */ #ifndef GPGFRONTEND_VERSIONCHECKTHREAD_H #define GPGFRONTEND_VERSIONCHECKTHREAD_H diff --git a/include/ui/keygen/KeygenDialog.h b/include/ui/keygen/KeygenDialog.h index a2718a1d..4a37590a 100644 --- a/include/ui/keygen/KeygenDialog.h +++ b/include/ui/keygen/KeygenDialog.h @@ -25,10 +25,8 @@ #ifndef __KEYGENDIALOG_H__ #define __KEYGENDIALOG_H__ -#include "KeygenThread.h" #include "gpg/GpgContext.h" - class KeyGenDialog : public QDialog { Q_OBJECT @@ -54,7 +52,6 @@ private: R"((?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\]))"}; GpgME::GpgContext *mCtx; /** The current gpg context */ - KeyGenThread *kg{}; /** Thread for key generation */ QStringList errorMessages; /** List of errors occuring when checking entries of lineedits */ GenKeyInfo genKeyInfo{}; @@ -107,8 +104,6 @@ private slots: void slotActivatedKeyType(int index); - void slotKeyGenResult(bool success); - }; #endif // __KEYGENDIALOG_H__ diff --git a/include/ui/keygen/SubkeyGenerateDialog.h b/include/ui/keygen/SubkeyGenerateDialog.h index b067122a..a1cfcf55 100644 --- a/include/ui/keygen/SubkeyGenerateDialog.h +++ b/include/ui/keygen/SubkeyGenerateDialog.h @@ -25,12 +25,7 @@ #ifndef GPGFRONTEND_SUBKEYGENERATEDIALOG_H #define GPGFRONTEND_SUBKEYGENERATEDIALOG_H -#include "GpgFrontend.h" -#include "gpg/GpgKey.h" -#include "gpg/GpgSubKey.h" -#include "gpg/GpgGenKeyInfo.h" - -#include "SubkeyGenerateThread.h" +#include "gpg/GpgContext.h" class SubkeyGenerateDialog : public QDialog { Q_OBJECT @@ -45,7 +40,6 @@ private: const GpgKey &mKey; GenKeyInfo genKeyInfo{}; - SubkeyGenerateThread *kg{}; /** Thread for key generation */ QGroupBox *keyUsageGroupBox{}; QDialogButtonBox *buttonBox; /** Box for standardbuttons */ @@ -91,8 +85,6 @@ private slots: void slotActivatedKeyType(int index); - void slotKeyGenResult(bool success); - }; diff --git a/include/ui/keypair_details/EditSubKeyDialog.h b/include/ui/keypair_details/EditSubKeyDialog.h index be926be7..6577d382 100644 --- a/include/ui/keypair_details/EditSubKeyDialog.h +++ b/include/ui/keypair_details/EditSubKeyDialog.h @@ -1,6 +1,26 @@ -// -// Created by eric on 2021/6/2. -// +/** + * This file is part of GPGFrontend. + * + * GPGFrontend 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 3 of the License, or + * (at your option) any later version. + * + * Foobar 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 Foobar. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from gpg4usb-team. + * Their source code version also complies with GNU General Public License. + * + * The source code version of this software was modified and released + * by Saturneric<[email protected]> starting on May 12, 2021. + * + */ #ifndef GPGFRONTEND_EDITSUBKEY_H #define GPGFRONTEND_EDITSUBKEY_H diff --git a/include/ui/widgets/InfoBoardWidget.h b/include/ui/widgets/InfoBoardWidget.h index 2e5f9034..334ef55a 100644 --- a/include/ui/widgets/InfoBoardWidget.h +++ b/include/ui/widgets/InfoBoardWidget.h @@ -111,6 +111,8 @@ private: QHBoxLayout *actionButtonLayout; + void deleteWidgetsInLayout(QLayout* layout, int start_index = 0); + }; diff --git a/include/ui/keygen/KeygenThread.h b/include/ui/widgets/SignersPicker.h index 30478050..afa95a05 100644 --- a/include/ui/keygen/KeygenThread.h +++ b/include/ui/widgets/SignersPicker.h @@ -22,29 +22,27 @@ * */ -#ifndef __KEYGENTHREAD_H__ -#define __KEYGENTHREAD_H__ +#ifndef GPGFRONTEND_ZH_CN_TS_SIGNERSPIRCKER_H +#define GPGFRONTEND_ZH_CN_TS_SIGNERSPIRCKER_H +#include "GpgFrontend.h" #include "gpg/GpgContext.h" -class KeyGenThread : public QThread { +#include "ui/widgets/KeyList.h" + +class SignersPicker : public QDialog { Q_OBJECT public: - KeyGenThread(GenKeyInfo *keyGenParams, GpgME::GpgContext *ctx); -signals: - void signalKeyGenerated(bool success); + explicit SignersPicker(GpgME::GpgContext *ctx, QWidget *parent = nullptr); + + void getCheckedSigners(QVector<GpgKey> &keys); private: - GenKeyInfo *keyGenParams; GpgME::GpgContext *mCtx; - QMutex mutex; - -protected: - - void run() override; - + KeyList *mKeyList; }; -#endif // __KEYGENTHREAD_H__ + +#endif //GPGFRONTEND_ZH_CN_TS_SIGNERSPIRCKER_H diff --git a/resource/conf/gpgfrontend.ini b/resource/conf/gpgfrontend.ini index 3fc1c1b8..f606531f 100644 --- a/resource/conf/gpgfrontend.ini +++ b/resource/conf/gpgfrontend.ini @@ -15,3 +15,39 @@ showWizard=true windowState=@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\x2\0\0\0\x1\0\0\x1\xcc\0\0\x2V\xfc\x2\0\0\0\x1\xfb\0\0\0\x16\0\x45\0n\0\x63\0r\0y\0p\0t\0\x44\0o\0\x63\0k\x1\0\0\0I\0\0\x2V\0\0\0]\0\xff\xff\xff\0\0\0\x3\0\0\x2\xe0\0\0\0\xf5\xfc\x1\0\0\0\x1\xfb\0\0\0\"\0I\0n\0\x66\0o\0r\0m\0\x61\0t\0i\0o\0n\0 \0\x42\0o\0\x61\0r\0\x64\x1\0\0\0\0\0\0\x2\xe0\0\0\x1\xe0\0\xff\xff\xff\0\0\x2\xe0\0\0\x1]\0\0\0\x4\0\0\0\x4\0\0\0\x1\0\0\0\x2\xfc\0\0\0\x1\0\0\0\x2\0\0\0\x5\0\0\0\x16\0\x66\0i\0l\0\x65\0T\0o\0o\0l\0\x42\0\x61\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\x18\0\x63\0r\0y\0p\0t\0T\0o\0o\0l\0\x42\0\x61\0r\x1\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\x14\0k\0\x65\0y\0T\0o\0o\0l\0\x42\0\x61\0r\x1\0\0\x1z\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\x16\0\x65\0\x64\0i\0t\0T\0o\0o\0l\0\x42\0\x61\0r\x1\0\0\x2\f\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0$\0s\0p\0\x65\0\x63\0i\0\x61\0l\0\x45\0\x64\0i\0t\0T\0o\0o\0l\0\x42\0\x61\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0) pos=@Point(100 100) size=@Size(1200 700) +windowSave=false + +[advanced] +steganography=false +autoPubkeyExchange=true + +[gpgpaths] +keydbpath=. + +[sendMail] +smtpAddress= +username= +password= +port=25 +connectionType=None +defaultSender= +enable=false + +[toolbar] +iconsize=@Size(24 24) +iconstyle=3 + +[%General] +currentGpgfrontendServer=service.gpgfrontend.pub +gpgfrontendServerList=service.gpgfrontend.pub, localhost +ownKeyId= +serviceToken= +confirmImportKeys=true + +[keymgmt] +pos=@Point(100 100) +size=@Size(900 600) +setWindowSize=true + +[informationBoard] +fontSize=10
\ No newline at end of file diff --git a/resource/css/default.qss b/resource/css/default.qss index e69de29b..9ecc4681 100644 --- a/resource/css/default.qss +++ b/resource/css/default.qss @@ -0,0 +1,1238 @@ +/*Copyright (c) DevSec Studio. All rights reserved. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +/*-----QDialog-----*/ +QDialog::title { + height: 24px; + font-weight: bold; + color: #000000; + background: #ffffff; +} + +/*-----QWidget-----*/ +QWidget +{ + background-color: #D3E0EA; + color: #1687A7; + selection-background-color: #D3E0EA; + selection-color: #276678; + +} + + +/*-----QLabel-----*/ +QLabel +{ + background-color: transparent; + color: #276678; + +} + + +/*-----QMenuBar-----*/ +QMenuBar +{ + background-color: #1687A7; + color: #D3E0EA; +} + + +QMenuBar::item +{ + background-color: #1687A7; + border-left: 1px solid #276678; + padding: 5px; + padding-left: 10px; + padding-right: 10px; + +} + + +QMenuBar::item:selected +{ + background-color: #1687A7; + border: 1px solid #276678; + color: #fff; + +} + + +QMenuBar::item:pressed +{ + background-color: #006666; + border: 1px solid #006666; + color: #fff; + +} + + +/*-----QMenu-----*/ +QMenu +{ + background-color: #1687A7; + border: 1px solid #276678; + padding: 8px; + color: #D3E0EA; +} + + +QMenu::item +{ + background-color: transparent; + padding: 2px 8px 2px 8px; + min-width: 120px; + +} + + +QMenu::separator +{ + background-color: #D3E0EA; + height: 1px; +} + + +QMenu::item:disabled +{ + color: #555; + background-color: transparent; + padding: 2px 8px 2px 8px; + +} + + +QMenu::item:selected +{ + background-color: #D3E0EA; + border: 1px solid #D3E0EA; + color: #fff; +} + + +/*-----QToolButton-----*/ +QToolButton +{ + background-color: #D3E0EA; + color: #1687A7; + padding: 3px; + margin-left: 1px; +} + + +QToolButton:hover +{ + background-color: rgba(70,162,218,50%); + border: 1px solid #1687A7; + color: #000; + +} + + +QToolButton:pressed +{ + background-color: #1687A7; + border: 1px solid #276678; + color: #F6F5F5; +} + + +QToolButton:checked +{ + background-color: #1687A7; + border: 1px solid #276678; + color: #F6F5F5; +} + + +/*-----QPushButton-----*/ +QPushButton +{ + background-color: #1687A7; + color: #F6F5F5; + min-width: 80px; + border-radius: 4px; + padding: 5px; + +} + + +QPushButton::flat +{ + background-color: transparent; + border: none; + color: #000; + +} + + +QPushButton::disabled +{ + background-color: #F6F5F5; + color: #A9A9A9; + border-color: #1687A7; + border-radius: 4px; + padding: 5px; +} + + +QPushButton::hover +{ + background-color: #54aad3; + border: 1px solid #46a2da; + +} + + +QPushButton::pressed +{ + background-color: #2385b4; + border: 1px solid #46a2da; + +} + + +QPushButton::checked +{ + background-color: #bd5355; + border: 1px solid #bd5355; +} + + +/*-----QLineEdit-----*/ +QLineEdit +{ + background-color: #F6F5F5; + color : #276678; + border: 1px solid #1d1d1d; + padding-left: 6px; + height: 20px; + border-radius: 4px; + +} + +QLineEdit::disabled +{ + background-color: #D3D3D3; + color : #276678; + border: 1px solid #1d1d1d; + padding-left: 6px; + height: 20px; + border-radius: 4px; + +} + + +/*-----QPlainTExtEdit-----*/ +QPlainTextEdit +{ + background-color: #F6F5F5; + color : #F6F5F5; + border: 1px solid #276678; + padding: 3px; + padding-left: 5px; + border-radius: 4px; + +} + + +/*-----QToolBox-----*/ +QToolBox +{ + background-color: transparent; + border: 1px solid #D3E0EA; + +} + + +QToolBox::tab +{ + background-color: #D3E0EA; + border: 1px solid #D3E0EA; + +} + + +QToolBox::tab:hover +{ + background-color: #D3E0EA; + border: 1px solid #1d1d1d; + +} + + +/*-----QComboBox-----*/ +QComboBox +{ + background-color: #1687A7; + padding-left: 6px; + color: #fff; + height: 20px; + border-radius: 4px; +} + + +QComboBox::disabled +{ + background-color: #D3D3D3; + color: #656565; + border-color: #051a39; + +} + + +QComboBox:on +{ + background-color: #1687A7; + color: #fff; + +} + + +QComboBox QAbstractItemView +{ + background-color: #1687A7; + color: #fff; + selection-background-color: #002b2b; + selection-color: #fff; + outline: 0; + +} + + +QComboBox::drop-down +{ + background-color: #276678; + subcontrol-origin: padding; + subcontrol-position: top right; + border-radius: 4px; + width: 15px; + +} + + +QComboBox::down-arrow +{ + image: url("./icons/down.png"); + width: 7px; + height: 7px; + +} + +/*-----QSpinBox-----*/ +QSpinBox +{ + background-color: #1687A7; + color : #F6F5F5; + padding-left: 6px; + height: 20px; + border-radius: 4px; +} + +QSpinBox::disabled +{ + background-color: #D3D3D3; + color: #656565; + border-color: #051a39; + +} + +QSpinBox::up-button +{ + background-color: #276678; + width: 16px; + border-top-right-radius: 4px; + border-width: 1px; + border-color: #1d1d1d; + +} + +QSpinBox::up-button:hover +{ + background-color: #585858; + +} + +QSpinBox::up-button:pressed +{ + background-color: #252525; + width: 16px; + border-width: 1px; + +} + +QSpinBox::up-arrow +{ + image: url("./icons/up-arrow.png"); + width: 7px; + height: 7px; + +} + +QSpinBox::down-button +{ + background-color: #276678; + width: 16px; + border-width: 1px; + border-bottom-right-radius: 4px; + border-color: #1d1d1d; + +} + +QSpinBox::down-button:hover +{ + background-color: #585858; + +} + +QSpinBox::down-button:pressed +{ + background-color: #252525; + width: 16px; + border-width: 1px; + +} + +QSpinBox::down-button:pressed +{ + background-color: #252525; + width: 16px; + border-width: 1px; + +} + +QSpinBox::down-arrow +{ + image: url("./icons/down.png"); + width: 7px; + height: 7px; + +} + +/*-----QDateTimeEdit-----*/ +QDateTimeEdit +{ + background-color: #1687A7; + color : #F6F5F5; + padding-left: 6px; + height: 20px; + border-radius: 4px; +} + +QDateTimeEdit::up-button +{ + background-color: #276678; + width: 16px; + border-top-right-radius: 4px; + border-width: 1px; + border-color: #1d1d1d; + +} + +QDateTimeEdit::up-button:hover +{ + background-color: #585858; + +} + +QDateTimeEdit::up-button:pressed +{ + background-color: #252525; + width: 16px; + border-width: 1px; + +} + +QDateTimeEdit::up-arrow +{ + image: url("./icons/up-arrow.png"); + width: 7px; + height: 7px; + +} + +QDateTimeEdit::down-button +{ + background-color: #276678; + width: 16px; + border-width: 1px; + border-bottom-right-radius: 4px; + border-color: #1d1d1d; + +} + +QDateTimeEdit::down-button:hover +{ + background-color: #585858; + +} + +QDateTimeEdit::down-button:pressed +{ + background-color: #252525; + width: 16px; + border-width: 1px; + +} + +QDateTimeEdit::down-button:pressed +{ + background-color: #252525; + width: 16px; + border-width: 1px; + +} + +QDateTimeEdit::down-arrow +{ + image: url("./icons/down.png"); + width: 7px; + height: 7px; + +} + +/*-----QDoubleSpinBox & QCalendarWidget-----*/ +QCalendarWidget +{ + background-color: #1687A7; + color : #fff; + border: 1px solid #1d1d1d; + border-radius: 4px; + padding: 3px; + padding-left: 5px; + +} + + +QCalendarWidget::up-button +{ + background-color: #4a5157; + width: 16px; + border-top-right-radius: 4px; + border-width: 1px; + border-color: #D3E0EA; + +} + + +QCalendarWidget::up-button:hover +{ + background-color: #276678; +} + + +QCalendarWidget::up-button:pressed +{ + background-color: #276678; + width: 16px; + border-width: 1px; + +} + + +QCalendarWidget::up-arrow +{ + image: url("./icons/up-arrow.png"); + width: 7px; + height: 7px; + +} + + +QCalendarWidget::down-button +{ + background-color: #276678; + width: 16px; + border-width: 1px; + border-bottom-right-radius: 4px; + border-color: #1d1d1d; + +} + + +QCalendarWidget::down-button:hover +{ + background-color: #276678; + +} + + +QCalendarWidget::down-button:pressed +{ + background-color: #276678; + width: 16px; + border-width: 1px; + +} + + +QCalendarWidget::down-arrow +{ + image: url("./icons/down.png"); + width: 7px; + height: 7px; + +} + + +/*-----QGroupBox-----*/ +QGroupBox +{ + border: 1px solid #276678; + border-color: #276678; + border-radius: 4px; + margin-top: 25px; +} + + +QGroupBox::title +{ + background-color: #D3E0EA; + border: 1px solid #276678; + color: #276678; + subcontrol-position: top left; + subcontrol-origin: margin; + padding: 3px; + min-width: 16px; +} + + +/*-----QHeaderView-----*/ +QHeaderView::section +{ + background-color: #4a5157; + border: none; + color: #fff; + padding: 4px; + +} + + +QHeaderView::section:disabled +{ + background-color: #525251; + color: #656565; + +} + + +QHeaderView::section:checked +{ + background-color: qlineargradient(spread:repeat, x1:1, y1:0, x2:1, y2:1, stop:0 rgba(227, 227, 227, 255),stop:1 rgba(187, 187, 187, 255)); + color: #000; + +} + + +QHeaderView::section::vertical::first, +QHeaderView::section::vertical::only-one +{ + border-left: 1px solid #003333; + +} + + +QHeaderView::section::vertical +{ + border-left: 1px solid #003333; +} + + +QHeaderView::section::horizontal::first, +QHeaderView::section::horizontal::only-one +{ + border-left: 1px solid #003333; + +} + + +QHeaderView::section::horizontal +{ + border-left: 1px solid #003333; + +} + + +QTableCornerButton::section +{ + background-color: qlineargradient(spread:repeat, x1:1, y1:0, x2:1, y2:1, stop:0 rgba(227, 227, 227, 255),stop:1 rgba(187, 187, 187, 255)); + border: 1px solid #000; + color: #fff; + +} + +/*-----QTabWidget-----*/ + +QTabWidget::pane { /* The tab widget frame */ + border-top: 1px solid #1687A7; + padding: 8px; +} + +QTabWidget::tab-bar { + alignment: center; +} + +/* Style the tab using the tab sub-control. Note that + it reads QTabBar _not_ QTabWidget */ +QTabBar::tab { + background-color: #D3E0EA; + color: #fff; + padding: 5px; + min-width: 64px; + border: 1px solid #276678; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: none; +} + +QTabBar::tab:selected, QTabBar::tab:hover { + background-color: #1687A7; +} + +QTabBar::tab:selected { + border-color: #9B9B9B; + border-bottom-color: #C2C7CB; /* same as pane color */ +} + +QTabBar::tab:!selected { + margin-top: 2px; /* make non-selected tabs look smaller */ +} + +/*-----QTextEdit-----*/ +QTextEdit { + color: #276678; + background-color: #F6F5F5; +} + +/*-----QTableView-----*/ +QTableWidget{ + color:#1687A7; + background:#F6F5F5; + border:1px solid #242424; + alternate-background-color:#D3E0EA;/*交错颜色*/ + gridline-color:#242424; +} + +QTableWidget::item:selected{ + color:#F6F5F5; + background:qlineargradient(spread:pad,x1:0,y1:0,x2:0,y2:1,stop:0 #1687A7,stop:1 #1687A7); +} + +QTableWidget::item:hover{ + color:#F6F5F5; + background:#1687A7; +} + + +QHeaderView::section +{ + text-align:center; + background:#276678; + padding:3px; + margin:0px; + color:#F6F5F5; + border:1px solid #276678; + border-left-width:0; +} + +QHeaderView::section:checked +{ + background:#276678; + padding:3px; + margin:0px; + color:#F6F5F5; + border:1px solid #276678; + border-left-width:0; +} + +/*表右侧的滑条*/ +QScrollBar:vertical{ + background:#276678; + padding:0px; + border-radius:6px; + max-width:12px; +} + +/*滑块*/ +QScrollBar::handle:horizontal{ + background:#276678; +} + +/*滑块*/ +QScrollBar::handle:vertical{ + background:#276678; +} + +/*滑块悬浮,按下*/ +QScrollBar::handle:hover:vertical,QScrollBar::handle:pressed:vertical{ + background:#1687A7; +} +/* +滑块已经划过的区域*/ +QScrollBar::sub-page:vertical{ + background:444444; +} + +/* +滑块还没有划过的区域*/ +QScrollBar::add-page:vertical{ + background:5B5B5B; +} + +/*页面下移的按钮*/ +QScrollBar::add-line:vertical{ + background:none; +} +/*页面上移的按钮*/ +QScrollBar::sub-line:vertical{ + background:none; +} + +/*-----QTreeWidget-----*/ +QTreeView +{ + show-decoration-selected: 0; + alternate-background-color: transparent; + background-color: #D3E0EA; + border: none; + color: #1687A7; + font: 8pt; + +} + + +QTreeView::item:selected +{ + color:#fff; + background-color: #1687A7; + border-radius: 0px; + +} + + +QTreeView::item:!selected:hover +{ + background-color: #1687A7; + border: none; + color: white; + +} + + +QTreeView::branch:has-children:!has-siblings:closed, +QTreeView::branch:closed:has-children:has-siblings +{ + image: url(://tree-closed.png); + +} + + +QTreeView::branch:open:has-children:!has-siblings, +QTreeView::branch:open:has-children:has-siblings +{ + image: url(://tree-open.png); + +} + + +/*-----QListView-----*/ +QListView +{ + background-color: transparent; + alternate-background-color: transparent; + border : none; + color: #fff; + show-decoration-selected: 1; + outline: 0; + border: 1px solid #1d1d1d; + +} + + +QListView::disabled +{ + background-color: #656565; + color: #1b1b1b; + border: 1px solid #656565; + +} + + +QListView::item +{ + background-color: transparent; + padding: 1px; + +} + + +QListView::item:selected +{ + background-color: #002b2b; + border: 1px solid #002b2b; + color: #fff; + +} + + +QListView::item:selected:!active +{ + background-color: #002b2b; + border: 1px solid #002b2b; + color: #fff; + +} + + +QListView::item:selected:active +{ + background-color: #002b2b; + border: 1px solid #002b2b; + color: #fff; + +} + + +QListView::item:hover { + background-color: #5e5e5e; + border: none; + color: #000; + +} + + +/*-----QCheckBox-----*/ +QCheckBox +{ + background-color: transparent; + color: #276678; + border: none; + +} + + +QCheckBox::indicator +{ + background-color: lightgray; + border: 1px solid #000; + width: 12px; + height: 12px; + +} + + +QCheckBox::indicator:checked +{ + image:url("./icons/check.png"); + background-color: #1687A7; + border: 1px solid #3a546e; + +} + + +QCheckBox::indicator:unchecked:hover +{ + border: 1px solid #D3E0EA; + +} + + +QCheckBox::disabled +{ + color: #656565; + +} + + +QCheckBox::indicator:disabled +{ + background-color: #656565; + color: #656565; + border: 1px solid #656565; + +} + + +/*-----QRadioButton-----*/ +QRadioButton +{ + color: #fff; + background-color: transparent; + +} + + +QRadioButton::indicator::unchecked:hover +{ + background-color: #d3d3d3; + border: 2px solid #002b2b; + border-radius: 6px; +} + + +QRadioButton::indicator::checked +{ + border: 2px solid #52beff; + border-radius: 6px; + background-color: #002b2b; + width: 9px; + height: 9px; + +} + + +/*-----QScrollBar-----*/ +QScrollBar:vertical +{ + border: none; + width: 12px; + +} + + +QScrollBar::handle:vertical +{ + border: none; + border-radius : 0px; + background-color: #7a7a7a; + min-height: 80px; + width : 12px; + +} + + +QScrollBar::handle:vertical:pressed +{ + background-color: #5d5f60; + +} + + +QScrollBar::add-line:vertical +{ + border: none; + background: transparent; + height: 0px; + subcontrol-position: bottom; + subcontrol-origin: margin; + +} + + +QScrollBar::add-line:vertical:hover +{ + background-color: transparent; + +} + + +QScrollBar::add-line:vertical:pressed +{ + background-color: #3f3f3f; + +} + + +QScrollBar::sub-line:vertical +{ + border: none; + background: transparent; + height: 0px; + +} + + +QScrollBar::sub-line:vertical:hover +{ + background-color: transparent; + +} + + +QScrollBar::sub-line:vertical:pressed +{ + background-color: #3f3f3f; + +} + + +QScrollBar::up-arrow:vertical +{ + width: 0px; + height: 0px; + background: transparent; + +} + + +QScrollBar::down-arrow:vertical +{ + width: 0px; + height: 0px; + background: transparent; + +} + + +QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical +{ + background-color: #222222; + +} + + +QScrollBar:horizontal +{ + border: none; + height: 12px; + +} + + +QScrollBar::handle:horizontal +{ + border: none; + border-radius : 0px; + background-color: #7a7a7a; + min-height: 80px; + height : 12px; + +} + + +QScrollBar::handle:horizontal:pressed +{ + background-color: #5d5f60; + +} + + +QScrollBar::add-line:horizontal +{ + border: none; + background: transparent; + height: 0px; + subcontrol-position: bottom; + subcontrol-origin: margin; + +} + + +QScrollBar::add-line:horizontal:hover +{ + background-color: transparent; + +} + + +QScrollBar::add-line:horizontal:pressed +{ + background-color: #3f3f3f; + +} + + +QScrollBar::sub-line:horizontal +{ + border: none; + background: transparent; + height: 0px; + +} + + +QScrollBar::sub-line:horizontal:hover +{ + background-color: transparent; + +} + + +QScrollBar::sub-line:horizontal:pressed +{ + background-color: #3f3f3f; + +} + + +QScrollBar::up-arrow:horizontal +{ + width: 0px; + height: 0px; + background: transparent; + +} + + +QScrollBar::down-arrow:horizontal +{ + width: 0px; + height: 0px; + background: transparent; + +} + + +QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal +{ + background-color: #222222; + +} + + +/*-----QProgressBar-----*/ +QProgressBar +{ + border: 1px solid #1d1d1d; + text-align: center; + border-radius: 10px; + color: #fff; + font-weight: bold; + +} + + +QProgressBar::chunk +{ + background-color: #3b86ae; + border-radius: 9px; + margin: 0.5px; + +} + + +/*-----QStatusBar-----*/ +QStatusBar +{ + background-color: #4a5157; + color: #ffffff; + border-color: #051a39; + +} + + +/*-----QSizeGrip-----*/ +QSizeGrip +{ + background-color: image("./ressources/sizegrip.png"); /*To replace*/ + border: none; + +}
\ No newline at end of file diff --git a/resource/icons/check.png b/resource/icons/check.png Binary files differnew file mode 100644 index 00000000..e793ced2 --- /dev/null +++ b/resource/icons/check.png diff --git a/resource/icons/down.png b/resource/icons/down.png Binary files differnew file mode 100644 index 00000000..e3531e0f --- /dev/null +++ b/resource/icons/down.png diff --git a/resource/icons/up-arrow.png b/resource/icons/up-arrow.png Binary files differnew file mode 100644 index 00000000..12451e50 --- /dev/null +++ b/resource/icons/up-arrow.png diff --git a/resource/ts/gpgfrontend_en_us.ts b/resource/ts/gpgfrontend_en_us.ts index 0042e061..9adfc9a4 100644 --- a/resource/ts/gpgfrontend_en_us.ts +++ b/resource/ts/gpgfrontend_en_us.ts @@ -27,75 +27,85 @@ <context> <name>AdvancedTab</name> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="679"/> - <source>Show Steganography Options [Advanced]</source> + <location filename="../../src/ui/settings/SettingsAdvanced.cpp" line="34"/> + <source>Show Steganography Options</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="681"/> + <location filename="../../src/ui/settings/SettingsAdvanced.cpp" line="36"/> <source>Show Steganographic Options.</source> <translation type="unfinished"></translation> </message> + <message> + <location filename="../../src/ui/settings/SettingsAdvanced.cpp" line="40"/> + <source>Pubkey Exchange</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/settings/SettingsAdvanced.cpp" line="42"/> + <source>Auto Pubkey Exchange</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>AppearanceTab</name> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="444"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="34"/> <source>Iconsize</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="446"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="36"/> <source>small</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="447"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="37"/> <source>medium</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="448"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="38"/> <source>large</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="464"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="54"/> <source>Iconstyle</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="466"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="56"/> <source>just text</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="467"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="57"/> <source>just icons</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="468"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="58"/> <source>text and icons</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="484"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="74"/> <source>Windowstate</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="487"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="77"/> <source>Save window size and position on exit.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="495"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="85"/> <source>Information Board</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="501"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="91"/> <source> Front Size</source> <translation type="unfinished"></translation> </message> @@ -103,101 +113,202 @@ <context> <name>ChoosePage</name> <message> - <location filename="../../src/ui/Wizard.cpp" line="165"/> + <location filename="../../src/ui/Wizard.cpp" line="121"/> <source>Choose your action...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="166"/> + <location filename="../../src/ui/Wizard.cpp" line="122"/> <source>...by clicking on the appropriate link.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="168"/> + <location filename="../../src/ui/Wizard.cpp" line="124"/> <source>If you have never used GPGFrontend before and also don't own a gpg key yet you may possibly want to read how to</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="170"/> + <location filename="../../src/ui/Wizard.cpp" line="127"/> <source>Generate Key</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="176"/> + <location filename="../../src/ui/Wizard.cpp" line="134"/> <source>If you want to learn how to encrypt, decrypt, sign and verify text, you can read </source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="178"/> + <location filename="../../src/ui/Wizard.cpp" line="136"/> <source>Encrypt & Decrypt Text</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="178"/> - <location filename="../../src/ui/Wizard.cpp" line="190"/> + <location filename="../../src/ui/Wizard.cpp" line="136"/> + <location filename="../../src/ui/Wizard.cpp" line="149"/> <source>or</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="180"/> + <location filename="../../src/ui/Wizard.cpp" line="138"/> <source>Sign & Verify Text</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="188"/> + <location filename="../../src/ui/Wizard.cpp" line="146"/> <source>If you want to operate file, you can read </source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="190"/> + <location filename="../../src/ui/Wizard.cpp" line="149"/> <source>Encrypt & Sign File</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="192"/> + <location filename="../../src/ui/Wizard.cpp" line="152"/> <source>Sign & Verify File</source> <translation type="unfinished"></translation> </message> </context> <context> + <name>ComUtils</name> + <message> + <location filename="../../src/server/ComUtils.cpp" line="35"/> + <location filename="../../src/server/ComUtils.cpp" line="55"/> + <source>Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/ComUtils.cpp" line="35"/> + <source>Nothing Reply. Please check the Internet connection.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/ComUtils.cpp" line="55"/> + <source>Unknown Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/ComUtils.cpp" line="75"/> + <location filename="../../src/server/ComUtils.cpp" line="90"/> + <source>Network Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/ComUtils.cpp" line="75"/> + <source>Outdated Reply</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/ComUtils.cpp" line="87"/> + <source>Unknown Reason</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/ComUtils.cpp" line="90"/> + <source>Unknown Reply Format</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>ConclusionPage</name> <message> - <location filename="../../src/ui/Wizard.cpp" line="407"/> + <location filename="../../src/ui/Wizard.cpp" line="224"/> <source>Ready.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="408"/> + <location filename="../../src/ui/Wizard.cpp" line="225"/> <source>Have fun with GPGFrontend!</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="410"/> + <location filename="../../src/ui/Wizard.cpp" line="227"/> <source>You are ready to use GPGFrontend now.<br><br></source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="412"/> + <location filename="../../src/ui/Wizard.cpp" line="229"/> <source>The Online Document</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="413"/> + <location filename="../../src/ui/Wizard.cpp" line="231"/> <source> will get you started with GPGFrontend. It will open in the main window.<br></source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="420"/> + <location filename="../../src/ui/Wizard.cpp" line="238"/> <source>Open offline help.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="423"/> + <location filename="../../src/ui/Wizard.cpp" line="241"/> <source>Dont show the wizard again.</source> <translation type="unfinished"></translation> </message> </context> <context> + <name>DecryptResultAnalyse</name> + <message> + <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="30"/> + <source>[#] Decrypt Operation </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="33"/> + <source>[Success]</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="35"/> + <source>[Failed] </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="39"/> + <source>Unsupported Algo: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="46"/> + <source>File Name: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="52"/> + <source>Recipient(s): </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="82"/> + <source> Keu ID: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="83"/> + <source> Public Algo: </source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>EncryptResultAnalyse</name> + <message> + <location filename="../../src/gpg/result_analyse/EncryptResultAnalyse.cpp" line="41"/> + <source>Invalid Recipients: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/EncryptResultAnalyse.cpp" line="44"/> + <source>Fingerprint: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/EncryptResultAnalyse.cpp" line="45"/> + <source>Reason: </source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>FileEncryptionDialog</name> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="32"/> @@ -360,195 +471,172 @@ <context> <name>GeneralTab</name> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="137"/> - <source>Remember Password</source> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="40"/> + <source>GpgFrontend Server</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="140"/> - <source>Remember password until closing gpg4usb</source> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="45"/> + <source>Server that provides short key and key exchange services</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="147"/> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="52"/> <source>Save Checked Keys</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="150"/> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="55"/> <source>Save checked private keys on exit and restore them on next start.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="159"/> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="64"/> <source>Confirm drag'n'drop key import</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="162"/> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="67"/> <source>Import files dropped on the keylist without confirmation.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="169"/> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="74"/> <source>Language</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="178"/> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="83"/> <source><b>NOTE: </b> GpgFrontend will restart automatically if you change the language!</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="187"/> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="92"/> <source>Own key</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="195"/> - <source><none></source> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="96"/> + <source>Get Service Token</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="209"/> - <source>Key pair for synchronization and identity authentication</source> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="97"/> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="234"/> + <source>No Service Token Found</source> <translation type="unfinished"></translation> </message> -</context> -<context> - <name>GpgME::GpgContext</name> <message> - <location filename="../../src/gpg/GpgContext.cpp" line="528"/> - <source>Wrong password</source> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="103"/> + <source><none></source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/GpgContext.cpp" line="536"/> - <source>Enter Password for</source> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="120"/> + <source>Key pair for synchronization and identity authentication</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/GpgContext.cpp" line="540"/> - <source>Enter Password</source> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="252"/> + <source>Invalid Operation</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/GpgContext.cpp" line="706"/> - <source>Key Selection</source> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="253"/> + <source>Own Key can not be None while getting service token.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/GpgContext.cpp" line="706"/> - <source>No Private Key Selected</source> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="265"/> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="336"/> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="353"/> + <source>Error</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/GpgContext.cpp" line="746"/> - <source>Error in signing:</source> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="266"/> + <source>Key Not Exists</source> <translation type="unfinished"></translation> </message> -</context> -<context> - <name>GpgPathsTab</name> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="711"/> - <source>Relative path to keydb</source> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="337"/> + <source>The communication content with the server does not meet the requirements</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="724"/> - <source>Current keydb path: </source> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="350"/> + <source>Notice</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="729"/> - <source><b>NOTE: </b> Gpg4usb will restart automatically if you change the keydb path!</source> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="351"/> + <source>Succeed in getting service token</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="758"/> - <source>Choose keydb directory</source> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="353"/> + <source>There is a problem with the communication with the server</source> <translation type="unfinished"></translation> </message> </context> <context> - <name>ImportFromGnupgPage</name> - <message> - <location filename="../../src/ui/Wizard.cpp" line="302"/> - <source>Import keys...</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../../src/ui/Wizard.cpp" line="303"/> - <source>...from existing GnuPG installation</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../../src/ui/Wizard.cpp" line="305"/> - <source>You can import keys from a locally installed GnuPG.<br><br> The location is read from registry in Windows or assumed to be the .gnupg folder in the your home directory in Linux.<br></source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../../src/ui/Wizard.cpp" line="309"/> - <source>Import keys from GnuPG</source> - <translation type="unfinished"></translation> - </message> + <name>GpgME::GpgContext</name> <message> - <location filename="../../src/ui/Wizard.cpp" line="323"/> - <source>Import Error</source> + <location filename="../../src/gpg/gpg_context/GpgContext.cpp" line="184"/> + <source>Wrong password</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="323"/> - <source>Couldn't locate GnuPG home directory</source> + <location filename="../../src/gpg/gpg_context/GpgContext.cpp" line="192"/> + <source>Enter Password for</source> <translation type="unfinished"></translation> </message> -</context> -<context> - <name>ImportFromGpg4usbPage</name> <message> - <location filename="../../src/ui/Wizard.cpp" line="225"/> - <source>Import from...</source> + <location filename="../../src/gpg/gpg_context/GpgContext.cpp" line="196"/> + <source>Enter Password</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="226"/> - <source>...existing GPGFrontend</source> + <location filename="../../src/gpg/gpg_context/GpgContext.cpp" line="258"/> + <source>Processing</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="228"/> - <source>You can import keys and/or settings from existing GPGFrontend. <br><br>Just check what you want to import, click the import button and choose the directory of your other GPGFrontend in the appearing file dialog.</source> + <location filename="../../src/gpg/gpg_context/GpgContextBasicOpera.cpp" line="164"/> + <source>Key Selection</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="235"/> - <source>Keys</source> + <location filename="../../src/gpg/gpg_context/GpgContextBasicOpera.cpp" line="164"/> + <source>No Private Key Selected</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="239"/> - <source>Configuration</source> + <location filename="../../src/gpg/gpg_context/GpgContextBasicOpera.cpp" line="195"/> + <source>Error in signing:</source> <translation type="unfinished"></translation> </message> +</context> +<context> + <name>GpgPathsTab</name> <message> - <location filename="../../src/ui/Wizard.cpp" line="241"/> - <source>Import from GPGFrontend</source> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="139"/> + <source>Relative path to keydb</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="256"/> - <source>Other GPGFrontend directory</source> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="152"/> + <source>Current keydb path: </source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="275"/> - <source>Configuration Imported</source> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="157"/> + <source><b>NOTE: </b> Gpg4usb will restart automatically if you change the keydb path!</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="276"/> - <source>Imported Configuration from old GPGFrontend.<br>Will now restart to activate the configuration.</source> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="186"/> + <source>Choose keydb directory</source> <translation type="unfinished"></translation> </message> </context> @@ -561,29 +649,29 @@ </message> <message> <location filename="../../src/ui/widgets/InfoBoardWidget.cpp" line="57"/> - <source>Optional Actions Menu</source> + <source>Optional Actions</source> <translation type="unfinished"></translation> </message> </context> <context> <name>InfoTab</name> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="74"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="76"/> <source><br><center>GPGFrontend is an easy-to-use, compact, cross-platform, <br>and installation-free gpg front-end tool.<br>It visualizes most of the common operations of gpg commands.<br>It's licensed under the GPL v3<br><br><b>Developer:</b><br>Saturneric<br><br>If you have any questions or suggestions, raise an issue<br/>at <a href="https://github.com/saturneric/GpgFrontend">GitHub</a> or send a mail to my mailing list at <a href="mailto:[email protected]">[email protected]</a>.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="82"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="84"/> <source><br><br> Built with Qt </source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="83"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="85"/> <source> and GPGME </source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="84"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="86"/> <source><br>Built at </source> <translation type="unfinished"></translation> </message> @@ -591,42 +679,42 @@ <context> <name>IntroPage</name> <message> - <location filename="../../src/ui/Wizard.cpp" line="111"/> + <location filename="../../src/ui/Wizard.cpp" line="66"/> <source>Getting Started...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="112"/> + <location filename="../../src/ui/Wizard.cpp" line="67"/> <source>... with GPGFrontend</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="114"/> + <location filename="../../src/ui/Wizard.cpp" line="69"/> <source>Welcome to use GPGFrontend for decrypting and signing text or file!</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="116"/> + <location filename="../../src/ui/Wizard.cpp" line="71"/> <source>is a Powerful, Easy-to-Use, Compact, Cross-Platform, and Installation-Free OpenPGP Crypto Tool.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="117"/> + <location filename="../../src/ui/Wizard.cpp" line="72"/> <source>For brief information have a look at the</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="118"/> + <location filename="../../src/ui/Wizard.cpp" line="74"/> <source>Overview</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="119"/> + <location filename="../../src/ui/Wizard.cpp" line="75"/> <source>by clicking the link, the page will open in the web browser</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="127"/> + <location filename="../../src/ui/Wizard.cpp" line="83"/> <source>Choose a Language</source> <translation type="unfinished"></translation> </message> @@ -657,128 +745,110 @@ <context> <name>KeyGenDialog</name> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="32"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="33"/> <source>Generate Key</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="68"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="69"/> <source> Name must contain at least five characters. </source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="70"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="71"/> <source> Please give a email address. </source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="77"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="78"/> <source> Expiration time no more than 2 years. </source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="103"/> - <source>Generating Key...</source> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="112"/> + <source>Success</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="106"/> - <source>Collecting random data for key generation. - This may take a while. - To speed up the process use your computer - (e.g. browse the net, listen to music,...)</source> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="112"/> + <source>The new key pair has been generated.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="150"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="116"/> + <source>Failure</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="145"/> <source>Key Usage</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="152"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="147"/> <source>Encryption</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="155"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="150"/> <source>Signing</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="158"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="153"/> <source>Certification</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="161"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="156"/> <source>Authentication</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="312"/> - <source>Success</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="312"/> - <source>The new key pair has been generated.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="314"/> - <source>Failure</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="314"/> - <source>An error occurred during key generation.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="350"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="338"/> <source>Name:</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="351"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="339"/> <source>Email Address:</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="352"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="340"/> <source>Comment:</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="353"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="341"/> <source>Expiration Date:</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="354"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="342"/> <source>Never Expire</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="355"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="343"/> <source>KeySize (in Bit):</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="356"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="344"/> <source>Key Type:</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="357"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="345"/> <source>Non Pass Phrase</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="370"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="358"/> <source>Basic Information</source> <translation type="unfinished"></translation> </message> @@ -786,27 +856,27 @@ <context> <name>KeyGenPage</name> <message> - <location filename="../../src/ui/Wizard.cpp" line="366"/> + <location filename="../../src/ui/Wizard.cpp" line="183"/> <source>Create a keypair...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="367"/> + <location filename="../../src/ui/Wizard.cpp" line="184"/> <source>...for decrypting and signing messages</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="368"/> + <location filename="../../src/ui/Wizard.cpp" line="185"/> <source>You should create a new keypair.The pair consists of a public and a private key.<br>Other users can use the public key to encrypt messages for you and verify messages signed by you.You can use the private key to decrypt and sign messages.<br>For more information have a look at the offline tutorial (which then is shown in the main window):</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="375"/> + <location filename="../../src/ui/Wizard.cpp" line="192"/> <source>Offline tutorial</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="382"/> + <location filename="../../src/ui/Wizard.cpp" line="199"/> <source>Create New Key</source> <translation type="unfinished"></translation> </message> @@ -934,58 +1004,58 @@ <context> <name>KeyList</name> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="77"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="76"/> <source>Select</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="77"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="76"/> <source>Type</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="77"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="76"/> <source>Name</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="77"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="76"/> <source>Email Address</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="78"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="77"/> <source>Usage</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="78"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="77"/> <source>Validity</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="78"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="77"/> <source>Finger Print</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="315"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="302"/> <source>Import Keys</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="317"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="305"/> <source>You've dropped something on the table. GpgFrontend will now try to import key(s).</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="320"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="308"/> <source>Always import without bothering.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="356"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="341"/> <source>Couldn't Open File: </source> <translation type="unfinished"></translation> </message> @@ -993,7 +1063,7 @@ <context> <name>KeyMgmt</name> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="81"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="82"/> <source>Key Pair Management</source> <translation type="unfinished"></translation> </message> @@ -1059,7 +1129,7 @@ </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="111"/> - <location filename="../../src/ui/KeyMgmt.cpp" line="152"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="151"/> <source>&File</source> <translation type="unfinished"></translation> </message> @@ -1139,94 +1209,108 @@ <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="156"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="155"/> <source>&Key</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="157"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="156"/> <source>&Generate Key</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="161"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="160"/> <source>&Import Key</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="173"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="171"/> <source>Key</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="181"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="179"/> <source>Generate</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="182"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="180"/> <source>Generate A New Keypair or Subkey</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="191"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="189"/> <source>Import key</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="192"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="190"/> <source>Import Key</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="213"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="209"/> <source>Open Key</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="213"/> - <location filename="../../src/ui/KeyMgmt.cpp" line="299"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="210"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="302"/> <source>Key Files</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="213"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="210"/> <source>Keyring files</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="218"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="216"/> <source>Couldn't Open File: </source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="268"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="262"/> <source>Deleting Keys</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="269"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="263"/> <source>Are you sure that you want to delete the following keys?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="270"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="265"/> <source>The action can not be undone.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="299"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="281"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="296"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="344"/> + <source>Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/KeyMgmt.cpp" line="281"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="296"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="344"/> + <source>Key Not Found.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/KeyMgmt.cpp" line="301"/> <source>Export Key To File</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="309"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="312"/> <source>key(s) exported</source> <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="338"/> - <location filename="../../src/ui/KeyMgmt.cpp" line="345"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="349"/> <source>Invalid Operation</source> <translation type="unfinished"></translation> </message> @@ -1236,7 +1320,7 @@ <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="346"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="350"/> <source>If a key pair does not have a private key then it will not be able to generate sub-keys.</source> <translation type="unfinished"></translation> </message> @@ -1384,97 +1468,107 @@ <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="203"/> - <source>You are about to export your</source> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="141"/> + <source>Modify Expiration Datetime (Master Key)</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="204"/> - <source>PRIVATE KEY</source> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="146"/> + <source>Key Server Operation (Pubkey)</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="205"/> - <source>This is NOT your Public Key, so DON'T give it away.</source> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="149"/> + <source>Generate Revoke Certificate</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="206"/> - <source>Do you REALLY want to export your PRIVATE KEY?</source> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="174"/> + <source>Warning: The Master Key has expired.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="141"/> - <source>Modify Expiration Datetime (Master Key)</source> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="177"/> + <source>Warning: The Master Key has been revoked</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="146"/> - <source>Key Server Operation (Pubkey)</source> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="201"/> + <source>Exporting private Key</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="149"/> - <source>Generate Revoke Certificate</source> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="202"/> + <source>You are about to export your</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="175"/> - <source>Warning: The Master Key has expired.</source> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="203"/> + <source>PRIVATE KEY</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="178"/> - <source>Warning: The Master Key has been revoked</source> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="204"/> + <source>This is NOT your Public Key, so DON'T give it away.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="202"/> - <source>Exporting private Key</source> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="205"/> + <source>Do you REALLY want to export your PRIVATE KEY?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="219"/> + <source>Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="219"/> + <source>Key Not Found.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="221"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="224"/> <source>Export Key To File</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="222"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="225"/> <source>Key Files</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="225"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="228"/> <source>Export Error</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="225"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="228"/> <source>Couldn't open %1 for writing</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="295"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="298"/> <source>Never Expire</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="315"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="318"/> <source>Upload Key Pair to Key Server</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="317"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="320"/> <source>Update Key Pair</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="340"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="343"/> <source>Generate revocation certificate</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="343"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="346"/> <source>Revocation Certificates</source> <translation type="unfinished"></translation> </message> @@ -1552,17 +1646,17 @@ <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="161"/> + <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="160"/> <source>Never Expire</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="185"/> + <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="184"/> <source>Never Expires</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="231"/> + <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="230"/> <source>Edit Expire Date</source> <translation type="unfinished"></translation> </message> @@ -1833,46 +1927,46 @@ <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyServerImportDialog.cpp" line="230"/> - <source>Too many responses from keyserver!</source> + <location filename="../../src/ui/KeyServerImportDialog.cpp" line="213"/> + <source>Not Key Found</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyServerImportDialog.cpp" line="237"/> - <source>No keys found, input may be kexId, retrying search with 0x.</source> + <location filename="../../src/ui/KeyServerImportDialog.cpp" line="216"/> + <location filename="../../src/ui/KeyServerImportDialog.cpp" line="386"/> + <source>Timeout</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyServerImportDialog.cpp" line="242"/> - <source>No keys found containing the search string!</source> + <location filename="../../src/ui/KeyServerImportDialog.cpp" line="219"/> + <location filename="../../src/ui/KeyServerImportDialog.cpp" line="389"/> + <source>Key Server Not Found</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyServerImportDialog.cpp" line="246"/> - <source>Insufficiently specific search string!</source> + <location filename="../../src/ui/KeyServerImportDialog.cpp" line="222"/> + <location filename="../../src/ui/KeyServerImportDialog.cpp" line="392"/> + <source>Connection Error</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyServerImportDialog.cpp" line="213"/> - <source>Not Key Found</source> + <location filename="../../src/ui/KeyServerImportDialog.cpp" line="230"/> + <source>Too many responses from keyserver!</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyServerImportDialog.cpp" line="216"/> - <location filename="../../src/ui/KeyServerImportDialog.cpp" line="386"/> - <source>Timeout</source> + <location filename="../../src/ui/KeyServerImportDialog.cpp" line="237"/> + <source>No keys found, input may be kexId, retrying search with 0x.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyServerImportDialog.cpp" line="219"/> - <location filename="../../src/ui/KeyServerImportDialog.cpp" line="389"/> - <source>Key Server Not Found</source> + <location filename="../../src/ui/KeyServerImportDialog.cpp" line="242"/> + <source>No keys found containing the search string!</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyServerImportDialog.cpp" line="222"/> - <location filename="../../src/ui/KeyServerImportDialog.cpp" line="392"/> - <source>Connection Error</source> + <location filename="../../src/ui/KeyServerImportDialog.cpp" line="246"/> + <source>Insufficiently specific search string!</source> <translation type="unfinished"></translation> </message> <message> @@ -1947,22 +2041,22 @@ <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyUIDSignDialog.cpp" line="100"/> + <location filename="../../src/ui/keypair_details/KeyUIDSignDialog.cpp" line="99"/> <source>Unsuccessful Operation</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyUIDSignDialog.cpp" line="101"/> + <location filename="../../src/ui/keypair_details/KeyUIDSignDialog.cpp" line="100"/> <source>Signature operation failed for UID </source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyUIDSignDialog.cpp" line="108"/> + <location filename="../../src/ui/keypair_details/KeyUIDSignDialog.cpp" line="107"/> <source>Operation Complete</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyUIDSignDialog.cpp" line="109"/> + <location filename="../../src/ui/keypair_details/KeyUIDSignDialog.cpp" line="108"/> <source>The signature operation of the UID is complete</source> <translation type="unfinished"></translation> </message> @@ -1970,27 +2064,27 @@ <context> <name>KeyUploadDialog</name> <message> - <location filename="../../src/ui/KeyUploadDialog.cpp" line="49"/> + <location filename="../../src/ui/KeyUploadDialog.cpp" line="47"/> <source>Uploading Public Key</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyUploadDialog.cpp" line="112"/> + <location filename="../../src/ui/KeyUploadDialog.cpp" line="110"/> <source>Key Not Found</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyUploadDialog.cpp" line="115"/> + <location filename="../../src/ui/KeyUploadDialog.cpp" line="113"/> <source>Timeout</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyUploadDialog.cpp" line="118"/> + <location filename="../../src/ui/KeyUploadDialog.cpp" line="116"/> <source>Key Server Not Found</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyUploadDialog.cpp" line="121"/> + <location filename="../../src/ui/KeyUploadDialog.cpp" line="119"/> <source>Connection Error</source> <translation type="unfinished"></translation> </message> @@ -1998,12 +2092,32 @@ <context> <name>KeyserverTab</name> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="607"/> - <source>Default Key Server for import:</source> + <location filename="../../src/ui/settings/SettingsKeyServer.cpp" line="32"/> + <source>General</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/settings/SettingsKeyServer.cpp" line="53"/> + <source>No.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/settings/SettingsKeyServer.cpp" line="53"/> + <source>Address</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="624"/> + <location filename="../../src/ui/settings/SettingsKeyServer.cpp" line="53"/> + <source>Available</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/settings/SettingsKeyServer.cpp" line="57"/> + <source>Default Key Server for Import:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/settings/SettingsKeyServer.cpp" line="67"/> <source>Add</source> <translation type="unfinished"></translation> </message> @@ -2026,247 +2140,344 @@ <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="38"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="117"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="286"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="36"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="40"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="44"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="114"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="127"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="131"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="135"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="196"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="212"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="216"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="220"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="294"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="326"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="331"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="335"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="383"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="396"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="400"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="404"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="501"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="513"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="517"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="521"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="583"/> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="51"/> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="112"/> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="126"/> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="218"/> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="231"/> <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="525"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="702"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="885"/> - <source>No Key Selected</source> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="541"/> + <source>Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="36"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="127"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="212"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="396"/> + <source>Select a file before doing it.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="40"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="131"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="216"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="400"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="517"/> + <source>No permission to read this file.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="44"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="135"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="220"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="404"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="521"/> + <source>No permission to create file.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="49"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="150"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="226"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="409"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="375"/> + <source>Warning</source> <translation type="unfinished"></translation> </message> <message> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="50"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="151"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="227"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="410"/> + <source>The target file already exists, do you need to overwrite it?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="62"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="239"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="422"/> <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="45"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="124"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="532"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="709"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="126"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="298"/> + <source>No Key Selected</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="69"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="246"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="52"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="133"/> <source>Invalid Operation</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="46"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="533"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="710"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="70"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="247"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="53"/> <source>The selected key contains a key that does not actually have a encrypt usage.<br/></source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="47"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="126"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="300"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="534"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="711"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="899"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="71"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="248"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="436"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="54"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="135"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="312"/> <source><br/>For example the Following Key: <br/></source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="65"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="554"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="91"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="72"/> <source>Encrypting</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="94"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="368"/> - <source>Function Disabled</source> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="114"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="196"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="294"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="383"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="501"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="583"/> + <source>An error occurred during operation.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="95"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="369"/> - <source>Please go to the settings interface to enable and configure this function.</source> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="268"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="151"/> + <source>Signing</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="125"/> - <source>The selected key contains a key that does not actually have a signature usage.<br/></source> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="327"/> + <source>Please select the appropriate target file or signature file. Ensure that both are in this directory.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="142"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="731"/> - <source>Signing</source> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="331"/> + <source>No permission to read target file.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="186"/> - <source>Decrypting</source> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="335"/> + <source>No permission to read signature file.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="246"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="816"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="353"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="259"/> <source>Verifying</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="298"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="897"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="434"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="310"/> <source>Invalid KeyPair</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="299"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="898"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="435"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="311"/> <source>The selected keypair cannot be used for signing and encryption at the same time.<br/></source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="310"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="317"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="909"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="916"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="446"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="453"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="322"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="329"/> <source>Incomplete Operation</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="311"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="910"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="447"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="323"/> <source>None of the selected key pairs can provide the encryption function.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="318"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="917"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="454"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="330"/> <source>None of the selected key pairs can provide the signature function.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="335"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="936"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="473"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="365"/> <source>Encrypting and Signing</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="401"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="1014"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="513"/> + <source>Select a file(.gpg/.asc) before doing it.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="551"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="461"/> <source>Decrypting and Verifying</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="499"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="503"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="507"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="577"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="590"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="594"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="598"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="659"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="675"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="679"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="683"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="757"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="789"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="794"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="798"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="846"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="859"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="863"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="867"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="964"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="976"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="980"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="984"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="1046"/> - <source>Error</source> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="43"/> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="155"/> + <source>Invalid Own Key</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="499"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="590"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="675"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="859"/> - <source>Select a file before doing it.</source> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="43"/> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="155"/> + <source>Own Key can not be use to do any operation.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="503"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="594"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="679"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="863"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="980"/> - <source>No permission to read this file.</source> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="52"/> + <source>Please obtain a Service Token from the server in the settings.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="507"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="598"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="683"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="867"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="984"/> - <source>No permission to create file.</source> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="91"/> + <source>Getting Cpt From Server</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="512"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="613"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="689"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="872"/> - <source>Warning</source> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="113"/> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="219"/> + <source>The communication content with the server does not meet the requirements</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="513"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="614"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="690"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="873"/> - <source>The target file already exists, do you need to overwrite it?</source> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="126"/> + <source>Invalid short ciphertext</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="577"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="659"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="757"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="846"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="964"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="1046"/> - <source>An error occurred during operation.</source> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="144"/> + <source>Invalid Service Token</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="790"/> - <source>Please select the appropriate target file or signature file. Ensure that both are in this directory.</source> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="145"/> + <source>Please go to the setting interface to get a ServiceToken.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="794"/> - <source>No permission to read target file.</source> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="203"/> + <source>Getting Scpt From Server</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="798"/> - <source>No permission to read signature file.</source> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="228"/> + <source>Notice: Use Decrypt & Verify operation to decrypt this short crypto text.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="976"/> - <source>Select a file(.gpg/.asc) before doing it.</source> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="231"/> + <source>There is a problem with the communication with the server</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="103"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="408"/> + <source>Function Disabled</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="104"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="409"/> + <source>Please go to the settings interface to enable and configure this function.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="134"/> + <source>The selected key contains a key that does not actually have a signature usage.<br/></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="186"/> + <source>Notice</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="186"/> + <source>Short Crypto Text only supports Decrypt & Verify.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="1082"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="200"/> + <source>Decrypting</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="376"/> + <source>Automatic public key exchange failed.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="415"/> + <source>Service Token Empty</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="416"/> + <source>Please go to the settings interface to set Own Key and get Service Token.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="525"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="541"/> + <source>Key Not Found.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="572"/> <source>Outdated Version</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="1083"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="573"/> <source>This version(%1) is out of date, please update the latest version in time. </source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="1085"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="1092"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="575"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="582"/> <source>You can download the latest version(%1) on Github Releases Page.<br/></source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="1089"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="579"/> <source>Unreleased Version</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="1090"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="580"/> <source>This version(%1) has not been officially released and is not recommended for use in a production environment. <br/></source> <translation type="unfinished"></translation> </message> @@ -2792,109 +3003,147 @@ </message> </context> <context> + <name>PubkeyGetter</name> + <message> + <location filename="../../src/server/api/PubkeyGetter.cpp" line="66"/> + <location filename="../../src/server/api/PubkeyGetter.cpp" line="90"/> + <source>Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/api/PubkeyGetter.cpp" line="67"/> + <location filename="../../src/server/api/PubkeyGetter.cpp" line="91"/> + <source>The communication content with the server does not meet the requirements</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>PubkeyUploader</name> + <message> + <location filename="../../src/server/api/PubkeyUploader.cpp" line="95"/> + <source>Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/api/PubkeyUploader.cpp" line="96"/> + <source>The communication content with the server does not meet the requirements</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/api/PubkeyUploader.cpp" line="103"/> + <source>Warning</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/api/PubkeyUploader.cpp" line="104"/> + <source>Partial failure of automatic pubkey exchange</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>QApplication</name> <message> - <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="42"/> - <source>>Recipient: </source> + <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="66"/> + <source> {>} Recipient: </source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="35"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="61"/> <source>One or More Bad Signatures.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="40"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="66"/> <source>A </source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="42"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="68"/> <source>Good </source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="45"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="71"/> <source>Bad </source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="48"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="74"/> <source>Expired </source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="51"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="77"/> <source>Missing Key's </source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="54"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="80"/> <source>Revoked Key's </source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="57"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="83"/> <source>Expired Key's </source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="60"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="86"/> <source>Missing CRL's </source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="64"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="90"/> <source>Signature Fully Valid.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="66"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="92"/> <source>Signature NOT Fully Valid.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="74"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="100"/> <source>Key is NOT present with ID 0x</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="81"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="107"/> <source>A signature could NOT be verified due to a Missing Key </source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="85"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="111"/> <source>A signature is valid but the key used to verify the signature has been revoked </source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="93"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="119"/> <source>A signature is valid but expired </source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="100"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="126"/> <source>A signature is valid but the key used to verify the signature has expired. </source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="107"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="133"/> <source>There was some other error which prevented the signature verification. </source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="113"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="139"/> <source>Error for key with fingerprint </source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="128"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="152"/> <source>Signed By: </source> <translation type="unfinished"></translation> </message> @@ -2994,63 +3243,83 @@ <context> <name>SendMailTab</name> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="289"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="33"/> <source>Enable</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="311"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="51"/> + <source>Check Connection</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="53"/> + <source>General</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="54"/> + <source>Connection</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="55"/> + <source>Preference</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="61"/> <source>SMTP Address</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="313"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="63"/> <source>Username</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="315"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="65"/> <source>Password</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="317"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="67"/> <source>Port</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="319"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="69"/> <source>Connection Security</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="322"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="75"/> <source>Default Sender</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="404"/> - <location filename="../../src/ui/SettingsDialog.cpp" line="408"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="161"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="165"/> <source>Fail</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="404"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="161"/> <source>Fail to Connect SMTP Server</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="408"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="165"/> <source>Fail to Login</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="413"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="170"/> <source>Success</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="413"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="170"/> <source>Succeed in connecting and login</source> <translation type="unfinished"></translation> </message> @@ -3058,131 +3327,210 @@ <context> <name>SettingsDialog</name> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="40"/> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="39"/> <source>General</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="41"/> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="40"/> <source>Appearance</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="42"/> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="41"/> <source>Send Mail</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="43"/> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="42"/> <source>Key Server</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="45"/> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="44"/> <source>Advanced</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="58"/> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="59"/> <source>Settings</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="103"/> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="105"/> <source>System Default</source> <translation type="unfinished"></translation> </message> </context> <context> + <name>SignResultAnalyse</name> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="29"/> + <source>[#] Sign Operation </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="32"/> + <source>[Success]</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="34"/> + <source>[Failed] </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="43"/> + <source>[>] New Signature: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="47"/> + <source> Sign Mode: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="49"/> + <source>Normal</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="51"/> + <source>Clear</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="53"/> + <source>Detach</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="59"/> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="61"/> + <source> Signer: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="61"/> + <source><unknown></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="63"/> + <source> Public Key Algo: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="64"/> + <source> Hash Algo: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="65"/> + <source> Date & Time: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="75"/> + <source>Invalid Signers: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="79"/> + <source>[>] Signer: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="80"/> + <source> Fingerprint: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="81"/> + <source> Reason: </source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>SignersPicker</name> + <message> + <location filename="../../src/ui/widgets/SignersPicker.cpp" line="28"/> + <source>Confirm</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>SubkeyGenerateDialog</name> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="46"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="47"/> <source>Generate New Subkey</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="61"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="62"/> <source>Encryption</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="64"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="65"/> <source>Signing</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="67"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="68"/> <source>Certification</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="70"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="71"/> <source>Authentication</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="114"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="115"/> <source>Expiration Date:</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="115"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="116"/> <source>Never Expire</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="116"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="117"/> <source>KeySize (in Bit):</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="117"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="118"/> <source>Key Type:</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="126"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="127"/> <source>Basic Information</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="214"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="215"/> <source> Expiration time no more than 2 years. </source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="235"/> - <source>Generating Subkey...</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="238"/> - <source>Collecting random data for subkey generation. - This may take a while. - To speed up the process use your computer - (e.g. browse the net, listen to music,...)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="309"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="244"/> <source>Success</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="309"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="244"/> <source>The new subkey has been generated.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="311"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="247"/> <source>Failure</source> <translation type="unfinished"></translation> </message> - <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="311"/> - <source>An error occurred during subkey generation.</source> - <translation type="unfinished"></translation> - </message> </context> <context> <name>TextEdit</name> @@ -3248,35 +3596,48 @@ </message> </context> <context> + <name>UnknownSignersChecker</name> + <message> + <location filename="../../src/advance/UnknownSignersChecker.cpp" line="69"/> + <source>Warning</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/advance/UnknownSignersChecker.cpp" line="70"/> + <source>Automatic public key exchange failed.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>UpdateTab</name> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="127"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="129"/> <source>It is recommended that you always check the version of GpgFrontend and upgrade to the latest version.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="129"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="131"/> <source>New versions not only represent new features, but also often represent functional and security fixes.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="133"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="135"/> <source>Current Version: </source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="141"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="143"/> <source>The current version is inconsistent with the latest version on github.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="143"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="145"/> <source>Please click <a href="https://github.com/saturneric/GpgFrontend/releases">here</a> to download the latest version.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="187"/> - <location filename="../../src/ui/help/AboutDialog.cpp" line="209"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="199"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="214"/> <source>Latest Version From Github: </source> <translation type="unfinished"></translation> </message> @@ -3454,36 +3815,33 @@ </message> </context> <context> - <name>Wizard</name> + <name>VerifyResultAnalyse</name> <message> - <location filename="../../src/ui/Wizard.cpp" line="46"/> - <source>First Start Wizard</source> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="31"/> + <source>[#] Verify Operation </source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="76"/> - <source>Import Error</source> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="34"/> + <source>[Success]</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="76"/> - <source>Couldn't locate any keyring file in %1</source> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="36"/> + <source>[Failed] </source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="84"/> - <location filename="../../src/ui/Wizard.cpp" line="95"/> - <source>Import error</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../../src/ui/Wizard.cpp" line="85"/> - <source>Couldn't open private keyringfile: %1</source> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="158"/> + <source><Unknown></source> <translation type="unfinished"></translation> </message> +</context> +<context> + <name>Wizard</name> <message> - <location filename="../../src/ui/Wizard.cpp" line="96"/> - <source>Couldn't open public keyringfile: %1</source> + <location filename="../../src/ui/Wizard.cpp" line="40"/> + <source>First Start Wizard</source> <translation type="unfinished"></translation> </message> </context> diff --git a/resource/ts/gpgfrontend_es.ts b/resource/ts/gpgfrontend_es.ts index a3f8dd53..866ccad0 100644 --- a/resource/ts/gpgfrontend_es.ts +++ b/resource/ts/gpgfrontend_es.ts @@ -1,198 +1,311 @@ -<?xml version="1.0" ?><!DOCTYPE TS><TS version="2.1" language="es_ES"> +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.1" language="es_ES"> <context> <name>AboutDialog</name> <message> <location filename="../../src/ui/help/AboutDialog.cpp" line="35"/> <source>About </source> - <translation type="finished">Acerca de</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/help/AboutDialog.cpp" line="42"/> <source>General</source> - <translation type="finished">General</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/help/AboutDialog.cpp" line="43"/> <source>Translators</source> - <translation type="unfinished"/> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/help/AboutDialog.cpp" line="44"/> <source>Update</source> - <translation type="finished">Actualizar</translation> + <translation type="unfinished"></translation> </message> </context> <context> <name>AdvancedTab</name> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="679"/> - <source>Show Steganography Options [Advanced]</source> - <translation type="finished">Mostrar opciones de steganography [Avanzado]</translation> + <location filename="../../src/ui/settings/SettingsAdvanced.cpp" line="34"/> + <source>Show Steganography Options</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="681"/> + <location filename="../../src/ui/settings/SettingsAdvanced.cpp" line="36"/> <source>Show Steganographic Options.</source> - <translation type="finished">Mostrar opciones de STANGANOGRÁFICA.</translation> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/settings/SettingsAdvanced.cpp" line="40"/> + <source>Pubkey Exchange</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/settings/SettingsAdvanced.cpp" line="42"/> + <source>Auto Pubkey Exchange</source> + <translation type="unfinished"></translation> </message> </context> <context> <name>AppearanceTab</name> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="444"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="34"/> <source>Iconsize</source> - <translation type="finished">Tamaño de ícono.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="446"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="36"/> <source>small</source> - <translation type="unfinished"/> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="447"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="37"/> <source>medium</source> - <translation type="finished">medio</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="448"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="38"/> <source>large</source> - <translation type="finished">grande</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="464"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="54"/> <source>Iconstyle</source> - <translation type="finished">IconStyle</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="466"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="56"/> <source>just text</source> - <translation type="finished">Solo texto</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="467"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="57"/> <source>just icons</source> - <translation type="finished">solo iconos</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="468"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="58"/> <source>text and icons</source> - <translation type="finished">Texto e Iconos</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="484"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="74"/> <source>Windowstate</source> - <translation type="finished">Estado de ventanas</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="487"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="77"/> <source>Save window size and position on exit.</source> - <translation type="finished">Guardar el tamaño de la ventana y la posición en la salida.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="495"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="85"/> <source>Information Board</source> - <translation type="finished">Tarjeta de la información</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="501"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="91"/> <source> Front Size</source> - <translation type="finished">Tamaño delantero</translation> + <translation type="unfinished"></translation> </message> </context> <context> <name>ChoosePage</name> <message> - <location filename="../../src/ui/Wizard.cpp" line="165"/> + <location filename="../../src/ui/Wizard.cpp" line="121"/> <source>Choose your action...</source> - <translation type="finished">Elige tu acción ...</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="166"/> + <location filename="../../src/ui/Wizard.cpp" line="122"/> <source>...by clicking on the appropriate link.</source> - <translation type="finished">... haciendo clic en el enlace apropiado.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="168"/> - <source>If you have never used GPGFrontend before and also don't own a gpg key yet you may possibly want to read how to</source> - <translation type="finished">Si nunca ha usado GPGFRontend antes y tampoco tiene una clave GPG, pero posiblemente quiera leer cómo leer</translation> + <location filename="../../src/ui/Wizard.cpp" line="124"/> + <source>If you have never used GPGFrontend before and also don't own a gpg key yet you may possibly want to read how to</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="170"/> + <location filename="../../src/ui/Wizard.cpp" line="127"/> <source>Generate Key</source> - <translation type="finished">Generar clave</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="176"/> + <location filename="../../src/ui/Wizard.cpp" line="134"/> <source>If you want to learn how to encrypt, decrypt, sign and verify text, you can read </source> - <translation type="finished">Si desea aprender cómo cifrar, descifrar, firmar y verificar el texto, puede leer</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="178"/> + <location filename="../../src/ui/Wizard.cpp" line="136"/> <source>Encrypt & Decrypt Text</source> - <translation type="finished">Cifrar y descifrar texto</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="178"/> - <location filename="../../src/ui/Wizard.cpp" line="190"/> + <location filename="../../src/ui/Wizard.cpp" line="136"/> + <location filename="../../src/ui/Wizard.cpp" line="149"/> <source>or</source> - <translation type="finished">o</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="180"/> + <location filename="../../src/ui/Wizard.cpp" line="138"/> <source>Sign & Verify Text</source> - <translation type="finished">Firmar y verificar el texto</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="188"/> + <location filename="../../src/ui/Wizard.cpp" line="146"/> <source>If you want to operate file, you can read </source> - <translation type="finished">Si desea operar el archivo, puede leer</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="190"/> + <location filename="../../src/ui/Wizard.cpp" line="149"/> <source>Encrypt & Sign File</source> - <translation type="finished">Cifrar y firmar archivo</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="192"/> + <location filename="../../src/ui/Wizard.cpp" line="152"/> <source>Sign & Verify File</source> - <translation type="finished">Firmar y verificar el archivo</translation> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ComUtils</name> + <message> + <location filename="../../src/server/ComUtils.cpp" line="35"/> + <location filename="../../src/server/ComUtils.cpp" line="55"/> + <source>Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/ComUtils.cpp" line="35"/> + <source>Nothing Reply. Please check the Internet connection.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/ComUtils.cpp" line="55"/> + <source>Unknown Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/ComUtils.cpp" line="75"/> + <location filename="../../src/server/ComUtils.cpp" line="90"/> + <source>Network Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/ComUtils.cpp" line="75"/> + <source>Outdated Reply</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/ComUtils.cpp" line="87"/> + <source>Unknown Reason</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/ComUtils.cpp" line="90"/> + <source>Unknown Reply Format</source> + <translation type="unfinished"></translation> </message> </context> <context> <name>ConclusionPage</name> <message> - <location filename="../../src/ui/Wizard.cpp" line="407"/> + <location filename="../../src/ui/Wizard.cpp" line="224"/> <source>Ready.</source> - <translation type="finished">Listo.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="408"/> + <location filename="../../src/ui/Wizard.cpp" line="225"/> <source>Have fun with GPGFrontend!</source> - <translation type="finished">¡Diviértete con GPGFRontend!</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="410"/> + <location filename="../../src/ui/Wizard.cpp" line="227"/> <source>You are ready to use GPGFrontend now.<br><br></source> - <translation type="finished">Estás listo para usar GPGFRontend ahora. <br> <br></translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="412"/> + <location filename="../../src/ui/Wizard.cpp" line="229"/> <source>The Online Document</source> - <translation type="finished">El documento en línea</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="413"/> + <location filename="../../src/ui/Wizard.cpp" line="231"/> <source> will get you started with GPGFrontend. It will open in the main window.<br></source> - <translation type="finished">Te harás comenzar con GPGFRontend.Se abrirá en la ventana principal. <br></translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="420"/> + <location filename="../../src/ui/Wizard.cpp" line="238"/> <source>Open offline help.</source> - <translation type="finished">Ayuda fuera de línea abierta.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="423"/> + <location filename="../../src/ui/Wizard.cpp" line="241"/> <source>Dont show the wizard again.</source> - <translation type="finished">No vuelvas a mostrar al asistente.</translation> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>DecryptResultAnalyse</name> + <message> + <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="30"/> + <source>[#] Decrypt Operation </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="33"/> + <source>[Success]</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="35"/> + <source>[Failed] </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="39"/> + <source>Unsupported Algo: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="46"/> + <source>File Name: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="52"/> + <source>Recipient(s): </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="82"/> + <source> Keu ID: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="83"/> + <source> Public Algo: </source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>EncryptResultAnalyse</name> + <message> + <location filename="../../src/gpg/result_analyse/EncryptResultAnalyse.cpp" line="41"/> + <source>Invalid Recipients: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/EncryptResultAnalyse.cpp" line="44"/> + <source>Fingerprint: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/EncryptResultAnalyse.cpp" line="45"/> + <source>Reason: </source> + <translation type="unfinished"></translation> </message> </context> <context> @@ -200,99 +313,98 @@ <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="32"/> <source>Decrypt File</source> - <translation type="finished">Archivo de descifrado</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="34"/> <source>Encrypt File</source> - <translation type="finished">Cifrar archivo</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="36"/> <source>Sign File</source> - <translation type="finished">Archivo de firma</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="38"/> <source>Verify File</source> - <translation type="finished">Verificar archivo</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="47"/> <source>Input Parameters</source> - <translation type="finished">Parámetros de entrada</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="53"/> <source>Target File</source> - <translation type="finished">Archivo de destino</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="59"/> <source>Output File</source> - <translation type="finished">Archivo de salida</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="75"/> <source>Signature File(.sig) Path</source> - <translation type="finished">Ruta del archivo de firma (.sig)</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="134"/> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="177"/> <source>Open File</source> - <translation type="finished">Abrir documento</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="165"/> <source>Save File</source> - <translation type="finished">Guardar el archivo</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="194"/> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="245"/> - <source>Couldn't open file</source> - <translation type="finished">No se pudo abrir el archivo</translation> + <source>Couldn't open file</source> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="213"/> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="224"/> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="235"/> <source>Error</source> - <translation type="finished">Error</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="214"/> <source>Error Occurred During Encryption</source> - <translation type="finished">Se produjo un error durante el cifrado</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="225"/> <source>Error Occurred During Decryption</source> - <translation type="finished">Se produjo un error durante la descifrado.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="236"/> <source>Error Occurred During Signature</source> - <translation type="finished">Se produjo un error durante la firma</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="259"/> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="268"/> <source>File</source> - <translation type="finished">Archivo</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="260"/> <source>File exists! Do you want to overwrite it?</source> - <translation type="finished">¡El archivo existe! ¿Quieres sobreescribirlo?</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="269"/> <source>Cannot write file %1: %2.</source> - <translation type="finished">No se puede escribir archivo% 1: -% 2.</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -300,52 +412,52 @@ <message> <location filename="../../src/ui/widgets/FilePage.cpp" line="161"/> <source>Open</source> - <translation type="finished">Abierto</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/FilePage.cpp" line="163"/> <source>Delete</source> - <translation type="finished">Borrar</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/FilePage.cpp" line="165"/> <source>Encrypt and Sign</source> - <translation type="finished">Cifrar y firmar</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/FilePage.cpp" line="167"/> <source>Decrypt and Verify</source> - <translation type="finished">Descifrar y verificar</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/FilePage.cpp" line="169"/> <source>Only Sign</source> - <translation type="finished">Solo signo</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/FilePage.cpp" line="171"/> <source>Only Verify</source> - <translation type="finished">Solo verificar</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/FilePage.cpp" line="222"/> <source>Warning</source> - <translation type="finished">Advertencia</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/FilePage.cpp" line="223"/> <source>Are you sure you want to delete it?</source> - <translation type="finished">¿Estás seguro de que quieres borrarlo?</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/FilePage.cpp" line="233"/> <source>Error</source> - <translation type="finished">Error</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/FilePage.cpp" line="234"/> <source>Unable to delete the file or folder.</source> - <translation type="finished">No se puede eliminar el archivo o la carpeta.</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -353,202 +465,179 @@ <message> <location filename="../../src/ui/FindWidget.cpp" line="38"/> <source>Find:</source> - <translation type="finished">Encontrar:</translation> + <translation type="unfinished"></translation> </message> </context> <context> <name>GeneralTab</name> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="137"/> - <source>Remember Password</source> - <translation type="finished">Recordar contraseña</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="40"/> + <source>GpgFrontend Server</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="140"/> - <source>Remember password until closing gpg4usb</source> - <translation type="finished">Recuerde la contraseña hasta que cierre GPG4USB</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="45"/> + <source>Server that provides short key and key exchange services</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="147"/> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="52"/> <source>Save Checked Keys</source> - <translation type="finished">Guardar las llaves revisadas</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="150"/> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="55"/> <source>Save checked private keys on exit and restore them on next start.</source> - <translation type="finished">Guarda las llaves privadas revisadas en la salida y restaurándolas en el próximo inicio.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="159"/> - <source>Confirm drag'n'drop key import</source> - <translation type="finished">Confirmar la tecla Drag'n'n'Drop Import</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="64"/> + <source>Confirm drag'n'drop key import</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="162"/> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="67"/> <source>Import files dropped on the keylist without confirmation.</source> - <translation type="finished">Importar archivos cayeron en el keylist sin confirmación.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="169"/> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="74"/> <source>Language</source> - <translation type="finished">Idioma</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="178"/> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="83"/> <source><b>NOTE: </b> GpgFrontend will restart automatically if you change the language!</source> - <translation type="finished"><B> Nota: </ b> GPGFRontend se reiniciará automáticamente si cambia el idioma!</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="187"/> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="92"/> <source>Own key</source> - <translation type="finished">Clave</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="195"/> - <source><none></source> - <translation type="finished"><ninguno></translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="96"/> + <source>Get Service Token</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="209"/> - <source>Key pair for synchronization and identity authentication</source> - <translation type="finished">Pareja de llaves para la autenticación de sincronización e identidad</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="97"/> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="234"/> + <source>No Service Token Found</source> + <translation type="unfinished"></translation> </message> -</context> -<context> - <name>GpgME::GpgContext</name> <message> - <location filename="../../src/gpg/GpgContext.cpp" line="528"/> - <source>Wrong password</source> - <translation type="finished">Contraseña incorrecta</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="103"/> + <source><none></source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/GpgContext.cpp" line="536"/> - <source>Enter Password for</source> - <translation type="finished">Ingrese la contraseña para</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="120"/> + <source>Key pair for synchronization and identity authentication</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/GpgContext.cpp" line="540"/> - <source>Enter Password</source> - <translation type="finished">Introducir la contraseña</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="252"/> + <source>Invalid Operation</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/GpgContext.cpp" line="706"/> - <source>Key Selection</source> - <translation type="finished">Selección de claves</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="253"/> + <source>Own Key can not be None while getting service token.</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/GpgContext.cpp" line="706"/> - <source>No Private Key Selected</source> - <translation type="finished">No hay llave privada seleccionada</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="265"/> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="336"/> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="353"/> + <source>Error</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/GpgContext.cpp" line="746"/> - <source>Error in signing:</source> - <translation type="finished">Error en la firma:</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="266"/> + <source>Key Not Exists</source> + <translation type="unfinished"></translation> </message> -</context> -<context> - <name>GpgPathsTab</name> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="711"/> - <source>Relative path to keydb</source> - <translation type="finished">Camino relativo a KeyDB</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="337"/> + <source>The communication content with the server does not meet the requirements</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="724"/> - <source>Current keydb path: </source> - <translation type="finished">Ruta de KeyDB actual:</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="350"/> + <source>Notice</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="729"/> - <source><b>NOTE: </b> Gpg4usb will restart automatically if you change the keydb path!</source> - <translation type="finished"><B> Nota: </ b> gpg4usb se reiniciará automáticamente si cambia la ruta KeyDB!</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="351"/> + <source>Succeed in getting service token</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="758"/> - <source>Choose keydb directory</source> - <translation type="finished">Elija el directorio de KeyDB</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="353"/> + <source>There is a problem with the communication with the server</source> + <translation type="unfinished"></translation> </message> </context> <context> - <name>ImportFromGnupgPage</name> - <message> - <location filename="../../src/ui/Wizard.cpp" line="302"/> - <source>Import keys...</source> - <translation type="finished">Importar teclas ...</translation> - </message> - <message> - <location filename="../../src/ui/Wizard.cpp" line="303"/> - <source>...from existing GnuPG installation</source> - <translation type="finished">... de la instalación de GNUPG existente</translation> - </message> - <message> - <location filename="../../src/ui/Wizard.cpp" line="305"/> - <source>You can import keys from a locally installed GnuPG.<br><br> The location is read from registry in Windows or assumed to be the .gnupg folder in the your home directory in Linux.<br></source> - <translation type="finished">Puede importar claves desde un GNUPG instalado localmente. <br> <br> La ubicación se lee desde el registro en Windows o se supone que es la carpeta .GNUPG en el directorio de su casa en Linux. <br></translation> - </message> + <name>GpgME::GpgContext</name> <message> - <location filename="../../src/ui/Wizard.cpp" line="309"/> - <source>Import keys from GnuPG</source> - <translation type="finished">Importar claves de gnupg</translation> + <location filename="../../src/gpg/gpg_context/GpgContext.cpp" line="184"/> + <source>Wrong password</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="323"/> - <source>Import Error</source> - <translation type="finished">Error de importación</translation> + <location filename="../../src/gpg/gpg_context/GpgContext.cpp" line="192"/> + <source>Enter Password for</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="323"/> - <source>Couldn't locate GnuPG home directory</source> - <translation type="finished">No se pudo localizar el directorio de inicio de gnupg</translation> - </message> -</context> -<context> - <name>ImportFromGpg4usbPage</name> - <message> - <location filename="../../src/ui/Wizard.cpp" line="225"/> - <source>Import from...</source> - <translation type="finished">Importar de...</translation> + <location filename="../../src/gpg/gpg_context/GpgContext.cpp" line="196"/> + <source>Enter Password</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="226"/> - <source>...existing GPGFrontend</source> - <translation type="finished">... gpgfrontend existente</translation> + <location filename="../../src/gpg/gpg_context/GpgContext.cpp" line="258"/> + <source>Processing</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="228"/> - <source>You can import keys and/or settings from existing GPGFrontend. <br><br>Just check what you want to import, click the import button and choose the directory of your other GPGFrontend in the appearing file dialog.</source> - <translation type="finished">Puede importar claves y / o configuraciones desde GPGFrontend existente.<br> <br> Simplemente compruebe lo que desea importar, haga clic en el botón Importar y elija el directorio de su otro GPGFrontend en el cuadro de diálogo de archivo de apariencia.</translation> + <location filename="../../src/gpg/gpg_context/GpgContextBasicOpera.cpp" line="164"/> + <source>Key Selection</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="235"/> - <source>Keys</source> - <translation type="finished">Llaves</translation> + <location filename="../../src/gpg/gpg_context/GpgContextBasicOpera.cpp" line="164"/> + <source>No Private Key Selected</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="239"/> - <source>Configuration</source> - <translation type="finished">Configuración</translation> + <location filename="../../src/gpg/gpg_context/GpgContextBasicOpera.cpp" line="195"/> + <source>Error in signing:</source> + <translation type="unfinished"></translation> </message> +</context> +<context> + <name>GpgPathsTab</name> <message> - <location filename="../../src/ui/Wizard.cpp" line="241"/> - <source>Import from GPGFrontend</source> - <translation type="finished">Importación de GPGFRontend</translation> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="139"/> + <source>Relative path to keydb</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="256"/> - <source>Other GPGFrontend directory</source> - <translation type="finished">Otro GPGFrontend Directorio</translation> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="152"/> + <source>Current keydb path: </source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="275"/> - <source>Configuration Imported</source> - <translation type="finished">Configuración importada</translation> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="157"/> + <source><b>NOTE: </b> Gpg4usb will restart automatically if you change the keydb path!</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="276"/> - <source>Imported Configuration from old GPGFrontend.<br>Will now restart to activate the configuration.</source> - <translation type="finished">Configuración importada desde el antiguo GPGFrontend. Se reiniciará ahora para activar la configuración.</translation> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="186"/> + <source>Choose keydb directory</source> + <translation type="unfinished"></translation> </message> </context> <context> @@ -556,78 +645,78 @@ <message> <location filename="../../src/ui/widgets/InfoBoardWidget.cpp" line="40"/> <source>Import missing key from Keyserver</source> - <translation type="finished">Importar la tecla faltante de Keyserver</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/InfoBoardWidget.cpp" line="57"/> - <source>Optional Actions Menu</source> - <translation type="finished">MENÚ DE ACCIONES OPCIONALES</translation> + <source>Optional Actions</source> + <translation type="unfinished"></translation> </message> </context> <context> <name>InfoTab</name> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="74"/> - <source><br><center>GPGFrontend is an easy-to-use, compact, cross-platform, <br>and installation-free gpg front-end tool.<br>It visualizes most of the common operations of gpg commands.<br>It's licensed under the GPL v3<br><br><b>Developer:</b><br>Saturneric<br><br>If you have any questions or suggestions, raise an issue<br/>at <a href="https://github.com/saturneric/GpgFrontend">GitHub</a> or send a mail to my mailing list at <a href="mailto:[email protected]">[email protected]</a>.</source> - <translation type="finished"><br> <Centre> GPGFRontend es una herramienta de front-end de GPG de fácil uso, compacta, compacta, compacta y sin instalación. <br> Se visualiza la mayoría de las operaciones comunes de los comandos GPG. <BR> Está licenciado bajo el GPL V3 <br> <br> <B> Desarrollador: </ b> <br> Saturnérico <br> <br> Si tiene alguna pregunta o sugerencia, plantee un problema <br/> a <Ahref = "https://github.com/saturnic/gpgfrontend"> github </a> o envíe un correo a mi lista de correo en <a href="mailto [email protected]"> [email protected] </ a>.</translation> + <location filename="../../src/ui/help/AboutDialog.cpp" line="76"/> + <source><br><center>GPGFrontend is an easy-to-use, compact, cross-platform, <br>and installation-free gpg front-end tool.<br>It visualizes most of the common operations of gpg commands.<br>It's licensed under the GPL v3<br><br><b>Developer:</b><br>Saturneric<br><br>If you have any questions or suggestions, raise an issue<br/>at <a href="https://github.com/saturneric/GpgFrontend">GitHub</a> or send a mail to my mailing list at <a href="mailto:[email protected]">[email protected]</a>.</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="82"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="84"/> <source><br><br> Built with Qt </source> - <translation type="finished"><br> <br> construido con qt</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="83"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="85"/> <source> and GPGME </source> - <translation type="finished">y gpgme</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="84"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="86"/> <source><br>Built at </source> - <translation type="finished"><br> construido en</translation> + <translation type="unfinished"></translation> </message> </context> <context> <name>IntroPage</name> <message> - <location filename="../../src/ui/Wizard.cpp" line="111"/> + <location filename="../../src/ui/Wizard.cpp" line="66"/> <source>Getting Started...</source> - <translation type="finished">Empezando...</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="112"/> + <location filename="../../src/ui/Wizard.cpp" line="67"/> <source>... with GPGFrontend</source> - <translation type="finished">... con gpgfrontend</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="114"/> + <location filename="../../src/ui/Wizard.cpp" line="69"/> <source>Welcome to use GPGFrontend for decrypting and signing text or file!</source> - <translation type="finished">¡Bienvenido a usar GPGFRontend para descifrar y firmar texto o archivo!</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="116"/> + <location filename="../../src/ui/Wizard.cpp" line="71"/> <source>is a Powerful, Easy-to-Use, Compact, Cross-Platform, and Installation-Free OpenPGP Crypto Tool.</source> - <translation type="finished">Es una herramienta CRYPTO OpenPGP Potente, fácil de usar, compacta, multiplataforma y sin instalación.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="117"/> + <location filename="../../src/ui/Wizard.cpp" line="72"/> <source>For brief information have a look at the</source> - <translation type="finished">Para obtener información breve, eche un vistazo a la</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="118"/> + <location filename="../../src/ui/Wizard.cpp" line="74"/> <source>Overview</source> - <translation type="finished">Descripción general</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="119"/> + <location filename="../../src/ui/Wizard.cpp" line="75"/> <source>by clicking the link, the page will open in the web browser</source> - <translation type="finished">Al hacer clic en el enlace, la página se abrirá en el navegador web.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="127"/> + <location filename="../../src/ui/Wizard.cpp" line="83"/> <source>Choose a Language</source> - <translation type="finished">Elegir un idioma</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -635,182 +724,161 @@ <message> <location filename="../../src/ui/keypair_details/KeyDetailsDialog.cpp" line="31"/> <source>KeyPair</source> - <translation type="finished">Par de claves</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyDetailsDialog.cpp" line="32"/> <source>UIDs</source> - <translation type="finished">Uids</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyDetailsDialog.cpp" line="33"/> <source>Subkeys</source> - <translation type="finished">Subcecheras</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyDetailsDialog.cpp" line="40"/> <source>Key Details</source> - <translation type="finished">Detalles clave</translation> + <translation type="unfinished"></translation> </message> </context> <context> <name>KeyGenDialog</name> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="32"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="33"/> <source>Generate Key</source> - <translation type="finished">Generar clave</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="68"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="69"/> <source> Name must contain at least five characters. </source> - <translation type="finished">El nombre debe contener al menos cinco caracteres.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="70"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="71"/> <source> Please give a email address. </source> - <translation type="finished">Por favor, proporcione una dirección de correo electrónico.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="77"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="78"/> <source> Expiration time no more than 2 years. </source> - <translation type="finished">Tiempo de vencimiento No más de 2 años.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="103"/> - <source>Generating Key...</source> - <translation type="finished">Generando llave ...</translation> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="112"/> + <source>Success</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="106"/> - <source>Collecting random data for key generation. - This may take a while. - To speed up the process use your computer - (e.g. browse the net, listen to music,...)</source> - <translation type="finished">Recogiendo datos aleatorios para la generación de claves. - Esto puede tardar un rato. - Para acelerar el proceso, use su computadora. - (Por ejemplo, navega por la red, escucha música, ...)</translation> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="112"/> + <source>The new key pair has been generated.</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="150"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="116"/> + <source>Failure</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="145"/> <source>Key Usage</source> - <translation type="finished">Uso clave</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="152"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="147"/> <source>Encryption</source> - <translation type="unfinished"/> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="155"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="150"/> <source>Signing</source> - <translation type="finished">Firma</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="158"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="153"/> <source>Certification</source> - <translation type="finished">Certificación</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="161"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="156"/> <source>Authentication</source> - <translation type="finished">Autenticación</translation> - </message> - <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="312"/> - <source>Success</source> - <translation type="finished">Éxito</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="312"/> - <source>The new key pair has been generated.</source> - <translation type="finished">Se ha generado el nuevo par de llaves.</translation> - </message> - <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="314"/> - <source>Failure</source> - <translation type="finished">Falla</translation> - </message> - <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="314"/> - <source>An error occurred during key generation.</source> - <translation type="finished">Se produjo un error durante la generación de claves.</translation> - </message> - <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="350"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="338"/> <source>Name:</source> - <translation type="finished">Nombre:</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="351"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="339"/> <source>Email Address:</source> - <translation type="finished">Dirección de correo electrónico:</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="352"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="340"/> <source>Comment:</source> - <translation type="finished">Comentario:</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="353"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="341"/> <source>Expiration Date:</source> - <translation type="finished">Fecha de caducidad:</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="354"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="342"/> <source>Never Expire</source> - <translation type="finished">Nunca expira</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="355"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="343"/> <source>KeySize (in Bit):</source> - <translation type="finished">Keysize (en bit):</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="356"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="344"/> <source>Key Type:</source> - <translation type="finished">Tipo de llave:</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="357"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="345"/> <source>Non Pass Phrase</source> - <translation type="finished">Frase sin paso</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="370"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="358"/> <source>Basic Information</source> - <translation type="finished">Información básica</translation> + <translation type="unfinished"></translation> </message> </context> <context> <name>KeyGenPage</name> <message> - <location filename="../../src/ui/Wizard.cpp" line="366"/> + <location filename="../../src/ui/Wizard.cpp" line="183"/> <source>Create a keypair...</source> - <translation type="finished">Crea un keypair ...</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="367"/> + <location filename="../../src/ui/Wizard.cpp" line="184"/> <source>...for decrypting and signing messages</source> - <translation type="finished">... para descifrar y firmar mensajes</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="368"/> + <location filename="../../src/ui/Wizard.cpp" line="185"/> <source>You should create a new keypair.The pair consists of a public and a private key.<br>Other users can use the public key to encrypt messages for you and verify messages signed by you.You can use the private key to decrypt and sign messages.<br>For more information have a look at the offline tutorial (which then is shown in the main window):</source> - <translation type="finished">Debe crear un nuevo teclado. El par consiste en una clave pública y privada. Otros usuarios pueden usar la clave pública para cifrar mensajes para usted y verificar los mensajes firmados por usted. Puede usar la clave privada para descifrar y firmarMensajes. Para más información, eche un vistazo al tutorial fuera de línea (que luego se muestra en la ventana principal):</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="375"/> + <location filename="../../src/ui/Wizard.cpp" line="192"/> <source>Offline tutorial</source> - <translation type="finished">Tutorial fuera de línea</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="382"/> + <location filename="../../src/ui/Wizard.cpp" line="199"/> <source>Create New Key</source> - <translation type="finished">Crear nueva llave</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -819,429 +887,442 @@ <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="34"/> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="53"/> <source>Key Update Details</source> - <translation type="finished">Detalles de actualización clave</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="34"/> <source>No keys found</source> - <translation type="finished">No se han encontrado llaves</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="36"/> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="55"/> <source>Key Import Details</source> - <translation type="finished">Detalles de importación clave</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="36"/> <source>No keys found to import</source> - <translation type="finished">No se han encontrado llaves para importar</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="64"/> <source>General key info</source> - <translation type="finished">Información general de clave</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="67"/> <source>Considered:</source> - <translation type="unfinished"/> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="71"/> <source>Public unchanged:</source> - <translation type="finished">Público sin cambios:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="76"/> <source>Imported:</source> - <translation type="unfinished"/> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="81"/> <source>Not imported:</source> - <translation type="finished">No importado:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="86"/> <source>Private read:</source> - <translation type="finished">LEER PRIVADO:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="91"/> <source>Private imported:</source> - <translation type="finished">Importado privado:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="96"/> <source>Private unchanged:</source> - <translation type="finished">Privado sin cambios:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="111"/> <source>Name</source> - <translation type="finished">Nombre</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="111"/> <source>Email</source> - <translation type="finished">Correo electrónico</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="111"/> <source>Status</source> - <translation type="finished">Estado</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="111"/> <source>Fingerprint</source> - <translation type="finished">Huella dactilar</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="135"/> <source>private</source> - <translation type="unfinished"/> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="138"/> <source>public</source> - <translation type="unfinished"/> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="141"/> <source>unchanged</source> - <translation type="finished">sin alterar</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="144"/> <source>new key</source> - <translation type="finished">nueva llave</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="147"/> <source>new subkey</source> - <translation type="finished">Nueva Subkey</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="151"/> <source>new signature</source> - <translation type="finished">nueva firma</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="155"/> <source>new uid</source> - <translation type="finished">Nuevo uid</translation> + <translation type="unfinished"></translation> </message> </context> <context> <name>KeyList</name> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="77"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="76"/> <source>Select</source> - <translation type="finished">Seleccione</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="77"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="76"/> <source>Type</source> - <translation type="finished">Tipo</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="77"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="76"/> <source>Name</source> - <translation type="finished">Nombre</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="77"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="76"/> <source>Email Address</source> - <translation type="finished">Dirección de correo electrónico</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="78"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="77"/> <source>Usage</source> - <translation type="finished">Uso</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="78"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="77"/> <source>Validity</source> - <translation type="finished">Validez</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="78"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="77"/> <source>Finger Print</source> - <translation type="finished">Huella dactilar</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="315"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="302"/> <source>Import Keys</source> - <translation type="finished">Teclas de importación</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="317"/> - <source>You've dropped something on the table. + <location filename="../../src/ui/widgets/KeyList.cpp" line="305"/> + <source>You've dropped something on the table. GpgFrontend will now try to import key(s).</source> - <translation type="finished">Has dejado caer algo sobre la mesa. - GPGFRontend ahora intentará importar la (s) clave (s).</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="320"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="308"/> <source>Always import without bothering.</source> - <translation type="finished">Siempre importar sin molestarse.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="356"/> - <source>Couldn't Open File: </source> - <translation type="finished">No se pudo abrir el archivo:</translation> + <location filename="../../src/ui/widgets/KeyList.cpp" line="341"/> + <source>Couldn't Open File: </source> + <translation type="unfinished"></translation> </message> </context> <context> <name>KeyMgmt</name> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="81"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="82"/> <source>Key Pair Management</source> - <translation type="finished">Gestión de pares clave</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="88"/> <source>&Open</source> - <translation type="finished">&Abierto</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="89"/> <source>Ctrl+O</source> - <translation type="finished">Ctrl + o</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="90"/> <source>Open Key File</source> - <translation type="finished">Abrir archivo de clave</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="93"/> <source>&Close</source> - <translation type="finished">&Cerca</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="94"/> <source>Ctrl+Q</source> - <translation type="finished">Ctrl + Q</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="96"/> <source>Close</source> - <translation type="finished">Cerca</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="99"/> <source>New Keypair</source> - <translation type="finished">Nuevo llave</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="100"/> <source>Ctrl+N</source> - <translation type="finished">Ctrl + n</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="102"/> <source>Generate KeyPair</source> - <translation type="finished">Generar par de claves</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="105"/> <source>New Subkey</source> - <translation type="finished">Nueva Subkey</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="106"/> <source>Ctrl+Shift+N</source> - <translation type="finished">CTRL + MAYÚS + N</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="108"/> <source>Generate Subkey For Selected KeyPair</source> - <translation type="finished">Generar subclave para la tecla seleccionada.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="111"/> - <location filename="../../src/ui/KeyMgmt.cpp" line="152"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="151"/> <source>&File</source> - <translation type="finished">&Archivo</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="113"/> <source>Import New Key From File</source> - <translation type="finished">Importar nueva llave desde el archivo</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="116"/> <source>&Clipboard</source> - <translation type="finished">&Portapapeles</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="118"/> <source>Import New Key From Clipboard</source> - <translation type="finished">Importar nueva llave desde el portapapeles</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="121"/> <source>&Keyserver</source> - <translation type="finished">& Keyserver</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="123"/> <source>Import New Key From Keyserver</source> - <translation type="finished">Importar nueva llave de Keyserver</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="126"/> <source>Export To &Clipboard</source> - <translation type="finished">Exportar al portapapeles</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="128"/> <source>Export Selected Key(s) To Clipboard</source> - <translation type="finished">Exportar la (s) clave (s) seleccionada (s) al portapapeles</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="131"/> <source>Export To &File</source> - <translation type="finished">Exportar a & Archivo</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="133"/> <source>Export Selected Key(s) To File</source> - <translation type="finished">Exportar clave seleccionada (s) para archivar</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="136"/> <source>Delete Selected Key(s)</source> - <translation type="finished">Eliminar la (s) clave seleccionada (s)</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="137"/> <source>Delete the Selected keys</source> - <translation type="finished">Eliminar las teclas seleccionadas</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="140"/> <source>Delete Checked Key(s)</source> - <translation type="finished">Eliminar la (s) clave de verificación (s)</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="141"/> <source>Delete the Checked keys</source> - <translation type="finished">Eliminar las teclas marcadas</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="145"/> <source>Show Key Details</source> - <translation type="finished">Mostrar detalles clave</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="146"/> <source>Show Details for this Key</source> - <translation type="finished">Mostrar detalles para esta clave</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="156"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="155"/> <source>&Key</source> - <translation type="finished">&Clave</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="157"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="156"/> <source>&Generate Key</source> - <translation type="finished">Generar clave</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="161"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="160"/> <source>&Import Key</source> - <translation type="finished">E importar clave</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="173"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="171"/> <source>Key</source> - <translation type="finished">Clave</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="181"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="179"/> <source>Generate</source> - <translation type="finished">Generar</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="182"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="180"/> <source>Generate A New Keypair or Subkey</source> - <translation type="finished">Generar un nuevo teclado o suba.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="191"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="189"/> <source>Import key</source> - <translation type="finished">Tecla de importación</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="192"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="190"/> <source>Import Key</source> - <translation type="finished">Tecla de importación</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="213"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="209"/> <source>Open Key</source> - <translation type="finished">Llave abierta</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="213"/> - <location filename="../../src/ui/KeyMgmt.cpp" line="299"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="210"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="302"/> <source>Key Files</source> - <translation type="finished">Archivos clave</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="213"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="210"/> <source>Keyring files</source> - <translation type="finished">Archivos de llavero</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="218"/> - <source>Couldn't Open File: </source> - <translation type="finished">No se pudo abrir el archivo:</translation> + <location filename="../../src/ui/KeyMgmt.cpp" line="216"/> + <source>Couldn't Open File: </source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="268"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="262"/> <source>Deleting Keys</source> - <translation type="finished">Eliminar llaves</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="269"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="263"/> <source>Are you sure that you want to delete the following keys?</source> - <translation type="finished">¿Está seguro de que desea eliminar las siguientes teclas?</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="270"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="265"/> <source>The action can not be undone.</source> - <translation type="finished">La acción no se puede deshacer.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="299"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="281"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="296"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="344"/> + <source>Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/KeyMgmt.cpp" line="281"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="296"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="344"/> + <source>Key Not Found.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/KeyMgmt.cpp" line="301"/> <source>Export Key To File</source> - <translation type="finished">Clave de exportación a archivo</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="309"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="312"/> <source>key(s) exported</source> - <translation type="finished">llave (s) exportada</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="338"/> - <location filename="../../src/ui/KeyMgmt.cpp" line="345"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="349"/> <source>Invalid Operation</source> - <translation type="finished">Operación inválida</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="339"/> <source>Please select one KeyPair before doing this operation.</source> - <translation type="finished">Por favor seleccione una tecla antes de hacer esta operación.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="346"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="350"/> <source>If a key pair does not have a private key then it will not be able to generate sub-keys.</source> - <translation type="finished">Si un par de claves no tiene una clave privada, no podrá generar sub-llaves.</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -1249,34 +1330,34 @@ <message> <location filename="../../src/ui/keypair_details/KeyNewUIDDialog.cpp" line="40"/> <source>Name</source> - <translation type="finished">Nombre</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyNewUIDDialog.cpp" line="41"/> <source>Email</source> - <translation type="finished">Correo electrónico</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyNewUIDDialog.cpp" line="42"/> <source>Comment</source> - <translation type="finished">Comentario</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyNewUIDDialog.cpp" line="55"/> <source>Create New UID</source> - <translation type="finished">Crear nuevo uid</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyNewUIDDialog.cpp" line="68"/> <source> Name must contain at least five characters. </source> - <translation type="finished">El nombre debe contener al menos cinco caracteres.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyNewUIDDialog.cpp" line="70"/> <source> Please give a email address. </source> - <translation type="finished">Por favor, proporcione una dirección de correo electrónico.</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -1284,202 +1365,212 @@ <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="34"/> <source>Owner</source> - <translation type="unfinished"/> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="35"/> <source>Master Key</source> - <translation type="finished">Llave maestra</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="36"/> <source>Fingerprint</source> - <translation type="finished">Huella dactilar</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="37"/> <source>Additional UIDs</source> - <translation type="finished">UIDS adicionales</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="58"/> <source>Exists</source> - <translation type="finished">Existe</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="58"/> <source>Not Exists</source> - <translation type="finished">No existe</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="83"/> <source>Name:</source> - <translation type="finished">Nombre:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="84"/> <source>Email Address:</source> - <translation type="finished">Dirección de correo electrónico:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="85"/> <source>Comment:</source> - <translation type="finished">Comentario:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="90"/> <source>Key ID: </source> - <translation type="finished">ID clave:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="91"/> <source>Algorithm: </source> - <translation type="finished">Algoritmo:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="92"/> <source>Key Size:</source> - <translation type="finished">Tamaño de la llave:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="93"/> <source>Nominal Usage: </source> - <translation type="finished">Uso nominal:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="94"/> <source>Actual Usage: </source> - <translation type="finished">Uso actual:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="95"/> <source>Expires on: </source> - <translation type="finished">Expira el:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="96"/> <source>Last Update: </source> - <translation type="finished">Última actualización:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="97"/> <source>Secret Key Existence: </source> - <translation type="finished">Existencia clave secreta:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="121"/> <source>Copy</source> - <translation type="finished">Dupdo</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="123"/> <source>copy fingerprint to clipboard</source> - <translation type="finished">Copia la huella digital al portapapeles</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="133"/> <source>Operations</source> - <translation type="finished">Operaciones</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="136"/> <source>Export Private Key (Include Subkey)</source> - <translation type="finished">Clave privada de exportación (incluir subclave)</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="141"/> <source>Modify Expiration Datetime (Master Key)</source> - <translation type="finished">Modificar fecha de vencimiento (clave maestra)</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="146"/> <source>Key Server Operation (Pubkey)</source> - <translation type="finished">Operación del servidor clave (Pubkey)</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="149"/> <source>Generate Revoke Certificate</source> - <translation type="finished">Genera revocar certificado</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="175"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="174"/> <source>Warning: The Master Key has expired.</source> - <translation type="finished">Advertencia: la clave maestra ha caducado.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="178"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="177"/> <source>Warning: The Master Key has been revoked</source> - <translation type="finished">Advertencia: la clave maestra ha sido revocada</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="202"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="201"/> <source>Exporting private Key</source> - <translation type="finished">Exportación de clave privada</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="203"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="202"/> <source>You are about to export your</source> - <translation type="finished">Estás a punto de exportar tu</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="204"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="203"/> <source>PRIVATE KEY</source> - <translation type="finished">LLAVE PRIVADA</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="205"/> - <source>This is NOT your Public Key, so DON'T give it away.</source> - <translation type="finished">Esta no es su clave pública, así que no lo desye.</translation> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="204"/> + <source>This is NOT your Public Key, so DON'T give it away.</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="206"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="205"/> <source>Do you REALLY want to export your PRIVATE KEY?</source> - <translation type="finished">¿Realmente quieres exportar tu clave privada?</translation> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="219"/> + <source>Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="219"/> + <source>Key Not Found.</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="221"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="224"/> <source>Export Key To File</source> - <translation type="finished">Clave de exportación a archivo</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="222"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="225"/> <source>Key Files</source> - <translation type="finished">Archivos clave</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="225"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="228"/> <source>Export Error</source> - <translation type="finished">Error de exportación</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="225"/> - <source>Couldn't open %1 for writing</source> - <translation type="finished">No se pudo abrir% 1 por escrito.</translation> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="228"/> + <source>Couldn't open %1 for writing</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="295"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="298"/> <source>Never Expire</source> - <translation type="finished">Nunca expira</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="315"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="318"/> <source>Upload Key Pair to Key Server</source> - <translation type="finished">Cargar un par de claves para clave del servidor</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="317"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="320"/> <source>Update Key Pair</source> - <translation type="finished">Actualizar par de claves</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="340"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="343"/> <source>Generate revocation certificate</source> - <translation type="finished">Generar certificado de revocación</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="343"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="346"/> <source>Revocation Certificates</source> - <translation type="finished">Certificados de revocación</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -1487,87 +1578,87 @@ <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="37"/> <source>Generate A New Subkey</source> - <translation type="finished">Generar una nueva subclave</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="54"/> <source>Key ID: </source> - <translation type="finished">ID clave:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="55"/> <source>Algorithm: </source> - <translation type="finished">Algoritmo:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="56"/> <source>Key Size:</source> - <translation type="finished">Tamaño de la llave:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="57"/> <source>Usage: </source> - <translation type="finished">Uso:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="58"/> <source>Expires On </source> - <translation type="finished">Expira el</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="59"/> <source>Last Update: </source> - <translation type="finished">Última actualización:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="60"/> <source>Existence: </source> - <translation type="finished">Existencia:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="61"/> <source>Fingerprint: </source> - <translation type="finished">Huella dactilar:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="121"/> <source>Subkey ID</source> - <translation type="finished">ID de suba</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="121"/> <source>Key Size</source> - <translation type="finished">Tamaño de la llave</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="121"/> <source>Algo</source> - <translation type="finished">Algo</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="121"/> <source>Create Date</source> - <translation type="finished">Fecha de Creación</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="121"/> <source>Expire Date</source> - <translation type="finished">Fecha de caducidad</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="161"/> + <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="160"/> <source>Never Expire</source> - <translation type="finished">Nunca expira</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="185"/> + <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="184"/> <source>Never Expires</source> - <translation type="finished">Nunca expira</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="231"/> + <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="230"/> <source>Edit Expire Date</source> - <translation type="finished">Editar fecha de vencimiento</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -1575,64 +1666,64 @@ <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="39"/> <source>New UID</source> - <translation type="finished">Nuevo uid</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="40"/> <source>UID Management</source> - <translation type="finished">Gestión UID</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="59"/> <source>UIDs</source> - <translation type="finished">Uids</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="67"/> <source>Signature of Selected UID</source> - <translation type="finished">Firma de UID seleccionado</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="103"/> <source>Select</source> - <translation type="finished">Seleccione</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="103"/> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="126"/> <source>Name</source> - <translation type="finished">Nombre</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="103"/> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="126"/> <source>Email</source> - <translation type="finished">Correo electrónico</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="103"/> <source>Comment</source> - <translation type="finished">Comentario</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="126"/> <source>Key ID</source> - <translation type="finished">ID clave</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="126"/> <source>Create Date</source> - <translation type="finished">Fecha de Creación</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="126"/> <source>Expired Date</source> - <translation type="finished">Fecha de vencimiento</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="219"/> <source>Never Expires</source> - <translation type="finished">Nunca expira</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="237"/> @@ -1642,33 +1733,33 @@ <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="480"/> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="487"/> <source>Invalid Operation</source> - <translation type="finished">Operación inválida</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="238"/> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="301"/> <source>Please select one or more UIDs before doing this operation.</source> - <translation type="finished">Seleccione uno o más UID antes de hacer esta operación.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="263"/> <source>Sign Selected UID(s)</source> - <translation type="finished">Signo de uid seleccionado (s)</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="265"/> <source>Delete Selected UID(s)</source> - <translation type="finished">Eliminar UID seleccionado (s)</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="284"/> <source>Successful Operation</source> - <translation type="finished">Operación exitosa</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="285"/> <source>Successfully added a new UID.</source> - <translation type="finished">Agregó con éxito un nuevo UID.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="288"/> @@ -1677,7 +1768,7 @@ <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="460"/> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="507"/> <source>Operation Failed</source> - <translation type="finished">Operación fallida</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="289"/> @@ -1686,17 +1777,17 @@ <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="461"/> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="508"/> <source>An error occurred during the operation.</source> - <translation type="finished">Se produjo un error durante la operación.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="313"/> <source>Deleting UIDs</source> - <translation type="finished">Eliminar UIDS</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="314"/> <source>Are you sure that you want to delete the following uids?</source> - <translation type="finished">¿Está seguro de que desea eliminar los siguientes uids?</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="315"/> @@ -1704,73 +1795,73 @@ <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="454"/> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="501"/> <source>The action can not be undone.</source> - <translation type="finished">La acción no se puede deshacer.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="355"/> <source>Set Primary UID</source> - <translation type="finished">Establecer uid primario</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="356"/> <source>Are you sure that you want to set the Primary UID to?</source> - <translation type="finished">¿Está seguro de que desea configurar el UID primario para?</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="395"/> <source>Set As Primary</source> - <translation type="finished">Establecer como primario</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="397"/> <source>Sign UID</source> - <translation type="finished">Muestra uid</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="399"/> <source>Delete UID</source> - <translation type="finished">Eliminar uid</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="426"/> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="441"/> <source>Please select one UID before doing this operation.</source> - <translation type="finished">Por favor, seleccione una UID antes de hacer esta operación.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="452"/> <source>Deleting UID</source> - <translation type="finished">Eliminar uid</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="453"/> <source>Are you sure that you want to delete the following uid?</source> - <translation type="finished">¿Está seguro de que desea eliminar el siguiente UID?</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="469"/> <source>Delete(Revoke) Key Signature</source> - <translation type="finished">Eliminar (revocar) Firma clave</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="481"/> <source>Please select one Key Signature before doing this operation.</source> - <translation type="finished">Seleccione una firma clave antes de hacer esta operación.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="488"/> <source>To delete the signature, you need to have its corresponding public key in the local database.</source> - <translation type="finished">Para eliminar la firma, debe tener su clave pública correspondiente en la base de datos local.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="499"/> <source>Deleting Key Signature</source> - <translation type="finished">Eliminar la firma clave</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="500"/> <source>Are you sure that you want to delete the following signature?</source> - <translation type="finished">¿Está seguro de que desea eliminar la siguiente firma?</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -1778,140 +1869,140 @@ <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="40"/> <source>&Close</source> - <translation type="finished">&Cerca</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="41"/> <source>&Import ALL</source> - <translation type="finished">E importar todos</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="42"/> <source>&Search</source> - <translation type="finished">&Buscar</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="45"/> <source>Search String:</source> - <translation type="finished">Cadena de búsqueda:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="49"/> <source>Key Server:</source> - <translation type="finished">Servidor de teclas:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="97"/> <source>Update Keys from Keyserver</source> - <translation type="finished">Actualizar las teclas de Keyserver</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="99"/> <source>Import Keys from Keyserver</source> - <translation type="finished">Importar claves de Keyserver</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="158"/> <source>UID</source> - <translation type="finished">Uid</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="158"/> <source>Creation date</source> - <translation type="finished">Fecha de creación</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="158"/> <source>KeyID</source> - <translation type="finished">Keyid</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="158"/> <source>Tag</source> - <translation type="finished">Etiqueta</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="179"/> <source>Text is empty.</source> - <translation type="finished">El texto está vacío.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="213"/> <source>Not Key Found</source> - <translation type="finished">No se encuentra clave</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="216"/> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="386"/> <source>Timeout</source> - <translation type="finished">Se acabó el tiempo</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="219"/> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="389"/> <source>Key Server Not Found</source> - <translation type="finished">Servidor de teclas no encontrado</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="222"/> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="392"/> <source>Connection Error</source> - <translation type="finished">Error de conexión</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="230"/> <source>Too many responses from keyserver!</source> - <translation type="finished">Demasiadas respuestas de Keyserver!</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="237"/> <source>No keys found, input may be kexId, retrying search with 0x.</source> - <translation type="finished">No se han encontrado llaves, la entrada puede ser kexid, volviendo a intentar la búsqueda con 0x.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="242"/> <source>No keys found containing the search string!</source> - <translation type="finished">¡No se han encontrado llaves que contengan la cadena de búsqueda!</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="246"/> <source>Insufficiently specific search string!</source> - <translation type="finished">Insuficientemente específica de la cadena de búsqueda!</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="274"/> <source>revoked</source> - <translation type="unfinished"/> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="277"/> <source>disabled</source> - <translation type="unfinished"/> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="317"/> <source><h4>%1 keys found. Double click a key to import it.</h4></source> - <translation type="finished"><h4>% 1 llaves encontradas.Haga doble clic en una tecla para importarlo. </ H4></translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="383"/> <source>Key Not Found</source> - <translation type="finished">Clave no encontrada</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="410"/> <source><h4>Key Updated</h4></source> - <translation type="finished"><H4> Tecla actualizada </ h4></translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="412"/> <source><h4>Key Imported</h4></source> - <translation type="finished"><H4> Clave importado </ h4></translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="473"/> <source>Upload Keys from Keyserver</source> - <translation type="finished">Subir claves de Keyserver</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -1919,22 +2010,22 @@ <message> <location filename="../../src/ui/keypair_details/KeySetExpireDateDialog.cpp" line="36"/> <source>Confirm</source> - <translation type="finished">Confirmar</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeySetExpireDateDialog.cpp" line="41"/> <source>Never Expire</source> - <translation type="finished">Nunca expira</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeySetExpireDateDialog.cpp" line="61"/> <source>Operation Failed</source> - <translation type="finished">Operación fallida</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeySetExpireDateDialog.cpp" line="62"/> <source>An error occurred during the operation.</source> - <translation type="finished">Se produjo un error durante la operación.</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -1942,73 +2033,93 @@ <message> <location filename="../../src/ui/keypair_details/KeyUIDSignDialog.cpp" line="72"/> <source>Expire Date</source> - <translation type="finished">Fecha de caducidad</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyUIDSignDialog.cpp" line="81"/> - <source>Sign For Key's UID(s)</source> - <translation type="finished">Signo para uid (s) de clave (s)</translation> + <source>Sign For Key's UID(s)</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyUIDSignDialog.cpp" line="100"/> + <location filename="../../src/ui/keypair_details/KeyUIDSignDialog.cpp" line="99"/> <source>Unsuccessful Operation</source> - <translation type="finished">Operación fallida</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyUIDSignDialog.cpp" line="101"/> + <location filename="../../src/ui/keypair_details/KeyUIDSignDialog.cpp" line="100"/> <source>Signature operation failed for UID </source> - <translation type="finished">La operación de la firma falló por UID</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyUIDSignDialog.cpp" line="108"/> + <location filename="../../src/ui/keypair_details/KeyUIDSignDialog.cpp" line="107"/> <source>Operation Complete</source> - <translation type="finished">Operación completa</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyUIDSignDialog.cpp" line="109"/> + <location filename="../../src/ui/keypair_details/KeyUIDSignDialog.cpp" line="108"/> <source>The signature operation of the UID is complete</source> - <translation type="finished">El funcionamiento de la firma del UID está completo.</translation> + <translation type="unfinished"></translation> </message> </context> <context> <name>KeyUploadDialog</name> <message> - <location filename="../../src/ui/KeyUploadDialog.cpp" line="49"/> + <location filename="../../src/ui/KeyUploadDialog.cpp" line="47"/> <source>Uploading Public Key</source> - <translation type="finished">Subiendo la clave pública</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyUploadDialog.cpp" line="112"/> + <location filename="../../src/ui/KeyUploadDialog.cpp" line="110"/> <source>Key Not Found</source> - <translation type="finished">Clave no encontrada</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyUploadDialog.cpp" line="115"/> + <location filename="../../src/ui/KeyUploadDialog.cpp" line="113"/> <source>Timeout</source> - <translation type="finished">Se acabó el tiempo</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyUploadDialog.cpp" line="118"/> + <location filename="../../src/ui/KeyUploadDialog.cpp" line="116"/> <source>Key Server Not Found</source> - <translation type="finished">Servidor de teclas no encontrado</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyUploadDialog.cpp" line="121"/> + <location filename="../../src/ui/KeyUploadDialog.cpp" line="119"/> <source>Connection Error</source> - <translation type="finished">Error de conexión</translation> + <translation type="unfinished"></translation> </message> </context> <context> <name>KeyserverTab</name> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="607"/> - <source>Default Key Server for import:</source> - <translation type="finished">Servidor de tecla predeterminado para importar:</translation> + <location filename="../../src/ui/settings/SettingsKeyServer.cpp" line="32"/> + <source>General</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/settings/SettingsKeyServer.cpp" line="53"/> + <source>No.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/settings/SettingsKeyServer.cpp" line="53"/> + <source>Address</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="624"/> + <location filename="../../src/ui/settings/SettingsKeyServer.cpp" line="53"/> + <source>Available</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/settings/SettingsKeyServer.cpp" line="57"/> + <source>Default Key Server for Import:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/settings/SettingsKeyServer.cpp" line="67"/> <source>Add</source> - <translation type="finished">Agregar</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -2016,890 +2127,1025 @@ <message> <location filename="../../src/MainWindow.cpp" line="35"/> <source>Loading Gnupg</source> - <translation type="finished">Cargando gnupg</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/MainWindow.cpp" line="62"/> <source>ENV Loading Failed</source> - <translation type="finished">Enviando env falla</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/MainWindow.cpp" line="63"/> <source>Gnupg is not installed correctly, please follow the ReadME instructions to install gnupg and then open GPGFrontend.</source> - <translation type="finished">GNUPG no está instalado correctamente, siga las instrucciones de README para instalar GNUPG y luego abrir GPGFRontend.</translation> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="36"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="40"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="44"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="114"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="127"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="131"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="135"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="196"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="212"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="216"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="220"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="294"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="326"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="331"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="335"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="383"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="396"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="400"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="404"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="501"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="513"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="517"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="521"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="583"/> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="51"/> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="112"/> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="126"/> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="218"/> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="231"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="525"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="541"/> + <source>Error</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="38"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="117"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="286"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="525"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="702"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="885"/> - <source>No Key Selected</source> - <translation type="finished">Sin llave seleccionada</translation> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="36"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="127"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="212"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="396"/> + <source>Select a file before doing it.</source> + <translation type="unfinished"></translation> </message> <message> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="40"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="131"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="216"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="400"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="517"/> + <source>No permission to read this file.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="44"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="135"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="220"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="404"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="521"/> + <source>No permission to create file.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="49"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="150"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="226"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="409"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="375"/> + <source>Warning</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="50"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="151"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="227"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="410"/> + <source>The target file already exists, do you need to overwrite it?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="62"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="239"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="422"/> <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="45"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="124"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="532"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="709"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="126"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="298"/> + <source>No Key Selected</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="69"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="246"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="52"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="133"/> <source>Invalid Operation</source> - <translation type="finished">Operación inválida</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="46"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="533"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="710"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="70"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="247"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="53"/> <source>The selected key contains a key that does not actually have a encrypt usage.<br/></source> - <translation type="finished">La clave seleccionada contiene una clave que en realidad no tiene un uso de cifrado. <br/></translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="47"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="126"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="300"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="534"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="711"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="899"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="71"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="248"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="436"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="54"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="135"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="312"/> <source><br/>For example the Following Key: <br/></source> - <translation type="finished"><br/> Por ejemplo, la siguiente clave: <br/></translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="65"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="554"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="91"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="72"/> <source>Encrypting</source> - <translation type="unfinished"/> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="94"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="368"/> - <source>Function Disabled</source> - <translation type="finished">Función desactivada</translation> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="114"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="196"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="294"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="383"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="501"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="583"/> + <source>An error occurred during operation.</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="95"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="369"/> - <source>Please go to the settings interface to enable and configure this function.</source> - <translation type="finished">Por favor, vaya a la interfaz de configuración para habilitar y configurar esta función.</translation> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="268"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="151"/> + <source>Signing</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="125"/> - <source>The selected key contains a key that does not actually have a signature usage.<br/></source> - <translation type="finished">La clave seleccionada contiene una clave que en realidad no tiene un uso de la firma. <br/></translation> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="327"/> + <source>Please select the appropriate target file or signature file. Ensure that both are in this directory.</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="142"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="731"/> - <source>Signing</source> - <translation type="finished">Firma</translation> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="331"/> + <source>No permission to read target file.</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="186"/> - <source>Decrypting</source> - <translation type="unfinished"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="335"/> + <source>No permission to read signature file.</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="246"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="816"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="353"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="259"/> <source>Verifying</source> - <translation type="finished">Verificar</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="298"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="897"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="434"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="310"/> <source>Invalid KeyPair</source> - <translation type="finished">Teclado no válido</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="299"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="898"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="435"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="311"/> <source>The selected keypair cannot be used for signing and encryption at the same time.<br/></source> - <translation type="finished">El teclado seleccionado no se puede utilizar para la firma y el cifrado al mismo tiempo. <br/></translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="310"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="317"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="909"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="916"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="446"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="453"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="322"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="329"/> <source>Incomplete Operation</source> - <translation type="finished">Operación incompleta</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="311"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="910"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="447"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="323"/> <source>None of the selected key pairs can provide the encryption function.</source> - <translation type="finished">Ninguno de los pares de teclas seleccionados puede proporcionar la función de cifrado.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="318"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="917"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="454"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="330"/> <source>None of the selected key pairs can provide the signature function.</source> - <translation type="finished">Ninguno de los pares de teclas seleccionados puede proporcionar la función de firma.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="335"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="936"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="473"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="365"/> <source>Encrypting and Signing</source> - <translation type="finished">Cifrado y firma</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="401"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="1014"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="513"/> + <source>Select a file(.gpg/.asc) before doing it.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="551"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="461"/> <source>Decrypting and Verifying</source> - <translation type="finished">Descifrar y verificar</translation> - </message> - <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="499"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="503"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="507"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="577"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="590"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="594"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="598"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="659"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="675"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="679"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="683"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="757"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="789"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="794"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="798"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="846"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="859"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="863"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="867"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="964"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="976"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="980"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="984"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="1046"/> - <source>Error</source> - <translation type="finished">Error</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="499"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="590"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="675"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="859"/> - <source>Select a file before doing it.</source> - <translation type="finished">Seleccione un archivo antes de hacerlo.</translation> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="43"/> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="155"/> + <source>Invalid Own Key</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="503"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="594"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="679"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="863"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="980"/> - <source>No permission to read this file.</source> - <translation type="finished">No hay permiso para leer este archivo.</translation> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="43"/> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="155"/> + <source>Own Key can not be use to do any operation.</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="507"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="598"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="683"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="867"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="984"/> - <source>No permission to create file.</source> - <translation type="finished">No hay permiso para crear un archivo.</translation> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="52"/> + <source>Please obtain a Service Token from the server in the settings.</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="512"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="613"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="689"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="872"/> - <source>Warning</source> - <translation type="finished">Advertencia</translation> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="91"/> + <source>Getting Cpt From Server</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="513"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="614"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="690"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="873"/> - <source>The target file already exists, do you need to overwrite it?</source> - <translation type="finished">El archivo objetivo ya existe, ¿necesita sobrescribirlo?</translation> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="113"/> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="219"/> + <source>The communication content with the server does not meet the requirements</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="577"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="659"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="757"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="846"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="964"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="1046"/> - <source>An error occurred during operation.</source> - <translation type="finished">Se produjo un error durante la operación.</translation> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="126"/> + <source>Invalid short ciphertext</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="790"/> - <source>Please select the appropriate target file or signature file. Ensure that both are in this directory.</source> - <translation type="finished">Por favor, seleccione el archivo de destino o firma apropiado.Asegúrese de que ambos estén en este directorio.</translation> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="144"/> + <source>Invalid Service Token</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="794"/> - <source>No permission to read target file.</source> - <translation type="finished">No hay permiso para leer el archivo de destino.</translation> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="145"/> + <source>Please go to the setting interface to get a ServiceToken.</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="798"/> - <source>No permission to read signature file.</source> - <translation type="finished">No hay permiso para leer el archivo de firma.</translation> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="203"/> + <source>Getting Scpt From Server</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="976"/> - <source>Select a file(.gpg/.asc) before doing it.</source> - <translation type="finished">Seleccione un archivo (.gpg / .asc) antes de hacerlo.</translation> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="228"/> + <source>Notice: Use Decrypt & Verify operation to decrypt this short crypto text.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="231"/> + <source>There is a problem with the communication with the server</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="1082"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="103"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="408"/> + <source>Function Disabled</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="104"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="409"/> + <source>Please go to the settings interface to enable and configure this function.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="134"/> + <source>The selected key contains a key that does not actually have a signature usage.<br/></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="186"/> + <source>Notice</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="186"/> + <source>Short Crypto Text only supports Decrypt & Verify.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="200"/> + <source>Decrypting</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="376"/> + <source>Automatic public key exchange failed.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="415"/> + <source>Service Token Empty</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="416"/> + <source>Please go to the settings interface to set Own Key and get Service Token.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="525"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="541"/> + <source>Key Not Found.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="572"/> <source>Outdated Version</source> - <translation type="finished">Versión desactualizada</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="1083"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="573"/> <source>This version(%1) is out of date, please update the latest version in time. </source> - <translation type="finished">Esta versión (% 1) está desactualizada, actualice la última versión en el tiempo.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="1085"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="1092"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="575"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="582"/> <source>You can download the latest version(%1) on Github Releases Page.<br/></source> - <translation type="finished">Puede descargar la última versión (% 1) en la página de lanzamientos GitHub. <br/></translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="1089"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="579"/> <source>Unreleased Version</source> - <translation type="finished">Versión inédita</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="1090"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="580"/> <source>This version(%1) has not been officially released and is not recommended for use in a production environment. <br/></source> - <translation type="finished">Esta versión (% 1) no se ha liberado oficialmente y no se recomienda para su uso en un entorno de producción.<br/></translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowSlotUI.cpp" line="58"/> <source>There is one unencrypted file in attachment folder</source> - <translation type="finished">Hay un archivo sin cifrado en la carpeta de archivos adjuntos</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowSlotUI.cpp" line="60"/> <source>There are </source> - <translation type="finished">Existen</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowSlotUI.cpp" line="60"/> <source> unencrypted files in attachment folder</source> - <translation type="finished">Archivos sin cifrar en la carpeta ADJUNTO</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="30"/> <source>&New</source> - <translation type="unfinished"/> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="36"/> <source>Open a new file</source> - <translation type="finished">Abrir un nuevo archivo</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="39"/> <source>&Open...</source> - <translation type="finished">&Abierto...</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="42"/> <source>Open an existing file</source> - <translation type="finished">Abra un archivo existente</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="45"/> <source>&Browser</source> - <translation type="unfinished"/> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="47"/> <source>Open a file browser</source> - <translation type="finished">Abra un navegador de archivos</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="50"/> <source>&Save</source> - <translation type="finished">&Ahorrar</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="53"/> <source>Save the current File</source> - <translation type="finished">Guarda el archivo actual</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="56"/> <source>Save &As</source> - <translation type="finished">Guardar como</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="59"/> <source>Save the current File as...</source> - <translation type="finished">Guarde el archivo actual como ...</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="62"/> <source>&Print</source> - <translation type="finished">&Impresión</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="65"/> <source>Print Document</source> - <translation type="finished">Imprimir documento</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="68"/> <source>&Close</source> - <translation type="finished">&Cerca</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="70"/> <source>Close file</source> - <translation type="finished">Cerrar el archivo</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="73"/> <source>&Quit</source> - <translation type="finished">&Dejar</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="76"/> <source>Quit Program</source> - <translation type="finished">Programa de dejar de fumar</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="81"/> <source>&Undo</source> - <translation type="finished">&Deshacer</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="83"/> <source>Undo Last Edit Action</source> - <translation type="finished">Deshacer Última edición de acción</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="86"/> <source>&Redo</source> - <translation type="finished">&Rehacer</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="88"/> <source>Redo Last Edit Action</source> - <translation type="finished">Rehacer la última acción de edición</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="91"/> <source>Zoom In</source> - <translation type="finished">Acercarse</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="95"/> <source>Zoom Out</source> - <translation type="finished">Disminuir el zoom</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="99"/> <source>&Paste</source> - <translation type="finished">&Pegar</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="102"/> <source>Paste Text From Clipboard</source> - <translation type="finished">Pegar texto del portapapeles</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="105"/> <source>Cu&t</source> - <translation type="finished">Con & t.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="108"/> - <source>Cut the current selection's contents to the clipboard</source> - <translation type="finished">Cortar los contenidos de la selección actual al portapapeles.</translation> + <source>Cut the current selection's contents to the clipboard</source> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="112"/> <source>&Copy</source> - <translation type="finished">&Dupdo</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="115"/> - <source>Copy the current selection's contents to the clipboard</source> - <translation type="finished">Copia los contenidos de la selección actual al portapapeles.</translation> + <source>Copy the current selection's contents to the clipboard</source> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="119"/> <source>&Quote</source> - <translation type="finished">& quot</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="121"/> <source>Quote whole text</source> - <translation type="finished">Cita todo el texto</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="124"/> <source>Select &All</source> - <translation type="finished">Seleccionar todo</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="127"/> <source>Select the whole text</source> - <translation type="finished">Seleccione todo el texto</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="130"/> <source>&Find</source> - <translation type="finished">&Encontrar</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="132"/> <source>Find a word</source> - <translation type="finished">Encontrar una palabra</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="135"/> <source>Remove &spacing</source> - <translation type="finished">Retirar y espaciar</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="138"/> <source>Remove double linebreaks, e.g. in pasted text from webmailer</source> - <translation type="finished">Retire las letras dobles, por ejemplo.En texto pegado desde Webmailer.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="141"/> <source>Se&ttings</source> - <translation type="finished">Y tutting</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="142"/> <source>Open settings dialog</source> - <translation type="finished">Abrir configuración de diálogo</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="148"/> <source>&Encrypt</source> - <translation type="finished">Y cifrar</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="151"/> <source>Encrypt Message</source> - <translation type="finished">Cifrar mensaje</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="154"/> <source>&Encrypt &Sign</source> - <translation type="finished">& Cifrar y firmar</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="157"/> <source>Encrypt and Sign Message</source> - <translation type="finished">Cifrar y firmar mensaje</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="160"/> <source>&Decrypt</source> - <translation type="finished">Y descifrar</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="163"/> <source>Decrypt Message</source> - <translation type="finished">Mensaje de descifra</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="166"/> <source>&Decrypt &Verify</source> - <translation type="finished">Y descifrar y verificar</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="169"/> <source>Decrypt and Verify Message</source> - <translation type="finished">Descifrar y verificar el mensaje</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="175"/> <source>&Encrypt File</source> - <translation type="finished">Cifrar archivo</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="176"/> <source>Encrypt File</source> - <translation type="finished">Cifrar archivo</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="179"/> <source>&Decrypt File</source> - <translation type="finished">Archivo de descifrado</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="180"/> <source>Decrypt File</source> - <translation type="finished">Archivo de descifrado</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="183"/> <source>&Sign File</source> - <translation type="finished">Y firmar archivo</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="184"/> <source>Sign File</source> - <translation type="finished">Archivo de firma</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="187"/> <source>&Verify File</source> - <translation type="finished">Y verificar el archivo</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="188"/> <source>Verify File</source> - <translation type="finished">Verificar archivo</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="192"/> <source>&Sign</source> - <translation type="finished">&Firmar</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="195"/> <source>Sign Message</source> - <translation type="finished">Mensaje de signo</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="198"/> <source>&Verify</source> - <translation type="finished">&Verificar</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="201"/> <source>Verify Message</source> - <translation type="finished">Verificar mensaje</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="207"/> <source>&Editor</source> - <translation type="unfinished"/> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="209"/> <source>Import New Key From Editor</source> - <translation type="finished">Importar nueva clave del editor</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="212"/> <source>Manage &Keys</source> - <translation type="finished">Gestión y llaves</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="214"/> <source>Open Keymanagement</source> - <translation type="finished">MANIFICACIÓN ABIERTA</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="220"/> <source>&About</source> - <translation type="finished">&Acerca de</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="222"/> - <source>Show the application's About box</source> - <translation type="finished">Muestra la siguiente aplicación</translation> + <source>Show the application's About box</source> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="228"/> <source>&Check for Updates</source> - <translation type="finished">Compruebe las actualizaciones</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="230"/> <source>Check for updates</source> - <translation type="finished">Compruebe las actualizaciones</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="233"/> <source>Open &Wizard</source> - <translation type="finished">Abierto y asistente</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="234"/> <source>Open the wizard</source> - <translation type="finished">Abrir el asistente</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="239"/> <source>Append Selected Key(s) To Text</source> - <translation type="finished">Anexar la (s) clave (s) seleccionada (s) al texto</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="240"/> <source>Append The Selected Keys To Text in Editor</source> - <translation type="finished">Anexar las teclas seleccionadas al texto en el editor</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="243"/> <source>Copy Email</source> - <translation type="finished">Copiar el correo electrónico</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="244"/> <source>Copy selected Email to clipboard</source> - <translation type="finished">Copia el correo electrónico seleccionado al portapapeles.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="248"/> <source>Show Key Details</source> - <translation type="finished">Mostrar detalles clave</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="249"/> <source>Show Details for this Key</source> - <translation type="finished">Mostrar detalles para esta clave</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="252"/> <source>Refresh Key From Key Server</source> - <translation type="finished">Actualizar la llave del servidor clave</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="253"/> <source>Refresh key from default key server</source> - <translation type="finished">Actualizar la tecla del servidor de clave predeterminado</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="256"/> <source>Upload Public Key(s) To Server</source> - <translation type="finished">Cargar la (s) clave pública al servidor</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="257"/> <source>Upload The Selected Public Keys To Server</source> - <translation type="finished">Sube las claves públicas seleccionadas para el servidor</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="272"/> <source>Remove PGP Header</source> - <translation type="finished">Retire el encabezado PGP</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="275"/> <source>Add PGP Header</source> - <translation type="finished">Añadir PGP Encabezado</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="280"/> <source>&File</source> - <translation type="finished">&Archivo</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="293"/> <source>&Edit</source> - <translation type="finished">&Editar</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="311"/> <source>&File...</source> - <translation type="finished">&Archivo...</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="317"/> <source>&Crypt</source> - <translation type="finished">&Cripta</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="328"/> <source>&Keys</source> - <translation type="finished">&Llaves</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="329"/> <source>&Import Key</source> - <translation type="finished">E importar clave</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="338"/> <source>&Steganography</source> - <translation type="finished">Steganography</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="347"/> <source>&View</source> - <translation type="finished">&Vista</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="349"/> <source>&Help</source> - <translation type="finished">&Ayudar</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="358"/> <source>File</source> - <translation type="finished">Archivo</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="366"/> <source>Crypt</source> - <translation type="finished">Cripta</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="376"/> <source>Key</source> - <translation type="finished">Clave</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="381"/> <source>Edit</source> - <translation type="finished">Editar</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="388"/> <source>Special Edit</source> - <translation type="finished">Edición especial</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="400"/> <source>Import key from...</source> - <translation type="finished">Clave de importación de ...</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="401"/> <source>Import key</source> - <translation type="finished">Tecla de importación</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="409"/> <source>Browser to view and operate file</source> - <translation type="finished">Navegador para ver y operar el archivo</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="410"/> <source>Browser</source> - <translation type="unfinished"/> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="428"/> <source>Ready</source> - <translation type="finished">Listo</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="435"/> <source>Key ToolBox</source> - <translation type="finished">Caja de herramientas clave</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="443"/> <source>Information Board</source> - <translation type="finished">Tarjeta de la información</translation> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>PubkeyGetter</name> + <message> + <location filename="../../src/server/api/PubkeyGetter.cpp" line="66"/> + <location filename="../../src/server/api/PubkeyGetter.cpp" line="90"/> + <source>Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/api/PubkeyGetter.cpp" line="67"/> + <location filename="../../src/server/api/PubkeyGetter.cpp" line="91"/> + <source>The communication content with the server does not meet the requirements</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>PubkeyUploader</name> + <message> + <location filename="../../src/server/api/PubkeyUploader.cpp" line="95"/> + <source>Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/api/PubkeyUploader.cpp" line="96"/> + <source>The communication content with the server does not meet the requirements</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/api/PubkeyUploader.cpp" line="103"/> + <source>Warning</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/api/PubkeyUploader.cpp" line="104"/> + <source>Partial failure of automatic pubkey exchange</source> + <translation type="unfinished"></translation> </message> </context> <context> <name>QApplication</name> <message> - <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="42"/> - <source>>Recipient: </source> - <translation type="finished">> Recipiente:</translation> + <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="66"/> + <source> {>} Recipient: </source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="35"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="61"/> <source>One or More Bad Signatures.</source> - <translation type="finished">Una o más firmas malas.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="40"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="66"/> <source>A </source> - <translation type="unfinished"/> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="42"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="68"/> <source>Good </source> - <translation type="finished">Bien</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="45"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="71"/> <source>Bad </source> - <translation type="unfinished"/> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="48"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="74"/> <source>Expired </source> - <translation type="unfinished"/> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="51"/> - <source>Missing Key's </source> - <translation type="finished">Llaves perdidas</translation> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="77"/> + <source>Missing Key's </source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="54"/> - <source>Revoked Key's </source> - <translation type="finished">Clave revocada</translation> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="80"/> + <source>Revoked Key's </source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="57"/> - <source>Expired Key's </source> - <translation type="finished">Key caducado</translation> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="83"/> + <source>Expired Key's </source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="60"/> - <source>Missing CRL's </source> - <translation type="finished">Falta CRL</translation> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="86"/> + <source>Missing CRL's </source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="64"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="90"/> <source>Signature Fully Valid.</source> - <translation type="finished">Firma totalmente válida.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="66"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="92"/> <source>Signature NOT Fully Valid.</source> - <translation type="finished">Firma no completamente válida.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="74"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="100"/> <source>Key is NOT present with ID 0x</source> - <translation type="finished">La llave no está presente con ID 0x</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="81"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="107"/> <source>A signature could NOT be verified due to a Missing Key </source> - <translation type="finished">No se pudo verificar una firma debido a una llave faltante.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="85"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="111"/> <source>A signature is valid but the key used to verify the signature has been revoked </source> - <translation type="finished">Una firma es válida, pero la clave utilizada para verificar la firma ha sido revocada</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="93"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="119"/> <source>A signature is valid but expired </source> - <translation type="finished">Una firma es válida pero caducada.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="100"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="126"/> <source>A signature is valid but the key used to verify the signature has expired. </source> - <translation type="finished">Una firma es válida, pero la clave utilizada para verificar la firma ha caducado.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="107"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="133"/> <source>There was some other error which prevented the signature verification. </source> - <translation type="finished">Hubo algún otro error que impidió la verificación de la firma.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="113"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="139"/> <source>Error for key with fingerprint </source> - <translation type="finished">Error a la llave con la huella digital</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="128"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="152"/> <source>Signed By: </source> - <translation type="finished">Firmado por:</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -2907,22 +3153,22 @@ <message> <location filename="../../src/ui/QuitDialog.cpp" line="29"/> <source>Unsaved Files</source> - <translation type="finished">Archivos no guardados</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/QuitDialog.cpp" line="77"/> <source>%1 files contain unsaved information.<br/>Save the changes before closing?</source> - <translation type="finished">% 1 Los archivos contienen información no guardada. <br/> ¡Guarda los cambios antes de cerrar?</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/QuitDialog.cpp" line="88"/> <source>Check the files you want to save:</source> - <translation type="finished">Compruebe los archivos que desea guardar:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/QuitDialog.cpp" line="89"/> - <source><b>Note:</b> If you don't save these files, all changes are lost.<br/></source> - <translation type="finished"><b> Nota: </ b> Si no guarda estos archivos, todos los cambios se pierden. <br/></translation> + <source><b>Note:</b> If you don't save these files, all changes are lost.<br/></source> + <translation type="unfinished"></translation> </message> </context> <context> @@ -2930,264 +3176,360 @@ <message> <location filename="../../src/ui/SendMailDialog.cpp" line="35"/> <source>Incomplete configuration</source> - <translation type="finished">Configuración incompleta</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/SendMailDialog.cpp" line="36"/> <source>The SMTP address is empty, please go to the setting interface to complete the configuration.</source> - <translation type="finished">La dirección SMTP está vacía, vaya a la interfaz de configuración para completar la configuración.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/SendMailDialog.cpp" line="86"/> <source> Recipient cannot be empty </source> - <translation type="finished">El destinatario no puede estar vacío</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/SendMailDialog.cpp" line="91"/> - <source> One or more Recipient's Email Address is invalid + <source> One or more Recipient's Email Address is invalid </source> - <translation type="finished">Una o más dirección de correo electrónico del destinatario no es válida</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/SendMailDialog.cpp" line="97"/> <source> Sender cannot be empty </source> - <translation type="finished">El remitente no puede estar vacío</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/SendMailDialog.cpp" line="99"/> - <source> Sender's Email Address is invalid + <source> Sender's Email Address is invalid </source> - <translation type="finished">La dirección de correo electrónico del remitente no es válida</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/SendMailDialog.cpp" line="155"/> <location filename="../../src/ui/SendMailDialog.cpp" line="160"/> <location filename="../../src/ui/SendMailDialog.cpp" line="165"/> <source>Fail</source> - <translation type="finished">Fallar</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/SendMailDialog.cpp" line="155"/> <source>Fail to Connect SMTP Server</source> - <translation type="finished">Falla en conectar el servidor SMTP</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/SendMailDialog.cpp" line="160"/> <source>Fail to Login into SMTP Server</source> - <translation type="finished">No iniciar sesión en el servidor SMTP</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/SendMailDialog.cpp" line="165"/> <source>Fail to Send Mail to SMTP Server</source> - <translation type="finished">No enviar correo al servidor SMTP</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/SendMailDialog.cpp" line="171"/> <source>Success</source> - <translation type="finished">Éxito</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/SendMailDialog.cpp" line="171"/> <source>Succeed in Sending Mail to SMTP Server</source> - <translation type="finished">Tener éxito en enviar correo al servidor SMTP</translation> + <translation type="unfinished"></translation> </message> </context> <context> <name>SendMailTab</name> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="289"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="33"/> <source>Enable</source> - <translation type="finished">Permitir</translation> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="51"/> + <source>Check Connection</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="311"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="53"/> + <source>General</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="54"/> + <source>Connection</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="55"/> + <source>Preference</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="61"/> <source>SMTP Address</source> - <translation type="finished">Dirección SMTP</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="313"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="63"/> <source>Username</source> - <translation type="finished">Nombre de usuario</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="315"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="65"/> <source>Password</source> - <translation type="finished">Contraseña</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="317"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="67"/> <source>Port</source> - <translation type="finished">Puerto</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="319"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="69"/> <source>Connection Security</source> - <translation type="finished">Seguridad de la conexión</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="322"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="75"/> <source>Default Sender</source> - <translation type="finished">Remitente predeterminado</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="404"/> - <location filename="../../src/ui/SettingsDialog.cpp" line="408"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="161"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="165"/> <source>Fail</source> - <translation type="finished">Fallar</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="404"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="161"/> <source>Fail to Connect SMTP Server</source> - <translation type="finished">Falla en conectar el servidor SMTP</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="408"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="165"/> <source>Fail to Login</source> - <translation type="finished">Falla en iniciar sesión</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="413"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="170"/> <source>Success</source> - <translation type="finished">Éxito</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="413"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="170"/> <source>Succeed in connecting and login</source> - <translation type="finished">Tener éxito en la conexión e inicio de sesión</translation> + <translation type="unfinished"></translation> </message> </context> <context> <name>SettingsDialog</name> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="40"/> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="39"/> <source>General</source> - <translation type="finished">General</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="41"/> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="40"/> <source>Appearance</source> - <translation type="finished">Apariencia</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="42"/> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="41"/> <source>Send Mail</source> - <translation type="finished">Enviar correo</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="43"/> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="42"/> <source>Key Server</source> - <translation type="finished">Servidor clave</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="45"/> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="44"/> <source>Advanced</source> - <translation type="unfinished"/> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="58"/> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="59"/> <source>Settings</source> - <translation type="finished">Ajustes</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="103"/> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="105"/> <source>System Default</source> - <translation type="finished">Sistema por defecto</translation> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>SignResultAnalyse</name> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="29"/> + <source>[#] Sign Operation </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="32"/> + <source>[Success]</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="34"/> + <source>[Failed] </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="43"/> + <source>[>] New Signature: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="47"/> + <source> Sign Mode: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="49"/> + <source>Normal</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="51"/> + <source>Clear</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="53"/> + <source>Detach</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="59"/> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="61"/> + <source> Signer: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="61"/> + <source><unknown></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="63"/> + <source> Public Key Algo: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="64"/> + <source> Hash Algo: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="65"/> + <source> Date & Time: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="75"/> + <source>Invalid Signers: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="79"/> + <source>[>] Signer: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="80"/> + <source> Fingerprint: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="81"/> + <source> Reason: </source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>SignersPicker</name> + <message> + <location filename="../../src/ui/widgets/SignersPicker.cpp" line="28"/> + <source>Confirm</source> + <translation type="unfinished"></translation> </message> </context> <context> <name>SubkeyGenerateDialog</name> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="46"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="47"/> <source>Generate New Subkey</source> - <translation type="finished">Generar nueva subclave</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="61"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="62"/> <source>Encryption</source> - <translation type="unfinished"/> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="64"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="65"/> <source>Signing</source> - <translation type="finished">Firma</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="67"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="68"/> <source>Certification</source> - <translation type="finished">Certificación</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="70"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="71"/> <source>Authentication</source> - <translation type="finished">Autenticación</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="114"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="115"/> <source>Expiration Date:</source> - <translation type="finished">Fecha de caducidad:</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="115"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="116"/> <source>Never Expire</source> - <translation type="finished">Nunca expira</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="116"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="117"/> <source>KeySize (in Bit):</source> - <translation type="finished">Keysize (en bit):</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="117"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="118"/> <source>Key Type:</source> - <translation type="finished">Tipo de llave:</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="126"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="127"/> <source>Basic Information</source> - <translation type="finished">Información básica</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="214"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="215"/> <source> Expiration time no more than 2 years. </source> - <translation type="finished">Tiempo de vencimiento No más de 2 años.</translation> - </message> - <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="235"/> - <source>Generating Subkey...</source> - <translation type="finished">Generando Subkey ...</translation> - </message> - <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="238"/> - <source>Collecting random data for subkey generation. - This may take a while. - To speed up the process use your computer - (e.g. browse the net, listen to music,...)</source> - <translation type="finished">Recogiendo datos aleatorios para la generación de suba. - Esto puede tardar un rato. - Para acelerar el proceso, use su computadora. - (Por ejemplo, navega por la red, escucha música, ...)</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="309"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="244"/> <source>Success</source> - <translation type="finished">Éxito</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="309"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="244"/> <source>The new subkey has been generated.</source> - <translation type="finished">La nueva subclave ha sido generada.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="311"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="247"/> <source>Failure</source> - <translation type="finished">Falla</translation> - </message> - <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="311"/> - <source>An error occurred during subkey generation.</source> - <translation type="finished">Se produjo un error durante la generación de sujetas.</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -3195,13 +3537,13 @@ <message> <location filename="../../src/ui/widgets/TextEdit.cpp" line="53"/> <source>untitled</source> - <translation type="unfinished"/> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/TextEdit.cpp" line="120"/> <location filename="../../src/ui/widgets/TextEdit.cpp" line="200"/> <source>Warning</source> - <translation type="finished">Advertencia</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/TextEdit.cpp" line="121"/> @@ -3209,84 +3551,95 @@ <location filename="../../src/ui/widgets/TextEdit.cpp" line="482"/> <source>Cannot read file %1: %2.</source> - <translation type="finished">No se puede leer el archivo% 1: -% 2.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/TextEdit.cpp" line="175"/> <source>Open file</source> - <translation type="finished">Abrir documento</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/TextEdit.cpp" line="251"/> <source>File</source> - <translation type="finished">Archivo</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/TextEdit.cpp" line="252"/> <source>Cannot write file %1: %2.</source> - <translation type="finished">No se puede escribir archivo% 1: -% 2.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/TextEdit.cpp" line="270"/> <source>Save file</source> - <translation type="finished">Guardar el archivo</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/TextEdit.cpp" line="333"/> <source>Unsaved document</source> - <translation type="finished">Documento no guardado</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/TextEdit.cpp" line="334"/> <source>The document "%1" has been modified. Do you want to save your changes?<br/></source> - <translation type="finished">El documento "% 1" ha sido modificado.¿Quieres guardar tus cambios? <br/></translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/TextEdit.cpp" line="337"/> - <source><b>Note:</b> If you don't save these files, all changes are lost.<br/></source> - <translation type="finished"><b> Nota: </ b> Si no guarda estos archivos, todos los cambios se pierden. <br/></translation> + <source><b>Note:</b> If you don't save these files, all changes are lost.<br/></source> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/TextEdit.cpp" line="481"/> <source>Application</source> - <translation type="finished">Solicitud</translation> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>UnknownSignersChecker</name> + <message> + <location filename="../../src/advance/UnknownSignersChecker.cpp" line="69"/> + <source>Warning</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/advance/UnknownSignersChecker.cpp" line="70"/> + <source>Automatic public key exchange failed.</source> + <translation type="unfinished"></translation> </message> </context> <context> <name>UpdateTab</name> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="127"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="129"/> <source>It is recommended that you always check the version of GpgFrontend and upgrade to the latest version.</source> - <translation type="finished">Se recomienda que siempre revise la versión de GPGFRontend y actualice a la última versión.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="129"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="131"/> <source>New versions not only represent new features, but also often represent functional and security fixes.</source> - <translation type="finished">Las nuevas versiones no solo representan nuevas características, sino que también representan correcciones funcionales y de seguridad.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="133"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="135"/> <source>Current Version: </source> - <translation type="finished">Versión actual:</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="141"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="143"/> <source>The current version is inconsistent with the latest version on github.</source> - <translation type="finished">La versión actual es inconsistente con la última versión en GitHub.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="143"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="145"/> <source>Please click <a href="https://github.com/saturneric/GpgFrontend/releases">here</a> to download the latest version.</source> - <translation type="finished">Haga clic en <a href="https://github.com/saturnic/gpgfrontend/releseses"> aquí </a> para descargar la última versión.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="187"/> - <location filename="../../src/ui/help/AboutDialog.cpp" line="209"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="199"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="214"/> <source>Latest Version From Github: </source> - <translation type="finished">Última versión de GitHub:</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -3294,32 +3647,32 @@ <message> <location filename="../../src/ui/VerifyDetailsDialog.cpp" line="32"/> <source>Signature Details</source> - <translation type="finished">Detalles de la firma</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/VerifyDetailsDialog.cpp" line="53"/> <source>Status: </source> - <translation type="finished">Estado:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/VerifyDetailsDialog.cpp" line="56"/> <source>No valid input found</source> - <translation type="finished">No se ha encontrado ninguna entrada válida</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/VerifyDetailsDialog.cpp" line="67"/> <source>Error Validating signature</source> - <translation type="finished">Error al validar la firma</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/VerifyDetailsDialog.cpp" line="70"/> <source>File was signed on %1 <br/> It Contains:<br/><br/></source> - <translation type="finished">El archivo se firmó en% 1 <br/>, contiene: <br/> <br/></translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/VerifyDetailsDialog.cpp" line="72"/> <source>Signed on %1 <br/> It Contains:<br /><br/></source> - <translation type="finished">Firmado en% 1 <br/> contiene: <br /> <br/></translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -3327,22 +3680,22 @@ <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="36"/> <source>Import from keyserver</source> - <translation type="finished">Import desde Keyserver</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="39"/> <source>Key not present with id 0x</source> - <translation type="finished">Llave no presente con id 0x</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="43"/> <source>Status:</source> - <translation type="finished">Estado:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="45"/> <source>Key not present in keylist</source> - <translation type="finished">Llave no presente en el keylist</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="58"/> @@ -3352,7 +3705,7 @@ <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="115"/> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="129"/> <source>Key Information is NOT Available</source> - <translation type="finished">La información clave no está disponible</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="60"/> @@ -3362,137 +3715,134 @@ <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="117"/> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="131"/> <source>Fingerprint: </source> - <translation type="finished">Huella dactilar:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="67"/> <source>Status: Cert Revoked</source> - <translation type="finished">Estado: CERT REVOCED</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="81"/> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="95"/> <source>Status: Signature Expired</source> - <translation type="finished">Estado: Firma expiró</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="96"/> <source>Status: Key Expired</source> - <translation type="finished">Estado: clave expirada</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="110"/> <source>Status: General Error</source> - <translation type="finished">Estado: Error general</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="124"/> <source>Status: Unknown Error</source> - <translation type="finished">Estado: error desconocido</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="159"/> <source>Signer Name:</source> - <translation type="finished">Nombre del firmante:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="160"/> <source>Signer Email:</source> - <translation type="finished">Correo electrónico del firmante:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="161"/> - <source>Key's Fingerprint:</source> - <translation type="finished">Huella digital de la llave:</translation> + <source>Key's Fingerprint:</source> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="162"/> <source>Valid:</source> - <translation type="unfinished"/> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="163"/> <source>Flags:</source> - <translation type="finished">Banderas:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="171"/> <source>Fully Valid</source> - <translation type="finished">Completamente válido</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="173"/> <source>NOT Fully Valid</source> - <translation type="finished">No completamente válido</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="180"/> <source>Good </source> - <translation type="finished">Bien</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="183"/> <source>Bad </source> - <translation type="unfinished"/> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="186"/> <source>Expired </source> - <translation type="unfinished"/> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="189"/> <source>Missing Key </source> - <translation type="finished">Llave faltante</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="192"/> <source>Revoked Key </source> - <translation type="finished">Clave revocada</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="195"/> <source>Expired Key </source> - <translation type="finished">Clave caducada</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="198"/> <source>Missing CRL </source> - <translation type="finished">Falta CRL</translation> + <translation type="unfinished"></translation> </message> </context> <context> - <name>Wizard</name> + <name>VerifyResultAnalyse</name> <message> - <location filename="../../src/ui/Wizard.cpp" line="46"/> - <source>First Start Wizard</source> - <translation type="finished">Asistente de primer inicio</translation> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="31"/> + <source>[#] Verify Operation </source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="76"/> - <source>Import Error</source> - <translation type="finished">Error de importación</translation> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="34"/> + <source>[Success]</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="76"/> - <source>Couldn't locate any keyring file in %1</source> - <translation type="finished">No se pudo localizar ningún archivo de llaves en% 1</translation> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="36"/> + <source>[Failed] </source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="84"/> - <location filename="../../src/ui/Wizard.cpp" line="95"/> - <source>Import error</source> - <translation type="finished">Error de importación</translation> - </message> - <message> - <location filename="../../src/ui/Wizard.cpp" line="85"/> - <source>Couldn't open private keyringfile: %1</source> - <translation type="finished">No se pudo abrir el archivo de llavero privado:% 1</translation> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="158"/> + <source><Unknown></source> + <translation type="unfinished"></translation> </message> +</context> +<context> + <name>Wizard</name> <message> - <location filename="../../src/ui/Wizard.cpp" line="96"/> - <source>Couldn't open public keyringfile: %1</source> - <translation type="finished">No se pudo abrir el archivo de llavero público:% 1</translation> + <location filename="../../src/ui/Wizard.cpp" line="40"/> + <source>First Start Wizard</source> + <translation type="unfinished"></translation> </message> </context> -</TS>
\ No newline at end of file +</TS> diff --git a/resource/ts/gpgfrontend_fr.ts b/resource/ts/gpgfrontend_fr.ts index fe49011a..8522c9be 100644 --- a/resource/ts/gpgfrontend_fr.ts +++ b/resource/ts/gpgfrontend_fr.ts @@ -6,7 +6,7 @@ <message> <location filename="../../src/ui/help/AboutDialog.cpp" line="35"/> <source>About </source> - <translation>À propos</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/help/AboutDialog.cpp" line="42"/> @@ -21,180 +21,291 @@ <message> <location filename="../../src/ui/help/AboutDialog.cpp" line="44"/> <source>Update</source> - <translation>Mettre à jour</translation> + <translation type="unfinished"></translation> </message> </context> <context> <name>AdvancedTab</name> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="679"/> - <source>Show Steganography Options [Advanced]</source> - <translation>Afficher les options de la stéganographie [avancée]</translation> + <location filename="../../src/ui/settings/SettingsAdvanced.cpp" line="34"/> + <source>Show Steganography Options</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="681"/> + <location filename="../../src/ui/settings/SettingsAdvanced.cpp" line="36"/> <source>Show Steganographic Options.</source> - <translation>Afficher les options stéganographiques.</translation> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/settings/SettingsAdvanced.cpp" line="40"/> + <source>Pubkey Exchange</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/settings/SettingsAdvanced.cpp" line="42"/> + <source>Auto Pubkey Exchange</source> + <translation type="unfinished"></translation> </message> </context> <context> <name>AppearanceTab</name> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="444"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="34"/> <source>Iconsize</source> - <translation>Isoniser.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="446"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="36"/> <source>small</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="447"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="37"/> <source>medium</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="448"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="38"/> <source>large</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="464"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="54"/> <source>Iconstyle</source> - <translation>Iconstyle</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="466"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="56"/> <source>just text</source> - <translation>juste du texte</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="467"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="57"/> <source>just icons</source> - <translation>juste des icônes</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="468"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="58"/> <source>text and icons</source> - <translation>Texte et icônes</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="484"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="74"/> <source>Windowstate</source> - <translation>Windowstate</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="487"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="77"/> <source>Save window size and position on exit.</source> - <translation>Enregistrer la taille de la fenêtre et la position à la sortie.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="495"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="85"/> <source>Information Board</source> - <translation>Tableau d'information</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="501"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="91"/> <source> Front Size</source> - <translation>Taille avant</translation> + <translation type="unfinished"></translation> </message> </context> <context> <name>ChoosePage</name> <message> - <location filename="../../src/ui/Wizard.cpp" line="165"/> + <location filename="../../src/ui/Wizard.cpp" line="121"/> <source>Choose your action...</source> - <translation>Choisissez votre action ...</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="166"/> + <location filename="../../src/ui/Wizard.cpp" line="122"/> <source>...by clicking on the appropriate link.</source> - <translation>... En cliquant sur le lien approprié.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="168"/> + <location filename="../../src/ui/Wizard.cpp" line="124"/> <source>If you have never used GPGFrontend before and also don't own a gpg key yet you may possibly want to read how to</source> - <translation>Si vous n'avez jamais utilisé GPGFRontend avant et que vous ne possédez pas encore une clé GPG, vous pouvez éventuellement vouloir lire comment</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="170"/> + <location filename="../../src/ui/Wizard.cpp" line="127"/> <source>Generate Key</source> - <translation>Générer une clé</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="176"/> + <location filename="../../src/ui/Wizard.cpp" line="134"/> <source>If you want to learn how to encrypt, decrypt, sign and verify text, you can read </source> - <translation>Si vous souhaitez apprendre à crypter, déchiffrer, signer et vérifier le texte, vous pouvez lire</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="178"/> + <location filename="../../src/ui/Wizard.cpp" line="136"/> <source>Encrypt & Decrypt Text</source> - <translation>Texte de chiffrement et de déchiffrement</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="178"/> - <location filename="../../src/ui/Wizard.cpp" line="190"/> + <location filename="../../src/ui/Wizard.cpp" line="136"/> + <location filename="../../src/ui/Wizard.cpp" line="149"/> <source>or</source> - <translation>ou alors</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="180"/> + <location filename="../../src/ui/Wizard.cpp" line="138"/> <source>Sign & Verify Text</source> - <translation>Signer et vérifier le texte</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="188"/> + <location filename="../../src/ui/Wizard.cpp" line="146"/> <source>If you want to operate file, you can read </source> - <translation>Si vous souhaitez utiliser un fichier, vous pouvez lire</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="190"/> + <location filename="../../src/ui/Wizard.cpp" line="149"/> <source>Encrypt & Sign File</source> - <translation>Crypypt et fichier de signe</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="192"/> + <location filename="../../src/ui/Wizard.cpp" line="152"/> <source>Sign & Verify File</source> - <translation>Signez et vérifiez le fichier</translation> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ComUtils</name> + <message> + <location filename="../../src/server/ComUtils.cpp" line="35"/> + <location filename="../../src/server/ComUtils.cpp" line="55"/> + <source>Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/ComUtils.cpp" line="35"/> + <source>Nothing Reply. Please check the Internet connection.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/ComUtils.cpp" line="55"/> + <source>Unknown Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/ComUtils.cpp" line="75"/> + <location filename="../../src/server/ComUtils.cpp" line="90"/> + <source>Network Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/ComUtils.cpp" line="75"/> + <source>Outdated Reply</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/ComUtils.cpp" line="87"/> + <source>Unknown Reason</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/ComUtils.cpp" line="90"/> + <source>Unknown Reply Format</source> + <translation type="unfinished"></translation> </message> </context> <context> <name>ConclusionPage</name> <message> - <location filename="../../src/ui/Wizard.cpp" line="407"/> + <location filename="../../src/ui/Wizard.cpp" line="224"/> <source>Ready.</source> - <translation>Prêt.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="408"/> + <location filename="../../src/ui/Wizard.cpp" line="225"/> <source>Have fun with GPGFrontend!</source> - <translation>Amusez-vous avec GPGFrontend!</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="410"/> + <location filename="../../src/ui/Wizard.cpp" line="227"/> <source>You are ready to use GPGFrontend now.<br><br></source> - <translation>Vous êtes prêt à utiliser GPGFronTend maintenant. <br> <br></translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="412"/> + <location filename="../../src/ui/Wizard.cpp" line="229"/> <source>The Online Document</source> - <translation>Le document en ligne</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="413"/> + <location filename="../../src/ui/Wizard.cpp" line="231"/> <source> will get you started with GPGFrontend. It will open in the main window.<br></source> - <translation>vous fera commencer par GPGFronTend.Il s'ouvrira dans la fenêtre principale. <br></translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="420"/> + <location filename="../../src/ui/Wizard.cpp" line="238"/> <source>Open offline help.</source> - <translation>Aide ouverte hors ligne.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="423"/> + <location filename="../../src/ui/Wizard.cpp" line="241"/> <source>Dont show the wizard again.</source> - <translation>Ne montrez pas à nouveau l'assistant.</translation> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>DecryptResultAnalyse</name> + <message> + <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="30"/> + <source>[#] Decrypt Operation </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="33"/> + <source>[Success]</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="35"/> + <source>[Failed] </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="39"/> + <source>Unsupported Algo: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="46"/> + <source>File Name: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="52"/> + <source>Recipient(s): </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="82"/> + <source> Keu ID: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="83"/> + <source> Public Algo: </source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>EncryptResultAnalyse</name> + <message> + <location filename="../../src/gpg/result_analyse/EncryptResultAnalyse.cpp" line="41"/> + <source>Invalid Recipients: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/EncryptResultAnalyse.cpp" line="44"/> + <source>Fingerprint: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/EncryptResultAnalyse.cpp" line="45"/> + <source>Reason: </source> + <translation type="unfinished"></translation> </message> </context> <context> @@ -202,99 +313,98 @@ <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="32"/> <source>Decrypt File</source> - <translation>Dossier de déchiffrement</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="34"/> <source>Encrypt File</source> - <translation>Chiffrer</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="36"/> <source>Sign File</source> - <translation>Fichier de signe</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="38"/> <source>Verify File</source> - <translation>Vérifier le fichier</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="47"/> <source>Input Parameters</source> - <translation>Paramètres d'entrée</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="53"/> <source>Target File</source> - <translation>Fichier cible</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="59"/> <source>Output File</source> - <translation>Fichier de sortie</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="75"/> <source>Signature File(.sig) Path</source> - <translation>Signature Fichier (.sig) chemin</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="134"/> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="177"/> <source>Open File</source> - <translation>Fichier ouvert</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="165"/> <source>Save File</source> - <translation>Enregistrer le fichier</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="194"/> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="245"/> <source>Couldn't open file</source> - <translation>Impossible d'ouvrir le fichier</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="213"/> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="224"/> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="235"/> <source>Error</source> - <translation>Erreur</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="214"/> <source>Error Occurred During Encryption</source> - <translation>Une erreur s'est produite lors du cryptage</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="225"/> <source>Error Occurred During Decryption</source> - <translation>Une erreur s'est produite lors du déchiffrement</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="236"/> <source>Error Occurred During Signature</source> - <translation>Une erreur s'est produite lors de la signature</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="259"/> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="268"/> <source>File</source> - <translation>Déposer</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="260"/> <source>File exists! Do you want to overwrite it?</source> - <translation>Le fichier existe!Voulez-vous vous écraser?</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="269"/> <source>Cannot write file %1: %2.</source> - <translation>Impossible d'écrire le fichier% 1: -% 2.</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -307,47 +417,47 @@ <message> <location filename="../../src/ui/widgets/FilePage.cpp" line="163"/> <source>Delete</source> - <translation>Effacer</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/FilePage.cpp" line="165"/> <source>Encrypt and Sign</source> - <translation>Chiffrer et signer</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/FilePage.cpp" line="167"/> <source>Decrypt and Verify</source> - <translation>Déchiffrer et vérifier</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/FilePage.cpp" line="169"/> <source>Only Sign</source> - <translation>Seulement signe</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/FilePage.cpp" line="171"/> <source>Only Verify</source> - <translation>Vérifiez seulement</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/FilePage.cpp" line="222"/> <source>Warning</source> - <translation>Avertissement</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/FilePage.cpp" line="223"/> <source>Are you sure you want to delete it?</source> - <translation>Es-tu sûr de vouloir le supprimer?</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/FilePage.cpp" line="233"/> <source>Error</source> - <translation>Erreur</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/FilePage.cpp" line="234"/> <source>Unable to delete the file or folder.</source> - <translation>Impossible de supprimer le fichier ou le dossier.</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -355,202 +465,179 @@ <message> <location filename="../../src/ui/FindWidget.cpp" line="38"/> <source>Find:</source> - <translation>Trouve:</translation> + <translation type="unfinished"></translation> </message> </context> <context> <name>GeneralTab</name> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="137"/> - <source>Remember Password</source> - <translation>Se souvenir du mot de passe</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="40"/> + <source>GpgFrontend Server</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="140"/> - <source>Remember password until closing gpg4usb</source> - <translation>Rappelez-vous le mot de passe jusqu'à la fermeture GPG4USB</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="45"/> + <source>Server that provides short key and key exchange services</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="147"/> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="52"/> <source>Save Checked Keys</source> - <translation>Sauvegarder les clés cochées</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="150"/> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="55"/> <source>Save checked private keys on exit and restore them on next start.</source> - <translation>Enregistrez des clés privées cochées sur sortie et restaurez-les au prochain démarrage.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="159"/> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="64"/> <source>Confirm drag'n'drop key import</source> - <translation>Confirmer l'importation principale de Drag'N'Drop</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="162"/> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="67"/> <source>Import files dropped on the keylist without confirmation.</source> - <translation>Les fichiers d'importation ont chuté sur la frappe sans confirmation.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="169"/> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="74"/> <source>Language</source> - <translation>Langue</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="178"/> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="83"/> <source><b>NOTE: </b> GpgFrontend will restart automatically if you change the language!</source> - <translation><B> REMARQUE: </ B> GPGFRontend redémarrera automatiquement si vous changez la langue!</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="187"/> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="92"/> <source>Own key</source> - <translation>Clé propre</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="195"/> - <source><none></source> - <translation><aucun></translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="96"/> + <source>Get Service Token</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="209"/> - <source>Key pair for synchronization and identity authentication</source> - <translation>Paire de clé pour la synchronisation et l'authentification d'identité</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="97"/> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="234"/> + <source>No Service Token Found</source> + <translation type="unfinished"></translation> </message> -</context> -<context> - <name>GpgME::GpgContext</name> <message> - <location filename="../../src/gpg/GpgContext.cpp" line="528"/> - <source>Wrong password</source> - <translation>Mauvais mot de passe</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="103"/> + <source><none></source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/GpgContext.cpp" line="536"/> - <source>Enter Password for</source> - <translation>Entrez le mot de passe pour</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="120"/> + <source>Key pair for synchronization and identity authentication</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/GpgContext.cpp" line="540"/> - <source>Enter Password</source> - <translation>Entrer le mot de passe</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="252"/> + <source>Invalid Operation</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/GpgContext.cpp" line="706"/> - <source>Key Selection</source> - <translation>Sélection de clé</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="253"/> + <source>Own Key can not be None while getting service token.</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/GpgContext.cpp" line="706"/> - <source>No Private Key Selected</source> - <translation>Aucune clé privée sélectionnée</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="265"/> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="336"/> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="353"/> + <source>Error</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/GpgContext.cpp" line="746"/> - <source>Error in signing:</source> - <translation>Erreur lors de la signature:</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="266"/> + <source>Key Not Exists</source> + <translation type="unfinished"></translation> </message> -</context> -<context> - <name>GpgPathsTab</name> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="711"/> - <source>Relative path to keydb</source> - <translation>Chemin relatif de Keydb</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="337"/> + <source>The communication content with the server does not meet the requirements</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="724"/> - <source>Current keydb path: </source> - <translation>Chemin de Keydb actuel:</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="350"/> + <source>Notice</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="729"/> - <source><b>NOTE: </b> Gpg4usb will restart automatically if you change the keydb path!</source> - <translation><B> REMARQUE: </ B> GPG4USB redémarrera automatiquement si vous modifiez le chemin Keydb!</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="351"/> + <source>Succeed in getting service token</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="758"/> - <source>Choose keydb directory</source> - <translation>Choisissez le répertoire Keydb</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="353"/> + <source>There is a problem with the communication with the server</source> + <translation type="unfinished"></translation> </message> </context> <context> - <name>ImportFromGnupgPage</name> - <message> - <location filename="../../src/ui/Wizard.cpp" line="302"/> - <source>Import keys...</source> - <translation>Keys d'importation ...</translation> - </message> - <message> - <location filename="../../src/ui/Wizard.cpp" line="303"/> - <source>...from existing GnuPG installation</source> - <translation>... de l'installation GNUPG existante</translation> - </message> - <message> - <location filename="../../src/ui/Wizard.cpp" line="305"/> - <source>You can import keys from a locally installed GnuPG.<br><br> The location is read from registry in Windows or assumed to be the .gnupg folder in the your home directory in Linux.<br></source> - <translation>Vous pouvez importer des clés à partir d'un GNUPG installé localement. <br> <br> <br> L'emplacement est lu depuis Registre sous Windows ou supposé être le dossier .gnupg dans votre annuaire de domicile sous Linux. <br></translation> - </message> - <message> - <location filename="../../src/ui/Wizard.cpp" line="309"/> - <source>Import keys from GnuPG</source> - <translation>Keys d'importation de gnupg</translation> - </message> + <name>GpgME::GpgContext</name> <message> - <location filename="../../src/ui/Wizard.cpp" line="323"/> - <source>Import Error</source> - <translation>Erreur d'importation</translation> + <location filename="../../src/gpg/gpg_context/GpgContext.cpp" line="184"/> + <source>Wrong password</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="323"/> - <source>Couldn't locate GnuPG home directory</source> - <translation>Ne pouvait pas localiser le répertoire de base gnupg</translation> + <location filename="../../src/gpg/gpg_context/GpgContext.cpp" line="192"/> + <source>Enter Password for</source> + <translation type="unfinished"></translation> </message> -</context> -<context> - <name>ImportFromGpg4usbPage</name> <message> - <location filename="../../src/ui/Wizard.cpp" line="225"/> - <source>Import from...</source> - <translation>Importer de...</translation> + <location filename="../../src/gpg/gpg_context/GpgContext.cpp" line="196"/> + <source>Enter Password</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="226"/> - <source>...existing GPGFrontend</source> - <translation>... GPGFronTend existant</translation> + <location filename="../../src/gpg/gpg_context/GpgContext.cpp" line="258"/> + <source>Processing</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="228"/> - <source>You can import keys and/or settings from existing GPGFrontend. <br><br>Just check what you want to import, click the import button and choose the directory of your other GPGFrontend in the appearing file dialog.</source> - <translation>Vous pouvez importer des clés et / ou des paramètres de GPGFronTend existant.<br> <br> Vérifiez simplement ce que vous souhaitez importer, cliquez sur le bouton Importer et choisissez le répertoire de votre autre GPGFronTend dans la boîte de dialogue de fichiers apparaissant.</translation> + <location filename="../../src/gpg/gpg_context/GpgContextBasicOpera.cpp" line="164"/> + <source>Key Selection</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="235"/> - <source>Keys</source> - <translation>Clés</translation> + <location filename="../../src/gpg/gpg_context/GpgContextBasicOpera.cpp" line="164"/> + <source>No Private Key Selected</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="239"/> - <source>Configuration</source> - <translation>Configuration</translation> + <location filename="../../src/gpg/gpg_context/GpgContextBasicOpera.cpp" line="195"/> + <source>Error in signing:</source> + <translation type="unfinished"></translation> </message> +</context> +<context> + <name>GpgPathsTab</name> <message> - <location filename="../../src/ui/Wizard.cpp" line="241"/> - <source>Import from GPGFrontend</source> - <translation>Importer de GPGFrontend</translation> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="139"/> + <source>Relative path to keydb</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="256"/> - <source>Other GPGFrontend directory</source> - <translation>Autre répertoire GPGFRONTEND</translation> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="152"/> + <source>Current keydb path: </source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="275"/> - <source>Configuration Imported</source> - <translation>Configuration importée</translation> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="157"/> + <source><b>NOTE: </b> Gpg4usb will restart automatically if you change the keydb path!</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="276"/> - <source>Imported Configuration from old GPGFrontend.<br>Will now restart to activate the configuration.</source> - <translation>Configuration importée d'Old GPGFronTend. <br> va maintenant redémarrer pour activer la configuration.</translation> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="186"/> + <source>Choose keydb directory</source> + <translation type="unfinished"></translation> </message> </context> <context> @@ -558,78 +645,78 @@ <message> <location filename="../../src/ui/widgets/InfoBoardWidget.cpp" line="40"/> <source>Import missing key from Keyserver</source> - <translation>Importer la clé manquante de Keyserver</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/InfoBoardWidget.cpp" line="57"/> - <source>Optional Actions Menu</source> - <translation>Menu Actions optionnelles</translation> + <source>Optional Actions</source> + <translation type="unfinished"></translation> </message> </context> <context> <name>InfoTab</name> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="74"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="76"/> <source><br><center>GPGFrontend is an easy-to-use, compact, cross-platform, <br>and installation-free gpg front-end tool.<br>It visualizes most of the common operations of gpg commands.<br>It's licensed under the GPL v3<br><br><b>Developer:</b><br>Saturneric<br><br>If you have any questions or suggestions, raise an issue<br/>at <a href="https://github.com/saturneric/GpgFrontend">GitHub</a> or send a mail to my mailing list at <a href="mailto:[email protected]">[email protected]</a>.</source> - <translation><br> <centre> GPGFronTend est un outil facile à utiliser, compact, plate-forme, <br> et sans installation GPG GPG GPG. Il visualise la plupart des opérations communes des commandes GPG. <br> Il est sous licence sous la GPL V3 <br> <B> Développeur: </ B> <br> <br> Saturneric <br> <br> Si vous avez des questions ou des suggestions, soulevez un problème <br/> à <Ahref = "https://github.com/saturneric/gpgfrontend"> github </a> ou envoyer un mail à ma liste de diffusion à <a href="[email protected]"> [email protected] </ a>.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="82"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="84"/> <source><br><br> Built with Qt </source> - <translation><br> <br> Construit avec QT</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="83"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="85"/> <source> and GPGME </source> - <translation>et gpgme</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="84"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="86"/> <source><br>Built at </source> - <translation><br> Construit à</translation> + <translation type="unfinished"></translation> </message> </context> <context> <name>IntroPage</name> <message> - <location filename="../../src/ui/Wizard.cpp" line="111"/> + <location filename="../../src/ui/Wizard.cpp" line="66"/> <source>Getting Started...</source> - <translation>Commencer...</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="112"/> + <location filename="../../src/ui/Wizard.cpp" line="67"/> <source>... with GPGFrontend</source> - <translation>... avec GPGFrontend</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="114"/> + <location filename="../../src/ui/Wizard.cpp" line="69"/> <source>Welcome to use GPGFrontend for decrypting and signing text or file!</source> - <translation>Bienvenue à utiliser GPGFronTend pour le déchiffrement et la signature de texte ou de fichier!</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="116"/> + <location filename="../../src/ui/Wizard.cpp" line="71"/> <source>is a Powerful, Easy-to-Use, Compact, Cross-Platform, and Installation-Free OpenPGP Crypto Tool.</source> - <translation>est une puissante, facile à utiliser, compacte, plate-forme multiplate-forme et sans installation.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="117"/> + <location filename="../../src/ui/Wizard.cpp" line="72"/> <source>For brief information have a look at the</source> - <translation>Pour de brèves informations, regardez le</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="118"/> + <location filename="../../src/ui/Wizard.cpp" line="74"/> <source>Overview</source> - <translation>Aperçu</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="119"/> + <location filename="../../src/ui/Wizard.cpp" line="75"/> <source>by clicking the link, the page will open in the web browser</source> - <translation>En cliquant sur le lien, la page s'ouvrira dans le navigateur Web.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="127"/> + <location filename="../../src/ui/Wizard.cpp" line="83"/> <source>Choose a Language</source> - <translation>Choisissez une langue</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -637,182 +724,161 @@ <message> <location filename="../../src/ui/keypair_details/KeyDetailsDialog.cpp" line="31"/> <source>KeyPair</source> - <translation>Clavier</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyDetailsDialog.cpp" line="32"/> <source>UIDs</source> - <translation>Uids</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyDetailsDialog.cpp" line="33"/> <source>Subkeys</source> - <translation>Souske</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyDetailsDialog.cpp" line="40"/> <source>Key Details</source> - <translation>Détails clés</translation> + <translation type="unfinished"></translation> </message> </context> <context> <name>KeyGenDialog</name> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="32"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="33"/> <source>Generate Key</source> - <translation>Générer une clé</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="68"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="69"/> <source> Name must contain at least five characters. </source> - <translation>Le nom doit contenir au moins cinq caractères.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="70"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="71"/> <source> Please give a email address. </source> - <translation>S'il vous plaît donner une adresse email.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="77"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="78"/> <source> Expiration time no more than 2 years. </source> - <translation>Heure d'expiration Pas plus de 2 ans.</translation> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="112"/> + <source>Success</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="103"/> - <source>Generating Key...</source> - <translation>Clé génératrice ...</translation> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="112"/> + <source>The new key pair has been generated.</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="106"/> - <source>Collecting random data for key generation. - This may take a while. - To speed up the process use your computer - (e.g. browse the net, listen to music,...)</source> - <translation>Collecte de données aléatoires pour la génération de clé. - Cela peut prendre un peu de temps. - Pour accélérer le processus, utilisez votre ordinateur - (E.G. Parcourir le Net, écoutez de la musique, ...)</translation> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="116"/> + <source>Failure</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="150"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="145"/> <source>Key Usage</source> - <translation>Usage de clé</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="152"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="147"/> <source>Encryption</source> - <translation>Chiffrement</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="155"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="150"/> <source>Signing</source> - <translation>Signature</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="158"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="153"/> <source>Certification</source> - <translation>Certification</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="161"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="156"/> <source>Authentication</source> - <translation>Authentification</translation> - </message> - <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="312"/> - <source>Success</source> - <translation>Succès</translation> - </message> - <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="312"/> - <source>The new key pair has been generated.</source> - <translation>La nouvelle paire de clés a été générée.</translation> - </message> - <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="314"/> - <source>Failure</source> - <translation>Échec</translation> - </message> - <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="314"/> - <source>An error occurred during key generation.</source> - <translation>Une erreur s'est produite lors de la génération de clé.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="350"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="338"/> <source>Name:</source> - <translation>Nom:</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="351"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="339"/> <source>Email Address:</source> - <translation>Adresse e-mail:</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="352"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="340"/> <source>Comment:</source> - <translation>Commenter:</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="353"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="341"/> <source>Expiration Date:</source> - <translation>Date d'expiration:</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="354"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="342"/> <source>Never Expire</source> - <translation>N'expire jamais</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="355"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="343"/> <source>KeySize (in Bit):</source> - <translation>Keysize (dans le bit):</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="356"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="344"/> <source>Key Type:</source> - <translation>Type de clé:</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="357"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="345"/> <source>Non Pass Phrase</source> - <translation>Non Pass Phrase</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="370"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="358"/> <source>Basic Information</source> - <translation>Informations de base</translation> + <translation type="unfinished"></translation> </message> </context> <context> <name>KeyGenPage</name> <message> - <location filename="../../src/ui/Wizard.cpp" line="366"/> + <location filename="../../src/ui/Wizard.cpp" line="183"/> <source>Create a keypair...</source> - <translation>Créer un keypair ...</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="367"/> + <location filename="../../src/ui/Wizard.cpp" line="184"/> <source>...for decrypting and signing messages</source> - <translation>... pour décrypter et signature des messages</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="368"/> + <location filename="../../src/ui/Wizard.cpp" line="185"/> <source>You should create a new keypair.The pair consists of a public and a private key.<br>Other users can use the public key to encrypt messages for you and verify messages signed by you.You can use the private key to decrypt and sign messages.<br>For more information have a look at the offline tutorial (which then is shown in the main window):</source> - <translation>Vous devriez créer un nouveau keypair.La Paire consiste en une clé publique et privée. <br> Les autres utilisateurs peuvent utiliser la clé publique pour chiffrer les messages pour vous et vérifier les messages signés par vous.Vous pouvez utiliser la clé privée pour déchiffrer et signerMessages. <br> Pour plus d'informations, consultez le tutoriel hors ligne (qui est ensuite affiché dans la fenêtre principale):</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="375"/> + <location filename="../../src/ui/Wizard.cpp" line="192"/> <source>Offline tutorial</source> - <translation>Tutoriel hors ligne</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="382"/> + <location filename="../../src/ui/Wizard.cpp" line="199"/> <source>Create New Key</source> - <translation>Créer une nouvelle clé</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -821,83 +887,83 @@ <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="34"/> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="53"/> <source>Key Update Details</source> - <translation>Détails de la mise à jour clés</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="34"/> <source>No keys found</source> - <translation>Pas de clés trouvées</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="36"/> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="55"/> <source>Key Import Details</source> - <translation>Détails des importations clés</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="36"/> <source>No keys found to import</source> - <translation>Aucune clé trouvée à l'importation</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="64"/> <source>General key info</source> - <translation>Info général de la clé</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="67"/> <source>Considered:</source> - <translation>Pris en considération:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="71"/> <source>Public unchanged:</source> - <translation>Public inchangé:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="76"/> <source>Imported:</source> - <translation>Importé:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="81"/> <source>Not imported:</source> - <translation>Non importé:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="86"/> <source>Private read:</source> - <translation>Lire privée:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="91"/> <source>Private imported:</source> - <translation>Privé importé:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="96"/> <source>Private unchanged:</source> - <translation>Privé inchangé:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="111"/> <source>Name</source> - <translation>Nom</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="111"/> <source>Email</source> - <translation>E-mail</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="111"/> <source>Status</source> - <translation>Statut</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="111"/> <source>Fingerprint</source> - <translation>Empreinte digitale</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="135"/> @@ -917,90 +983,89 @@ <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="144"/> <source>new key</source> - <translation>nouvelle clé</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="147"/> <source>new subkey</source> - <translation>Nouvelle sous-clé</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="151"/> <source>new signature</source> - <translation>nouvelle signature</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="155"/> <source>new uid</source> - <translation>Nouveau UID</translation> + <translation type="unfinished"></translation> </message> </context> <context> <name>KeyList</name> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="77"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="76"/> <source>Select</source> - <translation>Sélectionner</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="77"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="76"/> <source>Type</source> - <translation>Taper</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="77"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="76"/> <source>Name</source> - <translation>Nom</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="77"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="76"/> <source>Email Address</source> - <translation>Adresse e-mail</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="78"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="77"/> <source>Usage</source> - <translation>Usage</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="78"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="77"/> <source>Validity</source> - <translation>Validité</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="78"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="77"/> <source>Finger Print</source> - <translation>Empreinte digitale</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="315"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="302"/> <source>Import Keys</source> - <translation>Clés d'importation</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="317"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="305"/> <source>You've dropped something on the table. GpgFrontend will now try to import key(s).</source> - <translation>Vous avez laissé tomber quelque chose sur la table. - GPGFronTend va maintenant essayer d'importer des clés (s).</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="320"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="308"/> <source>Always import without bothering.</source> - <translation>Toujours importer sans déranger.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="356"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="341"/> <source>Couldn't Open File: </source> - <translation>Impossible d'ouvrir le fichier:</translation> + <translation type="unfinished"></translation> </message> </context> <context> <name>KeyMgmt</name> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="81"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="82"/> <source>Key Pair Management</source> - <translation>Gestion des paires de clés</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="88"/> @@ -1010,240 +1075,254 @@ <message> <location filename="../../src/ui/KeyMgmt.cpp" line="89"/> <source>Ctrl+O</source> - <translation>Ctrl + o</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="90"/> <source>Open Key File</source> - <translation>Ouvrir le fichier de clé</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="93"/> <source>&Close</source> - <translation>&Fermer</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="94"/> <source>Ctrl+Q</source> - <translation>Ctrl + q</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="96"/> <source>Close</source> - <translation>Fermer</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="99"/> <source>New Keypair</source> - <translation>Nouveau keypair</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="100"/> <source>Ctrl+N</source> - <translation>Ctrl + n</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="102"/> <source>Generate KeyPair</source> - <translation>Générer une paire de clés</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="105"/> <source>New Subkey</source> - <translation>Nouvelle sous-clé</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="106"/> <source>Ctrl+Shift+N</source> - <translation>Ctrl + Maj + n</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="108"/> <source>Generate Subkey For Selected KeyPair</source> - <translation>Générer de sous-clé pour sélectionner le clavier sélectionné</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="111"/> - <location filename="../../src/ui/KeyMgmt.cpp" line="152"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="151"/> <source>&File</source> - <translation>&Déposer</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="113"/> <source>Import New Key From File</source> - <translation>Importer une nouvelle clé à partir de fichier</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="116"/> <source>&Clipboard</source> - <translation>& Presse-papiers</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="118"/> <source>Import New Key From Clipboard</source> - <translation>Importer une nouvelle clé de Presse-papiers</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="121"/> <source>&Keyserver</source> - <translation>& Keyserver</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="123"/> <source>Import New Key From Keyserver</source> - <translation>Importer une nouvelle clé de Keyserver</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="126"/> <source>Export To &Clipboard</source> - <translation>Exporter vers le presse-papier</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="128"/> <source>Export Selected Key(s) To Clipboard</source> - <translation>Exporter des touches sélectionnées dans le presse-papier</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="131"/> <source>Export To &File</source> - <translation>Exporter vers & Fichier</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="133"/> <source>Export Selected Key(s) To File</source> - <translation>Exporter la ou les touches sélectionnées dans le fichier</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="136"/> <source>Delete Selected Key(s)</source> - <translation>Supprimer la ou les touches sélectionnées</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="137"/> <source>Delete the Selected keys</source> - <translation>Supprimer les touches sélectionnées</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="140"/> <source>Delete Checked Key(s)</source> - <translation>Supprimer les touches vérifiées</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="141"/> <source>Delete the Checked keys</source> - <translation>Supprimer les clés cochées</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="145"/> <source>Show Key Details</source> - <translation>Afficher les détails de la clé</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="146"/> <source>Show Details for this Key</source> - <translation>Afficher les détails de cette clé</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="156"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="155"/> <source>&Key</source> - <translation>&Clé</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="157"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="156"/> <source>&Generate Key</source> - <translation>Générer une clé</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="161"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="160"/> <source>&Import Key</source> - <translation>Clé d'importation</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="173"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="171"/> <source>Key</source> - <translation>Clé</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="181"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="179"/> <source>Generate</source> - <translation>produire</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="182"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="180"/> <source>Generate A New Keypair or Subkey</source> - <translation>Générer un nouveau clavier ou une nouvelle sous-clé</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="191"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="189"/> <source>Import key</source> - <translation>Clé d'importation</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="192"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="190"/> <source>Import Key</source> - <translation>Clé d'importation</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="213"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="209"/> <source>Open Key</source> - <translation>Touche ouverte</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="213"/> - <location filename="../../src/ui/KeyMgmt.cpp" line="299"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="210"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="302"/> <source>Key Files</source> - <translation>Fichiers clés</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="213"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="210"/> <source>Keyring files</source> - <translation>Fichiers de porte-clés</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="218"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="216"/> <source>Couldn't Open File: </source> - <translation>Impossible d'ouvrir le fichier:</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="268"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="262"/> <source>Deleting Keys</source> - <translation>Suppression des clés</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="269"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="263"/> <source>Are you sure that you want to delete the following keys?</source> - <translation>Êtes-vous sûr de vouloir supprimer les clés suivantes?</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="270"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="265"/> <source>The action can not be undone.</source> - <translation>L'action ne peut pas être annulée.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="299"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="281"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="296"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="344"/> + <source>Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/KeyMgmt.cpp" line="281"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="296"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="344"/> + <source>Key Not Found.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/KeyMgmt.cpp" line="301"/> <source>Export Key To File</source> - <translation>Exporter la clé pour déposer</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="309"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="312"/> <source>key(s) exported</source> - <translation>clé (s) exportée (s)</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="338"/> - <location filename="../../src/ui/KeyMgmt.cpp" line="345"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="349"/> <source>Invalid Operation</source> - <translation>Opération invalide</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="339"/> <source>Please select one KeyPair before doing this operation.</source> - <translation>Veuillez sélectionner un clavier avant de faire cette opération.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="346"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="350"/> <source>If a key pair does not have a private key then it will not be able to generate sub-keys.</source> - <translation>Si une paire de clés n'a pas de clé privée, elle ne pourra pas générer des sous-clés.</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -1251,34 +1330,34 @@ <message> <location filename="../../src/ui/keypair_details/KeyNewUIDDialog.cpp" line="40"/> <source>Name</source> - <translation>Nom</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyNewUIDDialog.cpp" line="41"/> <source>Email</source> - <translation>E-mail</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyNewUIDDialog.cpp" line="42"/> <source>Comment</source> - <translation>Commenter</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyNewUIDDialog.cpp" line="55"/> <source>Create New UID</source> - <translation>Créer de nouveaux uid</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyNewUIDDialog.cpp" line="68"/> <source> Name must contain at least five characters. </source> - <translation>Le nom doit contenir au moins cinq caractères.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyNewUIDDialog.cpp" line="70"/> <source> Please give a email address. </source> - <translation>S'il vous plaît donner une adresse email.</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -1286,202 +1365,212 @@ <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="34"/> <source>Owner</source> - <translation>Propriétaire</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="35"/> <source>Master Key</source> - <translation>La clef maitresse</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="36"/> <source>Fingerprint</source> - <translation>Empreinte digitale</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="37"/> <source>Additional UIDs</source> - <translation>UID supplémentaires</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="58"/> <source>Exists</source> - <translation>Existe</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="58"/> <source>Not Exists</source> - <translation>N'existe pas</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="83"/> <source>Name:</source> - <translation>Nom:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="84"/> <source>Email Address:</source> - <translation>Adresse e-mail:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="85"/> <source>Comment:</source> - <translation>Commenter:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="90"/> <source>Key ID: </source> - <translation>ID de clé:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="91"/> <source>Algorithm: </source> - <translation>Algorithme:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="92"/> <source>Key Size:</source> - <translation>Taille de la clé:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="93"/> <source>Nominal Usage: </source> - <translation>Utilisation nominale:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="94"/> <source>Actual Usage: </source> - <translation>Utilisation réelle:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="95"/> <source>Expires on: </source> - <translation>Expire le:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="96"/> <source>Last Update: </source> - <translation>Dernière mise à jour:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="97"/> <source>Secret Key Existence: </source> - <translation>Existence de clé secrète:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="121"/> <source>Copy</source> - <translation>Copie</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="123"/> <source>copy fingerprint to clipboard</source> - <translation>Copier l'empreinte digitale dans le presse-papier</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="133"/> <source>Operations</source> - <translation>Exploitation</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="136"/> <source>Export Private Key (Include Subkey)</source> - <translation>Exporter une clé privée (inclure la sous-clé)</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="141"/> <source>Modify Expiration Datetime (Master Key)</source> - <translation>Modifier l'expiration DateTime (clé principale)</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="146"/> <source>Key Server Operation (Pubkey)</source> - <translation>Fonctionnement du serveur clé (Pubkey)</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="149"/> <source>Generate Revoke Certificate</source> - <translation>Générer un certificat de révocation</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="175"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="174"/> <source>Warning: The Master Key has expired.</source> - <translation>AVERTISSEMENT: la clé principale a expiré.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="178"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="177"/> <source>Warning: The Master Key has been revoked</source> - <translation>AVERTISSEMENT: la clé principale a été révoquée</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="202"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="201"/> <source>Exporting private Key</source> - <translation>Exportation de la clé privée</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="203"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="202"/> <source>You are about to export your</source> - <translation>Vous êtes sur le point d'exporter votre</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="204"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="203"/> <source>PRIVATE KEY</source> - <translation>CLÉ PRIVÉE</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="205"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="204"/> <source>This is NOT your Public Key, so DON'T give it away.</source> - <translation>Ce n'est pas votre clé publique, alors ne le donnez pas.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="206"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="205"/> <source>Do you REALLY want to export your PRIVATE KEY?</source> - <translation>Voulez-vous vraiment exporter votre clé privée?</translation> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="219"/> + <source>Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="219"/> + <source>Key Not Found.</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="221"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="224"/> <source>Export Key To File</source> - <translation>Exporter la clé pour déposer</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="222"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="225"/> <source>Key Files</source> - <translation>Fichiers clés</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="225"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="228"/> <source>Export Error</source> - <translation>Erreur d'exportation</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="225"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="228"/> <source>Couldn't open %1 for writing</source> - <translation>Ne pouvait pas ouvrir% 1 pour écrire</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="295"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="298"/> <source>Never Expire</source> - <translation>N'expire jamais</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="315"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="318"/> <source>Upload Key Pair to Key Server</source> - <translation>Télécharger la paire de touches sur le serveur de clés</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="317"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="320"/> <source>Update Key Pair</source> - <translation>Mettre à jour la paire de clés</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="340"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="343"/> <source>Generate revocation certificate</source> - <translation>Générer un certificat de révocation</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="343"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="346"/> <source>Revocation Certificates</source> - <translation>Certificats de révocation</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -1489,87 +1578,87 @@ <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="37"/> <source>Generate A New Subkey</source> - <translation>Générer une nouvelle sous-clé</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="54"/> <source>Key ID: </source> - <translation>ID de clé:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="55"/> <source>Algorithm: </source> - <translation>Algorithme:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="56"/> <source>Key Size:</source> - <translation>Taille de la clé:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="57"/> <source>Usage: </source> - <translation>Usage:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="58"/> <source>Expires On </source> - <translation>Expire le</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="59"/> <source>Last Update: </source> - <translation>Dernière mise à jour:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="60"/> <source>Existence: </source> - <translation>Existence:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="61"/> <source>Fingerprint: </source> - <translation>Empreinte digitale:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="121"/> <source>Subkey ID</source> - <translation>Adresse de sous-clé</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="121"/> <source>Key Size</source> - <translation>Taille de clé</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="121"/> <source>Algo</source> - <translation>Quelque chose</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="121"/> <source>Create Date</source> - <translation>créer un rendez-vous</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="121"/> <source>Expire Date</source> - <translation>Date d'expiration</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="161"/> + <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="160"/> <source>Never Expire</source> - <translation>N'expire jamais</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="185"/> + <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="184"/> <source>Never Expires</source> - <translation>N'expire jamais</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="231"/> + <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="230"/> <source>Edit Expire Date</source> - <translation>Modifier la date d'expire</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -1577,64 +1666,64 @@ <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="39"/> <source>New UID</source> - <translation>Nouveau UID</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="40"/> <source>UID Management</source> - <translation>Gestion UID</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="59"/> <source>UIDs</source> - <translation>Uids</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="67"/> <source>Signature of Selected UID</source> - <translation>Signature de l'UID sélectionné</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="103"/> <source>Select</source> - <translation>Sélectionner</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="103"/> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="126"/> <source>Name</source> - <translation>Nom</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="103"/> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="126"/> <source>Email</source> - <translation>E-mail</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="103"/> <source>Comment</source> - <translation>Commenter</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="126"/> <source>Key ID</source> - <translation>Identifiant de clé</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="126"/> <source>Create Date</source> - <translation>créer un rendez-vous</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="126"/> <source>Expired Date</source> - <translation>Date d'expiration</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="219"/> <source>Never Expires</source> - <translation>N'expire jamais</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="237"/> @@ -1644,33 +1733,33 @@ <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="480"/> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="487"/> <source>Invalid Operation</source> - <translation>Opération invalide</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="238"/> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="301"/> <source>Please select one or more UIDs before doing this operation.</source> - <translation>Veuillez sélectionner un ou plusieurs UID avant de faire cette opération.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="263"/> <source>Sign Selected UID(s)</source> - <translation>Signer des UID sélectionnés</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="265"/> <source>Delete Selected UID(s)</source> - <translation>Supprimer l'UID sélectionné (s) sélectionné (s)</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="284"/> <source>Successful Operation</source> - <translation>Exploitation réussie</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="285"/> <source>Successfully added a new UID.</source> - <translation>A ajouté avec succès une nouvelle UID.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="288"/> @@ -1679,7 +1768,7 @@ <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="460"/> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="507"/> <source>Operation Failed</source> - <translation>L'opération a échoué</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="289"/> @@ -1688,17 +1777,17 @@ <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="461"/> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="508"/> <source>An error occurred during the operation.</source> - <translation>Une erreur s'est produite lors de l'opération.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="313"/> <source>Deleting UIDs</source> - <translation>Suppression des UID</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="314"/> <source>Are you sure that you want to delete the following uids?</source> - <translation>Êtes-vous sûr de vouloir supprimer les UID suivants?</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="315"/> @@ -1706,73 +1795,73 @@ <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="454"/> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="501"/> <source>The action can not be undone.</source> - <translation>L'action ne peut pas être annulée.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="355"/> <source>Set Primary UID</source> - <translation>Définir UID primaire</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="356"/> <source>Are you sure that you want to set the Primary UID to?</source> - <translation>Êtes-vous sûr de vouloir définir l'UID principal?</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="395"/> <source>Set As Primary</source> - <translation>Définir comme principale</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="397"/> <source>Sign UID</source> - <translation>Signer uid</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="399"/> <source>Delete UID</source> - <translation>Supprimer UID</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="426"/> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="441"/> <source>Please select one UID before doing this operation.</source> - <translation>Veuillez sélectionner un UID avant de faire cette opération.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="452"/> <source>Deleting UID</source> - <translation>Supprimer UID</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="453"/> <source>Are you sure that you want to delete the following uid?</source> - <translation>Êtes-vous sûr de vouloir supprimer l'UID suivant?</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="469"/> <source>Delete(Revoke) Key Signature</source> - <translation>Supprimer (révoquer) la signature de clé</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="481"/> <source>Please select one Key Signature before doing this operation.</source> - <translation>Veuillez sélectionner une signature de clé avant de faire cette opération.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="488"/> <source>To delete the signature, you need to have its corresponding public key in the local database.</source> - <translation>Pour supprimer la signature, vous devez avoir sa clé publique correspondante dans la base de données locale.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="499"/> <source>Deleting Key Signature</source> - <translation>Suppression de la signature de clé</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="500"/> <source>Are you sure that you want to delete the following signature?</source> - <translation>Êtes-vous sûr de vouloir supprimer la signature suivante?</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -1780,110 +1869,110 @@ <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="40"/> <source>&Close</source> - <translation>&Fermer</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="41"/> <source>&Import ALL</source> - <translation>& Importer tout</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="42"/> <source>&Search</source> - <translation>&Rechercher</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="45"/> <source>Search String:</source> - <translation>String de recherche:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="49"/> <source>Key Server:</source> - <translation>Serveur clé:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="97"/> <source>Update Keys from Keyserver</source> - <translation>Mettre à jour les clés de Keyserver</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="99"/> <source>Import Keys from Keyserver</source> - <translation>Keys d'importation de KeyServer</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="158"/> <source>UID</source> - <translation>Uid</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="158"/> <source>Creation date</source> - <translation>Date de création</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="158"/> <source>KeyID</source> - <translation>Clés</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="158"/> <source>Tag</source> - <translation>Étiqueter</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="179"/> <source>Text is empty.</source> - <translation>Le texte est vide.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="213"/> <source>Not Key Found</source> - <translation>Pas la clé trouvée</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="216"/> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="386"/> <source>Timeout</source> - <translation>Temps libre</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="219"/> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="389"/> <source>Key Server Not Found</source> - <translation>Server clé non trouvé</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="222"/> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="392"/> <source>Connection Error</source> - <translation>Erreur de connexion</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="230"/> <source>Too many responses from keyserver!</source> - <translation>Trop de réponses de KeyServer!</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="237"/> <source>No keys found, input may be kexId, retrying search with 0x.</source> - <translation>Aucune clé trouvée, l'entrée peut être Kexid, réessayant la recherche avec 0x.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="242"/> <source>No keys found containing the search string!</source> - <translation>Aucun clés trouvée contenant la chaîne de recherche!</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="246"/> <source>Insufficiently specific search string!</source> - <translation>String de recherche insuffisamment spécifique!</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="274"/> <source>revoked</source> - <translation>révoqué</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="277"/> @@ -1893,27 +1982,27 @@ <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="317"/> <source><h4>%1 keys found. Double click a key to import it.</h4></source> - <translation><H4>% 1 clés trouvées.Double-cliquez sur une touche pour importer. </ H4></translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="383"/> <source>Key Not Found</source> - <translation>Clé introuvable</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="410"/> <source><h4>Key Updated</h4></source> - <translation><H4> Touche Mise à jour </ h4></translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="412"/> <source><h4>Key Imported</h4></source> - <translation><H4> Touche importée </ h4></translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="473"/> <source>Upload Keys from Keyserver</source> - <translation>Touches de téléchargement de KeyServer</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -1921,22 +2010,22 @@ <message> <location filename="../../src/ui/keypair_details/KeySetExpireDateDialog.cpp" line="36"/> <source>Confirm</source> - <translation>Confirmer</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeySetExpireDateDialog.cpp" line="41"/> <source>Never Expire</source> - <translation>N'expire jamais</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeySetExpireDateDialog.cpp" line="61"/> <source>Operation Failed</source> - <translation>L'opération a échoué</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeySetExpireDateDialog.cpp" line="62"/> <source>An error occurred during the operation.</source> - <translation>Une erreur s'est produite lors de l'opération.</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -1944,73 +2033,93 @@ <message> <location filename="../../src/ui/keypair_details/KeyUIDSignDialog.cpp" line="72"/> <source>Expire Date</source> - <translation>Date d'expiration</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyUIDSignDialog.cpp" line="81"/> <source>Sign For Key's UID(s)</source> - <translation>Signe pour UID (s) de la clé</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyUIDSignDialog.cpp" line="100"/> + <location filename="../../src/ui/keypair_details/KeyUIDSignDialog.cpp" line="99"/> <source>Unsuccessful Operation</source> - <translation>Opération infructueuse</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyUIDSignDialog.cpp" line="101"/> + <location filename="../../src/ui/keypair_details/KeyUIDSignDialog.cpp" line="100"/> <source>Signature operation failed for UID </source> - <translation>L'opération de signature a échoué pour UID</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyUIDSignDialog.cpp" line="108"/> + <location filename="../../src/ui/keypair_details/KeyUIDSignDialog.cpp" line="107"/> <source>Operation Complete</source> - <translation>Opération complète</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyUIDSignDialog.cpp" line="109"/> + <location filename="../../src/ui/keypair_details/KeyUIDSignDialog.cpp" line="108"/> <source>The signature operation of the UID is complete</source> - <translation>L'opération de signature de l'UID est complète</translation> + <translation type="unfinished"></translation> </message> </context> <context> <name>KeyUploadDialog</name> <message> - <location filename="../../src/ui/KeyUploadDialog.cpp" line="49"/> + <location filename="../../src/ui/KeyUploadDialog.cpp" line="47"/> <source>Uploading Public Key</source> - <translation>Téléchargement de clé publique</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyUploadDialog.cpp" line="112"/> + <location filename="../../src/ui/KeyUploadDialog.cpp" line="110"/> <source>Key Not Found</source> - <translation>Clé introuvable</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyUploadDialog.cpp" line="115"/> + <location filename="../../src/ui/KeyUploadDialog.cpp" line="113"/> <source>Timeout</source> - <translation>Temps libre</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyUploadDialog.cpp" line="118"/> + <location filename="../../src/ui/KeyUploadDialog.cpp" line="116"/> <source>Key Server Not Found</source> - <translation>Server clé non trouvé</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyUploadDialog.cpp" line="121"/> + <location filename="../../src/ui/KeyUploadDialog.cpp" line="119"/> <source>Connection Error</source> - <translation>Erreur de connexion</translation> + <translation type="unfinished"></translation> </message> </context> <context> <name>KeyserverTab</name> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="607"/> - <source>Default Key Server for import:</source> - <translation>Server de clé par défaut pour importer:</translation> + <location filename="../../src/ui/settings/SettingsKeyServer.cpp" line="32"/> + <source>General</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="624"/> + <location filename="../../src/ui/settings/SettingsKeyServer.cpp" line="53"/> + <source>No.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/settings/SettingsKeyServer.cpp" line="53"/> + <source>Address</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/settings/SettingsKeyServer.cpp" line="53"/> + <source>Available</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/settings/SettingsKeyServer.cpp" line="57"/> + <source>Default Key Server for Import:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/settings/SettingsKeyServer.cpp" line="67"/> <source>Add</source> - <translation>Ajouter</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -2018,277 +2127,374 @@ <message> <location filename="../../src/MainWindow.cpp" line="35"/> <source>Loading Gnupg</source> - <translation>Chargement gnupg</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/MainWindow.cpp" line="62"/> <source>ENV Loading Failed</source> - <translation>Échec du chargement env</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/MainWindow.cpp" line="63"/> <source>Gnupg is not installed correctly, please follow the ReadME instructions to install gnupg and then open GPGFrontend.</source> - <translation>GNUPG n'est pas installé correctement, veuillez suivre les instructions README pour installer GNUPG, puis ouvrir GPGFontend.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="38"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="117"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="286"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="36"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="40"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="44"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="114"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="127"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="131"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="135"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="196"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="212"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="216"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="220"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="294"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="326"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="331"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="335"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="383"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="396"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="400"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="404"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="501"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="513"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="517"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="521"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="583"/> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="51"/> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="112"/> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="126"/> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="218"/> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="231"/> <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="525"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="702"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="885"/> - <source>No Key Selected</source> - <translation>Aucune clé sélectionnée</translation> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="541"/> + <source>Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="36"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="127"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="212"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="396"/> + <source>Select a file before doing it.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="40"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="131"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="216"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="400"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="517"/> + <source>No permission to read this file.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="44"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="135"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="220"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="404"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="521"/> + <source>No permission to create file.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="49"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="150"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="226"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="409"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="375"/> + <source>Warning</source> + <translation type="unfinished"></translation> </message> <message> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="50"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="151"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="227"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="410"/> + <source>The target file already exists, do you need to overwrite it?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="62"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="239"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="422"/> <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="45"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="124"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="532"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="709"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="126"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="298"/> + <source>No Key Selected</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="69"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="246"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="52"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="133"/> <source>Invalid Operation</source> - <translation>Opération invalide</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="46"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="533"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="710"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="70"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="247"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="53"/> <source>The selected key contains a key that does not actually have a encrypt usage.<br/></source> - <translation>La clé sélectionnée contient une clé qui ne dispose pas d'une utilisation en chiffrement. <br/></translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="47"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="126"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="300"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="534"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="711"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="899"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="71"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="248"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="436"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="54"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="135"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="312"/> <source><br/>For example the Following Key: <br/></source> - <translation><br/> Par exemple, la clé suivante: <br/></translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="65"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="554"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="91"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="72"/> <source>Encrypting</source> - <translation>Cryptage</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="94"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="368"/> - <source>Function Disabled</source> - <translation>Fonction désactivée</translation> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="114"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="196"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="294"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="383"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="501"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="583"/> + <source>An error occurred during operation.</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="95"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="369"/> - <source>Please go to the settings interface to enable and configure this function.</source> - <translation>Veuillez vous rendre à l'interface des paramètres pour activer et configurer cette fonction.</translation> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="268"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="151"/> + <source>Signing</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="125"/> - <source>The selected key contains a key that does not actually have a signature usage.<br/></source> - <translation>La clé sélectionnée contient une clé qui ne dispose pas d'une utilisation de signature. <br/></translation> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="327"/> + <source>Please select the appropriate target file or signature file. Ensure that both are in this directory.</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="142"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="731"/> - <source>Signing</source> - <translation>Signature</translation> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="331"/> + <source>No permission to read target file.</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="186"/> - <source>Decrypting</source> - <translation>Décalage</translation> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="335"/> + <source>No permission to read signature file.</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="246"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="816"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="353"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="259"/> <source>Verifying</source> - <translation>Vérification</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="298"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="897"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="434"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="310"/> <source>Invalid KeyPair</source> - <translation>KeyPair non valide</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="299"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="898"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="435"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="311"/> <source>The selected keypair cannot be used for signing and encryption at the same time.<br/></source> - <translation>Le clavier sélectionné ne peut pas être utilisé pour la signature et le cryptage en même temps. <br/></translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="310"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="317"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="909"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="916"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="446"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="453"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="322"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="329"/> <source>Incomplete Operation</source> - <translation>Opération incomplète</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="311"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="910"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="447"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="323"/> <source>None of the selected key pairs can provide the encryption function.</source> - <translation>Aucune des paires de touches sélectionnées ne peut fournir la fonction de cryptage.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="318"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="917"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="454"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="330"/> <source>None of the selected key pairs can provide the signature function.</source> - <translation>Aucune des paires de touches sélectionnées ne peut fournir la fonction de signature.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="335"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="936"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="473"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="365"/> <source>Encrypting and Signing</source> - <translation>Cryptage et signature</translation> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="513"/> + <source>Select a file(.gpg/.asc) before doing it.</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="401"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="1014"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="551"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="461"/> <source>Decrypting and Verifying</source> - <translation>Décrypter et vérifier</translation> - </message> - <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="499"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="503"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="507"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="577"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="590"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="594"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="598"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="659"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="675"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="679"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="683"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="757"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="789"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="794"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="798"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="846"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="859"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="863"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="867"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="964"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="976"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="980"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="984"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="1046"/> - <source>Error</source> - <translation>Erreur</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="499"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="590"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="675"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="859"/> - <source>Select a file before doing it.</source> - <translation>Sélectionnez un fichier avant de le faire.</translation> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="43"/> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="155"/> + <source>Invalid Own Key</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="503"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="594"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="679"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="863"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="980"/> - <source>No permission to read this file.</source> - <translation>Aucune autorisation de lire ce fichier.</translation> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="43"/> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="155"/> + <source>Own Key can not be use to do any operation.</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="507"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="598"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="683"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="867"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="984"/> - <source>No permission to create file.</source> - <translation>Aucune autorisation de créer un fichier.</translation> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="52"/> + <source>Please obtain a Service Token from the server in the settings.</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="512"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="613"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="689"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="872"/> - <source>Warning</source> - <translation>Avertissement</translation> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="91"/> + <source>Getting Cpt From Server</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="513"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="614"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="690"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="873"/> - <source>The target file already exists, do you need to overwrite it?</source> - <translation>Le fichier cible existe déjà, devez-vous vous écraser?</translation> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="113"/> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="219"/> + <source>The communication content with the server does not meet the requirements</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="577"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="659"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="757"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="846"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="964"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="1046"/> - <source>An error occurred during operation.</source> - <translation>Une erreur s'est produite lors du fonctionnement.</translation> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="126"/> + <source>Invalid short ciphertext</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="790"/> - <source>Please select the appropriate target file or signature file. Ensure that both are in this directory.</source> - <translation>Veuillez sélectionner le fichier cible ou le fichier de signature approprié.Assurez-vous que les deux sont dans ce répertoire.</translation> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="144"/> + <source>Invalid Service Token</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="794"/> - <source>No permission to read target file.</source> - <translation>Aucune autorisation de lire le fichier cible.</translation> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="145"/> + <source>Please go to the setting interface to get a ServiceToken.</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="798"/> - <source>No permission to read signature file.</source> - <translation>Aucune autorisation de lire le fichier de signature.</translation> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="203"/> + <source>Getting Scpt From Server</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="976"/> - <source>Select a file(.gpg/.asc) before doing it.</source> - <translation>Sélectionnez un fichier (.gpg / .asc) avant de le faire.</translation> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="228"/> + <source>Notice: Use Decrypt & Verify operation to decrypt this short crypto text.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="231"/> + <source>There is a problem with the communication with the server</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="103"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="408"/> + <source>Function Disabled</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="104"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="409"/> + <source>Please go to the settings interface to enable and configure this function.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="134"/> + <source>The selected key contains a key that does not actually have a signature usage.<br/></source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="1082"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="186"/> + <source>Notice</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="186"/> + <source>Short Crypto Text only supports Decrypt & Verify.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="200"/> + <source>Decrypting</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="376"/> + <source>Automatic public key exchange failed.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="415"/> + <source>Service Token Empty</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="416"/> + <source>Please go to the settings interface to set Own Key and get Service Token.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="525"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="541"/> + <source>Key Not Found.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="572"/> <source>Outdated Version</source> - <translation>Version obsolète</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="1083"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="573"/> <source>This version(%1) is out of date, please update the latest version in time. </source> - <translation>Cette version (% 1) est obsolète, veuillez mettre à jour la dernière version à temps.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="1085"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="1092"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="575"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="582"/> <source>You can download the latest version(%1) on Github Releases Page.<br/></source> - <translation>Vous pouvez télécharger la dernière version (% 1) sur la page Communiqués GitHub. <br/></translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="1089"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="579"/> <source>Unreleased Version</source> - <translation>Version non sélectionnée</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="1090"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="580"/> <source>This version(%1) has not been officially released and is not recommended for use in a production environment. <br/></source> - <translation>Cette version (% 1) n'a pas été officiellement libérée et n'est pas recommandée pour une utilisation dans un environnement de production.<br/></translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowSlotUI.cpp" line="58"/> <source>There is one unencrypted file in attachment folder</source> - <translation>Il y a un fichier non crypté dans le dossier de pièce jointe</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowSlotUI.cpp" line="60"/> <source>There are </source> - <translation>Il y a</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowSlotUI.cpp" line="60"/> <source> unencrypted files in attachment folder</source> - <translation>Fichiers non cryptés dans le dossier de pièce jointe</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="30"/> @@ -2298,7 +2504,7 @@ <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="36"/> <source>Open a new file</source> - <translation>Ouvrir un nouveau fichier</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="39"/> @@ -2308,277 +2514,277 @@ <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="42"/> <source>Open an existing file</source> - <translation>Ouvrir un fichier existant</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="45"/> <source>&Browser</source> - <translation>&Le navigateur</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="47"/> <source>Open a file browser</source> - <translation>Ouvrez un navigateur de fichiers</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="50"/> <source>&Save</source> - <translation>&Sauvegarder</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="53"/> <source>Save the current File</source> - <translation>Enregistrez le fichier actuel</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="56"/> <source>Save &As</source> - <translation>Enregistrer sous</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="59"/> <source>Save the current File as...</source> - <translation>Enregistrez le fichier actuel comme ...</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="62"/> <source>&Print</source> - <translation>&Imprimer</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="65"/> <source>Print Document</source> - <translation>Document d'impression</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="68"/> <source>&Close</source> - <translation>&Fermer</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="70"/> <source>Close file</source> - <translation>Fermer le fichier</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="73"/> <source>&Quit</source> - <translation>&Quitter</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="76"/> <source>Quit Program</source> - <translation>Quitter le programme</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="81"/> <source>&Undo</source> - <translation>&Annuler</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="83"/> <source>Undo Last Edit Action</source> - <translation>Annuler la dernière action d'édition</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="86"/> <source>&Redo</source> - <translation>&Prêt</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="88"/> <source>Redo Last Edit Action</source> - <translation>Refaire dernière action d'édition</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="91"/> <source>Zoom In</source> - <translation>Agrandir</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="95"/> <source>Zoom Out</source> - <translation>Dézoomer</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="99"/> <source>&Paste</source> - <translation>&Pâte</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="102"/> <source>Paste Text From Clipboard</source> - <translation>Coller le texte du presse-papiers</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="105"/> <source>Cu&t</source> - <translation>Avec & T.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="108"/> <source>Cut the current selection's contents to the clipboard</source> - <translation>Couper le contenu de la sélection actuelle dans le presse-papiers</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="112"/> <source>&Copy</source> - <translation>&Copie</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="115"/> <source>Copy the current selection's contents to the clipboard</source> - <translation>Copiez le contenu de la sélection actuelle dans le Presse-papiers</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="119"/> <source>&Quote</source> - <translation>"</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="121"/> <source>Quote whole text</source> - <translation>Citer du texte entier</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="124"/> <source>Select &All</source> - <translation>Tout sélectionner</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="127"/> <source>Select the whole text</source> - <translation>Sélectionnez le texte entier</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="130"/> <source>&Find</source> - <translation>&Trouve</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="132"/> <source>Find a word</source> - <translation>Trouver un mot</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="135"/> <source>Remove &spacing</source> - <translation>Supprimer et espacer</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="138"/> <source>Remove double linebreaks, e.g. in pasted text from webmailer</source> - <translation>Supprimer Double Ligneurs, par exemple.dans le texte collé de webmailer</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="141"/> <source>Se&ttings</source> - <translation>Et tuttine</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="142"/> <source>Open settings dialog</source> - <translation>Dialogue des paramètres ouverts</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="148"/> <source>&Encrypt</source> - <translation>&Crypter</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="151"/> <source>Encrypt Message</source> - <translation>Chiffrer</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="154"/> <source>&Encrypt &Sign</source> - <translation>& Chiffrer et signer</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="157"/> <source>Encrypt and Sign Message</source> - <translation>Message de chiffrement et de signe</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="160"/> <source>&Decrypt</source> - <translation>& Déchiffrer</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="163"/> <source>Decrypt Message</source> - <translation>Decrypt Message</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="166"/> <source>&Decrypt &Verify</source> - <translation>& Déchiffrer et vérifier</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="169"/> <source>Decrypt and Verify Message</source> - <translation>Déchiffrer et vérifier le message</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="175"/> <source>&Encrypt File</source> - <translation>Chiffrer</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="176"/> <source>Encrypt File</source> - <translation>Chiffrer</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="179"/> <source>&Decrypt File</source> - <translation>Dossier de déchiffrement</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="180"/> <source>Decrypt File</source> - <translation>Dossier de déchiffrement</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="183"/> <source>&Sign File</source> - <translation>Et signe de signe</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="184"/> <source>Sign File</source> - <translation>Fichier de signe</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="187"/> <source>&Verify File</source> - <translation>Vérifier le fichier</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="188"/> <source>Verify File</source> - <translation>Vérifier le fichier</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="192"/> <source>&Sign</source> - <translation>&Signe</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="195"/> <source>Sign Message</source> - <translation>Message de signe</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="198"/> <source>&Verify</source> - <translation>&Vérifier</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="201"/> <source>Verify Message</source> - <translation>Vérifier le message</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="207"/> @@ -2588,320 +2794,358 @@ <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="209"/> <source>Import New Key From Editor</source> - <translation>Importer une nouvelle clé de l'éditeur</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="212"/> <source>Manage &Keys</source> - <translation>Gérer et les clés</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="214"/> <source>Open Keymanagement</source> - <translation>Clés ouverte</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="220"/> <source>&About</source> - <translation>&À propos</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="222"/> <source>Show the application's About box</source> - <translation>Montrer l'application à propos de la boîte</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="228"/> <source>&Check for Updates</source> - <translation>Vérifier les mises à jour</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="230"/> <source>Check for updates</source> - <translation>Vérifier les mises à jour</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="233"/> <source>Open &Wizard</source> - <translation>Open & Wizard</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="234"/> <source>Open the wizard</source> - <translation>Ouvrir l'assistant</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="239"/> <source>Append Selected Key(s) To Text</source> - <translation>Ajoutez la ou les touches sélectionnées sur le texte</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="240"/> <source>Append The Selected Keys To Text in Editor</source> - <translation>Ajouter les touches sélectionnées sur Text In Editor</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="243"/> <source>Copy Email</source> - <translation>Copier le courrier électronique</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="244"/> <source>Copy selected Email to clipboard</source> - <translation>Copier le courrier électronique sélectionné dans le presse-papiers</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="248"/> <source>Show Key Details</source> - <translation>Afficher les détails de la clé</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="249"/> <source>Show Details for this Key</source> - <translation>Afficher les détails de cette clé</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="252"/> <source>Refresh Key From Key Server</source> - <translation>Actualiser la clé de Key Server</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="253"/> <source>Refresh key from default key server</source> - <translation>Actualiser la clé à partir du serveur de clés par défaut</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="256"/> <source>Upload Public Key(s) To Server</source> - <translation>Télécharger des touches publiques sur le serveur</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="257"/> <source>Upload The Selected Public Keys To Server</source> - <translation>Téléchargez les touches publiques sélectionnées sur le serveur</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="272"/> <source>Remove PGP Header</source> - <translation>Supprimer l'en-tête PGP</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="275"/> <source>Add PGP Header</source> - <translation>Ajouter l'en-tête PGP</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="280"/> <source>&File</source> - <translation>&Déposer</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="293"/> <source>&Edit</source> - <translation>&Éditer</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="311"/> <source>&File...</source> - <translation>&Déposer...</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="317"/> <source>&Crypt</source> - <translation>&Crypte</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="328"/> <source>&Keys</source> - <translation>&Clés</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="329"/> <source>&Import Key</source> - <translation>Clé d'importation</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="338"/> <source>&Steganography</source> - <translation>Stéganographie</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="347"/> <source>&View</source> - <translation>&Vue</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="349"/> <source>&Help</source> - <translation>&Aider</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="358"/> <source>File</source> - <translation>Déposer</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="366"/> <source>Crypt</source> - <translation>Crypte</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="376"/> <source>Key</source> - <translation>Clé</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="381"/> <source>Edit</source> - <translation>Éditer</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="388"/> <source>Special Edit</source> - <translation>Édition spéciale</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="400"/> <source>Import key from...</source> - <translation>Importer la clé de ...</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="401"/> <source>Import key</source> - <translation>Clé d'importation</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="409"/> <source>Browser to view and operate file</source> - <translation>Navigateur pour voir et utiliser le fichier</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="410"/> <source>Browser</source> - <translation>Le navigateur</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="428"/> <source>Ready</source> - <translation>Prêt</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="435"/> <source>Key ToolBox</source> - <translation>Boîte à outils clé</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="443"/> <source>Information Board</source> - <translation>Tableau d'information</translation> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>PubkeyGetter</name> + <message> + <location filename="../../src/server/api/PubkeyGetter.cpp" line="66"/> + <location filename="../../src/server/api/PubkeyGetter.cpp" line="90"/> + <source>Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/api/PubkeyGetter.cpp" line="67"/> + <location filename="../../src/server/api/PubkeyGetter.cpp" line="91"/> + <source>The communication content with the server does not meet the requirements</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>PubkeyUploader</name> + <message> + <location filename="../../src/server/api/PubkeyUploader.cpp" line="95"/> + <source>Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/api/PubkeyUploader.cpp" line="96"/> + <source>The communication content with the server does not meet the requirements</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/api/PubkeyUploader.cpp" line="103"/> + <source>Warning</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/api/PubkeyUploader.cpp" line="104"/> + <source>Partial failure of automatic pubkey exchange</source> + <translation type="unfinished"></translation> </message> </context> <context> <name>QApplication</name> <message> - <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="42"/> - <source>>Recipient: </source> - <translation>> Destinataire:</translation> + <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="66"/> + <source> {>} Recipient: </source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="35"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="61"/> <source>One or More Bad Signatures.</source> - <translation>Une ou plusieurs mauvaises signatures.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="40"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="66"/> <source>A </source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="42"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="68"/> <source>Good </source> - <translation>Bien</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="45"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="71"/> <source>Bad </source> - <translation>Mal</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="48"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="74"/> <source>Expired </source> - <translation>Expiré</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="51"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="77"/> <source>Missing Key's </source> - <translation>Touches manquantes</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="54"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="80"/> <source>Revoked Key's </source> - <translation>Touche révoquée</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="57"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="83"/> <source>Expired Key's </source> - <translation>Clé expirée</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="60"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="86"/> <source>Missing CRL's </source> - <translation>CRL manquant</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="64"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="90"/> <source>Signature Fully Valid.</source> - <translation>Signature entièrement valide.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="66"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="92"/> <source>Signature NOT Fully Valid.</source> - <translation>Signature non complète valide.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="74"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="100"/> <source>Key is NOT present with ID 0x</source> - <translation>La clé n'est pas présente avec ID 0x</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="81"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="107"/> <source>A signature could NOT be verified due to a Missing Key </source> - <translation>Une signature n'a pas pu être vérifiée en raison d'une clé manquante</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="85"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="111"/> <source>A signature is valid but the key used to verify the signature has been revoked </source> - <translation>Une signature est valide mais la clé utilisée pour vérifier la signature a été révoquée.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="93"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="119"/> <source>A signature is valid but expired </source> - <translation>Une signature est valide mais expirée</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="100"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="126"/> <source>A signature is valid but the key used to verify the signature has expired. </source> - <translation>Une signature est valide mais la clé utilisée pour vérifier la signature a expiré.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="107"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="133"/> <source>There was some other error which prevented the signature verification. </source> - <translation>Il y avait une autre erreur qui empêchait la vérification de la signature.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="113"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="139"/> <source>Error for key with fingerprint </source> - <translation>Erreur pour la clé avec empreinte digitale</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="128"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="152"/> <source>Signed By: </source> - <translation>Signé par:</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -2909,22 +3153,22 @@ <message> <location filename="../../src/ui/QuitDialog.cpp" line="29"/> <source>Unsaved Files</source> - <translation>Fichiers non enregistrés</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/QuitDialog.cpp" line="77"/> <source>%1 files contain unsaved information.<br/>Save the changes before closing?</source> - <translation>% 1 Les fichiers contiennent des informations non enregistrées. <br/> Enregistrez les modifications avant la fermeture?</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/QuitDialog.cpp" line="88"/> <source>Check the files you want to save:</source> - <translation>Vérifiez les fichiers que vous souhaitez enregistrer:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/QuitDialog.cpp" line="89"/> <source><b>Note:</b> If you don't save these files, all changes are lost.<br/></source> - <translation><B> REMARQUE: </ B> Si vous ne enregistrez pas ces fichiers, toutes les modifications sont perdues. <br/></translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -2932,264 +3176,360 @@ <message> <location filename="../../src/ui/SendMailDialog.cpp" line="35"/> <source>Incomplete configuration</source> - <translation>Configuration incomplète</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/SendMailDialog.cpp" line="36"/> <source>The SMTP address is empty, please go to the setting interface to complete the configuration.</source> - <translation>L'adresse SMTP est vide, veuillez vous rendre à l'interface de réglage pour compléter la configuration.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/SendMailDialog.cpp" line="86"/> <source> Recipient cannot be empty </source> - <translation>Le destinataire ne peut pas être vide</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/SendMailDialog.cpp" line="91"/> <source> One or more Recipient's Email Address is invalid </source> - <translation>L'une ou plusieurs adresse électronique du destinataire est invalide</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/SendMailDialog.cpp" line="97"/> <source> Sender cannot be empty </source> - <translation>L'expéditeur ne peut pas être vide</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/SendMailDialog.cpp" line="99"/> <source> Sender's Email Address is invalid </source> - <translation>L'adresse email de l'expéditeur n'est pas valide</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/SendMailDialog.cpp" line="155"/> <location filename="../../src/ui/SendMailDialog.cpp" line="160"/> <location filename="../../src/ui/SendMailDialog.cpp" line="165"/> <source>Fail</source> - <translation>Échouer</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/SendMailDialog.cpp" line="155"/> <source>Fail to Connect SMTP Server</source> - <translation>Omettre de connecter SMTP Server</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/SendMailDialog.cpp" line="160"/> <source>Fail to Login into SMTP Server</source> - <translation>Omettre de vous connecter au serveur SMTP</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/SendMailDialog.cpp" line="165"/> <source>Fail to Send Mail to SMTP Server</source> - <translation>Omettre d'envoyer un courrier au serveur SMTP</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/SendMailDialog.cpp" line="171"/> <source>Success</source> - <translation>Succès</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/SendMailDialog.cpp" line="171"/> <source>Succeed in Sending Mail to SMTP Server</source> - <translation>Réussir à envoyer un courrier au serveur SMTP</translation> + <translation type="unfinished"></translation> </message> </context> <context> <name>SendMailTab</name> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="289"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="33"/> <source>Enable</source> - <translation>Activer</translation> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="51"/> + <source>Check Connection</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="311"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="53"/> + <source>General</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="54"/> + <source>Connection</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="55"/> + <source>Preference</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="61"/> <source>SMTP Address</source> - <translation>Adresse SMTP</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="313"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="63"/> <source>Username</source> - <translation>Nom d'utilisateur</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="315"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="65"/> <source>Password</source> - <translation>Mot de passe</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="317"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="67"/> <source>Port</source> - <translation>Port</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="319"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="69"/> <source>Connection Security</source> - <translation>Sécurité de la connexion</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="322"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="75"/> <source>Default Sender</source> - <translation>Expéditeur par défaut</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="404"/> - <location filename="../../src/ui/SettingsDialog.cpp" line="408"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="161"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="165"/> <source>Fail</source> - <translation>Échouer</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="404"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="161"/> <source>Fail to Connect SMTP Server</source> - <translation>Omettre de connecter SMTP Server</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="408"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="165"/> <source>Fail to Login</source> - <translation>Échouer à se connecter</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="413"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="170"/> <source>Success</source> - <translation>Succès</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="413"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="170"/> <source>Succeed in connecting and login</source> - <translation>Réussir à connecter et à vous connecter</translation> + <translation type="unfinished"></translation> </message> </context> <context> <name>SettingsDialog</name> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="40"/> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="39"/> <source>General</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="41"/> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="40"/> <source>Appearance</source> - <translation>Apparence</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="42"/> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="41"/> <source>Send Mail</source> - <translation>Envoyer un mail</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="43"/> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="42"/> <source>Key Server</source> - <translation>Serveur de clés</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="45"/> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="44"/> <source>Advanced</source> - <translation>Avancée</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="58"/> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="59"/> <source>Settings</source> - <translation>Paramètres</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="103"/> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="105"/> <source>System Default</source> - <translation>Défaut du système</translation> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>SignResultAnalyse</name> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="29"/> + <source>[#] Sign Operation </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="32"/> + <source>[Success]</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="34"/> + <source>[Failed] </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="43"/> + <source>[>] New Signature: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="47"/> + <source> Sign Mode: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="49"/> + <source>Normal</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="51"/> + <source>Clear</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="53"/> + <source>Detach</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="59"/> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="61"/> + <source> Signer: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="61"/> + <source><unknown></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="63"/> + <source> Public Key Algo: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="64"/> + <source> Hash Algo: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="65"/> + <source> Date & Time: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="75"/> + <source>Invalid Signers: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="79"/> + <source>[>] Signer: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="80"/> + <source> Fingerprint: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="81"/> + <source> Reason: </source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>SignersPicker</name> + <message> + <location filename="../../src/ui/widgets/SignersPicker.cpp" line="28"/> + <source>Confirm</source> + <translation type="unfinished"></translation> </message> </context> <context> <name>SubkeyGenerateDialog</name> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="46"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="47"/> <source>Generate New Subkey</source> - <translation>Générer une nouvelle sous-clé</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="61"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="62"/> <source>Encryption</source> - <translation>Chiffrement</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="64"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="65"/> <source>Signing</source> - <translation>Signature</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="67"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="68"/> <source>Certification</source> - <translation>Certification</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="70"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="71"/> <source>Authentication</source> - <translation>Authentification</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="114"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="115"/> <source>Expiration Date:</source> - <translation>Date d'expiration:</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="115"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="116"/> <source>Never Expire</source> - <translation>N'expire jamais</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="116"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="117"/> <source>KeySize (in Bit):</source> - <translation>Keysize (dans le bit):</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="117"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="118"/> <source>Key Type:</source> - <translation>Type de clé:</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="126"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="127"/> <source>Basic Information</source> - <translation>Informations de base</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="214"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="215"/> <source> Expiration time no more than 2 years. </source> - <translation>Heure d'expiration Pas plus de 2 ans.</translation> - </message> - <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="235"/> - <source>Generating Subkey...</source> - <translation>Génération de sous-clé ...</translation> - </message> - <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="238"/> - <source>Collecting random data for subkey generation. - This may take a while. - To speed up the process use your computer - (e.g. browse the net, listen to music,...)</source> - <translation>Collecte de données aléatoires pour la génération de sous-clé. - Cela peut prendre un peu de temps. - Pour accélérer le processus, utilisez votre ordinateur - (E.G. Parcourir le Net, écoutez de la musique, ...)</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="309"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="244"/> <source>Success</source> - <translation>Succès</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="309"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="244"/> <source>The new subkey has been generated.</source> - <translation>La nouvelle sous-clé a été générée.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="311"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="247"/> <source>Failure</source> - <translation>Échec</translation> - </message> - <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="311"/> - <source>An error occurred during subkey generation.</source> - <translation>Une erreur s'est produite lors de la génération de sous-clé.</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -3197,13 +3537,13 @@ <message> <location filename="../../src/ui/widgets/TextEdit.cpp" line="53"/> <source>untitled</source> - <translation>sans titre</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/TextEdit.cpp" line="120"/> <location filename="../../src/ui/widgets/TextEdit.cpp" line="200"/> <source>Warning</source> - <translation>Avertissement</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/TextEdit.cpp" line="121"/> @@ -3211,84 +3551,95 @@ <location filename="../../src/ui/widgets/TextEdit.cpp" line="482"/> <source>Cannot read file %1: %2.</source> - <translation>Impossible de lire le fichier% 1: -% 2.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/TextEdit.cpp" line="175"/> <source>Open file</source> - <translation>Fichier ouvert</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/TextEdit.cpp" line="251"/> <source>File</source> - <translation>Déposer</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/TextEdit.cpp" line="252"/> <source>Cannot write file %1: %2.</source> - <translation>Impossible d'écrire le fichier% 1: -% 2.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/TextEdit.cpp" line="270"/> <source>Save file</source> - <translation>Enregistrer le fichier</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/TextEdit.cpp" line="333"/> <source>Unsaved document</source> - <translation>Document non enregistré</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/TextEdit.cpp" line="334"/> <source>The document "%1" has been modified. Do you want to save your changes?<br/></source> - <translation>Le document "% 1" a été modifié.Voulez-vous enregistrer vos modifications? <br/></translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/TextEdit.cpp" line="337"/> <source><b>Note:</b> If you don't save these files, all changes are lost.<br/></source> - <translation><B> REMARQUE: </ B> Si vous ne enregistrez pas ces fichiers, toutes les modifications sont perdues. <br/></translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/TextEdit.cpp" line="481"/> <source>Application</source> - <translation>Application</translation> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>UnknownSignersChecker</name> + <message> + <location filename="../../src/advance/UnknownSignersChecker.cpp" line="69"/> + <source>Warning</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/advance/UnknownSignersChecker.cpp" line="70"/> + <source>Automatic public key exchange failed.</source> + <translation type="unfinished"></translation> </message> </context> <context> <name>UpdateTab</name> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="127"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="129"/> <source>It is recommended that you always check the version of GpgFrontend and upgrade to the latest version.</source> - <translation>Il est recommandé de vérifier toujours la version de GPGFRontend et de la mise à niveau vers la dernière version.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="129"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="131"/> <source>New versions not only represent new features, but also often represent functional and security fixes.</source> - <translation>De nouvelles versions représentent non seulement de nouvelles fonctionnalités, mais également des corrections fonctionnelles et de sécurité.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="133"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="135"/> <source>Current Version: </source> - <translation>Version actuelle:</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="141"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="143"/> <source>The current version is inconsistent with the latest version on github.</source> - <translation>La version actuelle est incompatible avec la dernière version sur GitHub.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="143"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="145"/> <source>Please click <a href="https://github.com/saturneric/GpgFrontend/releases">here</a> to download the latest version.</source> - <translation>S'il vous plaît cliquez sur <a href="htttps://github.com/saturneric/gpgfronte/relases"> ici </a> pour télécharger la dernière version.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="187"/> - <location filename="../../src/ui/help/AboutDialog.cpp" line="209"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="199"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="214"/> <source>Latest Version From Github: </source> - <translation>Dernière version de GitHub:</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -3296,32 +3647,32 @@ <message> <location filename="../../src/ui/VerifyDetailsDialog.cpp" line="32"/> <source>Signature Details</source> - <translation>Détails de la signature</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/VerifyDetailsDialog.cpp" line="53"/> <source>Status: </source> - <translation>Statut:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/VerifyDetailsDialog.cpp" line="56"/> <source>No valid input found</source> - <translation>Aucune entrée valide trouvée</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/VerifyDetailsDialog.cpp" line="67"/> <source>Error Validating signature</source> - <translation>Erreur lors de la validation de la signature</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/VerifyDetailsDialog.cpp" line="70"/> <source>File was signed on %1 <br/> It Contains:<br/><br/></source> - <translation>Le fichier a été signé sur% 1 <br/> contient: <br/> <br/></translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/VerifyDetailsDialog.cpp" line="72"/> <source>Signed on %1 <br/> It Contains:<br /><br/></source> - <translation>Signé sur% 1 <br/> Il contient: <br /> <br/></translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -3329,22 +3680,22 @@ <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="36"/> <source>Import from keyserver</source> - <translation>Importer à partir de Keyserver</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="39"/> <source>Key not present with id 0x</source> - <translation>Clé non présente avec ID 0x</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="43"/> <source>Status:</source> - <translation>Statut:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="45"/> <source>Key not present in keylist</source> - <translation>Clé non présente dans Keylist</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="58"/> @@ -3354,7 +3705,7 @@ <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="115"/> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="129"/> <source>Key Information is NOT Available</source> - <translation>Les informations clés ne sont pas disponibles</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="60"/> @@ -3364,137 +3715,134 @@ <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="117"/> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="131"/> <source>Fingerprint: </source> - <translation>Empreinte digitale:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="67"/> <source>Status: Cert Revoked</source> - <translation>Statut: certificat révoqué</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="81"/> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="95"/> <source>Status: Signature Expired</source> - <translation>Statut: Signature EXPIRÉ</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="96"/> <source>Status: Key Expired</source> - <translation>Statut: clé expirée</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="110"/> <source>Status: General Error</source> - <translation>Statut: erreur générale</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="124"/> <source>Status: Unknown Error</source> - <translation>Statut: erreur inconnue</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="159"/> <source>Signer Name:</source> - <translation>Nom du signataire:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="160"/> <source>Signer Email:</source> - <translation>Signer Email:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="161"/> <source>Key's Fingerprint:</source> - <translation>Empreinte digitale de la clé:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="162"/> <source>Valid:</source> - <translation>Valide:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="163"/> <source>Flags:</source> - <translation>Drapeaux:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="171"/> <source>Fully Valid</source> - <translation>Entièrement valable</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="173"/> <source>NOT Fully Valid</source> - <translation>Pas complètement valide</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="180"/> <source>Good </source> - <translation>Bien</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="183"/> <source>Bad </source> - <translation>Mal</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="186"/> <source>Expired </source> - <translation>Expiré</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="189"/> <source>Missing Key </source> - <translation>Clé manquante</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="192"/> <source>Revoked Key </source> - <translation>Clé révoquée</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="195"/> <source>Expired Key </source> - <translation>Clé expirée</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="198"/> <source>Missing CRL </source> - <translation>CRL manquant</translation> + <translation type="unfinished"></translation> </message> </context> <context> - <name>Wizard</name> + <name>VerifyResultAnalyse</name> <message> - <location filename="../../src/ui/Wizard.cpp" line="46"/> - <source>First Start Wizard</source> - <translation>Assistant de premier départ</translation> - </message> - <message> - <location filename="../../src/ui/Wizard.cpp" line="76"/> - <source>Import Error</source> - <translation>Erreur d'importation</translation> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="31"/> + <source>[#] Verify Operation </source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="76"/> - <source>Couldn't locate any keyring file in %1</source> - <translation>Impossible de localiser un fichier de porte-clés en% 1</translation> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="34"/> + <source>[Success]</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="84"/> - <location filename="../../src/ui/Wizard.cpp" line="95"/> - <source>Import error</source> - <translation>Erreur d'importation</translation> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="36"/> + <source>[Failed] </source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="85"/> - <source>Couldn't open private keyringfile: %1</source> - <translation>Impossible d'ouvrir le keyRingfile privé:% 1</translation> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="158"/> + <source><Unknown></source> + <translation type="unfinished"></translation> </message> +</context> +<context> + <name>Wizard</name> <message> - <location filename="../../src/ui/Wizard.cpp" line="96"/> - <source>Couldn't open public keyringfile: %1</source> - <translation>Impossible d'ouvrir le keyRingfile publique:% 1</translation> + <location filename="../../src/ui/Wizard.cpp" line="40"/> + <source>First Start Wizard</source> + <translation type="unfinished"></translation> </message> </context> </TS> diff --git a/resource/ts/gpgfrontend_ru.ts b/resource/ts/gpgfrontend_ru.ts index 65fb3765..a37303ef 100644 --- a/resource/ts/gpgfrontend_ru.ts +++ b/resource/ts/gpgfrontend_ru.ts @@ -6,195 +6,306 @@ <message> <location filename="../../src/ui/help/AboutDialog.cpp" line="35"/> <source>About </source> - <translation>О</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/help/AboutDialog.cpp" line="42"/> <source>General</source> - <translation>Общий</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/help/AboutDialog.cpp" line="43"/> <source>Translators</source> - <translation>Переводчики</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/help/AboutDialog.cpp" line="44"/> <source>Update</source> - <translation>Обновлять</translation> + <translation type="unfinished"></translation> </message> </context> <context> <name>AdvancedTab</name> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="679"/> - <source>Show Steganography Options [Advanced]</source> - <translation>Показать объекты стеганографии [Advanced]</translation> + <location filename="../../src/ui/settings/SettingsAdvanced.cpp" line="34"/> + <source>Show Steganography Options</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="681"/> + <location filename="../../src/ui/settings/SettingsAdvanced.cpp" line="36"/> <source>Show Steganographic Options.</source> - <translation>Показать стеганографические варианты.</translation> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/settings/SettingsAdvanced.cpp" line="40"/> + <source>Pubkey Exchange</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/settings/SettingsAdvanced.cpp" line="42"/> + <source>Auto Pubkey Exchange</source> + <translation type="unfinished"></translation> </message> </context> <context> <name>AppearanceTab</name> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="444"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="34"/> <source>Iconsize</source> - <translation>Iconsize.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="446"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="36"/> <source>small</source> - <translation>небольшой</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="447"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="37"/> <source>medium</source> - <translation>Средняя</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="448"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="38"/> <source>large</source> - <translation>большой</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="464"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="54"/> <source>Iconstyle</source> - <translation>Iconstyle.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="466"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="56"/> <source>just text</source> - <translation>просто текст</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="467"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="57"/> <source>just icons</source> - <translation>Просто иконы</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="468"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="58"/> <source>text and icons</source> - <translation>текст и значки</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="484"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="74"/> <source>Windowstate</source> - <translation>Indowstate.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="487"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="77"/> <source>Save window size and position on exit.</source> - <translation>Сохранить размер окна и положение на выходе.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="495"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="85"/> <source>Information Board</source> - <translation>Доска объявлений</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="501"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="91"/> <source> Front Size</source> - <translation>Передний размер</translation> + <translation type="unfinished"></translation> </message> </context> <context> <name>ChoosePage</name> <message> - <location filename="../../src/ui/Wizard.cpp" line="165"/> + <location filename="../../src/ui/Wizard.cpp" line="121"/> <source>Choose your action...</source> - <translation>Выберите свое действие ...</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="166"/> + <location filename="../../src/ui/Wizard.cpp" line="122"/> <source>...by clicking on the appropriate link.</source> - <translation>... нажав на соответствующую ссылку.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="168"/> + <location filename="../../src/ui/Wizard.cpp" line="124"/> <source>If you have never used GPGFrontend before and also don't own a gpg key yet you may possibly want to read how to</source> - <translation>Если вы никогда не использовали GPGFRontend раньше, а также не владеть ключом GPG, но вы, возможно, хотите прочитать, как</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="170"/> + <location filename="../../src/ui/Wizard.cpp" line="127"/> <source>Generate Key</source> - <translation>Генерировать ключ</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="176"/> + <location filename="../../src/ui/Wizard.cpp" line="134"/> <source>If you want to learn how to encrypt, decrypt, sign and verify text, you can read </source> - <translation>Если вы хотите узнать, как зашифровать, расшифровать, подписать и проверить текст, вы можете прочитать</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="178"/> + <location filename="../../src/ui/Wizard.cpp" line="136"/> <source>Encrypt & Decrypt Text</source> - <translation>Шифра и расшифровывать текст</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="178"/> - <location filename="../../src/ui/Wizard.cpp" line="190"/> + <location filename="../../src/ui/Wizard.cpp" line="136"/> + <location filename="../../src/ui/Wizard.cpp" line="149"/> <source>or</source> - <translation>или же</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="180"/> + <location filename="../../src/ui/Wizard.cpp" line="138"/> <source>Sign & Verify Text</source> - <translation>Знак и проверить текст</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="188"/> + <location filename="../../src/ui/Wizard.cpp" line="146"/> <source>If you want to operate file, you can read </source> - <translation>Если вы хотите управлять файлом, вы можете прочитать</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="190"/> + <location filename="../../src/ui/Wizard.cpp" line="149"/> <source>Encrypt & Sign File</source> - <translation>Шифра и файл знака</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="192"/> + <location filename="../../src/ui/Wizard.cpp" line="152"/> <source>Sign & Verify File</source> - <translation>Знак и проверять файл</translation> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ComUtils</name> + <message> + <location filename="../../src/server/ComUtils.cpp" line="35"/> + <location filename="../../src/server/ComUtils.cpp" line="55"/> + <source>Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/ComUtils.cpp" line="35"/> + <source>Nothing Reply. Please check the Internet connection.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/ComUtils.cpp" line="55"/> + <source>Unknown Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/ComUtils.cpp" line="75"/> + <location filename="../../src/server/ComUtils.cpp" line="90"/> + <source>Network Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/ComUtils.cpp" line="75"/> + <source>Outdated Reply</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/ComUtils.cpp" line="87"/> + <source>Unknown Reason</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/ComUtils.cpp" line="90"/> + <source>Unknown Reply Format</source> + <translation type="unfinished"></translation> </message> </context> <context> <name>ConclusionPage</name> <message> - <location filename="../../src/ui/Wizard.cpp" line="407"/> + <location filename="../../src/ui/Wizard.cpp" line="224"/> <source>Ready.</source> - <translation>Готовый.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="408"/> + <location filename="../../src/ui/Wizard.cpp" line="225"/> <source>Have fun with GPGFrontend!</source> - <translation>Веселитесь с GPGFRontend!</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="410"/> + <location filename="../../src/ui/Wizard.cpp" line="227"/> <source>You are ready to use GPGFrontend now.<br><br></source> - <translation>Вы готовы использовать GPGFRontend сейчас. <br> <br> <br></translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="412"/> + <location filename="../../src/ui/Wizard.cpp" line="229"/> <source>The Online Document</source> - <translation>Онлайн документ</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="413"/> + <location filename="../../src/ui/Wizard.cpp" line="231"/> <source> will get you started with GPGFrontend. It will open in the main window.<br></source> - <translation>Получу, вы начали с GPGFRontend.Он откроется в главном окне. <br></translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="420"/> + <location filename="../../src/ui/Wizard.cpp" line="238"/> <source>Open offline help.</source> - <translation>Откройте автономную помощь.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="423"/> + <location filename="../../src/ui/Wizard.cpp" line="241"/> <source>Dont show the wizard again.</source> - <translation>Не показывать волшебник снова.</translation> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>DecryptResultAnalyse</name> + <message> + <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="30"/> + <source>[#] Decrypt Operation </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="33"/> + <source>[Success]</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="35"/> + <source>[Failed] </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="39"/> + <source>Unsupported Algo: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="46"/> + <source>File Name: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="52"/> + <source>Recipient(s): </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="82"/> + <source> Keu ID: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="83"/> + <source> Public Algo: </source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>EncryptResultAnalyse</name> + <message> + <location filename="../../src/gpg/result_analyse/EncryptResultAnalyse.cpp" line="41"/> + <source>Invalid Recipients: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/EncryptResultAnalyse.cpp" line="44"/> + <source>Fingerprint: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/EncryptResultAnalyse.cpp" line="45"/> + <source>Reason: </source> + <translation type="unfinished"></translation> </message> </context> <context> @@ -202,99 +313,98 @@ <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="32"/> <source>Decrypt File</source> - <translation>Дешифративный файл</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="34"/> <source>Encrypt File</source> - <translation>Зашифруйте файл</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="36"/> <source>Sign File</source> - <translation>Знак файла</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="38"/> <source>Verify File</source> - <translation>Проверьте файл</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="47"/> <source>Input Parameters</source> - <translation>Входные параметры</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="53"/> <source>Target File</source> - <translation>Целевой файл</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="59"/> <source>Output File</source> - <translation>Выходной файл</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="75"/> <source>Signature File(.sig) Path</source> - <translation>Подпись файла (.сиг) путь</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="134"/> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="177"/> <source>Open File</source> - <translation>Открыть файл</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="165"/> <source>Save File</source> - <translation>Сохранить файл</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="194"/> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="245"/> <source>Couldn't open file</source> - <translation>Не мог открыть файл</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="213"/> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="224"/> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="235"/> <source>Error</source> - <translation>Ошибка</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="214"/> <source>Error Occurred During Encryption</source> - <translation>Произошла ошибка во время шифрования</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="225"/> <source>Error Occurred During Decryption</source> - <translation>Произошла ошибка во время дешифрования</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="236"/> <source>Error Occurred During Signature</source> - <translation>Произошла ошибка во время подписи</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="259"/> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="268"/> <source>File</source> - <translation>Файл</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="260"/> <source>File exists! Do you want to overwrite it?</source> - <translation>Файл существует!Вы хотите перезаписать это?</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="269"/> <source>Cannot write file %1: %2.</source> - <translation>Невозможно написать файл% 1: -% 2.</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -302,52 +412,52 @@ <message> <location filename="../../src/ui/widgets/FilePage.cpp" line="161"/> <source>Open</source> - <translation>Открыть</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/FilePage.cpp" line="163"/> <source>Delete</source> - <translation>Удалить</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/FilePage.cpp" line="165"/> <source>Encrypt and Sign</source> - <translation>Шифровать и подписать</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/FilePage.cpp" line="167"/> <source>Decrypt and Verify</source> - <translation>Расшифровать и проверить</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/FilePage.cpp" line="169"/> <source>Only Sign</source> - <translation>Только знак</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/FilePage.cpp" line="171"/> <source>Only Verify</source> - <translation>Только проверить</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/FilePage.cpp" line="222"/> <source>Warning</source> - <translation>Предупреждение</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/FilePage.cpp" line="223"/> <source>Are you sure you want to delete it?</source> - <translation>Вы уверены, что хотите это удалить?</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/FilePage.cpp" line="233"/> <source>Error</source> - <translation>Ошибка</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/FilePage.cpp" line="234"/> <source>Unable to delete the file or folder.</source> - <translation>Невозможно удалить файл или папку.</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -355,202 +465,179 @@ <message> <location filename="../../src/ui/FindWidget.cpp" line="38"/> <source>Find:</source> - <translation>Находить:</translation> + <translation type="unfinished"></translation> </message> </context> <context> <name>GeneralTab</name> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="137"/> - <source>Remember Password</source> - <translation>Напомнить пароль</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="40"/> + <source>GpgFrontend Server</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="140"/> - <source>Remember password until closing gpg4usb</source> - <translation>Запомните пароль до закрытия GPG4UUSB</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="45"/> + <source>Server that provides short key and key exchange services</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="147"/> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="52"/> <source>Save Checked Keys</source> - <translation>Сохранить проверенные ключи</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="150"/> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="55"/> <source>Save checked private keys on exit and restore them on next start.</source> - <translation>Сохранить проверенные закрытые ключи на выходе и восстановить их на следующем запуске.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="159"/> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="64"/> <source>Confirm drag'n'drop key import</source> - <translation>Подтвердите импорт ключа Drag'n'drop</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="162"/> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="67"/> <source>Import files dropped on the keylist without confirmation.</source> - <translation>Файлы импорта упали на кейлист без подтверждения.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="169"/> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="74"/> <source>Language</source> - <translation>Язык</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="178"/> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="83"/> <source><b>NOTE: </b> GpgFrontend will restart automatically if you change the language!</source> - <translation><b> Примечание: </ b> gpgfrontend автоматически перезагрузится, если вы измените язык!</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="187"/> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="92"/> <source>Own key</source> - <translation>Собственный ключ</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="195"/> - <source><none></source> - <translation><none></translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="96"/> + <source>Get Service Token</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="209"/> - <source>Key pair for synchronization and identity authentication</source> - <translation>Пара ключей для синхронизации и аутентификации идентичности</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="97"/> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="234"/> + <source>No Service Token Found</source> + <translation type="unfinished"></translation> </message> -</context> -<context> - <name>GpgME::GpgContext</name> <message> - <location filename="../../src/gpg/GpgContext.cpp" line="528"/> - <source>Wrong password</source> - <translation>Неправильный пароль</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="103"/> + <source><none></source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/GpgContext.cpp" line="536"/> - <source>Enter Password for</source> - <translation>Введите пароль для</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="120"/> + <source>Key pair for synchronization and identity authentication</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/GpgContext.cpp" line="540"/> - <source>Enter Password</source> - <translation>Введите пароль</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="252"/> + <source>Invalid Operation</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/GpgContext.cpp" line="706"/> - <source>Key Selection</source> - <translation>Выбор ключа</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="253"/> + <source>Own Key can not be None while getting service token.</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/GpgContext.cpp" line="706"/> - <source>No Private Key Selected</source> - <translation>Нет закрытого ключа</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="265"/> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="336"/> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="353"/> + <source>Error</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/GpgContext.cpp" line="746"/> - <source>Error in signing:</source> - <translation>Ошибка в подписании:</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="266"/> + <source>Key Not Exists</source> + <translation type="unfinished"></translation> </message> -</context> -<context> - <name>GpgPathsTab</name> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="711"/> - <source>Relative path to keydb</source> - <translation>Относительный путь к Keydb</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="337"/> + <source>The communication content with the server does not meet the requirements</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="724"/> - <source>Current keydb path: </source> - <translation>Текущий путь ключей:</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="350"/> + <source>Notice</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="729"/> - <source><b>NOTE: </b> Gpg4usb will restart automatically if you change the keydb path!</source> - <translation><b> Примечание: </ b> GPG4USB автоматически перезагрузится, если вы измените путь ключей!</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="351"/> + <source>Succeed in getting service token</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="758"/> - <source>Choose keydb directory</source> - <translation>Выберите каталог keydb.</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="353"/> + <source>There is a problem with the communication with the server</source> + <translation type="unfinished"></translation> </message> </context> <context> - <name>ImportFromGnupgPage</name> - <message> - <location filename="../../src/ui/Wizard.cpp" line="302"/> - <source>Import keys...</source> - <translation>Импорт клавиш ...</translation> - </message> - <message> - <location filename="../../src/ui/Wizard.cpp" line="303"/> - <source>...from existing GnuPG installation</source> - <translation>... Из существующей установки GNUPG</translation> - </message> - <message> - <location filename="../../src/ui/Wizard.cpp" line="305"/> - <source>You can import keys from a locally installed GnuPG.<br><br> The location is read from registry in Windows or assumed to be the .gnupg folder in the your home directory in Linux.<br></source> - <translation>Вы можете импортировать ключи от локально установленного GNUPG. <br> <br> Местоположение читается из реестра в Windows или предполагается, что папка .gnupg в вашем домашнем каталоге в Linux. <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br></translation> - </message> - <message> - <location filename="../../src/ui/Wizard.cpp" line="309"/> - <source>Import keys from GnuPG</source> - <translation>Импорт клавиш от GNUPG</translation> - </message> + <name>GpgME::GpgContext</name> <message> - <location filename="../../src/ui/Wizard.cpp" line="323"/> - <source>Import Error</source> - <translation>Ошибка импорта</translation> + <location filename="../../src/gpg/gpg_context/GpgContext.cpp" line="184"/> + <source>Wrong password</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="323"/> - <source>Couldn't locate GnuPG home directory</source> - <translation>Не мог найти домашний каталог GNUPG</translation> + <location filename="../../src/gpg/gpg_context/GpgContext.cpp" line="192"/> + <source>Enter Password for</source> + <translation type="unfinished"></translation> </message> -</context> -<context> - <name>ImportFromGpg4usbPage</name> <message> - <location filename="../../src/ui/Wizard.cpp" line="225"/> - <source>Import from...</source> - <translation>Импорт из ...</translation> + <location filename="../../src/gpg/gpg_context/GpgContext.cpp" line="196"/> + <source>Enter Password</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="226"/> - <source>...existing GPGFrontend</source> - <translation>... Существующие GPGFRontend</translation> + <location filename="../../src/gpg/gpg_context/GpgContext.cpp" line="258"/> + <source>Processing</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="228"/> - <source>You can import keys and/or settings from existing GPGFrontend. <br><br>Just check what you want to import, click the import button and choose the directory of your other GPGFrontend in the appearing file dialog.</source> - <translation>Вы можете импортировать ключи и / или настройки из существующих GPGFRontend.<br> <br> <br> Просто проверьте, что вы хотите импортировать, нажмите кнопку «Импорт» и выберите каталог других GPGFRontend в диалоговом окне появления файла.</translation> + <location filename="../../src/gpg/gpg_context/GpgContextBasicOpera.cpp" line="164"/> + <source>Key Selection</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="235"/> - <source>Keys</source> - <translation>Ключи</translation> + <location filename="../../src/gpg/gpg_context/GpgContextBasicOpera.cpp" line="164"/> + <source>No Private Key Selected</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="239"/> - <source>Configuration</source> - <translation>Конфигурация</translation> + <location filename="../../src/gpg/gpg_context/GpgContextBasicOpera.cpp" line="195"/> + <source>Error in signing:</source> + <translation type="unfinished"></translation> </message> +</context> +<context> + <name>GpgPathsTab</name> <message> - <location filename="../../src/ui/Wizard.cpp" line="241"/> - <source>Import from GPGFrontend</source> - <translation>Импорт от GPGFRontend</translation> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="139"/> + <source>Relative path to keydb</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="256"/> - <source>Other GPGFrontend directory</source> - <translation>Другие каталога GPGFRontend</translation> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="152"/> + <source>Current keydb path: </source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="275"/> - <source>Configuration Imported</source> - <translation>Конфигурация импортирована</translation> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="157"/> + <source><b>NOTE: </b> Gpg4usb will restart automatically if you change the keydb path!</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="276"/> - <source>Imported Configuration from old GPGFrontend.<br>Will now restart to activate the configuration.</source> - <translation>Импортированная конфигурация из старых GPGFRontend. <br> теперь перезагрузится, чтобы активировать конфигурацию.</translation> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="186"/> + <source>Choose keydb directory</source> + <translation type="unfinished"></translation> </message> </context> <context> @@ -558,78 +645,78 @@ <message> <location filename="../../src/ui/widgets/InfoBoardWidget.cpp" line="40"/> <source>Import missing key from Keyserver</source> - <translation>Импортировать недостающий ключ от Keyserver</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/InfoBoardWidget.cpp" line="57"/> - <source>Optional Actions Menu</source> - <translation>Дополнительные действия меню действий</translation> + <source>Optional Actions</source> + <translation type="unfinished"></translation> </message> </context> <context> <name>InfoTab</name> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="74"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="76"/> <source><br><center>GPGFrontend is an easy-to-use, compact, cross-platform, <br>and installation-free gpg front-end tool.<br>It visualizes most of the common operations of gpg commands.<br>It's licensed under the GPL v3<br><br><b>Developer:</b><br>Saturneric<br><br>If you have any questions or suggestions, raise an issue<br/>at <a href="https://github.com/saturneric/GpgFrontend">GitHub</a> or send a mail to my mailing list at <a href="mailto:[email protected]">[email protected]</a>.</source> - <translation><br> <Center> GPGFRontend - это простое в использовании, компактной, кроссплатформе, <br> и без установочного интерфейса GPG. <br> это визуализирует большую часть общих операций команд GPG. <BR> Он лицензирован под GPL V3 <br> <br> <b> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> Если у вас есть какие-либо вопросы или предложения, повысить проблему <br/>href = "https://github.com/saturneric/gpgfrontend"> github </a> или отправьте письмо в мой список рассылки на <a href="mailte: @bktus.com"> [email protected] </ a>.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="82"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="84"/> <source><br><br> Built with Qt </source> - <translation><br> <br> построен с Qt</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="83"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="85"/> <source> and GPGME </source> - <translation>и GPGME</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="84"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="86"/> <source><br>Built at </source> - <translation><br> построен</translation> + <translation type="unfinished"></translation> </message> </context> <context> <name>IntroPage</name> <message> - <location filename="../../src/ui/Wizard.cpp" line="111"/> + <location filename="../../src/ui/Wizard.cpp" line="66"/> <source>Getting Started...</source> - <translation>Начиная...</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="112"/> + <location filename="../../src/ui/Wizard.cpp" line="67"/> <source>... with GPGFrontend</source> - <translation>... с gpgfrontend</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="114"/> + <location filename="../../src/ui/Wizard.cpp" line="69"/> <source>Welcome to use GPGFrontend for decrypting and signing text or file!</source> - <translation>Добро пожаловать использовать GPGFRontend для расшифровки и подписания текста или файла!</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="116"/> + <location filename="../../src/ui/Wizard.cpp" line="71"/> <source>is a Powerful, Easy-to-Use, Compact, Cross-Platform, and Installation-Free OpenPGP Crypto Tool.</source> - <translation>Является мощным, простым в использовании, компактной, кроссплатформенной и монтажной программой Crypto Crypto OpenPGP.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="117"/> + <location filename="../../src/ui/Wizard.cpp" line="72"/> <source>For brief information have a look at the</source> - <translation>Для краткой информации посмотрите на</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="118"/> + <location filename="../../src/ui/Wizard.cpp" line="74"/> <source>Overview</source> - <translation>Обзор</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="119"/> + <location filename="../../src/ui/Wizard.cpp" line="75"/> <source>by clicking the link, the page will open in the web browser</source> - <translation>Нажав на ссылку, страница откроется в веб-браузере</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="127"/> + <location filename="../../src/ui/Wizard.cpp" line="83"/> <source>Choose a Language</source> - <translation>Выберите язык</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -637,182 +724,161 @@ <message> <location filename="../../src/ui/keypair_details/KeyDetailsDialog.cpp" line="31"/> <source>KeyPair</source> - <translation>Keypair.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyDetailsDialog.cpp" line="32"/> <source>UIDs</source> - <translation>UIDs</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyDetailsDialog.cpp" line="33"/> <source>Subkeys</source> - <translation>Подсказки</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyDetailsDialog.cpp" line="40"/> <source>Key Details</source> - <translation>Основные детали</translation> + <translation type="unfinished"></translation> </message> </context> <context> <name>KeyGenDialog</name> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="32"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="33"/> <source>Generate Key</source> - <translation>Генерировать ключ</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="68"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="69"/> <source> Name must contain at least five characters. </source> - <translation>Имя должно содержать не менее пяти символов.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="70"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="71"/> <source> Please give a email address. </source> - <translation>Пожалуйста, дайте адрес электронной почты.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="77"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="78"/> <source> Expiration time no more than 2 years. </source> - <translation>Время истечения не более 2 лет.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="103"/> - <source>Generating Key...</source> - <translation>Генератор ключа ...</translation> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="112"/> + <source>Success</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="106"/> - <source>Collecting random data for key generation. - This may take a while. - To speed up the process use your computer - (e.g. browse the net, listen to music,...)</source> - <translation>Сбор случайных данных для генерации ключей. - Это может занять некоторое время. - Чтобы ускорить процесс, используйте свой компьютер - (например, просмотрите чистую, слушаю музыку, ...)</translation> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="112"/> + <source>The new key pair has been generated.</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="150"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="116"/> + <source>Failure</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="145"/> <source>Key Usage</source> - <translation>Ключевое использование</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="152"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="147"/> <source>Encryption</source> - <translation>Шифрование</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="155"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="150"/> <source>Signing</source> - <translation>Подписание</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="158"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="153"/> <source>Certification</source> - <translation>Сертификация</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="161"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="156"/> <source>Authentication</source> - <translation>Аутентификация</translation> - </message> - <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="312"/> - <source>Success</source> - <translation>Успех</translation> - </message> - <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="312"/> - <source>The new key pair has been generated.</source> - <translation>Новая ключевая пара была сгенерирована.</translation> - </message> - <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="314"/> - <source>Failure</source> - <translation>Отказ</translation> - </message> - <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="314"/> - <source>An error occurred during key generation.</source> - <translation>Произошла ошибка во время генерации ключей.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="350"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="338"/> <source>Name:</source> - <translation>Имя:</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="351"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="339"/> <source>Email Address:</source> - <translation>Адрес электронной почты:</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="352"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="340"/> <source>Comment:</source> - <translation>Комментарий:</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="353"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="341"/> <source>Expiration Date:</source> - <translation>Дата окончания срока:</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="354"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="342"/> <source>Never Expire</source> - <translation>Никогда не истекаешь</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="355"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="343"/> <source>KeySize (in Bit):</source> - <translation>Клинизировать (по-бит):</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="356"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="344"/> <source>Key Type:</source> - <translation>Тип ключа:</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="357"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="345"/> <source>Non Pass Phrase</source> - <translation>Не проходящая фраза</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="370"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="358"/> <source>Basic Information</source> - <translation>Основная информация</translation> + <translation type="unfinished"></translation> </message> </context> <context> <name>KeyGenPage</name> <message> - <location filename="../../src/ui/Wizard.cpp" line="366"/> + <location filename="../../src/ui/Wizard.cpp" line="183"/> <source>Create a keypair...</source> - <translation>Создать клавиатуру ...</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="367"/> + <location filename="../../src/ui/Wizard.cpp" line="184"/> <source>...for decrypting and signing messages</source> - <translation>... Для расшифровки и подписания сообщений</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="368"/> + <location filename="../../src/ui/Wizard.cpp" line="185"/> <source>You should create a new keypair.The pair consists of a public and a private key.<br>Other users can use the public key to encrypt messages for you and verify messages signed by you.You can use the private key to decrypt and sign messages.<br>For more information have a look at the offline tutorial (which then is shown in the main window):</source> - <translation>Вы должны создать новую keypair. Пара состоит из публики и закрытого ключа. <br> Другие пользователи могут использовать открытый ключ для шифрования сообщений для вас и проверить сообщения, подписанные вами. Вы можете использовать закрытый ключ для расшифровки и подписатьСообщения. <br> Для получения дополнительной информации посмотрите на автономный учебник (который затем отображается в главном окне):</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="375"/> + <location filename="../../src/ui/Wizard.cpp" line="192"/> <source>Offline tutorial</source> - <translation>Оффлайн учебник</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="382"/> + <location filename="../../src/ui/Wizard.cpp" line="199"/> <source>Create New Key</source> - <translation>Создать новый ключ</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -821,277 +887,276 @@ <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="34"/> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="53"/> <source>Key Update Details</source> - <translation>Детали обновления ключа</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="34"/> <source>No keys found</source> - <translation>Ключи не найдены</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="36"/> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="55"/> <source>Key Import Details</source> - <translation>Детали ввоза ключей</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="36"/> <source>No keys found to import</source> - <translation>Клавиши не найдены для импорта</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="64"/> <source>General key info</source> - <translation>Общая ключевая информация</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="67"/> <source>Considered:</source> - <translation>Считается:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="71"/> <source>Public unchanged:</source> - <translation>Общественность без изменений:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="76"/> <source>Imported:</source> - <translation>Импортирован:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="81"/> <source>Not imported:</source> - <translation>Не импортировано:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="86"/> <source>Private read:</source> - <translation>Частный читал:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="91"/> <source>Private imported:</source> - <translation>Частный импорт:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="96"/> <source>Private unchanged:</source> - <translation>Частный без изменений:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="111"/> <source>Name</source> - <translation>Имя</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="111"/> <source>Email</source> - <translation>Электронное письмо</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="111"/> <source>Status</source> - <translation>Статус</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="111"/> <source>Fingerprint</source> - <translation>Отпечаток пальца</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="135"/> <source>private</source> - <translation>частный</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="138"/> <source>public</source> - <translation>публичный</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="141"/> <source>unchanged</source> - <translation>без изменений</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="144"/> <source>new key</source> - <translation>новый ключ</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="147"/> <source>new subkey</source> - <translation>Новый подраздел</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="151"/> <source>new signature</source> - <translation>Новая подпись</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="155"/> <source>new uid</source> - <translation>Новый UID</translation> + <translation type="unfinished"></translation> </message> </context> <context> <name>KeyList</name> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="77"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="76"/> <source>Select</source> - <translation>Выбирать</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="77"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="76"/> <source>Type</source> - <translation>Тип</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="77"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="76"/> <source>Name</source> - <translation>Имя</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="77"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="76"/> <source>Email Address</source> - <translation>Адрес электронной почты</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="78"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="77"/> <source>Usage</source> - <translation>Применение</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="78"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="77"/> <source>Validity</source> - <translation>Срок действия</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="78"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="77"/> <source>Finger Print</source> - <translation>Печать пальцев</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="315"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="302"/> <source>Import Keys</source> - <translation>Импорт клавиш</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="317"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="305"/> <source>You've dropped something on the table. GpgFrontend will now try to import key(s).</source> - <translation>Вы что-то бросили на стол. - GPGFRontend теперь попробует импортировать ключ (ы).</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="320"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="308"/> <source>Always import without bothering.</source> - <translation>Всегда импортировать, не беспокоясь.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="356"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="341"/> <source>Couldn't Open File: </source> - <translation>Не удалось открыть файл:</translation> + <translation type="unfinished"></translation> </message> </context> <context> <name>KeyMgmt</name> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="81"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="82"/> <source>Key Pair Management</source> - <translation>Ключевое управление паре</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="88"/> <source>&Open</source> - <translation>&Открыть</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="89"/> <source>Ctrl+O</source> - <translation>Ctrl + O.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="90"/> <source>Open Key File</source> - <translation>Откройте файл ключа</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="93"/> <source>&Close</source> - <translation>&Закрывать</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="94"/> <source>Ctrl+Q</source> - <translation>Ctrl + Q.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="96"/> <source>Close</source> - <translation>Закрывать</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="99"/> <source>New Keypair</source> - <translation>Новая клавиатура</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="100"/> <source>Ctrl+N</source> - <translation>Ctrl + N.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="102"/> <source>Generate KeyPair</source> - <translation>Создать ключевую пару</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="105"/> <source>New Subkey</source> - <translation>Новый подраздел</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="106"/> <source>Ctrl+Shift+N</source> - <translation>Ctrl + Shift + N</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="108"/> <source>Generate Subkey For Selected KeyPair</source> - <translation>Создать подраздел для выбранной клавиатуры</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="111"/> - <location filename="../../src/ui/KeyMgmt.cpp" line="152"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="151"/> <source>&File</source> - <translation>&Файл</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="113"/> <source>Import New Key From File</source> - <translation>Импортировать новый ключ из файла</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="116"/> <source>&Clipboard</source> - <translation>И буфер обмена</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="118"/> <source>Import New Key From Clipboard</source> - <translation>Импортировать новый ключ из буфера обмена</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="121"/> <source>&Keyserver</source> - <translation>& Keyserver</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="123"/> <source>Import New Key From Keyserver</source> - <translation>Импортировать новый ключ от Keyserver</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="126"/> @@ -1101,149 +1166,163 @@ <message> <location filename="../../src/ui/KeyMgmt.cpp" line="128"/> <source>Export Selected Key(s) To Clipboard</source> - <translation>Экспорт выбранных клавиш в буфер обмена</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="131"/> <source>Export To &File</source> - <translation>Экспорт в & file</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="133"/> <source>Export Selected Key(s) To File</source> - <translation>Экспорт выбранных клавиш (ы) в файл</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="136"/> <source>Delete Selected Key(s)</source> - <translation>Удалить выбранные ключи (ы)</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="137"/> <source>Delete the Selected keys</source> - <translation>Удалить выбранные ключи</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="140"/> <source>Delete Checked Key(s)</source> - <translation>Удалить проверенные ключи (ы)</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="141"/> <source>Delete the Checked keys</source> - <translation>Удалить проверенные ключи</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="145"/> <source>Show Key Details</source> - <translation>Показать ключевые детали</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="146"/> <source>Show Details for this Key</source> - <translation>Показать детали для этого ключа</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="156"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="155"/> <source>&Key</source> - <translation>&Ключ</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="157"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="156"/> <source>&Generate Key</source> - <translation>Генерировать ключ</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="161"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="160"/> <source>&Import Key</source> - <translation>И Импорт ключ</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="173"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="171"/> <source>Key</source> - <translation>Ключ</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="181"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="179"/> <source>Generate</source> - <translation>Генерация</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="182"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="180"/> <source>Generate A New Keypair or Subkey</source> - <translation>Генерировать новую клавиатуру или подразделение</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="191"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="189"/> <source>Import key</source> - <translation>Импорт ключ</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="192"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="190"/> <source>Import Key</source> - <translation>Импорт ключ</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="213"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="209"/> <source>Open Key</source> - <translation>Открыть ключ</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="213"/> - <location filename="../../src/ui/KeyMgmt.cpp" line="299"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="210"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="302"/> <source>Key Files</source> - <translation>Ключевые файлы</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="213"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="210"/> <source>Keyring files</source> - <translation>Ключевые файлы</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="218"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="216"/> <source>Couldn't Open File: </source> - <translation>Не удалось открыть файл:</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="268"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="262"/> <source>Deleting Keys</source> - <translation>Удаление клавиш</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="269"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="263"/> <source>Are you sure that you want to delete the following keys?</source> - <translation>Вы уверены, что хотите удалить следующие клавиши?</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="270"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="265"/> <source>The action can not be undone.</source> - <translation>Действие не может быть отменено.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="299"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="281"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="296"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="344"/> + <source>Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/KeyMgmt.cpp" line="281"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="296"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="344"/> + <source>Key Not Found.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/KeyMgmt.cpp" line="301"/> <source>Export Key To File</source> - <translation>Экспорт ключа в файл</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="309"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="312"/> <source>key(s) exported</source> - <translation>Ключ (ы) экспортирован</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="338"/> - <location filename="../../src/ui/KeyMgmt.cpp" line="345"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="349"/> <source>Invalid Operation</source> - <translation>Неверная операция</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="339"/> <source>Please select one KeyPair before doing this operation.</source> - <translation>Пожалуйста, выберите одну клавиатуру перед этой операцией.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="346"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="350"/> <source>If a key pair does not have a private key then it will not be able to generate sub-keys.</source> - <translation>Если ключевая пара не имеет частного ключа, то он не сможет генерировать подшиные клавиши.</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -1251,34 +1330,34 @@ <message> <location filename="../../src/ui/keypair_details/KeyNewUIDDialog.cpp" line="40"/> <source>Name</source> - <translation>Имя</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyNewUIDDialog.cpp" line="41"/> <source>Email</source> - <translation>Электронное письмо</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyNewUIDDialog.cpp" line="42"/> <source>Comment</source> - <translation>Комментарий</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyNewUIDDialog.cpp" line="55"/> <source>Create New UID</source> - <translation>Создать новый UID</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyNewUIDDialog.cpp" line="68"/> <source> Name must contain at least five characters. </source> - <translation>Имя должно содержать не менее пяти символов.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyNewUIDDialog.cpp" line="70"/> <source> Please give a email address. </source> - <translation>Пожалуйста, дайте адрес электронной почты.</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -1286,202 +1365,212 @@ <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="34"/> <source>Owner</source> - <translation>Владелец</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="35"/> <source>Master Key</source> - <translation>Отмычка</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="36"/> <source>Fingerprint</source> - <translation>Отпечаток пальца</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="37"/> <source>Additional UIDs</source> - <translation>Дополнительные UID</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="58"/> <source>Exists</source> - <translation>Существуют</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="58"/> <source>Not Exists</source> - <translation>Не существует</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="83"/> <source>Name:</source> - <translation>Имя:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="84"/> <source>Email Address:</source> - <translation>Адрес электронной почты:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="85"/> <source>Comment:</source> - <translation>Комментарий:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="90"/> <source>Key ID: </source> - <translation>Ключевой идентификатор:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="91"/> <source>Algorithm: </source> - <translation>Алгоритм:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="92"/> <source>Key Size:</source> - <translation>Размер ключа:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="93"/> <source>Nominal Usage: </source> - <translation>Номинальное использование:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="94"/> <source>Actual Usage: </source> - <translation>Фактическое использование:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="95"/> <source>Expires on: </source> - <translation>Годен до:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="96"/> <source>Last Update: </source> - <translation>Последнее обновление:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="97"/> <source>Secret Key Existence: </source> - <translation>Секретное ключевое существование:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="121"/> <source>Copy</source> - <translation>Скопировать</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="123"/> <source>copy fingerprint to clipboard</source> - <translation>Скопируйте отпечаток пальца в буфер обмена</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="133"/> <source>Operations</source> - <translation>Операции</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="136"/> <source>Export Private Key (Include Subkey)</source> - <translation>Экспорт закрытый ключ (включить подразделение)</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="141"/> <source>Modify Expiration Datetime (Master Key)</source> - <translation>Изменить истечения срока действия данных (главный ключ)</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="146"/> <source>Key Server Operation (Pubkey)</source> - <translation>Операция ключевым сервером (PUBKEY)</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="149"/> <source>Generate Revoke Certificate</source> - <translation>Создать сертификат Revoke.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="175"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="174"/> <source>Warning: The Master Key has expired.</source> - <translation>ПРЕДУПРЕЖДЕНИЕ. Срок действия главного ключа истек.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="178"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="177"/> <source>Warning: The Master Key has been revoked</source> - <translation>Предупреждение: главный ключ был отменен</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="202"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="201"/> <source>Exporting private Key</source> - <translation>Экспорт закрытого ключа</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="203"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="202"/> <source>You are about to export your</source> - <translation>Вы собираетесь экспортировать свой</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="204"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="203"/> <source>PRIVATE KEY</source> - <translation>Закрытый ключ</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="205"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="204"/> <source>This is NOT your Public Key, so DON'T give it away.</source> - <translation>Это не ваш открытый ключ, поэтому не отдавай.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="206"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="205"/> <source>Do you REALLY want to export your PRIVATE KEY?</source> - <translation>Вы действительно хотите экспортировать свой закрытый ключ?</translation> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="219"/> + <source>Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="219"/> + <source>Key Not Found.</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="221"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="224"/> <source>Export Key To File</source> - <translation>Экспорт ключа в файл</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="222"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="225"/> <source>Key Files</source> - <translation>Ключевые файлы</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="225"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="228"/> <source>Export Error</source> - <translation>Экспорт ошибок</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="225"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="228"/> <source>Couldn't open %1 for writing</source> - <translation>Не мог открыть% 1 для письма</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="295"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="298"/> <source>Never Expire</source> - <translation>Никогда не истекаешь</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="315"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="318"/> <source>Upload Key Pair to Key Server</source> - <translation>Загрузить ключевую пару на ключевой сервер</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="317"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="320"/> <source>Update Key Pair</source> - <translation>Обновить ключевую пару</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="340"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="343"/> <source>Generate revocation certificate</source> - <translation>Генерировать сертификат отзыва</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="343"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="346"/> <source>Revocation Certificates</source> - <translation>Сертификаты отзыва</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -1489,87 +1578,87 @@ <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="37"/> <source>Generate A New Subkey</source> - <translation>Генерировать новый подразделение</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="54"/> <source>Key ID: </source> - <translation>Ключевой идентификатор:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="55"/> <source>Algorithm: </source> - <translation>Алгоритм:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="56"/> <source>Key Size:</source> - <translation>Размер ключа:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="57"/> <source>Usage: </source> - <translation>Применение:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="58"/> <source>Expires On </source> - <translation>Годен до</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="59"/> <source>Last Update: </source> - <translation>Последнее обновление:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="60"/> <source>Existence: </source> - <translation>Существование:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="61"/> <source>Fingerprint: </source> - <translation>Отпечаток пальца:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="121"/> <source>Subkey ID</source> - <translation>ID SUBKEY ID</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="121"/> <source>Key Size</source> - <translation>Размер ключа</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="121"/> <source>Algo</source> - <translation>Что-нибудь</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="121"/> <source>Create Date</source> - <translation>Создать дату</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="121"/> <source>Expire Date</source> - <translation>Дата истечения срока годности</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="161"/> + <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="160"/> <source>Never Expire</source> - <translation>Никогда не истекаешь</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="185"/> + <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="184"/> <source>Never Expires</source> - <translation>Никогда не заканчивается</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="231"/> + <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="230"/> <source>Edit Expire Date</source> - <translation>Редактировать дату истечения срока действия</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -1577,64 +1666,64 @@ <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="39"/> <source>New UID</source> - <translation>Новый UID</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="40"/> <source>UID Management</source> - <translation>Управление UID</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="59"/> <source>UIDs</source> - <translation>UIDs</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="67"/> <source>Signature of Selected UID</source> - <translation>Подпись выбранного UID</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="103"/> <source>Select</source> - <translation>Выбирать</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="103"/> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="126"/> <source>Name</source> - <translation>Имя</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="103"/> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="126"/> <source>Email</source> - <translation>Электронное письмо</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="103"/> <source>Comment</source> - <translation>Комментарий</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="126"/> <source>Key ID</source> - <translation>Идентификатор ключа</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="126"/> <source>Create Date</source> - <translation>Создать дату</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="126"/> <source>Expired Date</source> - <translation>Истекший срок</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="219"/> <source>Never Expires</source> - <translation>Никогда не заканчивается</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="237"/> @@ -1644,33 +1733,33 @@ <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="480"/> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="487"/> <source>Invalid Operation</source> - <translation>Неверная операция</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="238"/> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="301"/> <source>Please select one or more UIDs before doing this operation.</source> - <translation>Пожалуйста, выберите один или несколько UID, прежде чем делать эту операцию.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="263"/> <source>Sign Selected UID(s)</source> - <translation>Знак выбран UID (ы)</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="265"/> <source>Delete Selected UID(s)</source> - <translation>Удалить выбранные UID (ы)</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="284"/> <source>Successful Operation</source> - <translation>Успешная операция</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="285"/> <source>Successfully added a new UID.</source> - <translation>Успешно добавил новый UID.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="288"/> @@ -1679,7 +1768,7 @@ <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="460"/> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="507"/> <source>Operation Failed</source> - <translation>Операция не удалась</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="289"/> @@ -1688,17 +1777,17 @@ <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="461"/> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="508"/> <source>An error occurred during the operation.</source> - <translation>Во время операции произошла ошибка.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="313"/> <source>Deleting UIDs</source> - <translation>Удаление UID</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="314"/> <source>Are you sure that you want to delete the following uids?</source> - <translation>Вы уверены, что хотите удалить следующие UID?</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="315"/> @@ -1706,73 +1795,73 @@ <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="454"/> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="501"/> <source>The action can not be undone.</source> - <translation>Действие не может быть отменено.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="355"/> <source>Set Primary UID</source> - <translation>Установите первичный UID</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="356"/> <source>Are you sure that you want to set the Primary UID to?</source> - <translation>Вы уверены, что хотите установить основной UID?</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="395"/> <source>Set As Primary</source> - <translation>Установить как первичный</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="397"/> <source>Sign UID</source> - <translation>Знак UID</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="399"/> <source>Delete UID</source> - <translation>Удалить UID</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="426"/> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="441"/> <source>Please select one UID before doing this operation.</source> - <translation>Пожалуйста, выберите один UID перед этой операцией.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="452"/> <source>Deleting UID</source> - <translation>Удаление UID</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="453"/> <source>Are you sure that you want to delete the following uid?</source> - <translation>Вы уверены, что хотите удалить следующий UID?</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="469"/> <source>Delete(Revoke) Key Signature</source> - <translation>Удалить (отозвать) подпись ключа</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="481"/> <source>Please select one Key Signature before doing this operation.</source> - <translation>Пожалуйста, выберите одну клавишу подпись перед выполнением этой операции.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="488"/> <source>To delete the signature, you need to have its corresponding public key in the local database.</source> - <translation>Чтобы удалить подпись, вам нужно иметь соответствующий открытый ключ в локальной базе данных.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="499"/> <source>Deleting Key Signature</source> - <translation>Удаление подписи ключей</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="500"/> <source>Are you sure that you want to delete the following signature?</source> - <translation>Вы уверены, что хотите удалить следующую подпись?</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -1780,140 +1869,140 @@ <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="40"/> <source>&Close</source> - <translation>&Закрывать</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="41"/> <source>&Import ALL</source> - <translation>И импорт все</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="42"/> <source>&Search</source> - <translation>&Поиск</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="45"/> <source>Search String:</source> - <translation>Строка поиска:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="49"/> <source>Key Server:</source> - <translation>Ключевой сервер:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="97"/> <source>Update Keys from Keyserver</source> - <translation>Обновлять ключи от Keyserver</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="99"/> <source>Import Keys from Keyserver</source> - <translation>Импорт клавиш от Keyserver</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="158"/> <source>UID</source> - <translation>UID</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="158"/> <source>Creation date</source> - <translation>Дата создания</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="158"/> <source>KeyID</source> - <translation>Кейд</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="158"/> <source>Tag</source> - <translation>Тег</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="179"/> <source>Text is empty.</source> - <translation>Текст пуст.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="213"/> <source>Not Key Found</source> - <translation>Не найден ключ</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="216"/> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="386"/> <source>Timeout</source> - <translation>Время ожидания</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="219"/> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="389"/> <source>Key Server Not Found</source> - <translation>Ключевой сервер не найден</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="222"/> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="392"/> <source>Connection Error</source> - <translation>Ошибка соединения</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="230"/> <source>Too many responses from keyserver!</source> - <translation>Слишком много ответов от Keyserver!</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="237"/> <source>No keys found, input may be kexId, retrying search with 0x.</source> - <translation>Не найдено ключей, вход может быть кекидом, повторный поиск с 0x.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="242"/> <source>No keys found containing the search string!</source> - <translation>Клавиши не найдены, содержащие строку поиска!</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="246"/> <source>Insufficiently specific search string!</source> - <translation>Недостаточно определенная строка поиска!</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="274"/> <source>revoked</source> - <translation>отзыв</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="277"/> <source>disabled</source> - <translation>отключен</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="317"/> <source><h4>%1 keys found. Double click a key to import it.</h4></source> - <translation><h4>% 1 ключей найден.Дважды щелкните ключ, чтобы импортировать его. </ H4></translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="383"/> <source>Key Not Found</source> - <translation>Ключ не найден</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="410"/> <source><h4>Key Updated</h4></source> - <translation><h4> ключ обновлен </ h4></translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="412"/> <source><h4>Key Imported</h4></source> - <translation><H4> КЛЮЧ импортирован </ H4></translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="473"/> <source>Upload Keys from Keyserver</source> - <translation>Клавиши загрузки от Keyserver</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -1921,22 +2010,22 @@ <message> <location filename="../../src/ui/keypair_details/KeySetExpireDateDialog.cpp" line="36"/> <source>Confirm</source> - <translation>Подтверждать</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeySetExpireDateDialog.cpp" line="41"/> <source>Never Expire</source> - <translation>Никогда не истекаешь</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeySetExpireDateDialog.cpp" line="61"/> <source>Operation Failed</source> - <translation>Операция не удалась</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeySetExpireDateDialog.cpp" line="62"/> <source>An error occurred during the operation.</source> - <translation>Во время операции произошла ошибка.</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -1944,73 +2033,93 @@ <message> <location filename="../../src/ui/keypair_details/KeyUIDSignDialog.cpp" line="72"/> <source>Expire Date</source> - <translation>Дата истечения срока годности</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyUIDSignDialog.cpp" line="81"/> <source>Sign For Key's UID(s)</source> - <translation>Знак для ключа UID (ы)</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyUIDSignDialog.cpp" line="100"/> + <location filename="../../src/ui/keypair_details/KeyUIDSignDialog.cpp" line="99"/> <source>Unsuccessful Operation</source> - <translation>Неудачная операция</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyUIDSignDialog.cpp" line="101"/> + <location filename="../../src/ui/keypair_details/KeyUIDSignDialog.cpp" line="100"/> <source>Signature operation failed for UID </source> - <translation>Операция подписи не удалась для UID</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyUIDSignDialog.cpp" line="108"/> + <location filename="../../src/ui/keypair_details/KeyUIDSignDialog.cpp" line="107"/> <source>Operation Complete</source> - <translation>Операция завершена</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyUIDSignDialog.cpp" line="109"/> + <location filename="../../src/ui/keypair_details/KeyUIDSignDialog.cpp" line="108"/> <source>The signature operation of the UID is complete</source> - <translation>Эксплуатация подписи UID завершена</translation> + <translation type="unfinished"></translation> </message> </context> <context> <name>KeyUploadDialog</name> <message> - <location filename="../../src/ui/KeyUploadDialog.cpp" line="49"/> + <location filename="../../src/ui/KeyUploadDialog.cpp" line="47"/> <source>Uploading Public Key</source> - <translation>Загрузка открытого ключа</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyUploadDialog.cpp" line="112"/> + <location filename="../../src/ui/KeyUploadDialog.cpp" line="110"/> <source>Key Not Found</source> - <translation>Ключ не найден</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyUploadDialog.cpp" line="115"/> + <location filename="../../src/ui/KeyUploadDialog.cpp" line="113"/> <source>Timeout</source> - <translation>Время ожидания</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyUploadDialog.cpp" line="118"/> + <location filename="../../src/ui/KeyUploadDialog.cpp" line="116"/> <source>Key Server Not Found</source> - <translation>Ключевой сервер не найден</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyUploadDialog.cpp" line="121"/> + <location filename="../../src/ui/KeyUploadDialog.cpp" line="119"/> <source>Connection Error</source> - <translation>Ошибка соединения</translation> + <translation type="unfinished"></translation> </message> </context> <context> <name>KeyserverTab</name> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="607"/> - <source>Default Key Server for import:</source> - <translation>Сервер по умолчанию для импорта:</translation> + <location filename="../../src/ui/settings/SettingsKeyServer.cpp" line="32"/> + <source>General</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/settings/SettingsKeyServer.cpp" line="53"/> + <source>No.</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="624"/> + <location filename="../../src/ui/settings/SettingsKeyServer.cpp" line="53"/> + <source>Address</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/settings/SettingsKeyServer.cpp" line="53"/> + <source>Available</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/settings/SettingsKeyServer.cpp" line="57"/> + <source>Default Key Server for Import:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/settings/SettingsKeyServer.cpp" line="67"/> <source>Add</source> - <translation>Добавлять</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -2018,742 +2127,839 @@ <message> <location filename="../../src/MainWindow.cpp" line="35"/> <source>Loading Gnupg</source> - <translation>Загрузка GNUPG.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/MainWindow.cpp" line="62"/> <source>ENV Loading Failed</source> - <translation>Загрузка ENV не удалась</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/MainWindow.cpp" line="63"/> <source>Gnupg is not installed correctly, please follow the ReadME instructions to install gnupg and then open GPGFrontend.</source> - <translation>GNUPG не установлен правильно, пожалуйста, следуйте инструкциям ReadMe для установки GNUPG, а затем открыть GPGFRontend.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="38"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="117"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="286"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="36"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="40"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="44"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="114"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="127"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="131"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="135"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="196"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="212"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="216"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="220"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="294"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="326"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="331"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="335"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="383"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="396"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="400"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="404"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="501"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="513"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="517"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="521"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="583"/> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="51"/> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="112"/> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="126"/> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="218"/> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="231"/> <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="525"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="702"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="885"/> - <source>No Key Selected</source> - <translation>Нет выбранного ключа</translation> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="541"/> + <source>Error</source> + <translation type="unfinished"></translation> </message> <message> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="36"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="127"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="212"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="396"/> + <source>Select a file before doing it.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="40"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="131"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="216"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="400"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="517"/> + <source>No permission to read this file.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="44"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="135"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="220"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="404"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="521"/> + <source>No permission to create file.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="49"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="150"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="226"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="409"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="375"/> + <source>Warning</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="50"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="151"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="227"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="410"/> + <source>The target file already exists, do you need to overwrite it?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="62"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="239"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="422"/> <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="45"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="124"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="532"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="709"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="126"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="298"/> + <source>No Key Selected</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="69"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="246"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="52"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="133"/> <source>Invalid Operation</source> - <translation>Неверная операция</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="46"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="533"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="710"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="70"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="247"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="53"/> <source>The selected key contains a key that does not actually have a encrypt usage.<br/></source> - <translation>Выбранный ключ содержит ключ, который на самом деле не имеет использование шифрования. <br/></translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="47"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="126"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="300"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="534"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="711"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="899"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="71"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="248"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="436"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="54"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="135"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="312"/> <source><br/>For example the Following Key: <br/></source> - <translation><br/> Например, следующий ключ: <br/></translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="65"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="554"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="91"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="72"/> <source>Encrypting</source> - <translation>Шифрование</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="94"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="368"/> - <source>Function Disabled</source> - <translation>Функция отключена</translation> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="114"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="196"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="294"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="383"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="501"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="583"/> + <source>An error occurred during operation.</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="95"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="369"/> - <source>Please go to the settings interface to enable and configure this function.</source> - <translation>Пожалуйста, перейдите на интерфейс настроек, чтобы включить и настроить эту функцию.</translation> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="268"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="151"/> + <source>Signing</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="125"/> - <source>The selected key contains a key that does not actually have a signature usage.<br/></source> - <translation>Выбранный ключ содержит клавишу, на самом деле не имеет использование подписи. <br/></translation> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="327"/> + <source>Please select the appropriate target file or signature file. Ensure that both are in this directory.</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="142"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="731"/> - <source>Signing</source> - <translation>Подписание</translation> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="331"/> + <source>No permission to read target file.</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="186"/> - <source>Decrypting</source> - <translation>Расшифровка</translation> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="335"/> + <source>No permission to read signature file.</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="246"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="816"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="353"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="259"/> <source>Verifying</source> - <translation>Проверка</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="298"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="897"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="434"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="310"/> <source>Invalid KeyPair</source> - <translation>Неверная keypair.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="299"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="898"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="435"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="311"/> <source>The selected keypair cannot be used for signing and encryption at the same time.<br/></source> - <translation>Выбранная клавиатура не может быть использована для подписания и шифрования одновременно. <br/></translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="310"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="317"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="909"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="916"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="446"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="453"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="322"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="329"/> <source>Incomplete Operation</source> - <translation>Неполная операция</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="311"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="910"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="447"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="323"/> <source>None of the selected key pairs can provide the encryption function.</source> - <translation>Ни одна из выбранных парных пар не может предоставлять функцию шифрования.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="318"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="917"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="454"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="330"/> <source>None of the selected key pairs can provide the signature function.</source> - <translation>Ни одна из выбранных парных пар не может обеспечить функцию подписи.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="335"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="936"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="473"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="365"/> <source>Encrypting and Signing</source> - <translation>Шифрование и подписание</translation> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="513"/> + <source>Select a file(.gpg/.asc) before doing it.</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="401"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="1014"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="551"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="461"/> <source>Decrypting and Verifying</source> - <translation>Расшифровка и проверка</translation> - </message> - <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="499"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="503"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="507"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="577"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="590"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="594"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="598"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="659"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="675"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="679"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="683"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="757"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="789"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="794"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="798"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="846"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="859"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="863"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="867"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="964"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="976"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="980"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="984"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="1046"/> - <source>Error</source> - <translation>Ошибка</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="499"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="590"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="675"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="859"/> - <source>Select a file before doing it.</source> - <translation>Выберите файл перед этим.</translation> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="43"/> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="155"/> + <source>Invalid Own Key</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="503"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="594"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="679"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="863"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="980"/> - <source>No permission to read this file.</source> - <translation>Нет разрешения на чтение этого файла.</translation> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="43"/> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="155"/> + <source>Own Key can not be use to do any operation.</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="507"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="598"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="683"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="867"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="984"/> - <source>No permission to create file.</source> - <translation>Нет разрешения на создание файла.</translation> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="52"/> + <source>Please obtain a Service Token from the server in the settings.</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="512"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="613"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="689"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="872"/> - <source>Warning</source> - <translation>Предупреждение</translation> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="91"/> + <source>Getting Cpt From Server</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="513"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="614"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="690"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="873"/> - <source>The target file already exists, do you need to overwrite it?</source> - <translation>Целевой файл уже существует, вам нужно перезаписать это?</translation> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="113"/> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="219"/> + <source>The communication content with the server does not meet the requirements</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="577"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="659"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="757"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="846"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="964"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="1046"/> - <source>An error occurred during operation.</source> - <translation>Во время работы произошла ошибка.</translation> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="126"/> + <source>Invalid short ciphertext</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="790"/> - <source>Please select the appropriate target file or signature file. Ensure that both are in this directory.</source> - <translation>Пожалуйста, выберите подходящий целевой файл или файл подписи.Убедитесь, что оба находятся в этом каталоге.</translation> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="144"/> + <source>Invalid Service Token</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="794"/> - <source>No permission to read target file.</source> - <translation>Нет разрешения на чтение целевого файла.</translation> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="145"/> + <source>Please go to the setting interface to get a ServiceToken.</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="798"/> - <source>No permission to read signature file.</source> - <translation>Нет разрешения на чтение файла подписи.</translation> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="203"/> + <source>Getting Scpt From Server</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="976"/> - <source>Select a file(.gpg/.asc) before doing it.</source> - <translation>Выберите файл (.gpg / .asc), прежде чем делать это.</translation> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="228"/> + <source>Notice: Use Decrypt & Verify operation to decrypt this short crypto text.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="231"/> + <source>There is a problem with the communication with the server</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="103"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="408"/> + <source>Function Disabled</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="104"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="409"/> + <source>Please go to the settings interface to enable and configure this function.</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="1082"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="134"/> + <source>The selected key contains a key that does not actually have a signature usage.<br/></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="186"/> + <source>Notice</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="186"/> + <source>Short Crypto Text only supports Decrypt & Verify.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="200"/> + <source>Decrypting</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="376"/> + <source>Automatic public key exchange failed.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="415"/> + <source>Service Token Empty</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="416"/> + <source>Please go to the settings interface to set Own Key and get Service Token.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="525"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="541"/> + <source>Key Not Found.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="572"/> <source>Outdated Version</source> - <translation>Устаревшая версия</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="1083"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="573"/> <source>This version(%1) is out of date, please update the latest version in time. </source> - <translation>Эта версия (% 1) устарела, пожалуйста, обновите последнюю версию вовремя.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="1085"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="1092"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="575"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="582"/> <source>You can download the latest version(%1) on Github Releases Page.<br/></source> - <translation>Вы можете скачать последнюю версию (% 1) на странице выбросов GitHub. <br/></translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="1089"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="579"/> <source>Unreleased Version</source> - <translation>Неразрешенная версия</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="1090"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="580"/> <source>This version(%1) has not been officially released and is not recommended for use in a production environment. <br/></source> - <translation>Эта версия (% 1) не была официально выпущена и не рекомендуется для использования в производственной среде.<br/></translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowSlotUI.cpp" line="58"/> <source>There is one unencrypted file in attachment folder</source> - <translation>Есть один незашифрованный файл в папке вложения</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowSlotUI.cpp" line="60"/> <source>There are </source> - <translation>Есть</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowSlotUI.cpp" line="60"/> <source> unencrypted files in attachment folder</source> - <translation>Непритвержденные файлы в папке вложения</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="30"/> <source>&New</source> - <translation>&Новый</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="36"/> <source>Open a new file</source> - <translation>Открыть новый файл</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="39"/> <source>&Open...</source> - <translation>&Открыть...</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="42"/> <source>Open an existing file</source> - <translation>Откройте существующий файл</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="45"/> <source>&Browser</source> - <translation>И браузер</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="47"/> <source>Open a file browser</source> - <translation>Откройте файловый браузер</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="50"/> <source>&Save</source> - <translation>&Сохранить</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="53"/> <source>Save the current File</source> - <translation>Сохранить текущий файл</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="56"/> <source>Save &As</source> - <translation>Сохранить как</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="59"/> <source>Save the current File as...</source> - <translation>Сохраните текущий файл как ...</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="62"/> <source>&Print</source> - <translation>&Распечатать</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="65"/> <source>Print Document</source> - <translation>Печать документа</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="68"/> <source>&Close</source> - <translation>&Закрывать</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="70"/> <source>Close file</source> - <translation>Закрыть файл</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="73"/> <source>&Quit</source> - <translation>&Покидать</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="76"/> <source>Quit Program</source> - <translation>Бросить программу</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="81"/> <source>&Undo</source> - <translation>&Отменить</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="83"/> <source>Undo Last Edit Action</source> - <translation>Отменить последнее редактировать действие</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="86"/> <source>&Redo</source> - <translation>& Redo.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="88"/> <source>Redo Last Edit Action</source> - <translation>Redo Последние редактировать действие</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="91"/> <source>Zoom In</source> - <translation>Увеличить</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="95"/> <source>Zoom Out</source> - <translation>Уменьшить</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="99"/> <source>&Paste</source> - <translation>&Вставить</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="102"/> <source>Paste Text From Clipboard</source> - <translation>Вставить текст из буфера обмена</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="105"/> <source>Cu&t</source> - <translation>С & т.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="108"/> <source>Cut the current selection's contents to the clipboard</source> - <translation>Разрежьте содержимое текущего выбора в буфер обмена</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="112"/> <source>&Copy</source> - <translation>И скопируйте</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="115"/> <source>Copy the current selection's contents to the clipboard</source> - <translation>Скопируйте содержимое текущего выбора в буфер обмена</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="119"/> <source>&Quote</source> - <translation>& quot</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="121"/> <source>Quote whole text</source> - <translation>Цитировать весь текст</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="124"/> <source>Select &All</source> - <translation>Выбрать все</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="127"/> <source>Select the whole text</source> - <translation>Выберите весь текст</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="130"/> <source>&Find</source> - <translation>&Находить</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="132"/> <source>Find a word</source> - <translation>Найти слово</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="135"/> <source>Remove &spacing</source> - <translation>Удалить и расстояние</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="138"/> <source>Remove double linebreaks, e.g. in pasted text from webmailer</source> - <translation>Удалить двойные линии, например,В вставленном тексте от Webmailer</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="141"/> <source>Se&ttings</source> - <translation>& Tutting.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="142"/> <source>Open settings dialog</source> - <translation>Диалог открытых настроек</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="148"/> <source>&Encrypt</source> - <translation>& Шифрование</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="151"/> <source>Encrypt Message</source> - <translation>Шифрование сообщения</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="154"/> <source>&Encrypt &Sign</source> - <translation>& Шифра и подписать</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="157"/> <source>Encrypt and Sign Message</source> - <translation>Зашифруйте и подписывать сообщение</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="160"/> <source>&Decrypt</source> - <translation>& Decrypt</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="163"/> <source>Decrypt Message</source> - <translation>Расшифровать сообщение</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="166"/> <source>&Decrypt &Verify</source> - <translation>& Decrypt & проверить</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="169"/> <source>Decrypt and Verify Message</source> - <translation>Расшифровать и проверить сообщение</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="175"/> <source>&Encrypt File</source> - <translation>Зашифруйте файл</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="176"/> <source>Encrypt File</source> - <translation>Зашифруйте файл</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="179"/> <source>&Decrypt File</source> - <translation>Дешифративный файл</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="180"/> <source>Decrypt File</source> - <translation>Дешифративный файл</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="183"/> <source>&Sign File</source> - <translation>& Знак файла</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="184"/> <source>Sign File</source> - <translation>Знак файла</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="187"/> <source>&Verify File</source> - <translation>И проверить файл</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="188"/> <source>Verify File</source> - <translation>Проверьте файл</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="192"/> <source>&Sign</source> - <translation>&Знак</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="195"/> <source>Sign Message</source> - <translation>Знак сообщения</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="198"/> <source>&Verify</source> - <translation>&Проверять</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="201"/> <source>Verify Message</source> - <translation>Проверить сообщение</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="207"/> <source>&Editor</source> - <translation>&Редактор</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="209"/> <source>Import New Key From Editor</source> - <translation>Импортировать новый ключ от редактора</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="212"/> <source>Manage &Keys</source> - <translation>Управление и клавиши</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="214"/> <source>Open Keymanagement</source> - <translation>Открыть ключманагемент</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="220"/> <source>&About</source> - <translation>&О</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="222"/> <source>Show the application's About box</source> - <translation>Показать приложение о коробке</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="228"/> <source>&Check for Updates</source> - <translation>Проверьте наличие обновлений</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="230"/> <source>Check for updates</source> - <translation>Проверьте наличие обновлений</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="233"/> <source>Open &Wizard</source> - <translation>Open & Wizard</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="234"/> <source>Open the wizard</source> - <translation>Откройте волшебник</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="239"/> <source>Append Selected Key(s) To Text</source> - <translation>Добавьте выбранные ключи в текст</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="240"/> <source>Append The Selected Keys To Text in Editor</source> - <translation>Добавьте выбранные ключи в текст в редакторе</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="243"/> <source>Copy Email</source> - <translation>Скопируйте электронную почту</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="244"/> <source>Copy selected Email to clipboard</source> - <translation>Скопируйте выбранную электронную почту в буфер обмена</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="248"/> <source>Show Key Details</source> - <translation>Показать ключевые детали</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="249"/> <source>Show Details for this Key</source> - <translation>Показать детали для этого ключа</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="252"/> <source>Refresh Key From Key Server</source> - <translation>Обновить ключ от ключевого сервера</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="253"/> <source>Refresh key from default key server</source> - <translation>Обновить ключ с сервера ключей по умолчанию</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="256"/> <source>Upload Public Key(s) To Server</source> - <translation>Загрузить открытый ключ (ы) на сервер</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="257"/> <source>Upload The Selected Public Keys To Server</source> - <translation>Загрузить выбранные открытые клавиши на сервер</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="272"/> <source>Remove PGP Header</source> - <translation>Удалить заголовок PGP</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="275"/> <source>Add PGP Header</source> - <translation>Добавить PGP заголовок</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="280"/> <source>&File</source> - <translation>&Файл</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="293"/> <source>&Edit</source> - <translation>&Редактировать</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="311"/> <source>&File...</source> - <translation>&Файл...</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="317"/> <source>&Crypt</source> - <translation>И склеил</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="328"/> <source>&Keys</source> - <translation>И ключи</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="329"/> <source>&Import Key</source> - <translation>И Импорт ключ</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="338"/> <source>&Steganography</source> - <translation>Стеганография</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="347"/> <source>&View</source> - <translation>&Вид</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="349"/> <source>&Help</source> - <translation>&Помощь</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="358"/> <source>File</source> - <translation>Файл</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="366"/> <source>Crypt</source> - <translation>Крипта</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="376"/> <source>Key</source> - <translation>Ключ</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="381"/> <source>Edit</source> - <translation>Редактировать</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="388"/> @@ -2763,145 +2969,183 @@ <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="400"/> <source>Import key from...</source> - <translation>Импорт ключ от ...</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="401"/> <source>Import key</source> - <translation>Импорт ключ</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="409"/> <source>Browser to view and operate file</source> - <translation>Браузер для просмотра и управления файлом</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="410"/> <source>Browser</source> - <translation>Браузер</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="428"/> <source>Ready</source> - <translation>Готовый</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="435"/> <source>Key ToolBox</source> - <translation>Ключевой набор инструментов</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="443"/> <source>Information Board</source> - <translation>Доска объявлений</translation> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>PubkeyGetter</name> + <message> + <location filename="../../src/server/api/PubkeyGetter.cpp" line="66"/> + <location filename="../../src/server/api/PubkeyGetter.cpp" line="90"/> + <source>Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/api/PubkeyGetter.cpp" line="67"/> + <location filename="../../src/server/api/PubkeyGetter.cpp" line="91"/> + <source>The communication content with the server does not meet the requirements</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>PubkeyUploader</name> + <message> + <location filename="../../src/server/api/PubkeyUploader.cpp" line="95"/> + <source>Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/api/PubkeyUploader.cpp" line="96"/> + <source>The communication content with the server does not meet the requirements</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/api/PubkeyUploader.cpp" line="103"/> + <source>Warning</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/api/PubkeyUploader.cpp" line="104"/> + <source>Partial failure of automatic pubkey exchange</source> + <translation type="unfinished"></translation> </message> </context> <context> <name>QApplication</name> <message> - <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="42"/> - <source>>Recipient: </source> - <translation>> Получатель:</translation> + <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="66"/> + <source> {>} Recipient: </source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="35"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="61"/> <source>One or More Bad Signatures.</source> - <translation>Одна или несколько плохих подписей.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="40"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="66"/> <source>A </source> - <translation>А.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="42"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="68"/> <source>Good </source> - <translation>Хорошо</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="45"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="71"/> <source>Bad </source> - <translation>Плохо</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="48"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="74"/> <source>Expired </source> - <translation>Истекший</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="51"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="77"/> <source>Missing Key's </source> - <translation>Отсутствует ключ</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="54"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="80"/> <source>Revoked Key's </source> - <translation>Отменил ключ</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="57"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="83"/> <source>Expired Key's </source> - <translation>Истекший ключ</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="60"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="86"/> <source>Missing CRL's </source> - <translation>Отсутствие CRL's.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="64"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="90"/> <source>Signature Fully Valid.</source> - <translation>Подпись полностью действительна.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="66"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="92"/> <source>Signature NOT Fully Valid.</source> - <translation>Подпись не полностью действительна.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="74"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="100"/> <source>Key is NOT present with ID 0x</source> - <translation>Ключ отсутствует с ID 0x</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="81"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="107"/> <source>A signature could NOT be verified due to a Missing Key </source> - <translation>Подпись не может быть проверена из-за недостающего ключа</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="85"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="111"/> <source>A signature is valid but the key used to verify the signature has been revoked </source> - <translation>Подпись действительна, но ключ, используемый для проверки подписи, был отменен</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="93"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="119"/> <source>A signature is valid but expired </source> - <translation>Подпись действительна, но истек</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="100"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="126"/> <source>A signature is valid but the key used to verify the signature has expired. </source> - <translation>Подпись действительна, но ключ, используемый для проверки подписи, истек.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="107"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="133"/> <source>There was some other error which prevented the signature verification. </source> - <translation>Была какая-то другая ошибка, которая предотвратила проверку подписи.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="113"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="139"/> <source>Error for key with fingerprint </source> - <translation>Ошибка для ключа с отпечатками пальца</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="128"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="152"/> <source>Signed By: </source> - <translation>Подписано:</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -2909,22 +3153,22 @@ <message> <location filename="../../src/ui/QuitDialog.cpp" line="29"/> <source>Unsaved Files</source> - <translation>Несохраненные файлы</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/QuitDialog.cpp" line="77"/> <source>%1 files contain unsaved information.<br/>Save the changes before closing?</source> - <translation>Файлы% 1 содержат несохраненную информацию. <br/> Сохранить изменения перед закрытием?</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/QuitDialog.cpp" line="88"/> <source>Check the files you want to save:</source> - <translation>Проверьте файлы, которые вы хотите сохранить:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/QuitDialog.cpp" line="89"/> <source><b>Note:</b> If you don't save these files, all changes are lost.<br/></source> - <translation><b> Примечание: </ b> Если вы не сохраните эти файлы, все изменения потеряны. <br/></translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -2932,264 +3176,360 @@ <message> <location filename="../../src/ui/SendMailDialog.cpp" line="35"/> <source>Incomplete configuration</source> - <translation>Неполная конфигурация</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/SendMailDialog.cpp" line="36"/> <source>The SMTP address is empty, please go to the setting interface to complete the configuration.</source> - <translation>Адрес SMTP пуст, перейдите на интерфейс настройки, чтобы завершить конфигурацию.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/SendMailDialog.cpp" line="86"/> <source> Recipient cannot be empty </source> - <translation>Получатель не может быть пустым</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/SendMailDialog.cpp" line="91"/> <source> One or more Recipient's Email Address is invalid </source> - <translation>Один или несколько адресов электронной почты получателя недействителен</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/SendMailDialog.cpp" line="97"/> <source> Sender cannot be empty </source> - <translation>Отправитель не может быть пустым</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/SendMailDialog.cpp" line="99"/> <source> Sender's Email Address is invalid </source> - <translation>Адрес электронной почты отправителя недействителен</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/SendMailDialog.cpp" line="155"/> <location filename="../../src/ui/SendMailDialog.cpp" line="160"/> <location filename="../../src/ui/SendMailDialog.cpp" line="165"/> <source>Fail</source> - <translation>Неудача</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/SendMailDialog.cpp" line="155"/> <source>Fail to Connect SMTP Server</source> - <translation>Не удается подключить SMTP-сервер</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/SendMailDialog.cpp" line="160"/> <source>Fail to Login into SMTP Server</source> - <translation>Не входить в систему на SMTP-сервер</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/SendMailDialog.cpp" line="165"/> <source>Fail to Send Mail to SMTP Server</source> - <translation>Не удалось отправить почту на SMTP-сервер</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/SendMailDialog.cpp" line="171"/> <source>Success</source> - <translation>Успех</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/SendMailDialog.cpp" line="171"/> <source>Succeed in Sending Mail to SMTP Server</source> - <translation>Успешно отправлять почту на SMTP-сервер</translation> + <translation type="unfinished"></translation> </message> </context> <context> <name>SendMailTab</name> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="289"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="33"/> <source>Enable</source> - <translation>Давать возможность</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="311"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="51"/> + <source>Check Connection</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="53"/> + <source>General</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="54"/> + <source>Connection</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="55"/> + <source>Preference</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="61"/> <source>SMTP Address</source> - <translation>SMTP-адрес</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="313"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="63"/> <source>Username</source> - <translation>Имя пользователя</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="315"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="65"/> <source>Password</source> - <translation>Пароль</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="317"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="67"/> <source>Port</source> - <translation>Порт</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="319"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="69"/> <source>Connection Security</source> - <translation>Безопасность подключения</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="322"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="75"/> <source>Default Sender</source> - <translation>Отправитель по умолчанию</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="404"/> - <location filename="../../src/ui/SettingsDialog.cpp" line="408"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="161"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="165"/> <source>Fail</source> - <translation>Неудача</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="404"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="161"/> <source>Fail to Connect SMTP Server</source> - <translation>Не удается подключить SMTP-сервер</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="408"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="165"/> <source>Fail to Login</source> - <translation>Не входить в систему</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="413"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="170"/> <source>Success</source> - <translation>Успех</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="413"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="170"/> <source>Succeed in connecting and login</source> - <translation>Преуспеть в подключении и входе в систему</translation> + <translation type="unfinished"></translation> </message> </context> <context> <name>SettingsDialog</name> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="40"/> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="39"/> <source>General</source> - <translation>Общий</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="41"/> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="40"/> <source>Appearance</source> - <translation>Появление</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="42"/> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="41"/> <source>Send Mail</source> - <translation>Отправить почту</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="43"/> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="42"/> <source>Key Server</source> - <translation>Ключевой сервер</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="45"/> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="44"/> <source>Advanced</source> - <translation>Передовой</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="58"/> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="59"/> <source>Settings</source> - <translation>Настройки</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="103"/> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="105"/> <source>System Default</source> - <translation>Системные установки по умолчанию</translation> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>SignResultAnalyse</name> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="29"/> + <source>[#] Sign Operation </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="32"/> + <source>[Success]</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="34"/> + <source>[Failed] </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="43"/> + <source>[>] New Signature: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="47"/> + <source> Sign Mode: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="49"/> + <source>Normal</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="51"/> + <source>Clear</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="53"/> + <source>Detach</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="59"/> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="61"/> + <source> Signer: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="61"/> + <source><unknown></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="63"/> + <source> Public Key Algo: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="64"/> + <source> Hash Algo: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="65"/> + <source> Date & Time: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="75"/> + <source>Invalid Signers: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="79"/> + <source>[>] Signer: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="80"/> + <source> Fingerprint: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="81"/> + <source> Reason: </source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>SignersPicker</name> + <message> + <location filename="../../src/ui/widgets/SignersPicker.cpp" line="28"/> + <source>Confirm</source> + <translation type="unfinished"></translation> </message> </context> <context> <name>SubkeyGenerateDialog</name> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="46"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="47"/> <source>Generate New Subkey</source> - <translation>Генерировать новый подразделение</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="61"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="62"/> <source>Encryption</source> - <translation>Шифрование</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="64"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="65"/> <source>Signing</source> - <translation>Подписание</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="67"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="68"/> <source>Certification</source> - <translation>Сертификация</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="70"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="71"/> <source>Authentication</source> - <translation>Аутентификация</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="114"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="115"/> <source>Expiration Date:</source> - <translation>Дата окончания срока:</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="115"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="116"/> <source>Never Expire</source> - <translation>Никогда не истекаешь</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="116"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="117"/> <source>KeySize (in Bit):</source> - <translation>Клинизировать (по-бит):</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="117"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="118"/> <source>Key Type:</source> - <translation>Тип ключа:</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="126"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="127"/> <source>Basic Information</source> - <translation>Основная информация</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="214"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="215"/> <source> Expiration time no more than 2 years. </source> - <translation>Время истечения не более 2 лет.</translation> - </message> - <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="235"/> - <source>Generating Subkey...</source> - <translation>Генерация подраздела ...</translation> - </message> - <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="238"/> - <source>Collecting random data for subkey generation. - This may take a while. - To speed up the process use your computer - (e.g. browse the net, listen to music,...)</source> - <translation>Сбор случайных данных для поколения подраздела. - Это может занять некоторое время. - Чтобы ускорить процесс, используйте свой компьютер - (например, просмотрите чистую, слушаю музыку, ...)</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="309"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="244"/> <source>Success</source> - <translation>Успех</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="309"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="244"/> <source>The new subkey has been generated.</source> - <translation>Новый подразделение было сгенерировано.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="311"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="247"/> <source>Failure</source> - <translation>Отказ</translation> - </message> - <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="311"/> - <source>An error occurred during subkey generation.</source> - <translation>Произошла ошибка во время поколения подраздела.</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -3197,13 +3537,13 @@ <message> <location filename="../../src/ui/widgets/TextEdit.cpp" line="53"/> <source>untitled</source> - <translation>Безватый</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/TextEdit.cpp" line="120"/> <location filename="../../src/ui/widgets/TextEdit.cpp" line="200"/> <source>Warning</source> - <translation>Предупреждение</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/TextEdit.cpp" line="121"/> @@ -3211,84 +3551,95 @@ <location filename="../../src/ui/widgets/TextEdit.cpp" line="482"/> <source>Cannot read file %1: %2.</source> - <translation>Не удается прочитать файл% 1: -% 2.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/TextEdit.cpp" line="175"/> <source>Open file</source> - <translation>Открыть файл</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/TextEdit.cpp" line="251"/> <source>File</source> - <translation>Файл</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/TextEdit.cpp" line="252"/> <source>Cannot write file %1: %2.</source> - <translation>Невозможно написать файл% 1: -% 2.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/TextEdit.cpp" line="270"/> <source>Save file</source> - <translation>Сохранить файл</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/TextEdit.cpp" line="333"/> <source>Unsaved document</source> - <translation>Несохраненный документ</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/TextEdit.cpp" line="334"/> <source>The document "%1" has been modified. Do you want to save your changes?<br/></source> - <translation>Документ «% 1» был изменен.Вы хотите сохранить ваши изменения? <br/></translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/TextEdit.cpp" line="337"/> <source><b>Note:</b> If you don't save these files, all changes are lost.<br/></source> - <translation><b> Примечание: </ b> Если вы не сохраните эти файлы, все изменения потеряны. <br/></translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/TextEdit.cpp" line="481"/> <source>Application</source> - <translation>Заявление</translation> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>UnknownSignersChecker</name> + <message> + <location filename="../../src/advance/UnknownSignersChecker.cpp" line="69"/> + <source>Warning</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/advance/UnknownSignersChecker.cpp" line="70"/> + <source>Automatic public key exchange failed.</source> + <translation type="unfinished"></translation> </message> </context> <context> <name>UpdateTab</name> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="127"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="129"/> <source>It is recommended that you always check the version of GpgFrontend and upgrade to the latest version.</source> - <translation>Рекомендуется, чтобы вы всегда проверяли версию GPGFRontend и обновите до последней версии.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="129"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="131"/> <source>New versions not only represent new features, but also often represent functional and security fixes.</source> - <translation>Новые версии не только представляют новые функции, но и часто представляют функциональные и безопасные исправления.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="133"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="135"/> <source>Current Version: </source> - <translation>Текущая версия:</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="141"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="143"/> <source>The current version is inconsistent with the latest version on github.</source> - <translation>Текущая версия несовместима с последней версией на Github.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="143"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="145"/> <source>Please click <a href="https://github.com/saturneric/GpgFrontend/releases">here</a> to download the latest version.</source> - <translation>Пожалуйста, нажмите <a href="http://github.com/saturneric/gpgfrontend/relestrestions"> Здесь </a> для загрузки последней версии.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="187"/> - <location filename="../../src/ui/help/AboutDialog.cpp" line="209"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="199"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="214"/> <source>Latest Version From Github: </source> - <translation>Последняя версия из GitHub:</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -3296,32 +3647,32 @@ <message> <location filename="../../src/ui/VerifyDetailsDialog.cpp" line="32"/> <source>Signature Details</source> - <translation>Подробности подписи</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/VerifyDetailsDialog.cpp" line="53"/> <source>Status: </source> - <translation>Статус:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/VerifyDetailsDialog.cpp" line="56"/> <source>No valid input found</source> - <translation>Допустимый вход не найден</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/VerifyDetailsDialog.cpp" line="67"/> <source>Error Validating signature</source> - <translation>Ошибка проверки подписи</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/VerifyDetailsDialog.cpp" line="70"/> <source>File was signed on %1 <br/> It Contains:<br/><br/></source> - <translation>Файл был подписан на% 1 <br/> он содержит: <br/> <br/></translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/VerifyDetailsDialog.cpp" line="72"/> <source>Signed on %1 <br/> It Contains:<br /><br/></source> - <translation>Подписано на% 1 <br/> Он содержит: <br /> <br/></translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -3329,22 +3680,22 @@ <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="36"/> <source>Import from keyserver</source> - <translation>Импорт от Keyserver</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="39"/> <source>Key not present with id 0x</source> - <translation>Ключ не присутствует с ID 0x</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="43"/> <source>Status:</source> - <translation>Статус:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="45"/> <source>Key not present in keylist</source> - <translation>Ключ не присутствует в кейлисте</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="58"/> @@ -3354,7 +3705,7 @@ <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="115"/> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="129"/> <source>Key Information is NOT Available</source> - <translation>Основная информация недоступна</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="60"/> @@ -3364,137 +3715,134 @@ <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="117"/> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="131"/> <source>Fingerprint: </source> - <translation>Отпечаток пальца:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="67"/> <source>Status: Cert Revoked</source> - <translation>Статус: Сертинг отозван</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="81"/> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="95"/> <source>Status: Signature Expired</source> - <translation>Статус: подпись истек</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="96"/> <source>Status: Key Expired</source> - <translation>Статус: ключ истек</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="110"/> <source>Status: General Error</source> - <translation>Статус: общая ошибка</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="124"/> <source>Status: Unknown Error</source> - <translation>Статус: неизвестная ошибка</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="159"/> <source>Signer Name:</source> - <translation>Название сигнала:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="160"/> <source>Signer Email:</source> - <translation>Email Signer Email:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="161"/> <source>Key's Fingerprint:</source> - <translation>Отпечаток ключа:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="162"/> <source>Valid:</source> - <translation>Действительный:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="163"/> <source>Flags:</source> - <translation>Флаги:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="171"/> <source>Fully Valid</source> - <translation>Полностью действителен</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="173"/> <source>NOT Fully Valid</source> - <translation>Не полностью действительным</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="180"/> <source>Good </source> - <translation>Хорошо</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="183"/> <source>Bad </source> - <translation>Плохо</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="186"/> <source>Expired </source> - <translation>Истекший</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="189"/> <source>Missing Key </source> - <translation>Пропавший ключ</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="192"/> <source>Revoked Key </source> - <translation>Отменил ключ</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="195"/> <source>Expired Key </source> - <translation>Ключ срок действия</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="198"/> <source>Missing CRL </source> - <translation>Пропавший CRL</translation> + <translation type="unfinished"></translation> </message> </context> <context> - <name>Wizard</name> + <name>VerifyResultAnalyse</name> <message> - <location filename="../../src/ui/Wizard.cpp" line="46"/> - <source>First Start Wizard</source> - <translation>Первый запуск волшебника</translation> - </message> - <message> - <location filename="../../src/ui/Wizard.cpp" line="76"/> - <source>Import Error</source> - <translation>Ошибка импорта</translation> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="31"/> + <source>[#] Verify Operation </source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="76"/> - <source>Couldn't locate any keyring file in %1</source> - <translation>Не мог найти любой файл ключа в% 1</translation> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="34"/> + <source>[Success]</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="84"/> - <location filename="../../src/ui/Wizard.cpp" line="95"/> - <source>Import error</source> - <translation>Ошибка импорта</translation> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="36"/> + <source>[Failed] </source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="85"/> - <source>Couldn't open private keyringfile: %1</source> - <translation>Не мог открыть частное cliedingfile:% 1</translation> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="158"/> + <source><Unknown></source> + <translation type="unfinished"></translation> </message> +</context> +<context> + <name>Wizard</name> <message> - <location filename="../../src/ui/Wizard.cpp" line="96"/> - <source>Couldn't open public keyringfile: %1</source> - <translation>Не удалось открыть открытый клавиатуре:% 1</translation> + <location filename="../../src/ui/Wizard.cpp" line="40"/> + <source>First Start Wizard</source> + <translation type="unfinished"></translation> </message> </context> </TS> diff --git a/resource/ts/gpgfrontend_zh_cn.ts b/resource/ts/gpgfrontend_zh_cn.ts index 58efd923..61728942 100644 --- a/resource/ts/gpgfrontend_zh_cn.ts +++ b/resource/ts/gpgfrontend_zh_cn.ts @@ -6,195 +6,306 @@ <message> <location filename="../../src/ui/help/AboutDialog.cpp" line="35"/> <source>About </source> - <translation>关于</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/help/AboutDialog.cpp" line="42"/> <source>General</source> - <translation>通用</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/help/AboutDialog.cpp" line="43"/> <source>Translators</source> - <translation>译者</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/help/AboutDialog.cpp" line="44"/> <source>Update</source> - <translation>更新</translation> + <translation type="unfinished"></translation> </message> </context> <context> <name>AdvancedTab</name> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="679"/> - <source>Show Steganography Options [Advanced]</source> - <translation>显示隐写术选项[高级]</translation> + <location filename="../../src/ui/settings/SettingsAdvanced.cpp" line="34"/> + <source>Show Steganography Options</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="681"/> + <location filename="../../src/ui/settings/SettingsAdvanced.cpp" line="36"/> <source>Show Steganographic Options.</source> - <translation>显示隐写术选项。</translation> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/settings/SettingsAdvanced.cpp" line="40"/> + <source>Pubkey Exchange</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/settings/SettingsAdvanced.cpp" line="42"/> + <source>Auto Pubkey Exchange</source> + <translation type="unfinished"></translation> </message> </context> <context> <name>AppearanceTab</name> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="444"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="34"/> <source>Iconsize</source> - <translation>图标化</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="446"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="36"/> <source>small</source> - <translation>小的</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="447"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="37"/> <source>medium</source> - <translation>中等的</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="448"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="38"/> <source>large</source> - <translation>大</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="464"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="54"/> <source>Iconstyle</source> - <translation>图标样式</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="466"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="56"/> <source>just text</source> - <translation>只是文字</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="467"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="57"/> <source>just icons</source> - <translation>只是图标</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="468"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="58"/> <source>text and icons</source> - <translation>文字和图标</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="484"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="74"/> <source>Windowstate</source> - <translation>窗口状态</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="487"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="77"/> <source>Save window size and position on exit.</source> - <translation>保存窗口大小和位置。</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="495"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="85"/> <source>Information Board</source> - <translation>信息板</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="501"/> + <location filename="../../src/ui/settings/SettingsAppearance.cpp" line="91"/> <source> Front Size</source> - <translation>字体大小</translation> + <translation type="unfinished"></translation> </message> </context> <context> <name>ChoosePage</name> <message> - <location filename="../../src/ui/Wizard.cpp" line="165"/> + <location filename="../../src/ui/Wizard.cpp" line="121"/> <source>Choose your action...</source> - <translation>选择你的行动......</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="166"/> + <location filename="../../src/ui/Wizard.cpp" line="122"/> <source>...by clicking on the appropriate link.</source> - <translation>...单击相应的链接。</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="168"/> + <location filename="../../src/ui/Wizard.cpp" line="124"/> <source>If you have never used GPGFrontend before and also don't own a gpg key yet you may possibly want to read how to</source> - <translation>如果您之前从未使用过GPG2Rend并且也没有拥有GPG密钥,但您可能希望阅读如何</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="170"/> + <location filename="../../src/ui/Wizard.cpp" line="127"/> <source>Generate Key</source> - <translation>生成密钥对</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="176"/> + <location filename="../../src/ui/Wizard.cpp" line="134"/> <source>If you want to learn how to encrypt, decrypt, sign and verify text, you can read </source> - <translation>如果您想了解如何加密,解密,签名和验证文本,可以阅读</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="178"/> + <location filename="../../src/ui/Wizard.cpp" line="136"/> <source>Encrypt & Decrypt Text</source> - <translation>加密&解密文本</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="178"/> - <location filename="../../src/ui/Wizard.cpp" line="190"/> + <location filename="../../src/ui/Wizard.cpp" line="136"/> + <location filename="../../src/ui/Wizard.cpp" line="149"/> <source>or</source> - <translation>或者</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="180"/> + <location filename="../../src/ui/Wizard.cpp" line="138"/> <source>Sign & Verify Text</source> - <translation>签名&验证文本</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="188"/> + <location filename="../../src/ui/Wizard.cpp" line="146"/> <source>If you want to operate file, you can read </source> - <translation>如果要操作文件,可以阅读</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="190"/> + <location filename="../../src/ui/Wizard.cpp" line="149"/> <source>Encrypt & Sign File</source> - <translation>加密&签名文件</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="192"/> + <location filename="../../src/ui/Wizard.cpp" line="152"/> <source>Sign & Verify File</source> - <translation>签名&验证文件</translation> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ComUtils</name> + <message> + <location filename="../../src/server/ComUtils.cpp" line="35"/> + <location filename="../../src/server/ComUtils.cpp" line="55"/> + <source>Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/ComUtils.cpp" line="35"/> + <source>Nothing Reply. Please check the Internet connection.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/ComUtils.cpp" line="55"/> + <source>Unknown Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/ComUtils.cpp" line="75"/> + <location filename="../../src/server/ComUtils.cpp" line="90"/> + <source>Network Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/ComUtils.cpp" line="75"/> + <source>Outdated Reply</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/ComUtils.cpp" line="87"/> + <source>Unknown Reason</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/ComUtils.cpp" line="90"/> + <source>Unknown Reply Format</source> + <translation type="unfinished"></translation> </message> </context> <context> <name>ConclusionPage</name> <message> - <location filename="../../src/ui/Wizard.cpp" line="407"/> + <location filename="../../src/ui/Wizard.cpp" line="224"/> <source>Ready.</source> - <translation>准备好。</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="408"/> + <location filename="../../src/ui/Wizard.cpp" line="225"/> <source>Have fun with GPGFrontend!</source> - <translation>在GPGFrontend玩得开心!</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="410"/> + <location filename="../../src/ui/Wizard.cpp" line="227"/> <source>You are ready to use GPGFrontend now.<br><br></source> - <translation>你现在准备好使用GPGFrontend。<br> <br></translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="412"/> + <location filename="../../src/ui/Wizard.cpp" line="229"/> <source>The Online Document</source> - <translation>在线文档</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="413"/> + <location filename="../../src/ui/Wizard.cpp" line="231"/> <source> will get you started with GPGFrontend. It will open in the main window.<br></source> - <translation>会带领你开始使用GPGFrontend。它将在主窗口中打开。<br></translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="420"/> + <location filename="../../src/ui/Wizard.cpp" line="238"/> <source>Open offline help.</source> - <translation>打开离线帮助。</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="423"/> + <location filename="../../src/ui/Wizard.cpp" line="241"/> <source>Dont show the wizard again.</source> - <translation>不要再次显示向导。</translation> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>DecryptResultAnalyse</name> + <message> + <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="30"/> + <source>[#] Decrypt Operation </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="33"/> + <source>[Success]</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="35"/> + <source>[Failed] </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="39"/> + <source>Unsupported Algo: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="46"/> + <source>File Name: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="52"/> + <source>Recipient(s): </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="82"/> + <source> Keu ID: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="83"/> + <source> Public Algo: </source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>EncryptResultAnalyse</name> + <message> + <location filename="../../src/gpg/result_analyse/EncryptResultAnalyse.cpp" line="41"/> + <source>Invalid Recipients: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/EncryptResultAnalyse.cpp" line="44"/> + <source>Fingerprint: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/EncryptResultAnalyse.cpp" line="45"/> + <source>Reason: </source> + <translation type="unfinished"></translation> </message> </context> <context> @@ -202,99 +313,98 @@ <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="32"/> <source>Decrypt File</source> - <translation>解密文件</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="34"/> <source>Encrypt File</source> - <translation>加密文件</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="36"/> <source>Sign File</source> - <translation>签名文件</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="38"/> <source>Verify File</source> - <translation>验证文件</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="47"/> <source>Input Parameters</source> - <translation>输入参数</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="53"/> <source>Target File</source> - <translation>目标文件</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="59"/> <source>Output File</source> - <translation>输出文件</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="75"/> <source>Signature File(.sig) Path</source> - <translation>签名文件(.sig)路径</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="134"/> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="177"/> <source>Open File</source> - <translation>打开文件</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="165"/> <source>Save File</source> - <translation>保存存档</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="194"/> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="245"/> <source>Couldn't open file</source> - <translation>无法打开文件</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="213"/> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="224"/> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="235"/> <source>Error</source> - <translation>错误</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="214"/> <source>Error Occurred During Encryption</source> - <translation>加密期间发生错误</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="225"/> <source>Error Occurred During Decryption</source> - <translation>解密期间发生错误</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="236"/> <source>Error Occurred During Signature</source> - <translation>签名期间发生错误</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="259"/> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="268"/> <source>File</source> - <translation>文件</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="260"/> <source>File exists! Do you want to overwrite it?</source> - <translation>文件已存在!你想覆盖它吗?</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/FileEncryptionDialog.cpp" line="269"/> <source>Cannot write file %1: %2.</source> - <translation>无法写入文件%1: -%2。</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -302,52 +412,52 @@ <message> <location filename="../../src/ui/widgets/FilePage.cpp" line="161"/> <source>Open</source> - <translation>打开</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/FilePage.cpp" line="163"/> <source>Delete</source> - <translation>删除</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/FilePage.cpp" line="165"/> <source>Encrypt and Sign</source> - <translation>加密和签名</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/FilePage.cpp" line="167"/> <source>Decrypt and Verify</source> - <translation>解密和验证</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/FilePage.cpp" line="169"/> <source>Only Sign</source> - <translation>只签名</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/FilePage.cpp" line="171"/> <source>Only Verify</source> - <translation>只验证</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/FilePage.cpp" line="222"/> <source>Warning</source> - <translation>警告</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/FilePage.cpp" line="223"/> <source>Are you sure you want to delete it?</source> - <translation>你确定你要删除它?</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/FilePage.cpp" line="233"/> <source>Error</source> - <translation>错误</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/FilePage.cpp" line="234"/> <source>Unable to delete the file or folder.</source> - <translation>无法删除文件或文件夹。</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -355,202 +465,179 @@ <message> <location filename="../../src/ui/FindWidget.cpp" line="38"/> <source>Find:</source> - <translation>查找:</translation> + <translation type="unfinished"></translation> </message> </context> <context> <name>GeneralTab</name> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="137"/> - <source>Remember Password</source> - <translation>记住密码</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="40"/> + <source>GpgFrontend Server</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="140"/> - <source>Remember password until closing gpg4usb</source> - <translation>记住密码,直到关闭GPG4USB</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="45"/> + <source>Server that provides short key and key exchange services</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="147"/> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="52"/> <source>Save Checked Keys</source> - <translation>保存选中密钥</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="150"/> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="55"/> <source>Save checked private keys on exit and restore them on next start.</source> - <translation>在退出时保存已选中的密钥对并在下次启动时恢复。</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="159"/> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="64"/> <source>Confirm drag'n'drop key import</source> - <translation>默认拖拽文件'触发密钥导入</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="162"/> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="67"/> <source>Import files dropped on the keylist without confirmation.</source> - <translation>无需确认导入文件是否要在密钥列表中显示。</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="169"/> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="74"/> <source>Language</source> - <translation>语言</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="178"/> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="83"/> <source><b>NOTE: </b> GpgFrontend will restart automatically if you change the language!</source> - <translation><b>注意:如果更改语言,则会自动重启!</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="187"/> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="92"/> <source>Own key</source> - <translation>我的密钥</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="195"/> - <source><none></source> - <translation><无></translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="96"/> + <source>Get Service Token</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="209"/> - <source>Key pair for synchronization and identity authentication</source> - <translation>用于同步和身份验证的密钥对</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="97"/> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="234"/> + <source>No Service Token Found</source> + <translation type="unfinished"></translation> </message> -</context> -<context> - <name>GpgME::GpgContext</name> <message> - <location filename="../../src/gpg/GpgContext.cpp" line="528"/> - <source>Wrong password</source> - <translation>密码错误</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="103"/> + <source><none></source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/GpgContext.cpp" line="536"/> - <source>Enter Password for</source> - <translation>输入密码</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="120"/> + <source>Key pair for synchronization and identity authentication</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/GpgContext.cpp" line="540"/> - <source>Enter Password</source> - <translation>输入密码</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="252"/> + <source>Invalid Operation</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/GpgContext.cpp" line="706"/> - <source>Key Selection</source> - <translation>密钥选择</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="253"/> + <source>Own Key can not be None while getting service token.</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/GpgContext.cpp" line="706"/> - <source>No Private Key Selected</source> - <translation>没有选择私钥</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="265"/> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="336"/> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="353"/> + <source>Error</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/GpgContext.cpp" line="746"/> - <source>Error in signing:</source> - <translation>签名时出错:</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="266"/> + <source>Key Not Exists</source> + <translation type="unfinished"></translation> </message> -</context> -<context> - <name>GpgPathsTab</name> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="711"/> - <source>Relative path to keydb</source> - <translation>keydB的相对路径</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="337"/> + <source>The communication content with the server does not meet the requirements</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="724"/> - <source>Current keydb path: </source> - <translation>当前密钥数据库路径:</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="350"/> + <source>Notice</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="729"/> - <source><b>NOTE: </b> Gpg4usb will restart automatically if you change the keydb path!</source> - <translation><b>注意:如果更改密钥数据库路径,则会自动重启!</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="351"/> + <source>Succeed in getting service token</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="758"/> - <source>Choose keydb directory</source> - <translation>选择密钥数据库目录</translation> + <location filename="../../src/ui/settings/SettingsGeneral.cpp" line="353"/> + <source>There is a problem with the communication with the server</source> + <translation type="unfinished"></translation> </message> </context> <context> - <name>ImportFromGnupgPage</name> - <message> - <location filename="../../src/ui/Wizard.cpp" line="302"/> - <source>Import keys...</source> - <translation>导入密钥......</translation> - </message> - <message> - <location filename="../../src/ui/Wizard.cpp" line="303"/> - <source>...from existing GnuPG installation</source> - <translation>...从现有的Gnupg安装</translation> - </message> - <message> - <location filename="../../src/ui/Wizard.cpp" line="305"/> - <source>You can import keys from a locally installed GnuPG.<br><br> The location is read from registry in Windows or assumed to be the .gnupg folder in the your home directory in Linux.<br></source> - <translation>您可以从本地安装的gnupg导入密钥。<br> <br>从Windows中的Registry读取位置,也可以在Linux中的主目录中假定为.gnupg文件夹。<br> <br></translation> - </message> + <name>GpgME::GpgContext</name> <message> - <location filename="../../src/ui/Wizard.cpp" line="309"/> - <source>Import keys from GnuPG</source> - <translation>从Gnupg导入密钥</translation> + <location filename="../../src/gpg/gpg_context/GpgContext.cpp" line="184"/> + <source>Wrong password</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="323"/> - <source>Import Error</source> - <translation>导入错误</translation> + <location filename="../../src/gpg/gpg_context/GpgContext.cpp" line="192"/> + <source>Enter Password for</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="323"/> - <source>Couldn't locate GnuPG home directory</source> - <translation>无法找到gnupg主目录</translation> - </message> -</context> -<context> - <name>ImportFromGpg4usbPage</name> - <message> - <location filename="../../src/ui/Wizard.cpp" line="225"/> - <source>Import from...</source> - <translation>导入于...</translation> + <location filename="../../src/gpg/gpg_context/GpgContext.cpp" line="196"/> + <source>Enter Password</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="226"/> - <source>...existing GPGFrontend</source> - <translation>......现有的GPGFrontend.</translation> + <location filename="../../src/gpg/gpg_context/GpgContext.cpp" line="258"/> + <source>Processing</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="228"/> - <source>You can import keys and/or settings from existing GPGFrontend. <br><br>Just check what you want to import, click the import button and choose the directory of your other GPGFrontend in the appearing file dialog.</source> - <translation>您可以从现有GPGFrontend导入密钥和/或设置。<br> <br>查看要导入的内容,单击“导入”按钮,然后在“出现的文件”对话框中选择其他GPGFrontend的目录。</translation> + <location filename="../../src/gpg/gpg_context/GpgContextBasicOpera.cpp" line="164"/> + <source>Key Selection</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="235"/> - <source>Keys</source> - <translation>密钥</translation> + <location filename="../../src/gpg/gpg_context/GpgContextBasicOpera.cpp" line="164"/> + <source>No Private Key Selected</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="239"/> - <source>Configuration</source> - <translation>配置</translation> + <location filename="../../src/gpg/gpg_context/GpgContextBasicOpera.cpp" line="195"/> + <source>Error in signing:</source> + <translation type="unfinished"></translation> </message> +</context> +<context> + <name>GpgPathsTab</name> <message> - <location filename="../../src/ui/Wizard.cpp" line="241"/> - <source>Import from GPGFrontend</source> - <translation>从GPGFrontend导入</translation> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="139"/> + <source>Relative path to keydb</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="256"/> - <source>Other GPGFrontend directory</source> - <translation>其他GPGFrontend目录</translation> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="152"/> + <source>Current keydb path: </source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="275"/> - <source>Configuration Imported</source> - <translation>配置导入</translation> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="157"/> + <source><b>NOTE: </b> Gpg4usb will restart automatically if you change the keydb path!</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="276"/> - <source>Imported Configuration from old GPGFrontend.<br>Will now restart to activate the configuration.</source> - <translation>从旧GPGFrontend导入配置。<br>现在将重新启动以激活配置。</translation> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="186"/> + <source>Choose keydb directory</source> + <translation type="unfinished"></translation> </message> </context> <context> @@ -558,78 +645,78 @@ <message> <location filename="../../src/ui/widgets/InfoBoardWidget.cpp" line="40"/> <source>Import missing key from Keyserver</source> - <translation>从密钥服务器导入丢失的密钥</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/InfoBoardWidget.cpp" line="57"/> - <source>Optional Actions Menu</source> - <translation>可选操作菜单</translation> + <source>Optional Actions</source> + <translation type="unfinished"></translation> </message> </context> <context> <name>InfoTab</name> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="74"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="76"/> <source><br><center>GPGFrontend is an easy-to-use, compact, cross-platform, <br>and installation-free gpg front-end tool.<br>It visualizes most of the common operations of gpg commands.<br>It's licensed under the GPL v3<br><br><b>Developer:</b><br>Saturneric<br><br>If you have any questions or suggestions, raise an issue<br/>at <a href="https://github.com/saturneric/GpgFrontend">GitHub</a> or send a mail to my mailing list at <a href="mailto:[email protected]">[email protected]</a>.</source> - <translation><br><center>GPGFrontend是一个易于使用,紧凑,跨平台,无需安装的GPG前端工具。<br>它可视化GPG命令的大多数常见操作。<br>它使用GPL V3许可证<br> <br> <br> <br> <br> <br> 作者:</b><br>Saturneric<br><br>如果你有任何疑问, 请发起一个issue<br/>到 <a href="https://github.com/saturneric/GpgFrontend">GitHub</a> 或者给我发邮件 <a href="mailto:[email protected]">[email protected]</a>.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="82"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="84"/> <source><br><br> Built with Qt </source> - <translation><br> <br>构建该程序使用了Qt</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="83"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="85"/> <source> and GPGME </source> - <translation>和gpgme</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="84"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="86"/> <source><br>Built at </source> - <translation><br>构建于</translation> + <translation type="unfinished"></translation> </message> </context> <context> <name>IntroPage</name> <message> - <location filename="../../src/ui/Wizard.cpp" line="111"/> + <location filename="../../src/ui/Wizard.cpp" line="66"/> <source>Getting Started...</source> - <translation>入门...</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="112"/> + <location filename="../../src/ui/Wizard.cpp" line="67"/> <source>... with GPGFrontend</source> - <translation>...与GPGFrontend.</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="114"/> + <location filename="../../src/ui/Wizard.cpp" line="69"/> <source>Welcome to use GPGFrontend for decrypting and signing text or file!</source> - <translation>欢迎使用GPGFrontend进行解密和签名文本或文件!</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="116"/> + <location filename="../../src/ui/Wizard.cpp" line="71"/> <source>is a Powerful, Easy-to-Use, Compact, Cross-Platform, and Installation-Free OpenPGP Crypto Tool.</source> - <translation>是一个功能强大,易于使用,小巧,跨平台和无需安装的OpenPGP加密工具。</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="117"/> + <location filename="../../src/ui/Wizard.cpp" line="72"/> <source>For brief information have a look at the</source> - <translation>了解简要信息请查看</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="118"/> + <location filename="../../src/ui/Wizard.cpp" line="74"/> <source>Overview</source> - <translation>概述</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="119"/> + <location filename="../../src/ui/Wizard.cpp" line="75"/> <source>by clicking the link, the page will open in the web browser</source> - <translation>通过单击链接,页面将在Web浏览器中打开</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="127"/> + <location filename="../../src/ui/Wizard.cpp" line="83"/> <source>Choose a Language</source> - <translation>选择一种语言</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -637,182 +724,161 @@ <message> <location filename="../../src/ui/keypair_details/KeyDetailsDialog.cpp" line="31"/> <source>KeyPair</source> - <translation>密钥对</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyDetailsDialog.cpp" line="32"/> <source>UIDs</source> - <translation>UID</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyDetailsDialog.cpp" line="33"/> <source>Subkeys</source> - <translation>子密钥</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyDetailsDialog.cpp" line="40"/> <source>Key Details</source> - <translation>密钥详情</translation> + <translation type="unfinished"></translation> </message> </context> <context> <name>KeyGenDialog</name> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="32"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="33"/> <source>Generate Key</source> - <translation>生成密钥</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="68"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="69"/> <source> Name must contain at least five characters. </source> - <translation>名称必须包含至少五个字符。</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="70"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="71"/> <source> Please give a email address. </source> - <translation>请提供电子邮件地址。</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="77"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="78"/> <source> Expiration time no more than 2 years. </source> - <translation>到期时间不超过2年。</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="103"/> - <source>Generating Key...</source> - <translation>生成密钥......</translation> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="112"/> + <source>Success</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="106"/> - <source>Collecting random data for key generation. - This may take a while. - To speed up the process use your computer - (e.g. browse the net, listen to music,...)</source> - <translation>收集密钥生成的随机数据。 - 可能还要等一下。 - 加快过程使用您的计算机 - (例如,浏览网,听音乐,......)</translation> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="112"/> + <source>The new key pair has been generated.</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="150"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="116"/> + <source>Failure</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="145"/> <source>Key Usage</source> - <translation>密钥用法</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="152"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="147"/> <source>Encryption</source> - <translation>加密</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="155"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="150"/> <source>Signing</source> - <translation>签名</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="158"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="153"/> <source>Certification</source> - <translation>认证</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="161"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="156"/> <source>Authentication</source> - <translation>验证</translation> - </message> - <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="312"/> - <source>Success</source> - <translation>成功</translation> - </message> - <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="312"/> - <source>The new key pair has been generated.</source> - <translation>已生成新的密钥对。</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="314"/> - <source>Failure</source> - <translation>失败</translation> - </message> - <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="314"/> - <source>An error occurred during key generation.</source> - <translation>密钥生成期间发生错误。</translation> - </message> - <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="350"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="338"/> <source>Name:</source> - <translation>名称:</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="351"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="339"/> <source>Email Address:</source> - <translation>电子邮件地址:</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="352"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="340"/> <source>Comment:</source> - <translation>备注:</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="353"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="341"/> <source>Expiration Date:</source> - <translation>过期日期:</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="354"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="342"/> <source>Never Expire</source> - <translation>永不过期</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="355"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="343"/> <source>KeySize (in Bit):</source> - <translation>密钥长度(位):</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="356"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="344"/> <source>Key Type:</source> - <translation>密钥类型:</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="357"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="345"/> <source>Non Pass Phrase</source> - <translation>无需密码保护</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="370"/> + <location filename="../../src/ui/keygen/KeygenDialog.cpp" line="358"/> <source>Basic Information</source> - <translation>基本信息</translation> + <translation type="unfinished"></translation> </message> </context> <context> <name>KeyGenPage</name> <message> - <location filename="../../src/ui/Wizard.cpp" line="366"/> + <location filename="../../src/ui/Wizard.cpp" line="183"/> <source>Create a keypair...</source> - <translation>新建一个密钥对......</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="367"/> + <location filename="../../src/ui/Wizard.cpp" line="184"/> <source>...for decrypting and signing messages</source> - <translation>...用于解密和签名消息</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="368"/> + <location filename="../../src/ui/Wizard.cpp" line="185"/> <source>You should create a new keypair.The pair consists of a public and a private key.<br>Other users can use the public key to encrypt messages for you and verify messages signed by you.You can use the private key to decrypt and sign messages.<br>For more information have a look at the offline tutorial (which then is shown in the main window):</source> - <translation>您应该创建一个新的keypair.该金对由公共和私钥组成。<br>其他用户可以使用公钥来加密为您的消息,并验证由您签名的消息。您可以使用私钥来解密和签名消息。<br> <br>更多信息看看脱机教程(然后在主窗口中显示):</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="375"/> + <location filename="../../src/ui/Wizard.cpp" line="192"/> <source>Offline tutorial</source> - <translation>离线教程</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="382"/> + <location filename="../../src/ui/Wizard.cpp" line="199"/> <source>Create New Key</source> - <translation>创建新密钥</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -821,429 +887,442 @@ <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="34"/> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="53"/> <source>Key Update Details</source> - <translation>密钥更新详细信息</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="34"/> <source>No keys found</source> - <translation>没有找到密钥</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="36"/> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="55"/> <source>Key Import Details</source> - <translation>密钥导入详细信息</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="36"/> <source>No keys found to import</source> - <translation>没有发现导入的密钥</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="64"/> <source>General key info</source> - <translation>通用密钥信息</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="67"/> <source>Considered:</source> - <translation>经过考虑的:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="71"/> <source>Public unchanged:</source> - <translation>公开未改变的:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="76"/> <source>Imported:</source> - <translation>导入:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="81"/> <source>Not imported:</source> - <translation>未导入:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="86"/> <source>Private read:</source> - <translation>私有读取:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="91"/> <source>Private imported:</source> - <translation>私有导入:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="96"/> <source>Private unchanged:</source> - <translation>私有未改变的:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="111"/> <source>Name</source> - <translation>名称</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="111"/> <source>Email</source> - <translation>电子邮件</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="111"/> <source>Status</source> - <translation>状态</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="111"/> <source>Fingerprint</source> - <translation>指纹</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="135"/> <source>private</source> - <translation>私有的</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="138"/> <source>public</source> - <translation>公有</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="141"/> <source>unchanged</source> - <translation>不变的</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="144"/> <source>new key</source> - <translation>新密钥</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="147"/> <source>new subkey</source> - <translation>新子密钥</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="151"/> <source>new signature</source> - <translation>新签名</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyImportDetailDialog.cpp" line="155"/> <source>new uid</source> - <translation>新UID</translation> + <translation type="unfinished"></translation> </message> </context> <context> <name>KeyList</name> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="77"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="76"/> <source>Select</source> - <translation>选择</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="77"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="76"/> <source>Type</source> - <translation>类型</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="77"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="76"/> <source>Name</source> - <translation>名称</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="77"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="76"/> <source>Email Address</source> - <translation>电子邮件地址</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="78"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="77"/> <source>Usage</source> - <translation>用法</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="78"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="77"/> <source>Validity</source> - <translation>有效性</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="78"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="77"/> <source>Finger Print</source> - <translation>指纹</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="315"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="302"/> <source>Import Keys</source> - <translation>导入密钥</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="317"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="305"/> <source>You've dropped something on the table. GpgFrontend will now try to import key(s).</source> - <translation>你拖拽了某些文件到表格上。 - GPGFrontend现在将尝试导入密钥。</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="320"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="308"/> <source>Always import without bothering.</source> - <translation>始终导入而不再询问。</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/widgets/KeyList.cpp" line="356"/> + <location filename="../../src/ui/widgets/KeyList.cpp" line="341"/> <source>Couldn't Open File: </source> - <translation>无法打开文件:</translation> + <translation type="unfinished"></translation> </message> </context> <context> <name>KeyMgmt</name> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="81"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="82"/> <source>Key Pair Management</source> - <translation>密钥对管理</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="88"/> <source>&Open</source> - <translation>&打开</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="89"/> <source>Ctrl+O</source> - <translation>Ctrl + O.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="90"/> <source>Open Key File</source> - <translation>打开密钥文件</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="93"/> <source>&Close</source> - <translation>&关闭</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="94"/> <source>Ctrl+Q</source> - <translation>Ctrl + Q.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="96"/> <source>Close</source> - <translation>关闭</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="99"/> <source>New Keypair</source> - <translation>新密钥对</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="100"/> <source>Ctrl+N</source> - <translation>Ctrl + N.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="102"/> <source>Generate KeyPair</source> - <translation>生成密钥对</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="105"/> <source>New Subkey</source> - <translation>新子密钥</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="106"/> <source>Ctrl+Shift+N</source> - <translation>ctrl + shift + n</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="108"/> <source>Generate Subkey For Selected KeyPair</source> - <translation>为选定的keypair生成subkey</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="111"/> - <location filename="../../src/ui/KeyMgmt.cpp" line="152"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="151"/> <source>&File</source> - <translation>&文件</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="113"/> <source>Import New Key From File</source> - <translation>从文件导入新密钥</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="116"/> <source>&Clipboard</source> - <translation>&剪贴板</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="118"/> <source>Import New Key From Clipboard</source> - <translation>从剪贴板导入新密钥</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="121"/> <source>&Keyserver</source> - <translation>&密钥服务器</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="123"/> <source>Import New Key From Keyserver</source> - <translation>从密钥服务器导入新密钥</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="126"/> <source>Export To &Clipboard</source> - <translation>导出到剪贴板</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="128"/> <source>Export Selected Key(s) To Clipboard</source> - <translation>将所选密钥导出到剪贴板</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="131"/> <source>Export To &File</source> - <translation>导出到&文件</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="133"/> <source>Export Selected Key(s) To File</source> - <translation>将所选密钥导出到文件</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="136"/> <source>Delete Selected Key(s)</source> - <translation>删除所选密钥</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="137"/> <source>Delete the Selected keys</source> - <translation>删除所选密钥</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="140"/> <source>Delete Checked Key(s)</source> - <translation>删除已选密钥</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="141"/> <source>Delete the Checked keys</source> - <translation>删除已选中的密钥</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="145"/> <source>Show Key Details</source> - <translation>显示密钥详情</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="146"/> <source>Show Details for this Key</source> - <translation>显示此密钥的详细信息</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="156"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="155"/> <source>&Key</source> - <translation>&密钥</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="157"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="156"/> <source>&Generate Key</source> - <translation>生成密钥</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="161"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="160"/> <source>&Import Key</source> - <translation>&导入密钥</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="173"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="171"/> <source>Key</source> - <translation>密钥</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="181"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="179"/> <source>Generate</source> - <translation>生成</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="182"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="180"/> <source>Generate A New Keypair or Subkey</source> - <translation>生成一个新的keypair或subkey</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="191"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="189"/> <source>Import key</source> - <translation>导入密钥</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="192"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="190"/> <source>Import Key</source> - <translation>导入密钥</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="213"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="209"/> <source>Open Key</source> - <translation>打开密钥</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="213"/> - <location filename="../../src/ui/KeyMgmt.cpp" line="299"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="210"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="302"/> <source>Key Files</source> - <translation>密钥文件</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="213"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="210"/> <source>Keyring files</source> - <translation>密钥入文件</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="218"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="216"/> <source>Couldn't Open File: </source> - <translation>无法打开文件:</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="268"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="262"/> <source>Deleting Keys</source> - <translation>删除密钥</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="269"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="263"/> <source>Are you sure that you want to delete the following keys?</source> - <translation>您确定要删除以下密钥吗?</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="270"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="265"/> <source>The action can not be undone.</source> - <translation>行动无法撤消。</translation> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/KeyMgmt.cpp" line="281"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="296"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="344"/> + <source>Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/KeyMgmt.cpp" line="281"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="296"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="344"/> + <source>Key Not Found.</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="299"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="301"/> <source>Export Key To File</source> - <translation>导出文件</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="309"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="312"/> <source>key(s) exported</source> - <translation>密钥导出</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="338"/> - <location filename="../../src/ui/KeyMgmt.cpp" line="345"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="349"/> <source>Invalid Operation</source> - <translation>操作无效</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyMgmt.cpp" line="339"/> <source>Please select one KeyPair before doing this operation.</source> - <translation>请在执行此操作之前选择一个keypair。</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyMgmt.cpp" line="346"/> + <location filename="../../src/ui/KeyMgmt.cpp" line="350"/> <source>If a key pair does not have a private key then it will not be able to generate sub-keys.</source> - <translation>如果密钥对没有私钥,则它将无法生成子密钥。</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -1251,34 +1330,34 @@ <message> <location filename="../../src/ui/keypair_details/KeyNewUIDDialog.cpp" line="40"/> <source>Name</source> - <translation>名称</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyNewUIDDialog.cpp" line="41"/> <source>Email</source> - <translation>电子邮件</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyNewUIDDialog.cpp" line="42"/> <source>Comment</source> - <translation>备注</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyNewUIDDialog.cpp" line="55"/> <source>Create New UID</source> - <translation>创建新UID</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyNewUIDDialog.cpp" line="68"/> <source> Name must contain at least five characters. </source> - <translation>名称必须包含至少五个字符。</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyNewUIDDialog.cpp" line="70"/> <source> Please give a email address. </source> - <translation>请提供电子邮件地址。</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -1286,212 +1365,212 @@ <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="34"/> <source>Owner</source> - <translation>所有者</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="35"/> <source>Master Key</source> - <translation>主密钥</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="36"/> <source>Fingerprint</source> - <translation>指纹</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="37"/> <source>Additional UIDs</source> - <translation>额外的UID</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="58"/> <source>Exists</source> - <translation>存在</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="58"/> <source>Not Exists</source> - <translation>不存在</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="83"/> <source>Name:</source> - <translation>名称:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="84"/> <source>Email Address:</source> - <translation>电子邮件地址:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="85"/> <source>Comment:</source> - <translation>备注:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="90"/> <source>Key ID: </source> - <translation>密钥ID:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="91"/> <source>Algorithm: </source> - <translation>算法:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="92"/> <source>Key Size:</source> - <translation>密钥长度:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="93"/> <source>Nominal Usage: </source> - <translation>名义用法:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="94"/> <source>Actual Usage: </source> - <translation>实际用法:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="95"/> <source>Expires on: </source> - <translation>到期:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="96"/> <source>Last Update: </source> - <translation>最后更新:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="97"/> <source>Secret Key Existence: </source> - <translation>主密钥存在:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="121"/> <source>Copy</source> - <translation>复制</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="123"/> <source>copy fingerprint to clipboard</source> - <translation>将指纹复制到剪贴板</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="133"/> <source>Operations</source> - <translation>操作</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="136"/> <source>Export Private Key (Include Subkey)</source> - <translation></translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="203"/> - <source>You are about to export your</source> - <translation>你现在正在导出</translation> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="141"/> + <source>Modify Expiration Datetime (Master Key)</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="204"/> - <source>PRIVATE KEY</source> - <translation>私钥</translation> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="146"/> + <source>Key Server Operation (Pubkey)</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="205"/> - <source>This is NOT your Public Key, so DON'T give it away.</source> - <translation>这不是公钥,所以不要随意放置</translation> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="149"/> + <source>Generate Revoke Certificate</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="206"/> - <source>Do you REALLY want to export your PRIVATE KEY?</source> - <translation>你真的想要导出该私钥吗</translation> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="174"/> + <source>Warning: The Master Key has expired.</source> + <translation type="unfinished"></translation> </message> <message> - <source>Export Private Key (Include Subkeys)</source> - <translation type="obsolete">导出私钥(包括子密钥)</translation> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="177"/> + <source>Warning: The Master Key has been revoked</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="141"/> - <source>Modify Expiration Datetime (Master Key)</source> - <translation>修改到期日期时间(主密钥)</translation> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="201"/> + <source>Exporting private Key</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="146"/> - <source>Key Server Operation (Pubkey)</source> - <translation>密钥服务器操作(Pubkey)</translation> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="202"/> + <source>You are about to export your</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="149"/> - <source>Generate Revoke Certificate</source> - <translation>生成撤销证书</translation> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="203"/> + <source>PRIVATE KEY</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="175"/> - <source>Warning: The Master Key has expired.</source> - <translation>警告:主密钥已过期。</translation> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="204"/> + <source>This is NOT your Public Key, so DON'T give it away.</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="178"/> - <source>Warning: The Master Key has been revoked</source> - <translation>警告:主密钥已被撤销</translation> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="205"/> + <source>Do you REALLY want to export your PRIVATE KEY?</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="202"/> - <source>Exporting private Key</source> - <translation>导出私钥</translation> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="219"/> + <source>Error</source> + <translation type="unfinished"></translation> </message> <message> - <source><h3>You are about to export your <font color="red">PRIVATE KEY</font>!</h3> -This is NOT your Public Key, so DON'T give it away.<br />Do you REALLY want to export your PRIVATE KEY?</source> - <translation type="vanished"><h3>您即将导出<font color =“红色”>私钥</ font>!</ h3> -这不是你的公钥,所以随意放置它。<br />你真的想导出私钥吗?</translation> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="219"/> + <source>Key Not Found.</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="221"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="224"/> <source>Export Key To File</source> - <translation>导出文件</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="222"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="225"/> <source>Key Files</source> - <translation>密钥文件</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="225"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="228"/> <source>Export Error</source> - <translation>导出错误</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="225"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="228"/> <source>Couldn't open %1 for writing</source> - <translation>无法打开%1来写作</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="295"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="298"/> <source>Never Expire</source> - <translation>永不过期</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="315"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="318"/> <source>Upload Key Pair to Key Server</source> - <translation>将密钥对上传到密钥服务器</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="317"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="320"/> <source>Update Key Pair</source> - <translation>更新密钥对</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="340"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="343"/> <source>Generate revocation certificate</source> - <translation>生成撤销证书</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="343"/> + <location filename="../../src/ui/keypair_details/KeyPairDetailTab.cpp" line="346"/> <source>Revocation Certificates</source> - <translation>撤销证书</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -1499,87 +1578,87 @@ This is NOT your Public Key, so DON'T give it away.<br />Do you REALL <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="37"/> <source>Generate A New Subkey</source> - <translation>生成一个新的子密钥</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="54"/> <source>Key ID: </source> - <translation>密钥ID:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="55"/> <source>Algorithm: </source> - <translation>算法:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="56"/> <source>Key Size:</source> - <translation>密钥大小:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="57"/> <source>Usage: </source> - <translation>用法:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="58"/> <source>Expires On </source> - <translation>到期</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="59"/> <source>Last Update: </source> - <translation>最后更新:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="60"/> <source>Existence: </source> - <translation>存在:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="61"/> <source>Fingerprint: </source> - <translation>指纹:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="121"/> <source>Subkey ID</source> - <translation>次要ID</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="121"/> <source>Key Size</source> - <translation>密钥大小</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="121"/> <source>Algo</source> - <translation>某物</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="121"/> <source>Create Date</source> - <translation>创建日期</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="121"/> <source>Expire Date</source> - <translation>到期日期</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="161"/> + <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="160"/> <source>Never Expire</source> - <translation>永不过期</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="185"/> + <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="184"/> <source>Never Expires</source> - <translation>永远不会到期</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="231"/> + <location filename="../../src/ui/keypair_details/KeyPairSubkeyTab.cpp" line="230"/> <source>Edit Expire Date</source> - <translation>编辑到期日期</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -1587,64 +1666,64 @@ This is NOT your Public Key, so DON'T give it away.<br />Do you REALL <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="39"/> <source>New UID</source> - <translation>新UID</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="40"/> <source>UID Management</source> - <translation>UID管理</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="59"/> <source>UIDs</source> - <translation>UID</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="67"/> <source>Signature of Selected UID</source> - <translation>已选择UID包含的签名</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="103"/> <source>Select</source> - <translation>选择</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="103"/> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="126"/> <source>Name</source> - <translation>名称</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="103"/> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="126"/> <source>Email</source> - <translation>电子邮件</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="103"/> <source>Comment</source> - <translation>备注</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="126"/> <source>Key ID</source> - <translation>密钥ID.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="126"/> <source>Create Date</source> - <translation>创建日期</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="126"/> <source>Expired Date</source> - <translation>过期日期</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="219"/> <source>Never Expires</source> - <translation>永远不会到期</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="237"/> @@ -1654,33 +1733,33 @@ This is NOT your Public Key, so DON'T give it away.<br />Do you REALL <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="480"/> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="487"/> <source>Invalid Operation</source> - <translation>操作无效</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="238"/> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="301"/> <source>Please select one or more UIDs before doing this operation.</source> - <translation>请在执行此操作之前选择一个或多个UID。</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="263"/> <source>Sign Selected UID(s)</source> - <translation>签名所选UID(s)</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="265"/> <source>Delete Selected UID(s)</source> - <translation>删除所选的UID(s)</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="284"/> <source>Successful Operation</source> - <translation>成功运作</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="285"/> <source>Successfully added a new UID.</source> - <translation>成功添加了一个新的UID。</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="288"/> @@ -1689,7 +1768,7 @@ This is NOT your Public Key, so DON'T give it away.<br />Do you REALL <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="460"/> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="507"/> <source>Operation Failed</source> - <translation>操作失败</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="289"/> @@ -1698,17 +1777,17 @@ This is NOT your Public Key, so DON'T give it away.<br />Do you REALL <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="461"/> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="508"/> <source>An error occurred during the operation.</source> - <translation>操作期间发生错误。</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="313"/> <source>Deleting UIDs</source> - <translation>删除UID</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="314"/> <source>Are you sure that you want to delete the following uids?</source> - <translation>您确定要删除以下UID吗?</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="315"/> @@ -1716,73 +1795,73 @@ This is NOT your Public Key, so DON'T give it away.<br />Do you REALL <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="454"/> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="501"/> <source>The action can not be undone.</source> - <translation>行动无法撤消。</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="355"/> <source>Set Primary UID</source> - <translation>设置主UID</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="356"/> <source>Are you sure that you want to set the Primary UID to?</source> - <translation>您确定要将主UID设置为吗?</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="395"/> <source>Set As Primary</source> - <translation>设为主要</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="397"/> <source>Sign UID</source> - <translation>签名UID</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="399"/> <source>Delete UID</source> - <translation>删除UID.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="426"/> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="441"/> <source>Please select one UID before doing this operation.</source> - <translation>在执行此操作之前,请选择一个UID。</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="452"/> <source>Deleting UID</source> - <translation>删除UID</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="453"/> <source>Are you sure that you want to delete the following uid?</source> - <translation>您确定要删除以下UID吗?</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="469"/> <source>Delete(Revoke) Key Signature</source> - <translation>删除(撤消)密钥签名</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="481"/> <source>Please select one Key Signature before doing this operation.</source> - <translation>请在执行此操作之前选择一个密钥签名。</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="488"/> <source>To delete the signature, you need to have its corresponding public key in the local database.</source> - <translation>要删除签名,您需要在本地数据库中拥有其相应的公钥。</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="499"/> <source>Deleting Key Signature</source> - <translation>删除密钥签名</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyPairUIDTab.cpp" line="500"/> <source>Are you sure that you want to delete the following signature?</source> - <translation>您确定要删除以下签名吗?</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -1790,140 +1869,140 @@ This is NOT your Public Key, so DON'T give it away.<br />Do you REALL <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="40"/> <source>&Close</source> - <translation>&关闭</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="41"/> <source>&Import ALL</source> - <translation>&导入全部</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="42"/> <source>&Search</source> - <translation>&搜索</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="45"/> <source>Search String:</source> - <translation>搜索字符串:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="49"/> <source>Key Server:</source> - <translation>密钥服务器:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="97"/> <source>Update Keys from Keyserver</source> - <translation>从密钥服务器更新密钥</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="99"/> <source>Import Keys from Keyserver</source> - <translation>从密钥服务器导入密钥</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="158"/> <source>UID</source> - <translation>uid</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="158"/> <source>Creation date</source> - <translation>创建日期</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="158"/> <source>KeyID</source> - <translation>keyid.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="158"/> <source>Tag</source> - <translation>标签</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="179"/> <source>Text is empty.</source> - <translation>文本为空</translation> - </message> - <message> - <location filename="../../src/ui/KeyServerImportDialog.cpp" line="230"/> - <source>Too many responses from keyserver!</source> - <translation>太多来自密钥服务器的响应</translation> - </message> - <message> - <location filename="../../src/ui/KeyServerImportDialog.cpp" line="237"/> - <source>No keys found, input may be kexId, retrying search with 0x.</source> - <translation>没有找到密钥,尝试使用密钥标识搜索。</translation> - </message> - <message> - <location filename="../../src/ui/KeyServerImportDialog.cpp" line="242"/> - <source>No keys found containing the search string!</source> - <translation>没有发现包含搜索字符串的密钥!</translation> - </message> - <message> - <location filename="../../src/ui/KeyServerImportDialog.cpp" line="246"/> - <source>Insufficiently specific search string!</source> - <translation>特定的搜索字符串不足!</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="213"/> <source>Not Key Found</source> - <translation>没有密钥</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="216"/> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="386"/> <source>Timeout</source> - <translation>超时</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="219"/> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="389"/> <source>Key Server Not Found</source> - <translation>找不到密钥服务器</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="222"/> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="392"/> <source>Connection Error</source> - <translation>连接错误</translation> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/KeyServerImportDialog.cpp" line="230"/> + <source>Too many responses from keyserver!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/KeyServerImportDialog.cpp" line="237"/> + <source>No keys found, input may be kexId, retrying search with 0x.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/KeyServerImportDialog.cpp" line="242"/> + <source>No keys found containing the search string!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/KeyServerImportDialog.cpp" line="246"/> + <source>Insufficiently specific search string!</source> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="274"/> <source>revoked</source> - <translation>撤销</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="277"/> <source>disabled</source> - <translation>禁用</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="317"/> <source><h4>%1 keys found. Double click a key to import it.</h4></source> - <translation>找到<h4>%1密钥。双击将密钥导入它。</ h4></translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="383"/> <source>Key Not Found</source> - <translation>找不到密钥</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="410"/> <source><h4>Key Updated</h4></source> - <translation><h4>密钥更新</ h4></translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="412"/> <source><h4>Key Imported</h4></source> - <translation><H4>密钥导入</ h4></translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/KeyServerImportDialog.cpp" line="473"/> <source>Upload Keys from Keyserver</source> - <translation>从密钥服务器上传密钥</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -1931,22 +2010,22 @@ This is NOT your Public Key, so DON'T give it away.<br />Do you REALL <message> <location filename="../../src/ui/keypair_details/KeySetExpireDateDialog.cpp" line="36"/> <source>Confirm</source> - <translation>确认</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeySetExpireDateDialog.cpp" line="41"/> <source>Never Expire</source> - <translation>永不过期</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeySetExpireDateDialog.cpp" line="61"/> <source>Operation Failed</source> - <translation>操作失败</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeySetExpireDateDialog.cpp" line="62"/> <source>An error occurred during the operation.</source> - <translation>操作期间发生错误。</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -1954,73 +2033,93 @@ This is NOT your Public Key, so DON'T give it away.<br />Do you REALL <message> <location filename="../../src/ui/keypair_details/KeyUIDSignDialog.cpp" line="72"/> <source>Expire Date</source> - <translation>到期日期</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/keypair_details/KeyUIDSignDialog.cpp" line="81"/> <source>Sign For Key's UID(s)</source> - <translation>为密钥的UID签名</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyUIDSignDialog.cpp" line="100"/> + <location filename="../../src/ui/keypair_details/KeyUIDSignDialog.cpp" line="99"/> <source>Unsuccessful Operation</source> - <translation>不成功的操作</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyUIDSignDialog.cpp" line="101"/> + <location filename="../../src/ui/keypair_details/KeyUIDSignDialog.cpp" line="100"/> <source>Signature operation failed for UID </source> - <translation>UID的签名操作失败</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyUIDSignDialog.cpp" line="108"/> + <location filename="../../src/ui/keypair_details/KeyUIDSignDialog.cpp" line="107"/> <source>Operation Complete</source> - <translation>操作完成</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keypair_details/KeyUIDSignDialog.cpp" line="109"/> + <location filename="../../src/ui/keypair_details/KeyUIDSignDialog.cpp" line="108"/> <source>The signature operation of the UID is complete</source> - <translation>UID的签名操作是完整的</translation> + <translation type="unfinished"></translation> </message> </context> <context> <name>KeyUploadDialog</name> <message> - <location filename="../../src/ui/KeyUploadDialog.cpp" line="49"/> + <location filename="../../src/ui/KeyUploadDialog.cpp" line="47"/> <source>Uploading Public Key</source> - <translation>上传公钥</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyUploadDialog.cpp" line="112"/> + <location filename="../../src/ui/KeyUploadDialog.cpp" line="110"/> <source>Key Not Found</source> - <translation>找不到密钥</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyUploadDialog.cpp" line="115"/> + <location filename="../../src/ui/KeyUploadDialog.cpp" line="113"/> <source>Timeout</source> - <translation>超时</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyUploadDialog.cpp" line="118"/> + <location filename="../../src/ui/KeyUploadDialog.cpp" line="116"/> <source>Key Server Not Found</source> - <translation>找不到密钥服务器</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/KeyUploadDialog.cpp" line="121"/> + <location filename="../../src/ui/KeyUploadDialog.cpp" line="119"/> <source>Connection Error</source> - <translation>连接错误</translation> + <translation type="unfinished"></translation> </message> </context> <context> <name>KeyserverTab</name> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="607"/> - <source>Default Key Server for import:</source> - <translation>导入的默认密钥服务器:</translation> + <location filename="../../src/ui/settings/SettingsKeyServer.cpp" line="32"/> + <source>General</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/settings/SettingsKeyServer.cpp" line="53"/> + <source>No.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/settings/SettingsKeyServer.cpp" line="53"/> + <source>Address</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/settings/SettingsKeyServer.cpp" line="53"/> + <source>Available</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="624"/> + <location filename="../../src/ui/settings/SettingsKeyServer.cpp" line="57"/> + <source>Default Key Server for Import:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/settings/SettingsKeyServer.cpp" line="67"/> <source>Add</source> - <translation>添加</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -2028,890 +2127,1025 @@ This is NOT your Public Key, so DON'T give it away.<br />Do you REALL <message> <location filename="../../src/MainWindow.cpp" line="35"/> <source>Loading Gnupg</source> - <translation>正在加载Gnupg</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/MainWindow.cpp" line="62"/> <source>ENV Loading Failed</source> - <translation>ENV Loading失败了</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/MainWindow.cpp" line="63"/> <source>Gnupg is not installed correctly, please follow the ReadME instructions to install gnupg and then open GPGFrontend.</source> - <translation>GNUPG未正确安装,请按照README说明安装GNUPG,然后打开GPGFrontend。</translation> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="36"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="40"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="44"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="114"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="127"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="131"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="135"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="196"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="212"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="216"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="220"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="294"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="326"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="331"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="335"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="383"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="396"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="400"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="404"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="501"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="513"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="517"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="521"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="583"/> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="51"/> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="112"/> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="126"/> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="218"/> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="231"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="525"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="541"/> + <source>Error</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="38"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="117"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="286"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="525"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="702"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="885"/> - <source>No Key Selected</source> - <translation>没有选择密钥</translation> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="36"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="127"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="212"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="396"/> + <source>Select a file before doing it.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="40"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="131"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="216"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="400"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="517"/> + <source>No permission to read this file.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="44"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="135"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="220"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="404"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="521"/> + <source>No permission to create file.</source> + <translation type="unfinished"></translation> </message> <message> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="49"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="150"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="226"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="409"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="375"/> + <source>Warning</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="50"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="151"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="227"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="410"/> + <source>The target file already exists, do you need to overwrite it?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="62"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="239"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="422"/> <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="45"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="124"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="532"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="709"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="126"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="298"/> + <source>No Key Selected</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="69"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="246"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="52"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="133"/> <source>Invalid Operation</source> - <translation>操作无效</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="46"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="533"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="710"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="70"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="247"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="53"/> <source>The selected key contains a key that does not actually have a encrypt usage.<br/></source> - <translation>所选密钥包含一个实际上没有加密使用的密钥。<br/></translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="47"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="126"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="300"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="534"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="711"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="899"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="71"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="248"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="436"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="54"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="135"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="312"/> <source><br/>For example the Following Key: <br/></source> - <translation><br/>例如以下密钥:<br/></translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="65"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="554"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="91"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="72"/> <source>Encrypting</source> - <translation>加密</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="94"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="368"/> - <source>Function Disabled</source> - <translation>功能已禁用</translation> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="114"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="196"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="294"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="383"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="501"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="583"/> + <source>An error occurred during operation.</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="95"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="369"/> - <source>Please go to the settings interface to enable and configure this function.</source> - <translation>请转到“设置”界面以启用和配置此功能。</translation> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="268"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="151"/> + <source>Signing</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="125"/> - <source>The selected key contains a key that does not actually have a signature usage.<br/></source> - <translation>所选密钥包含一个实际上没有签名使用的密钥。<br/></translation> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="327"/> + <source>Please select the appropriate target file or signature file. Ensure that both are in this directory.</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="142"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="731"/> - <source>Signing</source> - <translation>签名</translation> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="331"/> + <source>No permission to read target file.</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="186"/> - <source>Decrypting</source> - <translation>解密</translation> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="335"/> + <source>No permission to read signature file.</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="246"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="816"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="353"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="259"/> <source>Verifying</source> - <translation>验证</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="298"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="897"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="434"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="310"/> <source>Invalid KeyPair</source> - <translation>无效的密钥对</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="299"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="898"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="435"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="311"/> <source>The selected keypair cannot be used for signing and encryption at the same time.<br/></source> - <translation>选定的密钥对不能同时使用用于签名和加密。<br/></translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="310"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="317"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="909"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="916"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="446"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="453"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="322"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="329"/> <source>Incomplete Operation</source> - <translation>不完整的操作</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="311"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="910"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="447"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="323"/> <source>None of the selected key pairs can provide the encryption function.</source> - <translation>没有选定的密钥对可以提供加密功能。</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="318"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="917"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="454"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="330"/> <source>None of the selected key pairs can provide the signature function.</source> - <translation>没有选定的密钥对可以提供签名功能。</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="335"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="936"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="473"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="365"/> <source>Encrypting and Signing</source> - <translation>加密和签名</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="401"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="1014"/> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="513"/> + <source>Select a file(.gpg/.asc) before doing it.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="551"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="461"/> <source>Decrypting and Verifying</source> - <translation>解密和验证</translation> - </message> - <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="499"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="503"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="507"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="577"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="590"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="594"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="598"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="659"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="675"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="679"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="683"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="757"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="789"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="794"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="798"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="846"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="859"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="863"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="867"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="964"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="976"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="980"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="984"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="1046"/> - <source>Error</source> - <translation>错误</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="499"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="590"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="675"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="859"/> - <source>Select a file before doing it.</source> - <translation>在执行此操作之前选择文件。</translation> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="43"/> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="155"/> + <source>Invalid Own Key</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="503"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="594"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="679"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="863"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="980"/> - <source>No permission to read this file.</source> - <translation>无权限读取此文件。</translation> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="43"/> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="155"/> + <source>Own Key can not be use to do any operation.</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="507"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="598"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="683"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="867"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="984"/> - <source>No permission to create file.</source> - <translation>无权限创建文件。</translation> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="52"/> + <source>Please obtain a Service Token from the server in the settings.</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="512"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="613"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="689"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="872"/> - <source>Warning</source> - <translation>警告</translation> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="91"/> + <source>Getting Cpt From Server</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="513"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="614"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="690"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="873"/> - <source>The target file already exists, do you need to overwrite it?</source> - <translation>目标文件已存在,您是否需要覆盖它?</translation> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="113"/> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="219"/> + <source>The communication content with the server does not meet the requirements</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="577"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="659"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="757"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="846"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="964"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="1046"/> - <source>An error occurred during operation.</source> - <translation>操作期间发生错误。</translation> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="126"/> + <source>Invalid short ciphertext</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="790"/> - <source>Please select the appropriate target file or signature file. Ensure that both are in this directory.</source> - <translation>请选择相应的目标文件或签名文件。确保两者都在此目录中。</translation> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="144"/> + <source>Invalid Service Token</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="794"/> - <source>No permission to read target file.</source> - <translation>无权限读取目标文件。</translation> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="145"/> + <source>Please go to the setting interface to get a ServiceToken.</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="798"/> - <source>No permission to read signature file.</source> - <translation>无权限读取签名文件。</translation> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="203"/> + <source>Getting Scpt From Server</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="976"/> - <source>Select a file(.gpg/.asc) before doing it.</source> - <translation>在做之前选择一个文件(.gpg / .casc)。</translation> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="228"/> + <source>Notice: Use Decrypt & Verify operation to decrypt this short crypto text.</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="1082"/> + <location filename="../../src/ui/main_window/MainWindowServerSlotFunction.cpp" line="231"/> + <source>There is a problem with the communication with the server</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="103"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="408"/> + <source>Function Disabled</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="104"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="409"/> + <source>Please go to the settings interface to enable and configure this function.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="134"/> + <source>The selected key contains a key that does not actually have a signature usage.<br/></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="186"/> + <source>Notice</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="186"/> + <source>Short Crypto Text only supports Decrypt & Verify.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="200"/> + <source>Decrypting</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="376"/> + <source>Automatic public key exchange failed.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="415"/> + <source>Service Token Empty</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="416"/> + <source>Please go to the settings interface to set Own Key and get Service Token.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="525"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="541"/> + <source>Key Not Found.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="572"/> <source>Outdated Version</source> - <translation>过时的版本</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="1083"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="573"/> <source>This version(%1) is out of date, please update the latest version in time. </source> - <translation>此版本(%1)已过期,请及时更新最新版本。</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="1085"/> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="1092"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="575"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="582"/> <source>You can download the latest version(%1) on Github Releases Page.<br/></source> - <translation>您可以在Github发布页面上下载最新版本(%1)。<br/></translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="1089"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="579"/> <source>Unreleased Version</source> - <translation>未发布的版本</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="1090"/> + <location filename="../../src/ui/main_window/MainWindowSlotFunction.cpp" line="580"/> <source>This version(%1) has not been officially released and is not recommended for use in a production environment. <br/></source> - <translation>此版本(%1)尚未正式发布,不建议在生产环境中使用。<BR/></translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowSlotUI.cpp" line="58"/> <source>There is one unencrypted file in attachment folder</source> - <translation>附件文件夹中有一个未加密的文件</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowSlotUI.cpp" line="60"/> <source>There are </source> - <translation>有</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowSlotUI.cpp" line="60"/> <source> unencrypted files in attachment folder</source> - <translation>附件文件夹中的未加密文件</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="30"/> <source>&New</source> - <translation>&新标签页</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="36"/> <source>Open a new file</source> - <translation>打开一个新文件</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="39"/> <source>&Open...</source> - <translation>&打开...</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="42"/> <source>Open an existing file</source> - <translation>打开现有文件</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="45"/> <source>&Browser</source> - <translation>&文件查看器</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="47"/> <source>Open a file browser</source> - <translation>打开文件浏览器</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="50"/> <source>&Save</source> - <translation>&保存</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="53"/> <source>Save the current File</source> - <translation>保存当前文件</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="56"/> <source>Save &As</source> - <translation>另存为</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="59"/> <source>Save the current File as...</source> - <translation>将当前文件保存为...</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="62"/> <source>&Print</source> - <translation>&打印</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="65"/> <source>Print Document</source> - <translation>打印文件</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="68"/> <source>&Close</source> - <translation>&关闭标签页</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="70"/> <source>Close file</source> - <translation>关闭文件</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="73"/> <source>&Quit</source> - <translation>&关闭</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="76"/> <source>Quit Program</source> - <translation>退出程序</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="81"/> <source>&Undo</source> - <translation>&撤消</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="83"/> <source>Undo Last Edit Action</source> - <translation>撤消上次编辑操作</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="86"/> <source>&Redo</source> - <translation>&重做</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="88"/> <source>Redo Last Edit Action</source> - <translation>重做上次编辑动作</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="91"/> <source>Zoom In</source> - <translation>放大</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="95"/> <source>Zoom Out</source> - <translation>缩小</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="99"/> <source>&Paste</source> - <translation>&粘贴</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="102"/> <source>Paste Text From Clipboard</source> - <translation>从剪贴板导出文本</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="105"/> <source>Cu&t</source> - <translation>&剪切</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="108"/> <source>Cut the current selection's contents to the clipboard</source> - <translation>将当前选择的内容切割到剪贴板上</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="112"/> <source>&Copy</source> - <translation>&复制</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="115"/> <source>Copy the current selection's contents to the clipboard</source> - <translation>将当前选择的内容复制到剪贴板</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="119"/> <source>&Quote</source> - <translation>&引用</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="121"/> <source>Quote whole text</source> - <translation>引用整个文本</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="124"/> <source>Select &All</source> - <translation>全选</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="127"/> <source>Select the whole text</source> - <translation>选择整个文本</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="130"/> <source>&Find</source> - <translation>&查找</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="132"/> <source>Find a word</source> - <translation>查找一个单词</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="135"/> <source>Remove &spacing</source> - <translation>删除&间距</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="138"/> <source>Remove double linebreaks, e.g. in pasted text from webmailer</source> - <translation>删除双重剪辑,例如在webmailer的导出文本中</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="141"/> <source>Se&ttings</source> - <translation>&设置</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="142"/> <source>Open settings dialog</source> - <translation>打开设置对话框</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="148"/> <source>&Encrypt</source> - <translation>&加密</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="151"/> <source>Encrypt Message</source> - <translation>加密消息</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="154"/> <source>&Encrypt &Sign</source> - <translation>&加密&签名</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="157"/> <source>Encrypt and Sign Message</source> - <translation>加密和签名消息</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="160"/> <source>&Decrypt</source> - <translation>&解密</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="163"/> <source>Decrypt Message</source> - <translation>解密消息</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="166"/> <source>&Decrypt &Verify</source> - <translation>&解密和验证</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="169"/> <source>Decrypt and Verify Message</source> - <translation>解密和验证消息</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="175"/> <source>&Encrypt File</source> - <translation>加密文件</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="176"/> <source>Encrypt File</source> - <translation>加密文件</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="179"/> <source>&Decrypt File</source> - <translation>解密文件</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="180"/> <source>Decrypt File</source> - <translation>解密文件</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="183"/> <source>&Sign File</source> - <translation>&签名文件</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="184"/> <source>Sign File</source> - <translation>签名文件</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="187"/> <source>&Verify File</source> - <translation>&验证文件</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="188"/> <source>Verify File</source> - <translation>验证文件</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="192"/> <source>&Sign</source> - <translation>&签名</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="195"/> <source>Sign Message</source> - <translation>签名消息</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="198"/> <source>&Verify</source> - <translation>&验证</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="201"/> <source>Verify Message</source> - <translation>验证消息</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="207"/> <source>&Editor</source> - <translation>&编辑器</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="209"/> <source>Import New Key From Editor</source> - <translation>从编辑器导入新密钥</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="212"/> <source>Manage &Keys</source> - <translation>管理和密钥</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="214"/> <source>Open Keymanagement</source> - <translation>打开密钥管理</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="220"/> <source>&About</source> - <translation>&关于</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="222"/> <source>Show the application's About box</source> - <translation>显示应用程序的框</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="228"/> <source>&Check for Updates</source> - <translation>检查更新</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="230"/> <source>Check for updates</source> - <translation>检查更新</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="233"/> <source>Open &Wizard</source> - <translation>打开和向导</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="234"/> <source>Open the wizard</source> - <translation>打开向导</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="239"/> <source>Append Selected Key(s) To Text</source> - <translation>将所选密钥附加到文本</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="240"/> <source>Append The Selected Keys To Text in Editor</source> - <translation>将所选密钥附加到编辑器中的文本</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="243"/> <source>Copy Email</source> - <translation>复制电子邮件</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="244"/> <source>Copy selected Email to clipboard</source> - <translation>复制所选电子邮件至剪贴板</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="248"/> <source>Show Key Details</source> - <translation>显示密钥详情</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="249"/> <source>Show Details for this Key</source> - <translation>显示此密钥的详细信息</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="252"/> <source>Refresh Key From Key Server</source> - <translation>从密钥服务器的刷新密钥对</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="253"/> <source>Refresh key from default key server</source> - <translation>刷新默认密钥服务器的密钥</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="256"/> <source>Upload Public Key(s) To Server</source> - <translation>将公钥上传到服务器</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="257"/> <source>Upload The Selected Public Keys To Server</source> - <translation>将所选公钥上传到服务器</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="272"/> <source>Remove PGP Header</source> - <translation>删除PGP标题</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="275"/> <source>Add PGP Header</source> - <translation>添加PGP标题</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="280"/> <source>&File</source> - <translation>&文件</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="293"/> <source>&Edit</source> - <translation>&编辑</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="311"/> <source>&File...</source> - <translation>&文件...</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="317"/> <source>&Crypt</source> - <translation>&加密</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="328"/> <source>&Keys</source> - <translation>&密钥</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="329"/> <source>&Import Key</source> - <translation>&导入密钥</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="338"/> <source>&Steganography</source> - <translation>隐写术</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="347"/> <source>&View</source> - <translation>&视图</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="349"/> <source>&Help</source> - <translation>&帮助</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="358"/> <source>File</source> - <translation>文件</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="366"/> <source>Crypt</source> - <translation>加密</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="376"/> <source>Key</source> - <translation>密钥</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="381"/> <source>Edit</source> - <translation>编辑</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="388"/> <source>Special Edit</source> - <translation>特殊编辑操作</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="400"/> <source>Import key from...</source> - <translation>从...导入密钥</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="401"/> <source>Import key</source> - <translation>导入密钥</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="409"/> <source>Browser to view and operate file</source> - <translation>文件查看器用于浏览和操作文件</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="410"/> <source>Browser</source> - <translation>文件查看器</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="428"/> <source>Ready</source> - <translation>准备好</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="435"/> <source>Key ToolBox</source> - <translation>密钥工具箱</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/main_window/MainWindowUI.cpp" line="443"/> <source>Information Board</source> - <translation>信息板</translation> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>PubkeyGetter</name> + <message> + <location filename="../../src/server/api/PubkeyGetter.cpp" line="66"/> + <location filename="../../src/server/api/PubkeyGetter.cpp" line="90"/> + <source>Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/api/PubkeyGetter.cpp" line="67"/> + <location filename="../../src/server/api/PubkeyGetter.cpp" line="91"/> + <source>The communication content with the server does not meet the requirements</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>PubkeyUploader</name> + <message> + <location filename="../../src/server/api/PubkeyUploader.cpp" line="95"/> + <source>Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/api/PubkeyUploader.cpp" line="96"/> + <source>The communication content with the server does not meet the requirements</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/api/PubkeyUploader.cpp" line="103"/> + <source>Warning</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/server/api/PubkeyUploader.cpp" line="104"/> + <source>Partial failure of automatic pubkey exchange</source> + <translation type="unfinished"></translation> </message> </context> <context> <name>QApplication</name> <message> - <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="42"/> - <source>>Recipient: </source> - <translation>>收件人:</translation> + <location filename="../../src/gpg/result_analyse/DecryptResultAnalyse.cpp" line="66"/> + <source> {>} Recipient: </source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="35"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="61"/> <source>One or More Bad Signatures.</source> - <translation>一个或多个糟糕的签名。</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="40"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="66"/> <source>A </source> - <translation>一种</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="42"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="68"/> <source>Good </source> - <translation>好的</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="45"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="71"/> <source>Bad </source> - <translation>坏的</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="48"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="74"/> <source>Expired </source> - <translation>已到期</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="51"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="77"/> <source>Missing Key's </source> - <translation>缺少密钥</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="54"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="80"/> <source>Revoked Key's </source> - <translation>撤销密钥</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="57"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="83"/> <source>Expired Key's </source> - <translation>过期密钥</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="60"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="86"/> <source>Missing CRL's </source> - <translation>缺少CRL</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="64"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="90"/> <source>Signature Fully Valid.</source> - <translation>签名完全有效。</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="66"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="92"/> <source>Signature NOT Fully Valid.</source> - <translation>签名无效。</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="74"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="100"/> <source>Key is NOT present with ID 0x</source> - <translation>密钥不存在ID 0x</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="81"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="107"/> <source>A signature could NOT be verified due to a Missing Key </source> - <translation>由于缺少密钥而无法验证签名</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="85"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="111"/> <source>A signature is valid but the key used to verify the signature has been revoked </source> - <translation>签名是有效的,但用于验证签名的密钥已被撤销</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="93"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="119"/> <source>A signature is valid but expired </source> - <translation>签名有效但已过期</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="100"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="126"/> <source>A signature is valid but the key used to verify the signature has expired. </source> - <translation>签名有效,但用于验证签名的密钥已过期。</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="107"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="133"/> <source>There was some other error which prevented the signature verification. </source> - <translation>还有一些其他错误阻止了签名验证。</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="113"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="139"/> <source>Error for key with fingerprint </source> - <translation>带指纹的密钥错误</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="128"/> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="152"/> <source>Signed By: </source> - <translation>被...签名:</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -2919,22 +3153,22 @@ This is NOT your Public Key, so DON'T give it away.<br />Do you REALL <message> <location filename="../../src/ui/QuitDialog.cpp" line="29"/> <source>Unsaved Files</source> - <translation>未保存的文件</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/QuitDialog.cpp" line="77"/> <source>%1 files contain unsaved information.<br/>Save the changes before closing?</source> - <translation>%1文件包含未保存的信息。<br/>在结束前保存更改?</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/QuitDialog.cpp" line="88"/> <source>Check the files you want to save:</source> - <translation>检查要保存的文件:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/QuitDialog.cpp" line="89"/> <source><b>Note:</b> If you don't save these files, all changes are lost.<br/></source> - <translation><b>注意:</ b>如果您不保存这些文件,则所有更改都会丢失。<br/></translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -2942,264 +3176,360 @@ This is NOT your Public Key, so DON'T give it away.<br />Do you REALL <message> <location filename="../../src/ui/SendMailDialog.cpp" line="35"/> <source>Incomplete configuration</source> - <translation>配置不完整</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/SendMailDialog.cpp" line="36"/> <source>The SMTP address is empty, please go to the setting interface to complete the configuration.</source> - <translation>SMTP地址为空,请转到设置界面以完成配置。</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/SendMailDialog.cpp" line="86"/> <source> Recipient cannot be empty </source> - <translation>收件人不能空</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/SendMailDialog.cpp" line="91"/> <source> One or more Recipient's Email Address is invalid </source> - <translation>一个或多个收件人的电子邮件地址无效</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/SendMailDialog.cpp" line="97"/> <source> Sender cannot be empty </source> - <translation>发件人不能为空</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/SendMailDialog.cpp" line="99"/> <source> Sender's Email Address is invalid </source> - <translation>发件人的电子邮件地址无效</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/SendMailDialog.cpp" line="155"/> <location filename="../../src/ui/SendMailDialog.cpp" line="160"/> <location filename="../../src/ui/SendMailDialog.cpp" line="165"/> <source>Fail</source> - <translation>失败</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/SendMailDialog.cpp" line="155"/> <source>Fail to Connect SMTP Server</source> - <translation>无法连接SMTP服务器</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/SendMailDialog.cpp" line="160"/> <source>Fail to Login into SMTP Server</source> - <translation>无法登录SMTP服务器</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/SendMailDialog.cpp" line="165"/> <source>Fail to Send Mail to SMTP Server</source> - <translation>无法将邮件发送到SMTP服务器</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/SendMailDialog.cpp" line="171"/> <source>Success</source> - <translation>成功</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/SendMailDialog.cpp" line="171"/> <source>Succeed in Sending Mail to SMTP Server</source> - <translation>成功向SMTP服务器发送邮件</translation> + <translation type="unfinished"></translation> </message> </context> <context> <name>SendMailTab</name> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="289"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="33"/> <source>Enable</source> - <translation>使能够</translation> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="51"/> + <source>Check Connection</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="53"/> + <source>General</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="311"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="54"/> + <source>Connection</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="55"/> + <source>Preference</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="61"/> <source>SMTP Address</source> - <translation>SMTP地址</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="313"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="63"/> <source>Username</source> - <translation>用户名</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="315"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="65"/> <source>Password</source> - <translation>密码</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="317"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="67"/> <source>Port</source> - <translation>港口</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="319"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="69"/> <source>Connection Security</source> - <translation>连接安全</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="322"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="75"/> <source>Default Sender</source> - <translation>默认发件人</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="404"/> - <location filename="../../src/ui/SettingsDialog.cpp" line="408"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="161"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="165"/> <source>Fail</source> - <translation>失败</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="404"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="161"/> <source>Fail to Connect SMTP Server</source> - <translation>无法连接SMTP服务器</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="408"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="165"/> <source>Fail to Login</source> - <translation>未登录</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="413"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="170"/> <source>Success</source> - <translation>成功</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="413"/> + <location filename="../../src/ui/settings/SettingsSendMail.cpp" line="170"/> <source>Succeed in connecting and login</source> - <translation>成功连接和登录</translation> + <translation type="unfinished"></translation> </message> </context> <context> <name>SettingsDialog</name> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="40"/> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="39"/> <source>General</source> - <translation>通用</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="41"/> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="40"/> <source>Appearance</source> - <translation>外观</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="42"/> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="41"/> <source>Send Mail</source> - <translation>发送邮件</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="43"/> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="42"/> <source>Key Server</source> - <translation>密钥服务器</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="45"/> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="44"/> <source>Advanced</source> - <translation>高级</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="58"/> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="59"/> <source>Settings</source> - <translation>设置</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/SettingsDialog.cpp" line="103"/> + <location filename="../../src/ui/settings/SettingsDialog.cpp" line="105"/> <source>System Default</source> - <translation>系统默认值</translation> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>SignResultAnalyse</name> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="29"/> + <source>[#] Sign Operation </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="32"/> + <source>[Success]</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="34"/> + <source>[Failed] </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="43"/> + <source>[>] New Signature: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="47"/> + <source> Sign Mode: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="49"/> + <source>Normal</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="51"/> + <source>Clear</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="53"/> + <source>Detach</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="59"/> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="61"/> + <source> Signer: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="61"/> + <source><unknown></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="63"/> + <source> Public Key Algo: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="64"/> + <source> Hash Algo: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="65"/> + <source> Date & Time: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="75"/> + <source>Invalid Signers: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="79"/> + <source>[>] Signer: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="80"/> + <source> Fingerprint: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/gpg/result_analyse/SignResultAnalyse.cpp" line="81"/> + <source> Reason: </source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>SignersPicker</name> + <message> + <location filename="../../src/ui/widgets/SignersPicker.cpp" line="28"/> + <source>Confirm</source> + <translation type="unfinished"></translation> </message> </context> <context> <name>SubkeyGenerateDialog</name> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="46"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="47"/> <source>Generate New Subkey</source> - <translation>生成新的子项</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="61"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="62"/> <source>Encryption</source> - <translation>加密</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="64"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="65"/> <source>Signing</source> - <translation>签名</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="67"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="68"/> <source>Certification</source> - <translation>认证</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="70"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="71"/> <source>Authentication</source> - <translation>验证</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="114"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="115"/> <source>Expiration Date:</source> - <translation>过期日期:</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="115"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="116"/> <source>Never Expire</source> - <translation>永不过期</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="116"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="117"/> <source>KeySize (in Bit):</source> - <translation>keysize(位):</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="117"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="118"/> <source>Key Type:</source> - <translation>密钥类型:</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="126"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="127"/> <source>Basic Information</source> - <translation>基本信息</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="214"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="215"/> <source> Expiration time no more than 2 years. </source> - <translation>到期时间不超过2年。</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="235"/> - <source>Generating Subkey...</source> - <translation>生成子密钥......</translation> - </message> - <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="238"/> - <source>Collecting random data for subkey generation. - This may take a while. - To speed up the process use your computer - (e.g. browse the net, listen to music,...)</source> - <translation>收集子项的随机数据。 - 可能还要等一下。 - 加快过程使用您的计算机 - (例如,浏览网,听音乐,......)</translation> - </message> - <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="309"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="244"/> <source>Success</source> - <translation>成功</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="309"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="244"/> <source>The new subkey has been generated.</source> - <translation>已生成新的子项。</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="311"/> + <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="247"/> <source>Failure</source> - <translation>失败</translation> - </message> - <message> - <location filename="../../src/ui/keygen/SubkeyGenerateDialog.cpp" line="311"/> - <source>An error occurred during subkey generation.</source> - <translation>子项生成期间发生错误。</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -3207,13 +3537,13 @@ This is NOT your Public Key, so DON'T give it away.<br />Do you REALL <message> <location filename="../../src/ui/widgets/TextEdit.cpp" line="53"/> <source>untitled</source> - <translation>无标题</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/TextEdit.cpp" line="120"/> <location filename="../../src/ui/widgets/TextEdit.cpp" line="200"/> <source>Warning</source> - <translation>警告</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/TextEdit.cpp" line="121"/> @@ -3221,84 +3551,95 @@ This is NOT your Public Key, so DON'T give it away.<br />Do you REALL <location filename="../../src/ui/widgets/TextEdit.cpp" line="482"/> <source>Cannot read file %1: %2.</source> - <translation>无法读取文件%1: -%2。</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/TextEdit.cpp" line="175"/> <source>Open file</source> - <translation>打开文件</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/TextEdit.cpp" line="251"/> <source>File</source> - <translation>文件</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/TextEdit.cpp" line="252"/> <source>Cannot write file %1: %2.</source> - <translation>无法写入文件%1: -%2。</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/TextEdit.cpp" line="270"/> <source>Save file</source> - <translation>保存存档</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/TextEdit.cpp" line="333"/> <source>Unsaved document</source> - <translation>未保存的文件</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/TextEdit.cpp" line="334"/> <source>The document "%1" has been modified. Do you want to save your changes?<br/></source> - <translation>文档“%1”已被修改。你想保存你的更改吗?<br/></translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/TextEdit.cpp" line="337"/> <source><b>Note:</b> If you don't save these files, all changes are lost.<br/></source> - <translation><b>注意:</ b>如果您不保存这些文件,则所有更改都会丢失。<br/></translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/TextEdit.cpp" line="481"/> <source>Application</source> - <translation>应用</translation> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>UnknownSignersChecker</name> + <message> + <location filename="../../src/advance/UnknownSignersChecker.cpp" line="69"/> + <source>Warning</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/advance/UnknownSignersChecker.cpp" line="70"/> + <source>Automatic public key exchange failed.</source> + <translation type="unfinished"></translation> </message> </context> <context> <name>UpdateTab</name> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="127"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="129"/> <source>It is recommended that you always check the version of GpgFrontend and upgrade to the latest version.</source> - <translation>建议您始终检查GPGFrontend的版本并升级到最新版本。</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="129"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="131"/> <source>New versions not only represent new features, but also often represent functional and security fixes.</source> - <translation>新版本不仅代表新功能,而且通常代表功能和安全修复。</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="133"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="135"/> <source>Current Version: </source> - <translation>当前版本:</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="141"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="143"/> <source>The current version is inconsistent with the latest version on github.</source> - <translation>当前版本与GitHub上的最新版本不一致。</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="143"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="145"/> <source>Please click <a href="https://github.com/saturneric/GpgFrontend/releases">here</a> to download the latest version.</source> - <translation>请单击<a href="https://github.com/saturneric/gpgfrontend/releases">此处</a>下载最新版本。</translation> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/help/AboutDialog.cpp" line="187"/> - <location filename="../../src/ui/help/AboutDialog.cpp" line="209"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="199"/> + <location filename="../../src/ui/help/AboutDialog.cpp" line="214"/> <source>Latest Version From Github: </source> - <translation>GitHub的最新版本:</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -3306,32 +3647,32 @@ This is NOT your Public Key, so DON'T give it away.<br />Do you REALL <message> <location filename="../../src/ui/VerifyDetailsDialog.cpp" line="32"/> <source>Signature Details</source> - <translation>签名细节</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/VerifyDetailsDialog.cpp" line="53"/> <source>Status: </source> - <translation>状态:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/VerifyDetailsDialog.cpp" line="56"/> <source>No valid input found</source> - <translation>没有找到有效的输入</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/VerifyDetailsDialog.cpp" line="67"/> <source>Error Validating signature</source> - <translation>验证签名时出错</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/VerifyDetailsDialog.cpp" line="70"/> <source>File was signed on %1 <br/> It Contains:<br/><br/></source> - <translation>文件已签名%1 <br/> <br/> <br/></translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/VerifyDetailsDialog.cpp" line="72"/> <source>Signed on %1 <br/> It Contains:<br /><br/></source> - <translation>签名%1 <br/>它包含:<br /> <br/></translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -3339,22 +3680,22 @@ This is NOT your Public Key, so DON'T give it away.<br />Do you REALL <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="36"/> <source>Import from keyserver</source> - <translation>从密钥服务器导入</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="39"/> <source>Key not present with id 0x</source> - <translation>密钥不存在ID 0x</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="43"/> <source>Status:</source> - <translation>地位:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="45"/> <source>Key not present in keylist</source> - <translation>密钥不存在于keylist</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="58"/> @@ -3364,7 +3705,7 @@ This is NOT your Public Key, so DON'T give it away.<br />Do you REALL <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="115"/> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="129"/> <source>Key Information is NOT Available</source> - <translation>密钥信息不可用</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="60"/> @@ -3374,137 +3715,134 @@ This is NOT your Public Key, so DON'T give it away.<br />Do you REALL <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="117"/> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="131"/> <source>Fingerprint: </source> - <translation>指纹:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="67"/> <source>Status: Cert Revoked</source> - <translation>状态:证书撤销</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="81"/> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="95"/> <source>Status: Signature Expired</source> - <translation>状态:签名已过期</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="96"/> <source>Status: Key Expired</source> - <translation>状态:密钥已过期</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="110"/> <source>Status: General Error</source> - <translation>状态:一般错误</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="124"/> <source>Status: Unknown Error</source> - <translation>状态:未知错误</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="159"/> <source>Signer Name:</source> - <translation>签名者名称:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="160"/> <source>Signer Email:</source> - <translation>签名电子邮件:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="161"/> <source>Key's Fingerprint:</source> - <translation>密钥的指纹:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="162"/> <source>Valid:</source> - <translation>有效的:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="163"/> <source>Flags:</source> - <translation>标志:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="171"/> <source>Fully Valid</source> - <translation>完全有效</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="173"/> <source>NOT Fully Valid</source> - <translation>没有完全有效</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="180"/> <source>Good </source> - <translation>好的</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="183"/> <source>Bad </source> - <translation>坏的</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="186"/> <source>Expired </source> - <translation>已到期</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="189"/> <source>Missing Key </source> - <translation>缺少密钥</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="192"/> <source>Revoked Key </source> - <translation>撤销密钥</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="195"/> <source>Expired Key </source> - <translation>过期的密钥</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="198"/> <source>Missing CRL </source> - <translation>缺少CRL.</translation> + <translation type="unfinished"></translation> </message> </context> <context> - <name>Wizard</name> - <message> - <location filename="../../src/ui/Wizard.cpp" line="46"/> - <source>First Start Wizard</source> - <translation>首次开始向导</translation> - </message> + <name>VerifyResultAnalyse</name> <message> - <location filename="../../src/ui/Wizard.cpp" line="76"/> - <source>Import Error</source> - <translation>导入错误</translation> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="31"/> + <source>[#] Verify Operation </source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="76"/> - <source>Couldn't locate any keyring file in %1</source> - <translation>无法在%1中定位任何密钥控文件</translation> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="34"/> + <source>[Success]</source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="84"/> - <location filename="../../src/ui/Wizard.cpp" line="95"/> - <source>Import error</source> - <translation>导入错误</translation> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="36"/> + <source>[Failed] </source> + <translation type="unfinished"></translation> </message> <message> - <location filename="../../src/ui/Wizard.cpp" line="85"/> - <source>Couldn't open private keyringfile: %1</source> - <translation>无法打开私有keyringfile:%1</translation> + <location filename="../../src/gpg/result_analyse/VerifyResultAnalyse.cpp" line="158"/> + <source><Unknown></source> + <translation type="unfinished"></translation> </message> +</context> +<context> + <name>Wizard</name> <message> - <location filename="../../src/ui/Wizard.cpp" line="96"/> - <source>Couldn't open public keyringfile: %1</source> - <translation>无法打开公钥密钥入文件:%1</translation> + <location filename="../../src/ui/Wizard.cpp" line="40"/> + <source>First Start Wizard</source> + <translation type="unfinished"></translation> </message> </context> </TS> diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 3b225a09..200f5beb 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,8 +1,8 @@ -set(ALL_SOURCE_FILE) - add_subdirectory(gpg) add_subdirectory(ui) add_subdirectory(smtp) +add_subdirectory(server) +add_subdirectory(advance) aux_source_directory(. BASE_SOURCE) @@ -90,7 +90,7 @@ if(${CMAKE_BUILD_TYPE} STREQUAL "Release") add_executable(${AppName} MACOSX_BUNDLE ${ICON_RESOURCE} ${BASE_SOURCE} ${RESOURCE_FILES} ${QT5_MOCS}) set_target_properties(${AppName} PROPERTIES BUNDLE True - MACOSX_BUNDLE_GUI_IDENTIFIER org.gnupg.gpgfrontend + MACOSX_BUNDLE_GUI_IDENTIFIER pub.gpgfrontend.gpgfrontend MACOSX_BUNDLE_BUNDLE_NAME ${AppName} MACOSX_BUNDLE_LONG_VERSION_STRING ${BUILD_VERSION} MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION} @@ -121,23 +121,26 @@ else() add_executable(${AppName} ${BASE_SOURCE} ${RESOURCE_FILES} ${QT5_MOCS}) endif() +set(GPGFRONTEND_LIBS smtp gpgfrontend-ui advance server gpg) +set(QT_DEPENDENCY_LIBS Qt5::Network Qt5::PrintSupport Qt5::Widgets Qt5::Test Qt5::Core) + IF (MINGW) message(STATUS "Link Application Static Library For MINGW") target_link_libraries(${AppName} - smtp gpgfrontend-ui gpg - Qt5::Network Qt5::PrintSupport Qt5::Widgets Qt5::Test Qt5::Core + ${GPGFRONTEND_LIBS} + ${QT_DEPENDENCY_LIBS} crypto ssl) elseif(APPLE) message(STATUS "Link Application Static Library For macOS") target_link_libraries(${AppName} - smtp gpgfrontend-ui gpg - Qt5::Network Qt5::PrintSupport Qt5::Widgets Qt5::Test Qt5::Core + ${GPGFRONTEND_LIBS} + ${QT_DEPENDENCY_LIBS} crypto ssl) else() message(STATUS "Link Application Static Library For UNIX") target_link_libraries(${AppName} - smtp gpgfrontend-ui gpg - Qt5::Network Qt5::PrintSupport Qt5::Widgets Qt5::Test Qt5::Core + ${GPGFRONTEND_LIBS} + ${QT_DEPENDENCY_LIBS} crypto ssl pthread) endif() diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index eb8b96b1..73f55672 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -51,7 +51,7 @@ MainWindow::MainWindow() auto version_thread = new VersionCheckThread(replay); - connect(version_thread, SIGNAL(finished(QPrivateSignal)), version_thread, SLOT(deleteLater())); + connect(version_thread, SIGNAL(finished()), version_thread, SLOT(deleteLater())); connect(version_thread, SIGNAL(upgradeVersion(const QString &, const QString &)), this, SLOT(slotVersionUpgrade(const QString &, const QString &))); version_thread->start(); diff --git a/src/advance/CMakeLists.txt b/src/advance/CMakeLists.txt new file mode 100644 index 00000000..696fc8e5 --- /dev/null +++ b/src/advance/CMakeLists.txt @@ -0,0 +1,6 @@ +aux_source_directory(. ADVANCE_SOURCE) + +add_library(advance STATIC ${ADVANCE_SOURCE}) + +target_link_libraries(advance + Qt5::Network Qt5::Widgets Qt5::Core)
\ No newline at end of file diff --git a/src/advance/UnknownSignersChecker.cpp b/src/advance/UnknownSignersChecker.cpp new file mode 100644 index 00000000..1b087b5c --- /dev/null +++ b/src/advance/UnknownSignersChecker.cpp @@ -0,0 +1,81 @@ +/** + * This file is part of GPGFrontend. + * + * GPGFrontend 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 3 of the License, or + * (at your option) any later version. + * + * Foobar 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 Foobar. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from gpg4usb-team. + * Their source code version also complies with GNU General Public License. + * + * The source code version of this software was modified and released + * by Saturneric<[email protected]> starting on May 12, 2021. + * + */ + +#include "advance/UnknownSignersChecker.h" + + +UnknownSignersChecker::UnknownSignersChecker(GpgME::GpgContext *ctx, gpgme_verify_result_t result) : + appPath(qApp->applicationDirPath()), settings(RESOURCE_DIR(appPath) + "/conf/gpgfrontend.ini"), mCtx(ctx), + mResult(result) { + +} + +void UnknownSignersChecker::start() { + + auto sign = mResult->signatures; + bool canContinue = true; + + while (sign && canContinue) { + + switch (gpg_err_code(sign->status)) { + case GPG_ERR_BAD_SIGNATURE: + break; + case GPG_ERR_NO_ERROR: + if (!(sign->status & GPGME_SIGSUM_KEY_MISSING)) + check_signer(sign); + break; + case GPG_ERR_NO_PUBKEY: + + case GPG_ERR_CERT_REVOKED: + case GPG_ERR_SIG_EXPIRED: + case GPG_ERR_KEY_EXPIRED: + check_signer(sign); + break; + case GPG_ERR_GENERAL: + canContinue = false; + break; + default: + break; + } + sign = sign->next; + } + + if(!unknownFprs.isEmpty()) { + PubkeyGetter pubkeyGetter(mCtx, unknownFprs); + pubkeyGetter.start(); + if (!pubkeyGetter.result()) { + + } + } +} + +void UnknownSignersChecker::check_signer(gpgme_signature_t sign) { + + auto key = mCtx->getKeyByFpr(sign->fpr); + if (!key.good) { + qDebug() << "Find Unknown FingerPrint " << sign->fpr; + unknownFprs.append(sign->fpr); + } + +} diff --git a/src/gpg/CMakeLists.txt b/src/gpg/CMakeLists.txt index 49e98b23..2bcacade 100644 --- a/src/gpg/CMakeLists.txt +++ b/src/gpg/CMakeLists.txt @@ -1,4 +1,5 @@ aux_source_directory(./result_analyse GPG_SOURCE) +aux_source_directory(./gpg_context GPG_SOURCE) aux_source_directory(. GPG_SOURCE) add_library(gpg STATIC ${GPG_SOURCE}) diff --git a/src/gpg/GpgConstants.cpp b/src/gpg/GpgConstants.cpp index 1ed06182..1d59dab5 100644 --- a/src/gpg/GpgConstants.cpp +++ b/src/gpg/GpgConstants.cpp @@ -30,4 +30,5 @@ const char *GpgConstants::PGP_SIGNED_BEGIN = "-----BEGIN PGP SIGNED MESSAGE----- const char *GpgConstants::PGP_SIGNED_END = "-----END PGP SIGNATURE-----"; const char *GpgConstants::PGP_SIGNATURE_BEGIN = "-----BEGIN PGP SIGNATURE-----"; const char *GpgConstants::PGP_SIGNATURE_END = "-----END PGP SIGNATURE-----"; +const char *GpgConstants::GPG_FRONTEND_SHORT_CRYPTO_HEAD = "GpgF_Scpt://"; diff --git a/src/gpg/GpgContext.cpp b/src/gpg/GpgContext.cpp deleted file mode 100644 index 0462433d..00000000 --- a/src/gpg/GpgContext.cpp +++ /dev/null @@ -1,1234 +0,0 @@ -/** - * This file is part of GPGFrontend. - * - * GPGFrontend 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 3 of the License, or - * (at your option) any later version. - * - * Foobar 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 Foobar. If not, see <https://www.gnu.org/licenses/>. - * - * The initial version of the source code is inherited from gpg4usb-team. - * Their source code version also complies with GNU General Public License. - * - * The source code version of this software was modified and released - * by Saturneric<[email protected]> starting on May 12, 2021. - * - */ - -#include "gpg/GpgContext.h" - -#include <functional> -#include <unistd.h> /* contains read/write */ - -#ifdef _WIN32 - -#include <windows.h> - -#endif - -#define INT2VOIDP(i) (void*)(uintptr_t)(i) - -namespace GpgME { - -/** Constructor - * Set up gpgme-context, set paths to app-run path - */ - GpgContext::GpgContext() { - /** get application path */ - QString appPath = qApp->applicationDirPath(); - - /** The function `gpgme_check_version' must be called before any other - * function in the library, because it initializes the thread support - * subsystem in GPGME. (from the info page) */ - gpgme_check_version(nullptr); - - // the locale set here is used for the other setlocale calls which have nullptr - // -> nullptr means use default, which is configured here - setlocale(LC_ALL, settings.value("int/lang").toLocale().name().toUtf8().constData()); - - /** set locale, because tests do also */ - gpgme_set_locale(nullptr, LC_CTYPE, setlocale(LC_CTYPE, nullptr)); - //qDebug() << "Locale set to" << LC_CTYPE << " - " << setlocale(LC_CTYPE, nullptr); -#ifndef _WIN32 - gpgme_set_locale(nullptr, LC_MESSAGES, setlocale(LC_MESSAGES, nullptr)); -#endif - - err = gpgme_new(&mCtx); - checkErr(err); - - gpgme_engine_info_t engineInfo; - engineInfo = gpgme_ctx_get_engine_info(mCtx); - - // Check ENV before running - bool check_pass = false, find_openpgp = false, find_gpgconf = false, find_assuan = false, find_cms = false; - while (engineInfo != nullptr) { - qDebug() << gpgme_get_protocol_name(engineInfo->protocol) << engineInfo->file_name << engineInfo->protocol - << engineInfo->home_dir << engineInfo->version; - if (engineInfo->protocol == GPGME_PROTOCOL_GPGCONF && strcmp(engineInfo->version, "1.0.0") != 0) - find_gpgconf = true; - if (engineInfo->protocol == GPGME_PROTOCOL_OpenPGP && strcmp(engineInfo->version, "1.0.0") != 0) { - gpgExec = engineInfo->file_name; - find_openpgp = true; - } - if (engineInfo->protocol == GPGME_PROTOCOL_CMS && strcmp(engineInfo->version, "1.0.0") != 0) - find_cms = true; - if (engineInfo->protocol == GPGME_PROTOCOL_ASSUAN) - find_assuan = true; - - engineInfo = engineInfo->next; - } - - if (find_gpgconf && find_openpgp && find_cms && find_assuan) - check_pass = true; - - if (!check_pass) { - good = false; - return; - } else good = true; - - - /** Setting the output type must be done at the beginning */ - /** think this means ascii-armor --> ? */ - gpgme_set_armor(mCtx, 1); - /** passphrase-callback */ - gpgme_set_passphrase_cb(mCtx, passphraseCb, this); - - /** check if app is called with -d from command line */ - if (qApp->arguments().contains("-d")) { - qDebug() << "gpgme_data_t debug on"; - debug = true; - } else { - debug = false; - } - - connect(this, SIGNAL(signalKeyDBChanged()), - this, SLOT(slotRefreshKeyList()), Qt::DirectConnection); - connect(this, SIGNAL(signalKeyUpdated(QString)), - this, SLOT(slotUpdateKeyList(QString)), Qt::DirectConnection); - slotRefreshKeyList(); - } - -/** Destructor - * Release gpgme-context - */ - GpgContext::~GpgContext() { - if (mCtx) gpgme_release(mCtx); - mCtx = nullptr; - } - - bool GpgContext::isGood() const { - return good; - } - -/** Import Key from QByteArray - * - */ - GpgImportInformation GpgContext::importKey(QByteArray inBuffer) { - auto *importInformation = new GpgImportInformation(); - err = gpgme_data_new_from_mem(&in, inBuffer.data(), inBuffer.size(), 1); - checkErr(err); - err = gpgme_op_import(mCtx, in); - gpgme_import_result_t result; - - result = gpgme_op_import_result(mCtx); - if (result->unchanged) { - importInformation->unchanged = result->unchanged; - } - if (result->considered) { - importInformation->considered = result->considered; - } - if (result->no_user_id) { - importInformation->no_user_id = result->no_user_id; - } - if (result->imported) { - importInformation->imported = result->imported; - } - if (result->imported_rsa) { - importInformation->imported_rsa = result->imported_rsa; - } - if (result->unchanged) { - importInformation->unchanged = result->unchanged; - } - if (result->new_user_ids) { - importInformation->new_user_ids = result->new_user_ids; - } - if (result->new_sub_keys) { - importInformation->new_sub_keys = result->new_sub_keys; - } - if (result->new_signatures) { - importInformation->new_signatures = result->new_signatures; - } - if (result->new_revocations) { - importInformation->new_revocations = result->new_revocations; - } - if (result->secret_read) { - importInformation->secret_read = result->secret_read; - } - if (result->secret_imported) { - importInformation->secret_imported = result->secret_imported; - } - if (result->secret_unchanged) { - importInformation->secret_unchanged = result->secret_unchanged; - } - if (result->not_imported) { - importInformation->not_imported = result->not_imported; - } - gpgme_import_status_t status = result->imports; - while (status != nullptr) { - GpgImportedKey key; - key.importStatus = static_cast<int>(status->status); - key.fpr = status->fpr; - importInformation->importedKeys.emplace_back(key); - status = status->next; - } - checkErr(err); - emit signalKeyDBChanged(); - gpgme_data_release(in); - return *importInformation; - } - -/** Generate New Key with values params - * - */ - bool GpgContext::generateKey(GenKeyInfo *params) { - - auto userid_utf8 = params->getUserid().toUtf8(); - const char *userid = userid_utf8.constData(); - auto algo_utf8 = (params->getAlgo() + params->getKeySizeStr()).toUtf8(); - const char *algo = algo_utf8.constData(); - unsigned long expires = QDateTime::currentDateTime().secsTo(params->getExpired()); - unsigned int flags = 0; - - if (!params->isSubKey()) { - flags |= GPGME_CREATE_CERT; - } - - if (params->isAllowEncryption()) { - flags |= GPGME_CREATE_ENCR; - } - - if (params->isAllowSigning()) { - flags |= GPGME_CREATE_SIGN; - } - - if (params->isAllowAuthentication()) { - flags |= GPGME_CREATE_AUTH; - } - - if (params->isNonExpired()) { - flags |= GPGME_CREATE_NOEXPIRE; - } - - if (params->isNoPassPhrase()) { - flags |= GPGME_CREATE_NOPASSWD; - } - - err = gpgme_op_createkey(mCtx, userid, algo, 0, expires, nullptr, flags); - - if (err != GPG_ERR_NO_ERROR) { - checkErr(err); - return false; - } else { - emit signalKeyDBChanged(); - return true; - } - } - -/** Export Key to QByteArray - * - */ - bool GpgContext::exportKeys(QStringList *uidList, QByteArray *outBuffer) { - size_t read_bytes; - gpgme_data_t dataOut = nullptr; - outBuffer->resize(0); - - if (uidList->count() == 0) { - QMessageBox::critical(nullptr, "Export Keys Error", "No Keys Selected"); - return false; - } - - for (int i = 0; i < uidList->count(); i++) { - err = gpgme_data_new(&dataOut); - checkErr(err); - - err = gpgme_op_export(mCtx, uidList->at(i).toUtf8().constData(), 0, dataOut); - checkErr(err); - - read_bytes = gpgme_data_seek(dataOut, 0, SEEK_END); - - err = readToBuffer(dataOut, outBuffer); - checkErr(err); - gpgme_data_release(dataOut); - } - return true; - } - - /** - * List all availabe Keys (VERY much like kgpgme) - */ - void GpgContext::fetch_keys() { - - gpgme_error_t gpgmeError; - - gpgme_key_t key; - - qDebug() << "Clear List and Map"; - - mKeyList.clear(); - mKeyMap.clear(); - - auto &keys = mKeyList; - auto &keys_map = mKeyMap; - - qDebug() << "Set Keylist Mode"; - - gpgmeError = gpgme_set_keylist_mode(mCtx, - GPGME_KEYLIST_MODE_LOCAL - | GPGME_KEYLIST_MODE_WITH_SECRET - | GPGME_KEYLIST_MODE_SIGS - | GPGME_KEYLIST_MODE_SIG_NOTATIONS - | GPGME_KEYLIST_MODE_WITH_TOFU); - if (gpg_err_code(gpgmeError) != GPG_ERR_NO_ERROR) { - checkErr(gpgmeError); - return; - } - - qDebug() << "Operate KeyList Start"; - - gpgmeError = gpgme_op_keylist_start(mCtx, nullptr, 0); - if (gpg_err_code(gpgmeError) != GPG_ERR_NO_ERROR) { - checkErr(gpgmeError); - return; - } - - qDebug() << "Start Loop"; - - while ((gpgmeError = gpgme_op_keylist_next(mCtx, &key)) == GPG_ERR_NO_ERROR) { - if (!key->subkeys) - continue; - - qDebug() << "Append Key" << key->subkeys->keyid; - - keys.emplace_back(key); - keys_map.insert(keys.back().id, &keys.back()); - gpgme_key_unref(key); - } - - - if (gpg_err_code(gpgmeError) != GPG_ERR_EOF) { - checkErr(gpgmeError); - return; - } - - qDebug() << "Operate KeyList End"; - - gpgmeError = gpgme_op_keylist_end(mCtx); - if (gpg_err_code(gpgmeError) != GPG_ERR_NO_ERROR) { - checkErr(gpgmeError); - return; - } - - gpgmeError = gpgme_op_keylist_end(mCtx); - if (gpg_err_code(gpgmeError) != GPG_ERR_NO_ERROR) { - checkErr(gpgmeError); - return; - } - - mKeyList = keys; - } - -/** Delete keys - */ - - void GpgContext::deleteKeys(QStringList *uidList) { - - gpgme_error_t error; - gpgme_key_t key; - - for (const auto &tmp : *uidList) { - - error = gpgme_op_keylist_start(mCtx, tmp.toUtf8().constData(), 0); - if (error != GPG_ERR_NO_ERROR) { - checkErr(error); - continue; - } - - error = gpgme_op_keylist_next(mCtx, &key); - if (error != GPG_ERR_NO_ERROR) { - checkErr(error); - continue; - } - - error = gpgme_op_keylist_end(mCtx); - if (error != GPG_ERR_NO_ERROR) { - checkErr(error); - continue; - } - - error = gpgme_op_delete(mCtx, key, 1); - if (error != GPG_ERR_NO_ERROR) { - checkErr(error); - continue; - } - - } - emit signalKeyDBChanged(); - } - -/** Encrypt inBuffer for reciepients-uids, write - * result to outBuffer - */ - gpg_error_t GpgContext::encrypt(QVector<GpgKey> &keys, const QByteArray &inBuffer, QByteArray *outBuffer, - gpgme_encrypt_result_t *result) { - - gpgme_data_t dataIn = nullptr, dataOut = nullptr; - outBuffer->resize(0); - - //gpgme_encrypt_result_t e_result; - gpgme_key_t recipients[keys.count() + 1]; - - int index = 0; - for (const auto &key : keys) { - recipients[index++] = key.key_refer; - } - - //Last entry dataIn array has to be nullptr - recipients[keys.count()] = nullptr; - - //If the last parameter isnt 0, a private copy of data is made - if (mCtx) { - err = gpgme_data_new_from_mem(&dataIn, inBuffer.data(), inBuffer.size(), 1); - checkErr(err); - if (!err) { - err = gpgme_data_new(&dataOut); - checkErr(err); - if (!err) { - err = gpgme_op_encrypt(mCtx, recipients, GPGME_ENCRYPT_ALWAYS_TRUST, dataIn, dataOut); - checkErr(err); - if (!err) { - err = readToBuffer(dataOut, outBuffer); - checkErr(err); - } - } - } - } - if (dataIn) { - gpgme_data_release(dataIn); - } - if (dataOut) { - gpgme_data_release(dataOut); - } - - if (result != nullptr) { - *result = gpgme_op_encrypt_result(mCtx); - } - return err; - } - -/** Decrypt QByteAarray, return QByteArray - * mainly from http://basket.kde.org/ (kgpgme.cpp) - */ - gpgme_error_t - GpgContext::decrypt(const QByteArray &inBuffer, QByteArray *outBuffer, gpgme_decrypt_result_t *result) { - gpgme_data_t dataIn = nullptr, dataOut = nullptr; - gpgme_decrypt_result_t m_result = nullptr; - - outBuffer->resize(0); - if (mCtx != nullptr) { - err = gpgme_data_new_from_mem(&dataIn, inBuffer.data(), inBuffer.size(), 1); - if (gpgme_err_code(err) == GPG_ERR_NO_ERROR) { - err = gpgme_data_new(&dataOut); - if (gpgme_err_code(err) == GPG_ERR_NO_ERROR) { - err = gpgme_op_decrypt(mCtx, dataIn, dataOut); - m_result = gpgme_op_decrypt_result(mCtx); - if (gpgme_err_code(err) == GPG_ERR_NO_ERROR) { - err = readToBuffer(dataOut, outBuffer); - } - } - } - } - - if (!settings.value("general/rememberPassword").toBool()) { - clearPasswordCache(); - } - - if (dataIn) { - gpgme_data_release(dataIn); - } - if (dataOut) { - gpgme_data_release(dataOut); - } - - if (result != nullptr) { - *result = m_result; - } - return err; - } - -/** Read gpgme-Data to QByteArray - * mainly from http://basket.kde.org/ (kgpgme.cpp) - */ -#define BUF_SIZE (32 * 1024) - - gpgme_error_t GpgContext::readToBuffer(gpgme_data_t dataIn, QByteArray *outBuffer) { - off_t ret; - gpgme_error_t gpgErrNoError = GPG_ERR_NO_ERROR; - - ret = gpgme_data_seek(dataIn, 0, SEEK_SET); - if (ret) { - gpgErrNoError = gpgme_err_code_from_errno(errno); - checkErr(gpgErrNoError, "failed dataseek dataIn readToBuffer"); - } else { - char buf[BUF_SIZE + 2]; - - while ((ret = gpgme_data_read(dataIn, buf, BUF_SIZE)) > 0) { - const size_t size = outBuffer->size(); - outBuffer->resize(static_cast<int>(size + ret)); - memcpy(outBuffer->data() + size, buf, ret); - } - if (ret < 0) { - gpgErrNoError = gpgme_err_code_from_errno(errno); - checkErr(gpgErrNoError, "failed data_read dataIn readToBuffer"); - } - } - return gpgErrNoError; - } - -/** The Passphrase window, if not provided by env-Var GPG_AGENT_INFO - * originally copied from http://basket.kde.org/ (kgpgme.cpp), but modified - */ - gpgme_error_t GpgContext::passphraseCb(void *hook, const char *uid_hint, - const char *passphrase_info, - int last_was_bad, int fd) { - auto *gpg = static_cast<GpgContext *>(hook); - return gpg->passphrase(uid_hint, passphrase_info, last_was_bad, fd); - } - - gpgme_error_t GpgContext::passphrase(const char *uid_hint, - const char * /*passphrase_info*/, - int last_was_bad, int fd) { - gpgme_error_t returnValue = GPG_ERR_CANCELED; - QString passwordDialogMessage; - QString gpgHint = QString::fromUtf8(uid_hint); - bool result; - -#ifdef _WIN32 - DWORD written; - auto hd = INT2VOIDP(fd); -#endif - - if (last_was_bad) { - passwordDialogMessage += "<i>" + tr("Wrong password") + ".</i><br><br>\n\n"; - clearPasswordCache(); - } - - /** if uid provided */ - if (!gpgHint.isEmpty()) { - // remove UID, leave only username & email - gpgHint.remove(0, gpgHint.indexOf(" ")); - passwordDialogMessage += "<b>" + tr("Enter Password for") + "</b><br>" + gpgHint + "<br>"; - } - - if (mPasswordCache.isEmpty()) { - QString password = QInputDialog::getText(QApplication::activeWindow(), tr("Enter Password"), - passwordDialogMessage, QLineEdit::Password, - "", &result); - - if (result) mPasswordCache = password.toUtf8(); - } else { - result = true; - } - - if (result) { - -#ifndef _WIN32 - if (write(fd, mPasswordCache.data(), mPasswordCache.length()) == -1) { - qDebug() << "something is terribly broken"; - } -#else - WriteFile(hd, mPasswordCache.data(), mPasswordCache.length(), &written, 0); -#endif - - returnValue = GPG_ERR_NO_ERROR; - } - -#ifndef _WIN32 - if (write(fd, "\n", 1) == -1) { - qDebug() << "something is terribly broken"; - } -#else - WriteFile(hd, "\n", 1, &written, 0); - - /* program will hang on cancel if hd not closed */ - if (!result) { - CloseHandle(hd); - } -#endif - - return returnValue; - } - -/** also from kgpgme.cpp, seems to clear password from mem */ - void GpgContext::clearPasswordCache() { - if (mPasswordCache.size() > 0) { - mPasswordCache.fill('\0'); - mPasswordCache.truncate(0); - } - } - -// error-handling - void GpgContext::checkErr(gpgme_error_t gpgmeError, const QString &comment) { - //if (gpgmeError != GPG_ERR_NO_ERROR && gpgmeError != GPG_ERR_CANCELED) { - if (gpgmeError != GPG_ERR_NO_ERROR) { - qDebug() << "[Error " << gpg_err_code(gpgmeError) - << "] Source: " << gpgme_strsource(gpgmeError) << " Description: " << gpgErrString(gpgmeError); - } - } - - void GpgContext::checkErr(gpgme_error_t gpgmeError) { - //if (gpgmeError != GPG_ERR_NO_ERROR && gpgmeError != GPG_ERR_CANCELED) { - if (gpg_err_code(gpgmeError) != GPG_ERR_NO_ERROR) { - qDebug() << "[Error " << gpg_err_code(gpgmeError) - << "] Source: " << gpgme_strsource(gpgmeError) << " Description: " << gpgErrString(gpgmeError); - } - } - - QString GpgContext::gpgErrString(gpgme_error_t err) { - return QString::fromUtf8(gpgme_strerror(err)); - } - - bool GpgContext::exportSecretKey(const GpgKey &key, QByteArray *outBuffer) { - qDebug() << "Export Secret Key" << key.id; - gpgme_key_t target_key[2] = { - key.key_refer, - nullptr - }; - - gpgme_data_t dataOut; - gpgme_data_new(&dataOut); - // export private key to outBuffer - gpgme_error_t error = gpgme_op_export_keys(mCtx, target_key, GPGME_EXPORT_MODE_SECRET, dataOut); - - if (gpgme_err_code(error) != GPG_ERR_NO_ERROR) { - checkErr(error); - gpgme_data_release(dataOut); - return false; - } - - readToBuffer(dataOut, outBuffer); - gpgme_data_release(dataOut); - return true; - } - -/** return type should be gpgme_error_t*/ - QProcess * GpgContext::executeGpgCommand(const QStringList &arguments, QByteArray *stdOut, QByteArray *stdErr, - const std::function<void(QProcess *)> &interactFunc) { - QStringList args; - args << arguments; - - auto *gpgProcess = new QProcess(this); - qDebug() << "gpgExec" << gpgExec << args; - - gpgProcess->setReadChannel(QProcess::StandardOutput); - connect(gpgProcess, SIGNAL(finished(int,QProcess::ExitStatus)), - gpgProcess, SLOT(deleteLater())); - connect(gpgProcess, &QProcess::readyReadStandardOutput, this, [gpgProcess, interactFunc]() { - qDebug() << "Function Called" << &gpgProcess; - // interactFunc(gpgProcess); - }); - - gpgProcess->start(gpgExec, args); - - if (gpgProcess->waitForStarted()){ - qDebug() << "Gpg Process Started Success"; - } else { - qDebug() << "Gpg Process Started Failed"; - } - - return gpgProcess; - } - -/*** - * if sigbuffer not set, the inbuffer should contain signed text - * - * TODO: return type should contain: - * -> list of sigs - * -> valid - * -> errors - */ - gpgme_error_t GpgContext::verify(QByteArray *inBuffer, QByteArray *sigBuffer, gpgme_verify_result_t *result) { - - gpgme_data_t dataIn; - gpgme_error_t gpgmeError; - gpgme_signature_t sign; - gpgme_verify_result_t m_result; - - gpgmeError = gpgme_data_new_from_mem(&dataIn, inBuffer->data(), inBuffer->size(), 1); - checkErr(gpgmeError); - - if (sigBuffer != nullptr) { - gpgme_data_t sigdata; - gpgmeError = gpgme_data_new_from_mem(&sigdata, sigBuffer->data(), sigBuffer->size(), 1); - checkErr(gpgmeError); - gpgmeError = gpgme_op_verify(mCtx, sigdata, dataIn, nullptr); - } else { - gpgmeError = gpgme_op_verify(mCtx, dataIn, nullptr, dataIn); - } - - checkErr(gpgmeError); - - m_result = gpgme_op_verify_result(mCtx); - - if (result != nullptr) { - *result = m_result; - } - - return gpgmeError; - } - - gpg_error_t - GpgContext::sign(const QVector<GpgKey> &keys, const QByteArray &inBuffer, QByteArray *outBuffer, bool detached, - gpgme_sign_result_t *result) { - - gpgme_error_t gpgmeError; - gpgme_data_t dataIn, dataOut; - gpgme_sign_result_t m_result; - gpgme_sig_mode_t mode; - - if (keys.isEmpty()) { - QMessageBox::critical(nullptr, tr("Key Selection"), tr("No Private Key Selected")); - return false; - } - - // at start or end? - - setSigners(keys); - - gpgmeError = gpgme_data_new_from_mem(&dataIn, inBuffer.data(), inBuffer.size(), 1); - checkErr(gpgmeError); - gpgmeError = gpgme_data_new(&dataOut); - checkErr(gpgmeError); - - /* - `GPGME_SIG_MODE_NORMAL' - A normal signature is made, the output includes the plaintext - and the signature. - - `GPGME_SIG_MODE_DETACH' - A detached signature is made. - - `GPGME_SIG_MODE_CLEAR' - A clear text signature is made. The ASCII armor and text - mode settings of the context are ignored. - */ - - if (detached) { - mode = GPGME_SIG_MODE_DETACH; - } else { - mode = GPGME_SIG_MODE_CLEAR; - } - - gpgmeError = gpgme_op_sign(mCtx, dataIn, dataOut, mode); - checkErr(gpgmeError); - - if (gpgmeError == GPG_ERR_CANCELED) { - return false; - } - - if (gpgmeError != GPG_ERR_NO_ERROR) { - QMessageBox::critical(nullptr, tr("Error in signing:"), QString::fromUtf8(gpgme_strerror(gpgmeError))); - return false; - } - - m_result = gpgme_op_sign_result(mCtx); - - if (result != nullptr) { - *result = m_result; - } - - gpgmeError = readToBuffer(dataOut, outBuffer); - checkErr(gpgmeError); - - gpgme_data_release(dataIn); - gpgme_data_release(dataOut); - - if (!settings.value("general/rememberPassword").toBool()) { - clearPasswordCache(); - } - - return gpgmeError; - } - - /* - * if there is no '\n' before the PGP-Begin-Block, but for example a whitespace, - * GPGME doesn't recognise the Message as encrypted. This function adds '\n' - * before the PGP-Begin-Block, if missing. - */ - void GpgContext::preventNoDataErr(QByteArray *in) { - int block_start = in->indexOf(GpgConstants::PGP_CRYPT_BEGIN); - if (block_start > 0 && in->at(block_start - 1) != '\n') { - in->insert(block_start, '\n'); - } - block_start = in->indexOf(GpgConstants::PGP_SIGNED_BEGIN); - if (block_start > 0 && in->at(block_start - 1) != '\n') { - in->insert(block_start, '\n'); - } - } - - /* - * isSigned returns: - * - 0, if text isn't signed at all - * - 1, if text is partially signed - * - 2, if text is completly signed - */ - int GpgContext::textIsSigned(const QByteArray &text) { - if (text.trimmed().startsWith(GpgConstants::PGP_SIGNED_BEGIN) && - text.trimmed().endsWith(GpgConstants::PGP_SIGNED_END)) { - return 2; - } - if (text.contains(GpgConstants::PGP_SIGNED_BEGIN) && text.contains(GpgConstants::PGP_SIGNED_END)) { - return 1; - } - return 0; - } - - QString GpgContext::beautifyFingerprint(QString fingerprint) { - uint len = fingerprint.length(); - if ((len > 0) && (len % 4 == 0)) - for (uint n = 0; 4 * (n + 1) < len; ++n) - fingerprint.insert(static_cast<int>(5u * n + 4u), ' '); - return fingerprint; - } - - void GpgContext::slotRefreshKeyList() { - qDebug() << "Refreshing Keys"; - this->fetch_keys(); - emit signalKeyInfoChanged(); - } - -/** - * note: is_private_key status is not returned - */ - GpgKey GpgContext::getKeyByFpr(const QString &fpr) { - for (const auto &key : mKeyList) { - if (key.fpr == fpr) { - return key; - } else { - for (auto &subkey : key.subKeys) { - if (subkey.fpr == fpr) { - return key; - } - } - } - } - return GpgKey(nullptr); - } - - /** - * note: is_private_key status is not returned - */ - const GpgKey &GpgContext::getKeyById(const QString &id) { - - for (const auto &key : mKeyList) { - if (key.id == id) { - return key; - } else { - auto subkeys = key.subKeys; - for (const auto &subkey : subkeys) { - if (subkey.id == id) { - return key; - } - } - } - } - - throw std::runtime_error("key not found"); - } - - QString GpgContext::getGpgmeVersion() { - return QString(gpgme_check_version(nullptr)); - } - - bool GpgContext::signKey(const GpgKey &target, const QString &uid, const QDateTime *expires) { - - unsigned int flags = 0; - - unsigned int expires_time_t = 0; - if (expires == nullptr) { - flags |= GPGME_KEYSIGN_NOEXPIRE; - } else { - expires_time_t = QDateTime::currentDateTime().secsTo(*expires); - } - - auto gpgmeError = - gpgme_op_keysign(mCtx, target.key_refer, uid.toUtf8().constData(), expires_time_t, flags); - - if (gpgmeError == GPG_ERR_NO_ERROR) { - emit signalKeyUpdated(target.id); - return true; - } else { - checkErr(gpgmeError); - return false; - } - } - - const GpgKeyList &GpgContext::getKeys() const { - return mKeyList; - } - - void GpgContext::getSigners(QVector<GpgKey> &signer) { - auto count = gpgme_signers_count(mCtx); - signer.clear(); - for (auto i = 0; i < count; i++) { - auto key = gpgme_signers_enum(mCtx, i); - auto it = mKeyMap.find(key->subkeys->keyid); - if (it == mKeyMap.end()) { - qDebug() << "Inconsistent state"; - signer.push_back(GpgKey(key)); - } else { - signer.push_back(*it.value()); - } - } - } - - void GpgContext::setSigners(const QVector<GpgKey> &keys) { - gpgme_signers_clear(mCtx); - for (const auto &key : keys) { - if (checkIfKeyCanSign(key)) { - auto gpgmeError = gpgme_signers_add(mCtx, key.key_refer); - checkErr(gpgmeError); - } - } - if (keys.length() != gpgme_signers_count(mCtx)) { - qDebug() << "No All Keys Added"; - } - } - - void GpgContext::slotUpdateKeyList(const QString &key_id) { - auto it = mKeyMap.find(key_id); - if (it != mKeyMap.end()) { - gpgme_key_t new_key_refer; - auto gpgmeErr = gpgme_get_key(mCtx, key_id.toUtf8().constData(), &new_key_refer, 0); - - if (gpgme_err_code(gpgmeErr) == GPG_ERR_EOF) { - gpgmeErr = gpgme_get_key(mCtx, key_id.toUtf8().constData(), &new_key_refer, 1); - - if (gpgme_err_code(gpgmeErr) == GPG_ERR_EOF) { - throw std::runtime_error("key_id not found in key database"); - } - - } - - if (new_key_refer != nullptr) { - it.value()->swapKeyRefer(new_key_refer); - emit signalKeyInfoChanged(); - } - - } - } - - bool GpgContext::addUID(const GpgKey &key, const GpgUID &uid) { - QString userid = QString("%1 (%3) <%2>").arg(uid.name, uid.email, uid.comment); - auto gpgmeError = gpgme_op_adduid(mCtx, key.key_refer, userid.toUtf8().constData(), 0); - if (gpgmeError == GPG_ERR_NO_ERROR) { - emit signalKeyUpdated(key.id); - return true; - } else { - checkErr(gpgmeError); - return false; - } - - } - - bool GpgContext::revUID(const GpgKey &key, const GpgUID &uid) { - auto gpgmeError = gpgme_op_revuid(mCtx, key.key_refer, uid.uid.toUtf8().constData(), 0); - if (gpgmeError == GPG_ERR_NO_ERROR) { - emit signalKeyUpdated(key.id); - return true; - } else { - checkErr(gpgmeError); - return false; - } - } - - bool GpgContext::setPrimaryUID(const GpgKey &key, const GpgUID &uid) { - auto gpgmeError = gpgme_op_set_uid_flag(mCtx, key.key_refer, - uid.uid.toUtf8().constData(), "primary", nullptr); - if (gpgmeError == GPG_ERR_NO_ERROR) { - emit signalKeyUpdated(key.id); - return true; - } else { - checkErr(gpgmeError); - return false; - } - } - - bool GpgContext::revSign(const GpgKey &key, const GpgKeySignature &signature) { - - auto signing_key = getKeyById(signature.keyid); - - auto gpgmeError = gpgme_op_revsig(mCtx, key.key_refer, - signing_key.key_refer, - signature.uid.toUtf8().constData(), 0); - if (gpg_err_code(gpgmeError) == GPG_ERR_NO_ERROR) { - emit signalKeyUpdated(key.id); - return true; - } else { - checkErr(gpgmeError); - return false; - } - } - - bool GpgContext::generateSubkey(const GpgKey &key, GenKeyInfo *params) { - - if (!params->isSubKey()) { - return false; - } - - auto algo_utf8 = (params->getAlgo() + params->getKeySizeStr()).toUtf8(); - const char *algo = algo_utf8.constData(); - unsigned long expires = QDateTime::currentDateTime().secsTo(params->getExpired()); - unsigned int flags = 0; - - if (!params->isSubKey()) { - flags |= GPGME_CREATE_CERT; - } - - if (params->isAllowEncryption()) { - flags |= GPGME_CREATE_ENCR; - } - - if (params->isAllowSigning()) { - flags |= GPGME_CREATE_SIGN; - } - - if (params->isAllowAuthentication()) { - flags |= GPGME_CREATE_AUTH; - } - - if (params->isNonExpired()) { - flags |= GPGME_CREATE_NOEXPIRE; - } - - flags |= GPGME_CREATE_NOPASSWD; - - - auto gpgmeError = gpgme_op_createsubkey(mCtx, key.key_refer, - algo, 0, expires, flags); - if (gpgmeError == GPG_ERR_NO_ERROR) { - emit signalKeyUpdated(key.id); - return true; - } else { - checkErr(gpgmeError); - return false; - } - } - - bool GpgContext::setExpire(const GpgKey &key, const GpgSubKey *subkey, QDateTime *expires) { - unsigned long expires_time = 0; - if (expires != nullptr) { - qDebug() << "Expire Datetime" << expires->toString(); - expires_time = QDateTime::currentDateTime().secsTo(*expires); - } - - const char *subfprs = nullptr; - - if (subkey != nullptr) { - subfprs = subkey->fpr.toUtf8().constData(); - } - - auto gpgmeError = gpgme_op_setexpire(mCtx, key.key_refer, - expires_time, subfprs, 0); - if (gpgmeError == GPG_ERR_NO_ERROR) { - emit signalKeyUpdated(key.id); - return true; - } else { - checkErr(gpgmeError); - return false; - } - } - - bool GpgContext::checkIfKeyCanSign(const GpgKey &key) { - if (std::any_of(key.subKeys.begin(), key.subKeys.end(), [](const GpgSubKey &subkey) -> bool { - return subkey.secret && subkey.can_sign && !subkey.disabled && !subkey.revoked && !subkey.expired; - })) - return true; - return false; - } - - bool GpgContext::checkIfKeyCanCert(const GpgKey &key) { - return key.has_master_key && !key.expired && !key.revoked && !key.disabled; - } - - bool GpgContext::checkIfKeyCanAuth(const GpgKey &key) { - if (std::any_of(key.subKeys.begin(), key.subKeys.end(), [](const GpgSubKey &subkey) -> bool { - return subkey.secret && subkey.can_authenticate && !subkey.disabled && !subkey.revoked && !subkey.expired; - })) - return true; - return false; - } - - bool GpgContext::checkIfKeyCanEncr(const GpgKey &key) { - if (std::any_of(key.subKeys.begin(), key.subKeys.end(), [](const GpgSubKey &subkey) -> bool { - return subkey.can_encrypt && !subkey.disabled && !subkey.revoked && !subkey.expired; - })) - return true; - return false; - } - - gpgme_error_t GpgContext::encryptSign(QVector<GpgKey> &keys, const QByteArray &inBuffer, QByteArray *outBuffer, - gpgme_encrypt_result_t *encr_result, gpgme_sign_result_t *sign_result) { - gpgme_data_t dataIn = nullptr, dataOut = nullptr; - outBuffer->resize(0); - - setSigners(keys); - - //gpgme_encrypt_result_t e_result; - gpgme_key_t recipients[keys.count() + 1]; - - /* set key for user */ - int index = 0; - for (const auto &key : keys) { - recipients[index++] = key.key_refer; - } - //Last entry dataIn array has to be nullptr - recipients[keys.count()] = nullptr; - - //If the last parameter isnt 0, a private copy of data is made - if (mCtx != nullptr) { - err = gpgme_data_new_from_mem(&dataIn, inBuffer.data(), inBuffer.size(), 1); - if (gpg_err_code(err) == GPG_ERR_NO_ERROR) { - err = gpgme_data_new(&dataOut); - if (gpg_err_code(err) == GPG_ERR_NO_ERROR) { - err = gpgme_op_encrypt_sign(mCtx, recipients, GPGME_ENCRYPT_ALWAYS_TRUST, dataIn, dataOut); - if (encr_result != nullptr) - *encr_result = gpgme_op_encrypt_result(mCtx); - if (sign_result != nullptr) - *sign_result = gpgme_op_sign_result(mCtx); - if (gpg_err_code(err) == GPG_ERR_NO_ERROR) { - err = readToBuffer(dataOut, outBuffer); - } - } - } - } - - if (gpgme_err_code(err) != GPG_ERR_NO_ERROR) - checkErr(err); - - if (dataIn) { - gpgme_data_release(dataIn); - } - if (dataOut) { - gpgme_data_release(dataOut); - } - - return err; - } - - gpgme_error_t - GpgContext::decryptVerify(const QByteArray &inBuffer, QByteArray *outBuffer, gpgme_decrypt_result_t *decrypt_result, - gpgme_verify_result_t *verify_result) { - gpgme_data_t dataIn = nullptr, dataOut = nullptr; - - outBuffer->resize(0); - if (mCtx != nullptr) { - err = gpgme_data_new_from_mem(&dataIn, inBuffer.data(), inBuffer.size(), 1); - if (gpgme_err_code(err) == GPG_ERR_NO_ERROR) { - err = gpgme_data_new(&dataOut); - if (gpgme_err_code(err) == GPG_ERR_NO_ERROR) { - err = gpgme_op_decrypt_verify(mCtx, dataIn, dataOut); - if (decrypt_result != nullptr) - *decrypt_result = gpgme_op_decrypt_result(mCtx); - if (verify_result != nullptr) - *verify_result = gpgme_op_verify_result(mCtx); - if (gpgme_err_code(err) == GPG_ERR_NO_ERROR) { - err = readToBuffer(dataOut, outBuffer); - } - } - } - } - - if (!settings.value("general/rememberPassword").toBool()) { - clearPasswordCache(); - } - - if (dataIn) { - gpgme_data_release(dataIn); - } - if (dataOut) { - gpgme_data_release(dataOut); - } - - return err; - } - - bool GpgContext::exportKeys(const QVector<GpgKey> &keys, QByteArray &outBuffer) { - size_t read_bytes; - gpgme_data_t dataOut = nullptr; - outBuffer.resize(0); - - if (keys.count() == 0) { - QMessageBox::critical(nullptr, "Export Keys Error", "No Keys Selected"); - return false; - } - - for (const auto &key : keys) { - err = gpgme_data_new(&dataOut); - checkErr(err); - - err = gpgme_op_export(mCtx, key.id.toUtf8().constData(), 0, dataOut); - checkErr(err); - - read_bytes = gpgme_data_seek(dataOut, 0, SEEK_END); - - err = readToBuffer(dataOut, &outBuffer); - checkErr(err); - gpgme_data_release(dataOut); - } - return true; - } - - QProcess * GpgContext::generateRevokeCert(const GpgKey &key, const QString &outputFileName) { - QByteArray out, stdErr; - auto process = executeGpgCommand({ - "--command-fd", - "0", - "--status-fd", "1", - "-o", - outputFileName, - "--gen-revoke", - key.fpr - }, &out, &stdErr, - [](QProcess *proc) { - qDebug() << "Function Called" << proc; - while (proc->canReadLine()) { - const QString line = QString::fromUtf8(proc->readLine()).trimmed(); - // Command-fd is a stable interface, while this is all kind of hacky we - // are on a deadline :-/ - if (line == QLatin1String("[GNUPG:] GET_BOOL gen_revoke.okay")) { - proc->write("y\n"); - } else if (line == QLatin1String("[GNUPG:] GET_LINE ask_revocation_reason.code")) { - proc->write("0\n"); - } else if (line == QLatin1String("[GNUPG:] GET_LINE ask_revocation_reason.text")) { - proc->write("\n"); - } else if (line == QLatin1String("[GNUPG:] GET_BOOL openfile.overwrite.okay")) { - // We asked before - proc->write("y\n"); - } else if (line == QLatin1String("[GNUPG:] GET_BOOL ask_revocation_reason.okay")) { - proc->write("y\n"); - } - } - }); - - qDebug() << "GenerateRevokeCert Process" << process; - - return process; - } -} diff --git a/src/gpg/GpgFileOpera.cpp b/src/gpg/GpgFileOpera.cpp index 9395bd17..af50c79a 100644 --- a/src/gpg/GpgFileOpera.cpp +++ b/src/gpg/GpgFileOpera.cpp @@ -114,7 +114,7 @@ gpgme_error_t GpgFileOpera::signFile(GpgME::GpgContext *ctx, QVector<GpgKey> &ke auto outBuffer = QByteArray(); infile.close(); - auto error = ctx->sign(keys, inBuffer, &outBuffer, true, result); + auto error = ctx->sign(keys, inBuffer, &outBuffer, GPGME_SIG_MODE_DETACH, result); if (gpg_err_code(error) != GPG_ERR_NO_ERROR) return error; @@ -185,7 +185,10 @@ gpg_error_t GpgFileOpera::encryptSignFile(GpgME::GpgContext *ctx, QVector<GpgKey auto outBuffer = QByteArray(); infile.close(); - auto error = ctx->encryptSign(keys, inBuffer, &outBuffer, encr_res, sign_res); + QVector<GpgKey> signerKeys; + + // TODO dealing with signer keys + auto error = ctx->encryptSign(keys, signerKeys, inBuffer, &outBuffer, encr_res, sign_res); if (gpg_err_code(error) != GPG_ERR_NO_ERROR) return error; diff --git a/src/gpg/GpgInfo.cpp b/src/gpg/GpgInfo.cpp new file mode 100644 index 00000000..00a15ef9 --- /dev/null +++ b/src/gpg/GpgInfo.cpp @@ -0,0 +1,25 @@ +/** + * This file is part of GPGFrontend. + * + * GPGFrontend 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 3 of the License, or + * (at your option) any later version. + * + * Foobar 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 Foobar. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from gpg4usb-team. + * Their source code version also complies with GNU General Public License. + * + * The source code version of this software was modified and released + * by Saturneric<[email protected]> starting on May 12, 2021. + * + */ + +#include "gpg/GpgInfo.h" diff --git a/src/gpg/GpgUID.cpp b/src/gpg/GpgUID.cpp index f8f7e8fa..0dc6abfd 100644 --- a/src/gpg/GpgUID.cpp +++ b/src/gpg/GpgUID.cpp @@ -1,6 +1,26 @@ -// -// Created by eric on 2021/5/22. -// +/** + * This file is part of GPGFrontend. + * + * GPGFrontend 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 3 of the License, or + * (at your option) any later version. + * + * Foobar 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 Foobar. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from gpg4usb-team. + * Their source code version also complies with GNU General Public License. + * + * The source code version of this software was modified and released + * by Saturneric<[email protected]> starting on May 12, 2021. + * + */ #include "gpg/GpgUID.h" diff --git a/src/gpg/gpg_context/GpgContext.cpp b/src/gpg/gpg_context/GpgContext.cpp new file mode 100644 index 00000000..14b54b32 --- /dev/null +++ b/src/gpg/gpg_context/GpgContext.cpp @@ -0,0 +1,410 @@ +/** + * This file is part of GPGFrontend. + * + * GPGFrontend 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 3 of the License, or + * (at your option) any later version. + * + * Foobar 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 Foobar. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from gpg4usb-team. + * Their source code version also complies with GNU General Public License. + * + * The source code version of this software was modified and released + * by Saturneric<[email protected]> starting on May 12, 2021. + * + */ + +#include "gpg/GpgContext.h" +#include "ui/WaitingDialog.h" + +#include <functional> +#include <unistd.h> /* contains read/write */ + +#ifdef _WIN32 + +#include <windows.h> + +#endif + +#define INT2VOIDP(i) (void*)(uintptr_t)(i) + +namespace GpgME { + + /** Constructor + * Set up gpgme-context, set paths to app-run path + */ + GpgContext::GpgContext() { + + /** The function `gpgme_check_version' must be called before any other + * function in the library, because it initializes the thread support + * subsystem in GPGME. (from the info page) */ + gpgme_check_version(nullptr); + + // the locale set here is used for the other setlocale calls which have nullptr + // -> nullptr means use default, which is configured here + setlocale(LC_ALL, settings.value("int/lang").toLocale().name().toUtf8().constData()); + + /** set locale, because tests do also */ + gpgme_set_locale(nullptr, LC_CTYPE, setlocale(LC_CTYPE, nullptr)); + //qDebug() << "Locale set to" << LC_CTYPE << " - " << setlocale(LC_CTYPE, nullptr); +#ifndef _WIN32 + gpgme_set_locale(nullptr, LC_MESSAGES, setlocale(LC_MESSAGES, nullptr)); +#endif + + err = gpgme_new(&mCtx); + checkErr(err); + + gpgme_engine_info_t engineInfo; + engineInfo = gpgme_ctx_get_engine_info(mCtx); + +// Check ENV before running + bool check_pass = false, find_openpgp = false, find_gpgconf = false, find_assuan = false, find_cms = false; + while (engineInfo != nullptr) { + qDebug() << gpgme_get_protocol_name(engineInfo->protocol) << engineInfo->file_name << engineInfo->protocol + << engineInfo->home_dir << engineInfo->version; + if (engineInfo->protocol == GPGME_PROTOCOL_GPGCONF && strcmp(engineInfo->version, "1.0.0") != 0) + find_gpgconf = true; + if (engineInfo->protocol == GPGME_PROTOCOL_OpenPGP && strcmp(engineInfo->version, "1.0.0") != 0) + find_openpgp = true, info.appPath = engineInfo->file_name; + if (engineInfo->protocol == GPGME_PROTOCOL_CMS && strcmp(engineInfo->version, "1.0.0") != 0) + find_cms = true; + if (engineInfo->protocol == GPGME_PROTOCOL_ASSUAN) + find_assuan = true; + + engineInfo = engineInfo->next; + } + + if (find_gpgconf && find_openpgp && find_cms && find_assuan) + check_pass = true; + + if (!check_pass) { + good = false; + return; + } else good = true; + + +/** Setting the output type must be done at the beginning */ +/** think this means ascii-armor --> ? */ + gpgme_set_armor(mCtx, 1); +/** passphrase-callback */ + gpgme_set_passphrase_cb(mCtx, passphraseCb, this); + +/** check if app is called with -d from command line */ + if (qApp->arguments().contains("-d")) { + qDebug() << "gpgme_data_t debug on"; + debug = true; + } else { + debug = false; + } + + connect(this, SIGNAL(signalKeyDBChanged()), + this, SLOT(slotRefreshKeyList()), Qt::DirectConnection); + connect(this, SIGNAL(signalKeyUpdated(QString)), + this, SLOT(slotUpdateKeyList(QString)), Qt::DirectConnection); + slotRefreshKeyList(); + } + + /** Destructor + * Release gpgme-context + */ + GpgContext::~GpgContext() { + if (mCtx) gpgme_release(mCtx); + mCtx = nullptr; + } + + bool GpgContext::isGood() const { + return good; + } + + /** Read gpgme-Data to QByteArray + * mainly from http://basket.kde.org/ (kgpgme.cpp) + */ +#define BUF_SIZE (32 * 1024) + + gpgme_error_t GpgContext::readToBuffer(gpgme_data_t dataIn, QByteArray *outBuffer) { + gpgme_off_t ret; + gpgme_error_t gpgErrNoError = GPG_ERR_NO_ERROR; + + ret = gpgme_data_seek(dataIn, 0, SEEK_SET); + if (ret) { + gpgErrNoError = gpgme_err_code_from_errno(errno); + checkErr(gpgErrNoError, "failed dataseek dataIn readToBuffer"); + } else { + char buf[BUF_SIZE + 2]; + + while ((ret = gpgme_data_read(dataIn, buf, BUF_SIZE)) > 0) { + const size_t size = outBuffer->size(); + outBuffer->resize(static_cast<int>(size + ret)); + memcpy(outBuffer->data() + size, buf, ret); + } + if (ret < 0) { + gpgErrNoError = gpgme_err_code_from_errno(errno); + checkErr(gpgErrNoError, "failed data_read dataIn readToBuffer"); + } + } + return gpgErrNoError; + } + + /** + * The Passphrase window, if not provided by env-Var GPG_AGENT_INFO + * originally copied from http://basket.kde.org/ (kgpgme.cpp), but modified + */ + gpgme_error_t GpgContext::passphraseCb(void *hook, const char *uid_hint, + const char *passphrase_info, + int last_was_bad, int fd) { + auto *gpg = static_cast<GpgContext *>(hook); + return gpg->passphrase(uid_hint, passphrase_info, last_was_bad, fd); + } + + gpgme_error_t GpgContext::passphrase(const char *uid_hint, + const char * /*passphrase_info*/, + int last_was_bad, int fd) { + + gpgme_error_t returnValue = GPG_ERR_CANCELED; + QString passwordDialogMessage; + QString gpgHint = QString::fromUtf8(uid_hint); + bool result; + +#ifdef _WIN32 + DWORD written; + auto hd = INT2VOIDP(fd); +#endif + + if (last_was_bad) { + passwordDialogMessage += "<i>" + tr("Wrong password") + ".</i><br><br>\n\n"; + clearPasswordCache(); + } + + /** if uid provided */ + if (!gpgHint.isEmpty()) { + // remove UID, leave only username & email + gpgHint.remove(0, gpgHint.indexOf(" ")); + passwordDialogMessage += "<b>" + tr("Enter Password for") + "</b><br>" + gpgHint + "<br>"; + } + + if (mPasswordCache.isEmpty()) { + QString password = QInputDialog::getText(QApplication::activeWindow(), tr("Enter Password"), + passwordDialogMessage, QLineEdit::Password, + "", &result); + + if (result) mPasswordCache = password.toUtf8(); + } else result = true; + + if (result) { + +#ifndef _WIN32 + if (write(fd, mPasswordCache.data(), mPasswordCache.length()) == -1) qDebug() << "something is terribly broken"; +#else + WriteFile(hd, mPasswordCache.data(), mPasswordCache.length(), &written, 0); +#endif + returnValue = GPG_ERR_NO_ERROR; + } + +#ifndef _WIN32 + if (write(fd, "\n", 1) == -1) qDebug() << "something is terribly broken"; +#else + WriteFile(hd, "\n", 1, &written, 0); + + /* program will hang on cancel if hd not closed */ + if (!result) CloseHandle(hd); +#endif + + return returnValue; + } + + /** also from kgpgme.cpp, seems to clear password from mem */ + void GpgContext::clearPasswordCache() { + if (mPasswordCache.size() > 0) { + mPasswordCache.fill('\0'); + mPasswordCache.truncate(0); + } + } + + // error-handling + void GpgContext::checkErr(gpgme_error_t gpgmeError, const QString &comment) { + //if (gpgmeError != GPG_ERR_NO_ERROR && gpgmeError != GPG_ERR_CANCELED) { + if (gpgmeError != GPG_ERR_NO_ERROR) { + qDebug() << "[Error " << gpg_err_code(gpgmeError) + << "] Source: " << gpgme_strsource(gpgmeError) << " Description: " << gpgErrString(gpgmeError); + } + } + + void GpgContext::checkErr(gpgme_error_t gpgmeError) { + //if (gpgmeError != GPG_ERR_NO_ERROR && gpgmeError != GPG_ERR_CANCELED) { + if (gpg_err_code(gpgmeError) != GPG_ERR_NO_ERROR) { + qDebug() << "[Error " << gpg_err_code(gpgmeError) + << "] Source: " << gpgme_strsource(gpgmeError) << " Description: " << gpgErrString(gpgmeError); + } + } + + QString GpgContext::gpgErrString(gpgme_error_t err) { + return QString::fromUtf8(gpgme_strerror(err)); + } + + /** return type should be gpgme_error_t*/ + void + GpgContext::executeGpgCommand(const QStringList &arguments, const std::function<void(QProcess *)> &interactFunc) { + QEventLoop looper; + auto dialog = new WaitingDialog(tr("Processing"), nullptr); + dialog->show(); + auto *gpgProcess = new QProcess(&looper); + gpgProcess->setProcessChannelMode(QProcess::MergedChannels); + connect(gpgProcess, qOverload<int, QProcess::ExitStatus>(&QProcess::finished), &looper, &QEventLoop::quit); + connect(gpgProcess, qOverload<int, QProcess::ExitStatus>(&QProcess::finished), dialog, + &WaitingDialog::deleteLater); + connect(gpgProcess, &QProcess::errorOccurred, []() -> void { qDebug("Error in Process"); }); + connect(gpgProcess, &QProcess::errorOccurred, &looper, &QEventLoop::quit); + connect(gpgProcess, &QProcess::started, []() -> void { qDebug() << "Gpg Process Started Success"; }); + connect(gpgProcess, &QProcess::readyReadStandardOutput, [interactFunc, gpgProcess]() { + qDebug() << "Function Called"; + interactFunc(gpgProcess); + }); + gpgProcess->setProgram(info.appPath); + gpgProcess->setArguments(arguments); + gpgProcess->start(); + looper.exec(); + dialog->close(); + + } + + + /* + * if there is no '\n' before the PGP-Begin-Block, but for example a whitespace, + * GPGME doesn't recognise the Message as encrypted. This function adds '\n' + * before the PGP-Begin-Block, if missing. + */ + void GpgContext::preventNoDataErr(QByteArray *in) { + int block_start = in->indexOf(GpgConstants::PGP_CRYPT_BEGIN); + if (block_start > 0 && in->at(block_start - 1) != '\n') { + in->insert(block_start, '\n'); + } + block_start = in->indexOf(GpgConstants::PGP_SIGNED_BEGIN); + if (block_start > 0 && in->at(block_start - 1) != '\n') { + in->insert(block_start, '\n'); + } + } + + /* + * isSigned returns: + * - 0, if text isn't signed at all + * - 1, if text is partially signed + * - 2, if text is completly signed + */ + int GpgContext::textIsSigned(const QByteArray &text) { + if (text.trimmed().startsWith(GpgConstants::PGP_SIGNED_BEGIN) && + text.trimmed().endsWith(GpgConstants::PGP_SIGNED_END)) + return 2; + else if (text.contains(GpgConstants::PGP_SIGNED_BEGIN) && text.contains(GpgConstants::PGP_SIGNED_END)) + return 1; + + else return 0; + } + + QString GpgContext::beautifyFingerprint(QString fingerprint) { + uint len = fingerprint.length(); + if ((len > 0) && (len % 4 == 0)) + for (uint n = 0; 4 * (n + 1) < len; ++n) fingerprint.insert(static_cast<int>(5u * n + 4u), ' '); + return fingerprint; + } + + void GpgContext::slotRefreshKeyList() { + qDebug() << "Refreshing Keys"; + this->fetch_keys(); + emit signalKeyInfoChanged(); + } + + QString GpgContext::getGpgmeVersion() { + return {gpgme_check_version(nullptr)}; + } + + const GpgKeyList &GpgContext::getKeys() const { + return mKeyList; + } + + void GpgContext::getSigners(QVector<GpgKey> &signer, gpgme_ctx_t ctx) { + auto count = gpgme_signers_count(ctx); + signer.clear(); + for (auto i = 0; i < count; i++) { + auto key = gpgme_signers_enum(ctx, i); + auto it = mKeyMap.find(key->subkeys->keyid); + if (it == mKeyMap.end()) { + qDebug() << "Inconsistent state"; + signer.push_back(GpgKey(key)); + } else { + signer.push_back(*it.value()); + } + } + } + + void GpgContext::setSigners(const QVector<GpgKey> &keys, gpgme_ctx_t ctx) { + gpgme_signers_clear(ctx); + for (const auto &key : keys) { + if (checkIfKeyCanSign(key)) { + auto gpgmeError = gpgme_signers_add(ctx, key.key_refer); + checkErr(gpgmeError); + } + } + if (keys.length() != gpgme_signers_count(ctx)) { + qDebug() << "No All Keys Added"; + } + } + + void GpgContext::slotUpdateKeyList(const QString &key_id) { + auto it = mKeyMap.find(key_id); + if (it != mKeyMap.end()) { + gpgme_key_t new_key_refer; + auto gpgmeErr = gpgme_get_key(mCtx, key_id.toUtf8().constData(), &new_key_refer, 0); + + if (gpgme_err_code(gpgmeErr) == GPG_ERR_EOF) { + gpgmeErr = gpgme_get_key(mCtx, key_id.toUtf8().constData(), &new_key_refer, 1); + + if (gpgme_err_code(gpgmeErr) == GPG_ERR_EOF) { + throw std::runtime_error("key_id not found in key database"); + } + + } + + if (new_key_refer != nullptr) { + it.value()->swapKeyRefer(new_key_refer); + emit signalKeyInfoChanged(); + } + + } + } + + bool GpgContext::revSign(const GpgKey &key, const GpgKeySignature &signature) { + + auto signing_key = getKeyById(signature.keyid); + + auto gpgmeError = gpgme_op_revsig(mCtx, key.key_refer, + signing_key.key_refer, + signature.uid.toUtf8().constData(), 0); + if (gpg_err_code(gpgmeError) == GPG_ERR_NO_ERROR) { + emit signalKeyUpdated(key.id); + return true; + } else { + checkErr(gpgmeError); + return false; + } + } + + gpgme_ctx_t GpgME::GpgContext::create_ctx() { + gpgme_ctx_t ctx; + err = gpgme_new(&ctx); + checkErr(err); + + gpgme_set_armor(ctx, 1); + gpgme_set_passphrase_cb(ctx, passphraseCb, this); + return ctx; + } + + +} diff --git a/src/gpg/gpg_context/GpgContextBasicOpera.cpp b/src/gpg/gpg_context/GpgContextBasicOpera.cpp new file mode 100644 index 00000000..d9bf0bdb --- /dev/null +++ b/src/gpg/gpg_context/GpgContextBasicOpera.cpp @@ -0,0 +1,315 @@ +/** + * This file is part of GPGFrontend. + * + * GPGFrontend 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 3 of the License, or + * (at your option) any later version. + * + * Foobar 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 Foobar. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from gpg4usb-team. + * Their source code version also complies with GNU General Public License. + * + * The source code version of this software was modified and released + * by Saturneric<[email protected]> starting on May 12, 2021. + * + */ + +#include "gpg/GpgContext.h" + +/** + * Encrypt data + * @param keys keys used + * @param inBuffer input byte array + * @param outBuffer output byte array + * @param result opera result + * @return error information + */ +gpg_error_t GpgME::GpgContext::encrypt(QVector<GpgKey> &keys, const QByteArray &inBuffer, QByteArray *outBuffer, + gpgme_encrypt_result_t *result) { + + gpgme_data_t dataIn = nullptr, dataOut = nullptr; + outBuffer->resize(0); + + // gpgme_encrypt_result_t e_result; + gpgme_key_t recipients[keys.count() + 1]; + + int index = 0; + for (const auto &key : keys) recipients[index++] = key.key_refer; + + // Last entry dataIn array has to be nullptr + recipients[keys.count()] = nullptr; + + // If the last parameter isnt 0, a private copy of data is made + if (mCtx) { + err = gpgme_data_new_from_mem(&dataIn, inBuffer.data(), inBuffer.size(), 1); + checkErr(err); + if (!err) { + err = gpgme_data_new(&dataOut); + checkErr(err); + if (!err) { + err = gpgme_op_encrypt(mCtx, recipients, GPGME_ENCRYPT_ALWAYS_TRUST, dataIn, dataOut); + checkErr(err); + if (!err) { + err = readToBuffer(dataOut, outBuffer); + checkErr(err); + } + } + } + } + if (dataIn) gpgme_data_release(dataIn); + if (dataOut) gpgme_data_release(dataOut); + + if (result != nullptr) *result = gpgme_op_encrypt_result(mCtx); + return err; +} + +/** + * Decrypt data + * @param keys keys used + * @param inBuffer input byte array + * @param outBuffer output byte array + * @param result opera result + * @return error information + */ +gpgme_error_t GpgME::GpgContext::decrypt(const QByteArray &inBuffer, QByteArray *outBuffer, + gpgme_decrypt_result_t *result) { + gpgme_data_t dataIn = nullptr, dataOut = nullptr; + gpgme_decrypt_result_t m_result = nullptr; + + outBuffer->resize(0); + if (mCtx != nullptr) { + err = gpgme_data_new_from_mem(&dataIn, inBuffer.data(), inBuffer.size(), 1); + if (gpgme_err_code(err) == GPG_ERR_NO_ERROR) { + err = gpgme_data_new(&dataOut); + if (gpgme_err_code(err) == GPG_ERR_NO_ERROR) { + err = gpgme_op_decrypt(mCtx, dataIn, dataOut); + m_result = gpgme_op_decrypt_result(mCtx); + if (gpgme_err_code(err) == GPG_ERR_NO_ERROR) err = readToBuffer(dataOut, outBuffer); + } + } + } + + if (!settings.value("general/rememberPassword").toBool()) clearPasswordCache(); + + if (dataIn) gpgme_data_release(dataIn); + if (dataOut) gpgme_data_release(dataOut); + + if (result != nullptr) *result = m_result; + + return err; +} + +/** + * Verify data + * @param keys keys used + * @param inBuffer input byte array + * @param sigBuffer signature byte array (detected by format) + * @param result opera result + * @return error information + */ +gpgme_error_t GpgME::GpgContext::verify(QByteArray *inBuffer, QByteArray *sigBuffer, gpgme_verify_result_t *result) { + + gpgme_data_t dataIn; + gpgme_error_t gpgmeError; + gpgme_verify_result_t m_result; + + gpgmeError = gpgme_data_new_from_mem(&dataIn, inBuffer->data(), inBuffer->size(), 1); + checkErr(gpgmeError); + + if (sigBuffer != nullptr) { + gpgme_data_t sigdata; + gpgmeError = gpgme_data_new_from_mem(&sigdata, sigBuffer->data(), sigBuffer->size(), 1); + checkErr(gpgmeError); + gpgmeError = gpgme_op_verify(mCtx, sigdata, dataIn, nullptr); + } else { + gpgmeError = gpgme_op_verify(mCtx, dataIn, nullptr, dataIn); + } + + checkErr(gpgmeError); + + m_result = gpgme_op_verify_result(mCtx); + + if (result != nullptr) { + *result = m_result; + } + + return gpgmeError; +} + +/** + * Sign data + * @param keys keys used + * @param inBuffer input byte array + * @param outBuffer output byte array + * @param mode sign mode + * @param result opera result + * @return + */ +gpg_error_t GpgME::GpgContext::sign(const QVector<GpgKey> &keys, const QByteArray &inBuffer, QByteArray *outBuffer, + gpgme_sig_mode_t mode, gpgme_sign_result_t *result, bool default_ctx) { + + gpgme_error_t gpgmeError; + gpgme_data_t dataIn, dataOut; + gpgme_sign_result_t m_result; + + auto _ctx = mCtx; + + if(!default_ctx) + _ctx = create_ctx(); + + if (keys.isEmpty()) { + QMessageBox::critical(nullptr, tr("Key Selection"), tr("No Private Key Selected")); + return false; + } + + // Set Singers of this opera + setSigners(keys, _ctx); + + gpgmeError = gpgme_data_new_from_mem(&dataIn, inBuffer.data(), inBuffer.size(), 1); + checkErr(gpgmeError); + gpgmeError = gpgme_data_new(&dataOut); + checkErr(gpgmeError); + + /** + `GPGME_SIG_MODE_NORMAL' + A normal signature is made, the output includes the plaintext + and the signature. + + `GPGME_SIG_MODE_DETACH' + A detached signature is made. + + `GPGME_SIG_MODE_CLEAR' + A clear text signature is made. The ASCII armor and text + mode settings of the context are ignored. + */ + + gpgmeError = gpgme_op_sign(_ctx, dataIn, dataOut, mode); + checkErr(gpgmeError); + + if (gpgmeError == GPG_ERR_CANCELED) return false; + + if (gpgmeError != GPG_ERR_NO_ERROR) { + QMessageBox::critical(nullptr, tr("Error in signing:"), QString::fromUtf8(gpgme_strerror(gpgmeError))); + return false; + } + + if(default_ctx) + m_result = gpgme_op_sign_result(_ctx); + else m_result = nullptr; + + if (result != nullptr) *result = m_result; + + if(!default_ctx) gpgme_release(_ctx); + + gpgmeError = readToBuffer(dataOut, outBuffer); + checkErr(gpgmeError); + + gpgme_data_release(dataIn); + gpgme_data_release(dataOut); + + // Of no use yet + if (!settings.value("general/rememberPassword").toBool()) clearPasswordCache(); + + return gpgmeError; +} + +/** + * Encrypt and sign data + * @param keys keys used + * @param inBuffer input byte array + * @param outBuffer output byte array + * @param encr_result encrypt opera result + * @param sign_result sign opera result + * @return + */ +gpgme_error_t +GpgME::GpgContext::encryptSign(QVector<GpgKey> &keys, QVector<GpgKey> &signers, const QByteArray &inBuffer, + QByteArray *outBuffer, gpgme_encrypt_result_t *encr_result, + gpgme_sign_result_t *sign_result) { + gpgme_data_t data_in = nullptr, data_out = nullptr; + outBuffer->resize(0); + + setSigners(signers, mCtx); + + //gpgme_encrypt_result_t e_result; + gpgme_key_t recipients[keys.count() + 1]; + + // set key for user + int index = 0; + for (const auto &key : keys) recipients[index++] = key.key_refer; + + // Last entry dataIn array has to be nullptr + recipients[keys.count()] = nullptr; + + // If the last parameter isnt 0, a private copy of data is made + if (mCtx != nullptr) { + err = gpgme_data_new_from_mem(&data_in, inBuffer.data(), inBuffer.size(), 1); + if (gpg_err_code(err) == GPG_ERR_NO_ERROR) { + err = gpgme_data_new(&data_out); + if (gpg_err_code(err) == GPG_ERR_NO_ERROR) { + err = gpgme_op_encrypt_sign(mCtx, recipients, GPGME_ENCRYPT_ALWAYS_TRUST, data_in, data_out); + if (encr_result != nullptr) + *encr_result = gpgme_op_encrypt_result(mCtx); + if (sign_result != nullptr) + *sign_result = gpgme_op_sign_result(mCtx); + if (gpg_err_code(err) == GPG_ERR_NO_ERROR) { + err = readToBuffer(data_out, outBuffer); + } + } + } + } + + if (gpgme_err_code(err) != GPG_ERR_NO_ERROR) checkErr(err); + + if (data_in) gpgme_data_release(data_in); + if (data_out) gpgme_data_release(data_out); + + return err; +} + +/** + * Decrypt and verify data + * @param inBuffer input byte array + * @param outBuffer output byte array + * @param decrypt_result decrypt opera result + * @param verify_result verify opera result + * @return error info + */ +gpgme_error_t GpgME::GpgContext::decryptVerify(const QByteArray &inBuffer, QByteArray *outBuffer, + gpgme_decrypt_result_t *decrypt_result, + gpgme_verify_result_t *verify_result) { + gpgme_data_t data_in = nullptr, data_out = nullptr; + + outBuffer->resize(0); + if (mCtx != nullptr) { + err = gpgme_data_new_from_mem(&data_in, inBuffer.data(), inBuffer.size(), 1); + if (gpgme_err_code(err) == GPG_ERR_NO_ERROR) { + err = gpgme_data_new(&data_out); + if (gpgme_err_code(err) == GPG_ERR_NO_ERROR) { + err = gpgme_op_decrypt_verify(mCtx, data_in, data_out); + if (decrypt_result != nullptr) + *decrypt_result = gpgme_op_decrypt_result(mCtx); + if (verify_result != nullptr) + *verify_result = gpgme_op_verify_result(mCtx); + if (gpgme_err_code(err) == GPG_ERR_NO_ERROR) { + err = readToBuffer(data_out, outBuffer); + } + } + } + } + + if (!settings.value("general/rememberPassword").toBool()) clearPasswordCache(); + + if (data_in) gpgme_data_release(data_in); + if (data_out) gpgme_data_release(data_out); + + return err; +} diff --git a/src/gpg/gpg_context/GpgContextKeyInfo.cpp b/src/gpg/gpg_context/GpgContextKeyInfo.cpp new file mode 100644 index 00000000..f6942e4e --- /dev/null +++ b/src/gpg/gpg_context/GpgContextKeyInfo.cpp @@ -0,0 +1,110 @@ +/** + * This file is part of GPGFrontend. + * + * GPGFrontend 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 3 of the License, or + * (at your option) any later version. + * + * Foobar 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 Foobar. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from gpg4usb-team. + * Their source code version also complies with GNU General Public License. + * + * The source code version of this software was modified and released + * by Saturneric<[email protected]> starting on May 12, 2021. + * + */ + +#include "gpg/GpgContext.h" + +/** + * check if key can sign(actually) + * @param key target key + * @return if key sign + */ +bool GpgME::GpgContext::checkIfKeyCanSign(const GpgKey &key) { + if (std::any_of(key.subKeys.begin(), key.subKeys.end(), [](const GpgSubKey &subkey) -> bool { + return subkey.secret && subkey.can_sign && !subkey.disabled && !subkey.revoked && !subkey.expired; + })) + return true; + else return false; +} + +/** + * check if key can certify(actually) + * @param key target key + * @return if key certify + */ +bool GpgME::GpgContext::checkIfKeyCanCert(const GpgKey &key) { + return key.has_master_key && !key.expired && !key.revoked && !key.disabled; +} + +/** + * check if key can authenticate(actually) + * @param key target key + * @return if key authenticate + */ +bool GpgME::GpgContext::checkIfKeyCanAuth(const GpgKey &key) { + if (std::any_of(key.subKeys.begin(), key.subKeys.end(), [](const GpgSubKey &subkey) -> bool { + return subkey.secret && subkey.can_authenticate && !subkey.disabled && !subkey.revoked && !subkey.expired; + })) + return true; + else return false; +} + +/** + * check if key can encrypt(actually) + * @param key target key + * @return if key encrypt + */ +bool GpgME::GpgContext::checkIfKeyCanEncr(const GpgKey &key) { + if (std::any_of(key.subKeys.begin(), key.subKeys.end(), [](const GpgSubKey &subkey) -> bool { + return subkey.can_encrypt && !subkey.disabled && !subkey.revoked && !subkey.expired; + })) + return true; + else return false; +} + +/** + * Get target key + * @param fpr master key's fingerprint + * @return the key + */ +GpgKey GpgME::GpgContext::getKeyByFpr(const QString &fpr) { + for (const auto &key : mKeyList) { + if (key.fpr == fpr) return key; + else + for (auto &subkey : key.subKeys) { + if (subkey.fpr == fpr) return key; + } + } + return GpgKey(nullptr); +} + + +/** + * Get target key + * @param id master key's id + * @return the key + */ +GpgKey GpgME::GpgContext::getKeyById(const QString &id) { + + for (const auto &key : mKeyList) { + if (key.id == id) return key; + else { + auto sub_keys = key.subKeys; + for (const auto &subkey : sub_keys) { + if (subkey.id == id) return key; + } + } + } + + return GpgKey(nullptr); +} diff --git a/src/gpg/gpg_context/GpgContextKeyOpera.cpp b/src/gpg/gpg_context/GpgContextKeyOpera.cpp new file mode 100644 index 00000000..a224231d --- /dev/null +++ b/src/gpg/gpg_context/GpgContextKeyOpera.cpp @@ -0,0 +1,410 @@ +/** + * This file is part of GPGFrontend. + * + * GPGFrontend 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 3 of the License, or + * (at your option) any later version. + * + * Foobar 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 Foobar. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from gpg4usb-team. + * Their source code version also complies with GNU General Public License. + * + * The source code version of this software was modified and released + * by Saturneric<[email protected]> starting on May 12, 2021. + * + */ + +#include "gpg/GpgContext.h" + +/** + * Import key pair + * @param inBuffer input byte array + * @return Import information + */ +GpgImportInformation GpgME::GpgContext::importKey(QByteArray inBuffer) { + auto *importInformation = new GpgImportInformation(); + err = gpgme_data_new_from_mem(&in, inBuffer.data(), inBuffer.size(), 1); + checkErr(err); + err = gpgme_op_import(mCtx, in); + gpgme_import_result_t result; + + result = gpgme_op_import_result(mCtx); + + if (result->unchanged) importInformation->unchanged = result->unchanged; + if (result->considered) importInformation->considered = result->considered; + if (result->no_user_id) importInformation->no_user_id = result->no_user_id; + if (result->imported) importInformation->imported = result->imported; + if (result->imported_rsa) importInformation->imported_rsa = result->imported_rsa; + if (result->unchanged) importInformation->unchanged = result->unchanged; + if (result->new_user_ids) importInformation->new_user_ids = result->new_user_ids; + if (result->new_sub_keys) importInformation->new_sub_keys = result->new_sub_keys; + if (result->new_signatures) importInformation->new_signatures = result->new_signatures; + if (result->new_revocations) importInformation->new_revocations = result->new_revocations; + if (result->secret_read) importInformation->secret_read = result->secret_read; + if (result->secret_imported) importInformation->secret_imported = result->secret_imported; + if (result->secret_unchanged) importInformation->secret_unchanged = result->secret_unchanged; + if (result->not_imported) importInformation->not_imported = result->not_imported; + + gpgme_import_status_t status = result->imports; + while (status != nullptr) { + GpgImportedKey key; + key.importStatus = static_cast<int>(status->status); + key.fpr = status->fpr; + importInformation->importedKeys.emplace_back(key); + status = status->next; + } + checkErr(err); + emit signalKeyDBChanged(); + gpgme_data_release(in); + return *importInformation; +} + +/** + * Generate a new key pair + * @param params key generation args + * @return error information + */ +gpgme_error_t GpgME::GpgContext::generateKey(GenKeyInfo *params) { + + auto userid_utf8 = params->getUserid().toUtf8(); + const char *userid = userid_utf8.constData(); + auto algo_utf8 = (params->getAlgo() + params->getKeySizeStr()).toUtf8(); + const char *algo = algo_utf8.constData(); + unsigned long expires = QDateTime::currentDateTime().secsTo(params->getExpired()); + unsigned int flags = 0; + + if (!params->isSubKey()) flags |= GPGME_CREATE_CERT; + if (params->isAllowEncryption()) flags |= GPGME_CREATE_ENCR; + if (params->isAllowSigning()) flags |= GPGME_CREATE_SIGN; + if (params->isAllowAuthentication()) flags |= GPGME_CREATE_AUTH; + if (params->isNonExpired()) flags |= GPGME_CREATE_NOEXPIRE; + if (params->isNoPassPhrase()) flags |= GPGME_CREATE_NOPASSWD; + + err = gpgme_op_createkey(mCtx, userid, algo, 0, expires, nullptr, flags); + + if (gpgme_err_code(err) != GPG_ERR_NO_ERROR) { + checkErr(err); + return err; + } else { + emit signalKeyDBChanged(); + return err; + } +} + +/** + * Export Key + * @param uidList key ids + * @param outBuffer output byte array + * @return if success + */ +bool GpgME::GpgContext::exportKeys(QStringList *uidList, QByteArray *outBuffer) { + gpgme_data_t dataOut = nullptr; + outBuffer->resize(0); + + if (uidList->count() == 0) { + QMessageBox::critical(nullptr, "Export Keys Error", "No Keys Selected"); + return false; + } + + // Alleviate another crash problem caused by an unknown array out-of-bounds access + gpgme_ctx_t ctx = create_ctx(); + + for (int i = 0; i < uidList->count(); i++) { + err = gpgme_data_new(&dataOut); + checkErr(err); + + err = gpgme_op_export(ctx, uidList->at(i).toUtf8().constData(), 0, dataOut); + checkErr(err); + + qDebug() << "exportKeys read_bytes" << gpgme_data_seek(dataOut, 0, SEEK_END); + + err = readToBuffer(dataOut, outBuffer); + checkErr(err); + gpgme_data_release(dataOut); + } + + gpgme_release(ctx); + + return true; +} + +/** + * Get and store all key pairs info + */ +void GpgME::GpgContext::fetch_keys() { + + gpgme_error_t gpgmeError; + + gpgme_key_t key; + + qDebug() << "Clear List and Map"; + + mKeyList.clear(); + mKeyMap.clear(); + + auto &keys = mKeyList; + auto &keys_map = mKeyMap; + + qDebug() << "Set Key Listing Mode"; + + gpgmeError = gpgme_set_keylist_mode(mCtx, + GPGME_KEYLIST_MODE_LOCAL + | GPGME_KEYLIST_MODE_WITH_SECRET + | GPGME_KEYLIST_MODE_SIGS + | GPGME_KEYLIST_MODE_SIG_NOTATIONS + | GPGME_KEYLIST_MODE_WITH_TOFU); + if (gpg_err_code(gpgmeError) != GPG_ERR_NO_ERROR) { + checkErr(gpgmeError); + return; + } + + qDebug() << "Operate KeyList Start"; + + gpgmeError = gpgme_op_keylist_start(mCtx, nullptr, 0); + if (gpg_err_code(gpgmeError) != GPG_ERR_NO_ERROR) { + checkErr(gpgmeError); + return; + } + + qDebug() << "Start Loop"; + + while ((gpgmeError = gpgme_op_keylist_next(mCtx, &key)) == GPG_ERR_NO_ERROR) { + if (!key->subkeys) + continue; + + qDebug() << "Append Key" << key->subkeys->keyid; + + keys.emplace_back(key); + keys_map.insert(keys.back().id, &keys.back()); + gpgme_key_unref(key); + } + + + if (gpg_err_code(gpgmeError) != GPG_ERR_EOF) { + checkErr(gpgmeError); + return; + } + + gpgmeError = gpgme_op_keylist_end(mCtx); + if (gpg_err_code(gpgmeError) != GPG_ERR_NO_ERROR) { + checkErr(gpgmeError); + return; + } + + qDebug() << "Operate KeyList End"; + + mKeyList = keys; +} + +/** + * Delete keys + * @param uidList key ids + */ +void GpgME::GpgContext::deleteKeys(QStringList *uidList) { + + gpgme_error_t error; + gpgme_key_t key; + + for (const auto &tmp : *uidList) { + + error = gpgme_op_keylist_start(mCtx, tmp.toUtf8().constData(), 0); + if (error != GPG_ERR_NO_ERROR) { + checkErr(error); + continue; + } + + error = gpgme_op_keylist_next(mCtx, &key); + if (error != GPG_ERR_NO_ERROR) { + checkErr(error); + continue; + } + + error = gpgme_op_keylist_end(mCtx); + if (error != GPG_ERR_NO_ERROR) { + checkErr(error); + continue; + } + + error = gpgme_op_delete(mCtx, key, 1); + if (error != GPG_ERR_NO_ERROR) { + checkErr(error); + continue; + } + + } + emit signalKeyDBChanged(); +} + +/** + * Export keys + * @param keys keys used + * @param outBuffer output byte array + * @return if success + */ +bool GpgME::GpgContext::exportKeys(const QVector<GpgKey> &keys, QByteArray &outBuffer) { + gpgme_data_t data_out = nullptr; + outBuffer.resize(0); + + if (keys.empty()) { + QMessageBox::critical(nullptr, "Export Keys Error", "No Keys Selected"); + return false; + } + + for (const auto &key : keys) { + err = gpgme_data_new(&data_out); + checkErr(err); + + err = gpgme_op_export(mCtx, key.id.toUtf8().constData(), 0, data_out); + checkErr(err); + + gpgme_data_seek(data_out, 0, SEEK_END); + + err = readToBuffer(data_out, &outBuffer); + checkErr(err); + gpgme_data_release(data_out); + } + + return true; +} + +/** + * Set the expire date and time of a key pair(actually the master key) or subkey + * @param key target key pair + * @param subkey null if master key + * @param expires date and time + * @return if successful + */ +bool GpgME::GpgContext::setExpire(const GpgKey &key, const GpgSubKey *subkey, QDateTime *expires) { + unsigned long expires_time = 0; + if (expires != nullptr) { + qDebug() << "Expire Datetime" << expires->toString(); + expires_time = QDateTime::currentDateTime().secsTo(*expires); + } + + const char *subfprs = nullptr; + + if (subkey != nullptr) subfprs = subkey->fpr.toUtf8().constData(); + + auto gpgmeError = gpgme_op_setexpire(mCtx, key.key_refer, + expires_time, subfprs, 0); + if (gpgmeError == GPG_ERR_NO_ERROR) { + emit signalKeyUpdated(key.id); + return true; + } else { + checkErr(gpgmeError); + return false; + } +} + +/** + * Export the secret key of a key pair(including subkeys) + * @param key target key pair + * @param outBuffer output byte array + * @return if successful + */ +bool GpgME::GpgContext::exportSecretKey(const GpgKey &key, QByteArray *outBuffer) { + qDebug() << "Export Secret Key" << key.id; + gpgme_key_t target_key[2] = { + key.key_refer, + nullptr + }; + + gpgme_data_t dataOut; + gpgme_data_new(&dataOut); + + // export private key to outBuffer + gpgme_error_t error = gpgme_op_export_keys(mCtx, target_key, GPGME_EXPORT_MODE_SECRET, dataOut); + + if (gpgme_err_code(error) != GPG_ERR_NO_ERROR) { + checkErr(error); + gpgme_data_release(dataOut); + return false; + } + + readToBuffer(dataOut, outBuffer); + gpgme_data_release(dataOut); + return true; +} + +/** + * Sign a key pair(actually a certain uid) + * @param target target key pair + * @param uid target + * @param expires expire date and time of the signature + * @return if successful + */ +bool GpgME::GpgContext::signKey(const GpgKey &target, const QVector<GpgKey> &keys, const QString &uid, + const QDateTime *expires) { + + setSigners(keys, mCtx); + + unsigned int flags = 0; + + unsigned int expires_time_t = 0; + if (expires == nullptr) flags |= GPGME_KEYSIGN_NOEXPIRE; + else expires_time_t = QDateTime::currentDateTime().secsTo(*expires); + + auto gpgmeError = + gpgme_op_keysign(mCtx, target.key_refer, uid.toUtf8().constData(), expires_time_t, flags); + + if (gpgmeError == GPG_ERR_NO_ERROR) { + emit signalKeyUpdated(target.id); + return true; + } else { + checkErr(gpgmeError); + return false; + } +} + +/** + * Generate revoke cert of a key pair + * @param key target key pair + * @param outputFileName out file name(path) + * @return the process doing this job + */ +void GpgME::GpgContext::generateRevokeCert(const GpgKey &key, const QString &outputFileName) { + executeGpgCommand({ + "--command-fd", + "0", + "--status-fd", + "1", + //"--no-tty", + "-o", + outputFileName, + "--gen-revoke", + key.fpr + }, + [](QProcess *proc) -> void { + qDebug() << "Function Called" << proc; + // Code From Gpg4Win + while (proc->canReadLine()) { + const QString line = QString::fromUtf8(proc->readLine()).trimmed(); + if (line == QLatin1String("[GNUPG:] GET_BOOL gen_revoke.okay")) { + proc->write("y\n"); + } else if (line == QLatin1String( + "[GNUPG:] GET_LINE ask_revocation_reason.code")) { + proc->write("0\n"); + } else if (line == QLatin1String( + "[GNUPG:] GET_LINE ask_revocation_reason.text")) { + proc->write("\n"); + } else if (line == QLatin1String( + "[GNUPG:] GET_BOOL openfile.overwrite.okay")) { + // We asked before + proc->write("y\n"); + } else if (line == QLatin1String( + "[GNUPG:] GET_BOOL ask_revocation_reason.okay")) { + proc->write("y\n"); + } + } + // Code From Gpg4Win + } + ); +} diff --git a/src/gpg/gpg_context/GpgContextSubkeyOpera.cpp b/src/gpg/gpg_context/GpgContextSubkeyOpera.cpp new file mode 100644 index 00000000..10243f5e --- /dev/null +++ b/src/gpg/gpg_context/GpgContextSubkeyOpera.cpp @@ -0,0 +1,61 @@ +/** + * This file is part of GPGFrontend. + * + * GPGFrontend 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 3 of the License, or + * (at your option) any later version. + * + * Foobar 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 Foobar. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from gpg4usb-team. + * Their source code version also complies with GNU General Public License. + * + * The source code version of this software was modified and released + * by Saturneric<[email protected]> starting on May 12, 2021. + * + */ + +#include "gpg/GpgContext.h" + +/** + * Generate a new subkey of a certain key pair + * @param key target key pair + * @param params opera args + * @return error info + */ +gpgme_error_t GpgME::GpgContext::generateSubkey(const GpgKey &key, GenKeyInfo *params) { + + if (!params->isSubKey()) return GPG_ERR_CANCELED; + + auto algo_utf8 = (params->getAlgo() + params->getKeySizeStr()).toUtf8(); + const char *algo = algo_utf8.constData(); + unsigned long expires = QDateTime::currentDateTime().secsTo(params->getExpired()); + unsigned int flags = 0; + + if (!params->isSubKey()) flags |= GPGME_CREATE_CERT; + if (params->isAllowEncryption()) flags |= GPGME_CREATE_ENCR; + if (params->isAllowSigning()) flags |= GPGME_CREATE_SIGN; + if (params->isAllowAuthentication()) flags |= GPGME_CREATE_AUTH; + if (params->isNonExpired()) flags |= GPGME_CREATE_NOEXPIRE; + + flags |= GPGME_CREATE_NOPASSWD; + + + auto gpgmeError = gpgme_op_createsubkey(mCtx, key.key_refer, + algo, 0, expires, flags); + if (gpgme_err_code(gpgmeError) == GPG_ERR_NO_ERROR) { + emit signalKeyUpdated(key.id); + return gpgmeError; + } else { + checkErr(gpgmeError); + return gpgmeError; + } +} + diff --git a/src/gpg/gpg_context/GpgContextUIDOpera.cpp b/src/gpg/gpg_context/GpgContextUIDOpera.cpp new file mode 100644 index 00000000..b96f5f8f --- /dev/null +++ b/src/gpg/gpg_context/GpgContextUIDOpera.cpp @@ -0,0 +1,80 @@ +/** + * This file is part of GPGFrontend. + * + * GPGFrontend 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 3 of the License, or + * (at your option) any later version. + * + * Foobar 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 Foobar. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from gpg4usb-team. + * Their source code version also complies with GNU General Public License. + * + * The source code version of this software was modified and released + * by Saturneric<[email protected]> starting on May 12, 2021. + * + */ + +#include "gpg/GpgContext.h" + +/** + * create a new uid in certain key pair + * @param key target key pair + * @param uid uid args + * @return if successful + */ +bool GpgME::GpgContext::addUID(const GpgKey &key, const GpgUID &uid) { + QString userid = QString("%1 (%3) <%2>").arg(uid.name, uid.email, uid.comment); + auto gpgmeError = gpgme_op_adduid(mCtx, key.key_refer, userid.toUtf8().constData(), 0); + if (gpgmeError == GPG_ERR_NO_ERROR) { + emit signalKeyUpdated(key.id); + return true; + } else { + checkErr(gpgmeError); + return false; + } + +} + +/** + * Revoke(Delete) UID from certain key pair + * @param key target key pair + * @param uid target uid + * @return if successful + */ +bool GpgME::GpgContext::revUID(const GpgKey &key, const GpgUID &uid) { + auto gpgmeError = gpgme_op_revuid(mCtx, key.key_refer, uid.uid.toUtf8().constData(), 0); + if (gpgmeError == GPG_ERR_NO_ERROR) { + emit signalKeyUpdated(key.id); + return true; + } else { + checkErr(gpgmeError); + return false; + } +} + +/** + * Set one of a uid of a key pair as primary + * @param key target key pair + * @param uid target uid + * @return if successful + */ +bool GpgME::GpgContext::setPrimaryUID(const GpgKey &key, const GpgUID &uid) { + auto gpgmeError = gpgme_op_set_uid_flag(mCtx, key.key_refer, + uid.uid.toUtf8().constData(), "primary", nullptr); + if (gpgmeError == GPG_ERR_NO_ERROR) { + emit signalKeyUpdated(key.id); + return true; + } else { + checkErr(gpgmeError); + return false; + } +} + diff --git a/src/gpg/result_analyse/DecryptResultAnalyse.cpp b/src/gpg/result_analyse/DecryptResultAnalyse.cpp index 7eda4027..b4d0b14f 100644 --- a/src/gpg/result_analyse/DecryptResultAnalyse.cpp +++ b/src/gpg/result_analyse/DecryptResultAnalyse.cpp @@ -1,59 +1,86 @@ -// -// Created by eric on 2021/6/9. -// +/** + * This file is part of GPGFrontend. + * + * GPGFrontend 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 3 of the License, or + * (at your option) any later version. + * + * Foobar 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 Foobar. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from gpg4usb-team. + * Their source code version also complies with GNU General Public License. + * + * The source code version of this software was modified and released + * by Saturneric<[email protected]> starting on May 12, 2021. + * + */ #include "gpg/result_analyse/DecryptResultAnalyse.h" DecryptResultAnalyse::DecryptResultAnalyse(GpgME::GpgContext *ctx, gpgme_error_t error, gpgme_decrypt_result_t result) : mCtx(ctx) { - stream << "Decrypt Report: " << Qt::endl << "-----" << Qt::endl; + stream << tr("[#] Decrypt Operation "); if (gpgme_err_code(error) == GPG_ERR_NO_ERROR) { - stream << "Status: Success" << Qt::endl; + stream << tr("[Success]") << Qt::endl; } else { + stream << tr("[Failed] ") << gpgme_strerror(error) << Qt::endl; setStatus(-1); - stream << "Status: " << gpgme_strerror(error) << Qt::endl; - - if (result != nullptr && result->unsupported_algorithm != nullptr) - stream << "Unsupported algo: " << result->unsupported_algorithm << Qt::endl; + if (result != nullptr && result->unsupported_algorithm != nullptr) { + stream << "------------>" << Qt::endl; + stream << tr("Unsupported Algo: ") << result->unsupported_algorithm << Qt::endl; + } } - if(result != nullptr) { - if (result->file_name != nullptr) - stream << "File name: " << result->file_name << Qt::endl; - stream << Qt::endl; + if (result != nullptr && result->recipients != nullptr) { + stream << "------------>" << Qt::endl; + if (result->file_name != nullptr) { + stream << tr("File Name: ") << result->file_name << Qt::endl; + stream << Qt::endl; + } auto reci = result->recipients; if (reci != nullptr) - stream << "Recipient(s): " << Qt::endl; + stream << tr("Recipient(s): ") << Qt::endl; while (reci != nullptr) { printReci(stream, reci); reci = reci->next; } + stream << "<------------" << Qt::endl; } - stream << "-----" << Qt::endl << Qt::endl; + stream << Qt::endl; } bool DecryptResultAnalyse::printReci(QTextStream &stream, gpgme_recipient_t reci) { bool keyFound = true; - stream << QApplication::tr(">Recipient: "); + stream << QApplication::tr(" {>} Recipient: "); - try { - auto key = mCtx->getKeyById(reci->keyid); + auto key = mCtx->getKeyById(reci->keyid); + if(key.good) { stream << key.name; if (!key.email.isEmpty()) { stream << "<" << key.email << ">"; } - } catch(std::runtime_error &ignored) { + } else { stream << "<Unknown>"; setStatus(0); keyFound = false; } + stream << Qt::endl; - stream << "Public algo: " << gpgme_pubkey_algo_name(reci->pubkey_algo) << Qt::endl << Qt::endl; + stream << tr(" Keu ID: ") << reci->keyid << Qt::endl; + stream << tr(" Public Algo: ") << gpgme_pubkey_algo_name(reci->pubkey_algo) << Qt::endl; + return keyFound; } diff --git a/src/gpg/result_analyse/EncryptResultAnalyse.cpp b/src/gpg/result_analyse/EncryptResultAnalyse.cpp index dfcad1ac..1ba685c9 100644 --- a/src/gpg/result_analyse/EncryptResultAnalyse.cpp +++ b/src/gpg/result_analyse/EncryptResultAnalyse.cpp @@ -1,33 +1,58 @@ -// -// Created by eric on 2021/6/9. -// +/** + * This file is part of GPGFrontend. + * + * GPGFrontend 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 3 of the License, or + * (at your option) any later version. + * + * Foobar 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 Foobar. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from gpg4usb-team. + * Their source code version also complies with GNU General Public License. + * + * The source code version of this software was modified and released + * by Saturneric<[email protected]> starting on May 12, 2021. + * + */ #include "gpg/result_analyse/EncryptResultAnalyse.h" EncryptResultAnalyse::EncryptResultAnalyse(gpgme_error_t error, gpgme_encrypt_result_t result) { - stream << "# Encrypt Report: " << Qt::endl << "-----" << Qt::endl; + qDebug() << "Start Encrypt Result Analyse"; - if(gpgme_err_code(error) == GPG_ERR_NO_ERROR) { - stream << "Status: Encrypt Success" << Qt::endl; - } + stream << "[#] Encrypt Operation "; + + if(gpgme_err_code(error) == GPG_ERR_NO_ERROR) + stream << "[Success]" << Qt::endl; else { - stream << "Status:" << gpgme_strerror(error) << Qt::endl; + stream << "[Failed] " << gpgme_strerror(error) << Qt::endl; setStatus(-1); + } + + if(!~status) { + stream << "------------>" << Qt::endl; if (result != nullptr) { - stream << "Invalid Recipients: " << Qt::endl; + stream << tr("Invalid Recipients: ") << Qt::endl; auto inv_reci = result->invalid_recipients; while (inv_reci != nullptr) { - stream << "Fingerprint: " << inv_reci->fpr << Qt::endl; - stream << "Reason: " << gpgme_strerror(inv_reci->reason) << Qt::endl; + stream << tr("Fingerprint: ") << inv_reci->fpr << Qt::endl; + stream << tr("Reason: ") << gpgme_strerror(inv_reci->reason) << Qt::endl; stream << Qt::endl; inv_reci = inv_reci->next; } } + stream << "<------------" << Qt::endl; } - stream << "-----" << Qt::endl; stream << Qt::endl; } diff --git a/src/gpg/result_analyse/ResultAnalyse.cpp b/src/gpg/result_analyse/ResultAnalyse.cpp index 960c24cd..7186d21a 100644 --- a/src/gpg/result_analyse/ResultAnalyse.cpp +++ b/src/gpg/result_analyse/ResultAnalyse.cpp @@ -1,6 +1,26 @@ -// -// Created by eric on 2021/6/8. -// +/** + * This file is part of GPGFrontend. + * + * GPGFrontend 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 3 of the License, or + * (at your option) any later version. + * + * Foobar 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 Foobar. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from gpg4usb-team. + * Their source code version also complies with GNU General Public License. + * + * The source code version of this software was modified and released + * by Saturneric<[email protected]> starting on May 12, 2021. + * + */ #include "gpg/result_analyse/ResultAnalyse.h" diff --git a/src/gpg/result_analyse/SignResultAnalyse.cpp b/src/gpg/result_analyse/SignResultAnalyse.cpp index fac598d5..10d76678 100644 --- a/src/gpg/result_analyse/SignResultAnalyse.cpp +++ b/src/gpg/result_analyse/SignResultAnalyse.cpp @@ -24,58 +24,73 @@ #include "gpg/result_analyse/SignResultAnalyse.h" -SignResultAnalyse::SignResultAnalyse(gpgme_error_t error, gpgme_sign_result_t result) { +SignResultAnalyse::SignResultAnalyse(GpgME::GpgContext *ctx, gpgme_error_t error, gpgme_sign_result_t result) { - stream << "# Sign Report: " << Qt::endl - << "-----" << Qt::endl; - stream << "Status: " << gpgme_strerror(error) << Qt::endl << Qt::endl; + qDebug() << "Start Sign Result Analyse"; - if(gpg_err_code(error) != GPG_ERR_NO_ERROR) { + stream << tr("[#] Sign Operation "); + + if (gpgme_err_code(error) == GPG_ERR_NO_ERROR) + stream << tr("[Success]") << Qt::endl; + else { + stream << tr("[Failed] ") << gpgme_strerror(error) << Qt::endl; setStatus(-1); } - if(result != nullptr) { + if (result != nullptr && (result->signatures != nullptr || result->invalid_signers != nullptr)) { + qDebug() << "Sign Result Analyse Getting Result"; + stream << "------------>" << Qt::endl; auto new_sign = result->signatures; while (new_sign != nullptr) { - stream << "> A New Signature: " << Qt::endl; + stream << tr("[>] New Signature: ") << Qt::endl; + + qDebug() << "Signers Fingerprint: " << new_sign->fpr; - stream << "Sign mode: "; + stream << tr(" Sign Mode: "); if (new_sign->type == GPGME_SIG_MODE_NORMAL) - stream << "Normal"; + stream << tr("Normal"); else if (new_sign->type == GPGME_SIG_MODE_CLEAR) - stream << "Clear"; + stream << tr("Clear"); else if (new_sign->type == GPGME_SIG_MODE_DETACH) - stream << "Detach"; + stream << tr("Detach"); stream << Qt::endl; - stream << "Public key algo: " << gpgme_pubkey_algo_name(new_sign->pubkey_algo) << Qt::endl; - stream << "Hash algo: " << gpgme_hash_algo_name(new_sign->hash_algo) << Qt::endl; - stream << "Date of signature: " << QDateTime::fromTime_t(new_sign->timestamp).toString() << Qt::endl; + GpgKey singerKey = ctx->getKeyByFpr(new_sign->fpr); + if(singerKey.good) { + stream << tr(" Signer: ") << singerKey.uids.first().uid << Qt::endl; + } else { + stream << tr(" Signer: ") << tr("<unknown>") << Qt::endl; + } + stream << tr(" Public Key Algo: ") << gpgme_pubkey_algo_name(new_sign->pubkey_algo) << Qt::endl; + stream << tr(" Hash Algo: ") << gpgme_hash_algo_name(new_sign->hash_algo) << Qt::endl; + stream << tr(" Date & Time: ") << QDateTime::fromTime_t(new_sign->timestamp).toString() << Qt::endl; stream << Qt::endl; new_sign = new_sign->next; } + qDebug() << "Sign Result Analyse Getting Invalid Signer"; + auto invalid_signer = result->invalid_signers; if (invalid_signer != nullptr) - stream << "Invalid Signers: " << Qt::endl; + stream << tr("Invalid Signers: ") << Qt::endl; while (invalid_signer != nullptr) { setStatus(0); - stream << "Fingerprint: " << invalid_signer->fpr << Qt::endl; - stream << "Reason: " << gpgme_strerror(invalid_signer->reason) << Qt::endl; + stream << tr("[>] Signer: ") << Qt::endl; + stream << tr(" Fingerprint: ") << invalid_signer->fpr << Qt::endl; + stream << tr(" Reason: ") << gpgme_strerror(invalid_signer->reason) << Qt::endl; stream << Qt::endl; invalid_signer = invalid_signer->next; } + stream << "<------------" << Qt::endl; } - stream << "-----" << Qt::endl << Qt::endl; - } diff --git a/src/gpg/result_analyse/VerifyResultAnalyse.cpp b/src/gpg/result_analyse/VerifyResultAnalyse.cpp index 59c7e3ef..75e07d33 100644 --- a/src/gpg/result_analyse/VerifyResultAnalyse.cpp +++ b/src/gpg/result_analyse/VerifyResultAnalyse.cpp @@ -1,6 +1,26 @@ -// -// Created by eric on 2021/6/7. -// +/** + * This file is part of GPGFrontend. + * + * GPGFrontend 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 3 of the License, or + * (at your option) any later version. + * + * Foobar 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 Foobar. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from gpg4usb-team. + * Their source code version also complies with GNU General Public License. + * + * The source code version of this software was modified and released + * by Saturneric<[email protected]> starting on May 12, 2021. + * + */ #include "GpgFrontend.h" #include "gpg/result_analyse/VerifyResultAnalyse.h" @@ -8,23 +28,31 @@ VerifyResultAnalyse::VerifyResultAnalyse(GpgME::GpgContext *ctx, gpgme_error_t error, gpgme_verify_result_t result) : mCtx(ctx) { - stream << "# Verify Report: " << Qt::endl << "-----" << Qt::endl; - stream << "Status: " << gpgme_strerror(error) << Qt::endl; + qDebug() << "Verify Result Analyse Started"; - if(result != nullptr) { + stream << tr("[#] Verify Operation "); + if (gpgme_err_code(error) == GPG_ERR_NO_ERROR) + stream << tr("[Success]") << Qt::endl; + else { + stream << tr("[Failed] ") << gpgme_strerror(error) << Qt::endl; + setStatus(-1); + } + + + if (result != nullptr && result->signatures) { + stream << "------------>" << Qt::endl; auto sign = result->signatures; if (sign == nullptr) { - stream << "> Not Signature Found" << Qt::endl; + stream << "[>] Not Signature Found" << Qt::endl; setStatus(0); return; } + stream << "[>] Signed On " << QDateTime::fromTime_t(sign->timestamp).toString() << Qt::endl; - stream << "> It was Signed ON " << QDateTime::fromTime_t(sign->timestamp).toString() << Qt::endl; - - stream << Qt::endl << "> It Contains:" << Qt::endl; + stream << Qt::endl << "[>] Signatures:" << Qt::endl; bool canContinue = true; @@ -63,13 +91,11 @@ VerifyResultAnalyse::VerifyResultAnalyse(GpgME::GpgContext *ctx, gpgme_error_t e if (sign->summary & GPGME_SIGSUM_VALID) { stream << QApplication::tr("Signature Fully Valid.") << Qt::endl; } else { - stream << QApplication::tr("Signature NOT Fully Valid.") << Qt::endl; + stream << QApplication::tr("Signature Not Fully Valid.") << Qt::endl; } if (!(sign->status & GPGME_SIGSUM_KEY_MISSING)) { - if (!printSigner(stream, sign)) { - setStatus(0); - } + if (!printSigner(stream, sign)) setStatus(0); } else { stream << QApplication::tr("Key is NOT present with ID 0x") << QString(sign->fpr) << Qt::endl; } @@ -117,26 +143,26 @@ VerifyResultAnalyse::VerifyResultAnalyse(GpgME::GpgContext *ctx, gpgme_error_t e stream << Qt::endl; sign = sign->next; } + stream << "<------------" << Qt::endl; } - - stream << "-----" << Qt::endl; - stream << Qt::endl; } bool VerifyResultAnalyse::printSigner(QTextStream &stream, gpgme_signature_t sign) { bool keyFound = true; - stream << QApplication::tr("Signed By: "); auto key = mCtx->getKeyByFpr(sign->fpr); - if(!key.good) { - stream << "<Unknown>"; + + key = mCtx->getKeyByFpr(sign->fpr); + + if (!key.good) { + stream << tr(" Signed By: ") << tr("<unknown>") << Qt::endl; setStatus(0); keyFound = false; + } else { + stream << tr(" Signed By: ") << key.uids.first().uid << Qt::endl; } - stream << key.name; - if (!key.email.isEmpty()) { - stream << "<" << key.email << ">"; - } + stream << tr(" Public Key Algo: ") << gpgme_pubkey_algo_name(sign->pubkey_algo) << Qt::endl; + stream << tr(" Hash Algo: ") << gpgme_hash_algo_name(sign->hash_algo) << Qt::endl; + stream << tr(" Date & Time: ") << QDateTime::fromTime_t(sign->timestamp).toString() << Qt::endl; stream << Qt::endl; return keyFound; - }
\ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index ff3b0bb4..1ec264e7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -43,12 +43,14 @@ int main(int argc, char *argv[]) { // unicode in source QTextCodec::setCodecForLocale(QTextCodec::codecForName("utf-8")); - // css +#if OS_PLATFORM == WINDOWS + // load css file QFile file(RESOURCE_DIR(qApp->applicationDirPath()) + "/css/default.qss"); file.open(QFile::ReadOnly); QString styleSheet = QLatin1String(file.readAll()); qApp->setStyleSheet(styleSheet); file.close(); +#endif /** * internationalisation. loop to restart mainwindow diff --git a/src/server/BaseAPI.cpp b/src/server/BaseAPI.cpp new file mode 100644 index 00000000..be388df9 --- /dev/null +++ b/src/server/BaseAPI.cpp @@ -0,0 +1,70 @@ +/** + * This file is part of GPGFrontend. + * + * GPGFrontend 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 3 of the License, or + * (at your option) any later version. + * + * Foobar 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 Foobar. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from gpg4usb-team. + * Their source code version also complies with GNU General Public License. + * + * The source code version of this software was modified and released + * by Saturneric<[email protected]> starting on May 12, 2021. + * + */ + +#include "server/BaseAPI.h" +#include "rapidjson/writer.h" + +BaseAPI::BaseAPI(ComUtils::ServiceType serviceType) : utils(new ComUtils(nullptr)), + reqUrl(utils->getUrl(serviceType)), request(reqUrl) { + request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); +} + +BaseAPI::~BaseAPI() { + utils->deleteLater(); +} + +QNetworkReply *BaseAPI::send_json_data() { + rapidjson::StringBuffer sb; + rapidjson::Writer<rapidjson::StringBuffer> writer(sb); + document.Accept(writer); + + QByteArray postData(sb.GetString()); + qDebug() << "postData" << QString::fromUtf8(postData); + + auto reply = utils->getNetworkManager().post(request, postData); + + while (reply->isRunning()) QApplication::processEvents(); + + QByteArray replyData = reply->readAll().constData(); + if (utils->checkServerReply(replyData)) { + good = true, deal_reply(); + } + + return reply; +} + +void BaseAPI::start() { + construct_json(); + send_json_data()->deleteLater(); +} + +void BaseAPI::refresh() { + document.Clear(); + utils->clear(); + good = false; +} + +bool BaseAPI::result() const { + return good; +} diff --git a/src/server/CMakeLists.txt b/src/server/CMakeLists.txt new file mode 100644 index 00000000..423e9d1e --- /dev/null +++ b/src/server/CMakeLists.txt @@ -0,0 +1,7 @@ +aux_source_directory(./api SERVER_SOURCE) +aux_source_directory(. SERVER_SOURCE) + +add_library(server STATIC ${SERVER_SOURCE}) + +target_link_libraries(server + Qt5::Network Qt5::Widgets Qt5::Core) diff --git a/src/server/ComUtils.cpp b/src/server/ComUtils.cpp new file mode 100644 index 00000000..01be4ea7 --- /dev/null +++ b/src/server/ComUtils.cpp @@ -0,0 +1,197 @@ +/** + * This file is part of GPGFrontend. + * + * GPGFrontend 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 3 of the License, or + * (at your option) any later version. + * + * Foobar 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 Foobar. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from gpg4usb-team. + * Their source code version also complies with GNU General Public License. + * + * The source code version of this software was modified and released + * by Saturneric<[email protected]> starting on May 12, 2021. + * + */ + +#include "server/ComUtils.h" + +/** + * check server reply if it can parse into a json object + * @param reply reply data in byte array + * @return if successful + */ +bool ComUtils::checkServerReply(const QByteArray &reply) { + + if(reply.isEmpty()) { + QMessageBox::critical(this, tr("Error"), tr("Nothing Reply. Please check the Internet connection.")); + return false; + } + + qDebug() << "Reply" << reply; + + /** + * Server Reply Format(Except Timeout) + * { + * "status": 200, + * "msg": "OK", + * "timestamp": 1628652783895 + * "data" : { + * ... + * } + * } + */ + + // check if reply is a json object + if (replyDoc.Parse(reply).HasParseError() || !replyDoc.IsObject()) { + QMessageBox::critical(this, tr("Error"), tr("Unknown Error")); + return false; + } + + // check status(int) and message(string) + if (replyDoc.HasMember("status") && replyDoc.HasMember("msg") && replyDoc.HasMember("timestamp") && + replyDoc.HasMember("data") + && replyDoc["status"].IsNumber() && replyDoc["msg"].IsString() && replyDoc["timestamp"].IsNumber() && + replyDoc["data"].IsObject()) { + + int status = replyDoc["status"].GetInt(); + QDateTime time; + time.setMSecsSinceEpoch(replyDoc["timestamp"].GetInt64()); + auto message = replyDoc["msg"].GetString(); + dataVal = replyDoc["data"].GetObject(); + + qDebug() << "Reply Date & Time" << time; + + // check reply timestamp + if (time < QDateTime::currentDateTime().addSecs(-10)) { + QMessageBox::critical(this, tr("Network Error"), tr("Outdated Reply")); + return false; + } + + // check status code if successful (200-299) + // check data object + if (status / 100 == 2) { + is_good = true; + return true; + } else { + if (dataVal.HasMember("exceptionMessage") && dataVal["exceptionMessage"].IsString()) + QMessageBox::critical(this, message, dataVal["exceptionMessage"].GetString()); + else QMessageBox::critical(this, message, tr("Unknown Reason")); + } + + } else QMessageBox::critical(this, tr("Network Error"), tr("Unknown Reply Format")); + + return false; +} + +/** + * get value in data + * @param key key of value + * @return value in string format + */ +QString ComUtils::getDataValueStr(const QString &key) const { + if (is_good) { + auto k_byte_array = key.toUtf8(); + if (dataVal.HasMember(k_byte_array.data())) { + return dataVal[k_byte_array.data()].GetString(); + } else return {}; + } else return {}; +} + +/** + * Get eventually url by service type + * @param type service which server provides + * @return url + */ +QString ComUtils::getUrl(ComUtils::ServiceType type) const { + auto host = settings.value("general/currentGpgfrontendServer", + "service.gpgfrontend.pub").toString(); + + auto protocol = QString(); + // Localhost Debug Server + if (host == "localhost") protocol = "http://"; + else protocol = "https://"; + + auto url = protocol + host + ":9049/"; + + switch (type) { + case GetServiceToken: + url += "/user"; + break; + case ShortenCryptText: + url += "/text/new"; + break; + case GetFullCryptText: + url += "/text/get"; + break; + case UploadPubkey: + url += "/key/upload"; + break; + case GetPubkey: + url += "/key/get"; + break; + } + + qDebug() << "ComUtils getUrl" << url; + + return url; +} + +bool ComUtils::checkDataValueStr(const QString &key) const { + auto key_byte_array_data = key.toUtf8().constData(); + if (is_good) { + return dataVal.HasMember(key_byte_array_data) && dataVal[key_byte_array_data].IsString(); + } else return false; +} + +bool ComUtils::checkServiceTokenFormat(const QString &uuid) const { + return re_uuid.match(uuid).hasMatch(); +} + +QByteArray ComUtils::getSignStringBase64(GpgME::GpgContext *ctx, const QString &str, const GpgKey &key) { + QVector<GpgKey> keys{key}; + QByteArray outSignText; + auto signData = str.toUtf8(); + + // The use of multi-threading brings an improvement in UI smoothness + gpgme_error_t error; + auto thread = QThread::create([&]() { + error = ctx->sign(keys, signData, &outSignText, GPGME_SIG_MODE_NORMAL, nullptr, false); + }); + thread->start(); + while (thread->isRunning()) QApplication::processEvents(); + thread->deleteLater(); + + return outSignText.toBase64(); +} + +const rapidjson::Value &ComUtils::getDataValue(const QString &key) const { + if (is_good) { + auto k_byte_array = key.toUtf8(); + if (dataVal.HasMember(k_byte_array.data())) { + return dataVal[k_byte_array.data()]; + } + } + throw std::runtime_error("Inner Error"); +} + +bool ComUtils::checkDataValue(const QString &key) const{ + auto key_byte_array_data = key.toUtf8().constData(); + if (is_good) { + return dataVal.HasMember(key_byte_array_data); + } else return false; +} + +void ComUtils::clear() { + this->dataVal.Clear(); + this->replyDoc.Clear(); + is_good = false; +}
\ No newline at end of file diff --git a/src/server/api/PubkeyGetter.cpp b/src/server/api/PubkeyGetter.cpp new file mode 100644 index 00000000..2ba55d11 --- /dev/null +++ b/src/server/api/PubkeyGetter.cpp @@ -0,0 +1,96 @@ +/** + * This file is part of GPGFrontend. + * + * GPGFrontend 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 3 of the License, or + * (at your option) any later version. + * + * Foobar 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 Foobar. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from gpg4usb-team. + * Their source code version also complies with GNU General Public License. + * + * The source code version of this software was modified and released + * by Saturneric<[email protected]> starting on May 12, 2021. + * + */ + +#include "server/api/PubkeyGetter.h" + +PubkeyGetter::PubkeyGetter(GpgME::GpgContext *ctx, const QVector<QString> &fprs) : BaseAPI(ComUtils::GetPubkey), + mCtx(ctx), mFprs(fprs) { +} + +void PubkeyGetter::construct_json() { + document.SetArray(); + QStringList keyIds; + + rapidjson::Document::AllocatorType &allocator = document.GetAllocator(); + + for (const auto &fprStr : mFprs) { + rapidjson::Value fpr; + + auto fprByteArray = fprStr.toUtf8(); + fpr.SetString(fprByteArray.constData(), fprByteArray.count()); + + document.PushBack(fpr, allocator); + keyIds.clear(); + } +} + +void PubkeyGetter::deal_reply() { + + const auto &utils = getUtils(); + + /** + * { + * "pubkeys" : [ + * { + * "publicKey" : ..., + * "fpr" : ..., + * "sha" : ... + * }, + * ... + * ] + * } + */ + + if (!utils.checkDataValue("pubkeys")) { + QMessageBox::critical(nullptr, tr("Error"), + tr("The communication content with the server does not meet the requirements")); + } else { + auto &pubkeys = utils.getDataValue("pubkeys"); + qDebug() << "Pubkey Getter" << pubkeys.IsArray() << pubkeys.GetArray().Size(); + if (pubkeys.IsArray()) { + for (const auto &pubkey : pubkeys.GetArray()) { + if (pubkey.IsObject() + && pubkey.HasMember("publicKey") && pubkey.HasMember("fpr") && pubkey.HasMember("sha") + && pubkey["publicKey"].IsString() && pubkey["fpr"].IsString() && pubkey["sha"].IsString()) { + + auto pubkeyData = QString(pubkey["publicKey"].GetString()); + + QCryptographicHash shaGen(QCryptographicHash::Sha256); + shaGen.addData(pubkeyData.toUtf8()); + + if (shaGen.result().toHex() == pubkey["sha"].GetString()) { + mCtx->importKey(pubkeyData.toUtf8()); + } + + } + } + + } else { + QMessageBox::critical(nullptr, tr("Error"), + tr("The communication content with the server does not meet the requirements")); + } + } +} + + diff --git a/src/server/api/PubkeyUploader.cpp b/src/server/api/PubkeyUploader.cpp new file mode 100644 index 00000000..c6101c65 --- /dev/null +++ b/src/server/api/PubkeyUploader.cpp @@ -0,0 +1,106 @@ +/** + * This file is part of GPGFrontend. + * + * GPGFrontend 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 3 of the License, or + * (at your option) any later version. + * + * Foobar 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 Foobar. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from gpg4usb-team. + * Their source code version also complies with GNU General Public License. + * + * The source code version of this software was modified and released + * by Saturneric<[email protected]> starting on May 12, 2021. + * + */ + +#include "server/api/PubkeyUploader.h" + +PubkeyUploader::PubkeyUploader(GpgME::GpgContext *ctx, const QVector<GpgKey> &keys) : BaseAPI(ComUtils::UploadPubkey), + mCtx(ctx), + mKeys(keys) { +} + +void PubkeyUploader::construct_json() { + document.SetArray(); + QStringList keyIds; + QCryptographicHash shaGen(QCryptographicHash::Sha256); + + auto &allocator = document.GetAllocator(); + + QVector<QByteArray> keysData; + for (const auto &key : mKeys) { + QByteArray keyDataBuf; + keyIds << key.id; + + // The use of multi-threading brings an improvement in UI smoothness + gpgme_error_t error; + auto thread = QThread::create([&]() { + error = mCtx->exportKeys(&keyIds, &keyDataBuf); + }); + thread->start(); + while (thread->isRunning()) QApplication::processEvents(); + thread->deleteLater(); + keysData.push_back(keyDataBuf); + keyIds.clear(); + } + + int index = 0; + for (const auto &keyData : keysData) { + rapidjson::Value publicKeyObj, pubkey, sha, signedFpr; + + shaGen.addData(keyData); + auto shaStr = shaGen.result().toHex(); + shaGen.reset(); + + auto signFprStr = ComUtils::getSignStringBase64(mCtx, mKeys[index].fpr, mKeys[index]); + qDebug() << "signFprStr" << signFprStr; + + pubkey.SetString(keyData.data(), keyData.count(), allocator); + sha.SetString(shaStr.data(), shaStr.count(), allocator); + signedFpr.SetString(signFprStr.data(), signFprStr.count(), allocator); + + publicKeyObj.SetObject(); + publicKeyObj.AddMember("publicKey", pubkey, allocator); + publicKeyObj.AddMember("sha", sha, allocator); + publicKeyObj.AddMember("signedFpr", signedFpr, allocator); + + document.PushBack(publicKeyObj, allocator); + index++; + } +} + +void PubkeyUploader::deal_reply() { + + const auto &utils = getUtils(); + + /** + * { + * "strings" : [ + * "...", + * "..." + * ] + * } + */ + + if (!utils.checkDataValue("strings")) { + QMessageBox::critical(nullptr, tr("Error"), + tr("The communication content with the server does not meet the requirements")); + } else { + auto &strings = utils.getDataValue("strings"); + qDebug() << "Pubkey Uploader" << strings.IsArray() << strings.GetArray().Size(); + if (strings.IsArray() && strings.GetArray().Size() == mKeys.size()) { + good = true; + } else { + good = false; + } + } +} diff --git a/src/ui/CMakeLists.txt b/src/ui/CMakeLists.txt index 618b5d28..b6552227 100644 --- a/src/ui/CMakeLists.txt +++ b/src/ui/CMakeLists.txt @@ -4,6 +4,7 @@ aux_source_directory(./widgets UI_SOURCE) aux_source_directory(./keygen UI_SOURCE) aux_source_directory(./main_window UI_SOURCE) aux_source_directory(./help UI_SOURCE) +aux_source_directory(./settings UI_SOURCE) add_library(gpgfrontend-ui STATIC ${UI_SOURCE}) diff --git a/src/ui/FileEncryptionDialog.cpp b/src/ui/FileEncryptionDialog.cpp index e92dfc90..23ec0b2a 100755 --- a/src/ui/FileEncryptionDialog.cpp +++ b/src/ui/FileEncryptionDialog.cpp @@ -229,7 +229,7 @@ void FileEncryptionDialog::slotExecuteAction() { if (mAction == Sign) { qDebug() << "Action Sign"; - gpgme_error_t err = mCtx->sign(keys, inBuffer, outBuffer, true); + gpgme_error_t err = mCtx->sign(keys, inBuffer, outBuffer, GPGME_SIG_MODE_DETACH, nullptr); if (gpgme_err_code(err) != GPG_ERR_NO_ERROR) { qDebug() << "Error" << gpgme_strerror(err); QMessageBox::warning(this, tr("Error"), diff --git a/src/ui/KeyMgmt.cpp b/src/ui/KeyMgmt.cpp index ce5343bf..77f3b760 100755 --- a/src/ui/KeyMgmt.cpp +++ b/src/ui/KeyMgmt.cpp @@ -26,9 +26,9 @@ #include <utility> -KeyMgmt::KeyMgmt(GpgME::GpgContext *ctx, QWidget *parent ) : - QMainWindow(parent), appPath(qApp->applicationDirPath()), settings(RESOURCE_DIR(appPath) + "/conf/gpgfrontend.ini", QSettings::IniFormat) -{ +KeyMgmt::KeyMgmt(GpgME::GpgContext *ctx, QWidget *parent) : + QMainWindow(parent), appPath(qApp->applicationDirPath()), + settings(RESOURCE_DIR(appPath) + "/conf/gpgfrontend.ini", QSettings::IniFormat) { mCtx = ctx; /* the list of Keys available*/ @@ -36,14 +36,14 @@ KeyMgmt::KeyMgmt(GpgME::GpgContext *ctx, QWidget *parent ) : mKeyList->setColumnWidth(2, 250); mKeyList->setColumnWidth(3, 250); setCentralWidget(mKeyList); - mKeyList->setDoubleClickedAction([this] (const GpgKey &key, QWidget *parent) { + mKeyList->setDoubleClickedAction([this](const GpgKey &key, QWidget *parent) { new KeyDetailsDialog(mCtx, key, parent); }); createActions(); createMenus(); createToolBars(); - connect(this,SIGNAL(signalStatusBarChanged(QString)),this->parent(),SLOT(slotSetStatusBarText(QString))); + connect(this, SIGNAL(signalStatusBarChanged(QString)), this->parent(), SLOT(slotSetStatusBarText(QString))); /* Restore the iconstyle */ this->settings.sync(); @@ -51,7 +51,8 @@ KeyMgmt::KeyMgmt(GpgME::GpgContext *ctx, QWidget *parent ) : QSize iconSize = settings.value("toolbar/iconsize", QSize(24, 24)).toSize(); settings.setValue("toolbar/iconsize", iconSize); - Qt::ToolButtonStyle buttonStyle = static_cast<Qt::ToolButtonStyle>(settings.value("toolbar/iconstyle", Qt::ToolButtonTextUnderIcon).toUInt()); + Qt::ToolButtonStyle buttonStyle = static_cast<Qt::ToolButtonStyle>(settings.value("toolbar/iconstyle", + Qt::ToolButtonTextUnderIcon).toUInt()); this->setIconSize(iconSize); this->setToolButtonStyle(buttonStyle); @@ -83,8 +84,7 @@ KeyMgmt::KeyMgmt(GpgME::GpgContext *ctx, QWidget *parent ) : mKeyList->addMenuAction(showKeyDetailsAct); } -void KeyMgmt::createActions() -{ +void KeyMgmt::createActions() { openKeyFileAct = new QAction(tr("&Open"), this); openKeyFileAct->setShortcut(tr("Ctrl+O")); openKeyFileAct->setToolTip(tr("Open Key File")); @@ -147,8 +147,7 @@ void KeyMgmt::createActions() connect(showKeyDetailsAct, SIGNAL(triggered()), this, SLOT(slotShowKeyDetails())); } -void KeyMgmt::createMenus() -{ +void KeyMgmt::createMenus() { fileMenu = menuBar()->addMenu(tr("&File")); fileMenu->addAction(openKeyFileAct); fileMenu->addAction(closeAct); @@ -168,13 +167,12 @@ void KeyMgmt::createMenus() keyMenu->addAction(deleteCheckedKeysAct); } -void KeyMgmt::createToolBars() -{ +void KeyMgmt::createToolBars() { QToolBar *keyToolBar = addToolBar(tr("Key")); keyToolBar->setObjectName("keytoolbar"); // add button with popup menu for import - auto* generateToolButton = new QToolButton(this); + auto *generateToolButton = new QToolButton(this); generateToolButton->setMenu(generateKeyMenu); generateToolButton->setPopupMode(QToolButton::InstantPopup); generateToolButton->setIcon(QIcon(":key_generate.png")); @@ -184,7 +182,7 @@ void KeyMgmt::createToolBars() keyToolBar->addWidget(generateToolButton); // add button with popup menu for import - auto* toolButton = new QToolButton(this); + auto *toolButton = new QToolButton(this); toolButton->setMenu(importKeyMenu); toolButton->setPopupMode(QToolButton::InstantPopup); toolButton->setIcon(QIcon(":key_import.png")); @@ -201,17 +199,17 @@ void KeyMgmt::createToolBars() } -void KeyMgmt::slotImportKeys(QByteArray inBuffer) -{ +void KeyMgmt::slotImportKeys(QByteArray inBuffer) { GpgImportInformation result = mCtx->importKey(std::move(inBuffer)); new KeyImportDetailDialog(mCtx, result, false, this); } -void KeyMgmt::slotImportKeyFromFile() -{ - QString fileName = QFileDialog::getOpenFileName(this, tr("Open Key"), "", tr("Key Files") + " (*.asc *.txt);;"+tr("Keyring files")+" (*.gpg);;All Files (*)"); - if (! fileName.isNull()) { +void KeyMgmt::slotImportKeyFromFile() { + QString fileName = QFileDialog::getOpenFileName(this, tr("Open Key"), "", + tr("Key Files") + " (*.asc *.txt);;" + tr("Keyring files") + + " (*.gpg);;All Files (*)"); + if (!fileName.isNull()) { QFile file; file.setFileName(fileName); if (!file.open(QIODevice::ReadOnly)) { @@ -224,30 +222,25 @@ void KeyMgmt::slotImportKeyFromFile() } } -void KeyMgmt::slotImportKeyFromKeyServer() -{ +void KeyMgmt::slotImportKeyFromKeyServer() { importDialog = new KeyServerImportDialog(mCtx, mKeyList, false, this); importDialog->show(); } -void KeyMgmt::slotImportKeyFromClipboard() -{ +void KeyMgmt::slotImportKeyFromClipboard() { QClipboard *cb = QApplication::clipboard(); slotImportKeys(cb->text(QClipboard::Clipboard).toUtf8()); } -void KeyMgmt::slotDeleteSelectedKeys() -{ +void KeyMgmt::slotDeleteSelectedKeys() { deleteKeysWithWarning(mKeyList->getSelected()); } -void KeyMgmt::slotDeleteCheckedKeys() -{ +void KeyMgmt::slotDeleteCheckedKeys() { deleteKeysWithWarning(mKeyList->getChecked()); } -void KeyMgmt::deleteKeysWithWarning(QStringList *uidList) -{ +void KeyMgmt::deleteKeysWithWarning(QStringList *uidList) { /** * TODO: Different Messages for private/public key, check if * more than one selected... compare to seahorse "delete-dialog" @@ -258,7 +251,8 @@ void KeyMgmt::deleteKeysWithWarning(QStringList *uidList) } QString keynames; for (const auto &uid : *uidList) { - auto &key = mCtx->getKeyById(uid); + auto key = mCtx->getKeyById(uid); + if (!key.good) continue; keynames.append(key.name); keynames.append("<i> <"); keynames.append(key.email); @@ -266,8 +260,9 @@ void KeyMgmt::deleteKeysWithWarning(QStringList *uidList) } int ret = QMessageBox::warning(this, tr("Deleting Keys"), - "<b>"+tr("Are you sure that you want to delete the following keys?")+"</b><br/><br/>"+keynames+ - +"<br/>"+tr("The action can not be undone."), + "<b>" + tr("Are you sure that you want to delete the following keys?") + + "</b><br/><br/>" + keynames + + +"<br/>" + tr("The action can not be undone."), QMessageBox::No | QMessageBox::Yes); if (ret == QMessageBox::Yes) { @@ -275,28 +270,36 @@ void KeyMgmt::deleteKeysWithWarning(QStringList *uidList) } } -void KeyMgmt::slotShowKeyDetails() -{ +void KeyMgmt::slotShowKeyDetails() { if (mKeyList->getSelected()->isEmpty()) { return; } - auto &key = mCtx->getKeyById(mKeyList->getSelected()->first()); + auto key = mCtx->getKeyById(mKeyList->getSelected()->first()); + + if (!key.good) { + QMessageBox::critical(nullptr, tr("Error"), tr("Key Not Found.")); + return; + } new KeyDetailsDialog(mCtx, key); } -void KeyMgmt::slotExportKeyToFile() -{ +void KeyMgmt::slotExportKeyToFile() { auto *keyArray = new QByteArray(); if (!mCtx->exportKeys(mKeyList->getChecked(), keyArray)) { delete keyArray; return; } - auto &key = mCtx->getKeyById(mKeyList->getSelected()->first()); - QString fileString = key.name + " " + key.email+ "(" + key.id+ ")_pub.asc"; + auto key = mCtx->getKeyById(mKeyList->getSelected()->first()); + if (!key.good) { + QMessageBox::critical(nullptr, tr("Error"), tr("Key Not Found.")); + return; + } + QString fileString = key.name + " " + key.email + "(" + key.id + ")_pub.asc"; - QString fileName = QFileDialog::getSaveFileName(this, tr("Export Key To File"), fileString, tr("Key Files") + " (*.asc *.txt);;All Files (*)"); + QString fileName = QFileDialog::getSaveFileName(this, tr("Export Key To File"), fileString, + tr("Key Files") + " (*.asc *.txt);;All Files (*)"); QFile file(fileName); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { delete keyArray; @@ -309,8 +312,7 @@ void KeyMgmt::slotExportKeyToFile() emit signalStatusBarChanged(QString(tr("key(s) exported"))); } -void KeyMgmt::slotExportKeyToClipboard() -{ +void KeyMgmt::slotExportKeyToClipboard() { auto *keyArray = new QByteArray(); QClipboard *cb = QApplication::clipboard(); if (!mCtx->exportKeys(mKeyList->getChecked(), keyArray)) { @@ -320,27 +322,29 @@ void KeyMgmt::slotExportKeyToClipboard() delete keyArray; } -void KeyMgmt::slotGenerateKeyDialog() -{ - auto *keyGenDialog = new KeyGenDialog(mCtx,this); +void KeyMgmt::slotGenerateKeyDialog() { + auto *keyGenDialog = new KeyGenDialog(mCtx, this); keyGenDialog->show(); } -void KeyMgmt::closeEvent(QCloseEvent *event) -{ +void KeyMgmt::closeEvent(QCloseEvent *event) { QMainWindow::closeEvent(event); } void KeyMgmt::slotGenerateSubKey() { auto selectedList = mKeyList->getSelected(); - if(selectedList->empty()) { + if (selectedList->empty()) { QMessageBox::information(nullptr, tr("Invalid Operation"), tr("Please select one KeyPair before doing this operation.")); return; } - const auto &key = mCtx->getKeyById(selectedList->first()); - if(!key.is_private_key) { + const auto key = mCtx->getKeyById(selectedList->first()); + if (!key.good) { + QMessageBox::critical(nullptr, tr("Error"), tr("Key Not Found.")); + return; + } + if (!key.is_private_key) { QMessageBox::critical(nullptr, tr("Invalid Operation"), tr("If a key pair does not have a private key then it will not be able to generate sub-keys.")); diff --git a/src/ui/KeyUploadDialog.cpp b/src/ui/KeyUploadDialog.cpp index faf892f0..ab38569f 100644 --- a/src/ui/KeyUploadDialog.cpp +++ b/src/ui/KeyUploadDialog.cpp @@ -24,8 +24,6 @@ #include "ui/KeyUploadDialog.h" -#include <utility> - KeyUploadDialog::KeyUploadDialog(GpgME::GpgContext *ctx, const QVector<GpgKey> &keys, QWidget *parent) : appPath(qApp->applicationDirPath()), settings(RESOURCE_DIR(appPath) + "/conf/gpgfrontend.ini", QSettings::IniFormat), diff --git a/src/ui/SettingsDialog.cpp b/src/ui/SettingsDialog.cpp deleted file mode 100755 index 1732d718..00000000 --- a/src/ui/SettingsDialog.cpp +++ /dev/null @@ -1,777 +0,0 @@ -/** - * This file is part of GPGFrontend. - * - * GPGFrontend 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 3 of the License, or - * (at your option) any later version. - * - * Foobar 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 Foobar. If not, see <https://www.gnu.org/licenses/>. - * - * The initial version of the source code is inherited from gpg4usb-team. - * Their source code version also complies with GNU General Public License. - * - * The source code version of this software was modified and released - * by Saturneric<[email protected]> starting on May 12, 2021. - * - */ - -#include "ui/SettingsDialog.h" -#include "smtp/SmtpMime" -#include "ui/WaitingDialog.h" - -SettingsDialog::SettingsDialog(GpgME::GpgContext *ctx, QWidget *parent) - : QDialog(parent) { - mCtx = ctx; - tabWidget = new QTabWidget; - generalTab = new GeneralTab(mCtx); - appearanceTab = new AppearanceTab; - sendMailTab = new SendMailTab; - keyserverTab = new KeyserverTab; - advancedTab = new AdvancedTab; - gpgPathsTab = new GpgPathsTab; - - tabWidget->addTab(generalTab, tr("General")); - tabWidget->addTab(appearanceTab, tr("Appearance")); - tabWidget->addTab(sendMailTab, tr("Send Mail")); - tabWidget->addTab(keyserverTab, tr("Key Server")); - // tabWidget->addTab(gpgPathsTab, tr("Gpg paths")); - tabWidget->addTab(advancedTab, tr("Advanced")); - - buttonBox = - new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); - - connect(buttonBox, SIGNAL(accepted()), this, SLOT(slotAccept())); - connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); - - auto *mainLayout = new QVBoxLayout; - mainLayout->addWidget(tabWidget); - mainLayout->addWidget(buttonBox); - setLayout(mainLayout); - - setWindowTitle(tr("Settings")); - - // slots for handling the restartneeded member - this->slotSetRestartNeeded(false); - connect(generalTab, SIGNAL(signalRestartNeeded(bool)), this, - SLOT(slotSetRestartNeeded(bool))); - connect(appearanceTab, SIGNAL(signalRestartNeeded(bool)), this, - SLOT(slotSetRestartNeeded(bool))); - connect(sendMailTab, SIGNAL(signalRestartNeeded(bool)), this, - SLOT(slotSetRestartNeeded(bool))); - connect(keyserverTab, SIGNAL(signalRestartNeeded(bool)), this, - SLOT(slotSetRestartNeeded(bool))); - connect(advancedTab, SIGNAL(signalRestartNeeded(bool)), this, - SLOT(slotSetRestartNeeded(bool))); - - connect(this, SIGNAL(signalRestartNeeded(bool)), parent, - SLOT(slotSetRestartNeeded(bool))); - - this->show(); -} - -bool SettingsDialog::getRestartNeeded() const { return this->restartNeeded; } - -void SettingsDialog::slotSetRestartNeeded(bool needed) { - this->restartNeeded = needed; -} - -void SettingsDialog::slotAccept() { - generalTab->applySettings(); - sendMailTab->applySettings(); - appearanceTab->applySettings(); - keyserverTab->applySettings(); - advancedTab->applySettings(); - gpgPathsTab->applySettings(); - if (getRestartNeeded()) { - emit signalRestartNeeded(true); - } - close(); -} - -// http://www.informit.com/articles/article.aspx?p=1405555&seqNum=3 -// http://developer.qt.nokia.com/wiki/How_to_create_a_multi_language_application -QHash<QString, QString> SettingsDialog::listLanguages() { - QHash<QString, QString> languages; - - languages.insert("", tr("System Default")); - - QString appPath = qApp->applicationDirPath(); - QDir qmDir = QDir(RESOURCE_DIR(appPath) + "/ts/"); - QStringList fileNames = qmDir.entryList(QStringList("gpgfrontend_*.qm")); - - for (int i = 0; i < fileNames.size(); ++i) { - QString locale = fileNames[i]; - locale.truncate(locale.lastIndexOf('.')); - locale.remove(0, locale.indexOf('_') + 1); - - // this works in qt 4.8 - QLocale qloc(locale); -#if QT_VERSION < 0x040800 - QString language = - QLocale::languageToString(qloc.language()) + " (" + locale + - ")"; //+ " (" + QLocale::languageToString(qloc.language()) + ")"; -#else - QString language = qloc.nativeLanguageName() + " (" + locale + ")"; -#endif - languages.insert(locale, language); - } - return languages; -} - -GeneralTab::GeneralTab(GpgME::GpgContext *ctx, QWidget *parent) - : QWidget(parent), appPath(qApp->applicationDirPath()), - settings(RESOURCE_DIR(appPath) + "/conf/gpgfrontend.ini", - QSettings::IniFormat) { - mCtx = ctx; - - /***************************************** - * remember Password-Box - *****************************************/ - auto *rememberPasswordBox = new QGroupBox(tr("Remember Password")); - auto *rememberPasswordBoxLayout = new QHBoxLayout(); - rememberPasswordCheckBox = - new QCheckBox(tr("Remember password until closing gpg4usb"), this); - rememberPasswordBoxLayout->addWidget(rememberPasswordCheckBox); - rememberPasswordBox->setLayout(rememberPasswordBoxLayout); - - /***************************************** - * Save-Checked-Keys-Box - *****************************************/ - auto *saveCheckedKeysBox = new QGroupBox(tr("Save Checked Keys")); - auto *saveCheckedKeysBoxLayout = new QHBoxLayout(); - saveCheckedKeysCheckBox = new QCheckBox( - tr("Save checked private keys on exit and restore them on next start."), - this); - saveCheckedKeysBoxLayout->addWidget(saveCheckedKeysCheckBox); - saveCheckedKeysBox->setLayout(saveCheckedKeysBoxLayout); - - /***************************************** - * Key-Impport-Confirmation Box - *****************************************/ - auto *importConfirmationBox = - new QGroupBox(tr("Confirm drag'n'drop key import")); - auto *importConfirmationBoxLayout = new QHBoxLayout(); - importConfirmationCheckBox = new QCheckBox( - tr("Import files dropped on the keylist without confirmation."), this); - importConfirmationBoxLayout->addWidget(importConfirmationCheckBox); - importConfirmationBox->setLayout(importConfirmationBoxLayout); - - /***************************************** - * Language Select Box - *****************************************/ - auto *langBox = new QGroupBox(tr("Language")); - auto *langBoxLayout = new QVBoxLayout(); - langSelectBox = new QComboBox; - lang = SettingsDialog::listLanguages(); - - foreach (QString l, lang) { langSelectBox->addItem(l); } - - langBoxLayout->addWidget(langSelectBox); - langBoxLayout->addWidget( - new QLabel(tr("<b>NOTE: </b> GpgFrontend will restart automatically if " - "you change the language!"))); - langBox->setLayout(langBoxLayout); - connect(langSelectBox, SIGNAL(currentIndexChanged(int)), this, - SLOT(slotLanguageChanged())); - - /***************************************** - * Own Key Select Box - *****************************************/ - auto *ownKeyBox = new QGroupBox(tr("Own key")); - auto *ownKeyBoxLayout = new QVBoxLayout(); - ownKeySelectBox = new QComboBox; - - ownKeyBox->setLayout(ownKeyBoxLayout); - mKeyList = new KeyList(mCtx); - - // Fill the keyid hashmap - keyIds.insert("", tr("<none>")); - - for (const auto &keyid : *mKeyList->getAllPrivateKeys()) { - auto &key = mCtx->getKeyById(keyid); - keyIds.insert(key.id, key.uids.first().uid); - } - for (const auto &k : keyIds.keys()) { - ownKeySelectBox->addItem(keyIds.find(k).value()); - keyIdsList.append(k); - } - connect(ownKeySelectBox, SIGNAL(currentIndexChanged(int)), this, - SLOT(slotOwnKeyIdChanged())); - - ownKeyBoxLayout->addWidget(new QLabel( - tr("Key pair for synchronization and identity authentication"))); - ownKeyBoxLayout->addWidget(ownKeySelectBox); - - /***************************************** - * Mainlayout - *****************************************/ - auto *mainLayout = new QVBoxLayout; - mainLayout->addWidget(rememberPasswordBox); - mainLayout->addWidget(saveCheckedKeysBox); - mainLayout->addWidget(importConfirmationBox); - mainLayout->addWidget(langBox); - mainLayout->addWidget(ownKeyBox); - - setSettings(); - mainLayout->addStretch(1); - setLayout(mainLayout); -} - -/********************************** - * Read the settings from config - * and set the buttons and checkboxes - * appropriately - **********************************/ -void GeneralTab::setSettings() { - // Keysaving - if (settings.value("keys/saveKeyChecked").toBool()) { - saveCheckedKeysCheckBox->setCheckState(Qt::Checked); - } - - // Language setting - QString langKey = settings.value("int/lang").toString(); - QString langValue = lang.value(langKey); - if (langKey != "") { - langSelectBox->setCurrentIndex(langSelectBox->findText(langValue)); - } - - QString ownKeyId = settings.value("general/ownKeyId").toString(); - qDebug() << "OwnKeyId" << ownKeyId; - if (ownKeyId.isEmpty()) { - ownKeySelectBox->setCurrentText("<none>"); - } else { - const auto text = keyIds.find(ownKeyId).value(); - qDebug() << "OwnKey" << ownKeyId << text; - ownKeySelectBox->setCurrentText(text); - } - - // Get own key information from keydb/gpg.conf (if contained) - if (settings.value("general/confirmImportKeys", Qt::Checked).toBool()) { - importConfirmationCheckBox->setCheckState(Qt::Checked); - } -} - -/*********************************** - * get the values of the buttons and - * write them to settings-file - *************************************/ -void GeneralTab::applySettings() { - settings.setValue("keys/saveKeyChecked", - saveCheckedKeysCheckBox->isChecked()); - // TODO: clear passwordCache instantly on unset rememberPassword - settings.setValue("general/rememberPassword", - rememberPasswordCheckBox->isChecked()); - settings.setValue("int/lang", lang.key(langSelectBox->currentText())); - settings.setValue("general/ownKeyId", - keyIdsList[ownKeySelectBox->currentIndex()]); - settings.setValue("general/confirmImportKeys", - importConfirmationCheckBox->isChecked()); -} - -void GeneralTab::slotLanguageChanged() { emit signalRestartNeeded(true); } - -void GeneralTab::slotOwnKeyIdChanged() { - // Set ownKeyId to currently selected -} - -SendMailTab::SendMailTab(QWidget *parent) - : QWidget(parent), appPath(qApp->applicationDirPath()), - settings(RESOURCE_DIR(appPath) + "/conf/gpgfrontend.ini", - QSettings::IniFormat) { - - enableCheckBox = new QCheckBox(tr("Enable")); - enableCheckBox->setTristate(false); - - smtpAddress = new QLineEdit(); - username = new QLineEdit(); - password = new QLineEdit(); - password->setEchoMode(QLineEdit::Password); - - portSpin = new QSpinBox(); - portSpin->setMinimum(1); - portSpin->setMaximum(65535); - connectionTypeComboBox = new QComboBox(); - connectionTypeComboBox->addItem("None"); - connectionTypeComboBox->addItem("SSL"); - connectionTypeComboBox->addItem("TLS"); - connectionTypeComboBox->addItem("STARTTLS"); - - defaultSender = new QLineEdit();; - checkConnectionButton = new QPushButton("Check Connection"); - - auto layout = new QGridLayout(); - layout->addWidget(enableCheckBox, 0, 0); - layout->addWidget(new QLabel(tr("SMTP Address")), 1, 0); - layout->addWidget(smtpAddress, 1, 1, 1, 4); - layout->addWidget(new QLabel(tr("Username")), 2, 0); - layout->addWidget(username, 2, 1, 1, 4); - layout->addWidget(new QLabel(tr("Password")), 3, 0); - layout->addWidget(password, 3, 1, 1, 4); - layout->addWidget(new QLabel(tr("Port")), 4, 0); - layout->addWidget(portSpin, 4, 1, 1, 1); - layout->addWidget(new QLabel(tr("Connection Security")), 5, 0); - layout->addWidget(connectionTypeComboBox, 5, 1, 1, 1); - - layout->addWidget(new QLabel(tr("Default Sender")), 6, 0); - layout->addWidget(defaultSender, 6, 1, 1, 4); - layout->addWidget(checkConnectionButton, 7, 0); - - connect(enableCheckBox, SIGNAL(stateChanged(int)), this, SLOT(slotCheckBoxSetEnableDisable(int))); - connect(checkConnectionButton, SIGNAL(clicked(bool)), this, SLOT(slotCheckConnection())); - - - this->setLayout(layout); - setSettings(); -} - -/********************************** - * Read the settings from config - * and set the buttons and checkboxes - * appropriately - **********************************/ -void SendMailTab::setSettings() { - - if (settings.value("sendMail/enable", false).toBool()) - enableCheckBox->setCheckState(Qt::Checked); - else { - enableCheckBox->setCheckState(Qt::Unchecked); - smtpAddress->setDisabled(true); - username->setDisabled(true); - password->setDisabled(true); - portSpin->setDisabled(true); - connectionTypeComboBox->setDisabled(true); - defaultSender->setDisabled(true); - checkConnectionButton->setDisabled(true); - } - - smtpAddress->setText(settings.value("sendMail/smtpAddress", QString()).toString()); - username->setText(settings.value("sendMail/username", QString()).toString()); - password->setText(settings.value("sendMail/password", QString()).toString()); - portSpin->setValue(settings.value("sendMail/port", 25).toInt()); - connectionTypeComboBox->setCurrentText(settings.value("sendMail/connectionType", "None").toString()); - defaultSender->setText(settings.value("sendMail/defaultSender", QString()).toString()); - -} - -/*********************************** - * get the values of the buttons and - * write them to settings-file - *************************************/ -void SendMailTab::applySettings() { - - settings.setValue("sendMail/smtpAddress", smtpAddress->text()); - settings.setValue("sendMail/username", username->text()); - settings.setValue("sendMail/password", password->text()); - settings.setValue("sendMail/port", portSpin->value()); - settings.setValue("sendMail/connectionType", connectionTypeComboBox->currentText()); - settings.setValue("sendMail/defaultSender", defaultSender->text()); - - settings.setValue("sendMail/enable", enableCheckBox->isChecked()); -} - -void SendMailTab::slotCheckConnection() { - - SmtpClient::ConnectionType connectionType = SmtpClient::ConnectionType::TcpConnection; - - if (connectionTypeComboBox->currentText() == "SSL") { - connectionType = SmtpClient::ConnectionType::SslConnection; - } else if (connectionTypeComboBox->currentText() == "TLS") { - connectionType = SmtpClient::ConnectionType::TlsConnection; - } else if (connectionTypeComboBox->currentText() == "STARTTLS") { - connectionType = SmtpClient::ConnectionType::TlsConnection; - } else { - connectionType = SmtpClient::ConnectionType::TcpConnection; - } - - SmtpClient smtp(smtpAddress->text(), portSpin->value(), connectionType); - - // We need to set the username (your email address) and the password - // for smtp authentification. - - smtp.setUser(username->text()); - smtp.setPassword(password->text()); - - bool if_success = true; - - if (!smtp.connectToHost()) { - QMessageBox::critical(this, tr("Fail"), tr("Fail to Connect SMTP Server")); - if_success = false; - } - if (if_success && !smtp.login()) { - QMessageBox::critical(this, tr("Fail"), tr("Fail to Login")); - if_success = false; - } - - if (if_success) - QMessageBox::information(this, tr("Success"), tr("Succeed in connecting and login")); - -} - -void SendMailTab::slotCheckBoxSetEnableDisable(int state) { - if (state == Qt::Checked) { - smtpAddress->setEnabled(true); - username->setEnabled(true); - password->setEnabled(true); - portSpin->setEnabled(true); - connectionTypeComboBox->setEnabled(true); - defaultSender->setEnabled(true); - checkConnectionButton->setEnabled(true); - } else { - smtpAddress->setDisabled(true); - username->setDisabled(true); - password->setDisabled(true); - portSpin->setDisabled(true); - connectionTypeComboBox->setDisabled(true); - defaultSender->setDisabled(true); - checkConnectionButton->setDisabled(true); - } -} - -AppearanceTab::AppearanceTab(QWidget *parent) - : QWidget(parent), appPath(qApp->applicationDirPath()), - settings(RESOURCE_DIR(appPath) + "/conf/gpgfrontend.ini", - QSettings::IniFormat) { - /***************************************** - * Icon-Size-Box - *****************************************/ - auto *iconSizeBox = new QGroupBox(tr("Iconsize")); - iconSizeGroup = new QButtonGroup(); - iconSizeSmall = new QRadioButton(tr("small")); - iconSizeMedium = new QRadioButton(tr("medium")); - iconSizeLarge = new QRadioButton(tr("large")); - - iconSizeGroup->addButton(iconSizeSmall, 1); - iconSizeGroup->addButton(iconSizeMedium, 2); - iconSizeGroup->addButton(iconSizeLarge, 3); - - auto *iconSizeBoxLayout = new QHBoxLayout(); - iconSizeBoxLayout->addWidget(iconSizeSmall); - iconSizeBoxLayout->addWidget(iconSizeMedium); - iconSizeBoxLayout->addWidget(iconSizeLarge); - - iconSizeBox->setLayout(iconSizeBoxLayout); - - /***************************************** - * Icon-Style-Box - *****************************************/ - auto *iconStyleBox = new QGroupBox(tr("Iconstyle")); - iconStyleGroup = new QButtonGroup(); - iconTextButton = new QRadioButton(tr("just text")); - iconIconsButton = new QRadioButton(tr("just icons")); - iconAllButton = new QRadioButton(tr("text and icons")); - - iconStyleGroup->addButton(iconTextButton, 1); - iconStyleGroup->addButton(iconIconsButton, 2); - iconStyleGroup->addButton(iconAllButton, 3); - - auto *iconStyleBoxLayout = new QHBoxLayout(); - iconStyleBoxLayout->addWidget(iconTextButton); - iconStyleBoxLayout->addWidget(iconIconsButton); - iconStyleBoxLayout->addWidget(iconAllButton); - - iconStyleBox->setLayout(iconStyleBoxLayout); - - /***************************************** - * Window-Size-Box - *****************************************/ - auto *windowSizeBox = new QGroupBox(tr("Windowstate")); - auto *windowSizeBoxLayout = new QHBoxLayout(); - windowSizeCheckBox = - new QCheckBox(tr("Save window size and position on exit."), this); - windowSizeBoxLayout->addWidget(windowSizeCheckBox); - windowSizeBox->setLayout(windowSizeBoxLayout); - - /***************************************** - * Info-Board-Font-Size-Box - *****************************************/ - - auto *infoBoardBox = new QGroupBox(tr("Information Board")); - auto *infoBoardLayout = new QHBoxLayout(); - infoBoardFontSizeSpin = new QSpinBox(); - infoBoardFontSizeSpin->setRange(9, 18); - infoBoardFontSizeSpin->setValue(10); - infoBoardFontSizeSpin->setSingleStep(1); - infoBoardLayout->addWidget(new QLabel(tr(" Front Size"))); - infoBoardLayout->addWidget(infoBoardFontSizeSpin); - infoBoardBox->setLayout(infoBoardLayout); - - auto *mainLayout = new QVBoxLayout; - mainLayout->addWidget(iconSizeBox); - mainLayout->addWidget(iconStyleBox); - mainLayout->addWidget(windowSizeBox); - mainLayout->addWidget(infoBoardBox); - mainLayout->addStretch(1); - setSettings(); - setLayout(mainLayout); -} - -/********************************** - * Read the settings from config - * and set the buttons and checkboxes - * appropriately - **********************************/ -void AppearanceTab::setSettings() { - - // Iconsize - QSize iconSize = settings.value("toolbar/iconsize", QSize(24, 24)).toSize(); - switch (iconSize.height()) { - case 12: - iconSizeSmall->setChecked(true); - break; - case 24: - iconSizeMedium->setChecked(true); - break; - case 32: - iconSizeLarge->setChecked(true); - break; - } - // Iconstyle - Qt::ToolButtonStyle iconStyle = static_cast<Qt::ToolButtonStyle>( - settings.value("toolbar/iconstyle", Qt::ToolButtonTextUnderIcon) - .toUInt()); - switch (iconStyle) { - case Qt::ToolButtonTextOnly: - iconTextButton->setChecked(true); - break; - case Qt::ToolButtonIconOnly: - iconIconsButton->setChecked(true); - break; - case Qt::ToolButtonTextUnderIcon: - iconAllButton->setChecked(true); - break; - default: - break; - } - - // Window Save and Position - if (settings.value("window/windowSave").toBool()) - windowSizeCheckBox->setCheckState(Qt::Checked); - - // infoBoardFontSize - auto infoBoardFontSize = settings.value("informationBoard/fontSize", 10).toInt(); - if (infoBoardFontSize < 9 || infoBoardFontSize > 18) - infoBoardFontSize = 10; - infoBoardFontSizeSpin->setValue(infoBoardFontSize); -} - -/*********************************** - * get the values of the buttons and - * write them to settings-file - *************************************/ -void AppearanceTab::applySettings() { - switch (iconSizeGroup->checkedId()) { - case 1: - settings.setValue("toolbar/iconsize", QSize(12, 12)); - break; - case 2: - settings.setValue("toolbar/iconsize", QSize(24, 24)); - break; - case 3: - settings.setValue("toolbar/iconsize", QSize(32, 32)); - break; - } - - switch (iconStyleGroup->checkedId()) { - case 1: - settings.setValue("toolbar/iconstyle", Qt::ToolButtonTextOnly); - break; - case 2: - settings.setValue("toolbar/iconstyle", Qt::ToolButtonIconOnly); - break; - case 3: - settings.setValue("toolbar/iconstyle", Qt::ToolButtonTextUnderIcon); - break; - } - - settings.setValue("window/windowSave", windowSizeCheckBox->isChecked()); - - settings.setValue("informationBoard/fontSize", infoBoardFontSizeSpin->value()); -} - -KeyserverTab::KeyserverTab(QWidget *parent) - : QWidget(parent), appPath(qApp->applicationDirPath()), - settings(RESOURCE_DIR(appPath) + "/conf/gpgfrontend.ini", - QSettings::IniFormat) { - - auto keyServerList = settings.value("keyserver/keyServerList").toStringList(); - - auto *mainLayout = new QVBoxLayout(this); - - auto *label = new QLabel(tr("Default Key Server for import:")); - comboBox = new QComboBox; - comboBox->setEditable(false); - comboBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); - - for (const auto &keyServer : keyServerList) { - comboBox->addItem(keyServer); - qDebug() << "KeyserverTab Get ListItemText" << keyServer; - } - - comboBox->setCurrentText( - settings.value("keyserver/defaultKeyServer").toString()); - - auto *addKeyServerBox = new QWidget(this); - auto *addKeyServerLayout = new QHBoxLayout(addKeyServerBox); - auto *http = new QLabel("URL: "); - newKeyServerEdit = new QLineEdit(this); - auto *newKeyServerButton = new QPushButton(tr("Add"), this); - connect(newKeyServerButton, SIGNAL(clicked()), this, SLOT(addKeyServer())); - addKeyServerLayout->addWidget(http); - addKeyServerLayout->addWidget(newKeyServerEdit); - addKeyServerLayout->addWidget(newKeyServerButton); - - mainLayout->addWidget(label); - mainLayout->addWidget(comboBox); - mainLayout->addWidget(addKeyServerBox); - mainLayout->addStretch(1); - - // Read keylist from ini-file and fill it into combobox - setSettings(); -} - -/********************************** - * Read the settings from config - * and set the buttons and checkboxes - * appropriately - **********************************/ -void KeyserverTab::setSettings() { - auto *keyServerList = new QStringList(); - for (int i = 0; i < comboBox->count(); i++) { - keyServerList->append(comboBox->itemText(i)); - qDebug() << "KeyserverTab ListItemText" << comboBox->itemText(i); - } - settings.setValue("keyserver/keyServerList", *keyServerList); - settings.setValue("keyserver/defaultKeyServer", comboBox->currentText()); -} - -void KeyserverTab::addKeyServer() { - if (newKeyServerEdit->text().startsWith("http://") || - newKeyServerEdit->text().startsWith("https://")) { - comboBox->addItem(newKeyServerEdit->text()); - } else { - comboBox->addItem("http://" + newKeyServerEdit->text()); - } - comboBox->setCurrentIndex(comboBox->count() - 1); -} - -/*********************************** - * get the values of the buttons and - * write them to settings-file - *************************************/ -void KeyserverTab::applySettings() { - settings.setValue("keyserver/defaultKeyServer", comboBox->currentText()); -} - -AdvancedTab::AdvancedTab(QWidget *parent) - : QWidget(parent), appPath(qApp->applicationDirPath()), - settings(RESOURCE_DIR(appPath) + "/conf/gpgfrontend.ini", - QSettings::IniFormat) { - /***************************************** - * Steganography Box - *****************************************/ - auto *steganoBox = new QGroupBox(tr("Show Steganography Options [Advanced]")); - auto *steganoBoxLayout = new QHBoxLayout(); - steganoCheckBox = new QCheckBox(tr("Show Steganographic Options."), this); - steganoBoxLayout->addWidget(steganoCheckBox); - steganoBox->setLayout(steganoBoxLayout); - - auto *mainLayout = new QVBoxLayout; - mainLayout->addWidget(steganoBox); - setSettings(); - mainLayout->addStretch(1); - setLayout(mainLayout); -} - -void AdvancedTab::setSettings() { - if (settings.value("advanced/steganography").toBool()) { - steganoCheckBox->setCheckState(Qt::Checked); - } -} - -void AdvancedTab::applySettings() { - settings.setValue("advanced/steganography", steganoCheckBox->isChecked()); -} - -GpgPathsTab::GpgPathsTab(QWidget *parent) - : QWidget(parent), appPath(qApp->applicationDirPath()), - settings(RESOURCE_DIR(appPath) + "/conf/gpgfrontend.ini", - QSettings::IniFormat) { - setSettings(); - - /***************************************** - * Keydb Box - *****************************************/ - auto *keydbBox = new QGroupBox(tr("Relative path to keydb")); - auto *keydbBoxLayout = new QGridLayout(); - - // Label containing the current keydbpath relative to default keydb path - keydbLabel = new QLabel(accKeydbPath, this); - - auto *keydbButton = new QPushButton("Change keydb path", this); - connect(keydbButton, SIGNAL(clicked()), this, SLOT(chooseKeydbDir())); - auto *keydbDefaultButton = new QPushButton("Set keydb to default path", this); - connect(keydbDefaultButton, SIGNAL(clicked()), this, - SLOT(setKeydbPathToDefault())); - - keydbBox->setLayout(keydbBoxLayout); - keydbBoxLayout->addWidget(new QLabel(tr("Current keydb path: ")), 1, 1); - keydbBoxLayout->addWidget(keydbLabel, 1, 2); - keydbBoxLayout->addWidget(keydbButton, 1, 3); - keydbBoxLayout->addWidget(keydbDefaultButton, 2, 3); - keydbBoxLayout->addWidget( - new QLabel(tr("<b>NOTE: </b> Gpg4usb will restart automatically if you " - "change the keydb path!")), - 3, 1, 1, 3); - - auto *mainLayout = new QVBoxLayout; - mainLayout->addWidget(keydbBox); - mainLayout->addStretch(1); - setLayout(mainLayout); -} - -QString GpgPathsTab::getRelativePath(const QString &dir1, const QString &dir2) { - QDir dir(dir1); - QString s; - - s = dir.relativeFilePath(dir2); - qDebug() << "relative path: " << s; - if (s.isEmpty()) { - s = "."; - } - return s; -} - -void GpgPathsTab::setKeydbPathToDefault() { - accKeydbPath = "."; - keydbLabel->setText("."); -} - -QString GpgPathsTab::chooseKeydbDir() { - QString dir = QFileDialog::getExistingDirectory( - this, tr("Choose keydb directory"), accKeydbPath, - QFileDialog::ShowDirsOnly); - - accKeydbPath = getRelativePath(defKeydbPath, dir); - keydbLabel->setText(accKeydbPath); - return ""; -} - -void GpgPathsTab::setSettings() { - defKeydbPath = qApp->applicationDirPath() + "/keydb"; - - accKeydbPath = settings.value("gpgpaths/keydbpath").toString(); - if (accKeydbPath.isEmpty()) { - accKeydbPath = "."; - } -} - -void GpgPathsTab::applySettings() { - settings.setValue("gpgpaths/keydbpath", accKeydbPath); -} diff --git a/src/ui/ShowCopyDialog.cpp b/src/ui/ShowCopyDialog.cpp new file mode 100644 index 00000000..3286f6c4 --- /dev/null +++ b/src/ui/ShowCopyDialog.cpp @@ -0,0 +1,53 @@ +/** + * This file is part of GPGFrontend. + * + * GPGFrontend 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 3 of the License, or + * (at your option) any later version. + * + * Foobar 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 Foobar. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from gpg4usb-team. + * Their source code version also complies with GNU General Public License. + * + * The source code version of this software was modified and released + * by Saturneric<[email protected]> starting on May 12, 2021. + * + */ + +#include "ui/ShowCopyDialog.h" + +ShowCopyDialog::ShowCopyDialog(const QString &text, const QString &info, QWidget *parent) : QDialog(parent) { + textEdit = new QTextEdit(); + textEdit->setReadOnly(true); + textEdit->setLineWrapMode(QTextEdit::WidgetWidth); + textEdit->setText(text); + copyButton = new QPushButton("Copy"); + connect(copyButton, SIGNAL(clicked(bool)), this, SLOT(slotCopyText())); + + infoLabel = new QLabel(); + infoLabel->setText(info); + infoLabel->setWordWrap(true); + + auto *layout = new QVBoxLayout(); + layout->addWidget(textEdit); + layout->addWidget(copyButton); + layout->addWidget(infoLabel); + + this->setWindowTitle("Short Ciphertext"); + this->resize(320, 120); + this->setModal(true); + this->setLayout(layout); +} + +void ShowCopyDialog::slotCopyText() { + QClipboard *cb = QApplication::clipboard(); + cb->setText(textEdit->toPlainText()); +} diff --git a/src/ui/Wizard.cpp b/src/ui/Wizard.cpp index b0486cc9..8b482675 100644 --- a/src/ui/Wizard.cpp +++ b/src/ui/Wizard.cpp @@ -24,10 +24,6 @@ #include "ui/Wizard.h" -#ifdef Q_OS_WIN -#include "windows.h" -#endif - Wizard::Wizard(GpgME::GpgContext *ctx, KeyMgmt *keyMgmt, QWidget *parent) : QWizard(parent), appPath(qApp->applicationDirPath()), settings(RESOURCE_DIR(appPath) + "/conf/gpgfrontend.ini", QSettings::IniFormat) { @@ -36,8 +32,6 @@ Wizard::Wizard(GpgME::GpgContext *ctx, KeyMgmt *keyMgmt, QWidget *parent) setPage(Page_Intro, new IntroPage(this)); setPage(Page_Choose, new ChoosePage(this)); - setPage(Page_ImportFromGpg4usb, new ImportFromGpg4usbPage(mCtx, mKeyMgmt, this)); - setPage(Page_ImportFromGnupg, new ImportFromGnupgPage(mCtx, mKeyMgmt, this)); setPage(Page_GenKey, new KeyGenPage(mCtx, this)); setPage(Page_Conclusion, new ConclusionPage(this)); #ifndef Q_WS_MAC @@ -54,7 +48,6 @@ Wizard::Wizard(GpgME::GpgContext *ctx, KeyMgmt *keyMgmt, QWidget *parent) settings.remove("wizard/nextPage"); connect(this, SIGNAL(accepted()), this, SLOT(slotWizardAccepted())); - // connect(this, SIGNAL(signalOpenHelp(QString)), parentWidget(), SLOT(signalOpenHelp(QString))); } @@ -67,57 +60,20 @@ void Wizard::slotWizardAccepted() { } } -bool Wizard::importPubAndSecKeysFromDir(const QString &dir, KeyMgmt *keyMgmt) { - QFile secRingFile(dir + "/secring.gpg"); - QFile pubRingFile(dir + "/pubring.gpg"); - - // Return, if no keyrings are found in subdir of chosen dir - if (!(pubRingFile.exists() or secRingFile.exists())) { - QMessageBox::critical(0, tr("Import Error"), tr("Couldn't locate any keyring file in %1").arg(dir)); - return false; - } - - QByteArray inBuffer; - if (secRingFile.exists()) { - // write content of secringfile to inBuffer - if (!secRingFile.open(QIODevice::ReadOnly)) { - QMessageBox::critical(nullptr, tr("Import error"), - tr("Couldn't open private keyringfile: %1").arg(secRingFile.fileName())); - return false; - } - inBuffer = secRingFile.readAll(); - secRingFile.close(); - } - - if (pubRingFile.exists()) { - // try to import public keys - if (!pubRingFile.open(QIODevice::ReadOnly)) { - QMessageBox::critical(nullptr, tr("Import error"), - tr("Couldn't open public keyringfile: %1").arg(pubRingFile.fileName())); - return false; - } - inBuffer.append(pubRingFile.readAll()); - pubRingFile.close(); - } - keyMgmt->slotImportKeys(inBuffer); - inBuffer.clear(); - - return true; -} - IntroPage::IntroPage(QWidget *parent) : QWizardPage(parent), appPath(qApp->applicationDirPath()), settings(RESOURCE_DIR(appPath) + "/conf/gpgfrontend.ini", QSettings::IniFormat) { setTitle(tr("Getting Started...")); setSubTitle(tr("... with GPGFrontend")); - auto *topLabel = new QLabel(tr("Welcome to use GPGFrontend for decrypting and signing text or file!")+ - " <br><br><a href='https://github.com/saturneric/GpgFrontend'>GpgFrontend</a> " + - tr("is a Powerful, Easy-to-Use, Compact, Cross-Platform, and Installation-Free OpenPGP Crypto Tool.") + - tr("For brief information have a look at the") + "<a href='https://saturneric.github.io/GpgFrontend/index.html#/overview'>"+ - tr("Overview") +"</a> (" + - tr("by clicking the link, the page will open in the web browser") + - "). <br>"); + auto *topLabel = new QLabel(tr("Welcome to use GPGFrontend for decrypting and signing text or file!") + + " <br><br><a href='https://gpgfrontend.pub'>GpgFrontend</a> " + + tr("is a Powerful, Easy-to-Use, Compact, Cross-Platform, and Installation-Free OpenPGP Crypto Tool.") + + tr("For brief information have a look at the") + + " <a href='https://gpgfrontend.pub/index.html#/overview'>" + + tr("Overview") + "</a> (" + + tr("by clicking the link, the page will open in the web browser") + + "). <br>"); topLabel->setTextFormat(Qt::RichText); topLabel->setTextInteractionFlags(Qt::TextBrowserInteraction); topLabel->setOpenExternalLinks(true); @@ -130,7 +86,7 @@ IntroPage::IntroPage(QWidget *parent) languages = SettingsDialog::listLanguages(); auto *langSelectBox = new QComboBox(); - for(const auto &l : languages) { + for (const auto &l : languages) { langSelectBox->addItem(l); } // selected entry from config @@ -166,19 +122,21 @@ ChoosePage::ChoosePage(QWidget *parent) setSubTitle(tr("...by clicking on the appropriate link.")); auto *keygenLabel = new QLabel(tr("If you have never used GPGFrontend before and also don't own a gpg key yet you " - "may possibly want to read how to") + " <a href=\"https://saturneric.github.io/GpgFrontend/index.html#/manual/generate-key\">" + "may possibly want to read how to") + + " <a href=\"https://gpgfrontend.pub/index.html#/manual/generate-key\">" + tr("Generate Key") + "</a><hr>"); keygenLabel->setTextFormat(Qt::RichText); keygenLabel->setTextInteractionFlags(Qt::TextBrowserInteraction); keygenLabel->setOpenExternalLinks(true); keygenLabel->setWordWrap(true); - auto *encrDecyTextLabel = new QLabel(tr("If you want to learn how to encrypt, decrypt, sign and verify text, you can read ") - + "<a href=\"https://saturneric.github.io/GpgFrontend/index.html#/manual/encrypt-decrypt-text\">" - + tr("Encrypt & Decrypt Text") + "</a> " + tr("or") - + " <a href=\"https://saturneric.github.io/GpgFrontend/index.html#/manual/sign-verify-text\">" - + tr("Sign & Verify Text") - +"</a><hr>"); + auto *encrDecyTextLabel = new QLabel( + tr("If you want to learn how to encrypt, decrypt, sign and verify text, you can read ") + + "<a href=\"https://gpgfrontend.pub/index.html#/manual/encrypt-decrypt-text\">" + + tr("Encrypt & Decrypt Text") + "</a> " + tr("or") + + " <a href=\"https://gpgfrontend.pub/index.html#/manual/sign-verify-text\">" + + tr("Sign & Verify Text") + + "</a><hr>"); encrDecyTextLabel->setTextFormat(Qt::RichText); encrDecyTextLabel->setTextInteractionFlags(Qt::TextBrowserInteraction); @@ -186,11 +144,13 @@ ChoosePage::ChoosePage(QWidget *parent) encrDecyTextLabel->setWordWrap(true); auto *signVerifyTextLabel = new QLabel(tr("If you want to operate file, you can read ") - + "<a href=\"https://saturneric.github.io/GpgFrontend/index.html#/manual/encrypt-decrypt-file\">" - + tr("Encrypt & Sign File") + "</a> " + tr("or") - + " <a href=\"https://saturneric.github.io/GpgFrontend/index.html#/manual/sign-verify-file\">" - + tr("Sign & Verify File") - +"</a><hr>"); + + + "<a href=\"https://gpgfrontend.pub/index.html#/manual/encrypt-decrypt-file\">" + + tr("Encrypt & Sign File") + "</a> " + tr("or") + + + " <a href=\"https://gpgfrontend.pub/index.html#/manual/sign-verify-file\">" + + tr("Sign & Verify File") + + "</a><hr>"); signVerifyTextLabel->setTextFormat(Qt::RichText); signVerifyTextLabel->setTextInteractionFlags(Qt::TextBrowserInteraction); signVerifyTextLabel->setOpenExternalLinks(true); @@ -217,149 +177,6 @@ void ChoosePage::slotJumpPage(const QString &page) { wizard()->next(); } -ImportFromGpg4usbPage::ImportFromGpg4usbPage(GpgME::GpgContext *ctx, KeyMgmt *keyMgmt, QWidget *parent) - : QWizardPage(parent), appPath(qApp->applicationDirPath()), - settings(RESOURCE_DIR(appPath) + "/conf/gpgfrontend.ini", QSettings::IniFormat) { - mCtx = ctx; - mKeyMgmt = keyMgmt; - setTitle(tr("Import from...")); - setSubTitle(tr("...existing GPGFrontend")); - - auto *topLabel = new QLabel(tr("You can import keys and/or settings from existing GPGFrontend. <br><br>" - "Just check what you want to import, click the import button and choose " - "the directory of your other GPGFrontend in the appearing file dialog."), this); - topLabel->setWordWrap(true); - - gpg4usbKeyCheckBox = new QCheckBox(); - gpg4usbKeyCheckBox->setChecked(true); - auto *keyLabel = new QLabel(tr("Keys")); - - gpg4usbConfigCheckBox = new QCheckBox(); - gpg4usbConfigCheckBox->setChecked(true); - auto *configLabel = new QLabel(tr("Configuration")); - - auto *importFromGpg4usbButton = new QPushButton(tr("Import from GPGFrontend")); - connect(importFromGpg4usbButton, SIGNAL(clicked()), this, SLOT(slotImportFromOlderGpg4usb())); - - auto *gpg4usbLayout = new QGridLayout(); - gpg4usbLayout->addWidget(topLabel, 1, 1, 1, 2); - gpg4usbLayout->addWidget(gpg4usbKeyCheckBox, 2, 1, Qt::AlignRight); - gpg4usbLayout->addWidget(keyLabel, 2, 2); - gpg4usbLayout->addWidget(gpg4usbConfigCheckBox, 3, 1, Qt::AlignRight); - gpg4usbLayout->addWidget(configLabel, 3, 2); - gpg4usbLayout->addWidget(importFromGpg4usbButton, 4, 2); - - this->setLayout(gpg4usbLayout); -} - -void ImportFromGpg4usbPage::slotImportFromOlderGpg4usb() { - QString dir = QFileDialog::getExistingDirectory(this, tr("Other GPGFrontend directory")); - - // Return, if cancel was hit - if (dir.isEmpty()) { - return; - } - - // try to import keys, if appropriate box is checked, return, if import was unsuccessful - if (gpg4usbKeyCheckBox->isChecked()) { - if (!Wizard::importPubAndSecKeysFromDir(dir + "/keydb", mKeyMgmt)) { - return; - } - } - - // try to import config, if appropriate box is checked - if (gpg4usbConfigCheckBox->isChecked()) { - slotImportConfFromGpg4usb(dir); - - settings.setValue("wizard/nextPage", this->nextId()); - QMessageBox::information(nullptr, tr("Configuration Imported"), - tr("Imported Configuration from old GPGFrontend.<br>" - "Will now restart to activate the configuration.")); - // TODO: edit->maybesave? - qApp->exit(RESTART_CODE); - } - wizard()->next(); -} - -bool ImportFromGpg4usbPage::slotImportConfFromGpg4usb(const QString &dir) { - QString path = dir + "/conf/gpgfrontend.ini"; - QSettings oldconf(path, QSettings::IniFormat, this); - QSettings actualConf; - foreach(QString key, oldconf.allKeys()) { - actualConf.setValue(key, oldconf.value(key)); - } - return true; -} - -int ImportFromGpg4usbPage::nextId() const { - return Wizard::Page_Conclusion; -} - -ImportFromGnupgPage::ImportFromGnupgPage(GpgME::GpgContext *ctx, KeyMgmt *keyMgmt, QWidget *parent) - : QWizardPage(parent) { - mCtx = ctx; - mKeyMgmt = keyMgmt; - setTitle(tr("Import keys...")); - setSubTitle(tr("...from existing GnuPG installation")); - - auto *gnupgLabel = new QLabel(tr("You can import keys from a locally installed GnuPG.<br><br> The location is read " - "from registry in Windows or assumed to be the .gnupg folder in the your home directory in Linux.<br>")); - gnupgLabel->setWordWrap(true); - - importFromGnupgButton = new QPushButton(tr("Import keys from GnuPG")); - connect(importFromGnupgButton, SIGNAL(clicked()), this, SLOT(slotrImportKeysFromGnupg())); - - auto *layout = new QGridLayout(); - layout->addWidget(gnupgLabel); - layout->addWidget(importFromGnupgButton); - - this->setLayout(layout); -} - -void ImportFromGnupgPage::slotrImportKeysFromGnupg() { - // first get gnupghomedir and check, if it exists - QString gnuPGHome = getGnuPGHome(); - if (gnuPGHome == nullptr) { - QMessageBox::critical(0, tr("Import Error"), tr("Couldn't locate GnuPG home directory")); - return; - } - - // Try to import the keyring files and return the return value of the method - Wizard::importPubAndSecKeysFromDir(gnuPGHome, mKeyMgmt); - wizard()->next(); -} - -QString ImportFromGnupgPage::getGnuPGHome() { - QString gnuPGHome = ""; -#ifdef _WIN32 - bool existsAndSuccess = false; - - HKEY hKey; - - existsAndSuccess = (RegOpenKeyExW(HKEY_CURRENT_USER, L"Software\\GNU\\GNUPG", 0, KEY_READ, &hKey) == ERROR_SUCCESS); - - if (existsAndSuccess) { - QSettings gnuPGsettings("HKEY_CURRENT_USER\\Software\\GNU\\GNUPG", QSettings::NativeFormat); - if (gnuPGsettings.contains("HomeDir")) { - gnuPGHome = gnuPGsettings.value("HomeDir").toString(); - } else { - return NULL; - } - } -#else - gnuPGHome = QDir::homePath() + "/.gnupg"; - if (!QFile(gnuPGHome).exists()) { - return nullptr; - } -#endif - - return gnuPGHome; -} - -int ImportFromGnupgPage::nextId() const { - return Wizard::Page_Conclusion; -} - KeyGenPage::KeyGenPage(GpgME::GpgContext *ctx, QWidget *parent) : QWizardPage(parent) { mCtx = ctx; @@ -407,10 +224,11 @@ ConclusionPage::ConclusionPage(QWidget *parent) setTitle(tr("Ready.")); setSubTitle(tr("Have fun with GPGFrontend!")); - auto *bottomLabel = new QLabel(tr("You are ready to use GPGFrontend now.<br><br>")+ - "<a href=\"https://saturneric.github.io/GpgFrontend/index.html#/overview\">" - + tr("The Online Document") + "</a>" - + tr(" will get you started with GPGFrontend. It will open in the main window.<br>")); + auto *bottomLabel = new QLabel(tr("You are ready to use GPGFrontend now.<br><br>") + + "<a href=\"https://saturneric.github.io/GpgFrontend/index.html#/overview\">" + + tr("The Online Document") + "</a>" + + + tr(" will get you started with GPGFrontend. It will open in the main window.<br>")); bottomLabel->setTextFormat(Qt::RichText); bottomLabel->setTextInteractionFlags(Qt::TextBrowserInteraction); diff --git a/src/ui/help/AboutDialog.cpp b/src/ui/help/AboutDialog.cpp index 807c509d..8fb504db 100644 --- a/src/ui/help/AboutDialog.cpp +++ b/src/ui/help/AboutDialog.cpp @@ -37,7 +37,7 @@ AboutDialog::AboutDialog(int defaultIndex, QWidget *parent) auto *tabWidget = new QTabWidget; auto *infoTab = new InfoTab(); auto *translatorsTab = new TranslatorsTab(); - auto *updateTab = new UpdateTab(); + updateTab = new UpdateTab(); tabWidget->addTab(infoTab, tr("General")); tabWidget->addTab(translatorsTab, tr("Translators")); @@ -45,9 +45,6 @@ AboutDialog::AboutDialog(int defaultIndex, QWidget *parent) connect(tabWidget, &QTabWidget::currentChanged, this, [&](int index) { qDebug() << "Current Index" << index; - if(index == 2) { - updateTab->getLatestVersion(); - } }); if(defaultIndex < tabWidget->count() && defaultIndex >= 0) { @@ -62,7 +59,14 @@ AboutDialog::AboutDialog(int defaultIndex, QWidget *parent) mainLayout->addWidget(buttonBox); setLayout(mainLayout); - this->exec(); + this->resize(320, 580); + + this->show(); +} + +void AboutDialog::showEvent(QShowEvent *ev) { + QDialog::showEvent(ev); + updateTab->getLatestVersion(); } InfoTab::InfoTab(QWidget *parent) @@ -157,6 +161,8 @@ UpdateTab::UpdateTab(QWidget *parent) { layout->addItem(new QSpacerItem(20, 10, QSizePolicy::Minimum, QSizePolicy::Fixed), 2, 1, 1, 1); + connect(this, SIGNAL(replyFromUpdateServer(QByteArray)), this, SLOT(processReplyDataFromUpdateServer(QByteArray))); + setLayout(layout); } @@ -172,44 +178,42 @@ void UpdateTab::getLatestVersion() { QNetworkRequest request; request.setUrl(QUrl(baseUrl)); - QNetworkReply *replay = manager->get(request); + auto thread = QThread::create([replay, this]() { + while(replay->isRunning()) QApplication::processEvents(); + emit replyFromUpdateServer(replay->readAll()); + }); + connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); + thread->start(); - while(replay->isRunning()) { - QApplication::processEvents(); - } +} + +void UpdateTab::processReplyDataFromUpdateServer(const QByteArray& data) { - this->pb->setHidden(true); + qDebug() << "Try to Process Reply Data From Update Server"; - if(replay->error() != QNetworkReply::NoError) { + this->pb->setHidden(true); + + Document d; + if (d.Parse(data.constData()).HasParseError() || !d.IsObject()) { qDebug() << "VersionCheckThread Found Network Error"; auto latestVersion = "Unknown"; latestVersionLabel->setText("<center><b>" + tr("Latest Version From Github: ") + latestVersion + "</b></center>"); return; } - QByteArray bytes = replay->readAll(); - - Document d; - d.Parse(bytes.constData()); - QString latestVersion = d["tag_name"].GetString(); qDebug() << "Latest Version From Github" << latestVersion; - QRegularExpression re("^[vV](\\d+\\.)?(\\d+\\.)?(\\*|\\d+)"); + QRegularExpression re(R"(^[vV](\d+\.)?(\d+\.)?(\*|\d+))"); QRegularExpressionMatch match = re.match(latestVersion); if (match.hasMatch()) { - latestVersion = match.captured(0); // matched == "23 def" + latestVersion = match.captured(0); qDebug() << "Latest Version Matched" << latestVersion; - } else { - latestVersion = "Unknown"; - } + } else latestVersion = "Unknown"; latestVersionLabel->setText("<center><b>" + tr("Latest Version From Github: ") + latestVersion + "</b></center>"); - if(latestVersion > currentVersion) { - upgradeLabel->setHidden(false); - } - + if(latestVersion > currentVersion) upgradeLabel->setHidden(false); } diff --git a/src/ui/help/VersionCheckThread.cpp b/src/ui/help/VersionCheckThread.cpp index c7c77d1c..bf1bbeda 100644 --- a/src/ui/help/VersionCheckThread.cpp +++ b/src/ui/help/VersionCheckThread.cpp @@ -1,6 +1,26 @@ -// -// Created by Administrator on 2021/7/12. -// +/** + * This file is part of GPGFrontend. + * + * GPGFrontend 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 3 of the License, or + * (at your option) any later version. + * + * Foobar 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 Foobar. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from gpg4usb-team. + * Their source code version also complies with GNU General Public License. + * + * The source code version of this software was modified and released + * by Saturneric<[email protected]> starting on May 12, 2021. + * + */ #include "ui/help/VersionCheckThread.h" #include "GpgFrontendBuildInfo.h" diff --git a/src/ui/keygen/KeygenDialog.cpp b/src/ui/keygen/KeygenDialog.cpp index 7991ddd1..98216dc6 100644 --- a/src/ui/keygen/KeygenDialog.cpp +++ b/src/ui/keygen/KeygenDialog.cpp @@ -23,6 +23,7 @@ */ #include "ui/keygen/KeygenDialog.h" +#include "ui/WaitingDialog.h" KeyGenDialog::KeyGenDialog(GpgME::GpgContext *ctx, QWidget *parent) : QDialog(parent), mCtx(ctx) { @@ -92,34 +93,28 @@ void KeyGenDialog::slotKeyGenAccept() { genKeyInfo.setExpired(dateEdit->dateTime()); } - kg = new KeyGenThread(&genKeyInfo, mCtx); - connect(kg, SIGNAL(signalKeyGenerated(bool)), this, SLOT(slotKeyGenResult(bool))); - kg->start(); - - this->accept(); - - auto *dialog = new QDialog(this, Qt::CustomizeWindowHint | Qt::WindowTitleHint); - dialog->setModal(true); - dialog->setWindowTitle(tr("Generating Key...")); - - auto *waitMessage = new QLabel( - tr("Collecting random data for key generation.\n This may take a while.\n To speed up the process use your computer\n (e.g. browse the net, listen to music,...)")); - auto *pb = new QProgressBar(); - pb->setRange(0, 0); - - auto *layout = new QVBoxLayout(dialog); - layout->addWidget(waitMessage); - layout->addWidget(pb); - dialog->setLayout(layout); + gpgme_error_t error = false; + auto thread = QThread::create([&]() { + error = mCtx->generateKey(&genKeyInfo); + }); + thread->start(); + auto *dialog = new WaitingDialog("Generating", this); dialog->show(); - while (kg->isRunning()) { + while (thread->isRunning()) { QCoreApplication::processEvents(); } dialog->close(); + if(gpgme_err_code(error) == GPG_ERR_NO_ERROR) { + QMessageBox::information(this, tr("Success"), tr("The new key pair has been generated.")); + this->close(); + } + else + QMessageBox::critical(this, tr("Failure"), tr(gpgme_strerror(error))); + } else { /** * create error message @@ -307,13 +302,6 @@ bool KeyGenDialog::check_email_address(const QString &str) { return re_email.match(str).hasMatch(); } -void KeyGenDialog::slotKeyGenResult(bool success) { - if(success) - QMessageBox::information(nullptr, tr("Success"), tr("The new key pair has been generated.")); - else - QMessageBox::critical(nullptr, tr("Failure"), tr("An error occurred during key generation.")); -} - QGroupBox *KeyGenDialog::create_basic_info_group_box() { errorLabel = new QLabel(tr("")); diff --git a/src/ui/keygen/SubkeyGenerateDialog.cpp b/src/ui/keygen/SubkeyGenerateDialog.cpp index c545381f..3d709d81 100644 --- a/src/ui/keygen/SubkeyGenerateDialog.cpp +++ b/src/ui/keygen/SubkeyGenerateDialog.cpp @@ -23,6 +23,7 @@ */ #include "ui/keygen/SubkeyGenerateDialog.h" +#include "ui/WaitingDialog.h" SubkeyGenerateDialog::SubkeyGenerateDialog(GpgME::GpgContext *ctx, const GpgKey &key, QWidget *parent) : genKeyInfo(true), mCtx(ctx), mKey(key), QDialog(parent) { @@ -224,34 +225,27 @@ void SubkeyGenerateDialog::slotKeyGenAccept() { genKeyInfo.setExpired(dateEdit->dateTime()); } - kg = new SubkeyGenerateThread(mKey ,&genKeyInfo, mCtx); - connect(kg, SIGNAL(signalKeyGenerated(bool)), this, SLOT(slotKeyGenResult(bool))); - kg->start(); - - this->accept(); - - auto *dialog = new QDialog(this, Qt::CustomizeWindowHint | Qt::WindowTitleHint); - dialog->setModal(true); - dialog->setWindowTitle(tr("Generating Subkey...")); - - auto *waitMessage = new QLabel( - tr("Collecting random data for subkey generation.\n This may take a while.\n To speed up the process use your computer\n (e.g. browse the net, listen to music,...)")); - auto *pb = new QProgressBar(); - pb->setRange(0, 0); - - auto *layout = new QVBoxLayout(dialog); - layout->addWidget(waitMessage); - layout->addWidget(pb); - dialog->setLayout(layout); + gpgme_error_t error = false; + auto thread = QThread::create([&]() { + error = mCtx->generateSubkey(mKey, &genKeyInfo); + }); + thread->start(); + auto *dialog = new WaitingDialog("Generating", this); dialog->show(); - while (!kg->isFinished() && kg->isRunning()) { + while (thread->isRunning()) { QCoreApplication::processEvents(); } dialog->close(); + if (gpgme_err_code(error) == GPG_ERR_NO_ERROR) { + QMessageBox::information(nullptr, tr("Success"), tr("The new subkey has been generated.")); + this->close(); + } else + QMessageBox::critical(this, tr("Failure"), tr(gpgme_strerror(error))); + } else { /** * create error message @@ -303,10 +297,3 @@ void SubkeyGenerateDialog::slotActivatedKeyType(int index) { genKeyInfo.setAlgo(this->keyTypeComboBox->itemText(index)); refresh_widgets_state(); } - -void SubkeyGenerateDialog::slotKeyGenResult(bool success) { - if(success) - QMessageBox::information(nullptr, tr("Success"), tr("The new subkey has been generated.")); - else - QMessageBox::critical(nullptr, tr("Failure"), tr("An error occurred during subkey generation.")); -} diff --git a/src/ui/keypair_details/EditSubKeyDialog.cpp b/src/ui/keypair_details/EditSubKeyDialog.cpp index 5e26a098..e44c987f 100644 --- a/src/ui/keypair_details/EditSubKeyDialog.cpp +++ b/src/ui/keypair_details/EditSubKeyDialog.cpp @@ -1,5 +1,25 @@ -// -// Created by eric on 2021/6/2. -// +/** + * This file is part of GPGFrontend. + * + * GPGFrontend 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 3 of the License, or + * (at your option) any later version. + * + * Foobar 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 Foobar. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from gpg4usb-team. + * Their source code version also complies with GNU General Public License. + * + * The source code version of this software was modified and released + * by Saturneric<[email protected]> starting on May 12, 2021. + * + */ #include "ui/keypair_details/EditSubKeyDialog.h" diff --git a/src/ui/keypair_details/KeyPairDetailTab.cpp b/src/ui/keypair_details/KeyPairDetailTab.cpp index 9ca4e37e..c0a2df99 100644 --- a/src/ui/keypair_details/KeyPairDetailTab.cpp +++ b/src/ui/keypair_details/KeyPairDetailTab.cpp @@ -147,7 +147,6 @@ KeyPairDetailTab::KeyPairDetailTab(GpgME::GpgContext *ctx, const GpgKey &mKey, Q keyServerOperaButton->setStyleSheet("text-align:center;"); auto *revokeCertGenButton = new QPushButton(tr("Generate Revoke Certificate")); - revokeCertGenButton->setDisabled(true); connect(revokeCertGenButton, SIGNAL(clicked()), this, SLOT(slotGenRevokeCert())); hBoxLayout->addWidget(keyServerOperaButton); @@ -215,7 +214,11 @@ void KeyPairDetailTab::slotExportPrivateKey() { return; } - auto &key = mCtx->getKeyById(*keyid); + auto key = mCtx->getKeyById(*keyid); + if (!key.good) { + QMessageBox::critical(nullptr, tr("Error"), tr("Key Not Found.")); + return; + } QString fileString = key.name + " " + key.email + "(" + key.id + ")_secret.asc"; QString fileName = QFileDialog::getSaveFileName(this, tr("Export Key To File"), fileString, @@ -342,15 +345,8 @@ void KeyPairDetailTab::slotGenRevokeCert() { QStringLiteral("%1 (*.rev)").arg( tr("Revocation Certificates"))); - auto process = mCtx->generateRevokeCert(mKey, mOutputFileName); - - auto *dialog = new WaitingDialog("Generating", this); - - while (process->state() == QProcess::Running) { - QApplication::processEvents(); - } - - dialog->close(); + if (!mOutputFileName.isEmpty()) + mCtx->generateRevokeCert(mKey, mOutputFileName); } diff --git a/src/ui/keypair_details/KeyPairSubkeyTab.cpp b/src/ui/keypair_details/KeyPairSubkeyTab.cpp index 74b52284..6a924394 100644 --- a/src/ui/keypair_details/KeyPairSubkeyTab.cpp +++ b/src/ui/keypair_details/KeyPairSubkeyTab.cpp @@ -132,9 +132,8 @@ void KeyPairSubkeyTab::slotRefreshSubkeyList() { this->buffered_subkeys.clear(); for(const auto &subkeys : mKey.subKeys) { - if(subkeys.disabled || subkeys.revoked) { + if(subkeys.disabled || subkeys.revoked) continue; - } this->buffered_subkeys.push_back(&subkeys); } diff --git a/src/ui/keypair_details/KeyUIDSignDialog.cpp b/src/ui/keypair_details/KeyUIDSignDialog.cpp index f112ea25..9232cfce 100644 --- a/src/ui/keypair_details/KeyUIDSignDialog.cpp +++ b/src/ui/keypair_details/KeyUIDSignDialog.cpp @@ -89,13 +89,12 @@ void KeyUIDSignDialog::slotSignKey(bool clicked) { // Set Signers QVector<GpgKey> keys; mKeyList->getCheckedKeys(keys); - mCtx->setSigners(keys); const auto expires = expiresEdit->dateTime(); for(const auto &uid : mUids) { // Sign For mKey - if (!mCtx->signKey(mKey, uid.uid, &expires)) { + if (!mCtx->signKey(mKey, keys, uid.uid, &expires)) { QMessageBox::critical(nullptr, tr("Unsuccessful Operation"), QString(tr("Signature operation failed for UID ") + "%1") diff --git a/src/ui/main_window/MainWindowFileSlotFunction.cpp b/src/ui/main_window/MainWindowFileSlotFunction.cpp new file mode 100644 index 00000000..e391c666 --- /dev/null +++ b/src/ui/main_window/MainWindowFileSlotFunction.cpp @@ -0,0 +1,610 @@ +/** + * This file is part of GPGFrontend. + * + * GPGFrontend 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 3 of the License, or + * (at your option) any later version. + * + * Foobar 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 Foobar. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from gpg4usb-team. + * Their source code version also complies with GNU General Public License. + * + * The source code version of this software was modified and released + * by Saturneric<[email protected]> starting on May 12, 2021. + * + */ + +#include "MainWindow.h" + +void MainWindow::slotFileEncrypt() { + + auto fileTreeView = edit->slotCurPageFileTreeView(); + auto path = fileTreeView->getSelected(); + + QFileInfo fileInfo(path); + QFileInfo pathInfo(fileInfo.absolutePath()); + + if (!fileInfo.isFile()) { + QMessageBox::critical(this, tr("Error"), tr("Select a file before doing it.")); + return; + } + if (!fileInfo.isReadable()) { + QMessageBox::critical(this, tr("Error"), tr("No permission to read this file.")); + return; + } + if (!pathInfo.isWritable()) { + QMessageBox::critical(this, tr("Error"), tr("No permission to create file.")); + return; + } + if (QFile::exists(path + ".asc")) { + auto ret = QMessageBox::warning(this, + tr("Warning"), + tr("The target file already exists, do you need to overwrite it?"), + QMessageBox::Ok | QMessageBox::Cancel); + + if (ret == QMessageBox::Cancel) + return; + } + + QVector<GpgKey> keys; + + mKeyList->getCheckedKeys(keys); + + if (keys.empty()) { + QMessageBox::critical(this, tr("No Key Selected"), tr("No Key Selected")); + return; + } + + for (const auto &key : keys) { + if (!GpgME::GpgContext::checkIfKeyCanEncr(key)) { + QMessageBox::information(this, + tr("Invalid Operation"), + tr("The selected key contains a key that does not actually have a encrypt usage.<br/>") + + tr("<br/>For example the Following Key: <br/>") + key.uids.first().uid); + return; + + } + } + + gpgme_encrypt_result_t result; + + gpgme_error_t error; + bool if_error = false; + auto thread = QThread::create([&]() { + try { + error = GpgFileOpera::encryptFile(mCtx, keys, path, &result); + } catch (const std::runtime_error &e) { + if_error = true; + } + }); + connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); + thread->start(); + + auto *dialog = new WaitingDialog(tr("Encrypting"), this); + while (thread->isRunning()) { + QApplication::processEvents(); + } + + dialog->close(); + if (!if_error) { + auto resultAnalyse = new EncryptResultAnalyse(error, result); + auto &reportText = resultAnalyse->getResultReport(); + infoBoard->associateTabWidget(edit->tabWidget); + infoBoard->associateFileTreeView(edit->curFilePage()); + + if (resultAnalyse->getStatus() < 0) + infoBoard->slotRefresh(reportText, INFO_ERROR_CRITICAL); + else if (resultAnalyse->getStatus() > 0) + infoBoard->slotRefresh(reportText, INFO_ERROR_OK); + else + infoBoard->slotRefresh(reportText, INFO_ERROR_WARN); + + delete resultAnalyse; + + fileTreeView->update(); + } else { + QMessageBox::critical(this, tr("Error"), tr("An error occurred during operation.")); + return; + } +} + +void MainWindow::slotFileDecrypt() { + + auto fileTreeView = edit->slotCurPageFileTreeView(); + auto path = fileTreeView->getSelected(); + + QFileInfo fileInfo(path); + QFileInfo pathInfo(fileInfo.absolutePath()); + if (!fileInfo.isFile()) { + QMessageBox::critical(this, tr("Error"), tr("Select a file before doing it.")); + return; + } + if (!fileInfo.isReadable()) { + QMessageBox::critical(this, tr("Error"), tr("No permission to read this file.")); + return; + } + if (!pathInfo.isWritable()) { + QMessageBox::critical(this, tr("Error"), tr("No permission to create file.")); + return; + } + + QString outFileName, fileExtension = fileInfo.suffix(); + + if (fileExtension == "asc" || fileExtension == "gpg") { + int pos = path.lastIndexOf(QChar('.')); + outFileName = path.left(pos); + } else { + outFileName = path + ".out"; + } + + if (QFile::exists(outFileName)) { + auto ret = QMessageBox::warning(this, + tr("Warning"), + tr("The target file already exists, do you need to overwrite it?"), + QMessageBox::Ok | QMessageBox::Cancel); + + if (ret == QMessageBox::Cancel) + return; + } + + gpgme_decrypt_result_t result; + gpgme_error_t error; + bool if_error = false; + + auto thread = QThread::create([&]() { + try { + error = GpgFileOpera::decryptFile(mCtx, path, &result); + } catch (const std::runtime_error &e) { + if_error = true; + } + }); + connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); + thread->start(); + + auto *dialog = new WaitingDialog("Decrypting", this); + while (thread->isRunning()) { + QApplication::processEvents(); + } + + dialog->close(); + + if (!if_error) { + auto resultAnalyse = new DecryptResultAnalyse(mCtx, error, result); + auto &reportText = resultAnalyse->getResultReport(); + infoBoard->associateTabWidget(edit->tabWidget); + infoBoard->associateFileTreeView(edit->curFilePage()); + + if (resultAnalyse->getStatus() < 0) + infoBoard->slotRefresh(reportText, INFO_ERROR_CRITICAL); + else if (resultAnalyse->getStatus() > 0) + infoBoard->slotRefresh(reportText, INFO_ERROR_OK); + else + infoBoard->slotRefresh(reportText, INFO_ERROR_WARN); + + delete resultAnalyse; + + fileTreeView->update(); + } else { + QMessageBox::critical(this, tr("Error"), tr("An error occurred during operation.")); + return; + } + + +} + +void MainWindow::slotFileSign() { + + auto fileTreeView = edit->slotCurPageFileTreeView(); + auto path = fileTreeView->getSelected(); + + QFileInfo fileInfo(path); + QFileInfo pathInfo(fileInfo.absolutePath()); + + if (!fileInfo.isFile()) { + QMessageBox::critical(this, tr("Error"), tr("Select a file before doing it.")); + return; + } + if (!fileInfo.isReadable()) { + QMessageBox::critical(this, tr("Error"), tr("No permission to read this file.")); + return; + } + if (!pathInfo.isWritable()) { + QMessageBox::critical(this, tr("Error"), tr("No permission to create file.")); + return; + } + + if (QFile::exists(path + ".sig")) { + auto ret = QMessageBox::warning(this, + tr("Warning"), + tr("The target file already exists, do you need to overwrite it?"), + QMessageBox::Ok | QMessageBox::Cancel); + + if (ret == QMessageBox::Cancel) + return; + } + + QVector<GpgKey> keys; + + mKeyList->getCheckedKeys(keys); + + if (keys.empty()) { + QMessageBox::critical(this, tr("No Key Selected"), tr("No Key Selected")); + return; + } + + for (const auto &key : keys) { + if (!GpgME::GpgContext::checkIfKeyCanEncr(key)) { + QMessageBox::information(this, + tr("Invalid Operation"), + tr("The selected key contains a key that does not actually have a encrypt usage.<br/>") + + tr("<br/>For example the Following Key: <br/>") + key.uids.first().uid); + return; + + } + } + + gpgme_sign_result_t result; + gpgme_error_t error; + bool if_error = false; + + auto thread = QThread::create([&]() { + try { + error = GpgFileOpera::signFile(mCtx, keys, path, &result); + } catch (const std::runtime_error &e) { + if_error = true; + } + }); + connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); + thread->start(); + + auto *dialog = new WaitingDialog(tr("Signing"), this); + while (thread->isRunning()) { + QApplication::processEvents(); + } + + dialog->close(); + + if (!if_error) { + + auto resultAnalyse = new SignResultAnalyse(mCtx, error, result); + auto &reportText = resultAnalyse->getResultReport(); + infoBoard->associateTabWidget(edit->tabWidget); + infoBoard->associateFileTreeView(edit->curFilePage()); + + if (resultAnalyse->getStatus() < 0) + infoBoard->slotRefresh(reportText, INFO_ERROR_CRITICAL); + else if (resultAnalyse->getStatus() > 0) + infoBoard->slotRefresh(reportText, INFO_ERROR_OK); + else + infoBoard->slotRefresh(reportText, INFO_ERROR_WARN); + + delete resultAnalyse; + + fileTreeView->update(); + + } else { + QMessageBox::critical(this, tr("Error"), tr("An error occurred during operation.")); + return; + } + + fileTreeView->update(); + +} + +void MainWindow::slotFileVerify() { + + auto fileTreeView = edit->slotCurPageFileTreeView(); + auto path = fileTreeView->getSelected(); + + QFileInfo fileInfo(path); + + QString signFilePath, dataFilePath; + + if (fileInfo.suffix() == "gpg") { + dataFilePath = path; + signFilePath = path; + } else if (fileInfo.suffix() == "sig") { + int pos = path.lastIndexOf(QChar('.')); + dataFilePath = path.left(pos); + signFilePath = path; + } else { + dataFilePath = path; + signFilePath = path + ".sig"; + } + + QFileInfo dataFileInfo(dataFilePath), signFileInfo(signFilePath); + + if (!dataFileInfo.isFile() || !signFileInfo.isFile()) { + QMessageBox::critical(this, tr("Error"), + tr("Please select the appropriate target file or signature file. Ensure that both are in this directory.")); + return; + } + if (!dataFileInfo.isReadable()) { + QMessageBox::critical(this, tr("Error"), tr("No permission to read target file.")); + return; + } + if (!fileInfo.isReadable()) { + QMessageBox::critical(this, tr("Error"), tr("No permission to read signature file.")); + return; + } + + gpgme_verify_result_t result; + + gpgme_error_t error; + bool if_error = false; + auto thread = QThread::create([&]() { + try { + error = GpgFileOpera::verifyFile(mCtx, dataFilePath, &result); + } catch (const std::runtime_error &e) { + if_error = true; + } + }); + connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); + thread->start(); + + auto *dialog = new WaitingDialog(tr("Verifying"), this); + while (thread->isRunning()) { + QApplication::processEvents(); + } + dialog->close(); + + if (!if_error) { + auto resultAnalyse = new VerifyResultAnalyse(mCtx, error, result); + auto &reportText = resultAnalyse->getResultReport(); + infoBoard->associateTabWidget(edit->tabWidget); + infoBoard->associateFileTreeView(edit->curFilePage()); + + if (resultAnalyse->getStatus() < 0) + infoBoard->slotRefresh(reportText, INFO_ERROR_CRITICAL); + else if (resultAnalyse->getStatus() > 0) + infoBoard->slotRefresh(reportText, INFO_ERROR_OK); + else + infoBoard->slotRefresh(reportText, INFO_ERROR_WARN); + + if (resultAnalyse->getStatus() >= 0) { + infoBoard->resetOptionActionsMenu(); + infoBoard->addOptionalAction("Show Verify Details", [this, error, result]() { + VerifyDetailsDialog(this, mCtx, mKeyList, error, result); + }); + } + + delete resultAnalyse; + + fileTreeView->update(); + } else { + QMessageBox::critical(this, tr("Error"), tr("An error occurred during operation.")); + return; + } +} + +void MainWindow::slotFileEncryptSign() { + auto fileTreeView = edit->slotCurPageFileTreeView(); + auto path = fileTreeView->getSelected(); + + QFileInfo fileInfo(path); + QFileInfo pathInfo(fileInfo.absolutePath()); + + if (!fileInfo.isFile()) { + QMessageBox::critical(this, tr("Error"), tr("Select a file before doing it.")); + return; + } + if (!fileInfo.isReadable()) { + QMessageBox::critical(this, tr("Error"), tr("No permission to read this file.")); + return; + } + if (!pathInfo.isWritable()) { + QMessageBox::critical(this, tr("Error"), tr("No permission to create file.")); + return; + } + if (QFile::exists(path + ".gpg")) { + auto ret = QMessageBox::warning(this, + tr("Warning"), + tr("The target file already exists, do you need to overwrite it?"), + QMessageBox::Ok | QMessageBox::Cancel); + + if (ret == QMessageBox::Cancel) + return; + } + + QVector<GpgKey> keys; + + mKeyList->getCheckedKeys(keys); + + if (keys.empty()) { + QMessageBox::critical(this, tr("No Key Selected"), tr("No Key Selected")); + return; + } + + bool can_sign = false, can_encr = false; + + for (const auto &key : keys) { + bool key_can_sign = GpgME::GpgContext::checkIfKeyCanSign(key); + bool key_can_encr = GpgME::GpgContext::checkIfKeyCanEncr(key); + + if (!key_can_sign && !key_can_encr) { + QMessageBox::critical(nullptr, + tr("Invalid KeyPair"), + tr("The selected keypair cannot be used for signing and encryption at the same time.<br/>") + + tr("<br/>For example the Following Key: <br/>") + key.uids.first().uid); + return; + } + + if (key_can_sign) can_sign = true; + if (key_can_encr) can_encr = true; + } + + if (!can_encr) { + QMessageBox::critical(nullptr, + tr("Incomplete Operation"), + tr("None of the selected key pairs can provide the encryption function.")); + return; + } + + if (!can_sign) { + QMessageBox::warning(nullptr, + tr("Incomplete Operation"), + tr("None of the selected key pairs can provide the signature function.")); + } + + gpgme_encrypt_result_t encr_result = nullptr; + gpgme_sign_result_t sign_result = nullptr; + + gpgme_error_t error; + bool if_error = false; + + auto thread = QThread::create([&]() { + try { + error = GpgFileOpera::encryptSignFile(mCtx, keys, path, &encr_result, &sign_result); + } catch (const std::runtime_error &e) { + if_error = true; + } + }); + connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); + thread->start(); + + auto *dialog = new WaitingDialog(tr("Encrypting and Signing"), this); + while (thread->isRunning()) { + QApplication::processEvents(); + } + dialog->close(); + + if (!if_error) { + + auto resultAnalyseEncr = new EncryptResultAnalyse(error, encr_result); + auto resultAnalyseSign = new SignResultAnalyse(mCtx, error, sign_result); + int status = std::min(resultAnalyseEncr->getStatus(), resultAnalyseSign->getStatus()); + auto reportText = resultAnalyseEncr->getResultReport() + resultAnalyseSign->getResultReport(); + + infoBoard->associateFileTreeView(edit->curFilePage()); + + if (status < 0) + infoBoard->slotRefresh(reportText, INFO_ERROR_CRITICAL); + else if (status > 0) + infoBoard->slotRefresh(reportText, INFO_ERROR_OK); + else + infoBoard->slotRefresh(reportText, INFO_ERROR_WARN); + + delete resultAnalyseEncr; + delete resultAnalyseSign; + + fileTreeView->update(); + + } else { + QMessageBox::critical(this, tr("Error"), tr("An error occurred during operation.")); + return; + } +} + +void MainWindow::slotFileDecryptVerify() { + auto fileTreeView = edit->slotCurPageFileTreeView(); + auto path = fileTreeView->getSelected(); + + QFileInfo fileInfo(path); + QFileInfo pathInfo(fileInfo.absolutePath()); + if (!fileInfo.isFile()) { + QMessageBox::critical(this, tr("Error"), tr("Select a file(.gpg/.asc) before doing it.")); + return; + } + if (!fileInfo.isReadable()) { + QMessageBox::critical(this, tr("Error"), tr("No permission to read this file.")); + return; + } + if (!pathInfo.isWritable()) { + QMessageBox::critical(this, tr("Error"), tr("No permission to create file.")); + return; + } + + QString outFileName, fileExtension = fileInfo.suffix(); + + if (fileExtension == "asc" || fileExtension == "gpg") { + int pos = path.lastIndexOf(QChar('.')); + outFileName = path.left(pos); + } else { + outFileName = path + ".out"; + } + + gpgme_decrypt_result_t d_result = nullptr; + gpgme_verify_result_t v_result = nullptr; + + gpgme_error_t error; + bool if_error = false; + + auto thread = QThread::create([&]() { + try { + error = GpgFileOpera::decryptVerifyFile(mCtx, path, &d_result, &v_result); + } catch (const std::runtime_error &e) { + if_error = true; + } + }); + connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); + thread->start(); + + + auto *dialog = new WaitingDialog(tr("Decrypting and Verifying"), this); + while (thread->isRunning()) { + QApplication::processEvents(); + } + dialog->close(); + + if (!if_error) { + infoBoard->associateFileTreeView(edit->curFilePage()); + + auto resultAnalyseDecrypt = new DecryptResultAnalyse(mCtx, error, d_result); + auto resultAnalyseVerify = new VerifyResultAnalyse(mCtx, error, v_result); + + int status = std::min(resultAnalyseDecrypt->getStatus(), resultAnalyseVerify->getStatus()); + auto &reportText = resultAnalyseDecrypt->getResultReport() + resultAnalyseVerify->getResultReport(); + if (status < 0) + infoBoard->slotRefresh(reportText, INFO_ERROR_CRITICAL); + else if (status > 0) + infoBoard->slotRefresh(reportText, INFO_ERROR_OK); + else + infoBoard->slotRefresh(reportText, INFO_ERROR_WARN); + + if (resultAnalyseVerify->getStatus() >= 0) { + infoBoard->resetOptionActionsMenu(); + infoBoard->addOptionalAction("Show Verify Details", [this, error, v_result]() { + VerifyDetailsDialog(this, mCtx, mKeyList, error, v_result); + }); + } + delete resultAnalyseDecrypt; + delete resultAnalyseVerify; + + fileTreeView->update(); + } else { + QMessageBox::critical(this, tr("Error"), tr("An error occurred during operation.")); + return; + } +} + +void MainWindow::slotFileEncryptCustom() { + QStringList *keyList; + keyList = mKeyList->getChecked(); + new FileEncryptionDialog(mCtx, *keyList, FileEncryptionDialog::Encrypt, this); +} + +void MainWindow::slotFileDecryptCustom() { + QStringList *keyList; + keyList = mKeyList->getChecked(); + new FileEncryptionDialog(mCtx, *keyList, FileEncryptionDialog::Decrypt, this); +} + +void MainWindow::slotFileSignCustom() { + QStringList *keyList; + keyList = mKeyList->getChecked(); + new FileEncryptionDialog(mCtx, *keyList, FileEncryptionDialog::Sign, this); +} + +void MainWindow::slotFileVerifyCustom() { + QStringList *keyList; + keyList = mKeyList->getChecked(); + new FileEncryptionDialog(mCtx, *keyList, FileEncryptionDialog::Verify, this); +} diff --git a/src/ui/main_window/MainWindowServerSlotFunction.cpp b/src/ui/main_window/MainWindowServerSlotFunction.cpp new file mode 100644 index 00000000..3a7e9f71 --- /dev/null +++ b/src/ui/main_window/MainWindowServerSlotFunction.cpp @@ -0,0 +1,238 @@ +/** + * This file is part of GPGFrontend. + * + * GPGFrontend 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 3 of the License, or + * (at your option) any later version. + * + * Foobar 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 Foobar. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from gpg4usb-team. + * Their source code version also complies with GNU General Public License. + * + * The source code version of this software was modified and released + * by Saturneric<[email protected]> starting on May 12, 2021. + * + */ + +#include "MainWindow.h" +#include "server/ComUtils.h" +#include "ui/ShowCopyDialog.h" + +#include "rapidjson/document.h" +#include "rapidjson/prettywriter.h" + +/** + * get full size crypt text from server using short crypto text + * @param shortenCryptoText short crypto text([GpgFrontend_ShortCrypto]://) + * @return + */ +QString MainWindow::getCryptText(const QString &shortenCryptoText) { + + QString ownKeyId = settings.value("general/ownKeyId").toString(); + + GpgKey key = mCtx->getKeyById(ownKeyId); + if (!key.good) { + QMessageBox::critical(this, tr("Invalid Own Key"), + tr("Own Key can not be use to do any operation. " + "Please go to the setting interface to select an OwnKey and get a ServiceToken.")); + return {}; + } + + auto utils = new ComUtils(this); + + QString serviceToken = settings.value("general/serviceToken").toString(); + if (serviceToken.isEmpty() || !utils->checkServiceTokenFormat(serviceToken)) { + QMessageBox::critical(this, tr("Error"), + tr("Please obtain a Service Token from the server in the settings.")); + return {}; + } + + QUrl reqUrl(utils->getUrl(ComUtils::GetFullCryptText)); + QNetworkRequest request(reqUrl); + request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); + + // Sign Shorten Text + auto outSignTextBase64 = ComUtils::getSignStringBase64(mCtx, shortenCryptoText, key); + + rapidjson::Document doc; + doc.SetObject(); + + rapidjson::Value s, t; + + // Signature + s.SetString(outSignTextBase64.constData(), outSignTextBase64.count()); + // Service Token + const auto t_byte_array = serviceToken.toUtf8(); + t.SetString(t_byte_array.constData(), t_byte_array.count()); + + rapidjson::Document::AllocatorType &allocator = doc.GetAllocator(); + + doc.AddMember("signature", s, allocator); + doc.AddMember("serviceToken", t, allocator); + + rapidjson::StringBuffer sb; + rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(sb); + doc.Accept(writer); + + QByteArray postData(sb.GetString()); + qDebug() << "postData" << QString::fromUtf8(postData); + + QNetworkReply *reply = utils->getNetworkManager().post(request, postData); + + auto dialog = new WaitingDialog(tr("Getting Cpt From Server"), this); + dialog->show(); + + while (reply->isRunning()) QApplication::processEvents(); + + dialog->close(); + + QByteArray replyData = reply->readAll().constData(); + if (utils->checkServerReply(replyData)) { + /** + * { + * "cryptoText" : ... + * "sha": ... + * "serviceToken": ... + * "date": ... + * } + */ + + if (!utils->checkDataValueStr("cryptoText") + || !utils->checkDataValueStr("sha") + || !utils->checkDataValueStr("serviceToken")) { + QMessageBox::critical(this, tr("Error"), + tr("The communication content with the server does not meet the requirements")); + return {}; + } + + auto cryptoText = utils->getDataValueStr("cryptoText"); + auto sha = utils->getDataValueStr("sha"); + auto serviceTokenFromServer = utils->getDataValueStr("serviceToken"); + + QCryptographicHash sha_generator(QCryptographicHash::Sha256); + sha_generator.addData(cryptoText.toUtf8()); + + if (sha_generator.result().toHex() == sha && serviceToken == serviceTokenFromServer) { + return cryptoText; + } else QMessageBox::critical(this, tr("Error"), tr("Invalid short ciphertext")); + + return {}; + } + + return {}; +} + +void MainWindow::shortenCryptText() { + + // gather information + QString serviceToken = settings.value("general/serviceToken").toString(); + QString ownKeyId = settings.value("general/ownKeyId").toString(); + QByteArray cryptoText = edit->curTextPage()->toPlainText().toUtf8(); + + auto utils = new ComUtils(this); + + if (serviceToken.isEmpty() || !utils->checkServiceTokenFormat(serviceToken)) { + QMessageBox::critical(this, tr("Invalid Service Token"), + tr("Please go to the setting interface to get a ServiceToken.")); + return; + } + + QUrl reqUrl(utils->getUrl(ComUtils::ShortenCryptText)); + QNetworkRequest request(reqUrl); + request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); + + GpgKey key = mCtx->getKeyById(ownKeyId); + if (!key.good) { + QMessageBox::critical(this, tr("Invalid Own Key"), tr("Own Key can not be use to do any operation.")); + return; + } + + QCryptographicHash ch(QCryptographicHash::Md5); + ch.addData(cryptoText); + QString md5 = ch.result().toHex(); + + qDebug() << "md5" << md5; + + QByteArray signText = QString("[%1][%2]").arg(serviceToken, md5).toUtf8(); + + QCryptographicHash sha(QCryptographicHash::Sha256); + sha.addData(signText); + QString shaText = sha.result().toHex(); + + qDebug() << "shaText" << shaText; + + QByteArray outSignTextBase64 = ComUtils::getSignStringBase64(mCtx, signText, key); + + rapidjson::Value c, s, m, t; + + rapidjson::Document doc; + doc.SetObject(); + + c.SetString(cryptoText.constData(), cryptoText.count()); + auto m_byte_array = shaText.toUtf8(); + m.SetString(m_byte_array.constData(), m_byte_array.count()); + s.SetString(outSignTextBase64.constData(), outSignTextBase64.count()); + auto t_byte_array = serviceToken.toUtf8(); + t.SetString(t_byte_array.constData(), t_byte_array.count()); + + rapidjson::Document::AllocatorType &allocator = doc.GetAllocator(); + + doc.AddMember("cryptoText", c, allocator); + doc.AddMember("sha", m, allocator); + doc.AddMember("sign", s, allocator); + doc.AddMember("serviceToken", t, allocator); + + rapidjson::StringBuffer sb; + rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(sb); + doc.Accept(writer); + + QByteArray postData(sb.GetString()); + qDebug() << "postData" << QString::fromUtf8(postData); + + QNetworkReply *reply = networkAccessManager->post(request, postData); + + auto *dialog = new WaitingDialog(tr("Getting Scpt From Server"), this); + dialog->show(); + while (reply->isRunning()) QApplication::processEvents(); + dialog->close(); + + if (utils->checkServerReply(reply->readAll().constData())) { + + /** + * { + * "shortenText" : ... + * "md5": ... + * } + */ + + if (!utils->checkDataValueStr("shortenText") || !utils->checkDataValueStr("md5")) { + QMessageBox::critical(this, tr("Error"), + tr("The communication content with the server does not meet the requirements")); + return; + } + + QString shortenText = utils->getDataValueStr("shortenText"); + + QCryptographicHash md5_generator(QCryptographicHash::Md5); + md5_generator.addData(shortenText.toUtf8()); + if (md5_generator.result().toHex() == utils->getDataValueStr("md5")) { + auto *dialog = new ShowCopyDialog(shortenText, + tr("Notice: Use Decrypt & Verify operation to decrypt this short crypto text."), + this); + dialog->show(); + } else { + QMessageBox::critical(this, tr("Error"), tr("There is a problem with the communication with the server")); + return; + } + } + +} + diff --git a/src/ui/main_window/MainWindowSlotFunction.cpp b/src/ui/main_window/MainWindowSlotFunction.cpp index 4bcee080..501418d6 100644 --- a/src/ui/main_window/MainWindowSlotFunction.cpp +++ b/src/ui/main_window/MainWindowSlotFunction.cpp @@ -24,7 +24,14 @@ #include "MainWindow.h" #include "ui/SendMailDialog.h" +#include "ui/widgets/SignersPicker.h" +#include "server/api/PubkeyUploader.h" +#include "advance/UnknownSignersChecker.h" + +/** + * Encrypt Entry(Text & File) + */ void MainWindow::slotEncrypt() { if (edit->tabCount() == 0) return; @@ -50,33 +57,33 @@ void MainWindow::slotEncrypt() { } } - auto *tmp = new QByteArray(); + auto tmp = QByteArray(); gpgme_encrypt_result_t result = nullptr; gpgme_error_t error; auto thread = QThread::create([&]() { - error = mCtx->encrypt(keys, edit->curTextPage()->toPlainText().toUtf8(), tmp, &result); + error = mCtx->encrypt(keys, edit->curTextPage()->toPlainText().toUtf8(), &tmp, &result); }); - connect(thread, SIGNAL(finished(QPrivateSignal)), thread, SLOT(deleteLater())); + connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); thread->start(); auto *dialog = new WaitingDialog(tr("Encrypting"), this); - while (thread->isRunning()) { + while (thread->isRunning()) QApplication::processEvents(); - } dialog->close(); auto resultAnalyse = new EncryptResultAnalyse(error, result); auto &reportText = resultAnalyse->getResultReport(); - auto *tmp2 = new QString(*tmp); - edit->slotFillTextEditWithText(*tmp2); + auto tmp2 = QString(tmp); + edit->slotFillTextEditWithText(tmp2); infoBoard->associateTextEdit(edit->curTextPage()); + // check result analyse status if (resultAnalyse->getStatus() < 0) infoBoard->slotRefresh(reportText, INFO_ERROR_CRITICAL); else if (resultAnalyse->getStatus() > 0) @@ -84,10 +91,11 @@ void MainWindow::slotEncrypt() { else infoBoard->slotRefresh(reportText, INFO_ERROR_WARN); + // set optional actions if (resultAnalyse->getStatus() >= 0) { infoBoard->resetOptionActionsMenu(); infoBoard->addOptionalAction("Send Mail", [this]() { - if(settings.value("sendMail/enable", false).toBool()) + if (settings.value("sendMail/enable", false).toBool()) new SendMailDialog(edit->curTextPage()->toPlainText(), this); else { QMessageBox::warning(nullptr, @@ -128,15 +136,15 @@ void MainWindow::slotSign() { } } - auto *tmp = new QByteArray(); + auto tmp = QByteArray(); gpgme_sign_result_t result = nullptr; gpgme_error_t error; auto thread = QThread::create([&]() { - error = mCtx->sign(keys, edit->curTextPage()->toPlainText().toUtf8(), tmp, false, &result); + error = mCtx->sign(keys, edit->curTextPage()->toPlainText().toUtf8(), &tmp, GPGME_SIG_MODE_CLEAR, &result); }); - connect(thread, SIGNAL(finished(QPrivateSignal)), thread, SLOT(deleteLater())); + connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); thread->start(); auto *dialog = new WaitingDialog(tr("Signing"), this); @@ -146,9 +154,9 @@ void MainWindow::slotSign() { dialog->close(); infoBoard->associateTextEdit(edit->curTextPage()); - edit->slotFillTextEditWithText(QString::fromUtf8(*tmp)); + edit->slotFillTextEditWithText(QString::fromUtf8(tmp)); - auto resultAnalyse = new SignResultAnalyse(error, result); + auto resultAnalyse = new SignResultAnalyse(mCtx, error, result); auto &reportText = resultAnalyse->getResultReport(); if (resultAnalyse->getStatus() < 0) @@ -169,18 +177,23 @@ void MainWindow::slotDecrypt() { if (edit->slotCurPageTextEdit() != nullptr) { - auto *decrypted = new QByteArray(); + auto decrypted = QByteArray(); QByteArray text = edit->curTextPage()->toPlainText().toUtf8(); GpgME::GpgContext::preventNoDataErr(&text); + if (text.trimmed().startsWith(GpgConstants::GPG_FRONTEND_SHORT_CRYPTO_HEAD)) { + QMessageBox::critical(this, tr("Notice"), tr("Short Crypto Text only supports Decrypt & Verify.")); + return; + } + gpgme_decrypt_result_t result = nullptr; gpgme_error_t error; auto thread = QThread::create([&]() { // try decrypt, if fail do nothing, especially don't replace text - error = mCtx->decrypt(text, decrypted, &result); + error = mCtx->decrypt(text, &decrypted, &result); }); - connect(thread, SIGNAL(finished(QPrivateSignal)), thread, SLOT(deleteLater())); + connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); thread->start(); auto *dialog = new WaitingDialog(tr("Decrypting"), this); @@ -193,7 +206,7 @@ void MainWindow::slotDecrypt() { infoBoard->associateTextEdit(edit->curTextPage()); if (gpgme_err_code(error) == GPG_ERR_NO_ERROR) - edit->slotFillTextEditWithText(QString::fromUtf8(*decrypted)); + edit->slotFillTextEditWithText(QString::fromUtf8(decrypted)); auto resultAnalyse = new DecryptResultAnalyse(mCtx, error, result); @@ -233,20 +246,18 @@ void MainWindow::slotVerify() { QByteArray text = edit->curTextPage()->toPlainText().toUtf8(); GpgME::GpgContext::preventNoDataErr(&text); - gpgme_verify_result_t result; gpgme_error_t error; auto thread = QThread::create([&]() { error = mCtx->verify(&text, nullptr, &result); }); - connect(thread, SIGNAL(finished(QPrivateSignal)), thread, SLOT(deleteLater())); + connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); thread->start(); auto *dialog = new WaitingDialog(tr("Verifying"), this); - while (thread->isRunning()) { + while (thread->isRunning()) QApplication::processEvents(); - } dialog->close(); auto resultAnalyse = new VerifyResultAnalyse(mCtx, error, result); @@ -274,7 +285,6 @@ void MainWindow::slotVerify() { void MainWindow::slotEncryptSign() { - if (edit->tabCount() == 0) return; if (edit->slotCurPageTextEdit() != nullptr) { @@ -287,49 +297,49 @@ void MainWindow::slotEncryptSign() { return; } - bool can_sign = false, can_encr = false; - for (const auto &key : keys) { - bool key_can_sign = GpgME::GpgContext::checkIfKeyCanSign(key); bool key_can_encr = GpgME::GpgContext::checkIfKeyCanEncr(key); - if (!key_can_sign && !key_can_encr) { + if (!key_can_encr) { QMessageBox::critical(nullptr, tr("Invalid KeyPair"), - tr("The selected keypair cannot be used for signing and encryption at the same time.<br/>") + tr("The selected keypair cannot be used for encryption.<br/>") + tr("<br/>For example the Following Key: <br/>") + key.uids.first().uid); return; } - if (key_can_sign) can_sign = true; - if (key_can_encr) can_encr = true; } - if (!can_encr) { - QMessageBox::critical(nullptr, - tr("Incomplete Operation"), - tr("None of the selected key pairs can provide the encryption function.")); - return; + QVector<GpgKey> signerKeys; + + auto signersPicker = new SignersPicker(mCtx, this); + + QEventLoop loop; + connect(signersPicker, SIGNAL(finished(int)), &loop, SLOT(quit())); + loop.exec(); + + signersPicker->getCheckedSigners(signerKeys); + + for (const auto &key : keys) { + qDebug() << "Keys " << key.email; } - if (!can_sign) { - QMessageBox::warning(nullptr, - tr("Incomplete Operation"), - tr("None of the selected key pairs can provide the signature function.")); + for (const auto &signer : signerKeys) { + qDebug() << "Signers " << signer.email; } - auto *tmp = new QByteArray(); + + auto tmp = QByteArray(); gpgme_encrypt_result_t encr_result = nullptr; gpgme_sign_result_t sign_result = nullptr; - gpgme_decrypt_result_t result = nullptr; - gpgme_error_t error; auto thread = QThread::create([&]() { - error = mCtx->encryptSign(keys, edit->curTextPage()->toPlainText().toUtf8(), tmp, &encr_result, + error = mCtx->encryptSign(keys, signerKeys, edit->curTextPage()->toPlainText().toUtf8(), &tmp, + &encr_result, &sign_result); }); - connect(thread, SIGNAL(finished(QPrivateSignal)), thread, SLOT(deleteLater())); + connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); thread->start(); auto *dialog = new WaitingDialog(tr("Encrypting and Signing"), this); @@ -337,15 +347,29 @@ void MainWindow::slotEncryptSign() { QApplication::processEvents(); } + if (settings.value("advanced/autoPubkeyExchange").toBool()) { + PubkeyUploader pubkeyUploader(mCtx, signerKeys); + pubkeyUploader.start(); + if (!pubkeyUploader.result()) { + QMessageBox::warning(nullptr, + tr("Automatic Key Exchange Warning"), + tr("Part of the automatic key exchange failed, which may be related to your key.") + + + tr("If possible, try to use the RSA algorithm compatible with the server for signing.")); + } + } + dialog->close(); if (gpgme_err_code(error) == GPG_ERR_NO_ERROR) { - auto *tmp2 = new QString(*tmp); - edit->slotFillTextEditWithText(*tmp2); + auto tmp2 = QString(tmp); + edit->slotFillTextEditWithText(tmp2); } + qDebug() << "Start Analyse Result"; + auto resultAnalyseEncr = new EncryptResultAnalyse(error, encr_result); - auto resultAnalyseSign = new SignResultAnalyse(error, sign_result); + auto resultAnalyseSign = new SignResultAnalyse(mCtx, error, sign_result); int status = std::min(resultAnalyseEncr->getStatus(), resultAnalyseSign->getStatus()); auto reportText = resultAnalyseEncr->getResultReport() + resultAnalyseSign->getResultReport(); @@ -358,10 +382,12 @@ void MainWindow::slotEncryptSign() { else infoBoard->slotRefresh(reportText, INFO_ERROR_WARN); + qDebug() << "End Analyse Result"; + if (status >= 0) { infoBoard->resetOptionActionsMenu(); infoBoard->addOptionalAction("Send Mail", [this]() { - if(settings.value("sendMail/enable", false).toBool()) + if (settings.value("sendMail/enable", false).toBool()) new SendMailDialog(edit->curTextPage()->toPlainText(), this); else { QMessageBox::warning(nullptr, @@ -369,6 +395,15 @@ void MainWindow::slotEncryptSign() { tr("Please go to the settings interface to enable and configure this function.")); } }); + infoBoard->addOptionalAction("Shorten Ciphertext", [this]() { + if (settings.value("general/serviceToken").toString().isEmpty()) + QMessageBox::warning(nullptr, + tr("Service Token Empty"), + tr("Please go to the settings interface to set Own Key and get Service Token.")); + else { + shortenCryptText(); + } + }); } delete resultAnalyseEncr; @@ -384,31 +419,56 @@ void MainWindow::slotDecryptVerify() { if (edit->slotCurPageTextEdit() != nullptr) { - auto *decrypted = new QByteArray(); - QByteArray text = edit->curTextPage()->toPlainText().toUtf8(); + auto decrypted = QByteArray(); + QString plainText = edit->curTextPage()->toPlainText(); + + + if (plainText.trimmed().startsWith(GpgConstants::GPG_FRONTEND_SHORT_CRYPTO_HEAD)) { + auto cryptoText = getCryptText(plainText); + if (!cryptoText.isEmpty()) { + plainText = cryptoText; + } + } + + QByteArray text = plainText.toUtf8(); + GpgME::GpgContext::preventNoDataErr(&text); gpgme_decrypt_result_t d_result = nullptr; gpgme_verify_result_t v_result = nullptr; + auto *dialog = new WaitingDialog(tr("Decrypting and Verifying"), this); + + // Automatically import public keys that are not stored locally + if (settings.value("advanced/autoPubkeyExchange").toBool()) { + gpgme_verify_result_t tmp_v_result = nullptr; + auto thread = QThread::create([&]() { + mCtx->verify(&text, nullptr, &tmp_v_result); + }); + thread->start(); + while (thread->isRunning()) QApplication::processEvents(); + auto *checker = new UnknownSignersChecker(mCtx, tmp_v_result); + checker->start(); + checker->deleteLater(); + } + gpgme_error_t error; auto thread = QThread::create([&]() { - error = mCtx->decryptVerify(text, decrypted, &d_result, &v_result); + error = mCtx->decryptVerify(text, &decrypted, &d_result, &v_result); }); - connect(thread, SIGNAL(finished(QPrivateSignal)), thread, SLOT(deleteLater())); + connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); thread->start(); - auto *dialog = new WaitingDialog(tr("Decrypting and Verifying"), this); - while (thread->isRunning()) { - QApplication::processEvents(); - } + while (thread->isRunning()) QApplication::processEvents(); dialog->close(); + qDebug() << "Start Analyse Result"; + infoBoard->associateTextEdit(edit->curTextPage()); if (gpgme_err_code(error) == GPG_ERR_NO_ERROR) - edit->slotFillTextEditWithText(QString::fromUtf8(*decrypted)); + edit->slotFillTextEditWithText(QString::fromUtf8(decrypted)); auto resultAnalyseDecrypt = new DecryptResultAnalyse(mCtx, error, d_result); auto resultAnalyseVerify = new VerifyResultAnalyse(mCtx, error, v_result); @@ -430,11 +490,15 @@ void MainWindow::slotDecryptVerify() { } delete resultAnalyseDecrypt; delete resultAnalyseVerify; + + qDebug() << "End Analyse Result"; + } else if (edit->slotCurPageFileTreeView() != nullptr) { this->slotFileDecryptVerify(); } } + /* * Append the selected (not checked!) Key(s) To Textedit */ @@ -452,7 +516,11 @@ void MainWindow::slotCopyMailAddressToClipboard() { if (mKeyList->getSelected()->isEmpty()) { return; } - auto &key = mCtx->getKeyById(mKeyList->getSelected()->first()); + auto key = mCtx->getKeyById(mKeyList->getSelected()->first()); + if (!key.good) { + QMessageBox::critical(nullptr, tr("Error"), tr("Key Not Found.")); + return; + } QClipboard *cb = QApplication::clipboard(); QString mail = key.email; cb->setText(mail); @@ -462,9 +530,11 @@ void MainWindow::slotShowKeyDetails() { if (mKeyList->getSelected()->isEmpty()) { return; } - auto &key = mCtx->getKeyById(mKeyList->getSelected()->first()); + auto key = mCtx->getKeyById(mKeyList->getSelected()->first()); if (key.good) { new KeyDetailsDialog(mCtx, key, this); + } else { + QMessageBox::critical(nullptr, tr("Error"), tr("Key Not Found.")); } } @@ -487,604 +557,20 @@ void MainWindow::uploadKeyToServer() { dialog->slotUpload(); } -void MainWindow::slotFileEncrypt() { - - auto fileTreeView = edit->slotCurPageFileTreeView(); - auto path = fileTreeView->getSelected(); - - QFileInfo fileInfo(path); - QFileInfo pathInfo(fileInfo.absolutePath()); - - if (!fileInfo.isFile()) { - QMessageBox::critical(this, tr("Error"), tr("Select a file before doing it.")); - return; - } - if (!fileInfo.isReadable()) { - QMessageBox::critical(this, tr("Error"), tr("No permission to read this file.")); - return; - } - if (!pathInfo.isWritable()) { - QMessageBox::critical(this, tr("Error"), tr("No permission to create file.")); - return; - } - if (QFile::exists(path + ".asc")) { - auto ret = QMessageBox::warning(this, - tr("Warning"), - tr("The target file already exists, do you need to overwrite it?"), - QMessageBox::Ok | QMessageBox::Cancel); - - if (ret == QMessageBox::Cancel) - return; - } - - QVector<GpgKey> keys; - - mKeyList->getCheckedKeys(keys); - - if (keys.empty()) { - QMessageBox::critical(this, tr("No Key Selected"), tr("No Key Selected")); - return; - } - - for (const auto &key : keys) { - if (!GpgME::GpgContext::checkIfKeyCanEncr(key)) { - QMessageBox::information(this, - tr("Invalid Operation"), - tr("The selected key contains a key that does not actually have a encrypt usage.<br/>") - + tr("<br/>For example the Following Key: <br/>") + key.uids.first().uid); - return; - - } - } - - gpgme_encrypt_result_t result; - - gpgme_error_t error; - bool if_error = false; - auto thread = QThread::create([&]() { - try { - error = GpgFileOpera::encryptFile(mCtx, keys, path, &result); - } catch (const std::runtime_error &e) { - if_error = true; - } - }); - connect(thread, SIGNAL(finished(QPrivateSignal)), thread, SLOT(deleteLater())); - thread->start(); - - auto *dialog = new WaitingDialog(tr("Encrypting"), this); - while (thread->isRunning()) { - QApplication::processEvents(); - } - - dialog->close(); - if (!if_error) { - auto resultAnalyse = new EncryptResultAnalyse(error, result); - auto &reportText = resultAnalyse->getResultReport(); - infoBoard->associateTabWidget(edit->tabWidget); - infoBoard->associateFileTreeView(edit->curFilePage()); - - if (resultAnalyse->getStatus() < 0) - infoBoard->slotRefresh(reportText, INFO_ERROR_CRITICAL); - else if (resultAnalyse->getStatus() > 0) - infoBoard->slotRefresh(reportText, INFO_ERROR_OK); - else - infoBoard->slotRefresh(reportText, INFO_ERROR_WARN); - - delete resultAnalyse; - - fileTreeView->update(); - } else { - QMessageBox::critical(this, tr("Error"), tr("An error occurred during operation.")); - return; - } -} - -void MainWindow::slotFileDecrypt() { - - auto fileTreeView = edit->slotCurPageFileTreeView(); - auto path = fileTreeView->getSelected(); - - QFileInfo fileInfo(path); - QFileInfo pathInfo(fileInfo.absolutePath()); - if (!fileInfo.isFile()) { - QMessageBox::critical(this, tr("Error"), tr("Select a file before doing it.")); - return; - } - if (!fileInfo.isReadable()) { - QMessageBox::critical(this, tr("Error"), tr("No permission to read this file.")); - return; - } - if (!pathInfo.isWritable()) { - QMessageBox::critical(this, tr("Error"), tr("No permission to create file.")); - return; - } - - QString outFileName, fileExtension = fileInfo.suffix(); - - if (fileExtension == "asc" || fileExtension == "gpg") { - int pos = path.lastIndexOf(QChar('.')); - outFileName = path.left(pos); - } else { - outFileName = path + ".out"; - } - - if (QFile::exists(outFileName)) { - auto ret = QMessageBox::warning(this, - tr("Warning"), - tr("The target file already exists, do you need to overwrite it?"), - QMessageBox::Ok | QMessageBox::Cancel); - - if (ret == QMessageBox::Cancel) - return; - } - - gpgme_decrypt_result_t result; - gpgme_error_t error; - bool if_error = false; - - auto thread = QThread::create([&]() { - try { - error = GpgFileOpera::decryptFile(mCtx, path, &result); - } catch (const std::runtime_error &e) { - if_error = true; - } - }); - connect(thread, SIGNAL(finished(QPrivateSignal)), thread, SLOT(deleteLater())); - thread->start(); - - auto *dialog = new WaitingDialog("Decrypting", this); - while (thread->isRunning()) { - QApplication::processEvents(); - } - - dialog->close(); - - if (!if_error) { - auto resultAnalyse = new DecryptResultAnalyse(mCtx, error, result); - auto &reportText = resultAnalyse->getResultReport(); - infoBoard->associateTabWidget(edit->tabWidget); - infoBoard->associateFileTreeView(edit->curFilePage()); - - if (resultAnalyse->getStatus() < 0) - infoBoard->slotRefresh(reportText, INFO_ERROR_CRITICAL); - else if (resultAnalyse->getStatus() > 0) - infoBoard->slotRefresh(reportText, INFO_ERROR_OK); - else - infoBoard->slotRefresh(reportText, INFO_ERROR_WARN); - - delete resultAnalyse; - - fileTreeView->update(); - } else { - QMessageBox::critical(this, tr("Error"), tr("An error occurred during operation.")); - return; - } - - -} - -void MainWindow::slotFileSign() { - - auto fileTreeView = edit->slotCurPageFileTreeView(); - auto path = fileTreeView->getSelected(); - - QFileInfo fileInfo(path); - QFileInfo pathInfo(fileInfo.absolutePath()); - - if (!fileInfo.isFile()) { - QMessageBox::critical(this, tr("Error"), tr("Select a file before doing it.")); - return; - } - if (!fileInfo.isReadable()) { - QMessageBox::critical(this, tr("Error"), tr("No permission to read this file.")); - return; - } - if (!pathInfo.isWritable()) { - QMessageBox::critical(this, tr("Error"), tr("No permission to create file.")); - return; - } - - if (QFile::exists(path + ".sig")) { - auto ret = QMessageBox::warning(this, - tr("Warning"), - tr("The target file already exists, do you need to overwrite it?"), - QMessageBox::Ok | QMessageBox::Cancel); - - if (ret == QMessageBox::Cancel) - return; - } - - QVector<GpgKey> keys; - - mKeyList->getCheckedKeys(keys); - - if (keys.empty()) { - QMessageBox::critical(this, tr("No Key Selected"), tr("No Key Selected")); - return; - } - - for (const auto &key : keys) { - if (!GpgME::GpgContext::checkIfKeyCanEncr(key)) { - QMessageBox::information(this, - tr("Invalid Operation"), - tr("The selected key contains a key that does not actually have a encrypt usage.<br/>") - + tr("<br/>For example the Following Key: <br/>") + key.uids.first().uid); - return; - - } - } - - gpgme_sign_result_t result; - gpgme_error_t error; - bool if_error = false; - - auto thread = QThread::create([&]() { - try { - error = GpgFileOpera::signFile(mCtx, keys, path, &result); - } catch (const std::runtime_error &e) { - if_error = true; - } - }); - connect(thread, SIGNAL(finished(QPrivateSignal)), thread, SLOT(deleteLater())); - thread->start(); - - auto *dialog = new WaitingDialog(tr("Signing"), this); - while (thread->isRunning()) { - QApplication::processEvents(); - } - - dialog->close(); - - if (!if_error) { - - auto resultAnalyse = new SignResultAnalyse(error, result); - auto &reportText = resultAnalyse->getResultReport(); - infoBoard->associateTabWidget(edit->tabWidget); - infoBoard->associateFileTreeView(edit->curFilePage()); - - if (resultAnalyse->getStatus() < 0) - infoBoard->slotRefresh(reportText, INFO_ERROR_CRITICAL); - else if (resultAnalyse->getStatus() > 0) - infoBoard->slotRefresh(reportText, INFO_ERROR_OK); - else - infoBoard->slotRefresh(reportText, INFO_ERROR_WARN); - - delete resultAnalyse; - - fileTreeView->update(); - - } else { - QMessageBox::critical(this, tr("Error"), tr("An error occurred during operation.")); - return; - } - - fileTreeView->update(); - -} - -void MainWindow::slotFileVerify() { - - auto fileTreeView = edit->slotCurPageFileTreeView(); - auto path = fileTreeView->getSelected(); - - QFileInfo fileInfo(path); - - QString signFilePath, dataFilePath; - - if (fileInfo.suffix() == "gpg") { - dataFilePath = path; - signFilePath = path; - } else if (fileInfo.suffix() == "sig") { - int pos = path.lastIndexOf(QChar('.')); - dataFilePath = path.left(pos); - signFilePath = path; - } else { - dataFilePath = path; - signFilePath = path + ".sig"; - } - - QFileInfo dataFileInfo(dataFilePath), signFileInfo(signFilePath); - - if (!dataFileInfo.isFile() || !signFileInfo.isFile()) { - QMessageBox::critical(this, tr("Error"), - tr("Please select the appropriate target file or signature file. Ensure that both are in this directory.")); - return; - } - if (!dataFileInfo.isReadable()) { - QMessageBox::critical(this, tr("Error"), tr("No permission to read target file.")); - return; - } - if (!fileInfo.isReadable()) { - QMessageBox::critical(this, tr("Error"), tr("No permission to read signature file.")); - return; - } - - gpgme_verify_result_t result; - - gpgme_error_t error; - bool if_error = false; - auto thread = QThread::create([&]() { - try { - error = GpgFileOpera::verifyFile(mCtx, dataFilePath, &result); - } catch (const std::runtime_error &e) { - if_error = true; - } - }); - connect(thread, SIGNAL(finished(QPrivateSignal)), thread, SLOT(deleteLater())); - thread->start(); - - auto *dialog = new WaitingDialog(tr("Verifying"), this); - while (thread->isRunning()) { - QApplication::processEvents(); - } - dialog->close(); - - if (!if_error) { - auto resultAnalyse = new VerifyResultAnalyse(mCtx, error, result); - auto &reportText = resultAnalyse->getResultReport(); - infoBoard->associateTabWidget(edit->tabWidget); - infoBoard->associateFileTreeView(edit->curFilePage()); - - if (resultAnalyse->getStatus() < 0) - infoBoard->slotRefresh(reportText, INFO_ERROR_CRITICAL); - else if (resultAnalyse->getStatus() > 0) - infoBoard->slotRefresh(reportText, INFO_ERROR_OK); - else - infoBoard->slotRefresh(reportText, INFO_ERROR_WARN); - - if (resultAnalyse->getStatus() >= 0) { - infoBoard->resetOptionActionsMenu(); - infoBoard->addOptionalAction("Show Verify Details", [this, error, result]() { - VerifyDetailsDialog(this, mCtx, mKeyList, error, result); - }); - } - - delete resultAnalyse; - - fileTreeView->update(); - } else { - QMessageBox::critical(this, tr("Error"), tr("An error occurred during operation.")); - return; - } -} - -void MainWindow::slotFileEncryptSign() { - auto fileTreeView = edit->slotCurPageFileTreeView(); - auto path = fileTreeView->getSelected(); - - QFileInfo fileInfo(path); - QFileInfo pathInfo(fileInfo.absolutePath()); - - if (!fileInfo.isFile()) { - QMessageBox::critical(this, tr("Error"), tr("Select a file before doing it.")); - return; - } - if (!fileInfo.isReadable()) { - QMessageBox::critical(this, tr("Error"), tr("No permission to read this file.")); - return; - } - if (!pathInfo.isWritable()) { - QMessageBox::critical(this, tr("Error"), tr("No permission to create file.")); - return; - } - if (QFile::exists(path + ".gpg")) { - auto ret = QMessageBox::warning(this, - tr("Warning"), - tr("The target file already exists, do you need to overwrite it?"), - QMessageBox::Ok | QMessageBox::Cancel); - - if (ret == QMessageBox::Cancel) - return; - } - - QVector<GpgKey> keys; - - mKeyList->getCheckedKeys(keys); - - if (keys.empty()) { - QMessageBox::critical(this, tr("No Key Selected"), tr("No Key Selected")); - return; - } - - bool can_sign = false, can_encr = false; - - for (const auto &key : keys) { - bool key_can_sign = GpgME::GpgContext::checkIfKeyCanSign(key); - bool key_can_encr = GpgME::GpgContext::checkIfKeyCanEncr(key); - - if (!key_can_sign && !key_can_encr) { - QMessageBox::critical(nullptr, - tr("Invalid KeyPair"), - tr("The selected keypair cannot be used for signing and encryption at the same time.<br/>") - + tr("<br/>For example the Following Key: <br/>") + key.uids.first().uid); - return; - } - - if (key_can_sign) can_sign = true; - if (key_can_encr) can_encr = true; - } - - if (!can_encr) { - QMessageBox::critical(nullptr, - tr("Incomplete Operation"), - tr("None of the selected key pairs can provide the encryption function.")); - return; - } - - if (!can_sign) { - QMessageBox::warning(nullptr, - tr("Incomplete Operation"), - tr("None of the selected key pairs can provide the signature function.")); - } - - gpgme_encrypt_result_t encr_result = nullptr; - gpgme_sign_result_t sign_result = nullptr; - - gpgme_error_t error; - bool if_error = false; - - auto thread = QThread::create([&]() { - try { - error = GpgFileOpera::encryptSignFile(mCtx, keys, path, &encr_result, &sign_result); - } catch (const std::runtime_error &e) { - if_error = true; - } - }); - connect(thread, SIGNAL(finished(QPrivateSignal)), thread, SLOT(deleteLater())); - thread->start(); - - WaitingDialog *dialog = new WaitingDialog(tr("Encrypting and Signing"), this); - while (thread->isRunning()) { - QApplication::processEvents(); - } - dialog->close(); - - if (!if_error) { - - auto resultAnalyseEncr = new EncryptResultAnalyse(error, encr_result); - auto resultAnalyseSign = new SignResultAnalyse(error, sign_result); - int status = std::min(resultAnalyseEncr->getStatus(), resultAnalyseSign->getStatus()); - auto reportText = resultAnalyseEncr->getResultReport() + resultAnalyseSign->getResultReport(); - - infoBoard->associateFileTreeView(edit->curFilePage()); - - if (status < 0) - infoBoard->slotRefresh(reportText, INFO_ERROR_CRITICAL); - else if (status > 0) - infoBoard->slotRefresh(reportText, INFO_ERROR_OK); - else - infoBoard->slotRefresh(reportText, INFO_ERROR_WARN); - - delete resultAnalyseEncr; - delete resultAnalyseSign; - - fileTreeView->update(); - - } else { - QMessageBox::critical(this, tr("Error"), tr("An error occurred during operation.")); - return; - } -} - -void MainWindow::slotFileDecryptVerify() { - auto fileTreeView = edit->slotCurPageFileTreeView(); - auto path = fileTreeView->getSelected(); - - QFileInfo fileInfo(path); - QFileInfo pathInfo(fileInfo.absolutePath()); - if (!fileInfo.isFile()) { - QMessageBox::critical(this, tr("Error"), tr("Select a file(.gpg/.asc) before doing it.")); - return; - } - if (!fileInfo.isReadable()) { - QMessageBox::critical(this, tr("Error"), tr("No permission to read this file.")); - return; - } - if (!pathInfo.isWritable()) { - QMessageBox::critical(this, tr("Error"), tr("No permission to create file.")); - return; - } - - QString outFileName, fileExtension = fileInfo.suffix(); - - if (fileExtension == "asc" || fileExtension == "gpg") { - int pos = path.lastIndexOf(QChar('.')); - outFileName = path.left(pos); - } else { - outFileName = path + ".out"; - } - - gpgme_decrypt_result_t d_result = nullptr; - gpgme_verify_result_t v_result = nullptr; - - gpgme_error_t error; - bool if_error = false; - - auto thread = QThread::create([&]() { - try { - error = GpgFileOpera::decryptVerifyFile(mCtx, path, &d_result, &v_result); - } catch (const std::runtime_error &e) { - if_error = true; - } - }); - connect(thread, SIGNAL(finished(QPrivateSignal)), thread, SLOT(deleteLater())); - thread->start(); - - - auto *dialog = new WaitingDialog(tr("Decrypting and Verifying"), this); - while (thread->isRunning()) { - QApplication::processEvents(); - } - dialog->close(); - - if (!if_error) { - infoBoard->associateFileTreeView(edit->curFilePage()); - - auto resultAnalyseDecrypt = new DecryptResultAnalyse(mCtx, error, d_result); - auto resultAnalyseVerify = new VerifyResultAnalyse(mCtx, error, v_result); - - int status = std::min(resultAnalyseDecrypt->getStatus(), resultAnalyseVerify->getStatus()); - auto &reportText = resultAnalyseDecrypt->getResultReport() + resultAnalyseVerify->getResultReport(); - if (status < 0) - infoBoard->slotRefresh(reportText, INFO_ERROR_CRITICAL); - else if (status > 0) - infoBoard->slotRefresh(reportText, INFO_ERROR_OK); - else - infoBoard->slotRefresh(reportText, INFO_ERROR_WARN); - - if (resultAnalyseVerify->getStatus() >= 0) { - infoBoard->resetOptionActionsMenu(); - infoBoard->addOptionalAction("Show Verify Details", [this, error, v_result]() { - VerifyDetailsDialog(this, mCtx, mKeyList, error, v_result); - }); - } - delete resultAnalyseDecrypt; - delete resultAnalyseVerify; - - fileTreeView->update(); - } else { - QMessageBox::critical(this, tr("Error"), tr("An error occurred during operation.")); - return; - } -} - -void MainWindow::slotFileEncryptCustom() { - QStringList *keyList; - keyList = mKeyList->getChecked(); - new FileEncryptionDialog(mCtx, *keyList, FileEncryptionDialog::Encrypt, this); -} - -void MainWindow::slotFileDecryptCustom() { - QStringList *keyList; - keyList = mKeyList->getChecked(); - new FileEncryptionDialog(mCtx, *keyList, FileEncryptionDialog::Decrypt, this); -} - -void MainWindow::slotFileSignCustom() { - QStringList *keyList; - keyList = mKeyList->getChecked(); - new FileEncryptionDialog(mCtx, *keyList, FileEncryptionDialog::Sign, this); -} - -void MainWindow::slotFileVerifyCustom() { - QStringList *keyList; - keyList = mKeyList->getChecked(); - new FileEncryptionDialog(mCtx, *keyList, FileEncryptionDialog::Verify, this); -} void MainWindow::slotOpenFile(QString &path) { edit->slotOpenFile(path); } void MainWindow::slotVersionUpgrade(const QString ¤tVersion, const QString &latestVersion) { - if(currentVersion < latestVersion) { + if (currentVersion < latestVersion) { QMessageBox::warning(this, tr("Outdated Version"), tr("This version(%1) is out of date, please update the latest version in time. ").arg( currentVersion) + tr("You can download the latest version(%1) on Github Releases Page.<br/>").arg( latestVersion)); - } else if(currentVersion > latestVersion) { + } else if (currentVersion > latestVersion) { QMessageBox::warning(this, tr("Unreleased Version"), tr("This version(%1) has not been officially released and is not recommended for use in a production environment. <br/>").arg( diff --git a/src/ui/settings/SettingsAdvanced.cpp b/src/ui/settings/SettingsAdvanced.cpp new file mode 100644 index 00000000..30414250 --- /dev/null +++ b/src/ui/settings/SettingsAdvanced.cpp @@ -0,0 +1,67 @@ +/** + * This file is part of GPGFrontend. + * + * GPGFrontend 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 3 of the License, or + * (at your option) any later version. + * + * Foobar 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 Foobar. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from gpg4usb-team. + * Their source code version also complies with GNU General Public License. + * + * The source code version of this software was modified and released + * by Saturneric<[email protected]> starting on May 12, 2021. + * + */ + +#include "ui/SettingsDialog.h" + +AdvancedTab::AdvancedTab(QWidget *parent) +: QWidget(parent), appPath(qApp->applicationDirPath()), +settings(RESOURCE_DIR(appPath) + "/conf/gpgfrontend.ini", + QSettings::IniFormat) { + /***************************************** + * Steganography Box + *****************************************/ + auto *steganoBox = new QGroupBox(tr("Show Steganography Options")); + auto *steganoBoxLayout = new QHBoxLayout(); + steganoCheckBox = new QCheckBox(tr("Show Steganographic Options."), this); + steganoBoxLayout->addWidget(steganoCheckBox); + steganoBox->setLayout(steganoBoxLayout); + + auto *pubkeyExchangeBox = new QGroupBox(tr("Pubkey Exchange")); + auto *pubkeyExchangeBoxLayout = new QHBoxLayout(); + autoPubkeyExchangeCheckBox = new QCheckBox(tr("Auto Pubkey Exchange"), this); + pubkeyExchangeBoxLayout->addWidget(autoPubkeyExchangeCheckBox); + pubkeyExchangeBox->setLayout(pubkeyExchangeBoxLayout); + + auto *mainLayout = new QVBoxLayout; + mainLayout->addWidget(steganoBox); + mainLayout->addWidget(pubkeyExchangeBox); + setSettings(); + mainLayout->addStretch(1); + setLayout(mainLayout); +} + +void AdvancedTab::setSettings() { + if (settings.value("advanced/steganography").toBool()) { + steganoCheckBox->setCheckState(Qt::Checked); + } + if (settings.value("advanced/autoPubkeyExchange").toBool()) { + autoPubkeyExchangeCheckBox->setCheckState(Qt::Checked); + } +} + +void AdvancedTab::applySettings() { + settings.setValue("advanced/steganography", steganoCheckBox->isChecked()); + settings.setValue("advanced/autoPubkeyExchange", autoPubkeyExchangeCheckBox->isChecked()); +} + diff --git a/src/ui/settings/SettingsAppearance.cpp b/src/ui/settings/SettingsAppearance.cpp new file mode 100644 index 00000000..aeb7ed70 --- /dev/null +++ b/src/ui/settings/SettingsAppearance.cpp @@ -0,0 +1,187 @@ +/** + * This file is part of GPGFrontend. + * + * GPGFrontend 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 3 of the License, or + * (at your option) any later version. + * + * Foobar 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 Foobar. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from gpg4usb-team. + * Their source code version also complies with GNU General Public License. + * + * The source code version of this software was modified and released + * by Saturneric<[email protected]> starting on May 12, 2021. + * + */ + +#include "ui/SettingsDialog.h" + +AppearanceTab::AppearanceTab(QWidget *parent) +: QWidget(parent), appPath(qApp->applicationDirPath()), +settings(RESOURCE_DIR(appPath) + "/conf/gpgfrontend.ini", + QSettings::IniFormat) { + /***************************************** + * Icon-Size-Box + *****************************************/ + auto *iconSizeBox = new QGroupBox(tr("Iconsize")); + iconSizeGroup = new QButtonGroup(); + iconSizeSmall = new QRadioButton(tr("small")); + iconSizeMedium = new QRadioButton(tr("medium")); + iconSizeLarge = new QRadioButton(tr("large")); + + iconSizeGroup->addButton(iconSizeSmall, 1); + iconSizeGroup->addButton(iconSizeMedium, 2); + iconSizeGroup->addButton(iconSizeLarge, 3); + + auto *iconSizeBoxLayout = new QHBoxLayout(); + iconSizeBoxLayout->addWidget(iconSizeSmall); + iconSizeBoxLayout->addWidget(iconSizeMedium); + iconSizeBoxLayout->addWidget(iconSizeLarge); + + iconSizeBox->setLayout(iconSizeBoxLayout); + + /***************************************** + * Icon-Style-Box + *****************************************/ + auto *iconStyleBox = new QGroupBox(tr("Iconstyle")); + iconStyleGroup = new QButtonGroup(); + iconTextButton = new QRadioButton(tr("just text")); + iconIconsButton = new QRadioButton(tr("just icons")); + iconAllButton = new QRadioButton(tr("text and icons")); + + iconStyleGroup->addButton(iconTextButton, 1); + iconStyleGroup->addButton(iconIconsButton, 2); + iconStyleGroup->addButton(iconAllButton, 3); + + auto *iconStyleBoxLayout = new QHBoxLayout(); + iconStyleBoxLayout->addWidget(iconTextButton); + iconStyleBoxLayout->addWidget(iconIconsButton); + iconStyleBoxLayout->addWidget(iconAllButton); + + iconStyleBox->setLayout(iconStyleBoxLayout); + + /***************************************** + * Window-Size-Box + *****************************************/ + auto *windowSizeBox = new QGroupBox(tr("Windowstate")); + auto *windowSizeBoxLayout = new QHBoxLayout(); + windowSizeCheckBox = + new QCheckBox(tr("Save window size and position on exit."), this); + windowSizeBoxLayout->addWidget(windowSizeCheckBox); + windowSizeBox->setLayout(windowSizeBoxLayout); + + /***************************************** + * Info-Board-Font-Size-Box + *****************************************/ + + auto *infoBoardBox = new QGroupBox(tr("Information Board")); + auto *infoBoardLayout = new QHBoxLayout(); + infoBoardFontSizeSpin = new QSpinBox(); + infoBoardFontSizeSpin->setRange(9, 18); + infoBoardFontSizeSpin->setValue(10); + infoBoardFontSizeSpin->setSingleStep(1); + infoBoardLayout->addWidget(new QLabel(tr(" Front Size"))); + infoBoardLayout->addWidget(infoBoardFontSizeSpin); + infoBoardBox->setLayout(infoBoardLayout); + + auto *mainLayout = new QVBoxLayout; + mainLayout->addWidget(iconSizeBox); + mainLayout->addWidget(iconStyleBox); + mainLayout->addWidget(windowSizeBox); + mainLayout->addWidget(infoBoardBox); + mainLayout->addStretch(1); + setSettings(); + setLayout(mainLayout); +} + +/********************************** + * Read the settings from config + * and set the buttons and checkboxes + * appropriately + **********************************/ +void AppearanceTab::setSettings() { + + // Iconsize + QSize iconSize = settings.value("toolbar/iconsize", QSize(24, 24)).toSize(); + switch (iconSize.height()) { + case 12: + iconSizeSmall->setChecked(true); + break; + case 24: + iconSizeMedium->setChecked(true); + break; + case 32: + iconSizeLarge->setChecked(true); + break; + } + // Iconstyle + Qt::ToolButtonStyle iconStyle = static_cast<Qt::ToolButtonStyle>( + settings.value("toolbar/iconstyle", Qt::ToolButtonTextUnderIcon) + .toUInt()); + switch (iconStyle) { + case Qt::ToolButtonTextOnly: + iconTextButton->setChecked(true); + break; + case Qt::ToolButtonIconOnly: + iconIconsButton->setChecked(true); + break; + case Qt::ToolButtonTextUnderIcon: + iconAllButton->setChecked(true); + break; + default: + break; + } + + // Window Save and Position + if (settings.value("window/windowSave").toBool()) + windowSizeCheckBox->setCheckState(Qt::Checked); + + // infoBoardFontSize + auto infoBoardFontSize = settings.value("informationBoard/fontSize", 10).toInt(); + if (infoBoardFontSize < 9 || infoBoardFontSize > 18) + infoBoardFontSize = 10; + infoBoardFontSizeSpin->setValue(infoBoardFontSize); +} + +/*********************************** + * get the values of the buttons and + * write them to settings-file + *************************************/ +void AppearanceTab::applySettings() { + switch (iconSizeGroup->checkedId()) { + case 1: + settings.setValue("toolbar/iconsize", QSize(12, 12)); + break; + case 2: + settings.setValue("toolbar/iconsize", QSize(24, 24)); + break; + case 3: + settings.setValue("toolbar/iconsize", QSize(32, 32)); + break; + } + + switch (iconStyleGroup->checkedId()) { + case 1: + settings.setValue("toolbar/iconstyle", Qt::ToolButtonTextOnly); + break; + case 2: + settings.setValue("toolbar/iconstyle", Qt::ToolButtonIconOnly); + break; + case 3: + settings.setValue("toolbar/iconstyle", Qt::ToolButtonTextUnderIcon); + break; + } + + settings.setValue("window/windowSave", windowSizeCheckBox->isChecked()); + + settings.setValue("informationBoard/fontSize", infoBoardFontSizeSpin->value()); +} + diff --git a/src/ui/settings/SettingsDialog.cpp b/src/ui/settings/SettingsDialog.cpp new file mode 100644 index 00000000..0ca188f7 --- /dev/null +++ b/src/ui/settings/SettingsDialog.cpp @@ -0,0 +1,205 @@ +/** + * This file is part of GPGFrontend. + * + * GPGFrontend 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 3 of the License, or + * (at your option) any later version. + * + * Foobar 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 Foobar. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from gpg4usb-team. + * Their source code version also complies with GNU General Public License. + * + * The source code version of this software was modified and released + * by Saturneric<[email protected]> starting on May 12, 2021. + * + */ + +#include "ui/SettingsDialog.h" +#include "ui/WaitingDialog.h" + +SettingsDialog::SettingsDialog(GpgME::GpgContext *ctx, QWidget *parent) + : QDialog(parent) { + mCtx = ctx; + tabWidget = new QTabWidget; + generalTab = new GeneralTab(mCtx); + appearanceTab = new AppearanceTab; + sendMailTab = new SendMailTab; + keyserverTab = new KeyserverTab; + advancedTab = new AdvancedTab; + gpgPathsTab = new GpgPathsTab; + + tabWidget->addTab(generalTab, tr("General")); + tabWidget->addTab(appearanceTab, tr("Appearance")); + tabWidget->addTab(sendMailTab, tr("Send Mail")); + tabWidget->addTab(keyserverTab, tr("Key Server")); + // tabWidget->addTab(gpgPathsTab, tr("Gpg paths")); + tabWidget->addTab(advancedTab, tr("Advanced")); + + buttonBox = + new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); + + connect(buttonBox, SIGNAL(accepted()), this, SLOT(slotAccept())); + connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); + + auto *mainLayout = new QVBoxLayout; + mainLayout->addWidget(tabWidget); + mainLayout->stretch(0); + mainLayout->addWidget(buttonBox); + mainLayout->stretch(0); + setLayout(mainLayout); + + setWindowTitle(tr("Settings")); + + // slots for handling the restartneeded member + this->slotSetRestartNeeded(false); + connect(generalTab, SIGNAL(signalRestartNeeded(bool)), this, + SLOT(slotSetRestartNeeded(bool))); + connect(appearanceTab, SIGNAL(signalRestartNeeded(bool)), this, + SLOT(slotSetRestartNeeded(bool))); + connect(sendMailTab, SIGNAL(signalRestartNeeded(bool)), this, + SLOT(slotSetRestartNeeded(bool))); + connect(keyserverTab, SIGNAL(signalRestartNeeded(bool)), this, + SLOT(slotSetRestartNeeded(bool))); + connect(advancedTab, SIGNAL(signalRestartNeeded(bool)), this, + SLOT(slotSetRestartNeeded(bool))); + + connect(this, SIGNAL(signalRestartNeeded(bool)), parent, + SLOT(slotSetRestartNeeded(bool))); + + this->resize(480, 640); + this->show(); +} + +bool SettingsDialog::getRestartNeeded() const { return this->restartNeeded; } + +void SettingsDialog::slotSetRestartNeeded(bool needed) { + this->restartNeeded = needed; +} + +void SettingsDialog::slotAccept() { + generalTab->applySettings(); + sendMailTab->applySettings(); + appearanceTab->applySettings(); + keyserverTab->applySettings(); + advancedTab->applySettings(); + gpgPathsTab->applySettings(); + if (getRestartNeeded()) { + emit signalRestartNeeded(true); + } + close(); +} + +// http://www.informit.com/articles/article.aspx?p=1405555&seqNum=3 +// http://developer.qt.nokia.com/wiki/How_to_create_a_multi_language_application +QHash<QString, QString> SettingsDialog::listLanguages() { + QHash<QString, QString> languages; + + languages.insert("", tr("System Default")); + + QString appPath = qApp->applicationDirPath(); + QDir qmDir = QDir(RESOURCE_DIR(appPath) + "/ts/"); + QStringList fileNames = qmDir.entryList(QStringList("gpgfrontend_*.qm")); + + for (int i = 0; i < fileNames.size(); ++i) { + QString locale = fileNames[i]; + locale.truncate(locale.lastIndexOf('.')); + locale.remove(0, locale.indexOf('_') + 1); + + // this works in qt 4.8 + QLocale qloc(locale); +#if QT_VERSION < 0x040800 + QString language = + QLocale::languageToString(qloc.language()) + " (" + locale + + ")"; //+ " (" + QLocale::languageToString(qloc.language()) + ")"; +#else + QString language = qloc.nativeLanguageName() + " (" + locale + ")"; +#endif + languages.insert(locale, language); + } + return languages; +} + +GpgPathsTab::GpgPathsTab(QWidget *parent) + : QWidget(parent), appPath(qApp->applicationDirPath()), + settings(RESOURCE_DIR(appPath) + "/conf/gpgfrontend.ini", + QSettings::IniFormat) { + setSettings(); + + /***************************************** + * Keydb Box + *****************************************/ + auto *keydbBox = new QGroupBox(tr("Relative path to keydb")); + auto *keydbBoxLayout = new QGridLayout(); + + // Label containing the current keydbpath relative to default keydb path + keydbLabel = new QLabel(accKeydbPath, this); + + auto *keydbButton = new QPushButton("Change keydb path", this); + connect(keydbButton, SIGNAL(clicked()), this, SLOT(chooseKeydbDir())); + auto *keydbDefaultButton = new QPushButton("Set keydb to default path", this); + connect(keydbDefaultButton, SIGNAL(clicked()), this, + SLOT(setKeydbPathToDefault())); + + keydbBox->setLayout(keydbBoxLayout); + keydbBoxLayout->addWidget(new QLabel(tr("Current keydb path: ")), 1, 1); + keydbBoxLayout->addWidget(keydbLabel, 1, 2); + keydbBoxLayout->addWidget(keydbButton, 1, 3); + keydbBoxLayout->addWidget(keydbDefaultButton, 2, 3); + keydbBoxLayout->addWidget( + new QLabel(tr("<b>NOTE: </b> Gpg4usb will restart automatically if you " + "change the keydb path!")), + 3, 1, 1, 3); + + auto *mainLayout = new QVBoxLayout; + mainLayout->addWidget(keydbBox); + mainLayout->addStretch(1); + setLayout(mainLayout); +} + +QString GpgPathsTab::getRelativePath(const QString &dir1, const QString &dir2) { + QDir dir(dir1); + QString s; + + s = dir.relativeFilePath(dir2); + qDebug() << "relative path: " << s; + if (s.isEmpty()) { + s = "."; + } + return s; +} + +void GpgPathsTab::setKeydbPathToDefault() { + accKeydbPath = "."; + keydbLabel->setText("."); +} + +QString GpgPathsTab::chooseKeydbDir() { + QString dir = QFileDialog::getExistingDirectory( + this, tr("Choose keydb directory"), accKeydbPath, + QFileDialog::ShowDirsOnly); + + accKeydbPath = getRelativePath(defKeydbPath, dir); + keydbLabel->setText(accKeydbPath); + return ""; +} + +void GpgPathsTab::setSettings() { + defKeydbPath = qApp->applicationDirPath() + "/keydb"; + + accKeydbPath = settings.value("gpgpaths/keydbpath").toString(); + if (accKeydbPath.isEmpty()) { + accKeydbPath = "."; + } +} + +void GpgPathsTab::applySettings() { + settings.setValue("gpgpaths/keydbpath", accKeydbPath); +} diff --git a/src/ui/settings/SettingsGeneral.cpp b/src/ui/settings/SettingsGeneral.cpp new file mode 100644 index 00000000..bec66154 --- /dev/null +++ b/src/ui/settings/SettingsGeneral.cpp @@ -0,0 +1,358 @@ +/** + * This file is part of GPGFrontend. + * + * GPGFrontend 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 3 of the License, or + * (at your option) any later version. + * + * Foobar 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 Foobar. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from gpg4usb-team. + * Their source code version also complies with GNU General Public License. + * + * The source code version of this software was modified and released + * by Saturneric<[email protected]> starting on May 12, 2021. + * + */ + +#include "ui/SettingsDialog.h" +#include "ui/WaitingDialog.h" +#include "server/ComUtils.h" + +#include "rapidjson/prettywriter.h" + +GeneralTab::GeneralTab(GpgME::GpgContext *ctx, QWidget *parent) + : QWidget(parent), appPath(qApp->applicationDirPath()), + settings(RESOURCE_DIR(appPath) + "/conf/gpgfrontend.ini", + QSettings::IniFormat) { + mCtx = ctx; + + /***************************************** + * GpgFrontend Server + *****************************************/ + auto *serverBox = new QGroupBox(tr("GpgFrontend Server")); + auto *serverBoxLayout = new QVBoxLayout(); + serverSelectBox = new QComboBox(); + serverBoxLayout->addWidget(serverSelectBox); + serverBoxLayout->addWidget(new QLabel( + tr("Server that provides short key and key exchange services"))); + + serverBox->setLayout(serverBoxLayout); + + /***************************************** + * Save-Checked-Keys-Box + *****************************************/ + auto *saveCheckedKeysBox = new QGroupBox(tr("Save Checked Keys")); + auto *saveCheckedKeysBoxLayout = new QHBoxLayout(); + saveCheckedKeysCheckBox = new QCheckBox( + tr("Save checked private keys on exit and restore them on next start."), + this); + saveCheckedKeysBoxLayout->addWidget(saveCheckedKeysCheckBox); + saveCheckedKeysBox->setLayout(saveCheckedKeysBoxLayout); + + /***************************************** + * Key-Impport-Confirmation Box + *****************************************/ + auto *importConfirmationBox = + new QGroupBox(tr("Confirm drag'n'drop key import")); + auto *importConfirmationBoxLayout = new QHBoxLayout(); + importConfirmationCheckBox = new QCheckBox( + tr("Import files dropped on the keylist without confirmation."), this); + importConfirmationBoxLayout->addWidget(importConfirmationCheckBox); + importConfirmationBox->setLayout(importConfirmationBoxLayout); + + /***************************************** + * Language Select Box + *****************************************/ + auto *langBox = new QGroupBox(tr("Language")); + auto *langBoxLayout = new QVBoxLayout(); + langSelectBox = new QComboBox; + lang = SettingsDialog::listLanguages(); + + for (const auto &l: lang) { langSelectBox->addItem(l); } + + langBoxLayout->addWidget(langSelectBox); + langBoxLayout->addWidget( + new QLabel(tr("<b>NOTE: </b> GpgFrontend will restart automatically if " + "you change the language!"))); + langBox->setLayout(langBoxLayout); + connect(langSelectBox, SIGNAL(currentIndexChanged(int)), this, + SLOT(slotLanguageChanged())); + + /***************************************** + * Own Key Select Box + *****************************************/ + auto *ownKeyBox = new QGroupBox(tr("Own key")); + auto *ownKeyBoxLayout = new QVBoxLayout(); + auto *ownKeyServiceTokenLayout = new QHBoxLayout(); + ownKeySelectBox = new QComboBox; + getServiceTokenButton = new QPushButton(tr("Get Service Token")); + serviceTokenLabel = new QLabel(tr("No Service Token Found")); + serviceTokenLabel->setAlignment(Qt::AlignCenter); + + ownKeyBox->setLayout(ownKeyBoxLayout); + mKeyList = new KeyList(mCtx); + + // Fill the keyid hashmap + keyIds.insert("", tr("<none>")); + + for (const auto &keyid : *mKeyList->getAllPrivateKeys()) { + auto key = mCtx->getKeyById(keyid); + if (!key.good) continue; + keyIds.insert(key.id, key.uids.first().uid); + } + for (const auto &k : keyIds.keys()) { + ownKeySelectBox->addItem(keyIds.find(k).value()); + keyIdsList.append(k); + } + connect(ownKeySelectBox, SIGNAL(currentIndexChanged(int)), this, + SLOT(slotOwnKeyIdChanged())); + connect(getServiceTokenButton, SIGNAL(clicked(bool)), this, + SLOT(slotGetServiceToken())); + + ownKeyBoxLayout->addWidget(new QLabel( + tr("Key pair for synchronization and identity authentication"))); + ownKeyBoxLayout->addWidget(ownKeySelectBox); + ownKeyBoxLayout->addLayout(ownKeyServiceTokenLayout); + ownKeyServiceTokenLayout->addWidget(getServiceTokenButton); + ownKeyServiceTokenLayout->addWidget(serviceTokenLabel); + ownKeyServiceTokenLayout->stretch(0); + + /***************************************** + * Mainlayout + *****************************************/ + auto *mainLayout = new QVBoxLayout; + mainLayout->addWidget(serverBox); + mainLayout->addWidget(saveCheckedKeysBox); + mainLayout->addWidget(importConfirmationBox); + mainLayout->addWidget(langBox); + mainLayout->addWidget(ownKeyBox); + + setSettings(); + mainLayout->addStretch(1); + setLayout(mainLayout); +} + +/********************************** + * Read the settings from config + * and set the buttons and checkboxes + * appropriately + **********************************/ +void GeneralTab::setSettings() { + // Keysaving + if (settings.value("keys/saveKeyChecked").toBool()) { + saveCheckedKeysCheckBox->setCheckState(Qt::Checked); + } + + auto serverList = settings.value("general/gpgfrontendServerList").toStringList(); + if (serverList.empty()) { + serverList.append("service.gpgfrontend.pub"); + serverList.append("localhost"); + } + for (const auto &s : serverList) + serverSelectBox->addItem(s); + + qDebug() << "Current Gpgfrontend Server" << settings.value("general/currentGpgfrontendServer").toString(); + serverSelectBox->setCurrentText(settings.value("general/currentGpgfrontendServer", + "service.gpgfrontend.pub").toString()); + + connect(serverSelectBox, QOverload<const QString &>::of(&QComboBox::currentTextChanged), + this, [&](const QString ¤t) -> void { + settings.setValue("general/currentGpgfrontendServer", current); + }); + + // Language setting + QString langKey = settings.value("int/lang").toString(); + QString langValue = lang.value(langKey); + if (langKey != "") { + langSelectBox->setCurrentIndex(langSelectBox->findText(langValue)); + } + + QString own_key_id = settings.value("general/ownKeyId").toString(); + qDebug() << "OwnKeyId" << own_key_id; + if (own_key_id.isEmpty()) { + ownKeySelectBox->setCurrentText("<none>"); + } else { + const auto text = keyIds.find(own_key_id).value(); + qDebug() << "OwnKey" << own_key_id << text; + ownKeySelectBox->setCurrentText(text); + } + + serviceToken = settings.value("general/serviceToken").toString(); + qDebug() << "Load Service Token" << serviceToken; + if (!serviceToken.isEmpty()) { + serviceTokenLabel->setText(serviceToken); + } + + // Get own key information from keydb/gpg.conf (if contained) + if (settings.value("general/confirmImportKeys", Qt::Checked).toBool()) { + importConfirmationCheckBox->setCheckState(Qt::Checked); + } +} + +/*********************************** + * get the values of the buttons and + * write them to settings-file + *************************************/ +void GeneralTab::applySettings() { + settings.setValue("keys/saveKeyChecked", + saveCheckedKeysCheckBox->isChecked()); + + qDebug() << "serverSelectBox currentText" << serverSelectBox->currentText(); + settings.setValue("general/currentGpgfrontendServer", + serverSelectBox->currentText()); + + auto *serverList = new QStringList(); + for (int i = 0; i < serverSelectBox->count(); i++) + serverList->append(serverSelectBox->itemText(i)); + settings.setValue("general/gpgfrontendServerList", + *serverList); + delete serverList; + + settings.setValue("int/lang", lang.key(langSelectBox->currentText())); + + settings.setValue("general/ownKeyId", + keyIdsList[ownKeySelectBox->currentIndex()]); + + settings.setValue("general/serviceToken", + serviceToken); + + settings.setValue("general/confirmImportKeys", + importConfirmationCheckBox->isChecked()); +} + +void GeneralTab::slotLanguageChanged() { emit signalRestartNeeded(true); } + +void GeneralTab::slotOwnKeyIdChanged() { + // Set ownKeyId to currently selected + this->serviceTokenLabel->setText(tr("No Service Token Found")); + serviceToken.clear(); +} + +void GeneralTab::slotGetServiceToken() { + + auto utils = new ComUtils(this); + + QUrl reqUrl(utils->getUrl(ComUtils::GetServiceToken)); + QNetworkRequest request(reqUrl); + request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); + + + const auto keyId = keyIdsList[ownKeySelectBox->currentIndex()]; + + qDebug() << "KeyId" << keyIdsList[ownKeySelectBox->currentIndex()]; + + if (keyId.isEmpty()) { + QMessageBox::critical(this, tr("Invalid Operation"), + tr("Own Key can not be None while getting service token.")); + return; + } + + QStringList selectedKeyIds(keyIdsList[ownKeySelectBox->currentIndex()]); + + QByteArray keyDataBuf; + mCtx->exportKeys(&selectedKeyIds, &keyDataBuf); + + GpgKey key = mCtx->getKeyById(keyId); + + if (!key.good) { + QMessageBox::critical(this, tr("Error"), + tr("Key Not Exists")); + return; + } + + qDebug() << "keyDataBuf" << keyDataBuf; + + /** + * { + * "publicKey" : ... + * "sha": ... + * "signedFpr": ... + * "version": ... + * } + */ + + QCryptographicHash shaGen(QCryptographicHash::Sha256); + shaGen.addData(keyDataBuf); + + auto shaStr = shaGen.result().toHex(); + + auto signFprStr = ComUtils::getSignStringBase64(mCtx, key.fpr, key); + + rapidjson::Value pubkey, ver, sha, signFpr; + + rapidjson::Document doc; + doc.SetObject(); + + pubkey.SetString(keyDataBuf.constData(), keyDataBuf.count()); + + auto version = qApp->applicationVersion(); + ver.SetString(version.toUtf8().constData(), qApp->applicationVersion().count()); + + sha.SetString(shaStr.constData(), shaStr.count()); + signFpr.SetString(signFprStr.constData(), signFprStr.count()); + + rapidjson::Document::AllocatorType &allocator = doc.GetAllocator(); + + doc.AddMember("publicKey", pubkey, allocator); + doc.AddMember("sha", sha, allocator); + doc.AddMember("signedFpr", signFpr, allocator); + doc.AddMember("version", ver, allocator); + + rapidjson::StringBuffer sb; + rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(sb); + doc.Accept(writer); + + QByteArray postData(sb.GetString()); + + QNetworkReply *reply = utils->getNetworkManager().post(request, postData); + + // Show Waiting Dailog + auto dialog = new WaitingDialog("Getting Token From Server", this); + dialog->show(); + + while (reply->isRunning()) { + QApplication::processEvents(); + } + + dialog->close(); + + if (utils->checkServerReply(reply->readAll().constData())) { + + /** + * { + * "serviceToken" : ... + * "fpr": ... + * } + */ + + if (!utils->checkDataValueStr("serviceToken") || !utils->checkDataValueStr("fpr")) { + QMessageBox::critical(this, tr("Error"), + tr("The communication content with the server does not meet the requirements")); + return; + } + + QString serviceTokenTemp = utils->getDataValueStr("serviceToken"); + QString fpr = utils->getDataValueStr("fpr"); + auto key = mCtx->getKeyByFpr(fpr); + if (utils->checkServiceTokenFormat(serviceTokenTemp) && key.good) { + serviceToken = serviceTokenTemp; + qDebug() << "Get Service Token" << serviceToken; + // Auto update settings + settings.setValue("general/serviceToken", serviceToken); + serviceTokenLabel->setText(serviceToken); + QMessageBox::information(this, tr("Notice"), + tr("Succeed in getting service token")); + } else { + QMessageBox::critical(this, tr("Error"), tr("There is a problem with the communication with the server")); + } + } + +} diff --git a/src/ui/settings/SettingsKeyServer.cpp b/src/ui/settings/SettingsKeyServer.cpp new file mode 100644 index 00000000..b49eb9e0 --- /dev/null +++ b/src/ui/settings/SettingsKeyServer.cpp @@ -0,0 +1,148 @@ +/** + * This file is part of GPGFrontend. + * + * GPGFrontend 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 3 of the License, or + * (at your option) any later version. + * + * Foobar 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 Foobar. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from gpg4usb-team. + * Their source code version also complies with GNU General Public License. + * + * The source code version of this software was modified and released + * by Saturneric<[email protected]> starting on May 12, 2021. + * + */ + +#include "ui/SettingsDialog.h" + +KeyserverTab::KeyserverTab(QWidget *parent) + : QWidget(parent), appPath(qApp->applicationDirPath()), + settings(RESOURCE_DIR(appPath) + "/conf/gpgfrontend.ini", + QSettings::IniFormat) { + + auto generalGroupBox = new QGroupBox(tr("General")); + auto generalLayout = new QVBoxLayout(); + + keyServerTable = new QTableWidget(); + keyServerTable->setColumnCount(3); + keyServerTable->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); + keyServerTable->horizontalHeader()->setStretchLastSection(false); + keyServerTable->verticalHeader()->hide(); + keyServerTable->setShowGrid(false); + keyServerTable->sortByColumn(0, Qt::AscendingOrder); + keyServerTable->setSelectionBehavior(QAbstractItemView::SelectRows); + keyServerTable->setSelectionMode(QAbstractItemView::SingleSelection); + + // tableitems not editable + keyServerTable->setEditTriggers(QAbstractItemView::NoEditTriggers); + // no focus (rectangle around tableitems) + // may be it should focus on whole row + keyServerTable->setFocusPolicy(Qt::NoFocus); + keyServerTable->setAlternatingRowColors(true); + + QStringList labels; + labels << tr("No.") << tr("Address") << tr("Available"); + keyServerTable->setHorizontalHeaderLabels(labels); + + auto *mainLayout = new QVBoxLayout(this); + auto *label = new QLabel(tr("Default Key Server for Import:")); + + comboBox = new QComboBox; + comboBox->setEditable(false); + comboBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); + + auto *addKeyServerBox = new QWidget(this); + auto *addKeyServerLayout = new QHBoxLayout(addKeyServerBox); + auto *http = new QLabel("URL: "); + newKeyServerEdit = new QLineEdit(this); + auto *newKeyServerButton = new QPushButton(tr("Add"), this); + connect(newKeyServerButton, SIGNAL(clicked()), this, SLOT(addKeyServer())); + addKeyServerLayout->addWidget(http); + addKeyServerLayout->addWidget(newKeyServerEdit); + addKeyServerLayout->addWidget(newKeyServerButton); + + generalLayout->addWidget(label); + generalLayout->addWidget(comboBox); + generalLayout->addWidget(keyServerTable); + generalLayout->addWidget(addKeyServerBox); + generalLayout->addStretch(0); + + generalGroupBox->setLayout(generalLayout); + mainLayout->addWidget(generalGroupBox); + mainLayout->addStretch(0); + + setLayout(mainLayout); + // Read keylist from ini-file and fill it into combobox + setSettings(); + refreshTable(); +} + +/********************************** + * Read the settings from config + * and set the buttons and checkboxes + * appropriately + **********************************/ +void KeyserverTab::setSettings() { + + keyServerStrList = settings.value("keyserver/keyServerList").toStringList(); + + for (const auto &keyServer : keyServerStrList) { + comboBox->addItem(keyServer); + qDebug() << "KeyserverTab Get ListItemText" << keyServer; + } + + comboBox->setCurrentText( + settings.value("keyserver/defaultKeyServer").toString()); + +} + +void KeyserverTab::addKeyServer() { + QString targetUrl; + if (newKeyServerEdit->text().startsWith("http://") || + newKeyServerEdit->text().startsWith("https://")) + targetUrl = newKeyServerEdit->text(); + else + targetUrl = "http://" + newKeyServerEdit->text(); + keyServerStrList.append(targetUrl); + comboBox->addItem(targetUrl); + refreshTable(); +} + +/*********************************** + * get the values of the buttons and + * write them to settings-file + *************************************/ +void KeyserverTab::applySettings() { + settings.setValue("keyserver/keyServerList", keyServerStrList); + settings.setValue("keyserver/defaultKeyServer", comboBox->currentText()); +} + +void KeyserverTab::refreshTable() { + + qDebug() << "Start Refreshing Key Server Table"; + + keyServerTable->setRowCount(keyServerStrList.size()); + + int index = 0; + for (const auto &server : keyServerStrList) { + auto *tmp1 = new QTableWidgetItem(QString::number(index)); + tmp1->setTextAlignment(Qt::AlignCenter); + keyServerTable->setItem(index, 0, tmp1); + auto *tmp2 = new QTableWidgetItem(server); + tmp2->setTextAlignment(Qt::AlignCenter); + keyServerTable->setItem(index, 1, tmp2); + auto *tmp3 = new QTableWidgetItem(""); + tmp3->setTextAlignment(Qt::AlignCenter); + keyServerTable->setItem(index, 2, tmp3); + index++; + } +} diff --git a/src/ui/settings/SettingsSendMail.cpp b/src/ui/settings/SettingsSendMail.cpp new file mode 100644 index 00000000..a5e3274f --- /dev/null +++ b/src/ui/settings/SettingsSendMail.cpp @@ -0,0 +1,193 @@ +/** + * This file is part of GPGFrontend. + * + * GPGFrontend 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 3 of the License, or + * (at your option) any later version. + * + * Foobar 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 Foobar. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from gpg4usb-team. + * Their source code version also complies with GNU General Public License. + * + * The source code version of this software was modified and released + * by Saturneric<[email protected]> starting on May 12, 2021. + * + */ + +#include "ui/SettingsDialog.h" +#include "smtp/SmtpMime" + +SendMailTab::SendMailTab(QWidget *parent) + : QWidget(parent), appPath(qApp->applicationDirPath()), + settings(RESOURCE_DIR(appPath) + "/conf/gpgfrontend.ini", + QSettings::IniFormat) { + + enableCheckBox = new QCheckBox(tr("Enable")); + enableCheckBox->setTristate(false); + + smtpAddress = new QLineEdit(); + username = new QLineEdit(); + password = new QLineEdit(); + password->setEchoMode(QLineEdit::Password); + + portSpin = new QSpinBox(); + portSpin->setMinimum(1); + portSpin->setMaximum(65535); + connectionTypeComboBox = new QComboBox(); + connectionTypeComboBox->addItem("None"); + connectionTypeComboBox->addItem("SSL"); + connectionTypeComboBox->addItem("TLS"); + connectionTypeComboBox->addItem("STARTTLS"); + + defaultSender = new QLineEdit();; + checkConnectionButton = new QPushButton(tr("Check Connection")); + + auto generalGroupBox = new QGroupBox(tr("General")); + auto connectGroupBox = new QGroupBox(tr("Connection")); + auto preferenceGroupBox = new QGroupBox(tr("Preference")); + + auto generalLayout = new QGridLayout(); + generalLayout->addWidget(enableCheckBox); + + auto connectLayout = new QGridLayout(); + connectLayout->addWidget(new QLabel(tr("SMTP Address")), 1, 0); + connectLayout->addWidget(smtpAddress, 1, 1, 1, 4); + connectLayout->addWidget(new QLabel(tr("Username")), 2, 0); + connectLayout->addWidget(username, 2, 1, 1, 4); + connectLayout->addWidget(new QLabel(tr("Password")), 3, 0); + connectLayout->addWidget(password, 3, 1, 1, 4); + connectLayout->addWidget(new QLabel(tr("Port")), 4, 0); + connectLayout->addWidget(portSpin, 4, 1, 1, 1); + connectLayout->addWidget(new QLabel(tr("Connection Security")), 5, 0); + connectLayout->addWidget(connectionTypeComboBox, 5, 1, 1, 1); + connectLayout->addWidget(checkConnectionButton, 6, 0); + + auto preferenceLayout = new QGridLayout(); + + preferenceLayout->addWidget(new QLabel(tr("Default Sender")), 0, 0); + preferenceLayout->addWidget(defaultSender, 0, 1, 1, 4); + + generalGroupBox->setLayout(generalLayout); + connectGroupBox->setLayout(connectLayout); + preferenceGroupBox->setLayout(preferenceLayout); + + auto vBox = new QVBoxLayout(); + vBox->addWidget(generalGroupBox); + vBox->addWidget(connectGroupBox); + vBox->addWidget(preferenceGroupBox); + vBox->addStretch(0); + + connect(enableCheckBox, SIGNAL(stateChanged(int)), this, SLOT(slotCheckBoxSetEnableDisable(int))); + connect(checkConnectionButton, SIGNAL(clicked(bool)), this, SLOT(slotCheckConnection())); + + + this->setLayout(vBox); + setSettings(); +} + +/********************************** + * Read the settings from config + * and set the buttons and checkboxes + * appropriately + **********************************/ +void SendMailTab::setSettings() { + + if (settings.value("sendMail/enable", false).toBool()) + enableCheckBox->setCheckState(Qt::Checked); + else { + enableCheckBox->setCheckState(Qt::Unchecked); + smtpAddress->setDisabled(true); + username->setDisabled(true); + password->setDisabled(true); + portSpin->setDisabled(true); + connectionTypeComboBox->setDisabled(true); + defaultSender->setDisabled(true); + checkConnectionButton->setDisabled(true); + } + + smtpAddress->setText(settings.value("sendMail/smtpAddress", QString()).toString()); + username->setText(settings.value("sendMail/username", QString()).toString()); + password->setText(settings.value("sendMail/password", QString()).toString()); + portSpin->setValue(settings.value("sendMail/port", 25).toInt()); + connectionTypeComboBox->setCurrentText(settings.value("sendMail/connectionType", "None").toString()); + defaultSender->setText(settings.value("sendMail/defaultSender", QString()).toString()); + +} + +/*********************************** + * get the values of the buttons and + * write them to settings-file + *************************************/ +void SendMailTab::applySettings() { + + settings.setValue("sendMail/smtpAddress", smtpAddress->text()); + settings.setValue("sendMail/username", username->text()); + settings.setValue("sendMail/password", password->text()); + settings.setValue("sendMail/port", portSpin->value()); + settings.setValue("sendMail/connectionType", connectionTypeComboBox->currentText()); + settings.setValue("sendMail/defaultSender", defaultSender->text()); + + settings.setValue("sendMail/enable", enableCheckBox->isChecked()); +} + +void SendMailTab::slotCheckConnection() { + + SmtpClient::ConnectionType connectionType; + const auto selectedConnType = connectionTypeComboBox->currentText(); + if (selectedConnType == "SSL") { + connectionType = SmtpClient::ConnectionType::SslConnection; + } else if (selectedConnType == "TLS" || selectedConnType == "STARTTLS") { + connectionType = SmtpClient::ConnectionType::TlsConnection; + } else { + connectionType = SmtpClient::ConnectionType::TcpConnection; + } + + SmtpClient smtp(smtpAddress->text(), portSpin->value(), connectionType); + + smtp.setUser(username->text()); + smtp.setPassword(password->text()); + + bool if_success = true; + + if (!smtp.connectToHost()) { + QMessageBox::critical(this, tr("Fail"), tr("Fail to Connect SMTP Server")); + if_success = false; + } + if (if_success && !smtp.login()) { + QMessageBox::critical(this, tr("Fail"), tr("Fail to Login")); + if_success = false; + } + + if (if_success) + QMessageBox::information(this, tr("Success"), tr("Succeed in connecting and login")); + +} + +void SendMailTab::slotCheckBoxSetEnableDisable(int state) { + if (state == Qt::Checked) { + smtpAddress->setEnabled(true); + username->setEnabled(true); + password->setEnabled(true); + portSpin->setEnabled(true); + connectionTypeComboBox->setEnabled(true); + defaultSender->setEnabled(true); + checkConnectionButton->setEnabled(true); + } else { + smtpAddress->setDisabled(true); + username->setDisabled(true); + password->setDisabled(true); + portSpin->setDisabled(true); + connectionTypeComboBox->setDisabled(true); + defaultSender->setDisabled(true); + checkConnectionButton->setDisabled(true); + } +} + diff --git a/src/ui/widgets/EditorPage.cpp b/src/ui/widgets/EditorPage.cpp index 05d5cbea..beb37b96 100644 --- a/src/ui/widgets/EditorPage.cpp +++ b/src/ui/widgets/EditorPage.cpp @@ -44,8 +44,6 @@ EditorPage::EditorPage(QString filePath, QWidget *parent) : QWidget(parent), // Front in same width this->setFont({"Courier"}); - - connect(textPage, SIGNAL(textChanged()), this, SLOT(formatGpgHeader())); } const QString &EditorPage::getFilePath() const { diff --git a/src/ui/widgets/InfoBoardWidget.cpp b/src/ui/widgets/InfoBoardWidget.cpp index f26917a4..b9372c59 100644 --- a/src/ui/widgets/InfoBoardWidget.cpp +++ b/src/ui/widgets/InfoBoardWidget.cpp @@ -50,11 +50,11 @@ InfoBoardWidget::InfoBoardWidget(QWidget *parent, GpgME::GpgContext *ctx, KeyLis actionButtonMenu->setFixedHeight(36); actionButtonLayout = new QHBoxLayout(); - actionButtonLayout->setContentsMargins(0, 0, 0, 0); + actionButtonLayout->setContentsMargins(5, 5, 5, 5); actionButtonLayout->setSpacing(0); actionButtonMenu->setLayout(actionButtonLayout); - auto label = new QLabel(tr("Optional Actions Menu")); + auto label = new QLabel(tr("Optional Actions")); label->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); label->setContentsMargins(0, 0, 0, 0); @@ -150,25 +150,44 @@ void InfoBoardWidget::associateTabWidget(QTabWidget *tab) { connect(tab, SIGNAL(tabCloseRequested(int)), this, SLOT(slotReset())); } + void InfoBoardWidget::addOptionalAction(const QString &name, const std::function<void()> &action) { auto actionButton = new QPushButton(name); + auto layout = new QHBoxLayout(); + layout->setContentsMargins(5, 0, 5, 0); infoBoard->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); - actionButtonLayout->addWidget(actionButton); + // set margin from surroundings + layout->addWidget(actionButton); + actionButtonLayout->addLayout(layout); connect(actionButton, &QPushButton::clicked, this, [=]() { action(); }); } +/** + * Delete All item in actionButtonLayout + */ void InfoBoardWidget::resetOptionActionsMenu() { - QLayoutItem *item; - while ((item = actionButtonLayout->layout()->takeAt(2)) != nullptr) { - actionButtonLayout->removeItem(item); - delete item->widget(); - delete item; - } + deleteWidgetsInLayout(actionButtonLayout, 2); } void InfoBoardWidget::slotReset() { this->infoBoard->clear(); resetOptionActionsMenu(); } + +/** + * Try Delete all widget from target layout + * @param layout target layout + */ +void InfoBoardWidget::deleteWidgetsInLayout(QLayout *layout, int start_index) { + QLayoutItem *item; + while ((item = layout->layout()->takeAt(start_index)) != nullptr) { + layout->removeItem(item); + if (item->layout() != nullptr) + deleteWidgetsInLayout(item->layout()); + else if (item->widget() != nullptr) + delete item->widget(); + delete item; + } +} diff --git a/src/ui/widgets/KeyList.cpp b/src/ui/widgets/KeyList.cpp index 3929868e..9c9c6763 100644 --- a/src/ui/widgets/KeyList.cpp +++ b/src/ui/widgets/KeyList.cpp @@ -31,8 +31,7 @@ KeyList::KeyList(GpgME::GpgContext *ctx, KeyListColumn::InfoType infoType, QWidget *parent) : QWidget(parent), mSelectType(selectType), mInfoType(infoType), appPath(qApp->applicationDirPath()), - settings(RESOURCE_DIR(appPath) + "/conf/gpgfrontend.ini", QSettings::IniFormat) -{ + settings(RESOURCE_DIR(appPath) + "/conf/gpgfrontend.ini", QSettings::IniFormat) { mCtx = ctx; @@ -43,7 +42,7 @@ KeyList::KeyList(GpgME::GpgContext *ctx, mKeyList->setShowGrid(false); mKeyList->sortByColumn(2, Qt::AscendingOrder); mKeyList->setSelectionBehavior(QAbstractItemView::SelectRows); - mKeyList->setSelectionMode( QAbstractItemView::SingleSelection ); + mKeyList->setSelectionMode(QAbstractItemView::SingleSelection); // tableitems not editable mKeyList->setEditTriggers(QAbstractItemView::NoEditTriggers); @@ -54,22 +53,22 @@ KeyList::KeyList(GpgME::GpgContext *ctx, mKeyList->setAlternatingRowColors(true); // Hidden Column For Purpose - if(!(mInfoType & KeyListColumn::TYPE)) { + if (!(mInfoType & KeyListColumn::TYPE)) { mKeyList->setColumnHidden(1, true); } - if(!(mInfoType & KeyListColumn::NAME)) { + if (!(mInfoType & KeyListColumn::NAME)) { mKeyList->setColumnHidden(2, true); } - if(!(mInfoType & KeyListColumn::EmailAddress)) { + if (!(mInfoType & KeyListColumn::EmailAddress)) { mKeyList->setColumnHidden(3, true); } - if(!(mInfoType & KeyListColumn::Usage)) { + if (!(mInfoType & KeyListColumn::Usage)) { mKeyList->setColumnHidden(4, true); } - if(!(mInfoType & KeyListColumn::Validity)) { + if (!(mInfoType & KeyListColumn::Validity)) { mKeyList->setColumnHidden(5, true); } - if(!(mInfoType & KeyListColumn::FingerPrint)) { + if (!(mInfoType & KeyListColumn::FingerPrint)) { mKeyList->setColumnHidden(6, true); } @@ -95,8 +94,7 @@ KeyList::KeyList(GpgME::GpgContext *ctx, slotRefresh(); } -void KeyList::slotRefresh() -{ +void KeyList::slotRefresh() { QStringList *keyList; keyList = getChecked(); // while filling the table, sort enabled causes errors @@ -110,21 +108,21 @@ void KeyList::slotRefresh() int row_count = 0; while (it != keys.end()) { - if(mFilter != nullptr) { - if(!mFilter(*it)) { + if (mFilter != nullptr) { + if (!mFilter(*it)) { it = keys.erase(it); continue; } } - if(!excluded_key_ids.isEmpty()){ + if (!excluded_key_ids.isEmpty()) { auto iterator = std::find_if(excluded_key_ids.begin(), excluded_key_ids.end(), - [it] (const auto &key_id) -> bool { - if(it->id == key_id) return true; - else return false; - }); + [it](const auto &key_id) -> bool { + if (it->id == key_id) return true; + else return false; + }); - if(iterator != excluded_key_ids.end()) { + if (iterator != excluded_key_ids.end()) { it = keys.erase(it); continue; } @@ -161,10 +159,10 @@ void KeyList::slotRefresh() type_steam << "pub"; } - if(it->is_private_key && !it->has_master_key) { + if (it->is_private_key && !it->has_master_key) { type_steam << "#"; } - auto* tmp1 = new QTableWidgetItem(type_str); + auto *tmp1 = new QTableWidgetItem(type_str); mKeyList->setItem(row_index, 1, tmp1); auto *tmp2 = new QTableWidgetItem(it->name); @@ -177,13 +175,13 @@ void KeyList::slotRefresh() QString usage; QTextStream usage_steam(&usage); - if(GpgME::GpgContext::checkIfKeyCanCert(*it)) + if (GpgME::GpgContext::checkIfKeyCanCert(*it)) usage_steam << "C"; - if(GpgME::GpgContext::checkIfKeyCanEncr(*it)) + if (GpgME::GpgContext::checkIfKeyCanEncr(*it)) usage_steam << "E"; - if(GpgME::GpgContext::checkIfKeyCanSign(*it)) + if (GpgME::GpgContext::checkIfKeyCanSign(*it)) usage_steam << "S"; - if(GpgME::GpgContext::checkIfKeyCanAuth(*it)) + if (GpgME::GpgContext::checkIfKeyCanAuth(*it)) usage_steam << "A"; auto *temp_usage = new QTableWidgetItem(usage); @@ -199,7 +197,7 @@ void KeyList::slotRefresh() mKeyList->setItem(row_index, 6, temp_fpr); // strike out expired keys - if(it->expired || it->revoked) { + if (it->expired || it->revoked) { QFont strike = tmp2->font(); strike.setStrikeOut(true); tmp0->setFont(strike); @@ -218,8 +216,7 @@ void KeyList::slotRefresh() setChecked(keyList); } -QStringList *KeyList::getChecked() -{ +QStringList *KeyList::getChecked() { auto *ret = new QStringList(); for (int i = 0; i < mKeyList->rowCount(); i++) { if (mKeyList->item(i, 0)->checkState() == Qt::Checked) { @@ -229,19 +226,17 @@ QStringList *KeyList::getChecked() return ret; } -QStringList *KeyList::getAllPrivateKeys() -{ +QStringList *KeyList::getAllPrivateKeys() { auto *ret = new QStringList(); for (int i = 0; i < mKeyList->rowCount(); i++) { - if (mKeyList->item(i, 1)) { + if (mKeyList->item(i, 1) && buffered_keys[i].is_private_key) { *ret << buffered_keys[i].id; } } return ret; } -QStringList *KeyList::getPrivateChecked() -{ +QStringList *KeyList::getPrivateChecked() { auto *ret = new QStringList(); for (int i = 0; i < mKeyList->rowCount(); i++) { if ((mKeyList->item(i, 0)->checkState() == Qt::Checked) && (mKeyList->item(i, 1))) { @@ -251,19 +246,17 @@ QStringList *KeyList::getPrivateChecked() return ret; } -void KeyList::setChecked(QStringList *keyIds) -{ +void KeyList::setChecked(QStringList *keyIds) { if (!keyIds->isEmpty()) { for (int i = 0; i < mKeyList->rowCount(); i++) { - if (keyIds->contains(buffered_keys[i].id)) { + if (keyIds->contains(buffered_keys[i].id)) { mKeyList->item(i, 0)->setCheckState(Qt::Checked); } } } } -QStringList *KeyList::getSelected() -{ +QStringList *KeyList::getSelected() { auto *ret = new QStringList(); for (int i = 0; i < mKeyList->rowCount(); i++) { @@ -274,47 +267,42 @@ QStringList *KeyList::getSelected() return ret; } -[[maybe_unused]] bool KeyList::containsPrivateKeys() -{ +[[maybe_unused]] bool KeyList::containsPrivateKeys() { for (int i = 0; i < mKeyList->rowCount(); i++) { if (mKeyList->item(i, 1)) { - return true; + return true; } } return false; } -void KeyList::setColumnWidth(int row, int size) -{ +void KeyList::setColumnWidth(int row, int size) { mKeyList->setColumnWidth(row, size); } -void KeyList::contextMenuEvent(QContextMenuEvent *event) -{ +void KeyList::contextMenuEvent(QContextMenuEvent *event) { if (mKeyList->selectedItems().length() > 0) { popupMenu->exec(event->globalPos()); } } -void KeyList::addSeparator() -{ +void KeyList::addSeparator() { popupMenu->addSeparator(); } -void KeyList::addMenuAction(QAction *act) -{ +void KeyList::addMenuAction(QAction *act) { popupMenu->addAction(act); } -void KeyList::dropEvent(QDropEvent* event) -{ +void KeyList::dropEvent(QDropEvent *event) { auto *dialog = new QDialog(); dialog->setWindowTitle(tr("Import Keys")); QLabel *label; - label = new QLabel(tr("You've dropped something on the table.\n GpgFrontend will now try to import key(s).")+"\n"); + label = new QLabel( + tr("You've dropped something on the table.\n GpgFrontend will now try to import key(s).") + "\n"); // "always import keys"-CheckBox auto *checkBox = new QCheckBox(tr("Always import without bothering.")); @@ -332,56 +320,50 @@ void KeyList::dropEvent(QDropEvent* event) dialog->setLayout(vbox); - if (settings.value("general/confirmImportKeys",Qt::Checked).toBool()) - { + if (settings.value("general/confirmImportKeys", Qt::Checked).toBool()) { dialog->exec(); if (dialog->result() == QDialog::Rejected) { return; } - if (checkBox->isChecked()){ - settings.setValue("general/confirmImportKeys", false); + if (checkBox->isChecked()) { + settings.setValue("general/confirmImportKeys", false); } else { settings.setValue("general/confirmImportKeys", true); } } - if (event->mimeData()->hasUrls()) - { - for (const QUrl& tmp : event->mimeData()->urls()) - { - QFile file; - file.setFileName(tmp.toLocalFile()); - if (!file.open(QIODevice::ReadOnly)) { - qDebug() << tr("Couldn't Open File: ") + tmp.toString(); - } - QByteArray inBuffer = file.readAll(); - this->importKeys(inBuffer); - file.close(); - } - } else { - QByteArray inBuffer(event->mimeData()->text().toUtf8()); + if (event->mimeData()->hasUrls()) { + for (const QUrl &tmp : event->mimeData()->urls()) { + QFile file; + file.setFileName(tmp.toLocalFile()); + if (!file.open(QIODevice::ReadOnly)) { + qDebug() << tr("Couldn't Open File: ") + tmp.toString(); + } + QByteArray inBuffer = file.readAll(); this->importKeys(inBuffer); - } + file.close(); + } + } else { + QByteArray inBuffer(event->mimeData()->text().toUtf8()); + this->importKeys(inBuffer); + } } -void KeyList::dragEnterEvent(QDragEnterEvent *event) -{ +void KeyList::dragEnterEvent(QDragEnterEvent *event) { event->acceptProposedAction(); } /** set background color for Keys and put them to top * */ -[[maybe_unused]] void KeyList::markKeys(QStringList *keyIds) -{ - foreach(QString id, *keyIds) { - qDebug() << "marked: " << id; - } +[[maybe_unused]] void KeyList::markKeys(QStringList *keyIds) { + foreach(QString id, *keyIds) { + qDebug() << "marked: " << id; + } } -void KeyList::importKeys(QByteArray inBuffer) -{ +void KeyList::importKeys(QByteArray inBuffer) { GpgImportInformation result = mCtx->importKey(std::move(inBuffer)); new KeyImportDetailDialog(mCtx, result, false, this); } @@ -397,7 +379,7 @@ void KeyList::getCheckedKeys(QVector<GpgKey> &keys) { void KeyList::setExcludeKeys(std::initializer_list<QString> key_ids) { excluded_key_ids.clear(); - for(auto &key_id : key_ids) { + for (auto &key_id : key_ids) { excluded_key_ids.push_back(key_id); } } @@ -407,8 +389,8 @@ void KeyList::setFilter(std::function<bool(const GpgKey &)> filter) { } void KeyList::slotDoubleClicked(const QModelIndex &index) { - if(mAction != nullptr) { - const auto &key = mCtx->getKeyById(buffered_keys[index.row()].id); + if (mAction != nullptr) { + const auto key = mCtx->getKeyById(buffered_keys[index.row()].id); mAction(key, this); } diff --git a/src/ui/widgets/SignersPicker.cpp b/src/ui/widgets/SignersPicker.cpp new file mode 100644 index 00000000..00df5fdd --- /dev/null +++ b/src/ui/widgets/SignersPicker.cpp @@ -0,0 +1,59 @@ +/** + * This file is part of GPGFrontend. + * + * GPGFrontend 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 3 of the License, or + * (at your option) any later version. + * + * Foobar 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 Foobar. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from gpg4usb-team. + * Their source code version also complies with GNU General Public License. + * + * The source code version of this software was modified and released + * by Saturneric<[email protected]> starting on May 12, 2021. + * + */ + +#include "ui/widgets/SignersPicker.h" + +SignersPicker::SignersPicker(GpgME::GpgContext *ctx, QWidget *parent) : mCtx(ctx), QDialog(parent) { + auto confirmButton = new QPushButton(tr("Confirm")); + connect(confirmButton, SIGNAL(clicked(bool)), this, SLOT(accept())); + + /*Setup KeyList*/ + mKeyList = new KeyList(mCtx, KeyListRow::ONLY_SECRET_KEY, + KeyListColumn::NAME | KeyListColumn::EmailAddress | KeyListColumn::Usage); + + mKeyList->setFilter([](const GpgKey &key) -> bool { + if (!GpgME::GpgContext::checkIfKeyCanSign(key)) return false; + else return true; + }); + + mKeyList->slotRefresh(); + + auto *vbox2 = new QVBoxLayout(); + vbox2->addWidget(new QLabel("Select Signer(s): ")); + vbox2->addWidget(mKeyList); + vbox2->addWidget(confirmButton); + vbox2->addStretch(0); + setLayout(vbox2); + + this->setModal(true); + this->setWindowTitle("Signers Picker"); + this->setMinimumWidth(480); + this->show(); + + +} + +void SignersPicker::getCheckedSigners(QVector<GpgKey> &keys) { + mKeyList->getPrivateCheckedKeys(keys); +} |