diff options
Diffstat (limited to '')
250 files changed, 15396 insertions, 7803 deletions
diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index ad6e41db..f420374d 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -44,7 +44,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: lfs: 'false' submodules: recursive @@ -97,9 +97,8 @@ jobs: - name: Install Qt uses: jurplel/install-qt-action@v3 with: - version: '6.6.1' + version: '6.5.3' cache: 'true' - modules: 'qt5compat' - name: Configure CMake && Build GpgFrontend run: | diff --git a/.github/workflows/release-qt5.yml b/.github/workflows/release-qt5.yml index 74ffc61e..f65408e8 100644 --- a/.github/workflows/release-qt5.yml +++ b/.github/workflows/release-qt5.yml @@ -23,7 +23,7 @@ jobs: build: strategy: matrix: - os: [ 'windows-2019' ] + os: [ 'ubuntu-20.04', 'windows-2019' ] runs-on: ${{ matrix.os }} continue-on-error: true steps: @@ -33,7 +33,7 @@ jobs: git config --global core.eol lf if: matrix.os == 'windows-2019' - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: lfs: 'false' submodules: recursive @@ -58,6 +58,25 @@ jobs: pacman --noconfirm -S --needed mingw-w64-x86_64-ninja mingw-w64-x86_64-gnupg mingw-w64-x86_64-libarchive if: matrix.os == 'windows-2019' + - name: Install Dependence (Linux) + run: | + sudo apt-get update + sudo apt-get -y install build-essential binutils git autoconf automake gettext texinfo + sudo apt-get -y install gcc g++ ninja-build + sudo apt-get -y install libarchive-dev libssl-dev + sudo apt-get -y install gpgsm libxcb-xinerama0 libxcb-icccm4-dev libcups2-dev libdrm-dev libegl1-mesa-dev + sudo apt-get -y install libgcrypt20-dev libnss3-dev libpci-dev libpulse-dev libudev-dev libxtst-dev gyp + sudo apt-get -y install libglu1-mesa-dev libfontconfig1-dev libx11-xcb-dev libxcb-image0 + sudo apt-get -y install libglu1-mesa-dev libfontconfig1-dev libx11-xcb-dev libxcb-* libxkbcommon-x11-0 + if: matrix.os == 'ubuntu-20.04' + + - name: Install Qt5 + uses: jurplel/install-qt-action@v3 + with: + version: '5.15.2' + cache: 'true' + if: matrix.os == 'ubuntu-20.04' + - name: Build gpg-error (Windows) shell: msys2 {0} run: | @@ -69,6 +88,16 @@ jobs: cd ${{github.workspace}} if: matrix.os == 'windows-2019' + - name: Build gpg-error (Linux) + run: | + git clone --depth 1 --branch libgpg-error-1.47 git://git.gnupg.org/libgpg-error.git ${{github.workspace}}/third_party/libgpg-error + cd ${{github.workspace}}/third_party/libgpg-error + ./autogen.sh + ./configure --enable-maintainer-mode && make -j4 + sudo make install + cd ${{github.workspace}} + if: matrix.os == 'ubuntu-20.04' + - name: Build assuan (Windows) shell: msys2 {0} run: | @@ -79,6 +108,16 @@ jobs: make install cd ${{github.workspace}} if: matrix.os == 'windows-2019' + + - name: Build assuan (Linux) + run: | + git clone --depth 1 --branch libassuan-2.5.6 git://git.gnupg.org/libassuan.git ${{github.workspace}}/third_party/libassuan + cd ${{github.workspace}}/third_party/libassuan + ./autogen.sh + ./configure --enable-maintainer-mode && make -j4 + sudo make install + cd ${{github.workspace}} + if: matrix.os == 'ubuntu-20.04' - name: Build GpgME (Windows) shell: msys2 {0} @@ -90,6 +129,16 @@ jobs: make install cd ${{github.workspace}} if: matrix.os == 'windows-2019' + + - name: Build GpgME (Linux) + run: | + git clone --depth 1 --branch gpgme-1.22.0 git://git.gnupg.org/gpgme.git ${{github.workspace}}/third_party/gpgme + cd ${{github.workspace}}/third_party/gpgme + ./autogen.sh + ./configure --enable-maintainer-mode --enable-languages=cpp && make -j4 + sudo make install + cd ${{github.workspace}} + if: matrix.os == 'ubuntu-20.04' - name: Configure CMake & Build Binary(Windows) shell: msys2 {0} @@ -97,10 +146,32 @@ jobs: cd $(echo "/${{github.workspace}}" | sed 's/\\/\//g' | sed 's/://') mkdir build && cd build cmake -G Ninja -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DGPGFRONTEND_BUILD_TYPE_STABLE=ON -DGPGFRONTEND_QT5_BUILD=ON .. - # Build your program with the given configuration cmake --build . --config ${{env.BUILD_TYPE}} -- -j 4 if: matrix.os == 'windows-2019' + - name: Build GpgFrontend (Linux) + # Build your GpgFrontend with the given configuration + run: | + cmake -B ${{github.workspace}}/build -G Ninja -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DGPGFRONTEND_QT5_BUILD=ON + cmake --build ${{github.workspace}}/build --config {{$env.BUILD_TYPE}} -- -v + if: matrix.os == 'ubuntu-20.04' + + - name: Package App Image (Linux) + run: | + mkdir ${{github.workspace}}/build/final-artifact + cd ${{github.workspace}}/build/final-artifact + wget -c -nv https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage + chmod u+x linuxdeployqt-continuous-x86_64.AppImage + ./linuxdeployqt-continuous-x86_64.AppImage ${{github.workspace}}/build/artifacts/AppDir/usr/share/applications/*.desktop -no-translations -extra-plugins=iconengines,platformthemes/libqgtk3.so -appimage -executable-dir=${{github.workspace}}/build/artifacts/AppDir/usr/plugins/mods/ + if: matrix.os == 'ubuntu-20.04' + + - name: Upload Artifact(Linux) + uses: actions/upload-artifact@master + with: + name: gpgfrontend-${{matrix.os}}-${{env.BUILD_TYPE}}-${{ github.sha }} + path: ${{github.workspace}}/build/final-artifact/Gpg_Frontend*.AppImage* + if: matrix.os == 'ubuntu-20.04' + - name: Upload Artifact(Windows) uses: actions/upload-artifact@master with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0d3d52df..611b0333 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -33,7 +33,7 @@ jobs: git config --global core.eol lf if: matrix.os == 'windows-2019' || matrix.os == 'macos-11' || matrix.os == 'macos-12' - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: lfs: 'false' submodules: recursive @@ -77,8 +77,7 @@ jobs: - name: Install Qt6 uses: jurplel/install-qt-action@v3 with: - version: '6.6.1' - modules: 'qt5compat' + version: '6.5.3' cache: 'true' if: matrix.os == 'ubuntu-20.04' || matrix.os == 'macos-11' || matrix.os == 'macos-12' @@ -101,8 +100,14 @@ jobs: run: | pacman --noconfirm -S --needed mingw-w64-x86_64-gcc mingw-w64-x86_64-make mingw-w64-x86_64-cmake autoconf pacman --noconfirm -S --needed make texinfo automake - pacman --noconfirm -S --needed mingw-w64-x86_64-qt6 libintl msys2-runtime-devel gettext-devel + pacman --noconfirm -S --needed libintl msys2-runtime-devel gettext-devel pacman --noconfirm -S --needed mingw-w64-x86_64-ninja mingw-w64-x86_64-gnupg mingw-w64-x86_64-libarchive + wget https://repo.msys2.org/mingw/x86_64/mingw-w64-x86_64-icu-73.2-1-any.pkg.tar.zst + wget https://repo.msys2.org/mingw/x86_64/mingw-w64-x86_64-qt6-base-6.5.3-1-any.pkg.tar.zst + wget https://repo.msys2.org/mingw/x86_64/mingw-w64-x86_64-qt6-5compat-6.5.3-1-any.pkg.tar.zst + wget https://repo.msys2.org/mingw/x86_64/mingw-w64-x86_64-qt6-svg-6.5.3-1-any.pkg.tar.zst + wget https://repo.msys2.org/mingw/x86_64/mingw-w64-x86_64-qt6-tools-6.5.3-1-any.pkg.tar.zst + pacman --noconfirm -U *.pkg.tar.zst if: matrix.os == 'windows-2019' - name: Build gpg-error (Linux) @@ -175,6 +180,13 @@ jobs: cmake --build ${{github.workspace}}/build --config {{$env.BUILD_TYPE}} -- -v if: matrix.os == 'ubuntu-20.04' + - name: Build Integrated Modules (macOS) + # Build your GpgFrontend with the given configuration + run: | + cmake -B ${{github.workspace}}/build-mods -G Ninja -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DGPGFRONTEND_BUILD_MODS_ONLY=On + cmake --build ${{github.workspace}}/build-mods --config {{$env.BUILD_TYPE}} -- -v + if: matrix.os == 'macos-11' || matrix.os == 'macos-12' + - name: Build & Export GpgFrontend (macOS) # Build your GpgFrontend with the given configuration run: | @@ -195,6 +207,13 @@ jobs: -exportPath ${{github.workspace}}/build/package/ if: matrix.os == 'macos-11' || matrix.os == 'macos-12' + - name: Copy Modules into Bundle & Deploy Qt & Code Sign (macOS) + run: | + cmake -E copy_directory ${{github.workspace}}/build-mods/artifacts/mods ${{github.workspace}}/build/package/GpgFrontend.app/Contents/PlugIns/mods + macdeployqt ${{github.workspace}}/build/package/GpgFrontend.app -verbose=2 -appstore-compliant -always-overwrite + codesign -s "${{secrets.GPGFRONTEND_XOCDE_CODE_SIGN_IDENTITY}}" -f --deep --options=runtime ${{github.workspace}}/build/package/GpgFrontend.app + if: matrix.os == 'macos-11' || matrix.os == 'macos-12' + - name: Package & Sign App Bundle (macOS) run: | security -v unlock-keychain -p gpgfrontend @@ -212,11 +231,11 @@ jobs: - name: Notarize Release Build (macOS) run: | - xcrun altool --notarize-app \ - -f ${{github.workspace}}/build/GpgFrontend-${{env.sha_short}}-x86_64.zip \ - --primary-bundle-id ${{secrets.GPGFRONTEND_XOCDE_APPID}} \ - -u ${{secrets.APPLE_DEVELOPER_ID}} \ - -p ${{secrets.APPLE_DEVELOPER_ID_SECRET}} + xcrun notarytool submit \ + --apple-id ${{secrets.APPLE_DEVELOPER_ID}} \ + --team-id ${{secrets.APPLE_DEVELOPER_TEAM_ID}} \ + --password ${{secrets.APPLE_DEVELOPER_ID_SECRET}} \ + ${{github.workspace}}/build/GpgFrontend-${{env.sha_short}}-x86_64.zip if: matrix.os == 'macos-11' || matrix.os == 'macos-12' - name: Package App Image (Linux) @@ -225,7 +244,7 @@ jobs: cd ${{github.workspace}}/build/final-artifact wget -c -nv https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage chmod u+x linuxdeployqt-continuous-x86_64.AppImage - ./linuxdeployqt-continuous-x86_64.AppImage ${{github.workspace}}/build/artifacts/gpgfrontend/usr/share/applications/*.desktop -appimage + ./linuxdeployqt-continuous-x86_64.AppImage ${{github.workspace}}/build/artifacts/AppDir/usr/share/applications/*.desktop -no-translations -extra-plugins=iconengines,platformthemes/libqgtk3.so -appimage -executable-dir=${{github.workspace}}/build/artifacts/AppDir/usr/plugins/mods/ if: matrix.os == 'ubuntu-20.04' - name: Configure CMake & Build Binary(Windows) @@ -234,7 +253,6 @@ jobs: cd $(echo "/${{github.workspace}}" | sed 's/\\/\//g' | sed 's/://') mkdir build && cd build cmake -G Ninja -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DGPGFRONTEND_BUILD_TYPE_STABLE=ON .. - # Build your program with the given configuration cmake --build . --config ${{env.BUILD_TYPE}} -- -j 4 if: matrix.os == 'windows-2019' @@ -242,7 +260,7 @@ jobs: uses: actions/upload-artifact@master with: name: gpgfrontend-${{matrix.os}}-${{env.BUILD_TYPE}}-${{ github.sha }} - path: ${{github.workspace}}/build/final-artifact/GpgFrontend*.AppImage* + path: ${{github.workspace}}/build/final-artifact/Gpg_Frontend*.AppImage* if: matrix.os == 'ubuntu-20.04' - name: Upload Artifact(macOS) diff --git a/.gitmodules b/.gitmodules index 3e9b725c..6d7f2301 100644 --- a/.gitmodules +++ b/.gitmodules @@ -15,4 +15,4 @@ url = https://github.com/libarchive/libarchive.git [submodule "third_party/qttranslations"] path = third_party/qttranslations - url = git://code.qt.io/qt/qttranslations.git + url = https://github.com/qt/qttranslations.git diff --git a/CMakeLists.txt b/CMakeLists.txt index 2819895f..4f3232ad 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,13 +28,14 @@ cmake_minimum_required(VERSION 3.16) message(STATUS "Current Generator: ${CMAKE_GENERATOR}") if(CMAKE_GENERATOR STREQUAL "Xcode") set(CMAKE_USER_MAKE_RULES_OVERRIDE "${CMAKE_SOURCE_DIR}/cmake/FlagsOverridesXcode.cmake") + set(XCODE_BUILD 1) else() set(CMAKE_USER_MAKE_RULES_OVERRIDE "${CMAKE_SOURCE_DIR}/cmake/FlagsOverrides.cmake") endif() # define project project(GpgFrontend - VERSION 2.1.2 + VERSION 2.1.3 DESCRIPTION "GpgFrontend is a free, open-source, robust yet user-friendly, compact and cross-platform tool for OpenPGP encryption." HOMEPAGE_URL "https://gpgfrontend.bktus.com" LANGUAGES CXX) @@ -66,7 +67,8 @@ option(GPGFRONTEND_BUILD_TYPE_STABLE "Generate release version" ON) option(GPGFRONTEND_QT5_BUILD "Swith to Qt5 building mode" OFF) option(GPGFRONTEND_GENERATE_LINUX_INSTALL_SOFTWARE "Generate an installable version" OFF) -option(GPGFRONTEND_CONFIGURE_FOR_XCODE_BUILD "Generate a version that can be successfully compiled and packaged in Xcode" OFF) +option(GPGFRONTEND_BUILD_MODS_ONLY "Build Modules Only" OFF) + option(GPGFRONTEND_XCODE_TEAM_ID "GpgFrontend Apple Team ID" "NONE") option(GPGFRONTEND_XOCDE_CODE_SIGN_IDENTITY "GpgFrontend Signing Certificate" "NONE") option(GPGFRONTEND_XOCDE_APPID "GpgFrontend Apple AppID" "NONE") @@ -94,6 +96,10 @@ if (GPGFRONTEND_BUILD_TYPE_TEST_ALL) set(GPGFRONTEND_BUILD_CONFIG "test_all") endif () +# Specify compilation mode +message(STATUS "Switch Build Configure STABLE_BUILD_APPLICATION") +set(STABLE_BUILD_APPLICATION 1) + # stable features if (GPGFRONTEND_BUILD_TYPE_STABLE) @@ -118,20 +124,16 @@ if (GPGFRONTEND_GENERATE_LINUX_INSTALL_SOFTWARE) set(LINUX_INSTALL_SOFTWARE 1) endif () -# xcode archive build -if (GPGFRONTEND_CONFIGURE_FOR_XCODE_BUILD) - set(GPGFRONTEND_GENERATE_LINUX_INSTALL_SOFTWARE 0) - set(LINUX_INSTALL_SOFTWARE 0) - set(XCODE_BUILD 1) - +if (GPGFRONTEND_BUILD_MODS_ONLY) set(GPGFRONTEND_BUILD_TYPE_TEST_CORE 0) set(GPGFRONTEND_BUILD_TYPE_TEST_CORE_AND_COVERAGE 0) set(GPGFRONTEND_BUILD_TYPE_TEST_UI 0) set(GPGFRONTEND_BUILD_TYPE_TEST_ALL 0) - unset(GPGFRONTEND_BUILD_CONFIG) - set(STABLE_BUILD_APPLICATION 1) -endif () + + set(STABLE_BUILD_APPLICATION 0) + set(BUILD_MODS_ONLY 1) +endif() # C++ @@ -191,10 +193,19 @@ else() add_compile_definitions(DEBUG) endif() +# use xcode archive build at macos release at default +if (CMAKE_BUILD_TYPE STREQUAL "Release" AND APPLE) + set(GPGFRONTEND_GENERATE_LINUX_INSTALL_SOFTWARE 0) + set(LINUX_INSTALL_SOFTWARE 0) + + set(GPGFRONTEND_BUILD_TYPE_TEST_CORE 0) + set(GPGFRONTEND_BUILD_TYPE_TEST_CORE_AND_COVERAGE 0) + set(GPGFRONTEND_BUILD_TYPE_TEST_UI 0) + set(GPGFRONTEND_BUILD_TYPE_TEST_ALL 0) + + unset(GPGFRONTEND_BUILD_CONFIG) +endif () -# Specify compilation mode -message(STATUS "Switch Build Configure STABLE_BUILD_APPLICATION") -set(STABLE_BUILD_APPLICATION 1) set(AppName GpgFrontend) # Get Git Information @@ -220,7 +231,7 @@ endif () set(BUILD_VERSION ${PROJECT_VERSION}_${CMAKE_SYSTEM}_${CMAKE_SYSTEM_PROCESSOR}_${CMAKE_BUILD_TYPE}) set(GIT_VERSION ${GIT_BRANCH_NAME}_${GIT_COMMIT_HASH}) -string(TIMESTAMP BUILD_TIMESTAMP "%Y-%m-%d %H:%M:%S") +string(TIMESTAMP BUILD_TIMESTAMP UTC) # Convert BUILD_VERSION and GIT_VERSION to lowercase string(TOLOWER "${BUILD_VERSION}" BUILD_VERSION) @@ -250,6 +261,10 @@ IF (MINGW) ${CMAKE_SOURCE_DIR}/lib/mingw /mingw64/lib ) + + # Http Request User Agent + set(HTTP_REQUEST_USER_AGENT "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:123.0) Gecko/20100101 Firefox/123.0") + endif () # macOS @@ -277,6 +292,10 @@ if (APPLE) /usr/local/lib /opt/homebrew/lib ) + + # Http Request User Agent + set(HTTP_REQUEST_USER_AGENT "Mozilla/5.0 (Macintosh; Intel Mac OS X 14.3; rv:123.0) Gecko/20100101 Firefox/123.0") + endif () if (UNIX AND NOT APPLE) @@ -319,12 +338,14 @@ if (LINUX) /usr/local/lib/ ) + # Http Request User Agent + set(HTTP_REQUEST_USER_AGENT "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:123.0) Gecko/20100101 Firefox/123.0") + endif () if (LINUX_INSTALL_SOFTWARE) message(STATUS "Linux Install Traget ${CMAKE_INSTALL_PREFIX}") include(GNUInstallDirs) - set(INSTALL_GPGFRONTEND_APP 1) set(APP_INSTALL_FLAG LINUX_INSTALL) add_compile_definitions(LINUX_INSTALL_BUILD) else () @@ -348,8 +369,11 @@ if (STABLE_BUILD_APPLICATION) set(BUILD_MODULE 1) set(BUILD_TEST 1) set(BUILD_APPLICATION 1) - set(BASIC_ENV_CONFIG 1) set(SUPPORT_MULTI_LANG 1) +elseif (BUILD_MODS_ONLY) + message("[+] Build Mods") + set(BUILD_CORE 1) + set(BUILD_MODULE 1) endif () # For instance in order to select the highest version one @@ -1,5 +1,3 @@ -<img width="100" height="100" align="right" style="position: absolute;right: 0;padding: 12px;top:12px;" src="https://image.cdn.bktus.com/i/2024/02/24/248b2e18-a120-692e-e6bc-42ca30be9011.webp" alt="GpgFrontend"/> - # GpgFrontend  @@ -13,6 +11,8 @@ cross-platform tool for [OpenPGP](https://www.openpgp.org/) encryption. It stands out as an exceptional GUI frontend for the modern [GnuPG](https://www.gnupg.org/) (gpg). +<img width="100" height="100" align="right" style="position: absolute;right: 0;padding: 12px;top:12px;z-index: 1000;" src="https://image.cdn.bktus.com/i/2024/02/24/248b2e18-a120-692e-e6bc-42ca30be9011.webp" alt="GpgFrontend"/> + When using GpgFrontend, you can: - Rapidly encrypt files or text. diff --git a/gpgfrontend.icns b/gpgfrontend.icns Binary files differindex 89b13163..5732daf0 100644 --- a/gpgfrontend.icns +++ b/gpgfrontend.icns diff --git a/gpgfrontend.ico b/gpgfrontend.ico Binary files differindex c9581076..0f1cfdb0 100644 --- a/gpgfrontend.ico +++ b/gpgfrontend.ico diff --git a/gpgfrontend.qrc b/gpgfrontend.qrc index a5b5e24e..e311ed6a 100644 --- a/gpgfrontend.qrc +++ b/gpgfrontend.qrc @@ -1,14 +1,12 @@ <!DOCTYPE RCC> <RCC> <qresource prefix="/icons"> + <file alias="gpgfrontend.ico">gpgfrontend.ico</file> + <file alias="gpgfrontend.png">resource/lfs/icons/gpgfrontend.png</file> + <file alias="gpgfrontend_logo.png">resource/lfs/icons/gpgfrontend_logo.png</file> <file alias="keymgmt.png">resource/lfs/icons/keymgmt.png</file> <file alias="help.png">resource/lfs/icons/help.png</file> <file alias="button_copy.png">resource/lfs/icons/button_copy.png</file> - <file alias="gpgfrontend-logo.png">resource/lfs/icons/gpgfrontend-logo.png</file> - <file alias="banner.png">resource/lfs/icons/wizard_banner.png</file> - <file alias="logo_small.png">resource/lfs/icons/gpgfrontend-logo_small.png</file> - <file alias="keys2.jpg">resource/lfs/icons/keys12.jpg</file> - <file alias="keys3.jpg">resource/lfs/icons/keys13.jpg</file> <file alias="error.png">resource/lfs/icons/error.png</file> <file alias="info.png">resource/lfs/icons/info.png</file> <file alias="inbox.png">resource/lfs/icons/inbox.png</file> @@ -42,7 +40,6 @@ <file alias="format-line-spacing-normal.png">resource/lfs/icons/format-line-spacing-normal.png</file> <file alias="format-line-spacing-triple.png">resource/lfs/icons/format-line-spacing-triple.png</file> <file alias="gnupg.png">resource/lfs/icons/gnupg.png</file> - <file alias="gpgfrontend.png">resource/lfs/icons/gpgfrontend.png</file> <file alias="importance.png">resource/lfs/icons/importance.png</file> <file alias="importkey_editor.png">resource/lfs/icons/importkey_editor.png</file> <file alias="import_key_from_clipboard.png">resource/lfs/icons/import_key_from_clipboard.png</file> @@ -65,6 +62,7 @@ <file alias="trash.png">resource/lfs/icons/trash.png</file> <file alias="editor.png">resource/lfs/icons/editor.png</file> <file alias="undo.png">resource/lfs/icons/undo.png</file> + <file alias="redo.png">resource/lfs/icons/redo.png</file> <file alias="verify.png">resource/lfs/icons/verify.png</file> <file alias="export_key_to_clipboard.png">resource/lfs/icons/export_key_to_clipboard.png</file> <file alias="mimetypes/application-pdf.png">resource/lfs/icons/mimetypes/application-pdf.png</file> @@ -88,6 +86,17 @@ <file alias="total_selection.png">resource/lfs/icons/total_selection.png</file> <file alias="search.png">resource/lfs/icons/search.png</file> <file alias="close.png">resource/lfs/icons/close.png</file> + <file alias="module.png">resource/lfs/icons/module.png</file> + <file alias="restart.png">resource/lfs/icons/restart.png</file> + <file alias="clear-f.png">resource/lfs/icons/clear-f.png</file> + <file alias="zoomin.png">resource/lfs/icons/zoomin.png</file> + <file alias="zoomout.png">resource/lfs/icons/zoomout.png</file> + <file alias="wizard.png">resource/lfs/icons/wizard.png</file> + <file alias="update.png">resource/lfs/icons/update.png</file> + <file alias="translate.png">resource/lfs/icons/translate.png</file> + <file alias="key.png">resource/lfs/icons/key.png</file> + <file alias="stairs.png">resource/lfs/icons/stairs.png</file> + <file alias="detail.png">resource/lfs/icons/detail.png</file> </qresource> <qresource prefix="/test/key"> <file alias="pv1.key">resource/lfs/test/data/pv1.key</file> diff --git a/manual/.nojekyll b/manual/.nojekyll deleted file mode 100644 index e69de29b..00000000 --- a/manual/.nojekyll +++ /dev/null diff --git a/manual/CNAME b/manual/CNAME deleted file mode 100644 index df655f46..00000000 --- a/manual/CNAME +++ /dev/null @@ -1 +0,0 @@ -gpgfrontend.bktus.com
\ No newline at end of file diff --git a/manual/_coverpage.md b/manual/_coverpage.md deleted file mode 100644 index 9c8e8afd..00000000 --- a/manual/_coverpage.md +++ /dev/null @@ -1,26 +0,0 @@ -<img width="256" height="256" align="center" src="https://image.cdn.bktus.com/i/2024/02/24/f3f2f26a-96b4-65eb-960f-7ac3397a0a40.webp" alt="GpgFropntend"/> - -- **A Free, Easy-to-Use, Cross-Platform [OpenPGP](https://www.openpgp.org/) Crypto Tool.** -- **One of the excellent GUI Frontends for Modern [GnuPG](https://gnupg.org/).** - ---- - -## Brief Introduction - -- Rapidly encrypt files or text. -- Digitally sign your files or text with ease. -- Conveniently manage all your GPG keys on your device. -- Transfer all your GPG keys between devices safely and effortlessly. - -## Features - -- Cross-Platform, can run on **Windows, Linux and macOS**. -- Open source, Installation-free and Free forever. - -[Downloads](downloads.md) -[Manual](overview.md) -[Document](https://doxygen.gpgfrontend.bktus.com) - -<!-- Background Color --> - - diff --git a/manual/_media/icon.svg b/manual/_media/icon.svg deleted file mode 100644 index 67375a64..00000000 --- a/manual/_media/icon.svg +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1641046753295" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="732" width="64" height="64" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><style type="text/css"></style></defs><path d="M763.52 968.96H261.248C147.2 968.96 54.784 876.544 54.784 762.496V260.224C54.784 146.176 147.2 53.76 261.248 53.76h502.272c114.048 0 206.464 92.416 206.464 206.464v502.272c0 114.048-92.416 206.464-206.464 206.464z" fill="#89898E" p-id="733"></path><path d="M671.36 365.44c0-88.576-72.32-160.128-161.536-158.976-81.024 1.152-150.656 66.688-156.288 147.456-5.504 79.104 46.336 146.56 118.016 165.12h0.128v224.128c0 5.12 1.92 9.984 5.376 13.824l45.568 49.92c4.48 4.992 12.288 4.992 16.768 0l65.664-71.68c4.608-4.992 4.352-12.672-0.384-17.408l-33.536-33.536c-5.248-5.248-5.248-13.952 0-19.2l36.096-36.096c7.04-7.04 7.04-18.304 0-25.216l-43.392-43.392c-4.224-4.224-6.528-9.856-6.528-15.744v-26.368c65.92-19.328 114.048-80.384 114.048-152.832zM512.256 294.4c22.528 0 40.832 18.176 40.832 40.576 0 22.528-18.304 40.576-40.832 40.576-22.272 0-40.576-18.176-40.576-40.576 0-22.528 18.304-40.576 40.576-40.576z" fill="#FFFFFF" p-id="734"></path></svg>
\ No newline at end of file diff --git a/manual/_media/trademark.png b/manual/_media/trademark.png Binary files differdeleted file mode 100644 index 7e9841be..00000000 --- a/manual/_media/trademark.png +++ /dev/null diff --git a/manual/_navbar.md b/manual/_navbar.md deleted file mode 100644 index 6e3c6962..00000000 --- a/manual/_navbar.md +++ /dev/null @@ -1,7 +0,0 @@ -<!-- _navbar.md --> - -- [Source Code](https://github.com/saturneric/GpgFrontend) -- [Document](https://doxygen.gpgfrontend.bktus.com) -- [Manual](overview.md) -- [Downloads](downloads.md) -- [Contract](contract.md) diff --git a/manual/_redirects b/manual/_redirects deleted file mode 100644 index f8243379..00000000 --- a/manual/_redirects +++ /dev/null @@ -1 +0,0 @@ -/* /index.html 200
\ No newline at end of file diff --git a/manual/_sidebar.md b/manual/_sidebar.md deleted file mode 100644 index 89a4f1e8..00000000 --- a/manual/_sidebar.md +++ /dev/null @@ -1,30 +0,0 @@ -- Getting Start - - [Overview](overview.md) - - [Quick Start](quick-start.md) - - [Downloads](downloads.md) - - [Concepts for Beginners](basic-concepts.md) -- Basic Guides - - [Understand Interface](basic/understand-interface.md) - - [Encrypt & Decrypt Text](basic/encrypt-decrypt-text.md) - - [Symmetric Encrypt & Decrypt](basic/symmetric-encrypt-decrypt.md) - - [Sign & Verify Text](basic/sign-verify-text.md) - - [Encrypt & Decrypt File](basic/encrypt-decrypt-file.md) - - [Sign & Verify File](basic/sign-verify-file.md) - - [Generate Key Pair & Subkey](basic/generate-key.md) - - [View Key Pair Details](basic/view-keypair-info.md) - - [Import & Export Key Pair](basic/import-export-key-pair.md) - - [Key Server Operations](basic/key-server-operations.md) - - [System Requirement](basic/system-requirement.md) -- Features Guides - - [Introduce](features/introduce.md) - - [Sync ALL Public Key](features/sync-all-public-keys.md) - - [Export As Key Package](features/key-package.md) -- Contributions - - [Contribute to Translate](contribute/translate-interface.md) - - [Contribute to Development](contribute/contribute.md) - - [Setting Up Development Environment](contribute/setup-dev-env.md) -- About - - [FAQ](faq.md) - - [Code & Binary Verify](about/code-binary-verify.md) - - [Contact Information](contract.md) - - [Dependencies](manual/dependencies.md) diff --git a/manual/about/code-binary-verify.md b/manual/about/code-binary-verify.md deleted file mode 100644 index 0bd42b88..00000000 --- a/manual/about/code-binary-verify.md +++ /dev/null @@ -1,158 +0,0 @@ -# Code & Binary Verify - -To enhance the security and integrity of software distribution, it's crucial for -developers and users alike to employ methods for verifying the authenticity and -integrity of code and executable files. The process outlined below aims to -fortify trust in software distribution by leveraging digital signatures and -secure, automated build processes. - -### Automated Build Process - -Our software leverages **GitHub Actions** for automated compilations, ensuring -that every binary file version released is directly compiled from the source -code stored in the GitHub repository's main branch. This approach guarantees -that the compilation process is transparent, replicable, and free from manual -interference. The exact commands and environment configurations used during the -compilation are documented within the project's `.github/workflow/release.yml` -file, allowing for full accountability and reproducibility. - -### Third-Party Library Assurance - -To uphold our commitment to security, we do not include GnuPG in our major -releases and strictly avoid insecure or proprietary third-party libraries. -Instead, we only utilize third-party libraries that are open-source and have -been compiled from publicly accessible code repositories. This practice ensures -that our software remains secure and trustworthy. - -### Code Verification - -We encourage users to review our code to ensure its integrity and security. The -code for all releases is available on our GitHub repository. For any inquiries -or concerns, please feel free to contact us directly. Most new git commits are -signed with a designated key, which is also used for Git operations: `Saturneric -<[email protected]>`. This commitment to transparency allows users to verify the -authenticity of our code easily. - -#### Key Fingerprint - -``` -E3379489C39B7270E70E2E303AAF1C64137CEE57 -``` - -### Binary File Verification - -From version 1.0.5 onwards, we sign our packages containing the binary -executable files with a GPG key to further ensure security. Each package is -accompanied by a signature file in the release section (with a `.sig` suffix), -allowing users to verify the package before use using standard GPG tools. - -#### About Interface Verification - -Our software includes an "About" interface accessible from the help menu, -providing users with information about the software version, platform, and the -specific GitHub repository branch and commit hash used for compiling the binary. -This feature adds an extra layer of transparency and verification for users. - -### Public Key for Verification - -Below is the public key used for signing the commits and binary files, which can -be used to verify the authenticity of our releases: - -#### Key Fingerprint - -``` -E3379489C39B7270E70E2E303AAF1C64137CEE57 -``` - -#### Public Key (OpenPGP) - -``` ------BEGIN PGP PUBLIC KEY BLOCK----- - -mQGNBGCVnvEBDACuEcjxckb4rocHGU7VPT/OOOOZapNG/0ViB3XhmzNh7q8QJiq6 -M4z0fpC5sf1pHXbbKtehLETrAUTFuaEp19askZI0ISoz5+qKGZuaM3bDZWBjwUpt -woVgUphfeZy2DFsnmTtVj9CRU9Nma6smXVFud3Roj2ImZ0NFrkdETvprfLJ7jqk/ -mXgznNbbJdqmQ4l0I1E91VmrqHHHSakh3grzRDj/GuDookQl2JZfLA0J55qOYdkF -5mmnqbYURGVcP2oot/wSrrWH0F/WatwRx9w+jZjrJWgKjJoqWwvzG8WGop1XkRn1 -Ea3Nzj/KsSL7C5YRu03BL7wNu6UNIJ/zsAnNLp87nCY85w+HnNGHkL3QcnqNQbQP -3aySOkIjXdT8AlGIV5r5wO/RBg4e+xASGzQXx9lYbjJiiIOP2uLxYGGFbalDoiCa -sonlXzMZTJrK7VvZ2UsnSnBJ8l/EPsY/AeZdWbmswQaFsJlfNsZZ6T5Rfyjtu8a3 -fwPJTTsbfIB6N3EAEQEAAbQbU2F0dXJuZXJpYyA8ZXJpY0Bia3R1cy5jb20+iQHO -BBMBCAA4AhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAFiEE4zeUicObcnDnDi4w -Oq8cZBN87lcFAmCWg1kACgkQOq8cZBN87leJfQv/ShjV9PRi8ixlJ1Ez1TDG+4N9 -EHoi2IwVK1UF51kA9lxyD+8n1ZHpcz7bRXV+YhHAO4A2l1ENrkCJVIZK9OO+Z64l -TPKCV9JVSkxcpnr6sqKJ76Zplwah1ZkwAG9tdK9H95wgeIkO4oSRutX/cCJ35Gko -FfhbV+/OyPYTT2562SZeQ2VqnptGLm0eF+FVt0HP4uxvRyGfgHQD46Ki6dr/JOXQ -j57S06CIHGj1RT4uQVSx53gbFvfIgweHsWraRWwY8jMrgOazlo/KRHG4N04eQdzM -K+WA80ODKuXdhnlGFMhn3RCFZpRV+Upso9syJ1FFChzsuX69+mRPvAojEDnREgd9 -s61nx5xWy6vKMB9oZiomNuPw2EScBwS9EK0M6APqgBaIdL6HOC7kjxBLfqgyhulD -qGZXWNvFj5P2FNMVwSvK1cYftYz+QWqB5BhbJT2H/HpF2xNsH7jfTxwUp6KrN1Bz -geNWgpQDXS5ZXU7dk22BwSah3nXs+LJi3Sloeh/piQHUBBMBCAA+FiEE4zeUicOb -cnDnDi4wOq8cZBN87lcFAmCVnvECGwMFCQPC1M8FCwkIBwIGFQoJCAsCBBYCAwEC -HgECF4AACgkQOq8cZBN87le3zAv/fMnxVMORS5rz/vsc0X8YSldmM1MqdIKSNghK -nQKKnzTBtTKA/oHEyPhjnQRaCfi4eUGeUsdZq8fwbN6sWSmbhJ6cOVgIps9YcS/U -sCV4egUHGy/+ozgDSh563v82ROWxXjszcnFz0F2d4stgroe8A//3OgQDv1wuhMJe -vtSZe8W8ebj7mt0zNjccGQzNkWo82mOyZfjgvK//vWisW4JwP8gfEKBgAktj5MCY -iGS2NbWPAToDIPCA6hKPb3sHQIY2/tGkKwyvr4oxwYRkNq4T5PWcV0p3qRsQudHp -ZXGiL3VNIW04ihLcn8uxSE6sQK2eq5wp/6Wnt1EWG1xb0pU2nPFuAlULHsGxM+bB -YJOk5WzYST1xdgXW3QxVsIoTuVqA+ehqrzvu+gGCz4uenFt6OAswqR7ii8D/Tpso -RAU0nTEOAVpCxXAMgsdUS6jOjtyfTHixGlVL6U3dY3wTuqWdbxmYX/g00PnOTYF0 -1plvf21NHMeYLk68+1nRbtqoLnPVuQGNBGCVnvEBDAC8zNpSGRHUp+X7hit0bCDP -P8HR+rxH50rOVFtQNyXw32lkIrwnHq0Y7FR4t7OSWTkX1xvxhXMILQdTBxKKrBtF -IpQ44cO1UcklkYdCwE/F0lasLLfleo2NlG7ISwNEOxmJcWiwmkLHN3CnqXpXXqpG -DTRavbuhE7yRewp/jNSCsikrvL7NedB5Ef5EZmSkvx7kXibXKzgKcyft5OlylRMU -JS8gzzTPA+xMH/Cl1zFCSgymJw1DK1wx+u0ye2Oj7NDdrYtRR1qLpCq7kaGIPvIW -556/58sj+/YRGeP5JTjhYFk/K8QQr8cK6HWuJQVASJUP+KBk8CiaqzbOPjlq69eG -Oymraa8H7JvSR5ArJWPczOxQyiEbYABOtJk1ZSz4v4pa7+RLUfwFOYuTMyBoY3rJ -uGhVxA77oHftfjteH1YcKyJXrWnJEA2UbUmyRa5cwZ8S7HXOIvMhCQS897Tzjpab -lfnIKE0n99c2ylJ4y4fHYSXYDKiCPKniFio8CxfqY+cAEQEAAYkBvAQYAQgAJhYh -BOM3lInDm3Jw5w4uMDqvHGQTfO5XBQJglZ7xAhsMBQkDwtTPAAoJEDqvHGQTfO5X -FbAL/0XZJW6XUca9d7f6Ft/0crMILRKID5uuSaLN1jG7BuLTwyWPhi7eSWbZQmlD -Fun/E3vHFj3U/WG13DJL6M89f3707R6rKxT1B17Ht53bO9zHqJ9KesP1G+mR3phk -hnxoQFlFvfSASZbDFtwEm3eZs55UBY4EPYf9MV+qPT0iNu1KPVX427uQfI0Ic/m4 -xFAO2XI11wMunDQoXi7rjknjYWxqVyGgqgRLrBD1Bb/aLenKN9Wn4FajEDaYrgpH -46HHyhAOJ2RZbenWO689rZY6/0qPwDGRL7B2xiktu2G+e5JMJjuRhwEB0g63G8M1 -MVuRGr/PvrBjs58kF47rxWpp2xmo8dqCHjNS3ze9pl6oyshPa1J5zeDTNk3Ujgr9 -IJEzWLDWv9PP9ApcSD15Ia60bxSvsC8FJAZh81JEadLywx0QNBLmnMP3Dxpd21LK -W8cWXa31F6E6eNf/45h7UGxVBRoOdPQ/Kwg4z69V9T/AXOuK65XgtG5ajwlmoQcv -Vx7KIrkCDQRgloMRARAAtRIaNwOpLKA1ogvpzgx8/A8PeXCKvKPZ/ls+8sJ8RSZb -b8lmd+HN52sotj3h9XGZXO1123WLW5F7n/M3HazRBRLlIoUf5kWnuQmXXmUZ6DEC -mq9VoZ30CPHWDEZv/BoScXEHMZNEppziebe2r57SqY9cIONt7B2wzi3sVcYOtDye -c+9BUQoEEv/grSfRN/1Lzezb8Ac9XY0Jet9XK/ImKbGCoxMNzszGQeFO2Neg4hVG -65NIHjTRwzMUOp2D9GV14z/mu2xj5z0mP8zTLw2nzjSW8b0s9ewsvawH45s+XBS8 -ndMU3R+pnHqZBJXU1OR9XjSSMZhaNk+cpOgVwlmbGhNUZ4jSPNVZr/fABpgpY7Bh -ctY42Q3DZVSMwSmiGZA2Uoy7kKx2qtm1Q0ogh6x5mq9QKHODuh+Uc1XhbqxheySv -/jWxvnWhRqaRMBIY+H6vFbXRkQvYjdtwwHZvBRyF5VOsdSUbdLunjyIeKTl2wMqR -hm0y2li+nbTE+zbCcguGPtIMZq6V08M3OZZGxT1jZZocOi3y0qwuApaQvAvk7GpC -mjjbSsq/ykbPUMSQHqAh77YY/9/v2kBh5u21fBPmtPyndAeZTNyukJ2dq8pecVgP -eqT/sSs/Gn56T1cekPEIuUkUxQ4K1sLah1z4G+jg8VqCPIj4yBH6pfd6zBEPx70A -EQEAAYkD8gQYAQgAJhYhBOM3lInDm3Jw5w4uMDqvHGQTfO5XBQJgloMRAhsCBQkH -hh93AkAJEDqvHGQTfO5XwXQgBBkBCAAdFiEExEoeTMpVzDyCCrnkOlA5Ga/6SF8F -AmCWgxEACgkQOlA5Ga/6SF9U+hAAs59FJP2pCQDnrFCrmk38mVePAyPNceSm7IEl -zJWuoxf6XOkz7SP7Vh4mPxyRj3yltEnFN5tLvDOF8W+AwMMMHrK9TnXxnJ2HwCbY -ifLgAGmNrMq+IoagTJDAZvlkp4m3gHe6zDYv9UIbFKdnB48FbwtahNm9LjMbqNDc -nLBt+IuiO/PXUu6c56Wl+L9ntOSVLb1ySnRisI4iYx4J80GcFaMjlJFjQ5uGt0jh -Ardq4zFLYgJfTTl6cM8WTANiKO2a6DgpZxb1knfKOjdasqeQcEs4ZcB6Nf9Bcw/X -Qe2Ee85FA+qClxuIMTT5l6fDw+DXgZfSR0clwA4rMY7hCUvuRxCjc1LDOCbyHe/Z -PUAntlNNKrXEicXxi8Odpzcq0/rDR53OMyzFhGXpbbxa89F/B96H249IW/waefN6 -VKpSb693VOyl8AtQ2tRAvy7YxYyhUQIKKCuahjdoib3GmFNE67rjW9MUVfefIhvp -nBJaY8tp8YhYrDF0U9DMuYrTLcPu5VsR7gvlFY30If1XCavpAnq+eNaxIdTDIKfJ -Q2cgALPBfzogEOeR+RY4Lo46dIGCaEYTpbImcJdum0GVACoMb0T1oOXIHWd1hy46 -ianYKGxMmjfS1f13cr6F1U18l8QKMBZhNTBazw2IdXaugdnbqryEsp20zPQ+caGR -+E1wZmOLMAv+JMPJSK7Ra9cQf6GEos1XurjhaoegPh0Y9U4p1Dk1pQduI7togmJ/ -bhvIpawfi52rI/4I4g1HqjcU8iG6ZjTVE7kVVvDISex71czbmV9isWvW0HJlDgTQ -piZbTCPqvgyEZRF0eIA+VTXOKD/qUwxvw3jo75KEcmW+sezqctREgH02EBPuD5GC -Qyxi7+nNq37FTNYReydCEGEDfJXZ6x12FkW9nPe2fkxx7WT/ceVT2jGtSG4re5vk -wYtnfgKvfHXYmTudoMuVmIsJc9zcdvhL1Nmrd1BOyeJmQCNyvwP48OkU5TqIGHc4 -PcbwniPKO8tozjuwE+iO2TjgwWc/Eg5hLPGYlyqalysP4nOO/KYLBwvgTrPse40N -jg4/3Ew4DKxsrHtCGfhx+i5pXVYwbWklPd7mDmmvxnM5gFEqs0VMMGsjElCzDsmm -v3fSDNozRpd0LXK7J4QGwtOBVivNf7XDQOx5ZXbh/HTQuTG2/8FMCbwUwPYFLx07 -hHHFn9+/wu20 -=bgvm ------END PGP PUBLIC KEY BLOCK----- -``` - -This comprehensive approach to security, including automated builds, careful -selection of third-party libraries, and transparent verification methods, -ensures that users can trust the software they are using while also providing -the tools needed to verify that trust independently. diff --git a/manual/basic-concepts.md b/manual/basic-concepts.md deleted file mode 100644 index 03da79fa..00000000 --- a/manual/basic-concepts.md +++ /dev/null @@ -1,88 +0,0 @@ -# Fundamental Concepts for Beginners - -If you're new to GPG (GNU Privacy Guard) or PGP (Pretty Good Privacy), it's -essential to understand some key concepts before diving in. This knowledge can -help you avoid common pitfalls, such as accidentally sharing your private key, -and ensure your communications remain secure. - -## Key Concepts of GPG/PGP - -### Key Pair Basics - -In the world of GPG/PGP, everything starts with a key pair. Think of a key pair -like a set of two uniquely related keys on a key ring: - -- **Public Key**: This is like your home address that you can share with anyone. - Others will use it to send you encrypted messages or verify your digital - signature. -- **Private Key**: This is akin to the key to your house. It must be kept secret - because it can decrypt the messages sent to you or sign messages from you. - -#### Why Both Keys? - -The magic of this system lies in its use of cryptographic algorithms. Data -encrypted with your public key can only be decrypted by your private key, and -vice versa. This ensures that only the intended recipient can read the message, -and it can verify the sender's identity if a signature is used. - -### Generating Your Key Pair - -Before you can start encrypting or signing anything, you need to generate your -key pair. This process involves choosing a cryptographic algorithm (like RSA or -DSA) and often setting a key size (with larger sizes being more secure but -slower). - -#### Safety First - -When creating your key pair, you'll also be asked to enter a passphrase. This -adds an extra layer of security, as the passphrase will be needed to access your -private key. Choose a strong, memorable passphrase to protect your key. - -### Understanding Subkeys - -A GPG key pair doesn't have to be limited to just one public and one private -key. You can generate subkeys for specific purposes, such as: - -- **Encryption Subkey**: Used solely for encrypting and decrypting messages. -- **Signing Subkey**: Used for creating and verifying digital signatures. - -Subkeys are tied to your primary key pair but can be revoked or replaced -independently, which is useful if a subkey is compromised but your primary key -remains secure. - -### The Role of the Primary Key - -Your primary key pair is the foundation of your GPG identity. All subkeys are -associated with this primary pair. The primary key is typically used for -signing, to establish trust within the network, and to certify subkeys. - -#### Protect Your Primary Key - -If your primary private key is compromised, the entire security of your key ring -is at risk. Therefore, it's crucial to: - -- Keep your primary private key in a secure location. -- Use subkeys for day-to-day encryption and signing tasks. -- Consider using hardware security modules (HSMs) or smart cards to store keys - securely. - -## Best Practices for Beginners - -1. **Backup Your Keys**: Securely backup your private keys (especially the - primary one) in case of hardware failure or loss. -2. **Use Strong Passphrases**: Your key's security is only as good as your - passphrase. Use a long, complex passphrase that is difficult to guess. -3. **Regularly Update Your Keys**: Over time, cryptographic standards evolve. - Regularly review and update your keys and algorithms to ensure they remain - secure. -4. **Learn Key Management**: Practice importing, exporting, revoking, and - verifying keys. Good key management habits are crucial for maintaining your - security over time. -5. **Engage with the Community**: The GPG/PGP community is vast and supportive. - Join forums, read blogs, and participate in discussions to learn from - experienced users. - -By understanding these fundamental concepts and adhering to best practices, -you'll be well on your way to securely using GPG/PGP. Remember, the goal is to -protect your communications and identity in the digital world, and a solid grasp -of these basics is the first step.
\ No newline at end of file diff --git a/manual/basic/dependencies.md b/manual/basic/dependencies.md deleted file mode 100644 index ac3ae52d..00000000 --- a/manual/basic/dependencies.md +++ /dev/null @@ -1,21 +0,0 @@ -# Dependencies and Acknowledgements - -GpgFrontend incorporates various libraries and binaries that come with their -unique licenses. For additional details or to obtain the source code, please -visit their respective homepages: - -- **GnuPG**: [https://gnupg.org](https://gnupg.org) -- **GPGME**: [https://gnupg.org/software/gpgme/index.html](https://gnupg.org/software/gpgme/index.html) -- **Qt (Open Source)**: [https://www.qt.io](https://www.qt.io) -- **MSYS2**: [https://www.msys2.org](https://www.msys2.org) -- **Mingw-w64**: [http://mingw-w64.org/doku.php](http://mingw-w64.org/doku.php) -- **AppImage**: [https://appimage.org](https://appimage.org) -- **macOS Application Bundles**: [Link](https://developer.apple.com/library/archive/documentation/CoreFoundation/Conceptual/CFBundles/BundleTypes/BundleTypes.html#//apple_ref/doc/uid/10000123i-CH101-SW1) -- **libarchive**: [https://www.libarchive.org](https://www.libarchive.org) -- **spdlog**: [https://github.com/gabime/spdlog](https://github.com/gabime/spdlog) -- **mimalloc**: [https://github.com/microsoft/mimalloc](https://github.com/microsoft/mimalloc) -- **Qt-AES**: [https://github.com/bricke/Qt-AES](https://github.com/bricke/Qt-AES) - -The icons utilized in this software are sourced from [Alibaba Iconfont](https://www.iconfont.cn/). -This vector icon library is free of use, isn't registered as a trademark, has no -copyright issues, and can be commercially utilized. diff --git a/manual/basic/encrypt-decrypt-file.md b/manual/basic/encrypt-decrypt-file.md deleted file mode 100644 index 77e66194..00000000 --- a/manual/basic/encrypt-decrypt-file.md +++ /dev/null @@ -1,66 +0,0 @@ -# Encrypt & Sign File - -GpgFrontend offers a fast and convenient method for working with files. The -encryption and decryption process for files is nearly identical to that of text, -with the exception that file operations involve binary input and output. - -## File Extension Introduction - -For ciphertext in ASCII format, the file extension is typically "asc" and these -files can be opened with a text editor. On the other hand, if the ciphertext is -in binary format, the file extension will be "gpg". Binary ciphertext files are -generally smaller than ASCII format. - -Before version 2.0.4, GpgFrontend generated ciphertext files exclusively in -ASCII format. However, beginning with version 2.0.4, GpgFrontend now generates -ciphertext files in binary format by default. This setting can be adjusted in -the program's settings. - - - -## File Browser - -From the top menu's "File" option, you can access the file browser by pressing -Ctrl/Command + B. After choosing target directory at system navigator, you -can then use the file browser tab to do some operations on files. By using the -file browser, you can navigate to your working directory and right-click on the -file you wish to work with. This will open a pop-up menu, where you can select -the operation you want to perform on the file. - - - -Located at the top of the file tab are two control buttons. The button on the -left allows you to navigate up one level in the directory hierarchy, while the -button on the right refreshes the input box on the left with the corresponding -path. - -On the far right of the file tab, there is a button with useful options that you -can select to show system files or hidden files. - - - -### Encrypt & Sign - -GpgFrontend recommends using the encryption and signature functions in this -method, so that the recipient can verify that the ciphertext originates from -you. You can select one or more recipients' public keys as well as your own -private key to complete this operation. - -When the operation is complete, a file with the ".gpg" extension is generated. -This file contains both encrypted content and signed content. - - - -### Decrypt & Verify - -When decrypting this ciphertext, it undergoes verification, which enhances -security. Additionally, you can perform a "Only Verify" operation which verifies -the content without decrypting it. To use this operation, you must select a file -with a ".gpg" or ".asc" extension, which contains the ciphertext and signature -content. - -To encourage users to verify whether the ciphertext is signed or not when -decrypting, Gpg Frontend does not provide a separate decryption operation for -this. - - diff --git a/manual/basic/encrypt-decrypt-text.md b/manual/basic/encrypt-decrypt-text.md deleted file mode 100644 index 14074d07..00000000 --- a/manual/basic/encrypt-decrypt-text.md +++ /dev/null @@ -1,144 +0,0 @@ -# Encrypt & Decrypt Text - -The processes of encryption and decryption are fundamental to ensuring the -privacy and security of digital communications. GpgFrontend, a graphical -interface for GnuPG, simplifies these operations, making it accessible for users -to securely encrypt and decrypt text. Before diving into the specifics of how -GpgFrontend facilitates these operations, it's essential to understand the -underlying concepts and the prerequisites for encryption and decryption. - -Encryption is the process of converting plain text into a scrambled format known -as ciphertext, which is unreadable to anyone except those who possess the -correct key to decrypt it. This transformation is done using an encryption -algorithm and a key. In the context of GpgFrontend and most modern encryption -practices, this key is the recipient's public key. A public key is part of a key -pair that includes a private key; together, they are used in asymmetric -encryption, a cornerstone of modern cryptography. - -To initiate encryption with GpgFrontend, the sender must first have access to -the recipient's public key. This key is used to encrypt the message, ensuring -that only the recipient, who holds the corresponding private key, can decrypt -and read the message. The public key can encrypt messages, but cannot decrypt -them. This is a crucial aspect of asymmetric cryptography: it allows anyone to -send encrypted messages to the key owner without being able to decrypt messages -encrypted with that same public key. - -Generating a key pair is the first step in being able to engage in these secure -communications. This process usually involves choosing a key type and size, with -larger keys offering higher security. Once generated, the key pair consists of a -private key, which must be kept secure and confidential, and a public key, which -can be shared with anyone who wishes to send you encrypted messages. - -Decrypting a message with GpgFrontend requires the private key corresponding to -the public key used for encryption. Upon receiving an encrypted message, the -recipient uses their private key with GpgFrontend to decrypt the ciphertext back -into readable plain text. This decryption process is secure because the private -key is never shared, and it is computationally infeasible for an attacker to -derive the private key from the public key or the encrypted message. - -GpgFrontend streamlines these operations, providing a user-friendly interface -that abstracts the complexities of cryptographic operations. Users can easily -import public keys, encrypt messages or files for specific recipients, and -decrypt incoming messages or files using their private keys. This makes -GpgFrontend an invaluable tool for anyone needing to secure their digital -communications, from sensitive personal correspondence to confidential business -communications. - -In summary, encryption and decryption with GpgFrontend rely on the foundational -principles of asymmetric cryptography, where a public key is used for -encryption, and a corresponding private key is used for decryption. Before -engaging in these operations, users must generate a key pair and share their -public key with those from whom they wish to receive encrypted messages. This -setup ensures that only intended recipients can read the contents of encrypted -communications, providing a robust framework for privacy and security in the -digital age. - -## Encrypt - -The Encrypt operation itself uses a public key and does not require a private -key. Remember that whoever you want to send it to encrypts it with whose public -key. For people who don't use gpg very often, they often get confused and use -their own keys to encrypt ciphertext. - -### Only Encrypt - -In this case, you only encrypt the ciphertext, which results in a shorter -ciphertext. This is because the ciphertext does not contain additional signature -information that identifies the encryptor. If you do not want the recipient to -know your identity, use this method to generate your ciphertexts. - -After the encryption operation, no additional information will be displayed in -the information board except for a prompt indicating whether the operation was -successful. - - - -### Encrypt Sign - -To encrypt and sign text, you need to first prepare the plaintext and have a -public key that can perform encryption operations. The public key used for -encryption should belong to the intended recipient, not yourself. It is -important to verify that the recipient's public key has cryptographic -capabilities for encryption before proceeding. - -If you want the recipient to know that the ciphertext is from you, you can also -choose to sign the text while encrypting it. This ensures that the decrypted -text is credible and comes from your hand. This method is commonly used when -both parties need to ensure the authenticity of the decrypted text, and -typically in scenarios where both parties know each other. - -To encrypt and sign at the same time, select the public key(s) you need to use -for encryption, and during the encryption process, select the private key you -need to use for signing. This private key should belong to you and should have -the capability for signature operations. You can verify this by checking the -usage column in the key toolbox on the right (letter S stands for signature). - -The ciphertext generated by this operation is longer than ciphertext generated -by only encryption because of the additional signature information attached to -it. After the operation is complete, information about the cryptographic and -signature operations will be displayed in the Infomation Board, including -information about the signature pattern and algorithm used. - -To verify the authenticity of the ciphertext before decryption, you can use the -validate operation. Once the ciphertext is verified, you can proceed with -decryption using your private key. - - - -## Decrypt - -When decrypting the ciphertext, you can simply paste the obtained ciphertext -into GpgFrontend, and it will automatically select the appropriate private key -for decryption. It is important to note that decryption must be performed with -the private key associated with the public key used for encryption. - - - -When decrypting a ciphertext, it is not necessary to check the usage column in -the key toolbox to determine if the key is valid for decryption. Instead, you -need to use a valid private key that corresponds to the public key used for -encryption. You can identify whether a key is a public key or a private key by -checking the type column in the key toolbox. If all your local keys are not -valid for decryption of the ciphertext, the program will display a decryption -failure message. - -## Decrypt Verify - -During decryption with verification, gpg will check the signature attached to -the ciphertext to ensure its authenticity. This provides an additional layer of -security and helps to prevent tampering with the encrypted message. - -To perform decryption with verification, you need to select a file with a ".gpg" -or ".asc" extension, which contains the ciphertext and signature content. If the -signature is valid, gpg will decrypt the message and display it in plain text. -Otherwise, it will display an error message indicating that the signature is not -valid. - -It is important to note that whether a key pair can be used for verification -will not be displayed in the usage column. Instead, you need to remember that a -valid public key can be used for verification. Therefore, it is a good habit to -always verify the signature during decryption, regardless of whether the -encryptor has signed in advance. This helps to ensure the authenticity and -integrity of the decrypted message. - - diff --git a/manual/basic/generate-key.md b/manual/basic/generate-key.md deleted file mode 100644 index 29d52ca5..00000000 --- a/manual/basic/generate-key.md +++ /dev/null @@ -1,203 +0,0 @@ -# Generate Key Pair & Subkey - -Sure, let's go through the process of generating a key pair and subkeys. - -To generate a key pair using GpgFrontend, follow these steps: - -1. Open GpgFrontend and click on the "Generate Key" button. -2. Fill in the required information, such as your name and email address. -3. Choose the type of key you want to generate (RSA, DSA or ECC). -4. Set the key size and expiration date, if desired. -5. Create a passphrase to protect your private key. -6. Click "Generate" to create your key pair. - -Once your key pair is generated, you can add subkeys to it by following these -steps: - -1. Select the key pair you want to add a subkey to. -2. Click on the "Add Subkey" button. -3. Choose the type of subkey you want to add (encryption, signing, - authentication, or all). -4. Set the subkey size and expiration date, if desired. -5. Create a passphrase to protect your subkey. -6. Click "Add" to create your subkey. - -You can add multiple subkeys to a key pair, each with their own specific -purposes. This allows you to have more control over your key pair's security and -usage. - -## Generate Key Pair - -You can quickly understand the process of generating a key pair by watching the -following animation. - - - -### Name & Email & Comment - -The three fields, including name, email, and comment, are used to help users -differentiate this key pair from other key pairs they may have. Among these -three options, name and email are mandatory, while comment is optional. - -It is important to note that the name should be at least 5 characters long, and -the email should follow the correct format (no actual email account is -required). - - - -### Expiration Date - -Setting an expiration date for the key pair is a way to limit the validity of -the key over time. Once the expiration date is reached, the key can still be -used, but its operations, especially signature operations, will be considered -invalid. By default, GpgFrontend suggests setting the expiration date to two -years after generation, but you can also choose to check the "Never expire" -checkbox to make the key pair permanent. - -It's important to note that this option can be changed at any time after -generation, even after the expiration date has passed, as long as the primary -key still exists. - - - -### Key Size & Algo - -Setting an expiration date for the key pair is a way to limit the validity of -the key over time. Once the expiration date is reached, the key can still be -used, but its operations, especially signature operations, will be considered -invalid. By default, GpgFrontend suggests setting the expiration date to two -years after generation, but you can also choose to check the "Never expire" -checkbox to make the key pair permanent. - -It's important to note that this option can be changed at any time after -generation, even after the expiration date has passed, as long as the primary -key still exists. - - - -### Passphrase - -Setting a password to protect the primary key is crucial in case of a security -breach. If the "Do not set password" checkbox is unchecked, you will be prompted -to enter a password during the key pair generation process. Follow the prompts -to set the password. Once the password is set, whenever you need to use the -primary key for an operation, you will need to enter the password to unlock it -(some systems have a password manager to automate this process). - -However, you can also check the "Do not set password" checkbox to skip setting a -protection password for the primary key. But this is not recommended due to -security concerns. - -### Usage - -When generating a key pair, you can specify the usage for the first subkey, -which is the primary key. There are four options: - - - -- Encryption: Once generated, this key can be used for encryption purposes. - -- Signing: Once generated, this key can be used for signature purposes. - -- Certification: This key can be used to certify or verify other keys. Only the - primary key can have this usage. - -- Authentication: This key can be used for authentication purposes, such as with - SSH keys. - -The third of these four uses (authentication purposes) can only be owned by the -primary key. In addition, some usages are not available when using certain -algorithms for encryption. For example, when the DSA algorithm is selected, the -encryption uses are disabled. - -## Generate Subkey - -It is possible to append subkeys to an existing key pair. The subkey does not -require the input of a name, email, or comment, as the remaining steps are -essentially identical to those for generating a key pair. - - - -### Extra note - -Below are some guidelines that may prove useful in comprehending the -aforementioned concepts and utilizing this tool accurately. - -#### Understanding Primary Keys and Subkeys - -In the realm of cryptography, key management plays a crucial role in ensuring -data security. A key pair consists of a primary key and one or more subkeys, -each serving distinct functions yet working together to secure and manage -digital identities and communications. This structure not only enhances security -but also provides flexibility in key usage and management. - -#### The Role of Primary Key and Subkeys - -- **Primary Key**: The primary key is the cornerstone of your cryptographic - identity. It is used for identity verification, which includes signing other - keys to establish trust. The primary key's signature on a subkey validates the - subkey's association with the identity of the primary key holder. - -- **Subkeys**: Subkeys are associated with the primary key and are used for - encryption and signing documents or messages. Subkeys can be thought of as - extensions of the primary key, each designated for specific tasks. This - separation of duties allows for greater security and operational flexibility. - For example, you can have separate subkeys for signing and encryption. - -#### Advantages of Using Subkeys - -1. **Enhanced Security**: By using subkeys for day-to-day operations, you - minimize the risk associated with key exposure. If a subkey is compromised, - it can be revoked without affecting the primary key or other subkeys, thereby - limiting the potential damage. - -2. **Operational Flexibility**: Subkeys allow for specific roles (e.g., signing, - encryption) to be isolated. This means you can renew or revoke subkeys as - needed without disrupting the overall cryptographic setup. - -3. **Convenient Key Rotation**: Regularly updating keys is a best practice in - cryptography. Subkeys make it easier to rotate keys for signing and - encryption without needing to re-establish the primary key's trust - relationships. - -#### Managing Primary Keys and Subkeys - -- **Secure Storage**: The primary key should be stored in a highly secure - location, preferably offline or in a hardware security module (HSM), to - prevent unauthorized access. This is because the loss or compromise of the - primary key jeopardizes the entire cryptographic framework. - -- **Key Generation and Maintenance**: While tools like GpgFrontend provide - user-friendly interfaces for managing keys, they may lack support for advanced - operations like generating multiple subkeys. Therefore, using the command-line - `gpg` tool for such tasks is advisable. Despite this limitation, GpgFrontend - can play a critical role in monitoring the presence of the primary key, which - is essential for certain operations like adding subkeys or signing other keys. - -- **Revocation and Renewal**: Prepare revocation certificates for your primary - key and subkeys in advance. In case of key compromise or expiration, these - certificates allow you to invalidate the keys, informing others in your trust - network not to use them anymore. - -#### Practical Tips for Effective Key Management - -- **Purpose-Specific Subkeys**: If your primary key was not generated with - certain capabilities (e.g., encryption), you can create a subkey with the - required functionality. This allows the key pair to be used for the intended - cryptographic operations without regenerating the primary key. - -- **Multiple Subkeys for Different Devices**: For users operating across - multiple devices, generating separate subkeys for each device can enhance - security. If one device is compromised, only the subkey on that device needs - to be revoked, leaving the others unaffected. - -- **Backup and Recovery**: Regularly back up your key pair, including the - primary key and all subkeys. Secure backups ensure that you can recover your - cryptographic capabilities even in the event of hardware failure or data loss. - -In summary, understanding and implementing a robust key management strategy, -with a clear distinction between primary keys and subkeys, is essential for -maintaining the integrity and security of cryptographic operations. By adhering -to best practices for key usage, storage, and renewal, users can safeguard their -digital identities and ensure the confidentiality and authenticity of their -communications. diff --git a/manual/basic/import-export-key-pair.md b/manual/basic/import-export-key-pair.md deleted file mode 100644 index d98dc23e..00000000 --- a/manual/basic/import-export-key-pair.md +++ /dev/null @@ -1,113 +0,0 @@ -# Import & Export Key Pair - -GpgFrontend provides various methods for importing or exporting key pairs, some -of which are outlined below. Please refer to the guide for more information. - -## Import Key Pair - -To access the import options, navigate to the toolbar and select the desired -method based on your specific requirements. Additionally, you can access -additional options by selecting the action menu in the key management section. - - - -In fact, you can find the action menu in the key management section, which -provides access to additional key management options beyond those available in -the toolbar. - - - -### File - -This option allows you to select a public or private key file in text format -with any extension to import. - -### Editor - -You can paste the contents of a key file onto a blank text label page and -GpgFrontend will automatically recognize and import the corresponding key. - -### Clipboard - -You can copy the contents of a key to your system clipboard and then select this -option to import the corresponding key. - -### Key server - -This feature enables users to search for and import public keys from a key -server. Users must first enter the email or ID associated with the desired key -and select the appropriate key server. Upon clicking the search button, a list -of public keys that can be imported from the server will be displayed. Users can -choose to import multiple keys together or double-click on a specific table row -to import a corresponding public key. It is important to note that when using -this method, only public keys can be imported. - -A detailed description of this part can be found -[Here](./key-server-operations.md). - -### Dropdown on Key Toolbox - -You can drag the key file directly to the key toolbox, and then follow the -prompts of GpgFrontend to import the key. - -## Export Key Pair - -When deriving the public key of a key pair using the private key, you can derive -either the public key or the private key or both of all the keys present in the -key pair. However, if there are numerous keys in the key pair, the exported data -can be lengthy. Multiple export methods are available, which are similar to the -import process. - -In Gpg Frontend, the exported data is encoded in ASCII to ensure compatibility -between computers. - -### Export Public Key - -You can find this operation in many places. The following will introduce them -one by one. - -#### Append Public Key to Editor - -To append a public key to the editor in GpgFrontend, right-click on a row in the -key toolbox and select "Append Select Key(s) to Editor" from the pop-up menu. -This will add the public key of the selected key to the end of the text label -page. You can then copy the content to any location as needed. - -#### Export on the Key Pair at Operations Tab - -To export a public key using the Key Pair at Operations Tab, follow the steps -shown in the screenshot below. This will save the data to a file. Before -proceeding, please make sure to choose a suitable directory to store the file -containing the public key data. - - - -### Export multiple public keys at once - -To export public key data for multiple key pairs at once, select the desired key -pairs on the key management interface and click on the "Export to Clipboard" -option. This will copy the data to your system clipboard, which you can then -paste into any application or file. - - - -### Export Private Key - -Private key options are available in various locations on the detail page that -contains the private key (either the primary key or subkey). From there, you can -select a destination and GpgFrontend will export the corresponding private key -content to that location. - - - -Exporting the private key also exports both the public key and private key data, -as the private key data alone is meaningless without the corresponding public -key. Thus, the private key content is typically bundled with the public key -content during export. However, it's essential to note that the private key file -should never be disclosed to others. If leaked, it could compromise the security -of all ciphertexts encrypted by the key. - -You can export the private key data in your key pair in two ways. - -1. Full export: Include all key data and UID and UID signature in the key pair. -2. Minimal export: Only all key data in the key pair is included. diff --git a/manual/basic/key-server-operations.md b/manual/basic/key-server-operations.md deleted file mode 100644 index ed4cf409..00000000 --- a/manual/basic/key-server-operations.md +++ /dev/null @@ -1,164 +0,0 @@ -# Key Server Operations - -Key servers play a pivotal role in the ecosystem of encrypted communication, -serving as a centralized repository for public key information. These servers -enable individuals to share and retrieve public keys necessary for encrypted -messaging, even when direct exchange is not feasible. Key servers are -particularly useful in scenarios where secure communication needs to be -established without prior direct contact, or when a user's public key needs to -be widely distributed or updated due to security concerns. - -When you wish to send an encrypted message but lack the recipient's public key, -key servers offer a solution by allowing you to search for and retrieve the -public key associated with the recipient's email address or key ID. This process -facilitates the encryption of messages in a way that ensures only the intended -recipient, who possesses the corresponding private key, can decrypt and read the -message. - -Moreover, key servers are integral to maintaining the integrity and -trustworthiness of the public key infrastructure. If a user's private key is -compromised, it is crucial to inform others not to use the associated public key -for encrypting messages anymore. By uploading a new public key to a key server -and marking the old one as obsolete or compromised, users can mitigate the risks -associated with the exposure of their private key. - -The functionality of key servers is enhanced by software tools such as -GpgFrontend, which simplifies the process of managing public keys. With -GpgFrontend, users can effortlessly upload their public key to key servers, -search for other users' public keys using an email address or key ID, and import -these keys for use in encrypted communication. The software's user-friendly -interface enables these operations to be performed with just a few mouse clicks, -making encrypted communication more accessible to a broader audience. - -It is important to note that once public key information is uploaded to a key -server, it is propagated across a network of key servers worldwide, making it -available to anyone who searches for it. This wide distribution ensures that -encrypted communication can be established easily across different platforms and -geographical locations. However, users should be aware that public keys uploaded -to key servers cannot be deleted, emphasizing the importance of careful key -management. In situations where a key needs to be updated, such as when adding a -subkey to a key pair, the new key information can overwrite the old one on the -server, thus maintaining the security and relevance of the key information -available to the public. - -In summary, key servers are essential for the secure and efficient exchange of -encrypted messages, offering a reliable method for sharing and retrieving public -keys. They support the integrity of secure communications by facilitating the -widespread distribution of public keys and enabling users to update or replace -keys when necessary. - -## Import Public Key From Key Server - -In the main page or in the key manager's Import key operation mode, there is a -key server option. After selecting this option you can see such an interface. - - - -You can get a list of public keys associated with a key server by searching for -Key ID, fingerprint or email address via the search box. If there is a suitable -public key in the list, you can import it by double-clicking it. - - - -When the import is complete, you can check whether the public key is actually -imported through the pop-up window (no need to import when the local public key -is newer), and you can also check some brief information about the public key. - - - -It is important to note that the public key you import may have expired or been -revoked. You can check the status of the key by navigating to the category tab -in the key management interface. In addition to the search box, you may also -notice a drop-down box that allows you to choose which key server to retrieve -the public key information from. To modify or add to this list of candidate -servers, please refer to the last section of this document: Key server related -settings. - -## Export My Public Key To The Key Server - -If the current key pair has a master key, you have the option to publish the -public key information to a key server. It is important to note that in order to -avoid confusion, GpgFrontend requires the presence of a master key for this -action to be performed. This ensures that users are aware of what they are doing -and the function being performed. - -### How To Use - -You can find the entry of this operation through the operation tab of the key -pair detail interface, as shown in the following figure. - - - -Perform the operation by clicking Upload key pair to key server. Note that the -naming of operations here is a bit confusing, but this is where your public key -information (not your private key) will be uploaded. - -### Synchronize public key information from a key server - -Sometimes, before you perform an encryption operation, you want to know if the -public key you are using is still valid. At this point, you can get the latest -information about the key from the key server (if the public key server has -one). - -As above, you can find this action in the Actions tab of the key pair details -screen, as shown in the image below. - -GpgFrontend will upload the public key information to the default key server -you set. The private key information is not uploaded and should not be manually -uploaded anywhere by the user. - -Refer to the last section of this document on how to set the default key server. - - - -The "Synchronize key pair with key server" function allows for automatic -retrieval of public key information from the key server, which is then compared -with the local key information. After the operation is completed, a pop-up -window will appear indicating whether the key has actually been updated. It -should be noted that this operation is not possible if the private key exists -locally. This is because, in such a case, you already have the key pair and -should publish the latest information for the key pair instead of accepting -outdated information from the key server. - -### Extra Information - -GpgFrontend automatically communicates with the default key server that you have -set to obtain the necessary information. You can refer to the last section of -this document to learn how to set the default key server. - -## Sync ALL Public Key - -This is an advanced function provided by GpgFrontend, it can synchronize all -your local public key information at one time, if you want to know, please read -[this document](../features/sync-all-public-keys.md). - -## Key Server Related Settings - -If you want to set a list of key servers or a default key server, you can do so -by accessing the Settings interface and navigating to the Key Servers tab. Here, -you will find options for managing your key server candidate list and -determining which key server is set as the default. - - - -To add a candidate key server to the list, simply enter the http or https -address of the key server you wish to add into the input box and click "Add". It -is strongly recommended that users use the https protocol to prevent -man-in-the-middle attacks. If you wish to delete a candidate key server, simply -right-click on the corresponding row in the table and select "Delete" from the -pop-up menu. To edit an existing candidate key server address, double-click on -the address in the table and edit it. - -To test the network connectivity of the servers in the key server candidate -list, click the "Test" button located at the bottom of the Key Servers tab. -However, note that the test only determines if the keyserver is reachable, not -whether the address is a valid keyserver. - -### Set Default Key Server - -To set a candidate key server as your default key server, you can follow these -steps. First, locate the candidate key server you want to set as the default in -the table. Then, right-click the row of the corresponding key server, and click -"Set as Default" in the pop-up menu. Once set, you can verify whether a -candidate key server is the default key server by checking the first column of -the table. diff --git a/manual/basic/sign-verify-file.md b/manual/basic/sign-verify-file.md deleted file mode 100755 index 91d10093..00000000 --- a/manual/basic/sign-verify-file.md +++ /dev/null @@ -1,101 +0,0 @@ -# Signing & Verifying Files - -GpgFrontend extends its utility from handling text-based operations to -facilitating file operations with ease and security. The principle behind -signing and verifying files mirrors that of text, leveraging the robust -framework of digital signatures. However, a significant distinction lies in the -nature of the input and output for file operations, which can be binary, -accommodating a wider range of file types beyond simple text documents. - -When signing a file using GpgFrontend, the software utilizes the private key of -the user to create a digital signature. This process begins by computing a hash -of the file's contents, regardless of whether the file is a document, image, -executable, or any other binary format. This hash serves as a compact -representation of the file's data. Subsequently, the hash is encrypted with the -user's private key, producing a digital signature unique to both the file and -the key used. The resulting signature can either be attached to the file or -stored separately, depending on the user's preference and the requirements of -the application. - -Verifying a signed file with GpgFrontend involves the corresponding public key -of the private key that was used for signing. The verification process decrypts -the digital signature using this public key to extract the original hash value -that was generated during the signing. Simultaneously, the software computes a -new hash from the file that is purported to be authentic. By comparing these two -hash values, GpgFrontend can determine if the file has been altered after it was -signed. If the hashes match, it confirms the file's integrity and authenticity, -assuring the recipient of its untampered state and the signer's identity. - -This binary capability of file operations in GpgFrontend not only broadens the -scope of digital signatures to encompass a variety of file types but also -ensures that the integrity and authenticity verification process is not limited -to text-based data. It provides a critical layer of security in digital -communications, where files of all kinds are shared and exchanged with the -expectation of privacy and trust. - -The application of digital signatures to files through tools like GpgFrontend is -especially relevant in scenarios where the authenticity of the file source and -the integrity of its contents are paramount. This includes software -distribution, where verifying the source and integrity of software packages is -crucial to prevent malware distribution; document sharing in legal and financial -contexts, where tampering could have serious implications; and multimedia -content distribution, where copyright and ownership are significant concerns. - -In summary, GpgFrontend's support for signing and verifying files elevates the -security of digital file exchanges by applying the principles of cryptography in -a user-friendly manner. By accommodating binary file operations, it ensures that -digital signatures are accessible and applicable across a broad spectrum of file -types, reinforcing the pillars of trust and security in digital communications. - -## Introduction to File Extensions - -For ASCII-formatted ciphertext, the filename suffix is usually "asc", and these -files can be opened directly with a text editor. However, if the ciphertext is -binary, its file extension will be "sig" or "gpg". Typically, binary ciphertext -files are smaller than ASCII-formatted ones. - -Prior to v2.0.4, the ciphertext files generated by GpgFrontend were all in ASCII -format. But starting with v2.0.4, GpgFrontend defaults to generating -binary-formatted ciphertext files. You can modify this setting in the settings. - - - -## File Browser - -You can open the file browser (Ctrl/Command + B) via the top menu file option. -After selecting a target directory at system navigator, you can get a new File -browser tab. Using the file browser, navigate to your working directory. Then, -right-click the file you wish to operate on, and select the desired operation -from the pop-up menu. - - - -Two control buttons are located at the top of the file tab. The one on the left -allows you to go up a level, and the one on the right enables you to enter or -refresh the corresponding path in the input box on the left. - -On the far right is a button offering useful options, such as displaying system -files or hidden files. - - - -### Sign - -Through the right-click menu, you can rapidly sign a file. This operation will -generate a file with a "sig" or "asc" suffix, which contains the signature -content. In this scenario, you need to pass both this file and the original file -to the other party to allow them to verify it. - - - -### Verify - -This operation requires you to select a file with a "gpg" suffix (this may be -invalid for binary file ciphertext) or a file with a "sig" suffix for -verification. - -When selecting a file with the "sig" suffix, ensure that the source file is also -present in this directory. This implies that the source file's name is simply -missing a "sig" suffix. - - diff --git a/manual/basic/sign-verify-text.md b/manual/basic/sign-verify-text.md deleted file mode 100644 index 594942d1..00000000 --- a/manual/basic/sign-verify-text.md +++ /dev/null @@ -1,102 +0,0 @@ -# Signing & Verifying Text - -Digital signatures, much like their analog counterparts, serve as a method for -asserting the authenticity and integrity of a digital document or message. -However, unlike traditional signatures, digital signatures offer a much higher -level of security, making it possible to ascertain not only the identity of the -signer but also whether the content has been tampered with since it was signed. - -The foundation of digital signing and verification lies in the field of public -key cryptography, a cornerstone of modern secure communication. This system -relies on two keys: a private key, which is kept secret by the owner, and a -public key, which can be shared with anyone. To sign a document, the signer uses -their private key to generate a digital signature on the document. This -signature is unique to both the document and the private key, ensuring that any -changes made to the document after it has been signed can be detected. - -Verification, on the other hand, requires the corresponding public key. When a -document is received along with its digital signature, the recipient can use the -signer's public key to verify the signature. This process checks that the -signature matches the document and was created with the private key -corresponding to the public key. If the document has been altered after signing, -the verification will fail, alerting the recipient to the tampering. - -One of the advantages of digital signatures is the ability to use multiple -private keys for signing a document, similar to having a document signed by -multiple parties. Each signer uses their private key to sign the document, and -each signature can be independently verified with the corresponding public key. -This method is particularly useful in scenarios requiring the approval or -authorization of multiple entities. - -Digital signatures are a critical component of secure communications, providing -assurances of authenticity, integrity, and non-repudiation. Non-repudiation -means that a signer cannot later deny the authenticity of the signature on a -document they signed. This is especially important in legal, financial, and -sensitive communications, where trust and authenticity are paramount. - -Tools like GpgFrontend facilitate the process of creating and verifying digital -signatures in a user-friendly manner. GpgFrontend is built on top of the OpenPGP -standard, which is a widely accepted protocol for encryption and digital -signatures. The tool allows users to easily manage their encryption keys, sign -documents, and verify the signatures of received documents, thereby enhancing -the security and trustworthiness of digital communications. - -In summary, digital signing and verification through tools like GpgFrontend -leverage public key cryptography to ensure the security and integrity of digital -communications. By enabling users to sign documents with their private keys and -allowing others to verify those signatures with corresponding public keys, -digital signatures provide a robust mechanism for authenticating the origin and -integrity of digital documents, far surpassing the capabilities of traditional -handwritten signatures. - -## Signature Only - -By signing the text, you establish that you are the sole and unalterable -authority for this text. You can simply sign the text without encrypting it as -follows: - - - -To check whether a key can be used for signing, please review the 'Usage' column -in the key toolbox on the right (the letter 'S' stands for signature). - -## Signature with Encryption - -You also have the option to sign and encrypt at the same time by choosing a -public key for encryption and your private key for signing. This is a common -practice where you select two key pairs: one belonging to someone else for -encryption, and your private key for signing. If you don't select a key for -signing, only encryption is possible, but you will receive a warning. It's worth -noting that combining signing with encryption provides an additional layer of -security as it assures the recipient that the message hasn't been altered and it -came from the sender whose identity is verified by the digital signature. - - - -## Verification - -Once you have a plaintext and its corresponding signature, you can verify the -signature using the signer's public key. However, this type of signature isn't -suitable for emails as it can make the email less readable. - - - -To verify a signature with text, you need to have the corresponding public key -for all included signatures. If a suitable public key for a signature isn't -found locally during verification, GpgFrontend will prompt you to import it. - - - -## Verification with Decryption - -When decrypting a ciphertext, it's advised to verify it simultaneously, -regardless of whether the encryptor signed it or not. It's impossible to -determine from the ciphertext's format if it has been signed. Therefore, it's a -good habit to always perform decryption operations with verification whenever -possible. - - diff --git a/manual/basic/symmetric-encrypt-decrypt.md b/manual/basic/symmetric-encrypt-decrypt.md deleted file mode 100644 index 7436fd02..00000000 --- a/manual/basic/symmetric-encrypt-decrypt.md +++ /dev/null @@ -1,60 +0,0 @@ -# Symmetric Encryption & Decryption of Text & File - -## About Symmetric Encryption & Decryption - -Symmetric encryption, in contrast to asymmetric encryption, uses a single key -for both the encryption of plaintext and the decryption of ciphertext. This -method is characterized by its simplicity and speed, making it a popular choice -for encrypting large volumes of data or for scenarios where the sharing of keys -between the sender and receiver can be securely managed. GpgFrontend provides a -user-friendly interface for implementing symmetric encryption, streamlining the -process for users who may not be familiar with the intricacies of cryptographic -operations. - -The process of symmetric encryption with GpgFrontend begins when a user opts to -encrypt data without selecting a recipient's public key from the Key Toolbox. -This action signals the software to use symmetric encryption for the task at -hand. At this point, the user is prompted to create a password. This password -acts as the encryption key, transforming the plaintext into ciphertext through a -cryptographic algorithm. It's crucial that this password is strong and unique, -as the security of the encrypted data directly depends on the password's -complexity and unpredictability. - -Once the password is established, GpgFrontend proceeds to encrypt the data. The -resulting ciphertext can only be decrypted with the exact password used for its -encryption. This means that anyone who wishes to access the encrypted data must -know the password, highlighting the importance of securely sharing this password -between the sender and receiver. - -Decrypting symmetrically encrypted data with GpgFrontend requires the same -password used during the encryption phase. When the 'Decrypt' function is -initiated, the software prompts the user to enter the password. Upon successful -authentication with the correct password, the software decrypts the ciphertext -back into readable plaintext. This decryption process, like encryption, is -straightforward and efficient, but the security of the data relies entirely on -the password's confidentiality. - -Symmetric encryption is particularly useful in scenarios where encrypted data -needs to be stored securely or transmitted over a secure channel, and where the -overhead of managing public and private keys is not desirable. However, the -challenge of securely exchanging the password between the sender and receiver -cannot be understated. If this password is intercepted or guessed by an -unauthorized party, the encrypted data's security is compromised. - -In summary, GpgFrontend's support for symmetric encryption provides a powerful -tool for users needing to secure their data with a password. This method is -distinguished by its reliance on a single password for both encryption and -decryption, offering a balance between simplicity and security. Users must -exercise caution in creating a strong password and ensure its secure exchange to -maintain the confidentiality and integrity of their encrypted data. Symmetric -encryption with GpgFrontend is a testament to the versatility of cryptographic -practices, catering to a wide range of security needs with user-friendly -solutions. - -## How to use it? - -Symmetric encryption is initiated when you click the 'Encrypt' button without -selecting any key in the Key Toolbox. For this type of encryption, a password -must be established for the encryption process. Subsequently, to decrypt the -data, you will need to provide the same password that was used during the -encryption phase. diff --git a/manual/basic/system-requirement.md b/manual/basic/system-requirement.md deleted file mode 100644 index ec90e15c..00000000 --- a/manual/basic/system-requirement.md +++ /dev/null @@ -1,70 +0,0 @@ -# System Requirement - -Before proceeding with the installation and usage of GpgFrontend, it's crucial -to understand the system requirements that ensure optimal performance. This -section provides comprehensive details about the necessary software -dependencies, hardware specifications, and the compatible operating systems. -Meeting these requirements will ensure a smooth, efficient experience while -using GpgFrontend. - -Please read the following subsections carefully to confirm that your system -aligns with the recommended configurations. - -## Hardware - -While the specific hardware requirements largely depend on the size and -complexity of the data you're working with, we generally recommend: - -A computer with at least 1 GB of RAM. However, 2 GB or more is preferable for -smoother performance. The majority of these resources are allocated to your -operating system, but around 100 MB of memory is needed to ensure the smooth -running of GpgFrontend. At least 200 MB of free disk space for software -installation. Additional space will be needed for ongoing work. - -Please note, these requirements are intended to be guidelines rather than strict -rules. It's possible that GpgFrontend will work on lower-spec hardware, but for -optimal performance, the above specifications are recommended. - -## Operating System - -GpgFrontend is compatible with major operating systems including Linux, macOS, -and Windows. Specifically, it recommends Windows 7 and later, macOS 11 and -later, and Ubuntu 20.04 LTS or other equivalent Linux distributions. - -## Software - -To ensure GpgFrontend functions seamlessly, it relies on the following software -dependencies: - -- **Qt Framework:** GpgFrontend is developed using the Qt framework to offer a - rich user experience and cross-platform compatibility. The application - includes: - - - **Qt6:** The primary build utilizes Qt6, ensuring a modern interface and - robust performance. Qt6 is included in the release packages for Linux, - macOS, and Windows, offering straightforward setup without additional - installations. - - **Qt5 Support for Windows:** Recognizing the need to accommodate users on - older versions of Windows, GpgFrontend also provides a Qt5-based version. - This variant ensures compatibility with earlier Windows environments, - extending the tool's accessibility and usability. - -- **GnuPG 2.2.0 or Higher:** GpgFrontend integrates with GnuPG for its - cryptographic operations, including encryption, decryption, and digital - signing. GnuPG (version 2.2.0 or newer) is a necessary component to leverage - the full capabilities of GpgFrontend. Please note, GnuPG 1.x versions are not - supported by GpgFrontend due to differences in functionality and support. - Users are encouraged to use GnuPG 2.x to ensure compatibility and secure - operations. - -By catering to a wide range of operating systems and ensuring backward -compatibility with older Windows versions through Qt5 support, GpgFrontend -strives to be as inclusive and accessible as possible. - -## Network - -Although not necessary for basic operation, an active Internet connection may be -required for software updates and accessing online help resources. - -Please note that these are the minimal requirements that we tested, and actual -requirements for your use case could be higher, especially for large datasets. diff --git a/manual/basic/understand-interface.md b/manual/basic/understand-interface.md deleted file mode 100644 index 75ca7ecb..00000000 --- a/manual/basic/understand-interface.md +++ /dev/null @@ -1,176 +0,0 @@ -# Interface Understanding - -As a beginner, you're only required to swiftly comprehend a few crucial sections -of the page. The exploration that follows will gradually unveil additional -functionalities. Bear in mind that interfaces may vary across different -versions. - - - -## Text Editor - -The text editing zone allows you the liberty to input any desired text or -establish a new tab through the "New" choice in the file menu at the top. Moving -or closing tabs can be done with ease as per your needs. - -Numerous operations can be performed on your text using options available in the -Operations Bar. Alternatively, you may utilize standard shortcuts like -Ctrl+C/V/S for copy, paste, and save operations, or even searching within the -text. - -The edited text within the text box is encoded in UTF8 without any formatting. -This plain text format ensures that no message alteration leads to confusion. -While we have plans to introduce rich text editing in the future, the specifics -are still being deliberated. - -### Large Text File Support - -GpgFrontend accommodates opening larger files without hindrance. However, when -dealing with relatively large files, editing of the tab won't be feasible until -the entire file is loaded. During this time, despite not being able to edit the -file, you still have the capability to view it. - -## Information Board - -GpgFrontend presents the outcome of the current tab page operation on the -Information Board, signifying the success or failure of the operation. -Additionally, the Information Board's text includes supplementary details to -assist in understanding the particulars of your encryption, decryption, -signature, and other operations. Depending on your language settings, the output -displayed on the dashboard may differ. - -The Information Board was conceived to provide a comprehensive view of more -information within the same space. However, GpgFrontend plans to incorporate a -graphical interface in the future to augment the user's comprehension of this -information. - -### Color Coding - -- **Green**: Indicates a successful operation that has been thoroughly verified - and found devoid of any issues. The appearance of green font color signifies - an all-clear. -- **Yellow**: Denotes a successful operation with some potential issues detected - during result testing. The yellow font color serves as a subtle alert for the - user, necessitating a detailed review of the operation. -- **Red**: Symbolizes an unsuccessful operation or a significant discrepancy in - the operation's outcome. The red font color acts as a clear warning, demanding - the user to meticulously inspect the operation's specifics to ensure security. - -### Customizable Font Size - -Should you find the font size on the information board to be diminutive, you can -easily adjust it under the 'Application' section in the settings. The default -font size is 10, and it can be modified to any value ranging from 9 to 18. - -### Dashboard Actions Menu - -The dashboard actions menu facilitates quick and easy access to common -functionalities related to the content of the information board. It empowers -users to efficiently manage and process large chunks of content on the -Information Board for various purposes. - -#### Copy - -This function allows users to swiftly capture significant portions of content -from the Information Board for other applications. - -#### Save File - -This operation archives the contents of the information board into the file -system, utilizing the UTF-8 format. Although the resultant output file lacks a -suffix, it is essentially in a plain text format. - -#### Clear - -This command promptly purges all content from the information board. The -clearance includes both the contents and statuses of the information board. A -new operation (such as encryption) will automatically trigger this clearing -process. - -### Optional Actions Menu - -In addition to the Information Board, an Optional Actions Menu will be presented -below it. If any auxiliary operations can be performed post your main operation -(such as displaying more detailed information, sending encrypted text via email, -etc.), the access points for these supplementary tasks will be made available -here. - -## Key ToolBox - -This feature presents a comprehensive list of key pairs stored on your device, -intended for use with Gpg operations. The keys within the ToolBox are classified -into multiple categories, each corresponding to a unique usage context. -Additionally, the ToolBox provides access to a variety of common operations, all -of which can be found in the Key List Menu. - -### Usage - -Most Gpg-related operations require specifying a key pair (for tasks like -encryption, decryption, signature, etc.). You can select the checkbox in the -first column of the Key ToolBox's table to designate one or more keys for your -operation. Categories that contain only public keys are frequently utilized in -cryptographic scenarios. - -### Classification - -The ToolBox showcases categories via tabbed display. None of these categories -include any expired or revoked keys. To view such keys, you should refer to the -Key Manager. The default category comprises all private and public keys. During -any operation, only the keys from the currently selected category will be -considered for input. - -### Columns - -Understanding this list is crucial. Let's walk through its components step by -step. - -- **Select**: Check the box in this column to notify Gpg Frontend that you wish - to use the key from this row for your subsequent operation. - -- **Type**: This column informs you about the key type and whether the primary - key exists in your key pair. - - - `pub` signifies that it is a public key, which can be used for encryption or - verification operations. - - `pub/sec` indicates that the key pair contains both public and private keys. - It can be employed for nearly all operations (consult the 'Usage' column to - confirm this). - - `pub/sec#` shows that the key pair has a public key and a private key, but - the primary key is absent from the key pair. This suggests you won't be able - to perform certain specific operations (like adding subkeys, signing other - key pairs, etc.) - - `pub/sec^` implies that one or more keys (subkeys or master keys) from the - key pair are in the smart card. - - `pub/sec#^` denotes a simultaneous occurrence of the previous two - situations. - -- **Name**: Represents the identity information of the key pair. -- **Email Address**: Also denotes the identity information of the key pair. -- **Usage**: Determines which operations the key pair can execute. Composed of - four uppercase letters, each letter signifies a specific use. - - - `C` stands for Certificate. Key pairs containing the primary key generally - have this usage. - - `E` stands for Encrypt. The key pair can be used for encryption operations. - - `S` stands for Sign. The key pair can be used for signing operations. - - `A` stands for Authenticate. The key pair can be used to perform operations - like SSH authentication. - -- **Validity**: A Gpg concept that roughly represents the level of trust in this - key. - -## Operations Bar - -Here, you can execute corresponding operations by clicking on the buttons -provided. For instance, after inputting text into a text editor and specifying -the desired key in the key toolbox, you can click the encryption button to -perform the operation. - -Some operations require key specification, while others do not, as will be -detailed in the respective sections of this document. - -### Customization - -For operations that you may not use for a while, you have the option to uncheck -the associated function group in the top menu view. Conversely, for the -operations you frequently use, you have the ability to add them here. diff --git a/manual/basic/view-keypair-info.md b/manual/basic/view-keypair-info.md deleted file mode 100644 index b3374493..00000000 --- a/manual/basic/view-keypair-info.md +++ /dev/null @@ -1,195 +0,0 @@ -# View Key Pair Details - -You can view the details of a key pair by right-clicking on the key pair in the -key toolbox or key management interface and selecting "Show key details". - -This section may include a brief introduction to gpg-related concepts and could -be relatively long. - -Below is a screenshot of a friend's public key that I obtained from the key -server. - - - -And here is a randomly generated private key. The most significant difference -between this and the previous key is that the key pair with only the public key -is used for encryption only, but if you possess the private key, you can perform -more actions (it also depends on your algorithm; DSA can only be used for -signatures). - - - -## General Info - -This interface provides some useful information to help you manage your key pair -properly. - -### Owner - -This section enables you to know the owner of this key pair. This information is -not fixed and can be changed. You can create a new UID in the UID section and -set it as the primary UID to change it. - -According to the OpenPGP protocol, this part is divided into Name, Email, and -Comment. - - - -### Primary Key - -This part is the information of the primary key of the key pair. The primary key -is very crucial because without it, you cannot perform related management -operations like adding and revoking sub-keys (similar to not being able to open -the key ring). Let's introduce the information of the primary key separately -below. If you want to learn more, see the [Basic Concepts](../basic-concepts.md) -section. - -The absence of the master key means that the private key of the master key does -not exist, but this doesn't mean that neither the public key nor the private key -exists. Please remember: Each subkey and primary key consist of a pair of public -and private keys. - - - -#### Key ID - -This is the unique identifier of the key, which is fixed and unchanging. Note -that this key ID is the key ID of the primary key. The key ID is uniquely -determined after the key is generated. Compared with the fingerprint, the key ID -is shorter and more user-friendly. - -#### Algorithm - -This refers to the algorithm used for key generation. This also pertains to the -generation algorithm of the primary key. The generation algorithm determines the -properties and capabilities of the key. Algorithms such as RSA can be used for -encryption and signature, but DSA can only be used for signature. However, the -DSA key length can be shorter. - -#### Key Size - -This is the length of the primary key. Generally, the longer the key, the harder -it is to crack the ciphertext. But at the same time, it takes more time for a -single operation. Generally speaking, a length of 2048 bits is safe enough (this -refers to the key generated using the RSA algorithm). - -#### Normal Usage - -This refers to what the key pair can conceptually be used for, including the -conceptual usage of the primary key and sub-key. When the primary key or subkey -generation can be used to sign, but it has already expired or does not exist, -the signature usage will still be displayed here. - -#### Actual Usage - -This is the actual usage of the primary key and all subkeys, which is the union -of their usage. If there is only one primary key in the key pair that can be -used for signing, but this primary key does not exist, then the signature usage -will not appear here, only in Normal Usage. In addition, when there is only one -subkey that can be used for signing, if it has expired, the signature purpose -will not be displayed here. - -#### Expires on - -This is the expiration time of the primary key. When the primary key expires, it -will become invalid and you can't use it for any operation. In addition, the -subkeys in the key pair will also be unavailable. Fortunately, you can change -the expiration time of the primary key at any time, or even set it to never -expire. The prerequisite for this is that the primary key exists in the key -pair. - -#### Last Update - -This is the time when the content of the key pair was last updated. Operations -such as adding a UID or subkey will modify the content of the key pair. - -#### Secret Key Existence - -This indicates whether the actual content of the primary key exists. When the -primary key does not exist, if there are still available subkeys in the key -pair, the key pair can still be used for normal operations. However, in the -above case, the content of the key pair cannot be modified (that is, operations -such as adding UID or subkey cannot be performed), and the key pair cannot sign -other key pairs. - -### Fingerprint - - - -The fingerprint of the key pair is used for humans to quickly compare whether -the key pair is the expected key pair. This field is unique for all keys in the -world. You can certainly do this with the key ID mentioned above. - -This also refers to the fingerprint of the primary key. - -## UID Info - -User ID (UID) is used to identify a key, mainly for human identification. It's -similar to a name tag that accompanies a key ring, indicating who the key ring -belongs to. By looking at the UID, users can get a rough idea of whether a key -pair is what they expected. However, for accurate identification, fingerprints -or key IDs should be compared. A key can have multiple UIDs, but a key pair can -only have one primary UID, which is always listed first in the interface. - - - -UID has three elements: Name, Email, Comment. The name should be at least five -characters long, and the email should conform to the format. The rules for -comments are relatively loose. - -### Signature of UID - -The lower section of the interface displays the signature of the selected User -ID (UID), not the checked one. This is a key trust system. When someone receives -your public key, they can use their private key to sign your nameplate, -indicating their recognition of your public key. Afterward, they can upload the -keyring with their signature to the keyserver. If many people do the same, the -public key on the keyserver will have numerous signatures, making it -trustworthy. - -You can also use the primary key of another key pair to sign a UID. Generally, a -primary UID of a key pair with many valid signatures is considered more -trustworthy. - -## Subkey Info - -The sub-key mechanism is a crucial feature of GPG that improves both flexibility -and security. However, it also introduces some complexity, which can be -challenging for beginners. For a basic understanding, consider the following -points: - -- A key pair can be likened to a key ring, comprising a primary key (a pair of - public and private keys) and multiple subkeys (or none). -- Each subkey and primary key consists of a pair of public and private keys. -- The subkey can perform related operations (such as signing, encryption) in the - absence or unavailability of the primary key. -- The functions of subkeys can overlap, and when both subkeys can be used for - signing, the earlier one is selected. -- Subkeys can use more algorithms than the primary key, but usually have the - same effect on daily operations. -- The disclosure of a subkey only affects that subkey, while the disclosure of - the primary key endangers the entire key pair. - -The primary key and all subkeys in the key pair are displayed on the interface. -Some information about the key is also listed below. - -### Key In smart card - -Whether a key is in the smart card refers to whether the key is moved to the -smart card. Moving the key to the smart card changes the structure of the key -and is irreversible. - -### Operations - -In this column, what you can do differs for a key pair that only has a public -key and a key pair that includes a private key. - -Here's what you can do with a public key-only key pair: - - - -And here's what you can do with a key pair that includes a private key: - - - -These operations will be explained in detail throughout the documentation. diff --git a/manual/contact.md b/manual/contact.md deleted file mode 100644 index 5b095c3b..00000000 --- a/manual/contact.md +++ /dev/null @@ -1,146 +0,0 @@ -# Contact Information - -Please avoid discussing business or political matters here. This space is -dedicated to fostering the well-being and advancement of humanity. If you have -any technical questions or suggestions on how to enhance this software, your -insights are very much welcome. - -For correspondence, I strongly prefer plain text emails over HTML formatted -messages. - -## Personal Details - -- **Name:** Eric -- **Email:** [[email protected]](mailto:[email protected]) (Server location: Federal - Republic of Germany) -- **Preferred Email Format:** Plain text, without HTML enhancements. - -### About My Domain - -The domain BKTUS (Bakantu Union US) is not a commercial entity but rather a -personal domain name of mine. - -### Language Proficiency - -I am proficient in the following languages and welcome communication in any of -them: - -1. English -2. Chinese -3. German - -### Secure Communication (GPG Public Key) - -For secure and encrypted communication, below is my long-term PGP public key. -Please ensure any encrypted messages are sent in plain text format and avoid -rich text formats like HTML. - -``` ------BEGIN PGP PUBLIC KEY BLOCK----- - -mQGNBGCVnvEBDACuEcjxckb4rocHGU7VPT/OOOOZapNG/0ViB3XhmzNh7q8QJiq6 -M4z0fpC5sf1pHXbbKtehLETrAUTFuaEp19askZI0ISoz5+qKGZuaM3bDZWBjwUpt -woVgUphfeZy2DFsnmTtVj9CRU9Nma6smXVFud3Roj2ImZ0NFrkdETvprfLJ7jqk/ -mXgznNbbJdqmQ4l0I1E91VmrqHHHSakh3grzRDj/GuDookQl2JZfLA0J55qOYdkF -5mmnqbYURGVcP2oot/wSrrWH0F/WatwRx9w+jZjrJWgKjJoqWwvzG8WGop1XkRn1 -Ea3Nzj/KsSL7C5YRu03BL7wNu6UNIJ/zsAnNLp87nCY85w+HnNGHkL3QcnqNQbQP -3aySOkIjXdT8AlGIV5r5wO/RBg4e+xASGzQXx9lYbjJiiIOP2uLxYGGFbalDoiCa -sonlXzMZTJrK7VvZ2UsnSnBJ8l/EPsY/AeZdWbmswQaFsJlfNsZZ6T5Rfyjtu8a3 -fwPJTTsbfIB6N3EAEQEAAbQbU2F0dXJuZXJpYyA8ZXJpY0Bia3R1cy5jb20+iQHO -BBMBCAA4AhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAFiEE4zeUicObcnDnDi4w -Oq8cZBN87lcFAmCWg1kACgkQOq8cZBN87leJfQv/ShjV9PRi8ixlJ1Ez1TDG+4N9 -EHoi2IwVK1UF51kA9lxyD+8n1ZHpcz7bRXV+YhHAO4A2l1ENrkCJVIZK9OO+Z64l -TPKCV9JVSkxcpnr6sqKJ76Zplwah1ZkwAG9tdK9H95wgeIkO4oSRutX/cCJ35Gko -FfhbV+/OyPYTT2562SZeQ2VqnptGLm0eF+FVt0HP4uxvRyGfgHQD46Ki6dr/JOXQ -j57S06CIHGj1RT4uQVSx53gbFvfIgweHsWraRWwY8jMrgOazlo/KRHG4N04eQdzM -K+WA80ODKuXdhnlGFMhn3RCFZpRV+Upso9syJ1FFChzsuX69+mRPvAojEDnREgd9 -s61nx5xWy6vKMB9oZiomNuPw2EScBwS9EK0M6APqgBaIdL6HOC7kjxBLfqgyhulD -qGZXWNvFj5P2FNMVwSvK1cYftYz+QWqB5BhbJT2H/HpF2xNsH7jfTxwUp6KrN1Bz -geNWgpQDXS5ZXU7dk22BwSah3nXs+LJi3Sloeh/piQHUBBMBCAA+FiEE4zeUicOb -cnDnDi4wOq8cZBN87lcFAmCVnvECGwMFCQPC1M8FCwkIBwIGFQoJCAsCBBYCAwEC -HgECF4AACgkQOq8cZBN87le3zAv/fMnxVMORS5rz/vsc0X8YSldmM1MqdIKSNghK -nQKKnzTBtTKA/oHEyPhjnQRaCfi4eUGeUsdZq8fwbN6sWSmbhJ6cOVgIps9YcS/U -sCV4egUHGy/+ozgDSh563v82ROWxXjszcnFz0F2d4stgroe8A//3OgQDv1wuhMJe -vtSZe8W8ebj7mt0zNjccGQzNkWo82mOyZfjgvK//vWisW4JwP8gfEKBgAktj5MCY -iGS2NbWPAToDIPCA6hKPb3sHQIY2/tGkKwyvr4oxwYRkNq4T5PWcV0p3qRsQudHp -ZXGiL3VNIW04ihLcn8uxSE6sQK2eq5wp/6Wnt1EWG1xb0pU2nPFuAlULHsGxM+bB -YJOk5WzYST1xdgXW3QxVsIoTuVqA+ehqrzvu+gGCz4uenFt6OAswqR7ii8D/Tpso -RAU0nTEOAVpCxXAMgsdUS6jOjtyfTHixGlVL6U3dY3wTuqWdbxmYX/g00PnOTYF0 -1plvf21NHMeYLk68+1nRbtqoLnPViQG5BBABCgAjFiEEnGCv/tNBLyJzYTX+0QUx -Uz7XYkoFAmG6ODgFg2shizAACgkQ0QUxUz7XYkq+BQwAxEzCMKxa21iKv9P7S6Vh -/ZrPMWPzRMoNjMGFeNHxYzyO6lKojoCVsdHaRvqqSota8wVGHglsg4FEZgkqEy+S -kTwMsorqzVhxAtzG9K1pU+wGouT5UPBXFGjusbLfxigxvuIGEVD2025FroE4xvMG -WnyD7r0leWkbF0z1crms2jbPcH0E7nbiiVHA6iOuBV5jo6qm1UxvJH3izSCocrDC -/yqPXg5cng6BPnctcWFzXbVGcB1HQ4LdiN4HWvB7q1mwRG2+qwL+UBybGsMpP+oa -YlIGP0FxNureXJgg8bVGcOOLITmuQ1xTOFu/1lUzk1QBqNql0mvqqScSYsAJxQcy -d95MFFeRLnQ3fJU18YrvlLtJIFxrLE+9IVCQsM3XGblXLCltIEgAunp1ylaVtb/w -4ScbQ/a5vWILh80L3dxcvVe1RlZe6cRwOb4aXRQm7osVaZ/boiaJ1nHYGdrh+qxi -QprHmOXeSPVV708VRaY9t8tSiLCRwVQO1e5e8GeXzIv/uQINBGCWgxEBEAC1Eho3 -A6ksoDWiC+nODHz8Dw95cIq8o9n+Wz7ywnxFJltvyWZ34c3nayi2PeH1cZlc7XXb -dYtbkXuf8zcdrNEFEuUihR/mRae5CZdeZRnoMQKar1WhnfQI8dYMRm/8GhJxcQcx -k0SmnOJ5t7avntKpj1wg423sHbDOLexVxg60PJ5z70FRCgQS/+CtJ9E3/UvN7Nvw -Bz1djQl631cr8iYpsYKjEw3OzMZB4U7Y16DiFUbrk0geNNHDMxQ6nYP0ZXXjP+a7 -bGPnPSY/zNMvDafONJbxvSz17Cy9rAfjmz5cFLyd0xTdH6mcepkEldTU5H1eNJIx -mFo2T5yk6BXCWZsaE1RniNI81Vmv98AGmCljsGFy1jjZDcNlVIzBKaIZkDZSjLuQ -rHaq2bVDSiCHrHmar1Aoc4O6H5RzVeFurGF7JK/+NbG+daFGppEwEhj4fq8VtdGR -C9iN23DAdm8FHIXlU6x1JRt0u6ePIh4pOXbAypGGbTLaWL6dtMT7NsJyC4Y+0gxm -rpXTwzc5lkbFPWNlmhw6LfLSrC4ClpC8C+TsakKaONtKyr/KRs9QxJAeoCHvthj/ -3+/aQGHm7bV8E+a0/Kd0B5lM3K6QnZ2ryl5xWA96pP+xKz8afnpPVx6Q8Qi5SRTF -DgrWwtqHXPgb6ODxWoI8iPjIEfql93rMEQ/HvQARAQABiQPyBBgBCAAmAhsCFiEE -4zeUicObcnDnDi4wOq8cZBN87lcFAmG6N+8FCQTmG90CQMF0IAQZAQgAHRYhBMRK -HkzKVcw8ggq55DpQORmv+khfBQJgloMRAAoJEDpQORmv+khfVPoQALOfRST9qQkA -56xQq5pN/JlXjwMjzXHkpuyBJcyVrqMX+lzpM+0j+1YeJj8ckY98pbRJxTebS7wz -hfFvgMDDDB6yvU518Zydh8Am2Iny4ABpjazKviKGoEyQwGb5ZKeJt4B3usw2L/VC -GxSnZwePBW8LWoTZvS4zG6jQ3JywbfiLojvz11LunOelpfi/Z7TklS29ckp0YrCO -ImMeCfNBnBWjI5SRY0ObhrdI4QK3auMxS2ICX005enDPFkwDYijtmug4KWcW9ZJ3 -yjo3WrKnkHBLOGXAejX/QXMP10HthHvORQPqgpcbiDE0+Zenw8Pg14GX0kdHJcAO -KzGO4QlL7kcQo3NSwzgm8h3v2T1AJ7ZTTSq1xInF8YvDnac3KtP6w0edzjMsxYRl -6W28WvPRfwfeh9uPSFv8GnnzelSqUm+vd1TspfALUNrUQL8u2MWMoVECCigrmoY3 -aIm9xphTROu641vTFFX3nyIb6ZwSWmPLafGIWKwxdFPQzLmK0y3D7uVbEe4L5RWN -9CH9Vwmr6QJ6vnjWsSHUwyCnyUNnIACzwX86IBDnkfkWOC6OOnSBgmhGE6WyJnCX -bptBlQAqDG9E9aDlyB1ndYcuOomp2ChsTJo30tX9d3K+hdVNfJfECjAWYTUwWs8N -iHV2roHZ26q8hLKdtMz0PnGhkfhNcGZjCRA6rxxkE3zuV1CBC/0aOW74yuxVTBhi -c+UNCjbHAZxc6gB8DnhuFp/h0FFfWR5SPKE7KjiZSAH38fzp9i1JT2KMfcDBrs4m -PPCaN7KHViU8Z9YF2FDCn+xqhDvm9j64FNYnTihWttgMM3AbZI+LPbwGl+Uaa4vF -n+sXrUqag8hu7fnCzoE+YPj03CUxSzCw4jXHh0Dyan33msEN6n6G6/XRG073HXxt -xiEaAeNDE+izq98WIfH1c4DVpKFPlD9DVdaCWHzl6vzU3d04g+sUQuMqrScm+rcm -BYCa+SRWnyl2q0dhnG1XjONOBNAZGorB9ooKH5HBFUVeFNsM4ufA+oRp+1XlaqXo -Tc7l+JeDEsVK1fmQljNRhBshaxk8fLPmCi1rmApME33aEGDsg8uc3IZXPe3r8cmY -D/AVSQI5MdPpXqq1VWv+faXL0lZtECtfOXp6l81OX5hqCC7hp6eW7gMofi02YiXU -aBwg2Kx/x2IxG7u9givkBV4oysiedKLNYWUTqjB2aKcRyWISCn+4MwRhujfiFgkr -BgEEAdpHDwEBB0DvyZqcMWkH1WlSfOywXkKTbITdzBKzaf4jtd3g+kjaC4kCMwQY -AQoAJhYhBOM3lInDm3Jw5w4uMDqvHGQTfO5XBQJhujfiAhsiBQkDwtdvAIEJEDqv -HGQTfO5XdiAEGRYIAB0WIQQKoW+sJgfi4tfYq0XFuG82AZ5SpwUCYbo34gAKCRDF -uG82AZ5Sp8xMAQCc6Q7vJXYXIoShHk4RmT1vkAy68k8XgHn9Kw+jbAze4gD9F22u -wWfbsFjiMLUOE2uWlwuLmJN827DBaVw5eOx9HA1F1AwAgFTv4dNTS0jKKIncUN4Y -XX4fA7UbBrwLY8jTAV49V+D+hoFfv09hG+q4xwKwe1yFrgacsHOXnXpTJz6ipU08 -GP9vTheyxSfQUvaWXLzHcGXkaV6aCBsDVWdQ8MHXujOsx/hjQSTDruygmEyc1nFi -aF1BLQDtTXW7GIiQX/l/uLVlnMNI4kdt7YUxjkUL6xD+U5q43B4KyGVIU9+ps4Mr -9wCWS/lot66VLT4FUVTFDF0c8hwEdxVZagZvExlv2SaW3XidRWL5xVAElRs/fgRn -dKFCFDJ1rOLUwj25r6zgu2zXlQ2RHWjgzhLzZmhzv3IX0mI9s5D6bJWy+6/HNCs8 -bTSq0Af79FCdZfPT8GVlY9NWcwsMthxiYJ/cbc/D+w4dX771lP2dU/KZkKuGxdhA -jGWqnGt8lqL3PEIsf1ylPDx6b7peFABWfGlPVUmpik2lTemlqWNPLX5gGmiiktGm -lZ6+bATms7izrrSs521ZKWoUT5TI+qQ7Paq/qsF5zIBGuQGNBGCVnvEBDAC8zNpS -GRHUp+X7hit0bCDPP8HR+rxH50rOVFtQNyXw32lkIrwnHq0Y7FR4t7OSWTkX1xvx -hXMILQdTBxKKrBtFIpQ44cO1UcklkYdCwE/F0lasLLfleo2NlG7ISwNEOxmJcWiw -mkLHN3CnqXpXXqpGDTRavbuhE7yRewp/jNSCsikrvL7NedB5Ef5EZmSkvx7kXibX -KzgKcyft5OlylRMUJS8gzzTPA+xMH/Cl1zFCSgymJw1DK1wx+u0ye2Oj7NDdrYtR -R1qLpCq7kaGIPvIW556/58sj+/YRGeP5JTjhYFk/K8QQr8cK6HWuJQVASJUP+KBk -8CiaqzbOPjlq69eGOymraa8H7JvSR5ArJWPczOxQyiEbYABOtJk1ZSz4v4pa7+RL -UfwFOYuTMyBoY3rJuGhVxA77oHftfjteH1YcKyJXrWnJEA2UbUmyRa5cwZ8S7HXO -IvMhCQS897TzjpablfnIKE0n99c2ylJ4y4fHYSXYDKiCPKniFio8CxfqY+cAEQEA -AYkBvAQYAQgAJhYhBOM3lInDm3Jw5w4uMDqvHGQTfO5XBQJglZ7xAhsMBQkDwtTP -AAoJEDqvHGQTfO5XFbAL/0XZJW6XUca9d7f6Ft/0crMILRKID5uuSaLN1jG7BuLT -wyWPhi7eSWbZQmlDFun/E3vHFj3U/WG13DJL6M89f3707R6rKxT1B17Ht53bO9zH -qJ9KesP1G+mR3phkhnxoQFlFvfSASZbDFtwEm3eZs55UBY4EPYf9MV+qPT0iNu1K -PVX427uQfI0Ic/m4xFAO2XI11wMunDQoXi7rjknjYWxqVyGgqgRLrBD1Bb/aLenK -N9Wn4FajEDaYrgpH46HHyhAOJ2RZbenWO689rZY6/0qPwDGRL7B2xiktu2G+e5JM -JjuRhwEB0g63G8M1MVuRGr/PvrBjs58kF47rxWpp2xmo8dqCHjNS3ze9pl6oyshP -a1J5zeDTNk3Ujgr9IJEzWLDWv9PP9ApcSD15Ia60bxSvsC8FJAZh81JEadLywx0Q -NBLmnMP3Dxpd21LKW8cWXa31F6E6eNf/45h7UGxVBRoOdPQ/Kwg4z69V9T/AXOuK -65XgtG5ajwlmoQcvVx7KIg== -=syqc ------END PGP PUBLIC KEY BLOCK----- -``` - -This setup is designed to maintain privacy and security in our communications. diff --git a/manual/contribute/contribute.md b/manual/contribute/contribute.md deleted file mode 100644 index 29044bc5..00000000 --- a/manual/contribute/contribute.md +++ /dev/null @@ -1,95 +0,0 @@ -# Contributing to GpgFrontend - -Thank you for considering contributing to GpgFrontend! As a community-driven -project currently maintained by a single individual, every contribution, no -matter how small, makes a significant difference. This guide is designed to -provide you with a clear pathway to contributing, whether you're submitting -changes via GitHub pull requests or sending git patches via email. Below, you'll -find the steps to set up your environment, make changes, and how to submit those -changes. Additionally, you'll find contact information for further assistance. - -## Technical Requirements - -To maintain the integrity and compatibility of GpgFrontend, please adhere to the -following technical standards for all contributions: - -- **C++ Standard:** Contributions must comply with the C++17 standard. This - requirement ensures that we leverage modern language features and maintain - forward compatibility. -- **C Standard:** For code that involves C programming, adherence to the C99 - standard is required. This helps ensure our code takes advantage of more - recent language features while maintaining compatibility with various - platforms and compilers. -- **Compiler Compatibility:** Your code should compile successfully with both - Clang and GCC compilers. This cross-compatibility is crucial for ensuring that - GpgFrontend can be built on a variety of platforms and environments. -- **Third-Party Libraries:** Introducing third-party libraries should be done - with caution. Any added library must be compatible with the GPL 3.0 license. - Prior discussion with project maintainers about the necessity and implications - of the new library is required. -- **Code Formatting:** Use our `.clang-format` and `.clang-tidy` configurations - to format your code. Consistent code formatting aids in maintaining the - readability and maintainability of the codebase. -- **Code Maintenance and Attribution:** Be aware that the project maintainer may - edit your code to better fit the project or enhance compatibility. You are - encouraged to include your name and contact information in the code comments - for your contributions if you wish. - -### Additional Standards to Consider - -- **Static Analysis:** To ensure code quality and catch potential issues early, - contributions should pass static analysis checks where applicable. Tools like - Clang Static Analyzer or GCC's `-Wall -Wextra -pedantic` flags can be used to - identify potential issues. -- **Unit Testing:** If your contribution adds new functionality or changes - existing behavior, including unit tests to cover your changes is highly - recommended. This helps ensure that your contributions do not inadvertently - break existing functionality. -- **Documentation:** Update existing documentation or add new documentation as - necessary to reflect your changes or additions to the project. Well-documented - code is essential for future maintenance and for new contributors to - understand the project. - -## Getting Started - -### Step 1: Set Up Your Environment - -Make sure you have a configured Git environment. For GitHub contributions, fork -the repository and clone it locally. For email contributions, ensure Git is -installed on your machine. - -For setting up local development Environment, you can refer to [this -section](setup-dev-env.md). - -### Step 2: Making Changes - -Create a new branch for your work, implement your changes while adhering to the -technical requirements and standards mentioned, and commit your changes with -clear, descriptive commit messages. - -### Step 3: Submitting Contributions - -#### Via GitHub Pull Request - -Push your changes to your fork and submit a pull request to the original -repository. Ensure your pull request describes the changes made and the reason -for those changes. - -#### Via Email with Git Patch - -For email submissions, generate a git patch for your commits and send it to the -project's contribution email address. Make sure to include a detailed -description of your changes and the reasons for them in your email. - -## Contact - -If you have any technical questions or need assistance, refer to the Contact -document for the maintainer's email address. We are here to help and encourage a -collaborative development process. - -## Conclusion - -Your contributions are vital to the success and improvement of GpgFrontend. We -appreciate your efforts to adhere to these guidelines and look forward to your -innovative and high-quality contributions. Thank you for being a part of our -community. diff --git a/manual/contribute/setup-dev-env.md b/manual/contribute/setup-dev-env.md deleted file mode 100644 index 532208a5..00000000 --- a/manual/contribute/setup-dev-env.md +++ /dev/null @@ -1,118 +0,0 @@ -# Setting Up Your Local Development Environment - -Creating a local development environment that mirrors the GitHub Actions -workflow ensures consistency between local development and continuous -integration builds. This guide leverages the steps defined in our GitHub Actions -workflow to help you set up a similar environment on your local machine. By -following these steps, you'll be able to compile, build, and test the project in -an environment closely resembling our CI pipeline, minimizing integration -issues. The exact commands and environment configurations used during the -compilation are documented within the project's `.github/workflow/release.yml` -file. - -## Prerequisites - -- **Git:** Installed and configured on your system. -- **Compilers:** GCC and Clang for cross-compatibility. -- **CMake:** For generating build files. -- **Qt6:** If working on a project that utilizes Qt for its GUI. - -## Environment Setup Steps - -### Clone the Repository - -```bash -git clone https://github.com/saturneric/GpgFrontend.git -cd GpgFrontend -``` - -### Configure Git Line Endings - -This step ensures that line endings are consistent across different operating -systems. - -- **For Windows:** - -```bash -git config --global core.autocrlf false -git config --global core.eol lf -``` - -- **For macOS:** - -```bash -git config --global core.autocrlf false -git config --global core.eol lf -``` - -### Install Dependencies - -- **On Ubuntu 20.04:** - -```bash -sudo apt-get update -sudo apt-get install -y build-essential binutils git autoconf automake gettext texinfo gcc g++ ninja-build libarchive-dev libssl-dev libgpgme-dev -``` - -- **On macOS (11 and 12):** - -```bash -brew install cmake autoconf automake texinfo gettext openssl@3 ninja libarchive gpgme -brew link --force openssl@3 - -``` - -- **For Windows (via MSYS2):** Set up MSYS2 according to its documentation and - install the necessary packages: - -```bash -pacman -Syu -pacman -S mingw-w64-x86_64-gcc mingw-w64-x86_64-make mingw-w64-x86_64-cmake autoconf automake make texinfo mingw-w64-x86_64-qt6 libintl msys2-runtime-devel gettext-devel mingw-w64-x86_64-ninja mingw-w64-x86_64-gnupg mingw-w64-x86_64-libarchive -``` - -### Install Qt6 (if applicable) - -Use the Qt online installer or your package manager to install Qt6 and the -required modules for your project. - -### Build Third-Party Libraries (if needed) - -Follow the project's documentation to clone and build necessary third-party -libraries such as `libgpg-error`, `libassuan`, and `GpgME`. Use the same -commands as specified in the GitHub Actions workflow, adapted for your local -environment. - -### Configure and Build the Project - -- **For Linux and macOS:** - -```bash -mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Release -make -j$(nproc) -``` - -- **For Windows (via MSYS2):** - -```bash -mkdir build && cd build -cmake .. -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release -mingw32-make -j$(nproc) -``` - -### Running Tests - -After building, run the project's tests to verify everything is working as -expected. - -## Notes - -- Adjust the build type (`Release`, `Debug`, etc.) as needed. -- Replace project-specific commands and dependency installation commands based - on your project's requirements. -- For macOS, additional steps for code signing and notarization are required only - for distribution. - -By closely following the GitHub Actions workflow for local setup, you're -creating a development environment that minimizes surprises during the -integration and deployment phases. diff --git a/manual/contribute/translate-interface.md b/manual/contribute/translate-interface.md deleted file mode 100644 index 2fd1e951..00000000 --- a/manual/contribute/translate-interface.md +++ /dev/null @@ -1,46 +0,0 @@ -# Translate Interface - -GpgFrontend is designed to support multiple languages, but requires volunteer -contributions to achieve this goal. Fortunately, translation work does not -require an understanding of difficult technology. Volunteers simply need to use their skills to get the job done and make it accessible to everyone. - -## Work Offline - -### What you need to know about translation work - -From v2.1.2, GpgFrontend uses the Qt translation support library [Qt -Linguist](https://doc.qt.io/qt-6/qtlinguist-index.html) in the Qt project. -Before starting everything, you need to know something about this library. After -you are sure about the content of the document, you can first try to see how -GpgFrontend uses the tools provided by this library. - -### About translation files - -1. Download or clone source code - [HERE](https://github.com/saturneric/GpgFrontend) -2. You will find some ts files(.ts) at path `resource/lfs/locale/ts` -3. Add a new language: Create a new file; see [locale codes](https://saimana.com/list-of-country-locale-code/). -4. To edit or update an existing language, navigate to the path `resource/lfs/locale/ts`. - -### Before starting your work - -In order to facilitate coordination, please contact me via email before you -start this work. This is very important, please contact me first so that the -work you do can be better used by GpgFrontend. - -### Updates to Translation Work Process - -- **For correcting existing translations**: You can directly modify the ts files - and then send them to me via email. -- **For adding a new language translation**: If you're unfamiliar with the - process, you can request a new ts file by emailing me. I will provide you with - the necessary file to start the translation for the new language. - -### Hand in your work - -You can submit your great work in two ways: - -1. Raise a pull request and merge the changed translation file(s) to the - repository. -2. [Email ME](mailto:[email protected]). Please attach the changed ts file in the - email. diff --git a/manual/downloads.md b/manual/downloads.md deleted file mode 100644 index f1c3fde1..00000000 --- a/manual/downloads.md +++ /dev/null @@ -1,50 +0,0 @@ -# Downloads - -GpgFrontend is available for download through multiple channels. For more -detailed instructions on installation and getting started, please refer to the -[Quick Start Manual](quick-start.md). - ---- - -## Download Options Across Platforms - -### GitHub Releases - -- **Latest Release Download**: Click the badge below to directly navigate to the - GitHub page for the latest release download. - - [](https://github.com/saturneric/GpgFrontend/releases/latest) - -### SourceForge - -- **SourceForge Download**: Access the download page on SourceForge through the - download button below. - - [](https://sourceforge.net/projects/gpgfrontend/files/latest/download) - -### Homebrew Cask - -- **Homebrew Cask**: Mac users can check the version information through the - badge below or install using the command line. - - [](https://formulae.brew.sh/cask/gpgfrontend) - - Install command: - - ``` - brew install --cask gpgfrontend - ``` - -### Flatpak - -- **Flatpak Installation**: Linux users can click the image below to navigate to - the Flathub page for installation. - - [](https://flathub.org/apps/com.bktus.gpgfrontend) - -### Microsoft Store - -- **Microsoft Store Download**: Windows users can visit the application store - page through the Microsoft Store badge below. - - <ms-store-badge productid="9NH716MQK2B5"></ms-store-badge> diff --git a/manual/faq.md b/manual/faq.md deleted file mode 100644 index 135c6567..00000000 --- a/manual/faq.md +++ /dev/null @@ -1,96 +0,0 @@ -# Frequently Asked Questions (FAQ) - -## Understanding GpgFrontend - -**What is GpgFrontend?** GpgFrontend is a user-friendly, cross-platform tool -designed to facilitate the use of OpenPGP encryption, making it easier for -individuals to protect their privacy and secure their communications. - -**What can I do with GpgFrontend?** Beyond basic encryption and decryption, -GpgFrontend supports digital signatures to verify the integrity and origin of -messages. Users can manage and generate key pairs, encrypt files and emails, and -sign their communications for added security. - -**How can I obtain and start using GpgFrontend?** You can download the latest -version of GpgFrontend from its GitHub repository. Visit [GpgFrontend's -Downloads Page](https://www.gpgfrontend.bktus.com/#/downloads) to find the most -recent release. Installation is straightforward: just follow the ReadME -instructions to set it up. - -## OpenPGP and GnuPG Explained - -**How do OpenPGP and GnuPG relate?** OpenPGP serves as a standardized protocol -for encrypting and decrypting data, which GpgFrontend supports. GnuPG, or GPG, -implements the OpenPGP standard, providing the necessary cryptographic -functions. GpgFrontend leverages GnuPG for operations like encryption, -decryption, and key management. - -**Which operating systems does GpgFrontend support?** GpgFrontend is a -cross-platform application that supports Windows, macOS, and Linux, making it -accessible to nearly all users for their privacy and data protection needs. - -## Troubleshooting GnuPG Installation Issues - -**Encountering 'GnuPG not installed correctly'?** This issue typically arises -when GpgFrontend cannot locate GnuPG on your system. Here are steps to address -this based on your operating system: - -### For macOS Users - -- **Install GnuPG for OSX** from - [here](https://sourceforge.net/p/gpgosx/docu/Download/), or install - GpgFrontend using Homebrew with `brew install --cask gpgfrontend`. -- If GnuPG is installed in a custom location, please tell GpgFrontend where the - gpgconf binary it is at GnuPG Controller. - -### For Linux Users - -- Install GnuPG via your package manager (apt, yum, etc.). -- If GnuPG is installed in a custom location, please tell GpgFrontend where the - gpgconf binary it is at GnuPG Controller. - -### For Windows Users - -- The latest GpgFrontend versions include GnuPG. It's recommended to download - the most recent GpgFrontend version. -- Alternatively, download GnuPG from - [here](https://www.gnupg.org/ftp/gcrypt/binary/gnupg-w32-2.4.0_20221216.exe) - and reinstall if necessary. - -### Additional Assistance - -- For more detailed guidance, refer to the quick start manual available at - [Quick Start Guide](quick-start.md). - -## Reporting Bugs and Contributing - -**Found a bug?** If you encounter any issues with GpgFrontend, please report -them via the GitHub repository. You can also contact me directly if you're not -on GitHub; see the [Contact](contract.md) section for details. - -**Interested in contributing?** Feel free to modify GpgFrontend's code and -submit a Pull Request with your enhancements. You can also send patches via -email if you prefer to contribute anonymously. - -## Why the Need for GnuPG? - -**Importance of Installing GnuPG** GpgFrontend itself does not handle direct -encryption or decryption; it requires GnuPG for these operations. This design -choice ensures higher security, allowing users to rely on their own verified -version of GnuPG. - -## Understanding BETA Versions - -**What does "BETA" signify in a release?** A "BETA" label indicates that the -version may not have undergone comprehensive testing, particularly for new -modules. While beta versions are carefully evaluated post-release, and stable -versions are published when ready, the aim is to avoid beta releases from -version 2.0.0 onwards, barring exceptional circumstances. - -## Security and Privacy - -**How does GpgFrontend ensure my communications are secure?** GpgFrontend uses -GnuPG to implement the OpenPGP standard, securing your data with robust -encryption algorithms to prevent unauthorized access. It supports public and -private key encryption methods, ensuring only intended recipients can decrypt -and read your messages. diff --git a/manual/features/introduce.md b/manual/features/introduce.md deleted file mode 100644 index bf0e57c7..00000000 --- a/manual/features/introduce.md +++ /dev/null @@ -1,8 +0,0 @@ -# Introduce Features - -GpgFrontend provides some advanced functions that can meet the needs of certain -scenarios. - -These are the primary features as of the current version. As GpgFrontend -continues to evolve, additional features may be added to enhance its -capabilities and user experience.
\ No newline at end of file diff --git a/manual/features/key-package.md b/manual/features/key-package.md deleted file mode 100644 index de364908..00000000 --- a/manual/features/key-package.md +++ /dev/null @@ -1,59 +0,0 @@ -# KeyPackage Functionality - -## Overview - -The KeyPackage is a feature designed to securely package and transfer key data -between different devices. It encapsulates both the public and private keys of -multiple key pairs, ensuring that users can maintain cryptographic functionality -across various platforms. This document outlines the process of creating, -exporting, and safely transferring a KeyPackage. - -## Creating a KeyPackage - - - -## Exporting the KeyPackage - -After configuring the export settings: - -1. Click on the 'OK' button to create the KeyPackage. -2. The interface will generate two files: - - A `.gpgpack` file containing the packaged keys. - - A `.key` file which should be kept confidential and deleted after the transfer is complete. - -## Security Notice - -When the KeyPackage is successfully created, a message will inform you that the -package is protected with encryption algorithms (e.g., AES-256-ECB) and is safe -to transfer. However, it emphasizes that the key file must not be disclosed -under any circumstances. Users are advised to delete the KeyPackage file and the -key file as soon as possible after the transfer is complete. - -## Transferring the KeyPackage - -To transfer the KeyPackage: - -1. Use a secure transfer method to move the `.gpgpack` file to the target - device. This could be through a secured network connection, encrypted email, - or a physical device like a USB drive, which should be encrypted as well. -2. Once transferred, import the KeyPackage into the key management tool on the - target device using the passphrase set during the creation process. - -## After Transfer: Importing and Verifying - - - -## Best Practices - -- Always ensure that you are transferring key data over a secure channel. -- Keep the passphrase strong and confidential. -- Delete the KeyPackage files from all devices and any intermediaries (like - email servers or cloud storage) after the transfer is complete to prevent - unauthorized access. - -## Conclusion - -The KeyPackage feature streamlines the process of transferring key data between -devices while maintaining high security standards. By following the steps -outlined in this document, users can effectively manage their cryptographic keys -across multiple platforms. diff --git a/manual/features/sync-all-public-keys.md b/manual/features/sync-all-public-keys.md deleted file mode 100644 index 2658f84e..00000000 --- a/manual/features/sync-all-public-keys.md +++ /dev/null @@ -1,71 +0,0 @@ -# Synchronizing Public Keys with Key Server - -Keeping your public keys in sync with those stored on a key server is crucial -for secure communications. This synchronization ensures that any changes to -public keys, such as revocations or the addition of subkeys, are reflected in -your local keyring. Without this, you may be vulnerable to security risks like -man-in-the-middle attacks or authentication errors. - -Here's a structured guide to maintaining public key synchronization using the -GpgFrontend's Public Key Sync feature. - -## Importance of Public Key Synchronization - -**Key Revocation:** If a key is revoked by its owner, it's vital to stop using -it immediately. Revocation might occur if the private key is compromised or if -the key is no longer used. - -**Subkey Updates:** If a new signing subkey is generated, it's essential for -your local gpg to recognize it. Without the updated information, gpg won't -authenticate signatures made with the new subkey. - -## How to Sync Public Keys - -GpgFrontend automates the public key synchronization process through a -user-friendly interface. Here’s how to use it: - -1. Open the **Key Management** interface. -2. Locate and click the **Sync Public Key** button. This initiates the automatic - synchronization. - - - -_Note: Replace the placeholder text with the actual link to the image showing -the Sync Public Key button._ - -The feature works by checking all the public keys in your possession against the -key server. If there's an updated version of a key you own, GpgFrontend will -import the new details to your local keyring. - -### Choosing the Right Key Server - -To know which key server GpgFrontend interacts with, follow these steps: - -1. Go to the settings section of GpgFrontend. -2. The default key server configured will be listed here. - - - -_Note: Replace the placeholder text with the actual link to the image showing -the key server settings._ - -If you need to use a different key server: - -1. Navigate to the key server settings within GpgFrontend. -2. Add your preferred key server's details. -3. Set it as the default for future synchronizations. - -## Best Practices for Key Synchronization - -- **Regular Sync:** Regularly sync your keys to ensure you have the latest - updates, especially before engaging in secure communication. -- **Verify Changes:** After syncing, verify any changes or updates to ensure - they are legitimate. -- **Secure Network:** Always perform key synchronization over a secure network - to prevent interception or tampering. - -## Conclusion - -By following this guide, you can ensure that your public keys are always -up-to-date, reflecting the current status on the key server, thereby maintaining -the integrity of your encrypted communications. diff --git a/manual/index.html b/manual/index.html deleted file mode 100644 index ff19b33d..00000000 --- a/manual/index.html +++ /dev/null @@ -1,39 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <meta charset="UTF-8"> - <title>GpgFrontend - An OpenPGP Frontend Tool</title> - <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> - <meta name="description" content="Description"> - <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0"> - <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/docsify-themeable@0/dist/css/theme-defaults.css"> - <link rel="shortcut icon" href="https://image.cdn.bktus.com/i/2024/02/24/b885d4e2-7695-1b0a-ec5e-a43d4102a5b7.webp" type="image/x-icon"> -</head> -<body> - <div id="app"></div> - <script> - window.$docsify = { - search: 'auto', - logo: 'https://image.cdn.bktus.com/i/2024/02/24/21268bd9-ed92-671b-561c-562e15de2ed2.webp', - name: 'GpgFrontend', - loadNavbar: true, - loadSidebar: true, - routerMode: 'history', - coverpage: true, - onlyCover: true, - subMaxLevel: 1, - repo: 'https://github.com/saturneric/GpgFrontend', - mergeNavbar: true, - alias: { - '/.*/_sidebar.md': '/_sidebar.md' - } - } - </script> - <script src="//cdn.jsdelivr.net/npm/docsify/lib/docsify.min.js"></script> - <script src="//cdn.jsdelivr.net/npm/docsify/lib/plugins/emoji.min.js"></script> - <script src="//cdn.jsdelivr.net/npm/prismjs@1/components/prism-bash.min.js"></script> - <script src="//cdn.jsdelivr.net/npm/prismjs@1/components/prism-php.min.js"></script> - <script src="//cdn.jsdelivr.net/npm/docsify-edit-on-github"></script> - <script type="module" src="https://get.microsoft.com/badge/ms-store-badge.bundled.js"></script> -</body> -</html> diff --git a/manual/overview.md b/manual/overview.md deleted file mode 100644 index e09c7bbd..00000000 --- a/manual/overview.md +++ /dev/null @@ -1,64 +0,0 @@ -# GpgFrontend: Your OpenPGP Companion - ---- - - - - - -[](https://www.codacy.com/gh/saturneric/GpgFrontend/dashboard?utm_source=github.com&utm_medium=referral&utm_content=saturneric/GpgFrontend&utm_campaign=Badge_Grade) -[](https://app.fossa.com/projects/git%2Bgithub.com%2Fsaturneric%2FGpgFrontend?ref=badge_shield) - -**GpgFrontend** stands as a premier, cross-platform, user-friendly, and compact -tool for all your [OpenPGP](https://www.openpgp.org/) encryption needs. Designed -for both beginners and experts in data security, GpgFrontend simplifies -encryption, decryption, and digital signing, offering a seamless interface for -managing OpenPGP tasks. Embrace the latest features of GnuPG 2.x, enhancing your -security in the digital age. - -**Document Version Reference: [v2.1.2](https://github.com/saturneric/GpgFrontend/releases/tag/v2.1.2)** - -## User Interface Glimpse - -_Note: GpgFrontend's appearance may vary across different operating systems and -themes. Always refer to the corresponding version of the software for the most -accurate documentation._ - - - -## Project Origins and Mission - -GpgFrontend inherits its core from the stable and user-friendly -[gpg4usb](https://www.gpg4usb.org/) project, aiming to introduce OpenPGP's new -features while maintaining simplicity and accessibility. My goal is to -ensure data security, making GnuPG's powerful tools available to all, -regardless of technical expertise. - -### A Commitment to Freedom and Security - -As a solo-maintained open-source project, GpgFrontend is a testament to the -power of community and the pursuit of privacy. It remains forever free, inviting -contributions, suggestions, and feedback from users worldwide. - -## Explore the Source - -Dive into the development journey on GitHub, where every line of code, each -update, and user feedback converge to refine and enhance GpgFrontend. - -- [GitHub Repository](https://github.com/saturneric/GpgFrontend) - -### License and Contributions - -Licensed under GPL-3.0, GpgFrontend champions open-source values. Contributions -are not just welcomed but essential—whether through issue reports, pull -requests, or code patches via email. - -## Ensuring Your Privacy - -With a serverless design, GpgFrontend guarantees your data stays yours alone. -For those requiring extra security layers, future versions will offer offline -functionality, further solidifying its stance as a privacy-first tool. - -GpgFrontend is more than software; it's a commitment to secure, accessible, and -open communication for everyone. Join us in this journey, where your security -and privacy are paramount. diff --git a/manual/quick-start.md b/manual/quick-start.md deleted file mode 100644 index 7c4f6218..00000000 --- a/manual/quick-start.md +++ /dev/null @@ -1,206 +0,0 @@ -# Getting Started with GpgFrontend - -Welcome to GpgFrontend, the cross-platform, OpenPGP encryption tool designed for -simplicity and security. This guide will walk you through the installation -process tailored to your operating system, ensuring you can start securing your -communications as quickly and efficiently as possible. - -## Before You Begin: Prerequisites - -**Note for Windows or macOS users who utilize Homebrew: You may skip this -prerequisites section.** - -GpgFrontend leverages the robust functionalities of GnuPG for encryption, -decryption, and key management. It is crucial to have GnuPG installed on your -device to make full use of GpgFrontend. Starting from version 2.0, GnuPG -operates on modular components for enhanced functionality, requiring proper -integration with your system. - -Be aware, due to GnuPG's inability to function within an App Sandbox, -GpgFrontend is not available through the Apple Store. - -For Linux users, most contemporary distributions come with GnuPG 2.0 -pre-installed. Check your GnuPG version with `gpg --version` in your terminal. -It is advisable to upgrade to GnuPG version 2.2 or later for optimal performance -and compatibility. - -## Installation & Execution Guide - -### For Windows Users - -#### Portable Version (No Installation Required) - -1. **Download** the portable version from [GpgFrontend's latest - releases](https://github.com/saturneric/GpgFrontend/releases/latest), labeled - `GpgFrontend-*******-windows-x86_64-portable.zip`. -2. **Extract** the contents of the downloaded ZIP file. -3. **Run** `GpgFrontend.exe` from the extracted `Program/bin` directory. - -#### Installer Version - -1. **Download** the installer from [GpgFrontend's latest - releases](https://github.com/saturneric/GpgFrontend/releases/latest), named - `GpgFrontend-*******-windows-x86_64-setup.exe`. -2. **Install** GpgFrontend by following the on-screen instructions. After - installation, you can access GpgFrontend directly from your desktop. - -### For macOS Users - -GpgFrontend's macOS packages are Apple-verified, allowing straightforward -opening without additional permissions. - -#### Using Homebrew Cask - -For an effortless install or removal process, use Homebrew Cask: - -1. Ensure **Homebrew** is installed. -2. **Install** GpgFrontend with the command `brew install --cask gpgfrontend`. -3. **Launch** GpgFrontend from your Launchpad. - -#### Manual Installation from DMG - -1. **Install GnuPG** via Homebrew or download it from [GPG for OS - X](https://sourceforge.net/projects/gpgosx/files). -2. **Download** the `GpgFrontend-*******-macos-**.dmg` file from [GpgFrontend's - releases](https://github.com/saturneric/GpgFrontend/releases). Select - `x86_64` for compatibility with Intel and Apple Silicon chips. -3. **Mount** the DMG file and **run** GpgFrontend. -4. **Optional:** Drag GpgFrontend into your Applications folder for easy access. - -### For Linux Users (AppImage) - -AppImage simplifies software distribution by bundling applications and all -necessary libraries into a single, executable file, eliminating dependency -conflicts. - -1. **Install GnuPG** if it's not already installed. - - Debian/Ubuntu: `sudo apt update && sudo apt install gpg` - - CentOS: `sudo yum install gnupg` -2. **Download** the AppImage from [GpgFrontend's - releases](https://github.com/saturneric/GpgFrontend/releases), labeled - `GpgFrontend-*******-linux-x86_64.AppImage`. -3. **Make it executable:** `chmod u+x ./GpgFrontend-***-linux-x86_64.AppImage`. -4. **Launch** the AppImage with a double-click or through the terminal. - -### BSD Users (FreeBSD/OpenBSD) - -Currently, there are no binary releases for BSD systems. However, GpgFrontend -can be compiled and run on BSD. Refer to the GitHub repository for build -instructions. - -## Downloading from GitHub Releases - -GpgFrontend is primarily distributed through GitHub Releases, ensuring -accessibility and eliminating the need for personal server management. - -Upon navigating to [GpgFrontend's download -page](https://github.com/saturneric/GpgFrontend/releases/latest), you'll find -detailed information about the latest version, including new features and fixes. -Each release is signed for security verification purposes, allowing users with -heightened security needs to confirm the authenticity of the downloaded files. - -Scroll down to the **Assets** section to select the appropriate version for your -operating system. The filenames include a unique identification number, crucial -for reporting any version-specific issues. - -Files ending in 'signature' are GPG separate signatures, which can be verified -with GPG to ensure they are officially released and approved by me. - -Select the version that suits your system or follows the provided instructions -to begin the download. - -By following these steps, you'll be ready to use GpgFrontend, enhancing your -digital security with powerful encryption tools at your fingertips. - -## Basic Operations with GpgFrontend - -After successfully installing GpgFrontend, you're ready to dive into the world -of encryption and secure communication. This guide will walk you through some -fundamental operations to get you started. - -### Generating Your First Key Pair - -1. Open GpgFrontend: Launch the application. -2. Access Key Management: Navigate to the "Key Management" section. -3. Generate Key Pair: Look for an option to "Generate" a new key pair. -4. Fill in your details, such as name and email, and choose your desired key - type and size. You can also add a comment if you wish. -5. Set an expiration date for the key, or choose 'Never Expire' if you prefer. -6. Create a passphrase for your key to ensure its security. Remember to use a - strong passphrase that you won't forget. -7. Once all details are filled in, click 'OK' to generate your key pair. - -### Encrypting - -1. **Write a Message:** Start by writing a message in the main text area of - GpgFrontend. -2. **Choose Recipient:** Select the public key of the message's recipient. If - you're practicing, you can select your own public key. -3. **Encrypt:** With the recipient's public key selected, click on the "Encrypt" - option. The text will be encrypted, making it readable only by the selected - recipient. - -### Decrypting - -1. **Receive an Encrypted Message:** Copy the encrypted message into - GpgFrontend's main text area. -2. **Decrypt:** Click on the "Decrypt" option. If the message was encrypted with - your public key, you would need to enter the password for your private key to - decrypt it. - -### Signing - -1. **Create a Message:** Type your message in the text area. -2. **Sign:** Choose the "Sign" option and select your private key. Enter your - key's password to sign the message. This adds a digital signature that - verifies you as the message's sender. - -### Verifying - -1. **Receive a Signed Message:** Paste the signed message into GpgFrontend. -2. **Verify:** Click on "Verify" to check the signature. If the signature - matches the sender's public key, GpgFrontend will confirm the message's - integrity and authenticity. - -### Key Management and Sharing - -#### Exporting and Sharing Your Public Key - -1. Go to 'Manage Keys'. -2. Select your key pair and choose 'Export Key'. -3. Save your public key to a file or copy it to the clipboard to share it with - others. - -#### Importing a Public Key - -To communicate securely with someone else, you need their public key. Click -'Import key'. You can import a key file or copy and paste the public key -directly. After importing, the public key will appear in your keyring, ready for -use. - -### Exchanging Public Keys with Friends - -1. **Export Your Public Key:** From the "Key Management" section, find the - option to export your public key. Save it as a file or copy it to your - clipboard. -2. **Share Your Public Key:** Send your public key to your friend via email, - messaging app, or any secure channel you prefer. -3. **Import Your Friend's Public Key:** When your friend sends you their public - key, import it into GpgFrontend using the "Import" option in the "Key - Management" section. - -By exchanging public keys, you establish a secure channel for encrypted -communication. Only the holder of the corresponding private key can decrypt -messages encrypted with a public key, ensuring privacy and security in your -communications. - -## Conclusion - -GpgFrontend is a powerful tool for enhancing your digital security. By -generating key pairs, encrypting and decrypting messages, signing documents, and -exchanging public keys, you can safeguard your communications in a world where -privacy is increasingly precious. As you become more familiar with these -operations, explore further features and settings within GpgFrontend to tailor -your security practices to your needs. Remember, the cornerstone of digital -security is practicing safe key management and password hygiene. Welcome to the -secure side! diff --git a/resource/appstream/com.bktus.gpgfrontend.appdata.xml b/resource/appstream/com.bktus.gpgfrontend.appdata.xml index 2ce4b0f5..e278a1fa 100644 --- a/resource/appstream/com.bktus.gpgfrontend.appdata.xml +++ b/resource/appstream/com.bktus.gpgfrontend.appdata.xml @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="UTF-8"?> -<component> +<component type="desktop-application"> <id>com.bktus.gpgfrontend</id> - <name>GpgFrontend</name> + <name>Gpg Frontend</name> <summary>Encrypt and sign data</summary> <categories> <category>Utility</category> @@ -11,6 +11,7 @@ <metadata_license>MIT</metadata_license> <project_license>GPL-3.0+</project_license> <developer_name>Saturneric</developer_name> + <content_rating type="oars-1.0" /> <url type="homepage">https://gpgfrontend.bktus.com/</url> <url type="bugtracker">https://github.com/saturneric/GpgFrontend/issues</url> @@ -22,10 +23,10 @@ <description> <p> - GpgFrontend is a free, open-source, robust yet user-friendly, compact and cross-platform tool for OpenPGP encryption. + Gpg Frontend is a free, open-source, robust yet user-friendly, compact and cross-platform tool for OpenPGP encryption. </p> <p> - By using GpgFrontend, users can quickly encrypt files or text, easily digitally sign them, and conveniently manage + By using Gpg Frontend, users can quickly encrypt files or text, easily digitally sign them, and conveniently manage all GPG keys on their device. The tool also facilitates the secure and seamless transfer of GPG keys between devices. It is compatible with a range of operating systems, including Windows, macOS, Linux, and FreeBSD. </p> @@ -40,23 +41,23 @@ <screenshots> <screenshot type="default"> - <image>https://image.cdn.bktus.com/i/2024/02/02/a7e9e762-a8fa-6e52-2728-1488e338e5ef.webp</image> + <image>https://image.cdn.bktus.com/i/2024/02/14/056f1017-331f-ef69-93a6-c49f1d233f8d.png</image> <caption>Main Window</caption> </screenshot> <screenshot> - <image>https://image.cdn.bktus.com/i/2024/02/02/5ff98592-e61e-29eb-8a29-66d8e304a797.webp</image> + <image>https://image.cdn.bktus.com/i/2024/02/14/8b891c88-2335-63d8-4f78-2d0dffea763c.png</image> <caption>Subkey Management</caption> </screenshot> <screenshot> - <image>https://image.cdn.bktus.com/i/2024/02/02/a0b8f2d1-16c3-9a2e-d82b-8a27ad4719de.webp</image> + <image>https://image.cdn.bktus.com/i/2024/02/14/704717c6-e2bc-c5f3-e69e-dcc9a588dde4.png</image> <caption>Key Generation</caption> </screenshot> <screenshot> - <image>https://image.cdn.bktus.com/i/2024/02/02/8a9f1d35-0e72-5f48-e4a2-76c03bae2a28.webp</image> + <image>https://image.cdn.bktus.com/i/2024/02/14/d8e79f1c-7d07-c550-b1d7-36c33a901056.png</image> <caption>Verify Signature of File</caption> </screenshot> <screenshot> - <image>https://image.cdn.bktus.com/i/2024/02/02/f79a818f-3e55-ddf9-a93d-17deab7a0e18.webp</image> + <image>https://image.cdn.bktus.com/i/2024/02/14/f1ef687a-a232-23e3-776d-c03e88c62dca.png</image> <caption>Import Key(s) From Key Server</caption> </screenshot> </screenshots> @@ -70,4 +71,31 @@ <keyword>openpgp</keyword> </keywords> + <releases> + <release version="2.1.2" date="2024-02-02"/> + <release version="2.1.1" date="2023-09-19"/> + <release version="2.1.0" date="2023-08-01"/> + <release version="2.0.10" date="2023-01-06"/> + <release version="2.0.9" date="2022-07-23"/> + <release version="2.0.8" date="2022-05-14"/> + <release version="2.0.7" date="2022-05-10"/> + <release version="2.0.6" date="2022-05-08"/> + <release version="2.0.5" date="2022-03-20"/> + <release version="2.0.4" date="2022-01-06"/> + <release version="2.0.3" date="2021-12-17"/> + <release version="2.0.2" date="2021-12-14"/> + <release version="2.0.1" date="2021-12-09"/> + <release version="1.2.2" date="2021-07-20"/> + <release version="1.2.1" date="2021-07-16"/> + <release version="1.1.3" date="2021-07-12"/> + <release version="1.0.8" date="2021-07-03"/> + <release version="1.0.7" date="2021-06-27"/> + <release version="1.0.6" date="2021-06-26"/> + <release version="1.0.5" date="2021-06-25"/> + <release version="1.0.4" date="2021-06-23"/> + <release version="1.0.3" date="2021-06-22"/> + <release version="1.0.2" date="2021-06-21"/> + <release version="1.0.0" date="2021-06-19"/> + </releases> + </component> diff --git a/resource/appstream/com.bktus.gpgfrontend.desktop b/resource/appstream/com.bktus.gpgfrontend.desktop index 87cb04ee..9f2a5a8a 100644 --- a/resource/appstream/com.bktus.gpgfrontend.desktop +++ b/resource/appstream/com.bktus.gpgfrontend.desktop @@ -1,6 +1,6 @@ [Desktop Entry] Type=Application -Name=GpgFrontend +Name=Gpg Frontend Exec=GpgFrontend Icon=com.bktus.gpgfrontend Comment=Encrypt and sign data diff --git a/resource/appstream/com.bktus.gpgfrontend.metainfo.xml b/resource/appstream/com.bktus.gpgfrontend.metainfo.xml index e4619f3c..b4695809 100644 --- a/resource/appstream/com.bktus.gpgfrontend.metainfo.xml +++ b/resource/appstream/com.bktus.gpgfrontend.metainfo.xml @@ -2,7 +2,7 @@ <component type="desktop-application"> <id>com.bktus.gpgfrontend</id> - <name>GpgFrontend</name> + <name>Gpg Frontend</name> <summary>Encrypt and sign data</summary> <metadata_license>MIT</metadata_license> @@ -12,21 +12,49 @@ <description> <p> - GpgFrontend is a free, open-source, robust yet user-friendly, compact and cross-platform tool for OpenPGP encryption. + Gpg Frontend is a free, open-source, robust yet user-friendly, compact and cross-platform tool for OpenPGP encryption. </p> <p> - By using GpgFrontend, users can quickly encrypt files or text, easily digitally sign them, and conveniently manage + By using Gpg Frontend, users can quickly encrypt files or text, easily digitally sign them, and conveniently manage all GPG keys on their device. The tool also facilitates the secure and seamless transfer of GPG keys between devices. It is compatible with a range of operating systems, including Windows, macOS, Linux, and FreeBSD. </p> + <p>A list of features</p> + <ul> + <li>Rapidly encrypt files or text.</li> + <li>Digitally sign your files or text with ease.</li> + <li>Conveniently manage all your GPG keys on your device.</li> + <li>Transfer all your GPG keys between devices safely and effortlessly.</li> + </ul> </description> <launchable type="desktop-id">com.bktus.gpgfrontend.desktop</launchable> + <branding> + <color type="primary" scheme_preference="light">#ff00ff</color> + <color type="primary" scheme_preference="dark">#993d3d</color> + </branding> + <screenshots> <screenshot type="default"> + <image>https://image.cdn.bktus.com/i/2024/02/14/056f1017-331f-ef69-93a6-c49f1d233f8d.png</image> <caption>Main Window</caption> - <image>https://raw.githubusercontent.com/saturneric/Blob/v1.0.2/screenshots/main-ubuntu.png</image> + </screenshot> + <screenshot> + <image>https://image.cdn.bktus.com/i/2024/02/14/8b891c88-2335-63d8-4f78-2d0dffea763c.png</image> + <caption>Subkey Management</caption> + </screenshot> + <screenshot> + <image>https://image.cdn.bktus.com/i/2024/02/14/704717c6-e2bc-c5f3-e69e-dcc9a588dde4.png</image> + <caption>Key Generation</caption> + </screenshot> + <screenshot> + <image>https://image.cdn.bktus.com/i/2024/02/14/d8e79f1c-7d07-c550-b1d7-36c33a901056.png</image> + <caption>Verify Signature of File</caption> + </screenshot> + <screenshot> + <image>https://image.cdn.bktus.com/i/2024/02/14/f1ef687a-a232-23e3-776d-c03e88c62dca.png</image> + <caption>Import Key(s) From Key Server</caption> </screenshot> </screenshots> @@ -37,6 +65,7 @@ <url type="vcs-browser">https://github.com/saturneric/GpgFrontend</url> <releases> + <release version="2.1.2" date="2024-02-02"/> <release version="2.1.1" date="2023-09-19"/> <release version="2.1.0" date="2023-08-01"/> <release version="2.0.10" date="2023-01-06"/> diff --git a/resource/lfs/app-image/gpgfrontend/com.bktus.gpgfrontend.png b/resource/lfs/app-image/gpgfrontend/com.bktus.gpgfrontend.png Binary files differdeleted file mode 100644 index 5e52593c..00000000 --- a/resource/lfs/app-image/gpgfrontend/com.bktus.gpgfrontend.png +++ /dev/null diff --git a/resource/lfs/app-image/gpgfrontend/usr/share/icons/hicolor/128x128/apps/GpgFrontend.png b/resource/lfs/app-image/gpgfrontend/usr/share/icons/hicolor/128x128/apps/GpgFrontend.png Binary files differdeleted file mode 100644 index 5c24791f..00000000 --- a/resource/lfs/app-image/gpgfrontend/usr/share/icons/hicolor/128x128/apps/GpgFrontend.png +++ /dev/null diff --git a/resource/lfs/app-image/gpgfrontend/usr/share/icons/hicolor/256x256/apps/GpgFrontend.png b/resource/lfs/app-image/gpgfrontend/usr/share/icons/hicolor/256x256/apps/GpgFrontend.png Binary files differdeleted file mode 100644 index b3268b01..00000000 --- a/resource/lfs/app-image/gpgfrontend/usr/share/icons/hicolor/256x256/apps/GpgFrontend.png +++ /dev/null diff --git a/resource/lfs/app-image/gpgfrontend/usr/share/icons/hicolor/32x32/apps/GpgFrontend.png b/resource/lfs/app-image/gpgfrontend/usr/share/icons/hicolor/32x32/apps/GpgFrontend.png Binary files differdeleted file mode 100644 index c90e1d1d..00000000 --- a/resource/lfs/app-image/gpgfrontend/usr/share/icons/hicolor/32x32/apps/GpgFrontend.png +++ /dev/null diff --git a/resource/lfs/hicolor/128x128/apps/com.bktus.gpgfrontend.png b/resource/lfs/hicolor/128x128/apps/com.bktus.gpgfrontend.png Binary files differindex 5c24791f..010d857d 100644 --- a/resource/lfs/hicolor/128x128/apps/com.bktus.gpgfrontend.png +++ b/resource/lfs/hicolor/128x128/apps/com.bktus.gpgfrontend.png diff --git a/resource/lfs/hicolor/256x256/apps/com.bktus.gpgfrontend.png b/resource/lfs/hicolor/256x256/apps/com.bktus.gpgfrontend.png Binary files differindex b3268b01..041fb0e2 100644 --- a/resource/lfs/hicolor/256x256/apps/com.bktus.gpgfrontend.png +++ b/resource/lfs/hicolor/256x256/apps/com.bktus.gpgfrontend.png diff --git a/resource/lfs/hicolor/32x32/apps/com.bktus.gpgfrontend.png b/resource/lfs/hicolor/32x32/apps/com.bktus.gpgfrontend.png Binary files differindex c90e1d1d..3d60772e 100644 --- a/resource/lfs/hicolor/32x32/apps/com.bktus.gpgfrontend.png +++ b/resource/lfs/hicolor/32x32/apps/com.bktus.gpgfrontend.png diff --git a/resource/lfs/hicolor/48x48/apps/com.bktus.gpgfrontend.png b/resource/lfs/hicolor/48x48/apps/com.bktus.gpgfrontend.png Binary files differnew file mode 100644 index 00000000..9930b0b5 --- /dev/null +++ b/resource/lfs/hicolor/48x48/apps/com.bktus.gpgfrontend.png diff --git a/resource/lfs/hicolor/512x512/apps/com.bktus.gpgfrontend.png b/resource/lfs/hicolor/512x512/apps/com.bktus.gpgfrontend.png Binary files differnew file mode 100644 index 00000000..577a79a3 --- /dev/null +++ b/resource/lfs/hicolor/512x512/apps/com.bktus.gpgfrontend.png diff --git a/resource/lfs/hicolor/64x64/apps/com.bktus.gpgfrontend.png b/resource/lfs/hicolor/64x64/apps/com.bktus.gpgfrontend.png Binary files differnew file mode 100644 index 00000000..9ec87218 --- /dev/null +++ b/resource/lfs/hicolor/64x64/apps/com.bktus.gpgfrontend.png diff --git a/resource/lfs/icons/clear-f.png b/resource/lfs/icons/clear-f.png Binary files differnew file mode 100644 index 00000000..5400cc32 --- /dev/null +++ b/resource/lfs/icons/clear-f.png diff --git a/resource/lfs/icons/detail.png b/resource/lfs/icons/detail.png Binary files differnew file mode 100644 index 00000000..91301d7d --- /dev/null +++ b/resource/lfs/icons/detail.png diff --git a/resource/lfs/icons/gpgfrontend-logo.png b/resource/lfs/icons/gpgfrontend-logo.png Binary files differdeleted file mode 100644 index 7e9841be..00000000 --- a/resource/lfs/icons/gpgfrontend-logo.png +++ /dev/null diff --git a/resource/lfs/icons/gpgfrontend-logo_small (copy).png b/resource/lfs/icons/gpgfrontend-logo_small (copy).png Binary files differdeleted file mode 100644 index d34c6c31..00000000 --- a/resource/lfs/icons/gpgfrontend-logo_small (copy).png +++ /dev/null diff --git a/resource/lfs/icons/gpgfrontend-logo_small.png b/resource/lfs/icons/gpgfrontend-logo_small.png Binary files differdeleted file mode 100644 index d34c6c31..00000000 --- a/resource/lfs/icons/gpgfrontend-logo_small.png +++ /dev/null diff --git a/resource/lfs/icons/gpgfrontend.png b/resource/lfs/icons/gpgfrontend.png Binary files differindex c90e1d1d..9930b0b5 100644 --- a/resource/lfs/icons/gpgfrontend.png +++ b/resource/lfs/icons/gpgfrontend.png diff --git a/resource/lfs/icons/gpgfrontend_logo.png b/resource/lfs/icons/gpgfrontend_logo.png Binary files differnew file mode 100644 index 00000000..2dc43564 --- /dev/null +++ b/resource/lfs/icons/gpgfrontend_logo.png diff --git a/resource/lfs/icons/key.png b/resource/lfs/icons/key.png Binary files differnew file mode 100644 index 00000000..7d7abf60 --- /dev/null +++ b/resource/lfs/icons/key.png diff --git a/resource/lfs/icons/keys12.jpg b/resource/lfs/icons/keys12.jpg Binary files differdeleted file mode 100644 index acf8f8d0..00000000 --- a/resource/lfs/icons/keys12.jpg +++ /dev/null diff --git a/resource/lfs/icons/keys13.jpg b/resource/lfs/icons/keys13.jpg Binary files differdeleted file mode 100644 index 0b76c5c6..00000000 --- a/resource/lfs/icons/keys13.jpg +++ /dev/null diff --git a/resource/lfs/icons/module.png b/resource/lfs/icons/module.png Binary files differnew file mode 100644 index 00000000..13a62404 --- /dev/null +++ b/resource/lfs/icons/module.png diff --git a/resource/lfs/icons/redo.png b/resource/lfs/icons/redo.png Binary files differnew file mode 100644 index 00000000..5f5b6601 --- /dev/null +++ b/resource/lfs/icons/redo.png diff --git a/resource/lfs/icons/restart.png b/resource/lfs/icons/restart.png Binary files differnew file mode 100644 index 00000000..ebb91f5c --- /dev/null +++ b/resource/lfs/icons/restart.png diff --git a/resource/lfs/icons/stairs.png b/resource/lfs/icons/stairs.png Binary files differnew file mode 100644 index 00000000..313813af --- /dev/null +++ b/resource/lfs/icons/stairs.png diff --git a/resource/lfs/icons/translate.png b/resource/lfs/icons/translate.png Binary files differnew file mode 100644 index 00000000..467d4890 --- /dev/null +++ b/resource/lfs/icons/translate.png diff --git a/resource/lfs/icons/undo.png b/resource/lfs/icons/undo.png Binary files differindex 19717cc8..9765d267 100644 --- a/resource/lfs/icons/undo.png +++ b/resource/lfs/icons/undo.png diff --git a/resource/lfs/icons/update.png b/resource/lfs/icons/update.png Binary files differnew file mode 100644 index 00000000..43e1f470 --- /dev/null +++ b/resource/lfs/icons/update.png diff --git a/resource/lfs/icons/wizard.png b/resource/lfs/icons/wizard.png Binary files differnew file mode 100644 index 00000000..647b9e18 --- /dev/null +++ b/resource/lfs/icons/wizard.png diff --git a/resource/lfs/icons/wizard_banner.png b/resource/lfs/icons/wizard_banner.png Binary files differdeleted file mode 100644 index 7e19aeab..00000000 --- a/resource/lfs/icons/wizard_banner.png +++ /dev/null diff --git a/resource/lfs/icons/zoomin.png b/resource/lfs/icons/zoomin.png Binary files differnew file mode 100644 index 00000000..c08fde74 --- /dev/null +++ b/resource/lfs/icons/zoomin.png diff --git a/resource/lfs/icons/zoomout.png b/resource/lfs/icons/zoomout.png Binary files differnew file mode 100644 index 00000000..4f1938d8 --- /dev/null +++ b/resource/lfs/icons/zoomout.png diff --git a/resource/lfs/locale/ts/GpgFrontend.de_DE.ts b/resource/lfs/locale/ts/GpgFrontend.de_DE.ts index f43e0d1a..fea99d0c 100644 --- a/resource/lfs/locale/ts/GpgFrontend.de_DE.ts +++ b/resource/lfs/locale/ts/GpgFrontend.de_DE.ts @@ -221,12 +221,12 @@ </message> <message> <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="105"/> - <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="109"/> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="107"/> <source>Sign Date</source> <translation type="unfinished">Unterschrift Datum</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="130"/> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="128"/> <source>Signer</source> <translation type="unfinished">Unterzeichner</translation> </message> @@ -250,23 +250,23 @@ <translation type="unfinished">koordinierte Weltzeit</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="109"/> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="107"/> <source>Localized</source> <translation>lokalisiert</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="124"/> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="122"/> <source>Invalid Signers</source> <translation type="unfinished">Ungültige Unterzeichner</translation> </message> <message> <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="98"/> - <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="132"/> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="130"/> <source>Fingerprint</source> <translation type="unfinished">Fingerabdruck</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="134"/> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="132"/> <source>Reason</source> <translation type="unfinished">Grund</translation> </message> @@ -290,126 +290,126 @@ </message> <message> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="57"/> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="61"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="60"/> <source>Signed On</source> <translation type="unfinished">Angemeldet</translation> </message> <message> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="57"/> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="192"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="191"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="237"/> <source>UTC</source> <translation type="unfinished">koordinierte Weltzeit</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="61"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="60"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="194"/> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="239"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="240"/> <source>Localized</source> <translation>lokalisiert</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="64"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="63"/> <source>Signatures List</source> <translation type="unfinished">Unterschriftenliste</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="71"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="70"/> <source>Signature [%1]:</source> <translation type="unfinished">Unterschrift [%1]:</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="72"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="71"/> <source>Status</source> <translation type="unfinished">Status</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="75"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="74"/> <source>A Bad Signature.</source> <translation type="unfinished">Eine ungültige Signatur.</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="77"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="76"/> <source>This Signature is invalid.</source> <translation type="unfinished">Diese Signatur ist ungültig.</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="82"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="81"/> <source>A</source> <translation type="unfinished">EIN</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="84"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="83"/> <source>Good</source> <translation type="unfinished">Gut</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="87"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="86"/> <source>Bad</source> <translation type="unfinished">Schlecht</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="90"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="89"/> <source>Expired</source> <translation type="unfinished">Abgelaufen</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="93"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="92"/> <source>Missing Key's</source> <translation type="unfinished">Fehlende Schlüssel</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="96"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="95"/> <source>Revoked Key's</source> <translation type="unfinished">Widerrufene Schlüssel</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="99"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="98"/> <source>Expired Key's</source> <translation type="unfinished">Abgelaufene Schlüssel</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="102"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="101"/> <source>Missing CRL's</source> <translation type="unfinished">Fehlende Zertifikatsperrliste</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="106"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="105"/> <source>Signature Fully Valid.</source> <translation type="unfinished">Unterschrift voll gültig.</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="108"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="107"/> <source>Signature Not Fully Valid.</source> <translation type="unfinished">Unterschrift nicht vollständig gültig.</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="109"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="108"/> <source>Tips</source> <translation>Hinweise</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="110"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="109"/> <source>Adjust Trust Level to make it Fully Vaild</source> <translation>Anpassen der Vertrauensstufe, um sie vollständig zu sichern</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="184"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="183"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="228"/> <source>Fingerprint</source> <translation type="unfinished">Fingerabdruck</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="186"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="185"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="229"/> <source><unknown></source> <translation><unbekannt></translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="192"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="191"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="194"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="237"/> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="239"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="240"/> <source>Sign Date</source> <translation>Unterschrift Datum</translation> </message> @@ -439,47 +439,47 @@ <translation type="vanished">(Vertrauensstufe anpassen um diesen vollständig gültig zu kennzeichnen)</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="117"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="116"/> <source>Key is NOT present with ID 0x</source> <translation type="unfinished">Schlüssel ist NICHT vorhanden mit ID 0x</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="126"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="125"/> <source>A signature could NOT be verified due to a Missing Key</source> <translation type="unfinished">Eine Signatur konnte aufgrund eines fehlenden Schlüssels NICHT verifiziert werden</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="132"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="131"/> <source>A signature is valid but the key used to verify the signature has been revoked</source> <translation type="unfinished">Eine Signatur ist gültig, aber der Schlüssel zur Überprüfung der Signatur wurde widerrufen</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="141"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="140"/> <source>A signature is valid but expired</source> <translation type="unfinished">Eine Unterschrift ist gültig, aber abgelaufen</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="148"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="147"/> <source>A signature is valid but the key used to verify the signature has expired.</source> <translation type="unfinished">Eine Signatur ist gültig, aber der zur Überprüfung der Signatur verwendete Schlüssel ist abgelaufen.</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="156"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="155"/> <source>There was some other error which prevented the signature verification.</source> <translation type="unfinished">Es gab einen anderen Fehler, der die Signaturprüfung verhinderte.</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="164"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="163"/> <source>Error for key with fingerprint</source> <translation type="unfinished">Fehler bei Schlüssel mit Fingerabdruck</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="175"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="174"/> <source>Could not find information that can be used for verification.</source> <translation type="unfinished">Es konnten keine Informationen gefunden werden, die zur Überprüfung verwendet werden können.</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="184"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="183"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="205"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="228"/> <source>Signed By</source> @@ -490,13 +490,13 @@ <translation type="obsolete">Unbekannt</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="189"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="188"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="234"/> <source>Public Key Algo</source> <translation type="unfinished">Algo für öffentliche Schlüssel</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="191"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="190"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="236"/> <source>Hash Algo</source> <translation type="unfinished">Hash Algo</translation> @@ -507,27 +507,72 @@ </message> </context> <context> + <name>GpgFrontend::Module::GlobalRegisterTable</name> + <message> + <location filename="../../../../src/core/module/GlobalRegisterTable.cpp" line="47"/> + <source>NODE</source> + <translation type="unfinished">KNOTEN</translation> + </message> + <message> + <location filename="../../../../src/core/module/GlobalRegisterTable.cpp" line="82"/> + <source>LEAF</source> + <translation type="unfinished">BLATTKNOTEN</translation> + </message> +</context> +<context> + <name>GpgFrontend::Module::GlobalRegisterTableTreeModel::Impl</name> + <message> + <location filename="../../../../src/core/module/GlobalRegisterTable.cpp" line="193"/> + <source><EMPTY></source> + <translation type="unfinished"><LEER></translation> + </message> + <message> + <location filename="../../../../src/core/module/GlobalRegisterTable.cpp" line="232"/> + <source><UNSUPPORTED></source> + <translation type="unfinished"><UNERWÜNSCHT></translation> + </message> + <message> + <location filename="../../../../src/core/module/GlobalRegisterTable.cpp" line="267"/> + <source>Key</source> + <translation type="unfinished">Schlüssel</translation> + </message> + <message> + <location filename="../../../../src/core/module/GlobalRegisterTable.cpp" line="269"/> + <source>Type</source> + <translation type="unfinished">Typ</translation> + </message> + <message> + <location filename="../../../../src/core/module/GlobalRegisterTable.cpp" line="271"/> + <source>Value Type</source> + <translation type="unfinished">Wert-Typ</translation> + </message> + <message> + <location filename="../../../../src/core/module/GlobalRegisterTable.cpp" line="273"/> + <source>Value</source> + <translation type="unfinished">Wert</translation> + </message> +</context> +<context> <name>GpgFrontend::Module::Integrated::GnuPGInfoGatheringModule::GnuPGInfoGatheringModule</name> <message> - <location filename="../../../../src/module/integrated/gnupg_info_gathering_module/GnuPGInfoGatheringModule.cpp" line="123"/> <source>Embedded In</source> - <translation type="unfinished">Eingebettet in</translation> + <translation type="obsolete">Eingebettet in</translation> </message> </context> <context> <name>GpgFrontend::UI::AboutDialog</name> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="44"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="41"/> <source>About</source> <translation type="unfinished">Über</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="52"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="47"/> <source>About GpgFrontend</source> <translation type="unfinished">Über GpgFrontend</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="53"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="51"/> <source>GnuPG</source> <translation type="unfinished">GnuPG</translation> </message> @@ -537,7 +582,7 @@ <translation type="unfinished">Übersetzer</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="55"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="58"/> <source>Update</source> <translation type="unfinished">Aktualisieren</translation> </message> @@ -545,131 +590,156 @@ <context> <name>GpgFrontend::UI::AppearanceTab</name> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="42"/> <source>Icon Size</source> - <translation type="unfinished">Symbolgröße</translation> + <translation type="obsolete">Symbolgröße</translation> </message> <message> <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="43"/> + <source>General</source> + <translation type="unfinished">Allgemein</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="45"/> + <source>Theme</source> + <translation type="unfinished">Thema</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="49"/> + <source>Toolbar Icon</source> + <translation type="unfinished">Symbol für die Symbolleiste</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="51"/> + <source>Size</source> + <translation type="unfinished">Größe</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="52"/> <source>small</source> <translation type="unfinished">klein</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="44"/> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="53"/> <source>medium</source> <translation type="unfinished">Mittel</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="45"/> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="54"/> <source>large</source> <translation type="unfinished">groß</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="47"/> <source>Icon Style</source> - <translation type="unfinished">Symbolstil</translation> + <translation type="obsolete">Symbolstil</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="48"/> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="57"/> <source>just text</source> <translation type="unfinished">nur Text</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="49"/> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="58"/> <source>just icons</source> <translation type="unfinished">nur Symbole</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="50"/> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="59"/> <source>text and icons</source> <translation type="unfinished">Text und Symbole</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="52"/> <source>Window State</source> - <translation type="unfinished">Fensterstatus</translation> + <translation type="obsolete">Fensterstatus</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="54"/> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="47"/> <source>Save window size and position on exit.</source> <translation type="unfinished">Fenstergröße und Position beim Beenden speichern.</translation> </message> <message> <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="56"/> + <source>Style</source> + <translation type="unfinished">Stil</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="61"/> + <source>Font Size</source> + <translation type="unfinished">Schriftgröße</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="63"/> <source>Text Editor</source> <translation type="unfinished">Texteditor</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="57"/> <source>Font Size in Text Editor</source> - <translation type="unfinished">Schriftgröße im Texteditor</translation> + <translation type="obsolete">Schriftgröße im Texteditor</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="59"/> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="64"/> <source>Information Board</source> <translation type="unfinished">Informationstafel</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="61"/> <source>Font Size in Information Board</source> - <translation type="unfinished">Schriftgröße in der Informationstafel</translation> + <translation type="obsolete">Schriftgröße in der Informationstafel</translation> </message> </context> <context> <name>GpgFrontend::UI::ChoosePage</name> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="112"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="107"/> <source>Choose your action...</source> <translation type="unfinished">Wählen Sie Ihre Aktion...</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="113"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="108"/> <source>...by clicking on the appropriate link.</source> <translation type="unfinished">...indem Sie auf den entsprechenden Link klicken.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="116"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="111"/> <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">Wenn Sie GpgFrontend noch nie verwendet haben und auch noch keinen gpg-Schlüssel besitzen, möchten Sie vielleicht lesen, wie es geht</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="120"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="114"/> <source>Generate Key</source> <translation type="unfinished">Schlüssel erstellen</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="127"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="121"/> <source>If you want to learn how to encrypt, decrypt, sign and verify text, you can read </source> <translation type="unfinished">Wenn Sie lernen möchten, wie Sie Text verschlüsseln, entschlüsseln, signieren und überprüfen, lesen Sie </translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="132"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="124"/> <source>Encrypt & Decrypt Text</source> <translation type="unfinished">Text verschlüsseln und entschlüsseln</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="132"/> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="148"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="124"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="136"/> <source>or</source> <translation type="unfinished">oder</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="136"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="126"/> <source>Sign & Verify Text</source> <translation type="unfinished">Text unterschreiben und überprüfen</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="144"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="134"/> <source>If you want to operate file, you can read </source> <translation type="unfinished">Wenn Sie mit Dateien arbeiten möchten, können Sie lesen </translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="148"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="136"/> <source>Encrypt & Sign File</source> <translation type="unfinished">Datei verschlüsseln und signieren</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="152"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="138"/> <source>Sign & Verify File</source> <translation type="unfinished">Datei signieren und überprüfen</translation> </message> @@ -677,12 +747,12 @@ <context> <name>GpgFrontend::UI::CommonUtils</name> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="185"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="186"/> <source>GnuPG Context Loading Failed</source> <translation type="unfinished">Laden des GnuPG-Kontexts fehlgeschlagen</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="187"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="188"/> <source>Gnupg(gpg) is not installed correctly, please follow <a href='https://www.gpgfrontend.bktus.com/#/faq?id=how-to-deal-with-39env-loading-failed39'>this notes</a> in FAQ to install Gnupg and then open GpgFrontend. <br />Or, you can open GnuPG Controller to set a custom GnuPG which GpgFrontend should use. Then, GpgFrontend will restart. <br /><br />Breif Reason: %1</source> <translation>Gnupg(gpg) ist nicht korrekt installiert, bitte folgen Sie dieser <a href='https://www.gpgfrontend.bktus.com/#/faq?id=how-to-deal-with-39env-loading-failed39'>Anleitung</a> (nur in Englisch) in den FAQ, um Gnupg zu installieren und dann GpgFrontend zu öffnen. <br />Alternativ können Sie den GnuPG Controller öffnen und ein benutzerspezifisches GnuPG für die Nutzung mit GpgFrontend auszuwählen. GpgFrontend muss dann neu gestartet werden. <br /><br />Grund %1</translation> </message> @@ -691,29 +761,29 @@ <translation type="obsolete">Keine Schlüssel zum Importieren gefunden</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="445"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="450"/> <source>Timeout</source> <translation type="unfinished">Zeitablauf</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="250"/> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="381"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="251"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="382"/> <source>Success</source> <translation type="unfinished">Erfolg</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="251"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="252"/> <source>Gpg Operation succeed.</source> <translation>Gpg-Verarbeitung erfolgreich.</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="261"/> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="373"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="262"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="374"/> <source>Failure</source> <translation type="unfinished">Fehler</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="262"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="263"/> <source>Gpg Operation failed. Error code: %1 @@ -726,14 +796,14 @@ Quelle: %2 Beschrei: %3</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="287"/> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="294"/> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="497"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="288"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="295"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="502"/> <source>Error</source> <translation type="unfinished">Fehler</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="279"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="280"/> <source>Open Key</source> <translation type="unfinished">Schlüssel öffnen</translation> </message> @@ -742,87 +812,87 @@ Beschrei: %3</translation> <translation type="obsolete">Schlüsseldateien</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="280"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="281"/> <source>Keyring files</source> <translation type="unfinished">Schlüsselbunddateien</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="288"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="289"/> <source>Cannot open this file. Please make sure that this is a regular file and it's readable.</source> <translation type="unfinished">Kann diese Datei nicht öffnen. Bitte stellen Sie sicher, dass es sich um eine reguläre, lesbare Datei handelt.</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="295"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="296"/> <source>The target file is too large for a keyring.</source> <translation>Die Zieldatei ist zu groß für einen Schlüsselring.</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="301"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="302"/> <source>File Open Failed</source> <translation type="unfinished">Datei konnte nicht geöffnet werden</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="302"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="303"/> <source>Failed to open file: </source> <translation type="unfinished">Datei konnte nicht geöffnet werden: </translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="354"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="355"/> <source>Processing</source> <translation type="unfinished">In Bearbeitung</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="374"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="375"/> <source>Failed to execute command.</source> <translation type="unfinished">Fehler beim Ausführen des Befehls.</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="382"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="383"/> <source>Succeed in executing command.</source> <translation type="unfinished">Befehl erfolgreich ausgeführt.</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="384"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="385"/> <source>Warning</source> <translation type="unfinished">Warnung</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="385"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="386"/> <source>Finished executing command.</source> <translation type="unfinished">Ausführung des Befehls abgeschlossen.</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="406"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="407"/> <source>Default Keyserver Not Found</source> <translation type="unfinished">Standard-Keyserver nicht gefunden</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="407"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="408"/> <source>Cannot read default keyserver from your settings, please set a default keyserver first</source> <translation type="unfinished">Der Standard-Keyserver kann nicht aus Ihren Einstellungen gelesen werden, bitte legen Sie zuerst einen Standard-Keyserver fest</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="442"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="447"/> <source>Key Not Found</source> <translation type="unfinished">Schlüssel nicht gefunden</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="448"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="453"/> <source>Key Server Not Found</source> <translation type="unfinished">Schlüsselserver nicht gefunden</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="451"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="456"/> <source>Connection Error</source> <translation type="unfinished">Verbindungsfehler</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="462"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="467"/> <source>The key has been updated</source> <translation type="unfinished">Der Schlüssel wurde aktualisiert</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="464"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="469"/> <source>No need to update the key</source> <translation type="unfinished">Keine Notwendigkeit, den Schlüssel zu aktualisieren</translation> </message> @@ -838,39 +908,43 @@ Beschrei: %3</translation> <context> <name>GpgFrontend::UI::ConclusionPage</name> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="218"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="204"/> <source>Ready.</source> <translation type="unfinished">Bereit.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="219"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="205"/> <source>Have fun with GpgFrontend!</source> <translation type="unfinished">Viel Spaß mit GpgFrontend!</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="222"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="208"/> <source>You are ready to use GpgFrontend now.<br><br></source> <translation type="unfinished">Sie können GpgFrontend jetzt verwenden.<br><br></translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="226"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="210"/> <source>The Online Document</source> <translation type="unfinished">Das Online-Dokument</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="227"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="211"/> <source> will get you started with GpgFrontend. Anytime you encounter problems, please try to find help from the documentation</source> <translation type="unfinished"> wird Ihnen den Einstieg in GpgFrontend erleichtern. Wenn Sie auf Probleme stoßen, versuchen Sie bitte, Hilfe in der Dokumentation zu finden</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="236"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="220"/> <source>Open offline help.</source> <translation type="unfinished">Öffnen Sie die Offline-Hilfe.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="239"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="224"/> + <source>Don't show the wizard again.</source> + <translation type="unfinished">Zeigen Sie den Assistenten nicht mehr.</translation> + </message> + <message> <source>Dont show the wizard again.</source> - <translation type="unfinished">Den Assistenten nicht mehr anzeigen.</translation> + <translation type="obsolete">Den Assistenten nicht mehr anzeigen.</translation> </message> </context> <context> @@ -1020,128 +1094,128 @@ Beschrei: %3</translation> <context> <name>GpgFrontend::UI::FileTreeView</name> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="90"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="103"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="166"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="212"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="234"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="275"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="92"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="105"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="168"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="214"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="236"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="277"/> <source>Error</source> <translation type="unfinished">Fehler</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="91"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="93"/> <source>The path is not exists, unprivileged or unreachable.</source> <translation type="unfinished">Der Pfad ist nicht vorhanden, nicht privilegiert oder nicht erreichbar.</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="104"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="106"/> <source>The file is unprivileged or unreachable.</source> <translation type="unfinished">Die Datei ist nicht privilegiert oder nicht erreichbar.</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="157"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="159"/> <source>Warning</source> <translation type="unfinished">Warnung</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="158"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="160"/> <source>Are you sure you want to delete it?</source> <translation type="unfinished">Möchten Sie es wirklich löschen?</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="167"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="169"/> <source>Unable to delete the file or folder.</source> <translation type="unfinished">Die Datei oder der Ordner kann nicht gelöscht werden.</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="176"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="189"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="178"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="191"/> <source>Make New Directory</source> <translation type="unfinished">Neues Verzeichnis erstellen</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="177"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="190"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="179"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="192"/> <source>Directory Name</source> <translation type="unfinished">Verzeichnisname</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="204"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="226"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="206"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="228"/> <source>Create Empty File</source> <translation type="unfinished">Leere Datei erstellen</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="204"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="226"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="206"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="228"/> <source>Filename (you can given extension)</source> <translation type="unfinished">Dateiname (Sie können die Erweiterung angeben)</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="213"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="235"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="215"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="237"/> <source>Unable to create the file.</source> <translation type="unfinished">Die Datei kann nicht erstellt werden.</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="267"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="298"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="269"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="300"/> <source>Rename</source> <translation type="unfinished">Umbenennen</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="267"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="269"/> <source>New Filename</source> <translation type="unfinished">Neuer Dateiname</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="276"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="278"/> <source>Unable to rename the file or folder.</source> <translation type="unfinished">Die Datei oder der Ordner kann nicht umbenannt werden.</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="293"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="295"/> <source>Open</source> <translation type="unfinished">Öffnen</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="303"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="305"/> <source>Delete</source> <translation type="unfinished">Löschen</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="308"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="310"/> <source>Calculate Hash</source> <translation type="unfinished">Hash berechnen</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="313"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="315"/> <source>Directory</source> <translation type="unfinished">Verzeichnis</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="318"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="320"/> <source>File</source> <translation type="unfinished">Datei</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="323"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="325"/> <source>Compress...</source> <translation type="unfinished">Komprimieren...</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="330"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="332"/> <source>Open with Default System Application</source> <translation type="unfinished">Mit der Standardsystemanwendung öffnen</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="335"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="337"/> <source>New</source> <translation type="unfinished">Neu</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="393"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="395"/> <source>Calculating</source> <translation type="unfinished">Berechnen</translation> </message> @@ -1243,17 +1317,17 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::GnuPGControllerDialog</name> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="45"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="45"/> <source>General</source> <translation type="unfinished">Allgemein</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="46"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="46"/> <source>Key Database</source> <translation type="unfinished">Schlüsseldatenbank</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="47"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="47"/> <source>Advanced</source> <translation type="unfinished">Fortschrittlich</translation> </message> @@ -1262,70 +1336,79 @@ This will result in loss of all cached form positions, statuses, key servers, et <translation type="obsolete">Kein ASCII-Modus</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="49"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="49"/> <source>Use Binary Mode for File Operations</source> <translation type="unfinished">Binärmodus für Dateioperationen verwenden</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="51"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="51"/> <source>Use Pinentry as Password Input Dialog</source> <translation type="unfinished">Verwenden Sie Pinentry als Dialog für die Passworteingabe</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="52"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="52"/> <source>Enable GpgME Debug Log</source> <translation type="unfinished">GpgME-Debug-Log einschalten</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="53"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="53"/> <source>Use Custom GnuPG</source> <translation type="unfinished">Verwenden Sie benutzerdefiniertes GnuPG</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="54"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="54"/> <source>Select GnuPG Path</source> <translation type="unfinished">Wählen Sie den GnuPG-Pfad aus</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="56"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="56"/> <source>Use Custom GnuPG Key Database Path</source> <translation type="unfinished">Benutzerdefinierten Pfad für die GnuPG-Schlüsseldatenbank verwenden</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="58"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="58"/> <source>Select Key Database Path</source> <translation type="unfinished">Wählen Sie den Pfad für die Schlüsseldatenbank aus</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="60"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="60"/> <source>Restart Gpg Agent on start</source> <translation type="unfinished">Gpg-Agent beim Start neu starten</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="64"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="62"/> + <source>Kill all gnupg daemon at close</source> + <translation type="unfinished">Alle gnupg-Daemons beim Schließen abschalten</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="66"/> + <source>Tips: please select a directory where "gpgconf" is located in.</source> + <translation type="unfinished">Tipps: Bitte wählen Sie ein Verzeichnis, in dem sich "gpgconf" befindet.</translation> + </message> + <message> <source>Tips: please select a directroy where "gpgconf" is located in.</source> - <translation type="unfinished">Tipps: Bitte wählen Sie ein Verzeichnis aus, in dem sich "gpgconf" befindet.</translation> + <translation type="obsolete">Tipps: Bitte wählen Sie ein Verzeichnis aus, in dem sich "gpgconf" befindet.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="66"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="68"/> <source>Tips: notice that modify any of these settings will cause an Application restart.</source> <translation type="unfinished">Tipps: Beachten Sie, dass das Ändern dieser Einstellungen zu einem Neustart der Anwendung führt.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="98"/> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="118"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="100"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="120"/> <source>Open Directory</source> <translation type="unfinished">Verzeichnis öffnen</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="171"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="173"/> <source>GnuPG Controller</source> <translation type="unfinished">GnuPG-Controller</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="356"/> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="363"/> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="375"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="364"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="371"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="383"/> <source>Illegal GnuPG Path</source> <translation type="unfinished">Unzulässiger GnuPG-Pfad</translation> </message> @@ -1334,22 +1417,22 @@ This will result in loss of all cached form positions, statuses, key servers, et <translation type="obsolete">Der Ziel-GnuPG-Pfad ist leer.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="357"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="365"/> <source>Target GnuPG Path is not an exists readable directory.</source> <translation type="unfinished">Der Ziel-GnuPG-Pfad ist kein lesbares Verzeichnis.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="364"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="372"/> <source>Target GnuPG Path is not an absolute path.</source> <translation type="unfinished">Der Ziel-GnuPG-Pfad ist kein absoluter Pfad.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="376"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="384"/> <source>Target GnuPG Path contains no "gpgconf" executable.</source> <translation type="unfinished">Der Ziel-GnuPG-Pfad enthält keine ausführbare Datei „gpgconf“.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="389"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="397"/> <source>Illegal GnuPG Key Database Path</source> <translation type="unfinished">Unzulässiger GnuPG-Schlüsseldatenbankpfad</translation> </message> @@ -1358,7 +1441,7 @@ This will result in loss of all cached form positions, statuses, key servers, et <translation type="obsolete">Der Zielpfad für die GnuPG-Schlüsseldatenbank ist leer.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="390"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="398"/> <source>Target GnuPG Key Database Path is not an exists readable directory.</source> <translation type="unfinished">Der Zielpfad für die GnuPG-Schlüsseldatenbank ist kein lesbares Verzeichnis.</translation> </message> @@ -1366,53 +1449,53 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::GnupgTab</name> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="44"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="46"/> <source>Name</source> <translation type="unfinished">Name</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="44"/> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="90"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="46"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="92"/> <source>Description</source> <translation type="unfinished">Beschreibung</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="44"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="46"/> <source>Version</source> <translation type="unfinished">Version</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="45"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="47"/> <source>Checksum</source> <translation type="unfinished">Prüfsumme</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="45"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="47"/> <source>Binary Path</source> <translation type="unfinished">Binärer Pfad</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="47"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="49"/> <source>Components</source> <translation type="unfinished">Komponenten</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="48"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="50"/> <source>Directories</source> <translation type="unfinished">Verzeichnisse</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="49"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="51"/> <source>Options</source> <translation type="unfinished">Optionen</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="68"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="70"/> <source>Directory Type</source> <translation type="unfinished">Verzeichnis Typ</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="68"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="70"/> <source>Path</source> <translation type="unfinished">Pfad</translation> </message> @@ -1421,27 +1504,27 @@ This will result in loss of all cached form positions, statuses, key servers, et <translation type="obsolete">Konfigurationen</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="89"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="91"/> <source>Component</source> <translation>Komponente</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="89"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="91"/> <source>Group</source> <translation>Gruppe</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="89"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="91"/> <source>Key</source> <translation type="unfinished">Schlüssel</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="90"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="92"/> <source>Default Value</source> <translation>Standardwert</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="91"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="93"/> <source>Value</source> <translation type="unfinished">Wert</translation> </message> @@ -1449,22 +1532,22 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::GpgFrontendApplication</name> <message> - <location filename="../../../../src/ui/GpgFrontendApplication.cpp" line="64"/> + <location filename="../../../../src/ui/GpgFrontendApplication.cpp" line="62"/> <source>Standard Exception Thrown</source> <translation type="unfinished">Standard-Exception ausgelöst</translation> </message> <message> - <location filename="../../../../src/ui/GpgFrontendApplication.cpp" line="65"/> + <location filename="../../../../src/ui/GpgFrontendApplication.cpp" line="63"/> <source>Oops, an standard exception was thrown during the running of the program. This is not a serious problem, it may be the negligence of the programmer, please report this problem if you can.</source> <translation type="unfinished">Hoppla, während der Ausführung des Programms wurde eine Standard-Exception ausgelöst. Dies ist kein ernsthaftes Problem, es kann die Nachlässigkeit des Programmierers sein, bitte melden Sie dieses Problem, wenn Sie können.</translation> </message> <message> - <location filename="../../../../src/ui/GpgFrontendApplication.cpp" line="73"/> + <location filename="../../../../src/ui/GpgFrontendApplication.cpp" line="71"/> <source>Unhandled Exception Thrown</source> <translation type="unfinished">Unbehandelte Ausnahme ausgelöst</translation> </message> <message> - <location filename="../../../../src/ui/GpgFrontendApplication.cpp" line="74"/> + <location filename="../../../../src/ui/GpgFrontendApplication.cpp" line="72"/> <source>Oops, an unhandled exception was thrown during the running of the program. This is not a serious problem, it may be the negligence of the programmer, please report this problem if you can.</source> <translation type="unfinished">Hoppla, während der Ausführung des Programms wurde eine nicht behandelte Ausnahme ausgelöst. Dies ist kein ernsthaftes Problem, es kann auf der Nachlässigkeit des Programmierers beruhen, bitte melden Sie dieses Problem, wenn Sie können.</translation> </message> @@ -1510,37 +1593,37 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::InfoTab</name> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="89"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="102"/> <source>GpgFrontend is an easy-to-use, compact, cross-platform, and installation-free GnuPG Frontend.It visualizes most of the common operations of GnuPG.GpgFrontend is licensed under the GPLv3</source> <translation>GpgFrontend ist ein benutzerfreundliches, kompaktes, plattformübergreifendes und installationsfreies GnuPG-Frontend. Es visualisiert die meisten gängigen Operationen von GnuPG. GpgFrontend ist unter der GPLv3 lizenziert.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="95"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="108"/> <source>Developer:</source> <translation type="unfinished">Entwickler:</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="96"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="109"/> <source>If you have any questions or suggestions, raise an issue at</source> <translation type="unfinished">Wenn Sie Fragen oder Anregungen haben, wenden Sie sich an</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="99"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="112"/> <source>or send a mail to my mailing list at</source> <translation type="unfinished">oder senden Sie eine Mail an meine Mailingliste an</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="101"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="114"/> <source>Built with Qt</source> <translation type="unfinished">Mit Qt erstellt</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="102"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="115"/> <source>and</source> <translation type="unfinished">und</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="103"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="116"/> <source>Built at</source> <translation type="unfinished">Erstellt am</translation> </message> @@ -1548,42 +1631,58 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::IntroPage</name> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="74"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="71"/> <source>Getting Started...</source> <translation type="unfinished">Der Einstieg...</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="75"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="72"/> <source>... with GpgFrontend</source> <translation type="unfinished">... mit GpgFrontend</translation> </message> <message> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="75"/> + <source>Welcome to GpgFrontend for decrypting and signing text or files!</source> + <translation type="unfinished">Willkommen bei GpgFrontend zum Entschlüsseln und Signieren von Texten und Dateien!</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="77"/> + <source>is a Powerful, Easy-to-Use, Compact, Cross-Platform, and Installation-Free OpenPGP Crypto Tool. </source> + <translation type="unfinished">ist ein leistungsstarkes, einfach zu bedienendes, kompaktes, plattformübergreifendes und installationsfreies OpenPGP-Verschlüsselungsprogramm.</translation> + </message> + <message> <location filename="../../../../src/ui/dialog/Wizard.cpp" line="79"/> - <source>Welcome to use GpgFrontend for decrypting and signing text or file!</source> - <translation type="unfinished">Willkommen bei der Verwendung von GpgFrontend zum Entschlüsseln und Signieren von Texten oder Dateien!</translation> + <source>To get started, be sure to check out the</source> + <translation type="unfinished">Für die ersten Schritte sollten Sie sich die</translation> </message> <message> <location filename="../../../../src/ui/dialog/Wizard.cpp" line="82"/> + <source>by clicking the link, the page will open in your web browser</source> + <translation type="unfinished">Wenn Sie auf den Link klicken, wird die Seite in Ihrem Webbrowser geöffnet.</translation> + </message> + <message> + <source>Welcome to use GpgFrontend for decrypting and signing text or file!</source> + <translation type="obsolete">Willkommen bei der Verwendung von GpgFrontend zum Entschlüsseln und Signieren von Texten oder Dateien!</translation> + </message> + <message> <source>is a Powerful, Easy-to-Use, Compact, Cross-Platform, and Installation-Free OpenPGP Crypto Tool.</source> - <translation type="unfinished">ist ein leistungsstarkes, benutzerfreundliches, kompaktes, plattformübergreifendes und installationsfreies OpenPGP-Kryptotool.</translation> + <translation type="obsolete">ist ein leistungsstarkes, benutzerfreundliches, kompaktes, plattformübergreifendes und installationsfreies OpenPGP-Kryptotool.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="84"/> <source>For brief information have a look at the</source> - <translation type="unfinished">Für kurze Informationen schauen Sie in den</translation> + <translation type="obsolete">Für kurze Informationen schauen Sie in den</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="86"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="81"/> <source>Overview</source> <translation type="unfinished">Überblick</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="87"/> <source>by clicking the link, the page will open in the web browser</source> - <translation type="unfinished">durch Anklicken des Links öffnet sich die Seite im Webbrowser</translation> + <translation type="obsolete">durch Anklicken des Links öffnet sich die Seite im Webbrowser</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="96"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="91"/> <source>If it supports the language currently being used in your system, GpgFrontend will automatically set it.</source> <translation type="unfinished">Wenn es die aktuell in Ihrem System verwendete Sprache unterstützt, wird GpgFrontend diese automatisch einstellen.</translation> </message> @@ -1639,87 +1738,87 @@ This will result in loss of all cached form positions, statuses, key servers, et <translation type="unfinished">Die Ablaufzeit ist zu lang.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="151"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="152"/> <source>Generating</source> <translation type="unfinished">Erstellen</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="160"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="161"/> <source>Error</source> <translation type="unfinished">Fehler</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="161"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="162"/> <source>Unknown error occurred</source> <translation>Unbekannter Fehler ist aufgetreten</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="197"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="198"/> <source>Key Usage</source> <translation type="unfinished">Schlüsselverwendung</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="199"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="200"/> <source>Encryption</source> <translation type="unfinished">Verschlüsselung</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="202"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="203"/> <source>Signing</source> <translation type="unfinished">Unterzeichnen</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="205"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="206"/> <source>Certification</source> <translation type="unfinished">Zertifizierung</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="208"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="209"/> <source>Authentication</source> <translation type="unfinished">Authentifizierung</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="435"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="436"/> <source>Name</source> <translation type="unfinished">Name</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="436"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="437"/> <source>Email Address</source> <translation type="unfinished">E-Mail-Addresse</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="437"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="438"/> <source>Comment</source> <translation type="unfinished">Kommentar</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="438"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="439"/> <source>Expiration Date</source> <translation type="unfinished">Ablaufdatum</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="439"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="440"/> <source>Never Expire</source> <translation type="unfinished">Nie ablaufen</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="440"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="441"/> <source>KeySize (in Bit)</source> <translation type="unfinished">Schlüsselgröße (in Bit)</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="441"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="442"/> <source>Key Type</source> <translation type="unfinished">Schlüsselart</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="442"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="443"/> <source>Non Pass Phrase</source> <translation type="unfinished">Nicht-Passphrase</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="455"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="456"/> <source>Basic Information</source> <translation type="unfinished">Grundlegende Informationen</translation> </message> @@ -1727,27 +1826,27 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::KeyGenPage</name> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="178"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="164"/> <source>Create a keypair...</source> <translation type="unfinished">Schlüsselpaar erstellen...</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="179"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="165"/> <source>...for decrypting and signing messages</source> <translation type="unfinished">...zum Entschlüsseln und Signieren von Nachrichten</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="181"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="167"/> <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">Sie sollten ein neues Schlüsselpaar erstellen. Das Paar besteht aus einem öffentlichen und einem privaten Schlüssel.<br>Andere Benutzer können den öffentlichen Schlüssel verwenden, um Nachrichten für Sie zu verschlüsseln und von Ihnen signierte Nachrichten zu überprüfen. Sie können Ihren privaten Schlüssel zum Entschlüsseln und Signieren von Nachrichten verwenden.<br>Weitere Informationen finden Sie im Offline-Tutorial (das dann im Hauptfenster angezeigt wird):</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="193"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="179"/> <source>Offline tutorial</source> <translation type="unfinished">Offline-Tutorial</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="197"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="183"/> <source>Create New Key</source> <translation type="unfinished">Neuen Schlüssel erstellen</translation> </message> @@ -1959,42 +2058,42 @@ This will result in loss of all cached form positions, statuses, key servers, et <translation type="unfinished">Schlüsselliste wird aktualisiert...</translation> </message> <message> - <location filename="../../../../src/ui/widgets/KeyList.cpp" line="354"/> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="374"/> <source>Import Keys</source> <translation type="unfinished">Schlüssel importieren</translation> </message> <message> - <location filename="../../../../src/ui/widgets/KeyList.cpp" line="356"/> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="376"/> <source>You've dropped something on the table.</source> <translation type="unfinished">Sie haben etwas in der Tabelle abgelegt.</translation> </message> <message> - <location filename="../../../../src/ui/widgets/KeyList.cpp" line="357"/> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="377"/> <source>GpgFrontend will now try to import key(s).</source> <translation type="unfinished">GpgFrontend wird nun versuchen, Schlüssel zu importieren.</translation> </message> <message> - <location filename="../../../../src/ui/widgets/KeyList.cpp" line="360"/> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="380"/> <source>Always import without bothering.</source> <translation type="unfinished">Immer ohne Nachfrage inportieren.</translation> </message> <message> - <location filename="../../../../src/ui/widgets/KeyList.cpp" line="455"/> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="475"/> <source>Key List Refreshed.</source> <translation type="unfinished">Schlüsselliste aktualisiert.</translation> </message> <message> - <location filename="../../../../src/ui/widgets/KeyList.cpp" line="476"/> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="510"/> <source>Syncing Key List...</source> <translation type="unfinished">Schlüsselliste wird synchronisiert...</translation> </message> <message> - <location filename="../../../../src/ui/widgets/KeyList.cpp" line="484"/> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="518"/> <source>Sync [%1/%2] %3 %4</source> <translation type="unfinished">Synchronisieren [%1/%2] %3 %4</translation> </message> <message> - <location filename="../../../../src/ui/widgets/KeyList.cpp" line="494"/> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="528"/> <source>Key List Sync Done.</source> <translation type="unfinished">Synchronisierung der Schlüsselliste abgeschlossen.</translation> </message> @@ -2074,7 +2173,7 @@ This will result in loss of all cached form positions, statuses, key servers, et </message> <message> <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="171"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="261"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="265"/> <source>File</source> <translation type="unfinished">Datei</translation> </message> @@ -2105,7 +2204,7 @@ This will result in loss of all cached form positions, statuses, key servers, et </message> <message> <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="202"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="532"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="536"/> <source>Key Package</source> <translation type="unfinished">Schlüsselpaket</translation> </message> @@ -2150,62 +2249,62 @@ This will result in loss of all cached form positions, statuses, key servers, et <translation type="unfinished">Ausgewählte(n) Schlüssel löschen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="232"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="233"/> <source>Delete the Selected keys</source> <translation type="unfinished">Die ausgewählten Schlüssel löschen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="236"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="237"/> <source>Delete Checked Key(s)</source> <translation type="unfinished">Geprüfte(n) Schlüssel löschen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="237"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="239"/> <source>Delete the Checked keys</source> <translation type="unfinished">Die markierten Schlüssel löschen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="242"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="244"/> <source>Show Key Details</source> <translation type="unfinished">Schlüsseldetails anzeigen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="243"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="246"/> <source>Show Details for this Key</source> <translation type="unfinished">Details zu diesem Schlüssel anzeigen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="247"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="248"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="250"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="252"/> <source>Set Owner Trust Level</source> <translation type="unfinished">Vertrauensstufe des Eigentümers festlegen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="265"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="285"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="269"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="289"/> <source>Key</source> <translation type="unfinished">Schlüssel</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="266"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="270"/> <source>Generate Key</source> <translation type="unfinished">Schlüssel erstellen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="270"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="298"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="274"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="302"/> <source>Import Key</source> <translation type="unfinished">Schlüssel importieren</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="276"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="306"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="307"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="280"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="310"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="311"/> <source>Export Key</source> <translation>Schlüssel exportieren</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="297"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="301"/> <source>Import key</source> <translation type="unfinished">Schlüssel importieren</translation> </message> @@ -2214,160 +2313,160 @@ This will result in loss of all cached form positions, statuses, key servers, et <translation type="vanished">Schlüssel exportieren</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="340"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="344"/> <source>Deleting Keys</source> <translation type="unfinished">Schlüssel löschen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="341"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="345"/> <source>Are you sure that you want to delete the following keys?</source> <translation type="unfinished">Möchten Sie die folgenden Schlüssel wirklich löschen?</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="343"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="347"/> <source>The action can not be undone.</source> <translation type="unfinished">Die Aktion kann nicht rückgängig gemacht werden.</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="359"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="408"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="420"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="448"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="487"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="498"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="511"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="541"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="549"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="565"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="573"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="589"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="363"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="412"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="424"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="452"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="491"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="502"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="515"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="545"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="553"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="569"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="577"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="593"/> <source>Error</source> <translation type="unfinished">Fehler</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="359"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="448"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="363"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="452"/> <source>Key Not Found.</source> <translation type="unfinished">Schlüssel nicht gefunden.</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="370"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="383"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="466"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="472"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="374"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="387"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="470"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="476"/> <source>Forbidden</source> <translation type="unfinished">Verboten</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="371"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="384"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="375"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="388"/> <source>Please check some keys before doing this operation.</source> <translation type="unfinished">Bitte wählen Sie mindestens einen Schlüssel aus, bevor Sie diesen Vorgang ausführen.</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="376"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="524"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="380"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="528"/> <source>key(s) exported</source> <translation type="unfinished">Schlüssel exportiert</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="400"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="479"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="404"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="483"/> <source>Exporting</source> <translation>Exportiere</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="409"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="421"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="488"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="499"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="413"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="425"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="492"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="503"/> <source>Unknown error occurred</source> <translation>Unbekannter Fehler ist aufgetreten</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="442"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="452"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="446"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="456"/> <source>Invalid Operation</source> <translation type="unfinished">Ungültige Operation</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="443"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="447"/> <source>Please select one KeyPair before doing this operation.</source> <translation type="unfinished">Bitte wählen Sie ein Schlüsselpaar aus, bevor Sie diesen Vorgang ausführen.</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="453"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="457"/> <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">Wenn ein Schlüsselpaar keinen privaten Schlüssel hat, kann es keine Unterschlüssel generieren.</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="467"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="471"/> <source>Please check a key before performing this operation.</source> <translation>Bitte wählen Sie einen Schlüssel aus, bevor Sie diesen Vorgang starten.</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="473"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="477"/> <source>This operation accepts just a single key.</source> <translation>Dieser Vorgang kann nur für einen einzelnen Schlüssel ausgeführt werden.</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="512"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="516"/> <source>This key may not be able to export as OpenSSH format. Please check the key-size of the subkey(s) used to sign.</source> <translation type="unfinished">Dieser Schlüssel kann möglicherweise nicht im OpenSSH-Format exportiert werden. Bitte überprüfen Sie die Schlüsselgröße der zum Signieren verwendeten Unterschlüssel.</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="519"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="523"/> <source>Export OpenSSH Key To File</source> <translation type="unfinished">OpenSSH-Schlüssel in eine Datei exportieren</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="520"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="524"/> <source>OpenSSH Public Key Files</source> <translation type="unfinished">OpenSSH-Dateien mit öffentlichem Schlüssel</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="532"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="536"/> <source>Import Key Package</source> <translation type="unfinished">Schlüsselpaket importieren</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="542"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="566"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="546"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="570"/> <source>Cannot open this file. Please make sure that this is a regular file and it's readable.</source> <translation type="unfinished">Kann diese Datei nicht öffnen. Bitte stellen Sie sicher, dass es sich um eine reguläre, lesbare Datei handelt.</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="550"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="554"/> <source>The target file is too large for a key package.</source> <translation type="unfinished">Die Zieldatei ist zu groß für ein Schlüsselpaket.</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="555"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="559"/> <source>Import Key Package Passphrase File</source> <translation type="unfinished">Schlüsselpaket-Passphrasendatei importieren</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="556"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="560"/> <source>Key Package Passphrase File</source> <translation type="unfinished">Schlüsselpaket-Passphrasendatei</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="574"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="578"/> <source>The target file is too large for a key package passphrase.</source> <translation type="unfinished">Die Zieldatei ist zu groß für eine Schlüsselpaket-Passphrase.</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="580"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="584"/> <source>Importing</source> <translation type="unfinished">Importieren</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="596"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="600"/> <source>key(s) imported</source> <translation type="unfinished">Schlüssel importiert</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="590"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="594"/> <source>An error occur in importing key package.</source> <translation type="unfinished">Beim Importieren des Schlüsselpakets ist ein Fehler aufgetreten.</translation> </message> @@ -3191,138 +3290,138 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::KeyServerImportDialog</name> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="58"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="56"/> <source>Close</source> <translation type="unfinished">Schließen</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="61"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="59"/> <source>Import ALL</source> <translation type="unfinished">ALLE importieren</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="65"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="63"/> <source>Search</source> <translation type="unfinished">Suchen</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="70"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="68"/> <source>Search String</source> <translation type="unfinished">Suchbegriff</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="70"/> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="74"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="68"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="72"/> <source>: </source> <translation type="unfinished">: </translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="74"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="72"/> <source>Key Server</source> <translation type="unfinished">Schlüsselserver</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="115"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="113"/> <source>Import Keys from Keyserver</source> <translation type="unfinished">Schlüssel vom Schlüsselserver importieren</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="155"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="153"/> <source>UID</source> <translation type="unfinished">UID</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="155"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="153"/> <source>Creation date</source> <translation type="unfinished">Erstellungsdatum</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="155"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="153"/> <source>KeyID</source> <translation type="unfinished">SchlüsselID</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="155"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="153"/> <source>Tag</source> <translation type="unfinished">Kennzeichen</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="178"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="176"/> <source>Text is empty.</source> <translation type="unfinished">Text ist leer.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="225"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="223"/> <source>Not Key Found</source> <translation type="unfinished">Schlüssel nicht gefunden</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="228"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="226"/> <source>Timeout</source> <translation type="unfinished">Zeitablauf</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="231"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="229"/> <source>Key Server Not Found</source> <translation type="unfinished">Schlüsselserver nicht gefunden</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="234"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="232"/> <source>Connection Error</source> <translation type="unfinished">Verbindungsfehler</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="243"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="241"/> <source>Too many responses from keyserver!</source> <translation type="unfinished">Zu viele Antworten vom Schlüsselserver!</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="252"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="253"/> <source>No keys found, input may be kexId, retrying search with 0x.</source> <translation type="unfinished">Keine Schlüssel gefunden, Eingabe kann kexId sein, versuche es mit 0x erneut.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="261"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="263"/> <source>No keys found containing the search string!</source> <translation type="unfinished">Keine Schlüssel gefunden, die den Suchbegriff enthalten!</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="267"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="270"/> <source>Insufficiently specific search string!</source> <translation type="unfinished">Unzureichend spezifischer Suchbegriff!</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="301"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="305"/> <source>revoked</source> <translation type="unfinished">widerrufen</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="304"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="308"/> <source>disabled</source> <translation type="unfinished">deaktiviert</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="349"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="353"/> <source>%1 keys found. Double click a key to import it.</source> <translation type="unfinished">%1 Schlüssel gefunden. Doppelklicken Sie auf einen Schlüssel, um ihn zu importieren.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="371"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="374"/> <source>Warning</source> <translation type="unfinished">Warnung</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="372"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="375"/> <source>Please select one KeyPair before doing this operation.</source> <translation type="unfinished">Bitte wählen Sie ein Schlüsselpaar aus, bevor Sie diesen Vorgang ausführen.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="419"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="422"/> <source>Key Imported</source> <translation type="unfinished">Schlüssel importiert</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="430"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="433"/> <source>Processing ...</source> <translation>Verarbeite ...</translation> </message> @@ -3330,27 +3429,27 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::KeyServerImportTask</name> <message> - <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="74"/> + <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="79"/> <source>Key not found in the Keyserver.</source> <translation>Schlüssel auf dem Schlüsselserver nicht gefunden.</translation> </message> <message> - <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="77"/> + <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="82"/> <source>Network connection timeout.</source> <translation>Netzwerkverbindungs-Timeout</translation> </message> <message> - <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="80"/> + <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="85"/> <source>Cannot resolve the address of target key server.</source> <translation>Kann die Adresse des gewählten Schlüsselservers nicht auflösen.</translation> </message> <message> - <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="83"/> + <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="88"/> <source>General connection error occurred.</source> <translation>Allgemeiner Verbindungsfehler ist aufgetreten.</translation> </message> <message> - <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="89"/> + <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="94"/> <source>Success</source> <translation type="unfinished">Erfolg</translation> </message> @@ -3439,52 +3538,52 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::KeyUploadDialog</name> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="59"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="60"/> <source>Uploading Public Key</source> <translation type="unfinished">Öffentlichen Schlüssel hochladen</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="77"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="78"/> <source>Error</source> <translation type="unfinished">Fehler</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="78"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="79"/> <source>Unknown error occurred</source> <translation>Unbekannter Fehler ist aufgetreten</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="147"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="150"/> <source>Key Not Found</source> <translation type="unfinished">Schlüssel nicht gefunden</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="150"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="153"/> <source>Timeout</source> <translation type="unfinished">Zeitablauf</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="153"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="156"/> <source>Key Server Not Found</source> <translation type="unfinished">Schlüsselserver nicht gefunden</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="156"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="159"/> <source>Connection Error</source> <translation type="unfinished">Verbindungsfehler</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="158"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="161"/> <source>Upload Failed</source> <translation>Hochladen fehlgeschlagen</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="162"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="165"/> <source>Upload Success</source> <translation type="unfinished">Erfolgreich hochgeladen</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="163"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="166"/> <source>Upload Public Key Successfully</source> <translation type="unfinished">Öffentlichen Schlüssel erfolgreich hochgeladen</translation> </message> @@ -3621,13 +3720,13 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::MainWindow</name> <message> - <location filename="../../../../src/ui/main_window/MainWindow.cpp" line="156"/> - <location filename="../../../../src/ui/main_window/MainWindow.cpp" line="159"/> + <location filename="../../../../src/ui/main_window/MainWindow.cpp" line="154"/> + <location filename="../../../../src/ui/main_window/MainWindow.cpp" line="157"/> <source>Critical error occur while loading GpgFrontend.</source> <translation type="unfinished">Beim Laden von GpgFrontend ist ein kritischer Fehler aufgetreten.</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindow.cpp" line="158"/> + <location filename="../../../../src/ui/main_window/MainWindow.cpp" line="156"/> <source>Loading Failed</source> <translation type="unfinished">Laden fehlgeschlagen</translation> </message> @@ -3649,20 +3748,20 @@ This will result in loss of all cached form positions, statuses, key servers, et <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="380"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="435"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="454"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="489"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="508"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="536"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="576"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="613"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="639"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="679"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="717"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="743"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="751"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="775"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="812"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="822"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="847"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="490"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="509"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="537"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="577"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="614"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="640"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="680"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="718"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="744"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="752"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="776"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="813"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="823"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="848"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="74"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="121"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="177"/> @@ -3671,14 +3770,14 @@ This will result in loss of all cached form positions, statuses, key servers, et <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="322"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="368"/> <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="97"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="120"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="140"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="156"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="169"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="182"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="197"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="247"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="255"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="121"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="141"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="157"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="170"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="183"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="198"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="248"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="256"/> <source>Error</source> <translation type="unfinished">Fehler</translation> </message> @@ -3689,10 +3788,10 @@ This will result in loss of all cached form positions, statuses, key servers, et <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="330"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="381"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="455"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="537"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="640"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="744"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="813"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="538"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="641"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="745"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="814"/> <source>Cannot read from file: %1</source> <translation>Kann Datei nicht lesen: %1</translation> </message> @@ -3708,10 +3807,10 @@ This will result in loss of all cached form positions, statuses, key servers, et <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="288"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="338"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="416"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="583"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="686"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="757"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="828"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="584"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="687"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="758"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="829"/> <source>Warning</source> <translation type="unfinished">Warnung</translation> </message> @@ -3720,10 +3819,10 @@ This will result in loss of all cached form positions, statuses, key servers, et <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="190"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="298"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="348"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="577"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="680"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="752"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="823"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="578"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="681"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="753"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="824"/> <source>Cannot write to file: %1</source> <translation>Kann in Datei nicht schreiben: %</translation> </message> @@ -3754,11 +3853,11 @@ This will result in loss of all cached form positions, statuses, key servers, et <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="312"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="362"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="436"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="509"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="614"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="718"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="776"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="848"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="510"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="615"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="719"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="777"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="849"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="75"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="122"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="178"/> @@ -3772,8 +3871,8 @@ This will result in loss of all cached form positions, statuses, key servers, et <message> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="126"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="241"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="558"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="661"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="559"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="662"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="279"/> <source>Invalid KeyPair</source> <translation type="unfinished">Ungültiges Schlüsselpaar</translation> @@ -3781,8 +3880,8 @@ This will result in loss of all cached form positions, statuses, key servers, et <message> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="127"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="242"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="559"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="662"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="560"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="663"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="280"/> <source>The selected keypair cannot be used for encryption.</source> <translation type="unfinished">Das ausgewählte Schlüsselpaar kann nicht zur Verschlüsselung verwendet werden.</translation> @@ -3790,8 +3889,8 @@ This will result in loss of all cached form positions, statuses, key servers, et <message> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="128"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="243"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="560"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="663"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="561"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="664"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="103"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="159"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="281"/> @@ -3817,8 +3916,8 @@ This will result in loss of all cached form positions, statuses, key servers, et <message> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="289"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="339"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="584"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="687"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="585"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="688"/> <source>The target file already exists, do you need to overwrite it?</source> <translation type="unfinished">Die Zieldatei existiert bereits, wollen Sie sie überschreiben?</translation> </message> @@ -3835,8 +3934,8 @@ This will result in loss of all cached form positions, statuses, key servers, et </message> <message> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="390"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="547"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="650"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="548"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="651"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="147"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="267"/> <source>No Key Checked</source> @@ -3844,8 +3943,8 @@ This will result in loss of all cached form positions, statuses, key servers, et </message> <message> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="391"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="548"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="651"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="549"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="652"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="148"/> <source>Please check the key in the key toolbox on the right.</source> <translation type="unfinished">Bitte wählen Sie den Schlüssel in der Schlüssel-Toolbox auf der rechten Seite.</translation> @@ -3891,41 +3990,41 @@ If Data And Signature is COMBINED within a single file, KEEP THIS EMPTY: </sourc Fals Daten und Signatur in einer Datei COMBINIERT sind, LASSEN SIE DIES LEER: </translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="490"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="491"/> <source>Please select the appropriate origin file or signature file. Ensure that both are in this directory.</source> <translation type="unfinished">Bitte wählen Sie die entsprechende Ursprungsdatei oder Signaturdatei aus. Stellen Sie sicher, dass sich beide in diesem Verzeichnis befinden.</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="499"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="500"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="237"/> <source>Verifying</source> <translation type="unfinished">Verifizierung</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="602"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="603"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="310"/> <source>Encrypting and Signing</source> <translation type="unfinished">Verschlüsseln und Signieren</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="705"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="706"/> <source>Archiving & Encrypting & Signing</source> <translation>Archivierung & Verschlüsselung & Signierung</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="758"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="829"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="759"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="830"/> <source>The output file %1 already exists, do you need to overwrite it?</source> <translation type="unfinished">Die Ausgabedatei %1 existiert bereits, wollen Sie sie überschreiben?</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="767"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="768"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="358"/> <source>Decrypting and Verifying</source> <translation type="unfinished">Entschlüsseln und Verifizieren</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="838"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="839"/> <source>Decrypting & Verifying & Extracting</source> <translation>Entschlüsselung & Verifizierung & Extraktion</translation> </message> @@ -3951,12 +4050,12 @@ Fals Daten und Signatur in einer Datei COMBINIERT sind, LASSEN SIE DIES LEER: </ </message> <message> <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="97"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="120"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="140"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="156"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="169"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="182"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="197"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="121"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="141"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="157"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="170"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="183"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="198"/> <source>Key Not Found.</source> <translation type="unfinished">Schlüssel nicht gefunden.</translation> </message> @@ -3975,805 +4074,962 @@ Fals Daten und Signatur in einer Datei COMBINIERT sind, LASSEN SIE DIES LEER: </ <translation type="unfinished">koordinierte Weltzeit</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="125"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="126"/> <source>Local Time</source> <translation type="unfinished">当地时间</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="248"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="249"/> <source>Cannot open this file. Please make sure that this is a regular file and it's readable.</source> <translation>Kann diese Datei nicht öffnen. Bitte stellen Sie sicher, dass es sich um eine reguläre, lesbare Datei handelt.</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="256"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="257"/> <source>Cannot open this file. The file is TOO LARGE (>1MB) for GpgFrontend Text Editor.</source> <translation>Kann diese Datei nicht öffen. DIe Datei ist ZU GROSS (>1MB) für den GpgFrontend Texteditor.</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="302"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="298"/> <source>GpgFrontend Upgradeable (New Version: %1).</source> <translation type="unfinished">GpgFrontend kann aktualisiert werden (neue Version: %1).</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="312"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="302"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="448"/> + <source>Update</source> + <translation type="unfinished">Aktualisieren</translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="308"/> <source>Withdrawn Version</source> <translation type="unfinished">Zurückgezogene Version</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="314"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="310"/> <source>This version(%1) may have been withdrawn by the developer due to serious problems. Please stop using this version immediately and use the latest stable version.</source> <translation type="unfinished">Diese Version (%1) wurde möglicherweise vom Entwickler aufgrund schwerwiegender Probleme zurückgezogen. Bitte beenden Sie die Verwendung dieser Version sofort und verwenden Sie die neueste stabile Version.</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="319"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="315"/> <source>You can download the latest stable version(%1) on Github Releases Page.<br/></source> <translation type="unfinished">Sie können die neueste stabile Version (%1) auf der Github-Release-Seite herunterladen.<br/></translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="324"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="320"/> <source>This maybe a BETA Version (Latest Stable Version: %1).</source> <translation type="unfinished">Dies ist möglicherweise eine BETA-Version (Neueste stabile Version: %1).</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="44"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="45"/> <source>New</source> <translation type="unfinished">Neu</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="50"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="51"/> <source>Open a new file</source> <translation type="unfinished">Eine neue Datei öffnen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="53"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="54"/> <source>Open...</source> <translation type="unfinished">Öffnen...</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="56"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="57"/> <source>Open an existing file</source> <translation type="unfinished">Eine vorhandene Datei öffnen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="59"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="60"/> <source>File Browser</source> <translation type="unfinished">Dateibrowser</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="62"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="63"/> <source>Open a file browser</source> <translation type="unfinished">Dateibrowser öffnen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="66"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="67"/> <source>Save File</source> <translation type="unfinished">Datei speichern</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="69"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="70"/> <source>Save the current File</source> <translation type="unfinished">Die aktuelle Datei speichern</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="72"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="73"/> <source>Save As</source> <translation type="unfinished">Speichern als</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="75"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="76"/> <source>Save the current File as...</source> <translation type="unfinished">Die aktuelle Datei speichern als...</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="78"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="79"/> <source>Print</source> <translation type="unfinished">Drucken</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="81"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="82"/> <source>Print Document</source> <translation type="unfinished">Dokument drucken</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="84"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="85"/> <source>Close</source> <translation type="unfinished">Schließen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="86"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="88"/> <source>Close file</source> <translation type="unfinished">Datei schließen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="89"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="91"/> <source>Quit</source> <translation type="unfinished">Beenden</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="92"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="94"/> <source>Quit Program</source> <translation type="unfinished">Programm beenden</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="97"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="99"/> <source>Undo</source> <translation type="unfinished">Rückgängig machen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="99"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="102"/> <source>Undo Last Edit Action</source> <translation type="unfinished">Letzten Bearbeitungsschritt rückgängig machen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="102"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="105"/> <source>Redo</source> <translation type="unfinished">Wiederholen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="104"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="108"/> <source>Redo Last Edit Action</source> <translation type="unfinished">Letzten Bearbeitungsschritt wiederholen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="107"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="111"/> <source>Zoom In</source> <translation type="unfinished">Hineinzoomen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="111"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="116"/> <source>Zoom Out</source> <translation type="unfinished">Rauszoomen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="115"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="121"/> <source>Paste</source> <translation type="unfinished">Einfügen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="118"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="124"/> <source>Paste Text From Clipboard</source> <translation type="unfinished">Text aus der Zwischenablage einfügen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="121"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="127"/> <source>Cut</source> <translation type="unfinished">Ausschneiden</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="125"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="131"/> <source>Cut the current selection's contents to the clipboard</source> <translation type="unfinished">Den Inhalt der aktuellen Auswahl in die Zwischenablage ausschneiden</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="129"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="135"/> <source>Copy</source> <translation type="unfinished">Kopieren</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="133"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="139"/> <source>Copy the current selection's contents to the clipboard</source> <translation type="unfinished">Den Inhalt der aktuellen Auswahl in die Zwischenablage kopieren</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="137"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="143"/> <source>Quote</source> <translation type="unfinished">Zitieren</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="139"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="145"/> <source>Quote whole text</source> <translation type="unfinished">Ganzen Text zitieren</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="142"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="148"/> <source>Select All</source> <translation type="unfinished">Alles auswählen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="145"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="151"/> <source>Select the whole text</source> <translation type="unfinished">Den gesamten Text auswählen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="149"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="155"/> <source>Find</source> <translation type="unfinished">Suchen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="152"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="158"/> <source>Find a word</source> <translation type="unfinished">Suche ein Wort</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="155"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="161"/> <source>Remove spacing</source> <translation type="unfinished">Leerzeichen entfernen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="160"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="166"/> <source>Remove double linebreaks, e.g. in pasted text from Web Mailer</source> <translation type="unfinished">Doppelte Zeilenumbrüche entfernen, z.B. in eingefügtem Text aus Web Mailer</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="164"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="170"/> <source>Settings</source> <translation type="unfinished">Einstellungen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="165"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="171"/> <source>Open settings dialog</source> <translation type="unfinished">Einstellungsdialog öffnen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="173"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="179"/> <source>Encrypt</source> <translation type="unfinished">Verschlüsseln</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="177"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="183"/> <source>Encrypt Message</source> <translation type="unfinished">Nachricht verschlüsseln</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="195"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="201"/> <source>Encrypt Sign</source> <translation type="unfinished">Verschlüsseln Signieren</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="200"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="206"/> <source>Encrypt and Sign Message</source> <translation type="unfinished">Nachricht verschlüsseln und signieren</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="218"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="224"/> <source>Decrypt</source> <translation type="unfinished">Entschlüsseln</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="221"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="227"/> <source>Decrypt Message</source> <translation type="unfinished">Nachricht entschlüsseln</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="243"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="249"/> <source>Decrypt Verify</source> <translation type="unfinished">Entschlüsseln Verifizieren</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="247"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="253"/> <source>Decrypt and Verify Message</source> <translation type="unfinished">Nachricht entschlüsseln und überprüfen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="269"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="275"/> <source>Sign</source> <translation type="unfinished">Unterschreiben</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="272"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="278"/> <source>Sign Message</source> <translation type="unfinished">Nachricht unterschreiben</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="284"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="290"/> <source>Verify</source> <translation type="unfinished">Verifizieren</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="287"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="293"/> <source>Verify Message</source> <translation type="unfinished">Nachricht verifizieren</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="302"/> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="540"/> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="614"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="308"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="554"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="636"/> <source>File</source> <translation type="unfinished">Datei</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="304"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="310"/> <source>Import New Key From File</source> <translation type="unfinished">Neuen Schlüssel aus Datei importieren</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="308"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="314"/> <source>Clipboard</source> <translation type="unfinished">Zwischenablage</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="312"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="318"/> <source>Import New Key From Clipboard</source> <translation type="unfinished">Neuen Schlüssel aus der Zwischenablage importieren</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="323"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="329"/> <source>Keyserver</source> <translation type="unfinished">Schlüsselserver</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="327"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="333"/> <source>Import New Key From Keyserver</source> <translation type="unfinished">Neuen Schlüssel vom Schlüsselserver importieren</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="333"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="339"/> <source>Editor</source> <translation type="unfinished">Editor</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="335"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="341"/> <source>Import New Key From Editor</source> <translation type="unfinished">Neuen Schlüssel aus dem Editor importieren</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="339"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="345"/> <source>Manage Keys</source> <translation type="unfinished">Schlüssel verwalten</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="341"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="347"/> <source>Open Key Management</source> <translation type="unfinished">Schlüsselverwaltung öffnen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="345"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="351"/> <source>Clear Password Cache</source> <translation type="unfinished">Passwort-Cache löschen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="348"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="354"/> <source>Clear Password Cache of GnuPG</source> <translation type="unfinished">Passwort-Cache von GnuPG löschen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="353"/> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="370"/> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="391"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="359"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="376"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="397"/> <source>Successful Operation</source> <translation type="unfinished">Erfolgreiche Durchführung</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="354"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="360"/> <source>Clear password cache successfully</source> <translation type="unfinished">Kennwort-Cache erfolgreich gelöscht</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="356"/> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="374"/> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="395"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="362"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="380"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="401"/> <source>Failed Operation</source> <translation type="unfinished">Fehlgeschlagener Vorgang</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="357"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="363"/> <source>Failed to clear password cache of GnuPG</source> <translation type="unfinished">Passwort-Cache von GnuPG konnte nicht geleert werden</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="362"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="368"/> <source>Reload All Components</source> <translation type="unfinished">Alle Komponenten neu laden</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="364"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="370"/> <source>Reload All GnuPG's Components</source> <translation type="unfinished">Alle Komponenten von GnuPG neu laden</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="371"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="377"/> <source>Reload all the GnuPG's components successfully</source> <translation type="unfinished">Alle GnuPG-Komponenten erfolgreich neu geladen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="375"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="381"/> <source>Failed to reload all or one of the GnuPG's component(s)</source> <translation type="unfinished">Fehler beim Neuladen aller oder einer Komponente(n) von GnuPG</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="380"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="386"/> <source>Restart All Components</source> <translation type="unfinished">Alle Komponenten neu starten</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="382"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="388"/> <source>Restart All GnuPG's Components</source> <translation type="unfinished">Alle Komponenten von GnuPG neu starten</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="392"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="398"/> <source>Restart all the GnuPG's components successfully</source> <translation type="unfinished">Alle Komponenten von GnuPG erfolgreich neu gestartet</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="396"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="402"/> <source>Failed to restart all or one of the GnuPG's component(s)</source> <translation type="unfinished">Neustart aller oder einer GnuPG-Komponente(n) fehlgeschlagen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="401"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="407"/> <source>Open GnuPG Controller</source> <translation type="unfinished">GnuPG-Controller öffnen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="403"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="409"/> <source>Open GnuPG Controller Dialog</source> <translation type="unfinished">GnuPG-Controller-Dialog öffnen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="410"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="413"/> + <source>Open Module Controller</source> + <translation type="unfinished">Modul-Controller öffnen</translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="415"/> + <source>Open Module Controller Dialog</source> + <translation type="unfinished">Modul-Controller-Dialog öffnen</translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="422"/> <source>About</source> <translation type="unfinished">Über</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="412"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="424"/> <source>Show the application's About box</source> <translation type="unfinished">Info-Box der Anwendung anzeigen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="417"/> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="590"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="430"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="434"/> <source>GnuPG</source> <translation type="unfinished">GnuPG</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="419"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="432"/> <source>Information about Gnupg</source> <translation type="unfinished">Informationen über Gnupg</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="423"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="437"/> <source>Translate</source> <translation type="unfinished">Übersetzen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="425"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="439"/> <source>Information about translation</source> <translation type="unfinished">Informationen zur Übersetzung</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="432"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="441"/> + <source>Translators</source> + <translation type="unfinished">Übersetzer</translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="444"/> <source>Check for Updates</source> <translation type="unfinished">Auf Updates prüfen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="434"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="446"/> <source>Check for updates</source> <translation type="unfinished">Auf Updates prüfen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="438"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="451"/> <source>Open Wizard</source> <translation type="unfinished">Assistenten öffnen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="439"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="453"/> <source>Open the wizard</source> <translation type="unfinished">Öffne den Assistenten</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="444"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="458"/> <source>Append Public Key to Editor</source> <translation type="unfinished">Öffentlichen Schlüssel an den Editor anhängen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="446"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="460"/> <source>Append selected Keypair's Public Key to Editor</source> <translation type="unfinished">Den öffentlichen Schlüssel des ausgewählten Schlüsselpaars an den Editor anhängen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="451"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="465"/> <source>Append Create DateTime to Editor</source> <translation type="unfinished">Erstellungsdatum an den Editor anfügen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="453"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="467"/> <source>Append selected Key's creation date and time to Editor</source> <translation type="unfinished">Erstellungsdatum und -zeit des ausgewählten Schlüssels an den Editor anhängen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="458"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="472"/> <source>Append Expire DateTime to Editor</source> <translation type="unfinished">Ablaufdatum an den Editor anhängen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="460"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="474"/> <source>Append selected Key's expiration date and time to Editor</source> <translation type="unfinished">Ablaufdatum und -uhrzeit des ausgewählten Schlüssels an den Editor anhängen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="465"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="479"/> <source>Append Fingerprint to Editor</source> <translation type="unfinished">Fingerabdruck an Editor anhängen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="467"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="481"/> <source>Append selected Key's Fingerprint to Editor</source> <translation type="unfinished">Fingerabdruck des ausgewählten Schlüssels an den Editor anhängen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="471"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="485"/> <source>Copy Email</source> <translation type="unfinished">E-Mail kopieren</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="473"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="487"/> <source>Copy selected Keypair's to clipboard</source> <translation type="unfinished">Ausgewählte Schlüsselpaare in die Zwischenablage kopieren</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="478"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="492"/> <source>Copy Default UID</source> <translation type="unfinished">Standard-UID kopieren</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="480"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="494"/> <source>Copy selected Keypair's default UID to clipboard</source> <translation type="unfinished">Standard-UID des ausgewählten Schlüsselpaars in die Zwischenablage kopieren</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="484"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="498"/> <source>Copy Key ID</source> <translation type="unfinished">Schlüssel-ID kopieren</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="486"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="500"/> <source>Copy selected Keypair's ID to clipboard</source> <translation type="unfinished">ID des ausgewählten Schlüsselpaars in die Zwischenablage kopieren</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="490"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="504"/> <source>Show Key Details</source> <translation type="unfinished">Schlüsseldetails anzeigen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="491"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="505"/> <source>Show Details for this Key</source> <translation type="unfinished">Details zu diesem Schlüssel anzeigen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="495"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="509"/> <source>Add To Favourite</source> <translation type="unfinished">Zu Favoriten hinzufügen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="496"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="510"/> <source>Add this key to Favourite Table</source> <translation type="unfinished">Diesen Schlüssel zur Favoritentabelle hinzufügen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="502"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="516"/> <source>Remove From Favourite</source> <translation type="unfinished">Aus Favoriten entfernen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="504"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="518"/> <source>Remove this key from Favourite Table</source> <translation type="unfinished">Diesen Schlüssel aus der Favoritentabelle entfernen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="510"/> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="511"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="524"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="525"/> <source>Set Owner Trust Level</source> <translation type="unfinished">Vertrauensstufe des Eigentümers festlegen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="530"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="544"/> <source>Remove PGP Header</source> <translation type="unfinished">PGP-Header entfernen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="534"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="548"/> <source>Add PGP Header</source> <translation type="unfinished">PGP-Header hinzufügen</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="553"/> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="636"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="567"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="658"/> <source>Edit</source> <translation type="unfinished">Bearbeiten</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="571"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="585"/> <source>Crypt</source> <translation type="unfinished">Verschlüsselung</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="581"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="595"/> <source>Keys</source> <translation type="unfinished">Schlüssel</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="582"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="596"/> <source>Import Key</source> <translation type="unfinished">Schlüssel importieren</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="598"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="604"/> + <source>Advance</source> + <translation type="unfinished">Vorgezogene Funktion</translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="612"/> <source>Steganography</source> <translation type="unfinished">Steganographie</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="602"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="616"/> <source>View</source> <translation type="unfinished">Ansicht</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="604"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="618"/> <source>Help</source> <translation type="unfinished">Hilfe</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="621"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="643"/> <source>Operations</source> <translation type="unfinished">Aktivieren</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="631"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="653"/> <source>Key</source> <translation type="unfinished">Schlüssel</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="644"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="666"/> <source>Special Edit</source> <translation type="unfinished">Sonderbearbeitung</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="656"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="678"/> <source>Import key from...</source> <translation type="unfinished">Schlüssel importieren von...</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="657"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="679"/> <source>Import key</source> <translation type="unfinished">Schlüssel importieren</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="673"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="695"/> <source>Ready</source> <translation type="unfinished">Bereit</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="680"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="702"/> <source>Key ToolBox</source> <translation type="unfinished">Schlüssel-Toolbox</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="688"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="710"/> <source>Default</source> <translation type="unfinished">Standard</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="696"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="718"/> <source>Favourite</source> <translation type="unfinished">Favorit</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="704"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="726"/> <source>Only Public Key</source> <translation type="unfinished">Nur öffentlicher Schlüssel</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="714"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="736"/> <source>Has Private Key</source> <translation type="unfinished">Hat privaten Schlüssel</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="728"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="750"/> <source>Information Board</source> <translation type="unfinished">Informationstafel</translation> </message> </context> <context> + <name>GpgFrontend::UI::ModuleControllerDialog</name> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="49"/> + <source>Module Informations</source> + <translation type="unfinished">Informationen zum Modul</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="50"/> + <source>Actions</source> + <translation type="unfinished">Aktionen</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="51"/> + <source>Show Mods Directory</source> + <translation type="unfinished">Mods-Verzeichnis anzeigen</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="53"/> + <source>Registered Modules</source> + <translation type="unfinished">Registrierte Module</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="54"/> + <source>Global Register Table</source> + <translation type="unfinished">Globale Registertabelle</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="55"/> + <source>Debugger</source> + <translation type="unfinished">Debugger</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="58"/> + <source>Tips: Module name front with "*" stands for integrated module.</source> + <translation type="unfinished">Hinweise: Modulname mit "*" steht für integriertes Modul.</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="60"/> + <source>Module Controller</source> + <translation type="unfinished">Modul-Controller</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="84"/> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="184"/> + <source>Enable Auto Activate</source> + <translation type="unfinished">Automatisches Aktivieren aktivieren</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="133"/> + <source>BASIC INFO</source> + <translation type="unfinished">GRUNDINFO</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="135"/> + <source>ID</source> + <translation type="unfinished">ID</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="137"/> + <source>Version</source> + <translation type="unfinished">Version</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="139"/> + <source>SDK Version</source> + <translation type="unfinished">SDK-Version</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="141"/> + <source>Qt ENV Version</source> + <translation type="unfinished">Qt ENV Version</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="143"/> + <source>Hash</source> + <translation type="unfinished">Hash</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="144"/> + <source>Path</source> + <translation type="unfinished">Pfad</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="148"/> + <source>Auto Activate</source> + <translation type="unfinished">Automatisch aktivieren</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="149"/> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="151"/> + <source>True</source> + <translation type="unfinished">Wahr</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="149"/> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="151"/> + <source>False</source> + <translation type="unfinished">Falsch</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="150"/> + <source>Active</source> + <translation type="unfinished">Aktiv</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="155"/> + <source>METADATA</source> + <translation type="unfinished">METADATEN</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="171"/> + <source>Listening Event</source> + <translation type="unfinished">Anhören von Veranstaltungen</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="180"/> + <source>Deactivate</source> + <translation type="unfinished">Deaktivieren</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="181"/> + <source>Activate</source> + <translation type="unfinished">Aktivieren</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="183"/> + <source>Disable Auto Activate</source> + <translation type="unfinished">Automatisches Aktivieren deaktivieren</translation> + </message> +</context> +<context> <name>GpgFrontend::UI::NetworkTab</name> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="71"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="72"/> <source>Proxy</source> <translation type="unfinished">Proxy</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="72"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="73"/> <source>Network Ability</source> <translation type="unfinished">Netzwerkfähigkeit</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="73"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="74"/> <source>Operations</source> <translation type="unfinished">Aktivieren</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="75"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="76"/> <source>Enable Proxy</source> <translation type="unfinished">Proxy aktivieren</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="76"/> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="79"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="77"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="80"/> <source>Port</source> <translation type="unfinished">Port</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="78"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="79"/> <source>Host Address</source> <translation type="unfinished">Adresse des Hosts</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="80"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="81"/> <source>Proxy Type</source> <translation type="unfinished">Proxy-Typ</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="81"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="82"/> <source>Username</source> <translation type="unfinished">Benutzername</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="82"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="83"/> <source>Password</source> <translation type="unfinished">Passwort</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="85"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="86"/> <source>Apply Proxy Settings and Check Proxy Connection</source> <translation type="unfinished">Proxy-Einstellungen anwenden und Proxy-Verbindung prüfen</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="88"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="89"/> <source>Forbid all GnuPG network connection.</source> <translation type="unfinished">Alle GnuPG-Netzwerkverbindungen verbieten.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="90"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="93"/> <source>Prohibit checking for version updates when the program starts.</source> <translation type="unfinished">Die Suche nach Versionsaktualisierungen beim Start des Programms deaktivieren.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="92"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="96"/> <source>Automatically import a missing key for signature verification.</source> <translation type="unfinished">Automatisch fehlenden Schlüssel zur Signaturprüfung importieren.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="94"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="98"/> <source>Tips: These Option Changes take effect only after the application restart.</source> <translation type="unfinished">Tipps: Diese Optionsänderungen werden erst nach dem Neustart der Anwendung wirksam.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="170"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="173"/> <source>Test Server Url Accessibility</source> <translation type="unfinished">Server-URL Erreichbarkeit testen</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="171"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="174"/> <source>Server Url</source> <translation>Server-URL</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="181"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="184"/> <source>Success</source> <translation type="unfinished">Erfolg</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="182"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="185"/> <source>Successfully connect to the target server through the proxy server.</source> <translation type="unfinished">Verbinden Sie sich erfolgreich über den Proxyserver mit dem Zielserver.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="186"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="189"/> <source>Failed</source> <translation type="unfinished">Gescheitert</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="187"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="190"/> <source>Unable to connect to the target server through the proxy server. Proxy settings may be invalid.</source> <translation type="unfinished">Es kann keine Verbindung zum Zielserver über den Proxyserver hergestellt werden. Die Proxy-Einstellungen sind möglicherweise ungültig.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="197"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="200"/> <source>Test Proxy Server Connection...</source> <translation type="unfinished">Proxyserververbindung testen…</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="198"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="201"/> <source>Is using your proxy settings to access the url. Note that this test operation will apply your proxy settings to the entire software.</source> <translation type="unfinished">Verwendet Ihre Proxy-Einstellungen, um auf die URL zuzugreifen. Beachten Sie, dass dieser Testvorgang Ihre Proxy-Einstellungen auf die gesamte Software anwendet.</translation> </message> @@ -4975,37 +5231,37 @@ Fals Daten und Signatur in einer Datei COMBINIERT sind, LASSEN SIE DIES LEER: </ <context> <name>GpgFrontend::UI::SettingsDialog</name> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="54"/> + <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="53"/> <source>General</source> <translation type="unfinished">Allgemein</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="55"/> + <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="54"/> <source>Appearance</source> <translation type="unfinished">Darstellung</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="56"/> + <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="55"/> <source>Key Server</source> <translation type="unfinished">Schlüsselserver</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="57"/> + <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="56"/> <source>Network</source> <translation type="unfinished">Netzwerk</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="68"/> + <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="67"/> <source>Settings</source> <translation type="unfinished">Einstellungen</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="72"/> + <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="71"/> <source>Preference</source> <translation type="unfinished">Einstellung</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="128"/> + <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="124"/> <source>System Default</source> <translation type="unfinished">Systemstandard</translation> </message> @@ -5248,7 +5504,7 @@ Fals Daten und Signatur in einer Datei COMBINIERT sind, LASSEN SIE DIES LEER: </ <context> <name>GpgFrontend::UI::TranslatorsTab</name> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="131"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="145"/> <source>If you think there are any problems with the translation, why not participate in the translation work? If you want to participate, please read the document or contact me via email.</source> <translation type="unfinished">Wenn Sie der Meinung sind, dass es Probleme mit der Übersetzung gibt, warum beteiligen Sie sich nicht an der Übersetzungsarbeit? Wenn Sie teilnehmen möchten, lesen Sie bitte das Dokument oder kontaktieren Sie mich per E-Mail.</translation> </message> @@ -5256,63 +5512,63 @@ Fals Daten und Signatur in einer Datei COMBINIERT sind, LASSEN SIE DIES LEER: </ <context> <name>GpgFrontend::UI::UpdateTab</name> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="154"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="163"/> <source>It is recommended that you always check the version of GpgFrontend and upgrade to the latest version.</source> <translation type="unfinished">Es wird empfohlen, immer die Version von GpgFrontend zu überprüfen und auf die neueste Version zu aktualisieren.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="157"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="166"/> <source>New versions not only represent new features, but also often represent functional and security fixes.</source> <translation type="unfinished">Neue Versionen beinhalten nicht nur neue Funktionen, sondern stellen oft auch Funktions- und Sicherheitskorrekturen dar.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="163"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="172"/> <source>Current Version</source> <translation type="unfinished">Aktuelle Version</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="164"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="173"/> <source>: </source> <translation type="unfinished">: </translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="246"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="248"/> <source>Latest Version From Github</source> <translation type="unfinished">Neueste Version von Github</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="252"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="254"/> <source>The current version is less than the latest version on github.</source> <translation type="unfinished">Die aktuelle Versionsnunmmer ist kleiner als die neueste Version auf github.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="254"/> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="265"/> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="277"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="256"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="267"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="279"/> <source>Please click</source> <translation type="unfinished">Bitte klicken Sie</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="257"/> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="268"/> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="280"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="259"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="270"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="282"/> <source>Here</source> <translation type="unfinished">Hier</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="257"/> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="268"/> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="280"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="259"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="270"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="282"/> <source>to download the latest stable version.</source> <translation type="unfinished">um die neueste stabile Version herunterzuladen.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="263"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="265"/> <source>This version has serious problems and has been withdrawn. Please stop using it immediately.</source> <translation type="unfinished">Diese Version hat ernsthafte Probleme und wurde zurückgezogen. Bitte hören Sie sofort auf, sie zu verwenden.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="274"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="276"/> <source>This version has not been released yet, it may be a beta version. If you are not a tester and care about version stability, please do not use this version.</source> <translation type="unfinished">Diese Version wurde noch nicht veröffentlicht, möglicherweise handelt es sich um eine Beta-Version. Wenn Sie kein Tester sind und Ihnen Stabilität der Version wichtig ist, verwenden Sie diese Version bitte nicht.</translation> </message> @@ -5509,7 +5765,7 @@ Fals Daten und Signatur in einer Datei COMBINIERT sind, LASSEN SIE DIES LEER: </ <context> <name>GpgFrontend::UI::Wizard</name> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="44"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="43"/> <source>First Start Wizard</source> <translation type="unfinished">Assistent für den ersten Start</translation> </message> @@ -5550,17 +5806,17 @@ Fals Daten und Signatur in einer Datei COMBINIERT sind, LASSEN SIE DIES LEER: </ <context> <name>QCoreApplication</name> <message> - <location filename="../../../../src/cmd.cpp" line="49"/> + <location filename="../../../../src/cmd.cpp" line="47"/> <source>This is free software; see the source for copying conditions.</source> <translation type="unfinished">Dies ist freie Software. Beachten Sie den Quellcode für die Kopierbedingungen.</translation> </message> <message> - <location filename="../../../../src/cmd.cpp" line="54"/> + <location filename="../../../../src/cmd.cpp" line="52"/> <source>Build DateTime: </source> <translation type="unfinished">Build DateTime: </translation> </message> <message> - <location filename="../../../../src/cmd.cpp" line="55"/> + <location filename="../../../../src/cmd.cpp" line="54"/> <source>Build Version: </source> <translation type="unfinished">Build Version: </translation> </message> @@ -5570,17 +5826,17 @@ Fals Daten und Signatur in einer Datei COMBINIERT sind, LASSEN SIE DIES LEER: </ <translation type="unfinished">Sourcecode Version: </translation> </message> <message> - <location filename="../../../../src/core/GpgCoreInit.cpp" line="294"/> + <location filename="../../../../src/core/GpgCoreInit.cpp" line="303"/> <source>GpgME initiation failed</source> <translation>GpgME-Initiation fehlgeschlagen</translation> </message> <message> - <location filename="../../../../src/core/GpgCoreInit.cpp" line="397"/> + <location filename="../../../../src/core/GpgCoreInit.cpp" line="409"/> <source>GpgME Context initiation failed</source> <translation>GpgME-Kontext-Initiation fehlgeschlagen</translation> </message> <message> - <location filename="../../../../src/core/GpgCoreInit.cpp" line="406"/> + <location filename="../../../../src/core/GpgCoreInit.cpp" line="418"/> <source>Gpg Key Detabase initiation failed</source> <translation>Gpg Key Detabase initiation fehlgeschlagen</translation> </message> @@ -5638,30 +5894,40 @@ Fals Daten und Signatur in einer Datei COMBINIERT sind, LASSEN SIE DIES LEER: </ <translation>erfolgreich</translation> </message> <message> - <location filename="../../../../src/ui/GpgFrontendUIInit.cpp" line="54"/> + <location filename="../../../../src/ui/GpgFrontendUIInit.cpp" line="56"/> <source>Loading Gnupg Info...</source> <translation type="unfinished">Gnupg-Info wird geladen...</translation> </message> <message> - <location filename="../../../../src/ui/GpgFrontendUIInit.cpp" line="55"/> + <location filename="../../../../src/ui/GpgFrontendUIInit.cpp" line="57"/> <source>If this process is too slow, please set the key server address appropriately in the gnupg configuration file (depending on the network situation in your country or region).</source> <translation type="unfinished">Sollte dieser Vorgang zu langsam sein, stellen Sie bitte die Keyserver-Adresse entsprechend in der gnupg-Konfigurationsdatei ein (abhängig von der Netzwerksituation in Ihrem Land oder Ihrer Region).</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="63"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="64"/> <source>Show Verify Details</source> <translation type="unfinished">Verifizierungsdetails anzeigen</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="71"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="72"/> <source>Public key not found locally</source> <translation type="unfinished">Öffentlicher Schlüssel lokal nicht gefunden</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="72"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="73"/> <source>There is no target public key content in local for GpgFrontend to gather enough information about this Signature. Do you want to import the public key from Keyserver now?</source> <translation type="unfinished">Es gibt lokal keinen öffentlichen Zielschlüsselinhalt für GpgFrontend, um genügend Informationen über diese Signatur zu sammeln. Möchten Sie jetzt den öffentlichen Schlüssel vom Keyserver importieren?</translation> </message> + <message> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="486"/> + <source>Sync All Public Key</source> + <translation type="unfinished">Alle öffentlichen Schlüssel synchronisieren</translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="487"/> + <source>You have not checked any public keys that you want to synchronize, do you want to synchronize all local public keys from the key server?</source> + <translation type="unfinished">Sie haben keine öffentlichen Schlüssel angekreuzt, die Sie synchronisieren möchten. Möchten Sie alle lokalen öffentlichen Schlüssel mit dem Schlüsselserver synchronisieren?</translation> + </message> </context> <context> <name>QObject</name> diff --git a/resource/lfs/locale/ts/GpgFrontend.en_US.ts b/resource/lfs/locale/ts/GpgFrontend.en_US.ts new file mode 100644 index 00000000..3fa7292b --- /dev/null +++ b/resource/lfs/locale/ts/GpgFrontend.en_US.ts @@ -0,0 +1,5799 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.1" language="en_US"> +<context> + <name>GpgFrontend::GpgDecryptResultAnalyse</name> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgDecryptResultAnalyse.cpp" line="41"/> + <source>Decrypt Operation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgDecryptResultAnalyse.cpp" line="44"/> + <source>Success</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgDecryptResultAnalyse.cpp" line="46"/> + <source>Failed</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgDecryptResultAnalyse.cpp" line="51"/> + <source>Unsupported Algo</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgDecryptResultAnalyse.cpp" line="59"/> + <source>General State</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgDecryptResultAnalyse.cpp" line="62"/> + <source>File Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgDecryptResultAnalyse.cpp" line="65"/> + <source>MIME</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgDecryptResultAnalyse.cpp" line="66"/> + <location filename="../../../../src/core/function/result_analyse/GpgDecryptResultAnalyse.cpp" line="69"/> + <location filename="../../../../src/core/function/result_analyse/GpgDecryptResultAnalyse.cpp" line="84"/> + <source>false</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgDecryptResultAnalyse.cpp" line="66"/> + <location filename="../../../../src/core/function/result_analyse/GpgDecryptResultAnalyse.cpp" line="69"/> + <location filename="../../../../src/core/function/result_analyse/GpgDecryptResultAnalyse.cpp" line="84"/> + <source>true</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgDecryptResultAnalyse.cpp" line="68"/> + <source>Message Integrity Protection</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgDecryptResultAnalyse.cpp" line="74"/> + <source>Symmetric Encryption Algorithm</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgDecryptResultAnalyse.cpp" line="79"/> + <source>Session Key</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgDecryptResultAnalyse.cpp" line="83"/> + <source>German Encryption Standards</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgDecryptResultAnalyse.cpp" line="91"/> + <source>Recipient(s)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgDecryptResultAnalyse.cpp" line="97"/> + <source>Recipient</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgDecryptResultAnalyse.cpp" line="119"/> + <source>unknown</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgDecryptResultAnalyse.cpp" line="125"/> + <source>Key ID</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgDecryptResultAnalyse.cpp" line="126"/> + <source>Public Key Algo</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgDecryptResultAnalyse.cpp" line="128"/> + <source>Status</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::GpgEncryptResultAnalyse</name> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgEncryptResultAnalyse.cpp" line="40"/> + <source>Encrypt Operation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgEncryptResultAnalyse.cpp" line="43"/> + <source>Success</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgEncryptResultAnalyse.cpp" line="45"/> + <source>Failed</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgEncryptResultAnalyse.cpp" line="56"/> + <source>Invalid Recipients</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgEncryptResultAnalyse.cpp" line="63"/> + <source>Recipients</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgEncryptResultAnalyse.cpp" line="65"/> + <source>Fingerprint</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgEncryptResultAnalyse.cpp" line="67"/> + <source>Reason</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::GpgSignResultAnalyse</name> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="43"/> + <source>Sign Operation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="46"/> + <source>Success</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="48"/> + <source>Failed</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="60"/> + <source>New Signature</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="63"/> + <source>Sign Mode</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="65"/> + <source>Normal</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="67"/> + <source>Clear</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="69"/> + <source>Detach</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="77"/> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="98"/> + <source>Signed By</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="88"/> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="91"/> + <source>Key ID</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="89"/> + <source>Subkey</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="92"/> + <source>Primary Key</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="94"/> + <source>Key Create Date</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="98"/> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="130"/> + <source>Fingerprint</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="99"/> + <source><unknown></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="101"/> + <source>Public Key Algo</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="103"/> + <source>Hash Algo</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="105"/> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="107"/> + <source>Sign Date</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="105"/> + <source>UTC</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="107"/> + <source>Localized</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="122"/> + <source>Invalid Signers</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="128"/> + <source>Signer</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="132"/> + <source>Reason</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::GpgVerifyResultAnalyse</name> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="43"/> + <source>Verify Operation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="46"/> + <source>Success</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="48"/> + <source>Failed</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="57"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="60"/> + <source>Signed On</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="57"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="191"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="237"/> + <source>UTC</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="60"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="194"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="240"/> + <source>Localized</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="63"/> + <source>Signatures List</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="70"/> + <source>Signature [%1]:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="71"/> + <source>Status</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="74"/> + <source>A Bad Signature.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="76"/> + <source>This Signature is invalid.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="81"/> + <source>A</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="83"/> + <source>Good</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="86"/> + <source>Bad</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="89"/> + <source>Expired</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="92"/> + <source>Missing Key's</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="95"/> + <source>Revoked Key's</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="98"/> + <source>Expired Key's</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="101"/> + <source>Missing CRL's</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="105"/> + <source>Signature Fully Valid.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="107"/> + <source>Signature Not Fully Valid.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="108"/> + <source>Tips</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="109"/> + <source>Adjust Trust Level to make it Fully Vaild</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="116"/> + <source>Key is NOT present with ID 0x</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="125"/> + <source>A signature could NOT be verified due to a Missing Key</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="131"/> + <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/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="140"/> + <source>A signature is valid but expired</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="147"/> + <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/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="155"/> + <source>There was some other error which prevented the signature verification.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="163"/> + <source>Error for key with fingerprint</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="174"/> + <source>Could not find information that can be used for verification.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="183"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="205"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="228"/> + <source>Signed By</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="183"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="228"/> + <source>Fingerprint</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="185"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="229"/> + <source><unknown></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="188"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="234"/> + <source>Public Key Algo</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="190"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="236"/> + <source>Hash Algo</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="191"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="194"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="237"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="240"/> + <source>Sign Date</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="217"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="220"/> + <source>Key ID</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="218"/> + <source>Subkey</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="221"/> + <source>Primary Key</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="223"/> + <source>Key Create Date</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::Module::GlobalRegisterTable</name> + <message> + <location filename="../../../../src/core/module/GlobalRegisterTable.cpp" line="47"/> + <source>NODE</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/module/GlobalRegisterTable.cpp" line="82"/> + <source>LEAF</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::Module::GlobalRegisterTableTreeModel::Impl</name> + <message> + <location filename="../../../../src/core/module/GlobalRegisterTable.cpp" line="193"/> + <source><EMPTY></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/module/GlobalRegisterTable.cpp" line="232"/> + <source><UNSUPPORTED></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/module/GlobalRegisterTable.cpp" line="267"/> + <source>Key</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/module/GlobalRegisterTable.cpp" line="269"/> + <source>Type</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/module/GlobalRegisterTable.cpp" line="271"/> + <source>Value Type</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/module/GlobalRegisterTable.cpp" line="273"/> + <source>Value</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::AboutDialog</name> + <message> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="41"/> + <source>About</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="47"/> + <source>About GpgFrontend</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="51"/> + <source>GnuPG</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="54"/> + <source>Translators</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="58"/> + <source>Update</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::AppearanceTab</name> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="43"/> + <source>General</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="45"/> + <source>Theme</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="49"/> + <source>Toolbar Icon</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="51"/> + <source>Size</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="52"/> + <source>small</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="53"/> + <source>medium</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="54"/> + <source>large</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="57"/> + <source>just text</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="58"/> + <source>just icons</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="59"/> + <source>text and icons</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="47"/> + <source>Save window size and position on exit.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="56"/> + <source>Style</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="61"/> + <source>Font Size</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="63"/> + <source>Text Editor</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="64"/> + <source>Information Board</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::ChoosePage</name> + <message> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="107"/> + <source>Choose your action...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="108"/> + <source>...by clicking on the appropriate link.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="111"/> + <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/dialog/Wizard.cpp" line="114"/> + <source>Generate Key</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="121"/> + <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/dialog/Wizard.cpp" line="124"/> + <source>Encrypt & Decrypt Text</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="124"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="136"/> + <source>or</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="126"/> + <source>Sign & Verify Text</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="134"/> + <source>If you want to operate file, you can read </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="136"/> + <source>Encrypt & Sign File</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="138"/> + <source>Sign & Verify File</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::CommonUtils</name> + <message> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="186"/> + <source>GnuPG Context Loading Failed</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="188"/> + <source>Gnupg(gpg) is not installed correctly, please follow <a href='https://www.gpgfrontend.bktus.com/#/faq?id=how-to-deal-with-39env-loading-failed39'>this notes</a> in FAQ to install Gnupg and then open GpgFrontend. <br />Or, you can open GnuPG Controller to set a custom GnuPG which GpgFrontend should use. Then, GpgFrontend will restart. <br /><br />Breif Reason: %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="251"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="382"/> + <source>Success</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="252"/> + <source>Gpg Operation succeed.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="262"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="374"/> + <source>Failure</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="263"/> + <source>Gpg Operation failed. + +Error code: %1 +Source: %2 +Description: %3</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="280"/> + <source>Open Key</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="281"/> + <source>Keyring files</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="288"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="295"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="502"/> + <source>Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="289"/> + <source>Cannot open this file. Please make sure that this is a regular file and it's readable.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="296"/> + <source>The target file is too large for a keyring.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="302"/> + <source>File Open Failed</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="303"/> + <source>Failed to open file: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="355"/> + <source>Processing</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="375"/> + <source>Failed to execute command.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="383"/> + <source>Succeed in executing command.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="385"/> + <source>Warning</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="386"/> + <source>Finished executing command.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="407"/> + <source>Default Keyserver Not Found</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="408"/> + <source>Cannot read default keyserver from your settings, please set a default keyserver first</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="447"/> + <source>Key Not Found</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="450"/> + <source>Timeout</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="453"/> + <source>Key Server Not Found</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="456"/> + <source>Connection Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="467"/> + <source>The key has been updated</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="469"/> + <source>No need to update the key</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::ConclusionPage</name> + <message> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="204"/> + <source>Ready.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="205"/> + <source>Have fun with GpgFrontend!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="208"/> + <source>You are ready to use GpgFrontend now.<br><br></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="210"/> + <source>The Online Document</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="211"/> + <source> will get you started with GpgFrontend. Anytime you encounter problems, please try to find help from the documentation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="220"/> + <source>Open offline help.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="224"/> + <source>Don't show the wizard again.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::ExportKeyPackageDialog</name> + <message> + <location filename="../../../../src/ui/dialog/import_export/ExportKeyPackageDialog.cpp" line="52"/> + <source>Export Key Package</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/ExportKeyPackageDialog.cpp" line="54"/> + <source>Key Package</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/ExportKeyPackageDialog.cpp" line="64"/> + <source>Export Key Package Passphrase</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/ExportKeyPackageDialog.cpp" line="66"/> + <source>Key File</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/ExportKeyPackageDialog.cpp" line="73"/> + <location filename="../../../../src/ui/dialog/import_export/ExportKeyPackageDialog.cpp" line="106"/> + <location filename="../../../../src/ui/dialog/import_export/ExportKeyPackageDialog.cpp" line="139"/> + <source>Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/ExportKeyPackageDialog.cpp" line="74"/> + <source>An error occurred while generating the passphrase file.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/ExportKeyPackageDialog.cpp" line="83"/> + <location filename="../../../../src/ui/dialog/import_export/ExportKeyPackageDialog.cpp" line="90"/> + <source>Forbidden</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/ExportKeyPackageDialog.cpp" line="84"/> + <source>Please select an output path before exporting.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/ExportKeyPackageDialog.cpp" line="91"/> + <source>Please generate a password to protect your key before exporting, it is very important. Don't forget to back up your password in a safe place.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/ExportKeyPackageDialog.cpp" line="107"/> + <source>No key is suitable to export.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/ExportKeyPackageDialog.cpp" line="112"/> + <source>Generating</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/ExportKeyPackageDialog.cpp" line="122"/> + <source>Success</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/ExportKeyPackageDialog.cpp" line="124"/> + <source>The Key Package has been successfully generated and has been protected by encryption algorithms(AES-256-ECB). You can safely transfer your Key Package.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/ExportKeyPackageDialog.cpp" line="129"/> + <source>But the key file cannot be leaked under any circumstances. Please delete the Key Package and key file as soon as possible after completing the transfer operation.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/ExportKeyPackageDialog.cpp" line="140"/> + <source>An error occurred while exporting the key package.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/ExportKeyPackageDialog.cpp" line="149"/> + <source>Key Package Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/ExportKeyPackageDialog.cpp" line="150"/> + <source>Output Path</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/ExportKeyPackageDialog.cpp" line="151"/> + <source>Passphrase</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/ExportKeyPackageDialog.cpp" line="153"/> + <source>Tips: You can use Key Package to safely and conveniently transfer your public and private keys between devices.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/ExportKeyPackageDialog.cpp" line="155"/> + <source>Generate and Save Passphrase</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/ExportKeyPackageDialog.cpp" line="156"/> + <source>Generate Key Package Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/ExportKeyPackageDialog.cpp" line="157"/> + <source>Select Output Path</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/ExportKeyPackageDialog.cpp" line="160"/> + <source>Include secret key (Think twice before acting)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/ExportKeyPackageDialog.cpp" line="162"/> + <source>Exclude keys that do not have a private key</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/ExportKeyPackageDialog.cpp" line="165"/> + <source>Export As Key Package</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::FilePage</name> + <message> + <location filename="../../../../src/ui/widgets/FilePage.cpp" line="63"/> + <source>Show Hidden File</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/FilePage.cpp" line="69"/> + <source>Show System File</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::FileTreeView</name> + <message> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="92"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="105"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="168"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="214"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="236"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="277"/> + <source>Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="93"/> + <source>The path is not exists, unprivileged or unreachable.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="106"/> + <source>The file is unprivileged or unreachable.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="159"/> + <source>Warning</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="160"/> + <source>Are you sure you want to delete it?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="169"/> + <source>Unable to delete the file or folder.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="178"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="191"/> + <source>Make New Directory</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="179"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="192"/> + <source>Directory Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="206"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="228"/> + <source>Create Empty File</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="206"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="228"/> + <source>Filename (you can given extension)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="215"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="237"/> + <source>Unable to create the file.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="269"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="300"/> + <source>Rename</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="269"/> + <source>New Filename</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="278"/> + <source>Unable to rename the file or folder.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="295"/> + <source>Open</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="305"/> + <source>Delete</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="310"/> + <source>Calculate Hash</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="315"/> + <source>Directory</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="320"/> + <source>File</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="325"/> + <source>Compress...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="332"/> + <source>Open with Default System Application</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="337"/> + <source>New</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="395"/> + <source>Calculating</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::FindWidget</name> + <message> + <location filename="../../../../src/ui/widgets/FindWidget.cpp" line="45"/> + <source>Find</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::GeneralTab</name> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsGeneral.cpp" line="43"/> + <source>Cache</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsGeneral.cpp" line="45"/> + <source>Clear gpg password cache when closing GpgFrontend.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsGeneral.cpp" line="47"/> + <source>Automatically restore unsaved Text Editor pages after an application crash.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsGeneral.cpp" line="50"/> + <source>Operation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsGeneral.cpp" line="52"/> + <source>Enable to use longer key expiration date.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsGeneral.cpp" line="54"/> + <source>Import files dropped on the Key List without confirmation.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsGeneral.cpp" line="56"/> + <source>Language</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsGeneral.cpp" line="58"/> + <source>NOTE</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsGeneral.cpp" line="58"/> + <source>: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsGeneral.cpp" line="59"/> + <source>GpgFrontend will restart automatically if you change the language!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsGeneral.cpp" line="61"/> + <source>Data</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsGeneral.cpp" line="63"/> + <location filename="../../../../src/ui/dialog/settings/SettingsGeneral.cpp" line="81"/> + <source>Clear All Log (Total Size: %1)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsGeneral.cpp" line="66"/> + <location filename="../../../../src/ui/dialog/settings/SettingsGeneral.cpp" line="95"/> + <source>Clear All Data Objects (Total Size: %1)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsGeneral.cpp" line="69"/> + <source>Reveal in File Explorer</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsGeneral.cpp" line="88"/> + <source>Confirm</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsGeneral.cpp" line="89"/> + <source>Are you sure you want to clear all data objects? +This will result in loss of all cached form positions, statuses, key servers, etc.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::GnuPGControllerDialog</name> + <message> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="45"/> + <source>General</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="46"/> + <source>Key Database</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="47"/> + <source>Advanced</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="49"/> + <source>Use Binary Mode for File Operations</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="51"/> + <source>Use Pinentry as Password Input Dialog</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="52"/> + <source>Enable GpgME Debug Log</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="53"/> + <source>Use Custom GnuPG</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="54"/> + <source>Select GnuPG Path</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="56"/> + <source>Use Custom GnuPG Key Database Path</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="58"/> + <source>Select Key Database Path</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="60"/> + <source>Restart Gpg Agent on start</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="62"/> + <source>Kill all gnupg daemon at close</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="66"/> + <source>Tips: please select a directory where "gpgconf" is located in.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="68"/> + <source>Tips: notice that modify any of these settings will cause an Application restart.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="100"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="120"/> + <source>Open Directory</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="173"/> + <source>GnuPG Controller</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="364"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="371"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="383"/> + <source>Illegal GnuPG Path</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="365"/> + <source>Target GnuPG Path is not an exists readable directory.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="372"/> + <source>Target GnuPG Path is not an absolute path.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="384"/> + <source>Target GnuPG Path contains no "gpgconf" executable.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="397"/> + <source>Illegal GnuPG Key Database Path</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="398"/> + <source>Target GnuPG Key Database Path is not an exists readable directory.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::GnupgTab</name> + <message> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="46"/> + <source>Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="46"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="92"/> + <source>Description</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="46"/> + <source>Version</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="47"/> + <source>Checksum</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="47"/> + <source>Binary Path</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="49"/> + <source>Components</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="50"/> + <source>Directories</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="51"/> + <source>Options</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="70"/> + <source>Directory Type</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="70"/> + <source>Path</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="91"/> + <source>Component</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="91"/> + <source>Group</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="91"/> + <source>Key</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="92"/> + <source>Default Value</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="93"/> + <source>Value</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::GpgFrontendApplication</name> + <message> + <location filename="../../../../src/ui/GpgFrontendApplication.cpp" line="62"/> + <source>Standard Exception Thrown</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/GpgFrontendApplication.cpp" line="63"/> + <source>Oops, an standard exception was thrown during the running of the program. This is not a serious problem, it may be the negligence of the programmer, please report this problem if you can.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/GpgFrontendApplication.cpp" line="71"/> + <source>Unhandled Exception Thrown</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/GpgFrontendApplication.cpp" line="72"/> + <source>Oops, an unhandled exception was thrown during the running of the program. This is not a serious problem, it may be the negligence of the programmer, please report this problem if you can.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::InfoBoardWidget</name> + <message> + <location filename="../../../../src/ui/widgets/InfoBoardWidget.cpp" line="45"/> + <source>Copy</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/InfoBoardWidget.cpp" line="46"/> + <source>Save File</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/InfoBoardWidget.cpp" line="47"/> + <source>Clear</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/InfoBoardWidget.cpp" line="167"/> + <source>Save Information Board's Content</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/InfoBoardWidget.cpp" line="167"/> + <source>Text (*.txt)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/InfoBoardWidget.cpp" line="176"/> + <source>Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/InfoBoardWidget.cpp" line="177"/> + <source>The file path is not exists, unprivileged or unreachable.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::InfoTab</name> + <message> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="102"/> + <source>GpgFrontend is an easy-to-use, compact, cross-platform, and installation-free GnuPG Frontend.It visualizes most of the common operations of GnuPG.GpgFrontend is licensed under the GPLv3</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="108"/> + <source>Developer:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="109"/> + <source>If you have any questions or suggestions, raise an issue at</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="112"/> + <source>or send a mail to my mailing list at</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="114"/> + <source>Built with Qt</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="115"/> + <source>and</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="116"/> + <source>Built at</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::IntroPage</name> + <message> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="71"/> + <source>Getting Started...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="72"/> + <source>... with GpgFrontend</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="75"/> + <source>Welcome to GpgFrontend for decrypting and signing text or files!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="77"/> + <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/dialog/Wizard.cpp" line="79"/> + <source>To get started, be sure to check out the</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="82"/> + <source>by clicking the link, the page will open in your web browser</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="81"/> + <source>Overview</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="91"/> + <source>If it supports the language currently being used in your system, GpgFrontend will automatically set it.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::KeyDetailsDialog</name> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyDetailsDialog.cpp" line="43"/> + <source>KeyPair</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyDetailsDialog.cpp" line="47"/> + <source>UIDs</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyDetailsDialog.cpp" line="50"/> + <source>Subkeys</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyDetailsDialog.cpp" line="52"/> + <source>Operations</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyDetailsDialog.cpp" line="69"/> + <source>Key Details</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::KeyGenDialog</name> + <message> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="64"/> + <source>Generate Key</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="98"/> + <source>Name must contain at least five characters.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="103"/> + <source>Please give a email address.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="111"/> + <source>Expiration time too long.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="152"/> + <source>Generating</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="161"/> + <source>Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="162"/> + <source>Unknown error occurred</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="198"/> + <source>Key Usage</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="200"/> + <source>Encryption</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="203"/> + <source>Signing</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="206"/> + <source>Certification</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="209"/> + <source>Authentication</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="436"/> + <source>Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="437"/> + <source>Email Address</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="438"/> + <source>Comment</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="439"/> + <source>Expiration Date</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="440"/> + <source>Never Expire</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="441"/> + <source>KeySize (in Bit)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="442"/> + <source>Key Type</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="443"/> + <source>Non Pass Phrase</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="456"/> + <source>Basic Information</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::KeyGenPage</name> + <message> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="164"/> + <source>Create a keypair...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="165"/> + <source>...for decrypting and signing messages</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="167"/> + <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/dialog/Wizard.cpp" line="179"/> + <source>Offline tutorial</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="183"/> + <source>Create New Key</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::KeyImportDetailDialog</name> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyImportDetailDialog.cpp" line="44"/> + <location filename="../../../../src/ui/dialog/import_export/KeyImportDetailDialog.cpp" line="61"/> + <source>Key Import Details</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyImportDetailDialog.cpp" line="45"/> + <source>No keys found to import</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyImportDetailDialog.cpp" line="73"/> + <source>General key info</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyImportDetailDialog.cpp" line="76"/> + <source>Considered</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyImportDetailDialog.cpp" line="82"/> + <source>Public unchanged</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyImportDetailDialog.cpp" line="88"/> + <source>Imported</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyImportDetailDialog.cpp" line="95"/> + <source>Not Imported</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyImportDetailDialog.cpp" line="102"/> + <source>Private Read</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyImportDetailDialog.cpp" line="110"/> + <source>Private Imported</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyImportDetailDialog.cpp" line="117"/> + <source>Private Unchanged</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyImportDetailDialog.cpp" line="123"/> + <source>New Revocations</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyImportDetailDialog.cpp" line="139"/> + <source>Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyImportDetailDialog.cpp" line="139"/> + <source>Email</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyImportDetailDialog.cpp" line="139"/> + <source>Status</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyImportDetailDialog.cpp" line="140"/> + <source>Fingerprint</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyImportDetailDialog.cpp" line="166"/> + <source>Private</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyImportDetailDialog.cpp" line="169"/> + <source>Public</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyImportDetailDialog.cpp" line="172"/> + <source>Unchanged</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyImportDetailDialog.cpp" line="175"/> + <source>New Key</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyImportDetailDialog.cpp" line="178"/> + <source>New Subkey</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyImportDetailDialog.cpp" line="182"/> + <source>New Signature</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyImportDetailDialog.cpp" line="186"/> + <source>New UID</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::KeyList</name> + <message> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="99"/> + <source>Refresh</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="101"/> + <source>Refresh the key list to synchronize changes.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="102"/> + <source>Sync Public Key</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="104"/> + <source>Sync public key with your default keyserver.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="105"/> + <source>Uncheck ALL</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="107"/> + <source>Cancel all checked items in the current tab at once.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="108"/> + <source>Check ALL</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="110"/> + <source>Check all items in the current tab at once</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="111"/> + <source>Search for keys...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="170"/> + <source>Select</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="170"/> + <source>Type</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="170"/> + <source>Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="170"/> + <source>Email Address</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="171"/> + <source>Usage</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="171"/> + <source>Trust</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="171"/> + <source>Key ID</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="171"/> + <source>Finger Print</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="186"/> + <source>Refreshing Key List...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="374"/> + <source>Import Keys</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="376"/> + <source>You've dropped something on the table.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="377"/> + <source>GpgFrontend will now try to import key(s).</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="380"/> + <source>Always import without bothering.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="475"/> + <source>Key List Refreshed.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="510"/> + <source>Syncing Key List...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="518"/> + <source>Sync [%1/%2] %3 %4</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="528"/> + <source>Key List Sync Done.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::KeyMgmt</name> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="57"/> + <source>All</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="61"/> + <source>Only Public Key</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="71"/> + <source>Has Private Key</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="81"/> + <source>No Primary Key</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="90"/> + <source>Revoked</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="98"/> + <source>Expired</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="123"/> + <source>KeyPair Management</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="144"/> + <source>Open</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="146"/> + <source>Open Key File</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="150"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="153"/> + <source>Close</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="156"/> + <source>New Keypair</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="159"/> + <source>Generate KeyPair</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="163"/> + <source>New Subkey</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="167"/> + <source>Generate Subkey For Selected KeyPair</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="171"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="265"/> + <source>File</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="173"/> + <source>Import New Key From File</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="177"/> + <source>Clipboard</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="181"/> + <source>Import New Key From Clipboard</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="192"/> + <source>Keyserver</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="196"/> + <source>Import New Key From Keyserver</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="202"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="536"/> + <source>Key Package</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="205"/> + <source>Import Key(s) From a Key Package</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="209"/> + <source>Export To Clipboard</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="213"/> + <source>Export Checked Key(s) To Clipboard</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="217"/> + <source>Export As Key Package</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="220"/> + <source>Export Checked Key(s) To a Key Package</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="224"/> + <source>Export As OpenSSH</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="227"/> + <source>Export Checked Key As OpenSSH Format to File</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="231"/> + <source>Delete Selected Key(s)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="233"/> + <source>Delete the Selected keys</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="237"/> + <source>Delete Checked Key(s)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="239"/> + <source>Delete the Checked keys</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="244"/> + <source>Show Key Details</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="246"/> + <source>Show Details for this Key</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="250"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="252"/> + <source>Set Owner Trust Level</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="269"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="289"/> + <source>Key</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="270"/> + <source>Generate Key</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="274"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="302"/> + <source>Import Key</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="280"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="310"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="311"/> + <source>Export Key</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="301"/> + <source>Import key</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="344"/> + <source>Deleting Keys</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="345"/> + <source>Are you sure that you want to delete the following keys?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="347"/> + <source>The action can not be undone.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="363"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="412"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="424"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="452"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="491"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="502"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="515"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="545"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="553"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="569"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="577"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="593"/> + <source>Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="363"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="452"/> + <source>Key Not Found.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="374"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="387"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="470"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="476"/> + <source>Forbidden</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="375"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="388"/> + <source>Please check some keys before doing this operation.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="380"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="528"/> + <source>key(s) exported</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="404"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="483"/> + <source>Exporting</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="413"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="425"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="492"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="503"/> + <source>Unknown error occurred</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="446"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="456"/> + <source>Invalid Operation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="447"/> + <source>Please select one KeyPair before doing this operation.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="457"/> + <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> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="471"/> + <source>Please check a key before performing this operation.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="477"/> + <source>This operation accepts just a single key.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="516"/> + <source>This key may not be able to export as OpenSSH format. Please check the key-size of the subkey(s) used to sign.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="523"/> + <source>Export OpenSSH Key To File</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="524"/> + <source>OpenSSH Public Key Files</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="536"/> + <source>Import Key Package</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="546"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="570"/> + <source>Cannot open this file. Please make sure that this is a regular file and it's readable.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="554"/> + <source>The target file is too large for a key package.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="559"/> + <source>Import Key Package Passphrase File</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="560"/> + <source>Key Package Passphrase File</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="578"/> + <source>The target file is too large for a key package passphrase.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="584"/> + <source>Importing</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="594"/> + <source>An error occur in importing key package.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="600"/> + <source>key(s) imported</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::KeyNewUIDDialog</name> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyNewUIDDialog.cpp" line="50"/> + <source>Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyNewUIDDialog.cpp" line="51"/> + <source>Email</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyNewUIDDialog.cpp" line="52"/> + <source>Comment</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyNewUIDDialog.cpp" line="60"/> + <source>Notice: The New UID Created will be set as Primary.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyNewUIDDialog.cpp" line="68"/> + <source>Create New UID</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyNewUIDDialog.cpp" line="85"/> + <source>Name must contain at least five characters.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyNewUIDDialog.cpp" line="89"/> + <source>Please give a email address.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::KeyPairDetailTab</name> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="40"/> + <source>Owner</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="41"/> + <source>Primary Key</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="42"/> + <source>Fingerprint</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="43"/> + <source>Additional UIDs</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="71"/> + <source>Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="72"/> + <source>Email Address</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="73"/> + <source>Comment</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="78"/> + <source>Key ID</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="79"/> + <source>Algorithm</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="80"/> + <source>Algorithm Detail</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="81"/> + <source>Key Size</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="82"/> + <source>Nominal Usage</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="83"/> + <source>Actual Usage</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="84"/> + <source>Owner Trust Level</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="85"/> + <source>Create Date (Local Time)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="86"/> + <source>Expires on (Local Time)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="87"/> + <source>Last Update (Local Time)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="88"/> + <source>Primary Key Existence</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="103"/> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="128"/> + <source>Copy</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="130"/> + <source>copy fingerprint to clipboard</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="176"/> + <source>Exists</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="176"/> + <source>Not Exists</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="209"/> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="221"/> + <source>Certificate</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="211"/> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="224"/> + <source>Encrypt</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="212"/> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="227"/> + <source>Sign</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="213"/> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="230"/> + <source>Auth</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="246"/> + <source>Never Expire</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="257"/> + <source>No Data</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="274"/> + <source>Warning: The primary key has expired.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="279"/> + <source>Warning: The primary key has been revoked.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::KeyPairOperaTab</name> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="53"/> + <source>General Operations</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="59"/> + <source>Export Public Key</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="65"/> + <source>Export Private Key</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="72"/> + <source>Modify Expiration Datetime (Primary Key)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="75"/> + <source>Modify Password</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="93"/> + <source>Key Server Operation (Pubkey)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="101"/> + <source>Revoke Certificate Operation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="107"/> + <source>Modify TOFU Policy</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="114"/> + <source>Set Owner Trust Level</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="138"/> + <source>Upload Key Pair to Key Server</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="146"/> + <source>Sync Key Pair From Key Server</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="161"/> + <source>Export Full Secret Key</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="167"/> + <source>Export Shortest Secret Key</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="177"/> + <source>Generate Revoke Certificate</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="182"/> + <source>Import Revoke Certificate</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="209"/> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="255"/> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="298"/> + <source>Export Key To File</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="210"/> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="256"/> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="299"/> + <source>Key Files</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="215"/> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="261"/> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="304"/> + <source>Export Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="216"/> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="262"/> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="305"/> + <source>Couldn't open %1 for writing</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="224"/> + <source>Exporting short private Key</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="225"/> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="272"/> + <source>You are about to export your</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="226"/> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="273"/> + <source> PRIVATE KEY </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="227"/> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="274"/> + <source>This is NOT your Public Key, so DON'T give it away.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="228"/> + <source>Do you REALLY want to export your PRIVATE KEY in a Minimum Size?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="231"/> + <source>For OpenPGP keys it removes all signatures except for the latest self-signatures.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="271"/> + <source>Exporting private Key</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="275"/> + <source>Do you REALLY want to export your PRIVATE KEY?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="329"/> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="412"/> + <source>Revocation Certificates</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="340"/> + <source>Generate revocation certificate</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="361"/> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="371"/> + <source>Policy Auto</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="361"/> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="373"/> + <source>Policy Good</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="361"/> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="375"/> + <source>Policy Bad</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="362"/> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="377"/> + <source>Policy Ask</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="362"/> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="379"/> + <source>Policy Unknown</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="366"/> + <source>Modify TOFU Policy(Default is Auto)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="367"/> + <source>Policy for the Key Pair:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="384"/> + <source>Not Successful</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="385"/> + <source>Modify TOFU policy not successfully.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="399"/> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="411"/> + <source>Import Key Revocation Certificate</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="400"/> + <source>You are about to import the</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="401"/> + <source>REVOCATION CERTIFICATE</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="402"/> + <source>A successful import will result in the key being irreversibly revoked.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="404"/> + <source>Do you REALLY want to execute this operation?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="420"/> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="429"/> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="442"/> + <source>Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="421"/> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="443"/> + <source>Cannot open this file. Please make sure that this is a regular file and it's readable.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="430"/> + <source>The target file is too large for a key revocation certificate.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::KeyPairSubkeyTab</name> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="43"/> + <source>Subkey List</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="44"/> + <source>Detail of Selected Subkey</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="48"/> + <source>Generate A New Subkey</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="65"/> + <source>Key ID</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="66"/> + <source>Algorithm</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="67"/> + <source>Algorithm Detail</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="69"/> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="159"/> + <source>Key Size</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="70"/> + <source>Usage</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="72"/> + <source>Expires On (Local Time)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="74"/> + <source>Create Date (Local Time)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="75"/> + <source>Existence</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="76"/> + <source>Key in Smart Card</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="78"/> + <source>Fingerprint</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="102"/> + <source>Copy</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="159"/> + <source>Subkey ID</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="159"/> + <source>Algo</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="159"/> + <source>Create Date</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="160"/> + <source>Expire Date</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="203"/> + <source>Never Expire</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="240"/> + <source>Never Expires</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="262"/> + <source>Certificate</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="264"/> + <source>Encrypt</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="265"/> + <source>Sign</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="266"/> + <source>Auth</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="271"/> + <source>Exists</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="272"/> + <source>Not Exists</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="275"/> + <source>Yes</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="275"/> + <source>No</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="304"/> + <source>Edit Expire Date</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::KeyPairUIDTab</name> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="50"/> + <source>New UID</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="51"/> + <source>UID Management</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="70"/> + <source>UIDs</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="75"/> + <source>TOFU</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="87"/> + <source>Signature of Selected UID</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="140"/> + <source>Select</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="140"/> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="163"/> + <source>Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="140"/> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="163"/> + <source>Email</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="140"/> + <source>Comment</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="163"/> + <source>Key ID</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="163"/> + <source>Create Date</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="164"/> + <source>Expired Date</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="240"/> + <source>TOFU %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="288"/> + <source>Never Expires</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="305"/> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="364"/> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="484"/> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="498"/> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="541"/> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="550"/> + <source>Invalid Operation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="306"/> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="365"/> + <source>Please select one or more UIDs before doing this operation.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="328"/> + <source>Sign Selected UID(s)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="331"/> + <source>Delete Selected UID(s)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="351"/> + <source>Successful Operation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="352"/> + <source>Successfully added a new UID.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="354"/> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="389"/> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="423"/> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="519"/> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="571"/> + <source>Operation Failed</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="355"/> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="424"/> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="520"/> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="572"/> + <source>An error occurred during the operation.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="376"/> + <source>Deleting UIDs</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="379"/> + <source>Are you sure that you want to delete the following UIDs?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="381"/> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="417"/> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="514"/> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="566"/> + <source>The action can not be undone.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="390"/> + <source>An error occurred during the delete %1 operation.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="414"/> + <source>Set Primary UID</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="415"/> + <source>Are you sure that you want to set the Primary UID to?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="455"/> + <source>Set As Primary</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="458"/> + <source>Sign UID</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="461"/> + <source>Delete UID</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="485"/> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="499"/> + <source>Please select one UID before doing this operation.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="509"/> + <source>Deleting UID</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="512"/> + <source>Are you sure that you want to delete the following uid?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="530"/> + <source>Delete(Revoke) Key Signature</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="542"/> + <source>Please select one Key Signature before doing this operation.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="551"/> + <source>To delete the signature, you need to have its corresponding public key in the local database.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="561"/> + <source>Deleting Key Signature</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="563"/> + <source>Are you sure that you want to delete the following signature?</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::KeyServerImportDialog</name> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="56"/> + <source>Close</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="59"/> + <source>Import ALL</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="63"/> + <source>Search</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="68"/> + <source>Search String</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="68"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="72"/> + <source>: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="72"/> + <source>Key Server</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="113"/> + <source>Import Keys from Keyserver</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="153"/> + <source>UID</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="153"/> + <source>Creation date</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="153"/> + <source>KeyID</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="153"/> + <source>Tag</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="176"/> + <source>Text is empty.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="223"/> + <source>Not Key Found</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="226"/> + <source>Timeout</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="229"/> + <source>Key Server Not Found</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="232"/> + <source>Connection Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="241"/> + <source>Too many responses from keyserver!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="253"/> + <source>No keys found, input may be kexId, retrying search with 0x.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="263"/> + <source>No keys found containing the search string!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="270"/> + <source>Insufficiently specific search string!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="305"/> + <source>revoked</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="308"/> + <source>disabled</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="353"/> + <source>%1 keys found. Double click a key to import it.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="374"/> + <source>Warning</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="375"/> + <source>Please select one KeyPair before doing this operation.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="422"/> + <source>Key Imported</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="433"/> + <source>Processing ...</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::KeyServerImportTask</name> + <message> + <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="79"/> + <source>Key not found in the Keyserver.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="82"/> + <source>Network connection timeout.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="85"/> + <source>Cannot resolve the address of target key server.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="88"/> + <source>General connection error occurred.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="94"/> + <source>Success</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::KeySetExpireDateDialog</name> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeySetExpireDateDialog.cpp" line="81"/> + <source>Success</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeySetExpireDateDialog.cpp" line="82"/> + <source>The expire date of the key pair has been updated.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeySetExpireDateDialog.cpp" line="91"/> + <source>Failure</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeySetExpireDateDialog.cpp" line="92"/> + <source>Failed to update the expire date of the key pair.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeySetExpireDateDialog.cpp" line="136"/> + <source>Modified Expiration Date (Local Time)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeySetExpireDateDialog.cpp" line="137"/> + <source>Tips: For the sake of security, the key is valid for up to two years. If you are an expert user, please unlock it for a longer time in the settings.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeySetExpireDateDialog.cpp" line="141"/> + <source>No Expiration</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeySetExpireDateDialog.cpp" line="142"/> + <source>Modified Expiration Date</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::KeyUIDSignDialog</name> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyUIDSignDialog.cpp" line="46"/> + <source>Signers</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyUIDSignDialog.cpp" line="80"/> + <source>Expire Date</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyUIDSignDialog.cpp" line="90"/> + <source>Sign For Key's UID(s)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyUIDSignDialog.cpp" line="114"/> + <source>Unsuccessful Operation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyUIDSignDialog.cpp" line="115"/> + <source>Signature operation failed for UID %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyUIDSignDialog.cpp" line="120"/> + <source>Operation Complete</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/keypair_details/KeyUIDSignDialog.cpp" line="121"/> + <source>The signature operation of the UID is complete</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::KeyUploadDialog</name> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="60"/> + <source>Uploading Public Key</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="78"/> + <source>Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="79"/> + <source>Unknown error occurred</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="150"/> + <source>Key Not Found</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="153"/> + <source>Timeout</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="156"/> + <source>Key Server Not Found</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="159"/> + <source>Connection Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="161"/> + <source>Upload Failed</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="165"/> + <source>Upload Success</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="166"/> + <source>Upload Public Key Successfully</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::KeyserverTab</name> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsKeyServer.cpp" line="55"/> + <source>Keyserver List</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsKeyServer.cpp" line="56"/> + <source>Operations</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsKeyServer.cpp" line="58"/> + <source>Default</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsKeyServer.cpp" line="60"/> + <source>Keyserver Address</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsKeyServer.cpp" line="61"/> + <source>Security</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsKeyServer.cpp" line="62"/> + <source>Available</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsKeyServer.cpp" line="64"/> + <source>Add</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsKeyServer.cpp" line="65"/> + <source>Test Listed Keyserver</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsKeyServer.cpp" line="68"/> + <source>Tips: Please Double-click table item to edit it.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsKeyServer.cpp" line="69"/> + <source>Delete Selected</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsKeyServer.cpp" line="71"/> + <source>Delete Selected Key Server</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsKeyServer.cpp" line="72"/> + <location filename="../../../../src/ui/dialog/settings/SettingsKeyServer.cpp" line="73"/> + <source>Set As Default</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsKeyServer.cpp" line="143"/> + <source>Insecure keyserver address</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsKeyServer.cpp" line="144"/> + <source>For security reasons, using HTTP as the communication protocol with the key server is not recommended. It is recommended to use HTTPS.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsKeyServer.cpp" line="152"/> + <source>Warning</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsKeyServer.cpp" line="153"/> + <source>You may not use HTTPS or HTTP as the protocol for communicating with the key server, which may not be wrong. But please check the address you entered again to make sure it is correct. Are you sure that want to add it into the keyserver list?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsKeyServer.cpp" line="200"/> + <source>true</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsKeyServer.cpp" line="201"/> + <source>false</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsKeyServer.cpp" line="206"/> + <source>unknown</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsKeyServer.cpp" line="220"/> + <source>Set TCP Timeout</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsKeyServer.cpp" line="221"/> + <source>timeout(ms): </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsKeyServer.cpp" line="245"/> + <source>Reachable</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsKeyServer.cpp" line="248"/> + <source>Not Reachable</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsKeyServer.cpp" line="260"/> + <source>Test Key Server Connection...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsKeyServer.cpp" line="261"/> + <source>This test only tests the network connectivity of the key server. Passing the test does not mean that the key server is functionally available.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::MainWindow</name> + <message> + <location filename="../../../../src/ui/main_window/MainWindow.cpp" line="154"/> + <location filename="../../../../src/ui/main_window/MainWindow.cpp" line="157"/> + <source>Critical error occur while loading GpgFrontend.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindow.cpp" line="156"/> + <source>Loading Failed</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="74"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="101"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="145"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="164"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="189"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="216"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="260"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="279"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="297"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="311"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="329"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="347"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="361"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="380"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="435"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="454"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="490"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="509"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="537"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="577"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="614"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="640"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="680"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="718"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="744"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="752"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="776"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="813"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="823"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="848"/> + <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="74"/> + <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="121"/> + <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="177"/> + <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="210"/> + <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="246"/> + <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="322"/> + <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="368"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="97"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="121"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="141"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="157"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="170"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="183"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="198"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="248"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="256"/> + <source>Error</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="165"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="280"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="330"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="381"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="455"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="538"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="641"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="745"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="814"/> + <source>Cannot read from file: %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="63"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="178"/> + <source>The target file %1 already exists, do you need to overwrite it?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="66"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="181"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="288"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="338"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="416"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="584"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="687"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="758"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="829"/> + <source>Warning</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="75"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="190"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="298"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="348"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="578"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="681"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="753"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="824"/> + <source>Cannot write to file: %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="84"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="199"/> + <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="54"/> + <source>Symmetric Encryption</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="85"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="200"/> + <source>No Key Selected. Do you want to encrypt with a symmetric cipher using a passphrase?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="91"/> + <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="63"/> + <source>Symmetrically Encrypting</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="102"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="146"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="217"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="261"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="312"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="362"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="436"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="510"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="615"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="719"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="777"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="849"/> + <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="75"/> + <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="122"/> + <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="178"/> + <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="211"/> + <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="247"/> + <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="323"/> + <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="369"/> + <source>Unknown error occurred</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="126"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="241"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="559"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="662"/> + <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="279"/> + <source>Invalid KeyPair</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="127"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="242"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="560"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="663"/> + <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="280"/> + <source>The selected keypair cannot be used for encryption.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="128"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="243"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="561"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="664"/> + <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="103"/> + <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="159"/> + <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="281"/> + <source>For example the Following Key:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="135"/> + <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="111"/> + <source>Encrypting</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="206"/> + <source>Archiving & Symmetrically Encrypting</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="250"/> + <source>Archiving & Encrypting</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="289"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="339"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="585"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="688"/> + <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="303"/> + <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="202"/> + <source>Decrypting</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="353"/> + <source>Decrypting & Extrating</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="390"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="548"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="651"/> + <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="147"/> + <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="267"/> + <source>No Key Checked</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="391"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="549"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="652"/> + <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="148"/> + <source>Please check the key in the key toolbox on the right.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="398"/> + <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="100"/> + <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="156"/> + <source>Invalid Operation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="399"/> + <source>The selected key contains a key that does not actually have a sign usage.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="401"/> + <source>for example the Following Key:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="417"/> + <source>The signature file "%1" exists, do you need to overwrite it?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="426"/> + <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="168"/> + <source>Signing</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="475"/> + <source>File to be Verified</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="476"/> + <source>Please provide An ABSOLUTE Path +If Data And Signature is COMBINED within a single file, KEEP THIS EMPTY: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="491"/> + <source>Please select the appropriate origin file or signature file. Ensure that both are in this directory.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="500"/> + <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="237"/> + <source>Verifying</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="603"/> + <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="310"/> + <source>Encrypting and Signing</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="706"/> + <source>Archiving & Encrypting & Signing</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="759"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="830"/> + <source>The output file %1 already exists, do you need to overwrite it?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="768"/> + <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="358"/> + <source>Decrypting and Verifying</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="839"/> + <source>Decrypting & Verifying & Extracting</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="55"/> + <source>No Key Checked. Do you want to encrypt with a symmetric cipher using a passphrase?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="101"/> + <source>The selected key contains a key that does not actually have a encrypt usage.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="157"/> + <source>The selected key contains a key that does not actually have a signature usage.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="268"/> + <source>Please check some key in the key toolbox on the right.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="97"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="121"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="141"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="157"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="170"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="183"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="198"/> + <source>Key Not Found.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="102"/> + <source>Localize</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="105"/> + <source>UTC</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="126"/> + <source>Local Time</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="249"/> + <source>Cannot open this file. Please make sure that this is a regular file and it's readable.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="257"/> + <source>Cannot open this file. The file is TOO LARGE (>1MB) for GpgFrontend Text Editor.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="298"/> + <source>GpgFrontend Upgradeable (New Version: %1).</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="302"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="448"/> + <source>Update</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="308"/> + <source>Withdrawn Version</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="310"/> + <source>This version(%1) may have been withdrawn by the developer due to serious problems. Please stop using this version immediately and use the latest stable version.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="315"/> + <source>You can download the latest stable version(%1) on Github Releases Page.<br/></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="320"/> + <source>This maybe a BETA Version (Latest Stable Version: %1).</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="45"/> + <source>New</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="51"/> + <source>Open a new file</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="54"/> + <source>Open...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="57"/> + <source>Open an existing file</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="60"/> + <source>File Browser</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="63"/> + <source>Open a file browser</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="67"/> + <source>Save File</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="70"/> + <source>Save the current File</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="73"/> + <source>Save As</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="76"/> + <source>Save the current File as...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="79"/> + <source>Print</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="82"/> + <source>Print Document</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="85"/> + <source>Close</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="88"/> + <source>Close file</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="91"/> + <source>Quit</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="94"/> + <source>Quit Program</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="99"/> + <source>Undo</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="102"/> + <source>Undo Last Edit Action</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="105"/> + <source>Redo</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="108"/> + <source>Redo Last Edit Action</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="111"/> + <source>Zoom In</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="116"/> + <source>Zoom Out</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="121"/> + <source>Paste</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="124"/> + <source>Paste Text From Clipboard</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="127"/> + <source>Cut</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="131"/> + <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="135"/> + <source>Copy</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="139"/> + <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="143"/> + <source>Quote</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="145"/> + <source>Quote whole text</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="148"/> + <source>Select All</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="151"/> + <source>Select the whole text</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="155"/> + <source>Find</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="158"/> + <source>Find a word</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="161"/> + <source>Remove spacing</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="166"/> + <source>Remove double linebreaks, e.g. in pasted text from Web Mailer</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="170"/> + <source>Settings</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="171"/> + <source>Open settings dialog</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="179"/> + <source>Encrypt</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="183"/> + <source>Encrypt Message</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="201"/> + <source>Encrypt Sign</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="206"/> + <source>Encrypt and Sign Message</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="224"/> + <source>Decrypt</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="227"/> + <source>Decrypt Message</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="249"/> + <source>Decrypt Verify</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="253"/> + <source>Decrypt and Verify Message</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="275"/> + <source>Sign</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="278"/> + <source>Sign Message</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="290"/> + <source>Verify</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="293"/> + <source>Verify Message</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="308"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="554"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="636"/> + <source>File</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="310"/> + <source>Import New Key From File</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="314"/> + <source>Clipboard</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="318"/> + <source>Import New Key From Clipboard</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="329"/> + <source>Keyserver</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="333"/> + <source>Import New Key From Keyserver</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="339"/> + <source>Editor</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="341"/> + <source>Import New Key From Editor</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="345"/> + <source>Manage Keys</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="347"/> + <source>Open Key Management</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="351"/> + <source>Clear Password Cache</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="354"/> + <source>Clear Password Cache of GnuPG</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="359"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="376"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="397"/> + <source>Successful Operation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="360"/> + <source>Clear password cache successfully</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="362"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="380"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="401"/> + <source>Failed Operation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="363"/> + <source>Failed to clear password cache of GnuPG</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="368"/> + <source>Reload All Components</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="370"/> + <source>Reload All GnuPG's Components</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="377"/> + <source>Reload all the GnuPG's components successfully</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="381"/> + <source>Failed to reload all or one of the GnuPG's component(s)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="386"/> + <source>Restart All Components</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="388"/> + <source>Restart All GnuPG's Components</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="398"/> + <source>Restart all the GnuPG's components successfully</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="402"/> + <source>Failed to restart all or one of the GnuPG's component(s)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="407"/> + <source>Open GnuPG Controller</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="409"/> + <source>Open GnuPG Controller Dialog</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="413"/> + <source>Open Module Controller</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="415"/> + <source>Open Module Controller Dialog</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="422"/> + <source>About</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="424"/> + <source>Show the application's About box</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="430"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="434"/> + <source>GnuPG</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="432"/> + <source>Information about Gnupg</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="437"/> + <source>Translate</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="439"/> + <source>Information about translation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="441"/> + <source>Translators</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="444"/> + <source>Check for Updates</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="446"/> + <source>Check for updates</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="451"/> + <source>Open Wizard</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="453"/> + <source>Open the wizard</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="458"/> + <source>Append Public Key to Editor</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="460"/> + <source>Append selected Keypair's Public Key to Editor</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="465"/> + <source>Append Create DateTime to Editor</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="467"/> + <source>Append selected Key's creation date and time to Editor</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="472"/> + <source>Append Expire DateTime to Editor</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="474"/> + <source>Append selected Key's expiration date and time to Editor</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="479"/> + <source>Append Fingerprint to Editor</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="481"/> + <source>Append selected Key's Fingerprint to Editor</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="485"/> + <source>Copy Email</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="487"/> + <source>Copy selected Keypair's to clipboard</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="492"/> + <source>Copy Default UID</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="494"/> + <source>Copy selected Keypair's default UID to clipboard</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="498"/> + <source>Copy Key ID</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="500"/> + <source>Copy selected Keypair's ID to clipboard</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="504"/> + <source>Show Key Details</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="505"/> + <source>Show Details for this Key</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="509"/> + <source>Add To Favourite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="510"/> + <source>Add this key to Favourite Table</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="516"/> + <source>Remove From Favourite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="518"/> + <source>Remove this key from Favourite Table</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="524"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="525"/> + <source>Set Owner Trust Level</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="544"/> + <source>Remove PGP Header</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="548"/> + <source>Add PGP Header</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="567"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="658"/> + <source>Edit</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="585"/> + <source>Crypt</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="595"/> + <source>Keys</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="596"/> + <source>Import Key</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="604"/> + <source>Advance</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="612"/> + <source>Steganography</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="616"/> + <source>View</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="618"/> + <source>Help</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="643"/> + <source>Operations</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="653"/> + <source>Key</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="666"/> + <source>Special Edit</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="678"/> + <source>Import key from...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="679"/> + <source>Import key</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="695"/> + <source>Ready</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="702"/> + <source>Key ToolBox</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="710"/> + <source>Default</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="718"/> + <source>Favourite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="726"/> + <source>Only Public Key</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="736"/> + <source>Has Private Key</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="750"/> + <source>Information Board</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::ModuleControllerDialog</name> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="49"/> + <source>Module Informations</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="50"/> + <source>Actions</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="51"/> + <source>Show Mods Directory</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="53"/> + <source>Registered Modules</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="54"/> + <source>Global Register Table</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="55"/> + <source>Debugger</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="58"/> + <source>Tips: Module name front with "*" stands for integrated module.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="60"/> + <source>Module Controller</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="84"/> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="184"/> + <source>Enable Auto Activate</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="133"/> + <source>BASIC INFO</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="135"/> + <source>ID</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="137"/> + <source>Version</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="139"/> + <source>SDK Version</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="141"/> + <source>Qt ENV Version</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="143"/> + <source>Hash</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="144"/> + <source>Path</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="148"/> + <source>Auto Activate</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="149"/> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="151"/> + <source>True</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="149"/> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="151"/> + <source>False</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="150"/> + <source>Active</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="155"/> + <source>METADATA</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="171"/> + <source>Listening Event</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="180"/> + <source>Deactivate</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="181"/> + <source>Activate</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="183"/> + <source>Disable Auto Activate</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::NetworkTab</name> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="72"/> + <source>Proxy</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="73"/> + <source>Network Ability</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="74"/> + <source>Operations</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="76"/> + <source>Enable Proxy</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="77"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="80"/> + <source>Port</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="79"/> + <source>Host Address</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="81"/> + <source>Proxy Type</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="82"/> + <source>Username</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="83"/> + <source>Password</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="86"/> + <source>Apply Proxy Settings and Check Proxy Connection</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="89"/> + <source>Forbid all GnuPG network connection.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="93"/> + <source>Prohibit checking for version updates when the program starts.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="96"/> + <source>Automatically import a missing key for signature verification.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="98"/> + <source>Tips: These Option Changes take effect only after the application restart.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="173"/> + <source>Test Server Url Accessibility</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="174"/> + <source>Server Url</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="184"/> + <source>Success</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="185"/> + <source>Successfully connect to the target server through the proxy server.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="189"/> + <source>Failed</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="190"/> + <source>Unable to connect to the target server through the proxy server. Proxy settings may be invalid.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="200"/> + <source>Test Proxy Server Connection...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="201"/> + <source>Is using your proxy settings to access the url. Note that this test operation will apply your proxy settings to the entire software.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::PlainTextEditorPage</name> + <message> + <location filename="../../../../src/ui/widgets/PlainTextEditorPage.cpp" line="54"/> + <source>0 character</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/PlainTextEditorPage.cpp" line="63"/> + <location filename="../../../../src/ui/widgets/PlainTextEditorPage.cpp" line="196"/> + <source>%1 character(s)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/PlainTextEditorPage.cpp" line="72"/> + <source>Loading...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/PlainTextEditorPage.cpp" line="86"/> + <source>lf</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/PlainTextEditorPage.cpp" line="87"/> + <source>UTF-8</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::QuitDialog</name> + <message> + <location filename="../../../../src/ui/dialog/QuitDialog.cpp" line="35"/> + <source>Unsaved Files</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/QuitDialog.cpp" line="83"/> + <source>%1 files contain unsaved information.<br/>Save the changes before closing?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/QuitDialog.cpp" line="97"/> + <source>Check the files you want to save:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/QuitDialog.cpp" line="99"/> + <source>Note</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/QuitDialog.cpp" line="100"/> + <source>If you don't save these files, all changes are lost.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::RaisePinentry</name> + <message> + <location filename="../../../../src/ui/function/RaisePinentry.cpp" line="67"/> + <source>Repeat Passphrase:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/function/RaisePinentry.cpp" line="68"/> + <source>Show passphrase</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/function/RaisePinentry.cpp" line="68"/> + <source>Hide passphrase</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/function/RaisePinentry.cpp" line="71"/> + <source>Given Passphrase was wrong. Please retry.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/function/RaisePinentry.cpp" line="74"/> + <source>Passphrase:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/function/RaisePinentry.cpp" line="84"/> + <source>Passphrases do not match</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/function/RaisePinentry.cpp" line="87"/> + <source>Caps Lock is on</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/function/RaisePinentry.cpp" line="91"/> + <source>Bundled Pinentry</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/function/RaisePinentry.cpp" line="95"/> + <source>Confirm</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/function/RaisePinentry.cpp" line="96"/> + <source>Cancel</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::SetOwnerTrustLevel</name> + <message> + <location filename="../../../../src/ui/function/SetOwnerTrustLevel.cpp" line="49"/> + <source>Unknown</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/function/SetOwnerTrustLevel.cpp" line="49"/> + <location filename="../../../../src/ui/function/SetOwnerTrustLevel.cpp" line="67"/> + <source>Undefined</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/function/SetOwnerTrustLevel.cpp" line="49"/> + <location filename="../../../../src/ui/function/SetOwnerTrustLevel.cpp" line="65"/> + <source>Never</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/function/SetOwnerTrustLevel.cpp" line="49"/> + <location filename="../../../../src/ui/function/SetOwnerTrustLevel.cpp" line="63"/> + <source>Marginal</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/function/SetOwnerTrustLevel.cpp" line="50"/> + <location filename="../../../../src/ui/function/SetOwnerTrustLevel.cpp" line="61"/> + <source>Full</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/function/SetOwnerTrustLevel.cpp" line="50"/> + <location filename="../../../../src/ui/function/SetOwnerTrustLevel.cpp" line="59"/> + <source>Ultimate</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/function/SetOwnerTrustLevel.cpp" line="52"/> + <source>Modify Owner Trust Level</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/function/SetOwnerTrustLevel.cpp" line="53"/> + <source>Trust for the Key Pair:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/function/SetOwnerTrustLevel.cpp" line="73"/> + <source>Warning</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/function/SetOwnerTrustLevel.cpp" line="75"/> + <source>Owner Trust Level cannot set to Unknown level, automately changing it into Undefined level.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/function/SetOwnerTrustLevel.cpp" line="83"/> + <source>Failed</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/function/SetOwnerTrustLevel.cpp" line="84"/> + <source>Modify Owner Trust Level failed.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::SettingsDialog</name> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="53"/> + <source>General</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="54"/> + <source>Appearance</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="55"/> + <source>Key Server</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="56"/> + <source>Network</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="67"/> + <source>Settings</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="71"/> + <source>Preference</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="124"/> + <source>System Default</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::SignersPicker</name> + <message> + <location filename="../../../../src/ui/dialog/SignersPicker.cpp" line="38"/> + <source>Confirm</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/SignersPicker.cpp" line="39"/> + <source>Cancel</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/SignersPicker.cpp" line="49"/> + <source>Signers</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/SignersPicker.cpp" line="57"/> + <source>Select Signer(s)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/SignersPicker.cpp" line="61"/> + <source>Please select one or more private keys you use for signing.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/SignersPicker.cpp" line="63"/> + <source>If no key is selected, the default key will be used for signing.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/SignersPicker.cpp" line="73"/> + <source>Signers Picker</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::SubkeyGenerateDialog</name> + <message> + <location filename="../../../../src/ui/dialog/key_generate/SubkeyGenerateDialog.cpp" line="67"/> + <source>Tipps: if the key pair has a passphrase, the subkey's passphrase must be equal to it.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/key_generate/SubkeyGenerateDialog.cpp" line="80"/> + <source>Generate New Subkey</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/key_generate/SubkeyGenerateDialog.cpp" line="93"/> + <source>Key Usage</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/key_generate/SubkeyGenerateDialog.cpp" line="95"/> + <source>Encryption</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/key_generate/SubkeyGenerateDialog.cpp" line="98"/> + <source>Signing</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/key_generate/SubkeyGenerateDialog.cpp" line="101"/> + <source>Certification</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/key_generate/SubkeyGenerateDialog.cpp" line="104"/> + <source>Authentication</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/key_generate/SubkeyGenerateDialog.cpp" line="148"/> + <source>Key Type</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/key_generate/SubkeyGenerateDialog.cpp" line="149"/> + <source>KeySize (in Bit)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/key_generate/SubkeyGenerateDialog.cpp" line="150"/> + <source>Expiration Date</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/key_generate/SubkeyGenerateDialog.cpp" line="151"/> + <source>Never Expire</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/key_generate/SubkeyGenerateDialog.cpp" line="152"/> + <source>Non Pass Phrase</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/key_generate/SubkeyGenerateDialog.cpp" line="162"/> + <source>Basic Information</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/key_generate/SubkeyGenerateDialog.cpp" line="275"/> + <source>Expiration time no more than 2 years.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/key_generate/SubkeyGenerateDialog.cpp" line="290"/> + <source>Generating</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/key_generate/SubkeyGenerateDialog.cpp" line="300"/> + <source>Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/key_generate/SubkeyGenerateDialog.cpp" line="301"/> + <source>Unknown error occurred</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::TOFUInfoPage</name> + <message> + <location filename="../../../../src/ui/widgets/TOFUInfoPage.cpp" line="36"/> + <source>Key ID</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/TOFUInfoPage.cpp" line="37"/> + <source>Algorithm</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/TOFUInfoPage.cpp" line="38"/> + <source>Key Size</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/TOFUInfoPage.cpp" line="39"/> + <source>Nominal Usage</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/TOFUInfoPage.cpp" line="40"/> + <source>Actual Usage</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/TOFUInfoPage.cpp" line="41"/> + <source>Expires on</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/TOFUInfoPage.cpp" line="42"/> + <source>Last Update</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/TOFUInfoPage.cpp" line="43"/> + <source>Secret Key Existence</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::TextEdit</name> + <message> + <location filename="../../../../src/ui/widgets/TextEdit.cpp" line="62"/> + <location filename="../../../../src/ui/widgets/TextEdit.cpp" line="76"/> + <source>untitled</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/TextEdit.cpp" line="108"/> + <source>Open Directory</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/TextEdit.cpp" line="143"/> + <location filename="../../../../src/ui/widgets/TextEdit.cpp" line="203"/> + <location filename="../../../../src/ui/widgets/TextEdit.cpp" line="422"/> + <location filename="../../../../src/ui/widgets/TextEdit.cpp" line="459"/> + <source>Warning</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/TextEdit.cpp" line="144"/> + <location filename="../../../../src/ui/widgets/TextEdit.cpp" line="204"/> + <location filename="../../../../src/ui/widgets/TextEdit.cpp" line="423"/> + <source>Cannot read file %1: +%2.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/TextEdit.cpp" line="152"/> + <source>Open file</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/TextEdit.cpp" line="221"/> + <source>Save file</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/TextEdit.cpp" line="282"/> + <source>Unsaved document</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/TextEdit.cpp" line="283"/> + <source>The document "%1" has been modified. Do you want to save your changes?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/TextEdit.cpp" line="286"/> + <source>Note:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/TextEdit.cpp" line="287"/> + <source>If you don't save these files, all changes are lost.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/TextEdit.cpp" line="459"/> + <source>No document to print</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::TranslatorsTab</name> + <message> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="145"/> + <source>If you think there are any problems with the translation, why not participate in the translation work? If you want to participate, please read the document or contact me via email.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::UpdateTab</name> + <message> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="163"/> + <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/dialog/help/AboutDialog.cpp" line="166"/> + <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/dialog/help/AboutDialog.cpp" line="172"/> + <source>Current Version</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="173"/> + <source>: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="248"/> + <source>Latest Version From Github</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="254"/> + <source>The current version is less than the latest version on github.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="256"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="267"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="279"/> + <source>Please click</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="259"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="270"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="282"/> + <source>Here</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="259"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="270"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="282"/> + <source>to download the latest stable version.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="265"/> + <source>This version has serious problems and has been withdrawn. Please stop using it immediately.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="276"/> + <source>This version has not been released yet, it may be a beta version. If you are not a tester and care about version stability, please do not use this version.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::VerifyDetailsDialog</name> + <message> + <location filename="../../../../src/ui/dialog/details/VerifyDetailsDialog.cpp" line="39"/> + <source>Signatures Details</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/details/VerifyDetailsDialog.cpp" line="62"/> + <source>No valid input found</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/details/VerifyDetailsDialog.cpp" line="72"/> + <source>Error Validating signature</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/details/VerifyDetailsDialog.cpp" line="75"/> + <source>File was signed on %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/details/VerifyDetailsDialog.cpp" line="76"/> + <location filename="../../../../src/ui/dialog/details/VerifyDetailsDialog.cpp" line="80"/> + <source>It Contains</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/details/VerifyDetailsDialog.cpp" line="79"/> + <source>Signed on %1</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::VerifyKeyDetailBox</name> + <message> + <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="54"/> + <source>Import from keyserver</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="59"/> + <source>Key not present with id 0x</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="63"/> + <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="88"/> + <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="103"/> + <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="118"/> + <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="119"/> + <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="134"/> + <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="149"/> + <source>Status</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="63"/> + <source>:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="65"/> + <source>Key not present in key list</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="73"/> + <source>A Signature</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="78"/> + <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="93"/> + <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="108"/> + <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="124"/> + <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="139"/> + <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="154"/> + <source>Key Information is NOT Available</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="80"/> + <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="95"/> + <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="110"/> + <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="126"/> + <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="141"/> + <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="156"/> + <source>Fingerprint</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="88"/> + <source>Cert Revoked</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="103"/> + <source>Signature Expired</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="118"/> + <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="119"/> + <source>Key Expired</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="134"/> + <source>General Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="149"/> + <source>Unknown Error </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="176"/> + <source>Signer Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="177"/> + <source>Signer Email</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="178"/> + <source>Key's Fingerprint</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="179"/> + <source>Valid</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="180"/> + <source>Flags</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="187"/> + <source>Fully Valid</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="189"/> + <source>NOT Fully Valid</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="196"/> + <source>Good</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="199"/> + <source>Bad</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="202"/> + <source>Expired</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="205"/> + <source>Missing Key</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="208"/> + <source>Revoked Key</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="211"/> + <source>Expired Key</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="214"/> + <source>Missing CRL</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::UI::Wizard</name> + <message> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="43"/> + <source>First Start Wizard</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgKey</name> + <message> + <location filename="../../../../src/core/model/GpgKey.cpp" line="91"/> + <source>Unknown</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/model/GpgKey.cpp" line="93"/> + <source>Undefined</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/model/GpgKey.cpp" line="95"/> + <source>Never</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/model/GpgKey.cpp" line="97"/> + <source>Marginal</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/model/GpgKey.cpp" line="99"/> + <source>Full</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/model/GpgKey.cpp" line="101"/> + <source>Ultimate</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QCoreApplication</name> + <message> + <location filename="../../../../src/cmd.cpp" line="47"/> + <source>This is free software; see the source for copying conditions.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/cmd.cpp" line="52"/> + <source>Build DateTime: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/cmd.cpp" line="54"/> + <source>Build Version: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/cmd.cpp" line="56"/> + <source>Source Code Version: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/GpgCoreInit.cpp" line="303"/> + <source>GpgME initiation failed</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/GpgCoreInit.cpp" line="409"/> + <source>GpgME Context initiation failed</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/GpgCoreInit.cpp" line="418"/> + <source>Gpg Key Detabase initiation failed</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/utils/IOUtils.cpp" line="89"/> + <source>File Hash Information</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/utils/IOUtils.cpp" line="90"/> + <location filename="../../../../src/core/utils/IOUtils.cpp" line="125"/> + <source>Filename</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/utils/IOUtils.cpp" line="90"/> + <location filename="../../../../src/core/utils/IOUtils.cpp" line="95"/> + <location filename="../../../../src/core/utils/IOUtils.cpp" line="99"/> + <location filename="../../../../src/core/utils/IOUtils.cpp" line="104"/> + <location filename="../../../../src/core/utils/IOUtils.cpp" line="110"/> + <location filename="../../../../src/core/utils/IOUtils.cpp" line="116"/> + <location filename="../../../../src/core/utils/IOUtils.cpp" line="125"/> + <source>: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/utils/IOUtils.cpp" line="94"/> + <location filename="../../../../src/core/utils/IOUtils.cpp" line="98"/> + <source>File Size</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/utils/IOUtils.cpp" line="123"/> + <source>Error: cannot read target file</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/utils/IOUtils.cpp" line="156"/> + <source>target path doesn't exists</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/utils/IOUtils.cpp" line="162"/> + <source>do NOT have permission to write path</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/utils/IOUtils.cpp" line="168"/> + <source>do NOT have permission to read/write file</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/utils/IOUtils.cpp" line="171"/> + <source>Success</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/GpgFrontendUIInit.cpp" line="56"/> + <source>Loading Gnupg Info...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/GpgFrontendUIInit.cpp" line="57"/> + <source>If this process is too slow, please set the key server address appropriately in the gnupg configuration file (depending on the network situation in your country or region).</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="64"/> + <source>Show Verify Details</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="72"/> + <source>Public key not found locally</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="73"/> + <source>There is no target public key content in local for GpgFrontend to gather enough information about this Signature. Do you want to import the public key from Keyserver now?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="486"/> + <source>Sync All Public Key</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="487"/> + <source>You have not checked any public keys that you want to synchronize, do you want to synchronize all local public keys from the key server?</source> + <translation type="unfinished"></translation> + </message> +</context> +</TS> diff --git a/resource/lfs/locale/ts/GpgFrontend.fr_FR.ts b/resource/lfs/locale/ts/GpgFrontend.fr_FR.ts index 8ae8f7b7..38d917e7 100644 --- a/resource/lfs/locale/ts/GpgFrontend.fr_FR.ts +++ b/resource/lfs/locale/ts/GpgFrontend.fr_FR.ts @@ -217,12 +217,12 @@ </message> <message> <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="105"/> - <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="109"/> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="107"/> <source>Sign Date</source> <translation type="unfinished">Date de la signature</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="130"/> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="128"/> <source>Signer</source> <translation type="unfinished">Signataire</translation> </message> @@ -246,23 +246,23 @@ <translation type="unfinished">UTC</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="109"/> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="107"/> <source>Localized</source> <translation type="unfinished">Localisé</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="124"/> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="122"/> <source>Invalid Signers</source> <translation type="unfinished">Signataires non valides</translation> </message> <message> <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="98"/> - <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="132"/> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="130"/> <source>Fingerprint</source> <translation type="unfinished">Empreinte digitale</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="134"/> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="132"/> <source>Reason</source> <translation type="unfinished">Raison</translation> </message> @@ -286,126 +286,126 @@ </message> <message> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="57"/> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="61"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="60"/> <source>Signed On</source> <translation type="unfinished">Signé le</translation> </message> <message> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="57"/> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="192"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="191"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="237"/> <source>UTC</source> <translation type="unfinished">UTC</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="61"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="60"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="194"/> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="239"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="240"/> <source>Localized</source> <translation type="unfinished">Localisé</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="64"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="63"/> <source>Signatures List</source> <translation type="unfinished">Liste des signatures</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="71"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="70"/> <source>Signature [%1]:</source> <translation type="unfinished">Signature [%1] :</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="72"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="71"/> <source>Status</source> <translation type="unfinished">Statut</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="75"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="74"/> <source>A Bad Signature.</source> <translation type="unfinished">Une mauvaise signature.</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="77"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="76"/> <source>This Signature is invalid.</source> <translation type="unfinished">Cette signature est invalide.</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="82"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="81"/> <source>A</source> <translation type="unfinished">UNE</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="84"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="83"/> <source>Good</source> <translation type="unfinished">Bon</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="87"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="86"/> <source>Bad</source> <translation type="unfinished">Mauvais</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="90"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="89"/> <source>Expired</source> <translation type="unfinished">Expiré</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="93"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="92"/> <source>Missing Key's</source> <translation type="unfinished">Touches manquantes</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="96"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="95"/> <source>Revoked Key's</source> <translation type="unfinished">Clés révoquées</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="99"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="98"/> <source>Expired Key's</source> <translation type="unfinished">Clés expirées</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="102"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="101"/> <source>Missing CRL's</source> <translation type="unfinished">CRL manquantes</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="106"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="105"/> <source>Signature Fully Valid.</source> <translation type="unfinished">Signature entièrement valide.</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="108"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="107"/> <source>Signature Not Fully Valid.</source> <translation type="unfinished">Signature pas entièrement valide.</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="109"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="108"/> <source>Tips</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="110"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="109"/> <source>Adjust Trust Level to make it Fully Vaild</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="184"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="183"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="228"/> <source>Fingerprint</source> <translation type="unfinished">Empreinte digitale</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="186"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="185"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="229"/> <source><unknown></source> <translation type="unfinished"><unknown></translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="192"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="191"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="194"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="237"/> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="239"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="240"/> <source>Sign Date</source> <translation type="unfinished">Date de la signature</translation> </message> @@ -431,47 +431,47 @@ <translation type="unfinished">Date de création de la clé</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="117"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="116"/> <source>Key is NOT present with ID 0x</source> <translation type="unfinished">La clé n'est PAS présente avec l'ID 0x</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="126"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="125"/> <source>A signature could NOT be verified due to a Missing Key</source> <translation type="unfinished">Une signature n'a PAS pu être vérifiée en raison d'une clé manquante</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="132"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="131"/> <source>A signature is valid but the key used to verify the signature has been revoked</source> <translation type="unfinished">Une signature est valide mais la clé utilisée pour vérifier la signature a été révoquée</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="141"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="140"/> <source>A signature is valid but expired</source> <translation type="unfinished">Une signature est valide mais a expiré</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="148"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="147"/> <source>A signature is valid but the key used to verify the signature has expired.</source> <translation type="unfinished">Une signature est valide mais la clé utilisée pour vérifier la signature a expiré.</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="156"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="155"/> <source>There was some other error which prevented the signature verification.</source> <translation type="unfinished">Il y avait une autre erreur qui a empêché la vérification de la signature.</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="164"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="163"/> <source>Error for key with fingerprint</source> <translation type="unfinished">Erreur pour la clé avec empreinte digitale</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="175"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="174"/> <source>Could not find information that can be used for verification.</source> <translation type="unfinished">Impossible de trouver des informations pouvant être utilisées pour la vérification.</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="184"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="183"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="205"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="228"/> <source>Signed By</source> @@ -482,13 +482,13 @@ <translation type="obsolete">Inconnu</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="189"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="188"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="234"/> <source>Public Key Algo</source> <translation type="unfinished">Algo. de clé publique</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="191"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="190"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="236"/> <source>Hash Algo</source> <translation type="unfinished">Algo. de hachage</translation> @@ -499,27 +499,72 @@ </message> </context> <context> + <name>GpgFrontend::Module::GlobalRegisterTable</name> + <message> + <location filename="../../../../src/core/module/GlobalRegisterTable.cpp" line="47"/> + <source>NODE</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/module/GlobalRegisterTable.cpp" line="82"/> + <source>LEAF</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::Module::GlobalRegisterTableTreeModel::Impl</name> + <message> + <location filename="../../../../src/core/module/GlobalRegisterTable.cpp" line="193"/> + <source><EMPTY></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/module/GlobalRegisterTable.cpp" line="232"/> + <source><UNSUPPORTED></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/module/GlobalRegisterTable.cpp" line="267"/> + <source>Key</source> + <translation type="unfinished">Clé</translation> + </message> + <message> + <location filename="../../../../src/core/module/GlobalRegisterTable.cpp" line="269"/> + <source>Type</source> + <translation type="unfinished">Taper</translation> + </message> + <message> + <location filename="../../../../src/core/module/GlobalRegisterTable.cpp" line="271"/> + <source>Value Type</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/module/GlobalRegisterTable.cpp" line="273"/> + <source>Value</source> + <translation type="unfinished">Valeur</translation> + </message> +</context> +<context> <name>GpgFrontend::Module::Integrated::GnuPGInfoGatheringModule::GnuPGInfoGatheringModule</name> <message> - <location filename="../../../../src/module/integrated/gnupg_info_gathering_module/GnuPGInfoGatheringModule.cpp" line="123"/> <source>Embedded In</source> - <translation type="unfinished">Intégré dans</translation> + <translation type="obsolete">Intégré dans</translation> </message> </context> <context> <name>GpgFrontend::UI::AboutDialog</name> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="44"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="41"/> <source>About</source> <translation type="unfinished">A propos</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="52"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="47"/> <source>About GpgFrontend</source> <translation type="unfinished">À propos de GpgFrontend</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="53"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="51"/> <source>GnuPG</source> <translation type="unfinished">GnuPGGenericName</translation> </message> @@ -529,7 +574,7 @@ <translation type="unfinished">Traducteurs</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="55"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="58"/> <source>Update</source> <translation type="unfinished">Mettre à jour</translation> </message> @@ -537,131 +582,156 @@ <context> <name>GpgFrontend::UI::AppearanceTab</name> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="42"/> <source>Icon Size</source> - <translation type="unfinished">Taille de l'icône</translation> + <translation type="obsolete">Taille de l'icône</translation> </message> <message> <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="43"/> + <source>General</source> + <translation type="unfinished">Général</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="45"/> + <source>Theme</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="49"/> + <source>Toolbar Icon</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="51"/> + <source>Size</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="52"/> <source>small</source> <translation type="unfinished">petit</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="44"/> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="53"/> <source>medium</source> <translation type="unfinished">moyen</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="45"/> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="54"/> <source>large</source> <translation type="unfinished">grand</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="47"/> <source>Icon Style</source> - <translation type="unfinished">Style d'icône</translation> + <translation type="obsolete">Style d'icône</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="48"/> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="57"/> <source>just text</source> <translation type="unfinished">juste du texte</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="49"/> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="58"/> <source>just icons</source> <translation type="unfinished">juste des icônes</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="50"/> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="59"/> <source>text and icons</source> <translation type="unfinished">texte et icônes</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="52"/> <source>Window State</source> - <translation type="unfinished">État de la fenêtre</translation> + <translation type="obsolete">État de la fenêtre</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="54"/> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="47"/> <source>Save window size and position on exit.</source> <translation type="unfinished">Enregistrez la taille et la position de la fenêtre à la sortie.</translation> </message> <message> <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="56"/> + <source>Style</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="61"/> + <source>Font Size</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="63"/> <source>Text Editor</source> <translation type="unfinished">Éditeur de texte</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="57"/> <source>Font Size in Text Editor</source> - <translation type="unfinished">Taille de la police dans l'éditeur de texte</translation> + <translation type="obsolete">Taille de la police dans l'éditeur de texte</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="59"/> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="64"/> <source>Information Board</source> <translation type="unfinished">Tableau d'information</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="61"/> <source>Font Size in Information Board</source> - <translation type="unfinished">Taille de la police dans le panneau d'information</translation> + <translation type="obsolete">Taille de la police dans le panneau d'information</translation> </message> </context> <context> <name>GpgFrontend::UI::ChoosePage</name> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="112"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="107"/> <source>Choose your action...</source> <translation type="unfinished">Choisissez votre action...</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="113"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="108"/> <source>...by clicking on the appropriate link.</source> <translation type="unfinished">...en cliquant sur le lien approprié.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="116"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="111"/> <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">Si vous n'avez jamais utilisé GpgFrontend auparavant et que vous ne possédez pas encore de clé gpg, vous voudrez peut-être lire comment</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="120"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="114"/> <source>Generate Key</source> <translation type="unfinished">Générer la clé</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="127"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="121"/> <source>If you want to learn how to encrypt, decrypt, sign and verify text, you can read </source> <translation type="unfinished">Si vous voulez apprendre à chiffrer, déchiffrer, signer et vérifier du texte, vous pouvez lire</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="132"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="124"/> <source>Encrypt & Decrypt Text</source> <translation type="unfinished">Chiffrer et déchiffrer le texte</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="132"/> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="148"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="124"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="136"/> <source>or</source> <translation type="unfinished">ou</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="136"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="126"/> <source>Sign & Verify Text</source> <translation type="unfinished">Signer et vérifier le texte</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="144"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="134"/> <source>If you want to operate file, you can read </source> <translation type="unfinished">Si vous voulez utiliser le fichier, vous pouvez lire</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="148"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="136"/> <source>Encrypt & Sign File</source> <translation type="unfinished">Chiffrer et signer le fichier</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="152"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="138"/> <source>Sign & Verify File</source> <translation type="unfinished">Signer et vérifier le fichier</translation> </message> @@ -669,12 +739,12 @@ <context> <name>GpgFrontend::UI::CommonUtils</name> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="185"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="186"/> <source>GnuPG Context Loading Failed</source> <translation type="unfinished">Échec du chargement du contexte GnuPG</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="187"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="188"/> <source>Gnupg(gpg) is not installed correctly, please follow <a href='https://www.gpgfrontend.bktus.com/#/faq?id=how-to-deal-with-39env-loading-failed39'>this notes</a> in FAQ to install Gnupg and then open GpgFrontend. <br />Or, you can open GnuPG Controller to set a custom GnuPG which GpgFrontend should use. Then, GpgFrontend will restart. <br /><br />Breif Reason: %1</source> <translation type="unfinished">Gnupg(gpg) n'est pas installé correctement, veuillez suivre <a href='https://www.gpgfrontend.bktus.com/#/faq?id=how-to-deal-with-39env-loading-failed39'>this notes</a> dans la FAQ pour installer Gnupg et ensuite ouvrir GpgFrontend. <br />Ou, vous pouvez ouvrir GnuPG Controller pour définir un GnuPG personnalisé que GpgFrontend devrait utiliser. Ensuite, GpgFrontend redémarrera. <br /><br />Raison de la rupture : %1</translation> </message> @@ -683,29 +753,29 @@ <translation type="obsolete">Aucune clé trouvée à importer</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="445"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="450"/> <source>Timeout</source> <translation type="unfinished">Temps libre</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="250"/> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="381"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="251"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="382"/> <source>Success</source> <translation type="unfinished">Succès</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="251"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="252"/> <source>Gpg Operation succeed.</source> <translation type="unfinished">Opération Gpg réussie.</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="261"/> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="373"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="262"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="374"/> <source>Failure</source> <translation type="unfinished">Échec</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="262"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="263"/> <source>Gpg Operation failed. Error code: %1 @@ -718,14 +788,14 @@ Source : %2 Description : %3</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="287"/> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="294"/> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="497"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="288"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="295"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="502"/> <source>Error</source> <translation type="unfinished">Erreur</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="279"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="280"/> <source>Open Key</source> <translation type="unfinished">Ouvrir la clé</translation> </message> @@ -734,87 +804,87 @@ Description : %3</translation> <translation type="obsolete">Fichiers clés</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="280"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="281"/> <source>Keyring files</source> <translation type="unfinished">Fichiers de porte-clés</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="288"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="289"/> <source>Cannot open this file. Please make sure that this is a regular file and it's readable.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="295"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="296"/> <source>The target file is too large for a keyring.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="301"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="302"/> <source>File Open Failed</source> <translation type="unfinished">L'ouverture du fichier a échoué</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="302"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="303"/> <source>Failed to open file: </source> <translation type="unfinished">Échec de l'ouverture du fichier:</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="354"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="355"/> <source>Processing</source> <translation type="unfinished">Traitement</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="374"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="375"/> <source>Failed to execute command.</source> <translation type="unfinished">Échec de l'exécution de la commande.</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="382"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="383"/> <source>Succeed in executing command.</source> <translation type="unfinished">Réussir l'exécution de la commande.</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="384"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="385"/> <source>Warning</source> <translation type="unfinished">Avertissement</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="385"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="386"/> <source>Finished executing command.</source> <translation type="unfinished">Exécution de la commande terminée.</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="406"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="407"/> <source>Default Keyserver Not Found</source> <translation type="unfinished">Serveur de clés par défaut introuvable</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="407"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="408"/> <source>Cannot read default keyserver from your settings, please set a default keyserver first</source> <translation type="unfinished">Impossible de lire le serveur de clés par défaut à partir de vos paramètres, veuillez d'abord définir un serveur de clés par défaut</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="442"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="447"/> <source>Key Not Found</source> <translation type="unfinished">Clé introuvable</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="448"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="453"/> <source>Key Server Not Found</source> <translation type="unfinished">Serveur de clé introuvable</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="451"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="456"/> <source>Connection Error</source> <translation type="unfinished">Erreur de connexion</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="462"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="467"/> <source>The key has been updated</source> <translation type="unfinished">La clé a été mise à jour</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="464"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="469"/> <source>No need to update the key</source> <translation type="unfinished">Pas besoin de mettre à jour la clé</translation> </message> @@ -830,39 +900,43 @@ Description : %3</translation> <context> <name>GpgFrontend::UI::ConclusionPage</name> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="218"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="204"/> <source>Ready.</source> <translation type="unfinished">Prêt.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="219"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="205"/> <source>Have fun with GpgFrontend!</source> <translation type="unfinished">Amusez-vous avec GpgFrontend !</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="222"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="208"/> <source>You are ready to use GpgFrontend now.<br><br></source> <translation type="unfinished">Vous êtes prêt à utiliser GpgFrontend maintenant.<br><br></translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="226"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="210"/> <source>The Online Document</source> <translation type="unfinished">Le document en ligne</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="227"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="211"/> <source> will get you started with GpgFrontend. Anytime you encounter problems, please try to find help from the documentation</source> <translation type="unfinished"> vous permettra de démarrer avec GpgFrontend. Chaque fois que vous rencontrez des problèmes, veuillez essayer de trouver de l'aide dans la documentation</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="236"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="220"/> <source>Open offline help.</source> <translation type="unfinished">Ouvrez l'aide hors ligne.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="239"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="224"/> + <source>Don't show the wizard again.</source> + <translation type="unfinished"></translation> + </message> + <message> <source>Dont show the wizard again.</source> - <translation type="unfinished">Ne plus afficher l'assistant.</translation> + <translation type="obsolete">Ne plus afficher l'assistant.</translation> </message> </context> <context> @@ -1012,128 +1086,128 @@ Description : %3</translation> <context> <name>GpgFrontend::UI::FileTreeView</name> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="90"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="103"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="166"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="212"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="234"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="275"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="92"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="105"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="168"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="214"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="236"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="277"/> <source>Error</source> <translation type="unfinished">Erreur</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="91"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="93"/> <source>The path is not exists, unprivileged or unreachable.</source> <translation type="unfinished">Le chemin n'existe pas, non privilégié ou inaccessible.</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="104"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="106"/> <source>The file is unprivileged or unreachable.</source> <translation type="unfinished">Le fichier n'est pas privilégié ou inaccessible.</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="157"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="159"/> <source>Warning</source> <translation type="unfinished">Avertissement</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="158"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="160"/> <source>Are you sure you want to delete it?</source> <translation type="unfinished">Es-tu sûr de vouloir le supprimer ?</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="167"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="169"/> <source>Unable to delete the file or folder.</source> <translation type="unfinished">Impossible de supprimer le fichier ou le dossier.</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="176"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="189"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="178"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="191"/> <source>Make New Directory</source> <translation type="unfinished">Créer un nouveau dossier</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="177"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="190"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="179"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="192"/> <source>Directory Name</source> <translation type="unfinished">Nom du dossier</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="204"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="226"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="206"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="228"/> <source>Create Empty File</source> <translation type="unfinished">Créer un fichier vide</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="204"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="226"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="206"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="228"/> <source>Filename (you can given extension)</source> <translation type="unfinished">Nom de fichier (vous pouvez donner l'extension)</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="213"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="235"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="215"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="237"/> <source>Unable to create the file.</source> <translation type="unfinished">Impossible de créer le fichier.</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="267"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="298"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="269"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="300"/> <source>Rename</source> <translation type="unfinished">Renommer</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="267"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="269"/> <source>New Filename</source> <translation type="unfinished">Nouveau nom de fichier</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="276"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="278"/> <source>Unable to rename the file or folder.</source> <translation type="unfinished">Impossible de renommer le fichier ou le dossier.</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="293"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="295"/> <source>Open</source> <translation type="unfinished">Ouvrir</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="303"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="305"/> <source>Delete</source> <translation type="unfinished">Effacer</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="308"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="310"/> <source>Calculate Hash</source> <translation type="unfinished">Calculer le hachage</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="313"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="315"/> <source>Directory</source> <translation type="unfinished">Annuaire</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="318"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="320"/> <source>File</source> <translation type="unfinished">Déposer</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="323"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="325"/> <source>Compress...</source> <translation type="unfinished">Compresse...</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="330"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="332"/> <source>Open with Default System Application</source> <translation type="unfinished">Ouvrir avec l&#39;application système par défaut</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="335"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="337"/> <source>New</source> <translation type="unfinished">Nouveau</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="393"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="395"/> <source>Calculating</source> <translation type="unfinished">Calculer</translation> </message> @@ -1235,17 +1309,17 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::GnuPGControllerDialog</name> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="45"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="45"/> <source>General</source> <translation type="unfinished">Général</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="46"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="46"/> <source>Key Database</source> <translation type="unfinished">Base de données de clés</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="47"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="47"/> <source>Advanced</source> <translation type="unfinished">Avancée</translation> </message> @@ -1254,70 +1328,79 @@ This will result in loss of all cached form positions, statuses, key servers, et <translation type="obsolete">Pas de mode ASCII</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="49"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="49"/> <source>Use Binary Mode for File Operations</source> <translation type="unfinished">Utiliser le mode binaire pour les opérations sur les fichiers</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="51"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="51"/> <source>Use Pinentry as Password Input Dialog</source> <translation type="unfinished">Utiliser Pinentry comme boîte de dialogue de saisie de mot de passe</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="52"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="52"/> <source>Enable GpgME Debug Log</source> <translation type="unfinished">Activer le journal de débogage de GpgME</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="53"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="53"/> <source>Use Custom GnuPG</source> <translation type="unfinished">Utiliser GnuPG personnalisé</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="54"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="54"/> <source>Select GnuPG Path</source> <translation type="unfinished">Sélectionnez le chemin GnuPG</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="56"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="56"/> <source>Use Custom GnuPG Key Database Path</source> <translation type="unfinished">Utiliser le chemin personnalisé de la base de données de clés GnuPG</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="58"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="58"/> <source>Select Key Database Path</source> <translation type="unfinished">Sélectionnez le chemin de la base de données de clés</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="60"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="60"/> <source>Restart Gpg Agent on start</source> <translation type="unfinished">Redémarrer l'agent Gpg au démarrage</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="64"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="62"/> + <source>Kill all gnupg daemon at close</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="66"/> + <source>Tips: please select a directory where "gpgconf" is located in.</source> + <translation type="unfinished"></translation> + </message> + <message> <source>Tips: please select a directroy where "gpgconf" is located in.</source> - <translation type="unfinished">Conseils : veuillez sélectionner un directroy où se trouve "gpgconf".</translation> + <translation type="obsolete">Conseils : veuillez sélectionner un directroy où se trouve "gpgconf".</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="66"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="68"/> <source>Tips: notice that modify any of these settings will cause an Application restart.</source> <translation type="unfinished">Conseils : notez que la modification de l'un de ces paramètres entraînera un redémarrage de l'application.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="98"/> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="118"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="100"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="120"/> <source>Open Directory</source> <translation type="unfinished">Ouvrir le répertoire</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="171"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="173"/> <source>GnuPG Controller</source> <translation type="unfinished">Contrôleur GnuPGName</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="356"/> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="363"/> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="375"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="364"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="371"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="383"/> <source>Illegal GnuPG Path</source> <translation type="unfinished">Chemin GnuPG illégal</translation> </message> @@ -1326,22 +1409,22 @@ This will result in loss of all cached form positions, statuses, key servers, et <translation type="obsolete">Le chemin GnuPG cible est vide.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="357"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="365"/> <source>Target GnuPG Path is not an exists readable directory.</source> <translation type="unfinished">Le chemin GnuPG cible n&#39;est pas un répertoire lisible existant.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="364"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="372"/> <source>Target GnuPG Path is not an absolute path.</source> <translation type="unfinished">Le chemin GnuPG cible n&#39;est pas un chemin absolu.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="376"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="384"/> <source>Target GnuPG Path contains no "gpgconf" executable.</source> <translation type="unfinished">Le chemin GnuPG cible ne contient pas d&#39;exécutable &quot;gpgconf&quot;.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="389"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="397"/> <source>Illegal GnuPG Key Database Path</source> <translation type="unfinished">Chemin d'accès à la base de données de clés GnuPG illégal</translation> </message> @@ -1350,7 +1433,7 @@ This will result in loss of all cached form positions, statuses, key servers, et <translation type="obsolete">Le chemin d&#39;accès à la base de données de clés GnuPG cible est vide.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="390"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="398"/> <source>Target GnuPG Key Database Path is not an exists readable directory.</source> <translation type="unfinished">Le chemin cible de la base de données de clés GnuPG n&#39;est pas un répertoire lisible existant.</translation> </message> @@ -1358,53 +1441,53 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::GnupgTab</name> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="44"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="46"/> <source>Name</source> <translation type="unfinished">Nom</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="44"/> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="90"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="46"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="92"/> <source>Description</source> <translation type="unfinished">Description</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="44"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="46"/> <source>Version</source> <translation type="unfinished">Version</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="45"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="47"/> <source>Checksum</source> <translation type="unfinished">Somme de contrôle</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="45"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="47"/> <source>Binary Path</source> <translation type="unfinished">Chemin binaire</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="47"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="49"/> <source>Components</source> <translation type="unfinished">Composants</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="48"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="50"/> <source>Directories</source> <translation type="unfinished">Annuaires</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="49"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="51"/> <source>Options</source> <translation type="unfinished">Options</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="68"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="70"/> <source>Directory Type</source> <translation type="unfinished">Type de répertoire</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="68"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="70"/> <source>Path</source> <translation type="unfinished">Chemin d'accès</translation> </message> @@ -1413,27 +1496,27 @@ This will result in loss of all cached form positions, statuses, key servers, et <translation type="obsolete">Configurations</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="89"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="91"/> <source>Component</source> <translation type="unfinished">Composant</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="89"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="91"/> <source>Group</source> <translation type="unfinished">Groupe</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="89"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="91"/> <source>Key</source> <translation type="unfinished">Clé</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="90"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="92"/> <source>Default Value</source> <translation type="unfinished">Valeur par défaut</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="91"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="93"/> <source>Value</source> <translation type="unfinished">Valeur</translation> </message> @@ -1441,22 +1524,22 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::GpgFrontendApplication</name> <message> - <location filename="../../../../src/ui/GpgFrontendApplication.cpp" line="64"/> + <location filename="../../../../src/ui/GpgFrontendApplication.cpp" line="62"/> <source>Standard Exception Thrown</source> <translation type="unfinished">Exception standard levée</translation> </message> <message> - <location filename="../../../../src/ui/GpgFrontendApplication.cpp" line="65"/> + <location filename="../../../../src/ui/GpgFrontendApplication.cpp" line="63"/> <source>Oops, an standard exception was thrown during the running of the program. This is not a serious problem, it may be the negligence of the programmer, please report this problem if you can.</source> <translation type="unfinished">Oups, une exception standard a été levée lors de l'exécution du programme. Ce n'est pas un problème grave, il peut s'agir de la négligence du programmeur, veuillez signaler ce problème si vous le pouvez.</translation> </message> <message> - <location filename="../../../../src/ui/GpgFrontendApplication.cpp" line="73"/> + <location filename="../../../../src/ui/GpgFrontendApplication.cpp" line="71"/> <source>Unhandled Exception Thrown</source> <translation type="unfinished">Exception non gérée levée</translation> </message> <message> - <location filename="../../../../src/ui/GpgFrontendApplication.cpp" line="74"/> + <location filename="../../../../src/ui/GpgFrontendApplication.cpp" line="72"/> <source>Oops, an unhandled exception was thrown during the running of the program. This is not a serious problem, it may be the negligence of the programmer, please report this problem if you can.</source> <translation type="unfinished">Oups, une exception non gérée a été levée lors de l'exécution du programme. Ce n'est pas un problème grave, il peut s'agir de la négligence du programmeur, veuillez signaler ce problème si vous le pouvez.</translation> </message> @@ -1502,37 +1585,37 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::InfoTab</name> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="89"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="102"/> <source>GpgFrontend is an easy-to-use, compact, cross-platform, and installation-free GnuPG Frontend.It visualizes most of the common operations of GnuPG.GpgFrontend is licensed under the GPLv3</source> <translation type="unfinished">GpgFrontend est une interface GnuPG facile à utiliser, compacte, multiplateforme et sans installation. Il visualise la plupart des opérations courantes de GnuPG. GpgFrontend est sous licence GPLv3</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="95"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="108"/> <source>Developer:</source> <translation type="unfinished">Développeur:</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="96"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="109"/> <source>If you have any questions or suggestions, raise an issue at</source> <translation type="unfinished">Si vous avez des questions ou des suggestions, soulevez un problème à</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="99"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="112"/> <source>or send a mail to my mailing list at</source> <translation type="unfinished">ou envoyer un mail à ma liste de diffusion à</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="101"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="114"/> <source>Built with Qt</source> <translation type="unfinished">Construit avec Qt</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="102"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="115"/> <source>and</source> <translation type="unfinished">et</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="103"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="116"/> <source>Built at</source> <translation type="unfinished">Construit à</translation> </message> @@ -1540,42 +1623,58 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::IntroPage</name> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="74"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="71"/> <source>Getting Started...</source> <translation type="unfinished">Commencer...</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="75"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="72"/> <source>... with GpgFrontend</source> <translation type="unfinished">... avec GpgFrontend</translation> </message> <message> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="75"/> + <source>Welcome to GpgFrontend for decrypting and signing text or files!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="77"/> + <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/dialog/Wizard.cpp" line="79"/> - <source>Welcome to use GpgFrontend for decrypting and signing text or file!</source> - <translation type="unfinished">Bienvenue à utiliser GpgFrontend pour déchiffrer et signer du texte ou un fichier !</translation> + <source>To get started, be sure to check out the</source> + <translation type="unfinished"></translation> </message> <message> <location filename="../../../../src/ui/dialog/Wizard.cpp" line="82"/> + <source>by clicking the link, the page will open in your web browser</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Welcome to use GpgFrontend for decrypting and signing text or file!</source> + <translation type="obsolete">Bienvenue à utiliser GpgFrontend pour déchiffrer et signer du texte ou un fichier !</translation> + </message> + <message> <source>is a Powerful, Easy-to-Use, Compact, Cross-Platform, and Installation-Free OpenPGP Crypto Tool.</source> - <translation type="unfinished">est un outil de chiffrement OpenPGP puissant, facile à utiliser, compact, multiplateforme et sans installation.</translation> + <translation type="obsolete">est un outil de chiffrement OpenPGP puissant, facile à utiliser, compact, multiplateforme et sans installation.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="84"/> <source>For brief information have a look at the</source> - <translation type="unfinished">Pour de brèves informations, consultez le</translation> + <translation type="obsolete">Pour de brèves informations, consultez le</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="86"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="81"/> <source>Overview</source> <translation type="unfinished">Aperçu</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="87"/> <source>by clicking the link, the page will open in the web browser</source> - <translation type="unfinished">en cliquant sur le lien, la page s'ouvrira dans le navigateur Web</translation> + <translation type="obsolete">en cliquant sur le lien, la page s'ouvrira dans le navigateur Web</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="96"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="91"/> <source>If it supports the language currently being used in your system, GpgFrontend will automatically set it.</source> <translation type="unfinished">S'il prend en charge la langue actuellement utilisée dans votre système, GpgFrontend la définira automatiquement.</translation> </message> @@ -1631,87 +1730,87 @@ This will result in loss of all cached form positions, statuses, key servers, et <translation type="unfinished">Délai d'expiration trop long.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="151"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="152"/> <source>Generating</source> <translation type="unfinished">Générateur</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="160"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="161"/> <source>Error</source> <translation type="unfinished">Erreur</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="161"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="162"/> <source>Unknown error occurred</source> <translation type="unfinished">Une erreur inconnue s'est produite</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="197"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="198"/> <source>Key Usage</source> <translation type="unfinished">Utilisation des clés</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="199"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="200"/> <source>Encryption</source> <translation type="unfinished">Chiffrement</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="202"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="203"/> <source>Signing</source> <translation type="unfinished">Signature</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="205"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="206"/> <source>Certification</source> <translation type="unfinished">Attestation</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="208"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="209"/> <source>Authentication</source> <translation type="unfinished">Authentification</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="435"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="436"/> <source>Name</source> <translation type="unfinished">Nom</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="436"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="437"/> <source>Email Address</source> <translation type="unfinished">Adresse e-mail</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="437"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="438"/> <source>Comment</source> <translation type="unfinished">Commentaire</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="438"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="439"/> <source>Expiration Date</source> <translation type="unfinished">Date d'expiration</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="439"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="440"/> <source>Never Expire</source> <translation type="unfinished">N'expire jamais</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="440"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="441"/> <source>KeySize (in Bit)</source> <translation type="unfinished">Taille de clé (en bits)</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="441"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="442"/> <source>Key Type</source> <translation type="unfinished">Type de clé</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="442"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="443"/> <source>Non Pass Phrase</source> <translation type="unfinished">Sans phrase secrète</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="455"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="456"/> <source>Basic Information</source> <translation type="unfinished">Informations de base</translation> </message> @@ -1719,27 +1818,27 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::KeyGenPage</name> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="178"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="164"/> <source>Create a keypair...</source> <translation type="unfinished">Créer une paire de clés...</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="179"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="165"/> <source>...for decrypting and signing messages</source> <translation type="unfinished">...pour déchiffrer et signer des messages</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="181"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="167"/> <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">Vous devez créer une nouvelle paire de clés. La paire se compose d'une clé publique et d'une clé 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 signer messages.<br>Pour plus d'informations, consultez le didacticiel hors ligne (qui s'affiche ensuite dans la fenêtre principale) :</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="193"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="179"/> <source>Offline tutorial</source> <translation type="unfinished">Tutoriel hors ligne</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="197"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="183"/> <source>Create New Key</source> <translation type="unfinished">Créer une nouvelle clé</translation> </message> @@ -1951,42 +2050,42 @@ This will result in loss of all cached form positions, statuses, key servers, et <translation type="unfinished">Actualisation de la liste des clés...</translation> </message> <message> - <location filename="../../../../src/ui/widgets/KeyList.cpp" line="354"/> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="374"/> <source>Import Keys</source> <translation type="unfinished">Importer des clés</translation> </message> <message> - <location filename="../../../../src/ui/widgets/KeyList.cpp" line="356"/> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="376"/> <source>You've dropped something on the table.</source> <translation type="unfinished">Vous avez fait tomber quelque chose sur la table.</translation> </message> <message> - <location filename="../../../../src/ui/widgets/KeyList.cpp" line="357"/> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="377"/> <source>GpgFrontend will now try to import key(s).</source> <translation type="unfinished">GpgFrontend va maintenant essayer d'importer des clés.</translation> </message> <message> - <location filename="../../../../src/ui/widgets/KeyList.cpp" line="360"/> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="380"/> <source>Always import without bothering.</source> <translation type="unfinished">Importez toujours sans vous soucier.</translation> </message> <message> - <location filename="../../../../src/ui/widgets/KeyList.cpp" line="455"/> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="475"/> <source>Key List Refreshed.</source> <translation type="unfinished">Liste des clés actualisée.</translation> </message> <message> - <location filename="../../../../src/ui/widgets/KeyList.cpp" line="476"/> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="510"/> <source>Syncing Key List...</source> <translation type="unfinished">Synchronisation de la liste des clés...</translation> </message> <message> - <location filename="../../../../src/ui/widgets/KeyList.cpp" line="484"/> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="518"/> <source>Sync [%1/%2] %3 %4</source> <translation type="unfinished">Synchronisation [%1/%2] %3 %4</translation> </message> <message> - <location filename="../../../../src/ui/widgets/KeyList.cpp" line="494"/> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="528"/> <source>Key List Sync Done.</source> <translation type="unfinished">Synchronisation de la liste des clés terminée.</translation> </message> @@ -2066,7 +2165,7 @@ This will result in loss of all cached form positions, statuses, key servers, et </message> <message> <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="171"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="261"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="265"/> <source>File</source> <translation type="unfinished">Déposer</translation> </message> @@ -2097,7 +2196,7 @@ This will result in loss of all cached form positions, statuses, key servers, et </message> <message> <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="202"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="532"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="536"/> <source>Key Package</source> <translation type="unfinished">Paquet de clés</translation> </message> @@ -2142,220 +2241,220 @@ This will result in loss of all cached form positions, statuses, key servers, et <translation type="unfinished">Supprimer la ou les clés sélectionnées</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="232"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="233"/> <source>Delete the Selected keys</source> <translation type="unfinished">Supprimer les clés sélectionnées</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="236"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="237"/> <source>Delete Checked Key(s)</source> <translation type="unfinished">Supprimer les clés cochées</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="237"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="239"/> <source>Delete the Checked keys</source> <translation type="unfinished">Supprimer les clés cochées</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="242"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="244"/> <source>Show Key Details</source> <translation type="unfinished">Afficher les détails clés</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="243"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="246"/> <source>Show Details for this Key</source> <translation type="unfinished">Afficher les détails de cette clé</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="247"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="248"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="250"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="252"/> <source>Set Owner Trust Level</source> <translation type="unfinished">Définir le niveau de confiance du propriétaire</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="265"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="285"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="269"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="289"/> <source>Key</source> <translation type="unfinished">Clé</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="266"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="270"/> <source>Generate Key</source> <translation type="unfinished">Générer la clé</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="270"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="298"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="274"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="302"/> <source>Import Key</source> <translation type="unfinished">Importer la clé</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="276"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="306"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="307"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="280"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="310"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="311"/> <source>Export Key</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="297"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="301"/> <source>Import key</source> <translation type="unfinished">Importer la clé</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="340"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="344"/> <source>Deleting Keys</source> <translation type="unfinished">Suppression de clés</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="341"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="345"/> <source>Are you sure that you want to delete the following keys?</source> <translation type="unfinished">Êtes-vous sûr de vouloir supprimer les clés suivantes ?</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="343"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="347"/> <source>The action can not be undone.</source> <translation type="unfinished">L'action ne peut pas être annulée.</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="359"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="408"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="420"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="448"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="487"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="498"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="511"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="541"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="549"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="565"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="573"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="589"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="363"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="412"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="424"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="452"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="491"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="502"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="515"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="545"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="553"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="569"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="577"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="593"/> <source>Error</source> <translation type="unfinished">Erreur</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="359"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="448"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="363"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="452"/> <source>Key Not Found.</source> <translation type="unfinished">Clé introuvable.</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="370"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="383"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="466"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="472"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="374"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="387"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="470"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="476"/> <source>Forbidden</source> <translation type="unfinished">Interdit</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="371"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="384"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="375"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="388"/> <source>Please check some keys before doing this operation.</source> <translation type="unfinished">Veuillez vérifier certaines touches avant de faire cette opération.</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="376"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="524"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="380"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="528"/> <source>key(s) exported</source> <translation type="unfinished">clé(s) exportée(s)</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="400"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="479"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="404"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="483"/> <source>Exporting</source> <translation type="unfinished">Exportation</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="409"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="421"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="488"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="499"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="413"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="425"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="492"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="503"/> <source>Unknown error occurred</source> <translation type="unfinished">Une erreur inconnue s'est produite</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="442"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="452"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="446"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="456"/> <source>Invalid Operation</source> <translation type="unfinished">Opération invalide</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="443"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="447"/> <source>Please select one KeyPair before doing this operation.</source> <translation type="unfinished">Veuillez sélectionner une KeyPair avant de faire cette opération.</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="453"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="457"/> <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">Si une paire de clés n'a pas de clé privée, elle ne pourra pas générer de sous-clés.</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="467"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="471"/> <source>Please check a key before performing this operation.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="473"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="477"/> <source>This operation accepts just a single key.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="512"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="516"/> <source>This key may not be able to export as OpenSSH format. Please check the key-size of the subkey(s) used to sign.</source> <translation type="unfinished">Cette clé peut ne pas être en mesure d'exporter au format OpenSSH. Veuillez vérifier la taille de la ou des sous-clés utilisées pour signer.</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="519"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="523"/> <source>Export OpenSSH Key To File</source> <translation type="unfinished">Exporter la clé OpenSSH vers un fichier</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="520"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="524"/> <source>OpenSSH Public Key Files</source> <translation type="unfinished">Fichiers de clé publique OpenSSH</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="532"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="536"/> <source>Import Key Package</source> <translation type="unfinished">Importer le paquet de clés</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="542"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="566"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="546"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="570"/> <source>Cannot open this file. Please make sure that this is a regular file and it's readable.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="550"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="554"/> <source>The target file is too large for a key package.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="555"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="559"/> <source>Import Key Package Passphrase File</source> <translation type="unfinished">Importer le fichier de mot de passe du package de clés</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="556"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="560"/> <source>Key Package Passphrase File</source> <translation type="unfinished">Fichier de mot de passe du package de clé</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="574"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="578"/> <source>The target file is too large for a key package passphrase.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="580"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="584"/> <source>Importing</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="596"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="600"/> <source>key(s) imported</source> <translation type="unfinished">clé(s) importée(s)</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="590"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="594"/> <source>An error occur in importing key package.</source> <translation type="unfinished">Une erreur s'est produite lors de l'importation du package de clés.</translation> </message> @@ -3179,138 +3278,138 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::KeyServerImportDialog</name> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="58"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="56"/> <source>Close</source> <translation type="unfinished">proche</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="61"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="59"/> <source>Import ALL</source> <translation type="unfinished">Importer TOUT</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="65"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="63"/> <source>Search</source> <translation type="unfinished">Chercher</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="70"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="68"/> <source>Search String</source> <translation type="unfinished">Chaîne de recherche</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="70"/> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="74"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="68"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="72"/> <source>: </source> <translation type="unfinished">:</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="74"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="72"/> <source>Key Server</source> <translation type="unfinished">Serveur de clés</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="115"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="113"/> <source>Import Keys from Keyserver</source> <translation type="unfinished">Importer des clés à partir du serveur de clés</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="155"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="153"/> <source>UID</source> <translation type="unfinished">UID</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="155"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="153"/> <source>Creation date</source> <translation type="unfinished">Date de création</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="155"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="153"/> <source>KeyID</source> <translation type="unfinished">ID clé</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="155"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="153"/> <source>Tag</source> <translation type="unfinished">Étiqueter</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="178"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="176"/> <source>Text is empty.</source> <translation type="unfinished">Le texte est vide.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="225"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="223"/> <source>Not Key Found</source> <translation type="unfinished">Pas de clé trouvée</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="228"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="226"/> <source>Timeout</source> <translation type="unfinished">Temps libre</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="231"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="229"/> <source>Key Server Not Found</source> <translation type="unfinished">Serveur de clé introuvable</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="234"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="232"/> <source>Connection Error</source> <translation type="unfinished">Erreur de connexion</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="243"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="241"/> <source>Too many responses from keyserver!</source> <translation type="unfinished">Trop de réponses du serveur de clés !</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="252"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="253"/> <source>No keys found, input may be kexId, retrying search with 0x.</source> <translation type="unfinished">Aucune clé trouvée, l'entrée peut être kexId, réessayer la recherche avec 0x.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="261"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="263"/> <source>No keys found containing the search string!</source> <translation type="unfinished">Aucune clé trouvée contenant la chaîne de recherche !</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="267"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="270"/> <source>Insufficiently specific search string!</source> <translation type="unfinished">Chaîne de recherche insuffisamment spécifique !</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="301"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="305"/> <source>revoked</source> <translation type="unfinished">révoqué</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="304"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="308"/> <source>disabled</source> <translation type="unfinished">désactivée</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="349"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="353"/> <source>%1 keys found. Double click a key to import it.</source> <translation type="unfinished">%1 clés trouvées. Double-cliquez sur une clé pour l'importer.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="371"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="374"/> <source>Warning</source> <translation type="unfinished">Avertissement</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="372"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="375"/> <source>Please select one KeyPair before doing this operation.</source> <translation type="unfinished">Veuillez sélectionner une KeyPair avant de faire cette opération.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="419"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="422"/> <source>Key Imported</source> <translation type="unfinished">Clé importée</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="430"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="433"/> <source>Processing ...</source> <translation type="unfinished"></translation> </message> @@ -3318,27 +3417,27 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::KeyServerImportTask</name> <message> - <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="74"/> + <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="79"/> <source>Key not found in the Keyserver.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="77"/> + <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="82"/> <source>Network connection timeout.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="80"/> + <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="85"/> <source>Cannot resolve the address of target key server.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="83"/> + <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="88"/> <source>General connection error occurred.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="89"/> + <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="94"/> <source>Success</source> <translation type="unfinished">Succès</translation> </message> @@ -3427,52 +3526,52 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::KeyUploadDialog</name> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="59"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="60"/> <source>Uploading Public Key</source> <translation type="unfinished">Téléchargement de la clé publique</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="77"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="78"/> <source>Error</source> <translation type="unfinished">Erreur</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="78"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="79"/> <source>Unknown error occurred</source> <translation type="unfinished">Une erreur inconnue s'est produite</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="147"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="150"/> <source>Key Not Found</source> <translation type="unfinished">Clé introuvable</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="150"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="153"/> <source>Timeout</source> <translation type="unfinished">Temps libre</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="153"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="156"/> <source>Key Server Not Found</source> <translation type="unfinished">Serveur de clé introuvable</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="156"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="159"/> <source>Connection Error</source> <translation type="unfinished">Erreur de connexion</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="158"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="161"/> <source>Upload Failed</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="162"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="165"/> <source>Upload Success</source> <translation type="unfinished">Télécharger le succès</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="163"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="166"/> <source>Upload Public Key Successfully</source> <translation type="unfinished">Télécharger la clé publique avec succès</translation> </message> @@ -3609,13 +3708,13 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::MainWindow</name> <message> - <location filename="../../../../src/ui/main_window/MainWindow.cpp" line="156"/> - <location filename="../../../../src/ui/main_window/MainWindow.cpp" line="159"/> + <location filename="../../../../src/ui/main_window/MainWindow.cpp" line="154"/> + <location filename="../../../../src/ui/main_window/MainWindow.cpp" line="157"/> <source>Critical error occur while loading GpgFrontend.</source> <translation type="unfinished">Une erreur critique s'est produite lors du chargement de GpgFrontend.</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindow.cpp" line="158"/> + <location filename="../../../../src/ui/main_window/MainWindow.cpp" line="156"/> <source>Loading Failed</source> <translation type="unfinished">Échec du chargement</translation> </message> @@ -3637,20 +3736,20 @@ This will result in loss of all cached form positions, statuses, key servers, et <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="380"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="435"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="454"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="489"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="508"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="536"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="576"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="613"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="639"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="679"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="717"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="743"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="751"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="775"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="812"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="822"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="847"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="490"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="509"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="537"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="577"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="614"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="640"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="680"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="718"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="744"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="752"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="776"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="813"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="823"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="848"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="74"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="121"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="177"/> @@ -3659,14 +3758,14 @@ This will result in loss of all cached form positions, statuses, key servers, et <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="322"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="368"/> <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="97"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="120"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="140"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="156"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="169"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="182"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="197"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="247"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="255"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="121"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="141"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="157"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="170"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="183"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="198"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="248"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="256"/> <source>Error</source> <translation type="unfinished">Erreur</translation> </message> @@ -3677,10 +3776,10 @@ This will result in loss of all cached form positions, statuses, key servers, et <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="330"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="381"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="455"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="537"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="640"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="744"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="813"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="538"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="641"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="745"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="814"/> <source>Cannot read from file: %1</source> <translation type="unfinished"></translation> </message> @@ -3696,10 +3795,10 @@ This will result in loss of all cached form positions, statuses, key servers, et <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="288"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="338"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="416"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="583"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="686"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="757"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="828"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="584"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="687"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="758"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="829"/> <source>Warning</source> <translation type="unfinished">Avertissement</translation> </message> @@ -3708,10 +3807,10 @@ This will result in loss of all cached form positions, statuses, key servers, et <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="190"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="298"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="348"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="577"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="680"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="752"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="823"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="578"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="681"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="753"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="824"/> <source>Cannot write to file: %1</source> <translation type="unfinished"></translation> </message> @@ -3742,11 +3841,11 @@ This will result in loss of all cached form positions, statuses, key servers, et <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="312"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="362"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="436"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="509"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="614"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="718"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="776"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="848"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="510"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="615"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="719"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="777"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="849"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="75"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="122"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="178"/> @@ -3760,8 +3859,8 @@ This will result in loss of all cached form positions, statuses, key servers, et <message> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="126"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="241"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="558"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="661"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="559"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="662"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="279"/> <source>Invalid KeyPair</source> <translation type="unfinished">Paire de clés invalide</translation> @@ -3769,8 +3868,8 @@ This will result in loss of all cached form positions, statuses, key servers, et <message> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="127"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="242"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="559"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="662"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="560"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="663"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="280"/> <source>The selected keypair cannot be used for encryption.</source> <translation type="unfinished">La paire de clés sélectionnée ne peut pas être utilisée pour le chiffrement.</translation> @@ -3778,8 +3877,8 @@ This will result in loss of all cached form positions, statuses, key servers, et <message> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="128"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="243"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="560"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="663"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="561"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="664"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="103"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="159"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="281"/> @@ -3805,8 +3904,8 @@ This will result in loss of all cached form positions, statuses, key servers, et <message> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="289"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="339"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="584"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="687"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="585"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="688"/> <source>The target file already exists, do you need to overwrite it?</source> <translation type="unfinished">Le fichier cible existe déjà, devez-vous l'écraser ?</translation> </message> @@ -3823,8 +3922,8 @@ This will result in loss of all cached form positions, statuses, key servers, et </message> <message> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="390"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="547"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="650"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="548"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="651"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="147"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="267"/> <source>No Key Checked</source> @@ -3832,8 +3931,8 @@ This will result in loss of all cached form positions, statuses, key servers, et </message> <message> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="391"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="548"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="651"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="549"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="652"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="148"/> <source>Please check the key in the key toolbox on the right.</source> <translation type="unfinished">Veuillez vérifier la clé dans la boîte à outils de clé à droite.</translation> @@ -3878,41 +3977,41 @@ If Data And Signature is COMBINED within a single file, KEEP THIS EMPTY: </sourc <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="490"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="491"/> <source>Please select the appropriate origin file or signature file. Ensure that both are in this directory.</source> <translation type="unfinished">Veuillez sélectionner le fichier d'origine ou le fichier de signature approprié. Assurez-vous que les deux sont dans ce dossier.</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="499"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="500"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="237"/> <source>Verifying</source> <translation type="unfinished">Vérification</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="602"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="603"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="310"/> <source>Encrypting and Signing</source> <translation type="unfinished">Chiffrement et signature</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="705"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="706"/> <source>Archiving & Encrypting & Signing</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="758"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="829"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="759"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="830"/> <source>The output file %1 already exists, do you need to overwrite it?</source> <translation type="unfinished">Le fichier de sortie %1 existe déjà, devez-vous l'écraser ?</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="767"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="768"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="358"/> <source>Decrypting and Verifying</source> <translation type="unfinished">Déchiffrement et vérification</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="838"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="839"/> <source>Decrypting & Verifying & Extracting</source> <translation type="unfinished"></translation> </message> @@ -3938,12 +4037,12 @@ If Data And Signature is COMBINED within a single file, KEEP THIS EMPTY: </sourc </message> <message> <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="97"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="120"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="140"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="156"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="169"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="182"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="197"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="121"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="141"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="157"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="170"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="183"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="198"/> <source>Key Not Found.</source> <translation type="unfinished">Clé introuvable.</translation> </message> @@ -3958,805 +4057,962 @@ If Data And Signature is COMBINED within a single file, KEEP THIS EMPTY: </sourc <translation type="unfinished">UTC</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="125"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="126"/> <source>Local Time</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="248"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="249"/> <source>Cannot open this file. Please make sure that this is a regular file and it's readable.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="256"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="257"/> <source>Cannot open this file. The file is TOO LARGE (>1MB) for GpgFrontend Text Editor.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="302"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="298"/> <source>GpgFrontend Upgradeable (New Version: %1).</source> <translation type="unfinished">GpgFrontend évolutif (nouvelle version : %1).</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="312"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="302"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="448"/> + <source>Update</source> + <translation type="unfinished">Mettre à jour</translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="308"/> <source>Withdrawn Version</source> <translation type="unfinished">Version retirée</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="314"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="310"/> <source>This version(%1) may have been withdrawn by the developer due to serious problems. Please stop using this version immediately and use the latest stable version.</source> <translation type="unfinished">Cette version (%1) a peut-être été retirée par le développeur en raison de graves problèmes. Veuillez cesser d'utiliser cette version immédiatement et utilisez la dernière version stable.</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="319"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="315"/> <source>You can download the latest stable version(%1) on Github Releases Page.<br/></source> <translation type="unfinished">Vous pouvez télécharger la dernière version stable (%1) sur la page des versions de Github.<br/></translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="324"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="320"/> <source>This maybe a BETA Version (Latest Stable Version: %1).</source> <translation type="unfinished">Il s'agit peut-être d'une version bêta (dernière version stable : %1).</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="44"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="45"/> <source>New</source> <translation type="unfinished">Nouveau</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="50"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="51"/> <source>Open a new file</source> <translation type="unfinished">Ouvrir un nouveau fichier</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="53"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="54"/> <source>Open...</source> <translation type="unfinished">Ouvrir...</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="56"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="57"/> <source>Open an existing file</source> <translation type="unfinished">Ouvrir un fichier existant</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="59"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="60"/> <source>File Browser</source> <translation type="unfinished">Navigateur de fichiers</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="62"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="63"/> <source>Open a file browser</source> <translation type="unfinished">Ouvrir un navigateur de fichiers</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="66"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="67"/> <source>Save File</source> <translation type="unfinished">Enregistrer le fichier</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="69"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="70"/> <source>Save the current File</source> <translation type="unfinished">Enregistrer le fichier actuel</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="72"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="73"/> <source>Save As</source> <translation type="unfinished">Enregistrer sous</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="75"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="76"/> <source>Save the current File as...</source> <translation type="unfinished">Enregistrer le fichier actuel sous...</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="78"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="79"/> <source>Print</source> <translation type="unfinished">Imprimer</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="81"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="82"/> <source>Print Document</source> <translation type="unfinished">Imprimer le document</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="84"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="85"/> <source>Close</source> <translation type="unfinished">proche</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="86"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="88"/> <source>Close file</source> <translation type="unfinished">Fermer le fichier</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="89"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="91"/> <source>Quit</source> <translation type="unfinished">Quitter</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="92"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="94"/> <source>Quit Program</source> <translation type="unfinished">Quitter le programme</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="97"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="99"/> <source>Undo</source> <translation type="unfinished">annuler</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="99"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="102"/> <source>Undo Last Edit Action</source> <translation type="unfinished">Annuler la dernière action de modification</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="102"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="105"/> <source>Redo</source> <translation type="unfinished">Refaire</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="104"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="108"/> <source>Redo Last Edit Action</source> <translation type="unfinished">Rétablir la dernière action de modification</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="107"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="111"/> <source>Zoom In</source> <translation type="unfinished">Agrandir</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="111"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="116"/> <source>Zoom Out</source> <translation type="unfinished">Dézoomer</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="115"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="121"/> <source>Paste</source> <translation type="unfinished">Pâte</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="118"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="124"/> <source>Paste Text From Clipboard</source> <translation type="unfinished">Coller le texte du presse-papiers</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="121"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="127"/> <source>Cut</source> <translation type="unfinished">Couper</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="125"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="131"/> <source>Cut the current selection's contents to the clipboard</source> <translation type="unfinished">Couper le contenu de la sélection actuelle dans le presse-papiers</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="129"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="135"/> <source>Copy</source> <translation type="unfinished">Copier</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="133"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="139"/> <source>Copy the current selection's contents to the clipboard</source> <translation type="unfinished">Copier le contenu de la sélection actuelle dans le presse-papiers</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="137"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="143"/> <source>Quote</source> <translation type="unfinished">Citation</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="139"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="145"/> <source>Quote whole text</source> <translation type="unfinished">Citer le texte en entier</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="142"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="148"/> <source>Select All</source> <translation type="unfinished">Tout sélectionner</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="145"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="151"/> <source>Select the whole text</source> <translation type="unfinished">Sélectionnez tout le texte</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="149"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="155"/> <source>Find</source> <translation type="unfinished">Trouve</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="152"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="158"/> <source>Find a word</source> <translation type="unfinished">Trouver un mot</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="155"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="161"/> <source>Remove spacing</source> <translation type="unfinished">Supprimer l'espacement</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="160"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="166"/> <source>Remove double linebreaks, e.g. in pasted text from Web Mailer</source> <translation type="unfinished">Supprimez les doubles sauts de ligne, par ex. dans du texte collé depuis Web Mailer</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="164"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="170"/> <source>Settings</source> <translation type="unfinished">Paramètres</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="165"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="171"/> <source>Open settings dialog</source> <translation type="unfinished">Ouvrir la boîte de dialogue des paramètres</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="173"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="179"/> <source>Encrypt</source> <translation type="unfinished">Chiffrer</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="177"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="183"/> <source>Encrypt Message</source> <translation type="unfinished">Chiffrer le message</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="195"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="201"/> <source>Encrypt Sign</source> <translation type="unfinished">Chiffrer et signer</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="200"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="206"/> <source>Encrypt and Sign Message</source> <translation type="unfinished">Chiffrer et signer le message</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="218"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="224"/> <source>Decrypt</source> <translation type="unfinished">Déchiffrer</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="221"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="227"/> <source>Decrypt Message</source> <translation type="unfinished">Déchiffrer le message</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="243"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="249"/> <source>Decrypt Verify</source> <translation type="unfinished">Déchiffrer et vérifier</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="247"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="253"/> <source>Decrypt and Verify Message</source> <translation type="unfinished">Déchiffrer et vérifier le message</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="269"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="275"/> <source>Sign</source> <translation type="unfinished">Signer</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="272"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="278"/> <source>Sign Message</source> <translation type="unfinished">Signer le message</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="284"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="290"/> <source>Verify</source> <translation type="unfinished">Vérifier</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="287"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="293"/> <source>Verify Message</source> <translation type="unfinished">Vérifier le message</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="302"/> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="540"/> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="614"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="308"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="554"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="636"/> <source>File</source> <translation type="unfinished">Déposer</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="304"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="310"/> <source>Import New Key From File</source> <translation type="unfinished">Importer une nouvelle clé à partir d'un fichier</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="308"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="314"/> <source>Clipboard</source> <translation type="unfinished">Presse-papiers</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="312"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="318"/> <source>Import New Key From Clipboard</source> <translation type="unfinished">Importer une nouvelle clé du presse-papiers</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="323"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="329"/> <source>Keyserver</source> <translation type="unfinished">Serveur de clés</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="327"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="333"/> <source>Import New Key From Keyserver</source> <translation type="unfinished">Importer une nouvelle clé à partir du serveur de clés</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="333"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="339"/> <source>Editor</source> <translation type="unfinished">Éditeur</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="335"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="341"/> <source>Import New Key From Editor</source> <translation type="unfinished">Importer une nouvelle clé à partir de l'éditeur</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="339"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="345"/> <source>Manage Keys</source> <translation type="unfinished">Gérer les clés</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="341"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="347"/> <source>Open Key Management</source> <translation type="unfinished">Ouvrir la gestion des clés</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="345"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="351"/> <source>Clear Password Cache</source> <translation type="unfinished">Effacer le cache du mot de passe</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="348"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="354"/> <source>Clear Password Cache of GnuPG</source> <translation type="unfinished">Vider le cache des mots de passe de GnuPG</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="353"/> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="370"/> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="391"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="359"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="376"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="397"/> <source>Successful Operation</source> <translation type="unfinished">Opération réussie</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="354"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="360"/> <source>Clear password cache successfully</source> <translation type="unfinished">Effacer le cache du mot de passe avec succès</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="356"/> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="374"/> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="395"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="362"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="380"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="401"/> <source>Failed Operation</source> <translation type="unfinished">Échec de l'opération</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="357"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="363"/> <source>Failed to clear password cache of GnuPG</source> <translation type="unfinished">Impossible d'effacer le cache du mot de passe de GnuPG</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="362"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="368"/> <source>Reload All Components</source> <translation type="unfinished">Recharger tous les composants</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="364"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="370"/> <source>Reload All GnuPG's Components</source> <translation type="unfinished">Recharger tous les composants de GnuPG</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="371"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="377"/> <source>Reload all the GnuPG's components successfully</source> <translation type="unfinished">Rechargez tous les composants de GnuPG avec succès</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="375"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="381"/> <source>Failed to reload all or one of the GnuPG's component(s)</source> <translation type="unfinished">Échec du rechargement de tout ou partie des composants de GnuPG</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="380"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="386"/> <source>Restart All Components</source> <translation type="unfinished">Redémarrez tous les composants</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="382"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="388"/> <source>Restart All GnuPG's Components</source> <translation type="unfinished">Redémarrez tous les composants de GnuPG</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="392"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="398"/> <source>Restart all the GnuPG's components successfully</source> <translation type="unfinished">Redémarrez tous les composants de GnuPG avec succès</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="396"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="402"/> <source>Failed to restart all or one of the GnuPG's component(s)</source> <translation type="unfinished">Échec du redémarrage de tout ou partie des composants de GnuPG</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="401"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="407"/> <source>Open GnuPG Controller</source> <translation type="unfinished">Ouvrir le contrôleur GnuPG</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="403"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="409"/> <source>Open GnuPG Controller Dialog</source> <translation type="unfinished">Ouvrir la boîte de dialogue du contrôleur GnuPG</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="410"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="413"/> + <source>Open Module Controller</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="415"/> + <source>Open Module Controller Dialog</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="422"/> <source>About</source> <translation type="unfinished">A propos</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="412"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="424"/> <source>Show the application's About box</source> <translation type="unfinished">Afficher la zone À propos de l'application</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="417"/> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="590"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="430"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="434"/> <source>GnuPG</source> <translation type="unfinished">GnuPGGenericName</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="419"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="432"/> <source>Information about Gnupg</source> <translation type="unfinished">Informations sur Gnupg</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="423"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="437"/> <source>Translate</source> <translation type="unfinished">Traduire</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="425"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="439"/> <source>Information about translation</source> <translation type="unfinished">Informations sur la traduction</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="432"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="441"/> + <source>Translators</source> + <translation type="unfinished">Traducteurs</translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="444"/> <source>Check for Updates</source> <translation type="unfinished">Vérifier les mises à jour</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="434"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="446"/> <source>Check for updates</source> <translation type="unfinished">Vérifier les mises à jour</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="438"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="451"/> <source>Open Wizard</source> <translation type="unfinished">Ouvrir l'assistant</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="439"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="453"/> <source>Open the wizard</source> <translation type="unfinished">Ouvrir l'assistant</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="444"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="458"/> <source>Append Public Key to Editor</source> <translation type="unfinished">Ajouter la clé publique à l'éditeur</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="446"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="460"/> <source>Append selected Keypair's Public Key to Editor</source> <translation type="unfinished">Ajouter la clé publique de la paire de clés sélectionnée à l'éditeur</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="451"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="465"/> <source>Append Create DateTime to Editor</source> <translation type="unfinished">Ajouter Créer DateTime à l'éditeur</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="453"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="467"/> <source>Append selected Key's creation date and time to Editor</source> <translation type="unfinished">Ajouter la date et l'heure de création de la clé sélectionnée à l'éditeur</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="458"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="472"/> <source>Append Expire DateTime to Editor</source> <translation type="unfinished">Ajouter la date d'expiration à l'éditeur</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="460"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="474"/> <source>Append selected Key's expiration date and time to Editor</source> <translation type="unfinished">Ajouter la date et l'heure d'expiration de la clé sélectionnée à l'éditeur</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="465"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="479"/> <source>Append Fingerprint to Editor</source> <translation type="unfinished">Ajouter l'empreinte digitale à l'éditeur</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="467"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="481"/> <source>Append selected Key's Fingerprint to Editor</source> <translation type="unfinished">Ajouter l'empreinte digitale de la clé sélectionnée à l'éditeur</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="471"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="485"/> <source>Copy Email</source> <translation type="unfinished">Copier l'e-mail</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="473"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="487"/> <source>Copy selected Keypair's to clipboard</source> <translation type="unfinished">Copier les paires de clés sélectionnées dans le presse-papiers</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="478"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="492"/> <source>Copy Default UID</source> <translation type="unfinished">Copier l'UID par défaut</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="480"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="494"/> <source>Copy selected Keypair's default UID to clipboard</source> <translation type="unfinished">Copiez l'UID par défaut de la paire de clés sélectionnée dans le presse-papiers</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="484"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="498"/> <source>Copy Key ID</source> <translation type="unfinished">Copier l'ID de clé</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="486"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="500"/> <source>Copy selected Keypair's ID to clipboard</source> <translation type="unfinished">Copier l'ID de la paire de clés sélectionnée dans le presse-papiers</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="490"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="504"/> <source>Show Key Details</source> <translation type="unfinished">Afficher les détails clés</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="491"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="505"/> <source>Show Details for this Key</source> <translation type="unfinished">Afficher les détails de cette clé</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="495"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="509"/> <source>Add To Favourite</source> <translation type="unfinished">Ajouter aux favoris</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="496"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="510"/> <source>Add this key to Favourite Table</source> <translation type="unfinished">Ajouter cette clé au tableau des favoris</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="502"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="516"/> <source>Remove From Favourite</source> <translation type="unfinished">Supprimer des favoris</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="504"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="518"/> <source>Remove this key from Favourite Table</source> <translation type="unfinished">Supprimer cette clé du tableau des favoris</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="510"/> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="511"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="524"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="525"/> <source>Set Owner Trust Level</source> <translation type="unfinished">Définir le niveau de confiance du propriétaire</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="530"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="544"/> <source>Remove PGP Header</source> <translation type="unfinished">Supprimer l'en-tête PGP</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="534"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="548"/> <source>Add PGP Header</source> <translation type="unfinished">Ajouter un en-tête PGP</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="553"/> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="636"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="567"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="658"/> <source>Edit</source> <translation type="unfinished">Éditer</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="571"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="585"/> <source>Crypt</source> <translation type="unfinished">Crypte</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="581"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="595"/> <source>Keys</source> <translation type="unfinished">Clés</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="582"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="596"/> <source>Import Key</source> <translation type="unfinished">Importer la clé</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="598"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="604"/> + <source>Advance</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="612"/> <source>Steganography</source> <translation type="unfinished">Stéganographie</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="602"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="616"/> <source>View</source> <translation type="unfinished">Vue</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="604"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="618"/> <source>Help</source> <translation type="unfinished">Aider</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="621"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="643"/> <source>Operations</source> <translation type="unfinished">Opérations</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="631"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="653"/> <source>Key</source> <translation type="unfinished">Clé</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="644"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="666"/> <source>Special Edit</source> <translation type="unfinished">Édition spéciale</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="656"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="678"/> <source>Import key from...</source> <translation type="unfinished">Importer la clé de...</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="657"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="679"/> <source>Import key</source> <translation type="unfinished">Importer la clé</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="673"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="695"/> <source>Ready</source> <translation type="unfinished">Prêt</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="680"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="702"/> <source>Key ToolBox</source> <translation type="unfinished">Boîte à outils clé</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="688"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="710"/> <source>Default</source> <translation type="unfinished">Défaut</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="696"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="718"/> <source>Favourite</source> <translation type="unfinished">Préféré</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="704"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="726"/> <source>Only Public Key</source> <translation type="unfinished">Clé publique uniquement</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="714"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="736"/> <source>Has Private Key</source> <translation type="unfinished">Possède une clé privée</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="728"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="750"/> <source>Information Board</source> <translation type="unfinished">Tableau d'information</translation> </message> </context> <context> + <name>GpgFrontend::UI::ModuleControllerDialog</name> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="49"/> + <source>Module Informations</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="50"/> + <source>Actions</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="51"/> + <source>Show Mods Directory</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="53"/> + <source>Registered Modules</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="54"/> + <source>Global Register Table</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="55"/> + <source>Debugger</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="58"/> + <source>Tips: Module name front with "*" stands for integrated module.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="60"/> + <source>Module Controller</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="84"/> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="184"/> + <source>Enable Auto Activate</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="133"/> + <source>BASIC INFO</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="135"/> + <source>ID</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="137"/> + <source>Version</source> + <translation type="unfinished">Version</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="139"/> + <source>SDK Version</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="141"/> + <source>Qt ENV Version</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="143"/> + <source>Hash</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="144"/> + <source>Path</source> + <translation type="unfinished">Chemin d'accès</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="148"/> + <source>Auto Activate</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="149"/> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="151"/> + <source>True</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="149"/> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="151"/> + <source>False</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="150"/> + <source>Active</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="155"/> + <source>METADATA</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="171"/> + <source>Listening Event</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="180"/> + <source>Deactivate</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="181"/> + <source>Activate</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="183"/> + <source>Disable Auto Activate</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>GpgFrontend::UI::NetworkTab</name> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="71"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="72"/> <source>Proxy</source> <translation type="unfinished">Procuration</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="72"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="73"/> <source>Network Ability</source> <translation type="unfinished">Capacité de réseau</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="73"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="74"/> <source>Operations</source> <translation type="unfinished">Opérations</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="75"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="76"/> <source>Enable Proxy</source> <translation type="unfinished">Activer le proxy</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="76"/> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="79"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="77"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="80"/> <source>Port</source> <translation type="unfinished">Port</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="78"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="79"/> <source>Host Address</source> <translation type="unfinished">Adresse de l'hôte</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="80"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="81"/> <source>Proxy Type</source> <translation type="unfinished">Type de proxy</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="81"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="82"/> <source>Username</source> <translation type="unfinished">Nom d'utilisateur</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="82"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="83"/> <source>Password</source> <translation type="unfinished">Mot de passe</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="85"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="86"/> <source>Apply Proxy Settings and Check Proxy Connection</source> <translation type="unfinished">Appliquer les paramètres proxy et vérifier la connexion proxy</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="88"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="89"/> <source>Forbid all GnuPG network connection.</source> <translation type="unfinished">Interdire toute connexion réseau GnuPG.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="90"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="93"/> <source>Prohibit checking for version updates when the program starts.</source> <translation type="unfinished">Interdire la vérification des mises à jour de version lorsque le programme démarre.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="92"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="96"/> <source>Automatically import a missing key for signature verification.</source> <translation type="unfinished">Importez automatiquement une clé manquante pour la vérification de la signature.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="94"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="98"/> <source>Tips: These Option Changes take effect only after the application restart.</source> <translation type="unfinished">Conseils : Ces modifications d'options ne prennent effet qu'après le redémarrage de l'application.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="170"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="173"/> <source>Test Server Url Accessibility</source> <translation type="unfinished">Tester l'accessibilité de l'URL du serveur</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="171"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="174"/> <source>Server Url</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="181"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="184"/> <source>Success</source> <translation type="unfinished">Succès</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="182"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="185"/> <source>Successfully connect to the target server through the proxy server.</source> <translation type="unfinished">Connectez-vous avec succès au serveur cible via le serveur proxy.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="186"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="189"/> <source>Failed</source> <translation type="unfinished">Échoué</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="187"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="190"/> <source>Unable to connect to the target server through the proxy server. Proxy settings may be invalid.</source> <translation type="unfinished">Impossible de se connecter au serveur cible via le serveur proxy. Les paramètres de proxy peuvent être invalides.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="197"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="200"/> <source>Test Proxy Server Connection...</source> <translation type="unfinished">Tester la connexion au serveur proxy...</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="198"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="201"/> <source>Is using your proxy settings to access the url. Note that this test operation will apply your proxy settings to the entire software.</source> <translation type="unfinished">Utilise vos paramètres de proxy pour accéder à l'URL. Notez que cette opération de test appliquera vos paramètres de proxy à l'ensemble du logiciel.</translation> </message> @@ -4942,37 +5198,37 @@ If Data And Signature is COMBINED within a single file, KEEP THIS EMPTY: </sourc <context> <name>GpgFrontend::UI::SettingsDialog</name> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="54"/> + <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="53"/> <source>General</source> <translation type="unfinished">Général</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="55"/> + <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="54"/> <source>Appearance</source> <translation type="unfinished">Apparence</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="56"/> + <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="55"/> <source>Key Server</source> <translation type="unfinished">Serveur de clés</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="57"/> + <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="56"/> <source>Network</source> <translation type="unfinished">Réseau</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="68"/> + <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="67"/> <source>Settings</source> <translation type="unfinished">Paramètres</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="72"/> + <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="71"/> <source>Preference</source> <translation type="unfinished">Préférence</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="128"/> + <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="124"/> <source>System Default</source> <translation type="unfinished">Défaillance du système</translation> </message> @@ -5215,7 +5471,7 @@ If Data And Signature is COMBINED within a single file, KEEP THIS EMPTY: </sourc <context> <name>GpgFrontend::UI::TranslatorsTab</name> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="131"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="145"/> <source>If you think there are any problems with the translation, why not participate in the translation work? If you want to participate, please read the document or contact me via email.</source> <translation type="unfinished">Si vous pensez qu'il y a des problèmes avec la traduction, pourquoi ne pas participer au travail de traduction ? Si vous souhaitez participer, veuillez lire le document ou me contacter par e-mail.</translation> </message> @@ -5223,63 +5479,63 @@ If Data And Signature is COMBINED within a single file, KEEP THIS EMPTY: </sourc <context> <name>GpgFrontend::UI::UpdateTab</name> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="154"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="163"/> <source>It is recommended that you always check the version of GpgFrontend and upgrade to the latest version.</source> <translation type="unfinished">Il est recommandé de toujours vérifier la version de GpgFrontend et de passer à la dernière version.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="157"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="166"/> <source>New versions not only represent new features, but also often represent functional and security fixes.</source> <translation type="unfinished">Les nouvelles versions ne représentent pas seulement de nouvelles fonctionnalités, mais représentent également souvent des correctifs fonctionnels et de sécurité.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="163"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="172"/> <source>Current Version</source> <translation type="unfinished">Version actuelle</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="164"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="173"/> <source>: </source> <translation type="unfinished">:</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="246"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="248"/> <source>Latest Version From Github</source> <translation type="unfinished">Dernière version de Github</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="252"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="254"/> <source>The current version is less than the latest version on github.</source> <translation type="unfinished">La version actuelle est inférieure à la dernière version sur github.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="254"/> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="265"/> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="277"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="256"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="267"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="279"/> <source>Please click</source> <translation type="unfinished">Cliquez s'il vous plait</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="257"/> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="268"/> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="280"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="259"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="270"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="282"/> <source>Here</source> <translation type="unfinished">Ici</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="257"/> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="268"/> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="280"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="259"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="270"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="282"/> <source>to download the latest stable version.</source> <translation type="unfinished">pour télécharger la dernière version stable.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="263"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="265"/> <source>This version has serious problems and has been withdrawn. Please stop using it immediately.</source> <translation type="unfinished">Cette version a de sérieux problèmes et a été retirée. Veuillez cesser de l'utiliser immédiatement.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="274"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="276"/> <source>This version has not been released yet, it may be a beta version. If you are not a tester and care about version stability, please do not use this version.</source> <translation type="unfinished">Cette version n'est pas encore sortie, il s'agit peut-être d'une version bêta. Si vous n'êtes pas un testeur et que vous vous souciez de la stabilité de la version, veuillez ne pas utiliser cette version.</translation> </message> @@ -5476,7 +5732,7 @@ If Data And Signature is COMBINED within a single file, KEEP THIS EMPTY: </sourc <context> <name>GpgFrontend::UI::Wizard</name> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="44"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="43"/> <source>First Start Wizard</source> <translation type="unfinished">Assistant de premier démarrage</translation> </message> @@ -5517,17 +5773,17 @@ If Data And Signature is COMBINED within a single file, KEEP THIS EMPTY: </sourc <context> <name>QCoreApplication</name> <message> - <location filename="../../../../src/cmd.cpp" line="49"/> + <location filename="../../../../src/cmd.cpp" line="47"/> <source>This is free software; see the source for copying conditions.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/cmd.cpp" line="54"/> + <location filename="../../../../src/cmd.cpp" line="52"/> <source>Build DateTime: </source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/cmd.cpp" line="55"/> + <location filename="../../../../src/cmd.cpp" line="54"/> <source>Build Version: </source> <translation type="unfinished"></translation> </message> @@ -5537,27 +5793,27 @@ If Data And Signature is COMBINED within a single file, KEEP THIS EMPTY: </sourc <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/GpgFrontendUIInit.cpp" line="54"/> + <location filename="../../../../src/ui/GpgFrontendUIInit.cpp" line="56"/> <source>Loading Gnupg Info...</source> <translation type="unfinished">Chargement des informations sur Gnupg...</translation> </message> <message> - <location filename="../../../../src/ui/GpgFrontendUIInit.cpp" line="55"/> + <location filename="../../../../src/ui/GpgFrontendUIInit.cpp" line="57"/> <source>If this process is too slow, please set the key server address appropriately in the gnupg configuration file (depending on the network situation in your country or region).</source> <translation type="unfinished">Si ce processus est trop lent, veuillez définir l'adresse du serveur de clés de manière appropriée dans le fichier de configuration gnupg (en fonction de la situation du réseau dans votre pays ou région).</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="63"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="64"/> <source>Show Verify Details</source> <translation type="unfinished">Afficher les détails de vérification</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="71"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="72"/> <source>Public key not found locally</source> <translation type="unfinished">Clé publique introuvable localement</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="72"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="73"/> <source>There is no target public key content in local for GpgFrontend to gather enough information about this Signature. Do you want to import the public key from Keyserver now?</source> <translation type="unfinished">Il n'y a pas de contenu de clé publique cible en local pour que GpgFrontend recueille suffisamment d'informations sur cette signature. Voulez-vous importer la clé publique depuis Keyserver maintenant ?</translation> </message> @@ -5615,20 +5871,30 @@ If Data And Signature is COMBINED within a single file, KEEP THIS EMPTY: </sourc <translation type="unfinished">Succès</translation> </message> <message> - <location filename="../../../../src/core/GpgCoreInit.cpp" line="294"/> + <location filename="../../../../src/core/GpgCoreInit.cpp" line="303"/> <source>GpgME initiation failed</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/core/GpgCoreInit.cpp" line="397"/> + <location filename="../../../../src/core/GpgCoreInit.cpp" line="409"/> <source>GpgME Context initiation failed</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/core/GpgCoreInit.cpp" line="406"/> + <location filename="../../../../src/core/GpgCoreInit.cpp" line="418"/> <source>Gpg Key Detabase initiation failed</source> <translation type="unfinished"></translation> </message> + <message> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="486"/> + <source>Sync All Public Key</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="487"/> + <source>You have not checked any public keys that you want to synchronize, do you want to synchronize all local public keys from the key server?</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>QObject</name> diff --git a/resource/lfs/locale/ts/GpgFrontend.it_IT.ts b/resource/lfs/locale/ts/GpgFrontend.it_IT.ts index 1024f4a1..b7ca3451 100644 --- a/resource/lfs/locale/ts/GpgFrontend.it_IT.ts +++ b/resource/lfs/locale/ts/GpgFrontend.it_IT.ts @@ -217,12 +217,12 @@ </message> <message> <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="105"/> - <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="109"/> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="107"/> <source>Sign Date</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="130"/> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="128"/> <source>Signer</source> <translation type="unfinished">Firmatario</translation> </message> @@ -246,23 +246,23 @@ <translation type="unfinished">UTC</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="109"/> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="107"/> <source>Localized</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="124"/> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="122"/> <source>Invalid Signers</source> <translation type="unfinished">Firmatori non validi</translation> </message> <message> <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="98"/> - <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="132"/> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="130"/> <source>Fingerprint</source> <translation type="unfinished">Impronta digitale</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="134"/> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="132"/> <source>Reason</source> <translation type="unfinished">Motivo</translation> </message> @@ -286,126 +286,126 @@ </message> <message> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="57"/> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="61"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="60"/> <source>Signed On</source> <translation type="unfinished">Firmato su</translation> </message> <message> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="57"/> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="192"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="191"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="237"/> <source>UTC</source> <translation type="unfinished">UTC</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="61"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="60"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="194"/> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="239"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="240"/> <source>Localized</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="64"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="63"/> <source>Signatures List</source> <translation type="unfinished">Elenco firme</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="71"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="70"/> <source>Signature [%1]:</source> <translation type="unfinished">Firma [%1]:</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="72"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="71"/> <source>Status</source> <translation type="unfinished">Stato</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="75"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="74"/> <source>A Bad Signature.</source> <translation type="unfinished">Una pessima firma.</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="77"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="76"/> <source>This Signature is invalid.</source> <translation type="unfinished">Questa firma non è valida.</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="82"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="81"/> <source>A</source> <translation type="unfinished">UN</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="84"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="83"/> <source>Good</source> <translation type="unfinished">Bene</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="87"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="86"/> <source>Bad</source> <translation type="unfinished">Cattivo</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="90"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="89"/> <source>Expired</source> <translation type="unfinished">Scaduto</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="93"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="92"/> <source>Missing Key's</source> <translation type="unfinished">Chiavi mancanti</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="96"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="95"/> <source>Revoked Key's</source> <translation type="unfinished">Chiavi revocate</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="99"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="98"/> <source>Expired Key's</source> <translation type="unfinished">Chiavi scadute</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="102"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="101"/> <source>Missing CRL's</source> <translation type="unfinished">CRL mancanti</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="106"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="105"/> <source>Signature Fully Valid.</source> <translation type="unfinished">Firma pienamente valida.</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="108"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="107"/> <source>Signature Not Fully Valid.</source> <translation type="unfinished">Firma non completamente valida.</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="109"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="108"/> <source>Tips</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="110"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="109"/> <source>Adjust Trust Level to make it Fully Vaild</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="184"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="183"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="228"/> <source>Fingerprint</source> <translation type="unfinished">Impronta digitale</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="186"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="185"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="229"/> <source><unknown></source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="192"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="191"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="194"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="237"/> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="239"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="240"/> <source>Sign Date</source> <translation type="unfinished"></translation> </message> @@ -431,47 +431,47 @@ <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="117"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="116"/> <source>Key is NOT present with ID 0x</source> <translation type="unfinished">La chiave NON è presente con ID 0x</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="126"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="125"/> <source>A signature could NOT be verified due to a Missing Key</source> <translation type="unfinished">NON è stato possibile verificare una firma a causa di una Chiave Mancante</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="132"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="131"/> <source>A signature is valid but the key used to verify the signature has been revoked</source> <translation type="unfinished">Una firma è valida ma la chiave utilizzata per verificare la firma è stata revocata</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="141"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="140"/> <source>A signature is valid but expired</source> <translation type="unfinished">Una firma è valida ma è scaduta</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="148"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="147"/> <source>A signature is valid but the key used to verify the signature has expired.</source> <translation type="unfinished">Una firma è valida ma la chiave utilizzata per verificare la firma è scaduta.</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="156"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="155"/> <source>There was some other error which prevented the signature verification.</source> <translation type="unfinished">Si è verificato un altro errore che ha impedito la verifica della firma.</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="164"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="163"/> <source>Error for key with fingerprint</source> <translation type="unfinished">Errore per chiave con impronta digitale</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="175"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="174"/> <source>Could not find information that can be used for verification.</source> <translation type="unfinished">Impossibile trovare informazioni che possono essere utilizzate per la verifica.</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="184"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="183"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="205"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="228"/> <source>Signed By</source> @@ -482,13 +482,13 @@ <translation type="obsolete">Sconosciuto</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="189"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="188"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="234"/> <source>Public Key Algo</source> <translation type="unfinished">Algoritmo a chiave pubblica</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="191"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="190"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="236"/> <source>Hash Algo</source> <translation type="unfinished">Hash Algo</translation> @@ -499,27 +499,72 @@ </message> </context> <context> + <name>GpgFrontend::Module::GlobalRegisterTable</name> + <message> + <location filename="../../../../src/core/module/GlobalRegisterTable.cpp" line="47"/> + <source>NODE</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/module/GlobalRegisterTable.cpp" line="82"/> + <source>LEAF</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::Module::GlobalRegisterTableTreeModel::Impl</name> + <message> + <location filename="../../../../src/core/module/GlobalRegisterTable.cpp" line="193"/> + <source><EMPTY></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/module/GlobalRegisterTable.cpp" line="232"/> + <source><UNSUPPORTED></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/module/GlobalRegisterTable.cpp" line="267"/> + <source>Key</source> + <translation type="unfinished">Chiave</translation> + </message> + <message> + <location filename="../../../../src/core/module/GlobalRegisterTable.cpp" line="269"/> + <source>Type</source> + <translation type="unfinished">Tipo</translation> + </message> + <message> + <location filename="../../../../src/core/module/GlobalRegisterTable.cpp" line="271"/> + <source>Value Type</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/module/GlobalRegisterTable.cpp" line="273"/> + <source>Value</source> + <translation type="unfinished">Valore</translation> + </message> +</context> +<context> <name>GpgFrontend::Module::Integrated::GnuPGInfoGatheringModule::GnuPGInfoGatheringModule</name> <message> - <location filename="../../../../src/module/integrated/gnupg_info_gathering_module/GnuPGInfoGatheringModule.cpp" line="123"/> <source>Embedded In</source> - <translation type="unfinished">Incorporato in</translation> + <translation type="obsolete">Incorporato in</translation> </message> </context> <context> <name>GpgFrontend::UI::AboutDialog</name> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="44"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="41"/> <source>About</source> <translation type="unfinished">Informazioni</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="52"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="47"/> <source>About GpgFrontend</source> <translation type="unfinished">Informazioni su GpgFrontend</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="53"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="51"/> <source>GnuPG</source> <translation type="unfinished">GnuPG</translation> </message> @@ -529,7 +574,7 @@ <translation type="unfinished">Traduttori</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="55"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="58"/> <source>Update</source> <translation type="unfinished">Aggiorna</translation> </message> @@ -537,131 +582,156 @@ <context> <name>GpgFrontend::UI::AppearanceTab</name> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="42"/> <source>Icon Size</source> - <translation type="unfinished">Dimensione dell'icona</translation> + <translation type="obsolete">Dimensione dell'icona</translation> </message> <message> <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="43"/> + <source>General</source> + <translation type="unfinished">Generale</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="45"/> + <source>Theme</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="49"/> + <source>Toolbar Icon</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="51"/> + <source>Size</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="52"/> <source>small</source> <translation type="unfinished">piccolo</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="44"/> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="53"/> <source>medium</source> <translation type="unfinished">medio</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="45"/> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="54"/> <source>large</source> <translation type="unfinished">grande</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="47"/> <source>Icon Style</source> - <translation type="unfinished">Stile icona</translation> + <translation type="obsolete">Stile icona</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="48"/> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="57"/> <source>just text</source> <translation type="unfinished">solo testo</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="49"/> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="58"/> <source>just icons</source> <translation type="unfinished">solo icone</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="50"/> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="59"/> <source>text and icons</source> <translation type="unfinished">testo e icone</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="52"/> <source>Window State</source> - <translation type="unfinished">Stato della finestra</translation> + <translation type="obsolete">Stato della finestra</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="54"/> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="47"/> <source>Save window size and position on exit.</source> <translation type="unfinished">Salva le dimensioni e la posizione della finestra all'uscita.</translation> </message> <message> <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="56"/> + <source>Style</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="61"/> + <source>Font Size</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="63"/> <source>Text Editor</source> <translation type="unfinished">Editor di testo</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="57"/> <source>Font Size in Text Editor</source> - <translation type="unfinished">Dimensione carattere nell'editor di testo</translation> + <translation type="obsolete">Dimensione carattere nell'editor di testo</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="59"/> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="64"/> <source>Information Board</source> <translation type="unfinished">Scheda informativa</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="61"/> <source>Font Size in Information Board</source> - <translation type="unfinished">Dimensione carattere nella bacheca informativa</translation> + <translation type="obsolete">Dimensione carattere nella bacheca informativa</translation> </message> </context> <context> <name>GpgFrontend::UI::ChoosePage</name> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="112"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="107"/> <source>Choose your action...</source> <translation type="unfinished">Scegli la tua azione...</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="113"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="108"/> <source>...by clicking on the appropriate link.</source> <translation type="unfinished">...cliccando sul collegamento appropriato.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="116"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="111"/> <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">Se non hai mai usato GpgFrontend prima e non possiedi ancora una chiave gpg potresti voler leggere come</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="120"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="114"/> <source>Generate Key</source> <translation type="unfinished">Genera chiave</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="127"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="121"/> <source>If you want to learn how to encrypt, decrypt, sign and verify text, you can read </source> <translation type="unfinished">Se vuoi imparare a crittografare, decifrare, firmare e verificare il testo, puoi leggere </translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="132"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="124"/> <source>Encrypt & Decrypt Text</source> <translation type="unfinished">Crittografa e decifra il testo</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="132"/> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="148"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="124"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="136"/> <source>or</source> <translation type="unfinished">o</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="136"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="126"/> <source>Sign & Verify Text</source> <translation type="unfinished">Firma e verifica il testo</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="144"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="134"/> <source>If you want to operate file, you can read </source> <translation type="unfinished">Se vuoi operare su file, puoi leggere </translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="148"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="136"/> <source>Encrypt & Sign File</source> <translation type="unfinished">Crittografa e firma file</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="152"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="138"/> <source>Sign & Verify File</source> <translation type="unfinished">Firma e verifica file</translation> </message> @@ -669,12 +739,12 @@ <context> <name>GpgFrontend::UI::CommonUtils</name> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="185"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="186"/> <source>GnuPG Context Loading Failed</source> <translation type="unfinished">Caricamento del contesto GnuPG non riuscito</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="187"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="188"/> <source>Gnupg(gpg) is not installed correctly, please follow <a href='https://www.gpgfrontend.bktus.com/#/faq?id=how-to-deal-with-39env-loading-failed39'>this notes</a> in FAQ to install Gnupg and then open GpgFrontend. <br />Or, you can open GnuPG Controller to set a custom GnuPG which GpgFrontend should use. Then, GpgFrontend will restart. <br /><br />Breif Reason: %1</source> <translation type="unfinished"></translation> </message> @@ -683,29 +753,29 @@ <translation type="obsolete">Nessuna chiave trovata da importare</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="445"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="450"/> <source>Timeout</source> <translation type="unfinished">Tempo scaduto</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="250"/> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="381"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="251"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="382"/> <source>Success</source> <translation type="unfinished">Successo</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="251"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="252"/> <source>Gpg Operation succeed.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="261"/> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="373"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="262"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="374"/> <source>Failure</source> <translation type="unfinished">Fallimento</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="262"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="263"/> <source>Gpg Operation failed. Error code: %1 @@ -714,14 +784,14 @@ Description: %3</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="287"/> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="294"/> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="497"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="288"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="295"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="502"/> <source>Error</source> <translation type="unfinished">Errore</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="279"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="280"/> <source>Open Key</source> <translation type="unfinished">Chiave aperta</translation> </message> @@ -730,87 +800,87 @@ Description: %3</source> <translation type="obsolete">File chiave</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="280"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="281"/> <source>Keyring files</source> <translation type="unfinished">File portachiavi</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="288"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="289"/> <source>Cannot open this file. Please make sure that this is a regular file and it's readable.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="295"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="296"/> <source>The target file is too large for a keyring.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="301"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="302"/> <source>File Open Failed</source> <translation type="unfinished">Apertura file non riuscita</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="302"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="303"/> <source>Failed to open file: </source> <translation type="unfinished">Impossibile aprire il file: </translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="354"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="355"/> <source>Processing</source> <translation type="unfinished">In lavorazione</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="374"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="375"/> <source>Failed to execute command.</source> <translation type="unfinished">Impossibile eseguire il comando.</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="382"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="383"/> <source>Succeed in executing command.</source> <translation type="unfinished">Riuscire a eseguire il comando.</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="384"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="385"/> <source>Warning</source> <translation type="unfinished">Avvertimento</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="385"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="386"/> <source>Finished executing command.</source> <translation type="unfinished">Terminata l'esecuzione del comando.</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="406"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="407"/> <source>Default Keyserver Not Found</source> <translation type="unfinished">Keyserver predefinito non trovato</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="407"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="408"/> <source>Cannot read default keyserver from your settings, please set a default keyserver first</source> <translation type="unfinished">Impossibile leggere il server delle chiavi predefinito dalle impostazioni, impostare prima un server delle chiavi predefinito</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="442"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="447"/> <source>Key Not Found</source> <translation type="unfinished">Chiave non trovata</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="448"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="453"/> <source>Key Server Not Found</source> <translation type="unfinished">Server chiave non trovato</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="451"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="456"/> <source>Connection Error</source> <translation type="unfinished">Errore di connessione</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="462"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="467"/> <source>The key has been updated</source> <translation type="unfinished">La chiave è stata aggiornata</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="464"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="469"/> <source>No need to update the key</source> <translation type="unfinished">Non è necessario aggiornare la chiave</translation> </message> @@ -826,39 +896,43 @@ Description: %3</source> <context> <name>GpgFrontend::UI::ConclusionPage</name> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="218"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="204"/> <source>Ready.</source> <translation type="unfinished">Pronto.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="219"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="205"/> <source>Have fun with GpgFrontend!</source> <translation type="unfinished">Buon divertimento con GpgFrontend!</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="222"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="208"/> <source>You are ready to use GpgFrontend now.<br><br></source> <translation type="unfinished">Ora sei pronto per usare GpgFrontend.<br><br></translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="226"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="210"/> <source>The Online Document</source> <translation type="unfinished">Il documento online</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="227"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="211"/> <source> will get you started with GpgFrontend. Anytime you encounter problems, please try to find help from the documentation</source> <translation type="unfinished"> ti farà iniziare con GpgFrontend. Ogni volta che riscontri problemi, prova a cercare aiuto dalla documentazione</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="236"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="220"/> <source>Open offline help.</source> <translation type="unfinished">Apri la guida offline.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="239"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="224"/> + <source>Don't show the wizard again.</source> + <translation type="unfinished"></translation> + </message> + <message> <source>Dont show the wizard again.</source> - <translation type="unfinished">Non mostrare più la procedura guidata.</translation> + <translation type="obsolete">Non mostrare più la procedura guidata.</translation> </message> </context> <context> @@ -1008,128 +1082,128 @@ Description: %3</source> <context> <name>GpgFrontend::UI::FileTreeView</name> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="90"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="103"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="166"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="212"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="234"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="275"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="92"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="105"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="168"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="214"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="236"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="277"/> <source>Error</source> <translation type="unfinished">Errore</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="91"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="93"/> <source>The path is not exists, unprivileged or unreachable.</source> <translation type="unfinished">Il percorso non esiste, non privilegiato o irraggiungibile.</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="104"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="106"/> <source>The file is unprivileged or unreachable.</source> <translation type="unfinished">Il file non è privilegiato o non è raggiungibile.</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="157"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="159"/> <source>Warning</source> <translation type="unfinished">Avvertimento</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="158"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="160"/> <source>Are you sure you want to delete it?</source> <translation type="unfinished">Sei sicuro di voler cancellare?</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="167"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="169"/> <source>Unable to delete the file or folder.</source> <translation type="unfinished">Impossibile eliminare il file o la cartella.</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="176"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="189"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="178"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="191"/> <source>Make New Directory</source> <translation type="unfinished">Crea una nuova directory</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="177"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="190"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="179"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="192"/> <source>Directory Name</source> <translation type="unfinished">Nome della cartella</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="204"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="226"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="206"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="228"/> <source>Create Empty File</source> <translation type="unfinished">Crea file vuoto</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="204"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="226"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="206"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="228"/> <source>Filename (you can given extension)</source> <translation type="unfinished">Nome file (puoi dare l'estensione)</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="213"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="235"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="215"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="237"/> <source>Unable to create the file.</source> <translation type="unfinished">Impossibile creare il file.</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="267"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="298"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="269"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="300"/> <source>Rename</source> <translation type="unfinished">Rinominare</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="267"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="269"/> <source>New Filename</source> <translation type="unfinished">Nuovo nome file</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="276"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="278"/> <source>Unable to rename the file or folder.</source> <translation type="unfinished">Impossibile rinominare il file o la cartella.</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="293"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="295"/> <source>Open</source> <translation type="unfinished">Apri</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="303"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="305"/> <source>Delete</source> <translation type="unfinished">Elimina</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="308"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="310"/> <source>Calculate Hash</source> <translation type="unfinished">Calcola hash</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="313"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="315"/> <source>Directory</source> <translation type="unfinished">Cartella</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="318"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="320"/> <source>File</source> <translation type="unfinished">File</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="323"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="325"/> <source>Compress...</source> <translation type="unfinished">Comprimi...</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="330"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="332"/> <source>Open with Default System Application</source> <translation type="unfinished">Apri con l'applicazione di sistema predefinita</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="335"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="337"/> <source>New</source> <translation type="unfinished">Nuovo</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="393"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="395"/> <source>Calculating</source> <translation type="unfinished"></translation> </message> @@ -1231,17 +1305,17 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::GnuPGControllerDialog</name> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="45"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="45"/> <source>General</source> <translation type="unfinished">Generale</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="46"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="46"/> <source>Key Database</source> <translation type="unfinished">Database delle chiavi</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="47"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="47"/> <source>Advanced</source> <translation type="unfinished">Avanzate</translation> </message> @@ -1250,70 +1324,79 @@ This will result in loss of all cached form positions, statuses, key servers, et <translation type="obsolete">Nessuna modalità ASCII</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="49"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="49"/> <source>Use Binary Mode for File Operations</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="51"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="51"/> <source>Use Pinentry as Password Input Dialog</source> <translation type="unfinished">Usa Pinentry come finestra di dialogo per l'inserimento della password</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="52"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="52"/> <source>Enable GpgME Debug Log</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="53"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="53"/> <source>Use Custom GnuPG</source> <translation type="unfinished">Usa GnuPG personalizzato</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="54"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="54"/> <source>Select GnuPG Path</source> <translation type="unfinished">Seleziona Percorso GnuPG</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="56"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="56"/> <source>Use Custom GnuPG Key Database Path</source> <translation type="unfinished">Usa il percorso del database delle chiavi GnuPG personalizzato</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="58"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="58"/> <source>Select Key Database Path</source> <translation type="unfinished">Seleziona il percorso del database delle chiavi</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="60"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="60"/> <source>Restart Gpg Agent on start</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="64"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="62"/> + <source>Kill all gnupg daemon at close</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="66"/> + <source>Tips: please select a directory where "gpgconf" is located in.</source> + <translation type="unfinished"></translation> + </message> + <message> <source>Tips: please select a directroy where "gpgconf" is located in.</source> - <translation type="unfinished">Suggerimenti: seleziona una directory in cui si trova "gpgconf".</translation> + <translation type="obsolete">Suggerimenti: seleziona una directory in cui si trova "gpgconf".</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="66"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="68"/> <source>Tips: notice that modify any of these settings will cause an Application restart.</source> <translation type="unfinished">Suggerimenti: si noti che la modifica di una qualsiasi di queste impostazioni provocherà il riavvio dell'applicazione.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="98"/> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="118"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="100"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="120"/> <source>Open Directory</source> <translation type="unfinished">Apri Rubrica</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="171"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="173"/> <source>GnuPG Controller</source> <translation type="unfinished">Controllore GnuPG</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="356"/> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="363"/> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="375"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="364"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="371"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="383"/> <source>Illegal GnuPG Path</source> <translation type="unfinished">Percorso GnuPG illegale</translation> </message> @@ -1322,22 +1405,22 @@ This will result in loss of all cached form positions, statuses, key servers, et <translation type="obsolete">Il percorso GnuPG di destinazione è vuoto.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="357"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="365"/> <source>Target GnuPG Path is not an exists readable directory.</source> <translation type="unfinished">Target GnuPG Path non è una directory leggibile esistente.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="364"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="372"/> <source>Target GnuPG Path is not an absolute path.</source> <translation type="unfinished">Target GnuPG Path non è un percorso assoluto.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="376"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="384"/> <source>Target GnuPG Path contains no "gpgconf" executable.</source> <translation type="unfinished">Il percorso GnuPG di destinazione non contiene l&#39;eseguibile &quot;gpgconf&quot;.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="389"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="397"/> <source>Illegal GnuPG Key Database Path</source> <translation type="unfinished">Percorso illegale del database delle chiavi GnuPG</translation> </message> @@ -1346,7 +1429,7 @@ This will result in loss of all cached form positions, statuses, key servers, et <translation type="obsolete">Il percorso del database delle chiavi GnuPG di destinazione è vuoto.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="390"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="398"/> <source>Target GnuPG Key Database Path is not an exists readable directory.</source> <translation type="unfinished">Il percorso del database delle chiavi di GnuPG di destinazione non è una directory leggibile esistente.</translation> </message> @@ -1354,53 +1437,53 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::GnupgTab</name> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="44"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="46"/> <source>Name</source> <translation type="unfinished">Nome</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="44"/> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="90"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="46"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="92"/> <source>Description</source> <translation type="unfinished">Descrizione</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="44"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="46"/> <source>Version</source> <translation type="unfinished">Versione</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="45"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="47"/> <source>Checksum</source> <translation type="unfinished">Somma di controllo</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="45"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="47"/> <source>Binary Path</source> <translation type="unfinished">Percorso binario</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="47"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="49"/> <source>Components</source> <translation type="unfinished">Componenti</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="48"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="50"/> <source>Directories</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="49"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="51"/> <source>Options</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="68"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="70"/> <source>Directory Type</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="68"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="70"/> <source>Path</source> <translation type="unfinished"></translation> </message> @@ -1409,27 +1492,27 @@ This will result in loss of all cached form positions, statuses, key servers, et <translation type="obsolete">Configurazioni</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="89"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="91"/> <source>Component</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="89"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="91"/> <source>Group</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="89"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="91"/> <source>Key</source> <translation type="unfinished">Chiave</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="90"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="92"/> <source>Default Value</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="91"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="93"/> <source>Value</source> <translation type="unfinished">Valore</translation> </message> @@ -1437,22 +1520,22 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::GpgFrontendApplication</name> <message> - <location filename="../../../../src/ui/GpgFrontendApplication.cpp" line="64"/> + <location filename="../../../../src/ui/GpgFrontendApplication.cpp" line="62"/> <source>Standard Exception Thrown</source> <translation type="unfinished">Eccezione standard lanciata</translation> </message> <message> - <location filename="../../../../src/ui/GpgFrontendApplication.cpp" line="65"/> + <location filename="../../../../src/ui/GpgFrontendApplication.cpp" line="63"/> <source>Oops, an standard exception was thrown during the running of the program. This is not a serious problem, it may be the negligence of the programmer, please report this problem if you can.</source> <translation type="unfinished">Spiacenti, è stata generata un'eccezione standard durante l'esecuzione del programma. Questo non è un problema serio, potrebbe essere la negligenza del programmatore, per favore segnala questo problema se puoi.</translation> </message> <message> - <location filename="../../../../src/ui/GpgFrontendApplication.cpp" line="73"/> + <location filename="../../../../src/ui/GpgFrontendApplication.cpp" line="71"/> <source>Unhandled Exception Thrown</source> <translation type="unfinished">Eccezione non gestita generata</translation> </message> <message> - <location filename="../../../../src/ui/GpgFrontendApplication.cpp" line="74"/> + <location filename="../../../../src/ui/GpgFrontendApplication.cpp" line="72"/> <source>Oops, an unhandled exception was thrown during the running of the program. This is not a serious problem, it may be the negligence of the programmer, please report this problem if you can.</source> <translation type="unfinished">Spiacenti, è stata generata un'eccezione non gestita durante l'esecuzione del programma. Questo non è un problema serio, potrebbe essere la negligenza del programmatore, per favore segnala questo problema se puoi.</translation> </message> @@ -1498,37 +1581,37 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::InfoTab</name> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="89"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="102"/> <source>GpgFrontend is an easy-to-use, compact, cross-platform, and installation-free GnuPG Frontend.It visualizes most of the common operations of GnuPG.GpgFrontend is licensed under the GPLv3</source> <translation type="unfinished">GpgFrontend è un frontend GnuPG facile da usare, compatto, multipiattaforma e senza installazione. Visualizza la maggior parte delle operazioni comuni di GnuPG. GpgFrontend è concesso in licenza sotto GPLv3</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="95"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="108"/> <source>Developer:</source> <translation type="unfinished">Sviluppatore:</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="96"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="109"/> <source>If you have any questions or suggestions, raise an issue at</source> <translation type="unfinished">Se hai domande o suggerimenti, solleva un problema su</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="99"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="112"/> <source>or send a mail to my mailing list at</source> <translation type="unfinished">o invia una mail alla mia mailing list a</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="101"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="114"/> <source>Built with Qt</source> <translation type="unfinished">Costruito con Qt</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="102"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="115"/> <source>and</source> <translation type="unfinished">e</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="103"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="116"/> <source>Built at</source> <translation type="unfinished">Costruito a</translation> </message> @@ -1536,42 +1619,58 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::IntroPage</name> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="74"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="71"/> <source>Getting Started...</source> <translation type="unfinished">Iniziamo...</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="75"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="72"/> <source>... with GpgFrontend</source> <translation type="unfinished">... con GpgFrontend</translation> </message> <message> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="75"/> + <source>Welcome to GpgFrontend for decrypting and signing text or files!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="77"/> + <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/dialog/Wizard.cpp" line="79"/> - <source>Welcome to use GpgFrontend for decrypting and signing text or file!</source> - <translation type="unfinished">Benvenuto nell'uso di GpgFrontend per decifrare e firmare testo o file!</translation> + <source>To get started, be sure to check out the</source> + <translation type="unfinished"></translation> </message> <message> <location filename="../../../../src/ui/dialog/Wizard.cpp" line="82"/> + <source>by clicking the link, the page will open in your web browser</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Welcome to use GpgFrontend for decrypting and signing text or file!</source> + <translation type="obsolete">Benvenuto nell'uso di GpgFrontend per decifrare e firmare testo o file!</translation> + </message> + <message> <source>is a Powerful, Easy-to-Use, Compact, Cross-Platform, and Installation-Free OpenPGP Crypto Tool.</source> - <translation type="unfinished">è uno strumento crittografico OpenPGP potente, facile da usare, compatto, multipiattaforma e senza installazione.</translation> + <translation type="obsolete">è uno strumento crittografico OpenPGP potente, facile da usare, compatto, multipiattaforma e senza installazione.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="84"/> <source>For brief information have a look at the</source> - <translation type="unfinished">Per brevi informazioni dai un'occhiata al</translation> + <translation type="obsolete">Per brevi informazioni dai un'occhiata al</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="86"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="81"/> <source>Overview</source> <translation type="unfinished">Panoramica</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="87"/> <source>by clicking the link, the page will open in the web browser</source> - <translation type="unfinished">facendo clic sul collegamento, la pagina si aprirà nel browser web</translation> + <translation type="obsolete">facendo clic sul collegamento, la pagina si aprirà nel browser web</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="96"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="91"/> <source>If it supports the language currently being used in your system, GpgFrontend will automatically set it.</source> <translation type="unfinished">Se supporta la lingua attualmente in uso nel tuo sistema, GpgFrontend la imposterà automaticamente.</translation> </message> @@ -1627,87 +1726,87 @@ This will result in loss of all cached form positions, statuses, key servers, et <translation type="unfinished">Tempo di scadenza troppo lungo.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="151"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="152"/> <source>Generating</source> <translation type="unfinished">Generazione</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="160"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="161"/> <source>Error</source> <translation type="unfinished">Errore</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="161"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="162"/> <source>Unknown error occurred</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="197"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="198"/> <source>Key Usage</source> <translation type="unfinished">Utilizzo dei tasti</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="199"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="200"/> <source>Encryption</source> <translation type="unfinished">Crittografia</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="202"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="203"/> <source>Signing</source> <translation type="unfinished">Firma</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="205"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="206"/> <source>Certification</source> <translation type="unfinished">Certificazione</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="208"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="209"/> <source>Authentication</source> <translation type="unfinished">Autenticazione</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="435"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="436"/> <source>Name</source> <translation type="unfinished">Nome</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="436"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="437"/> <source>Email Address</source> <translation type="unfinished">Indirizzo email</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="437"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="438"/> <source>Comment</source> <translation type="unfinished">Commento</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="438"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="439"/> <source>Expiration Date</source> <translation type="unfinished">Data di scadenza</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="439"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="440"/> <source>Never Expire</source> <translation type="unfinished">Non scade mai</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="440"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="441"/> <source>KeySize (in Bit)</source> <translation type="unfinished">Dimensione chiave (in bit)</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="441"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="442"/> <source>Key Type</source> <translation type="unfinished">Tipo di chiave</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="442"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="443"/> <source>Non Pass Phrase</source> <translation type="unfinished">Non Pass Phrase</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="455"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="456"/> <source>Basic Information</source> <translation type="unfinished">Informazioni di base</translation> </message> @@ -1715,27 +1814,27 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::KeyGenPage</name> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="178"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="164"/> <source>Create a keypair...</source> <translation type="unfinished">Crea una coppia di chiavi...</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="179"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="165"/> <source>...for decrypting and signing messages</source> <translation type="unfinished">...per decifrare e firmare i messaggi</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="181"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="167"/> <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">Dovresti creare una nuova coppia di chiavi.La coppia è composta da una chiave pubblica e una privata.<br>Gli altri utenti possono utilizzare la chiave pubblica per crittografare i messaggi per te e verificare i messaggi firmati da te.Puoi utilizzare la chiave privata per decrittografare e firmare messaggi.<br>Per maggiori informazioni dai un'occhiata al tutorial offline (che poi viene mostrato nella finestra principale):</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="193"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="179"/> <source>Offline tutorial</source> <translation type="unfinished">Tutorial offline</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="197"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="183"/> <source>Create New Key</source> <translation type="unfinished">Crea nuova chiave</translation> </message> @@ -1947,42 +2046,42 @@ This will result in loss of all cached form positions, statuses, key servers, et <translation type="unfinished">Aggiornamento elenco chiavi...</translation> </message> <message> - <location filename="../../../../src/ui/widgets/KeyList.cpp" line="354"/> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="374"/> <source>Import Keys</source> <translation type="unfinished">Importa chiavi</translation> </message> <message> - <location filename="../../../../src/ui/widgets/KeyList.cpp" line="356"/> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="376"/> <source>You've dropped something on the table.</source> <translation type="unfinished">Hai lasciato cadere qualcosa sul tavolo.</translation> </message> <message> - <location filename="../../../../src/ui/widgets/KeyList.cpp" line="357"/> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="377"/> <source>GpgFrontend will now try to import key(s).</source> <translation type="unfinished">GpgFrontend ora proverà a importare le chiavi.</translation> </message> <message> - <location filename="../../../../src/ui/widgets/KeyList.cpp" line="360"/> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="380"/> <source>Always import without bothering.</source> <translation type="unfinished">Importa sempre senza preoccuparti.</translation> </message> <message> - <location filename="../../../../src/ui/widgets/KeyList.cpp" line="455"/> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="475"/> <source>Key List Refreshed.</source> <translation type="unfinished">Elenco chiavi aggiornato.</translation> </message> <message> - <location filename="../../../../src/ui/widgets/KeyList.cpp" line="476"/> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="510"/> <source>Syncing Key List...</source> <translation type="unfinished">Sincronizzazione elenco chiavi...</translation> </message> <message> - <location filename="../../../../src/ui/widgets/KeyList.cpp" line="484"/> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="518"/> <source>Sync [%1/%2] %3 %4</source> <translation type="unfinished">Sincronizzazione [%1/%2] %3 %4</translation> </message> <message> - <location filename="../../../../src/ui/widgets/KeyList.cpp" line="494"/> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="528"/> <source>Key List Sync Done.</source> <translation type="unfinished">Sincronizzazione elenco chiavi eseguita.</translation> </message> @@ -2062,7 +2161,7 @@ This will result in loss of all cached form positions, statuses, key servers, et </message> <message> <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="171"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="261"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="265"/> <source>File</source> <translation type="unfinished">File</translation> </message> @@ -2093,7 +2192,7 @@ This will result in loss of all cached form positions, statuses, key servers, et </message> <message> <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="202"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="532"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="536"/> <source>Key Package</source> <translation type="unfinished">Pacchetto chiave</translation> </message> @@ -2138,220 +2237,220 @@ This will result in loss of all cached form positions, statuses, key servers, et <translation type="unfinished">Elimina chiavi selezionate</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="232"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="233"/> <source>Delete the Selected keys</source> <translation type="unfinished">Elimina le chiavi selezionate</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="236"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="237"/> <source>Delete Checked Key(s)</source> <translation type="unfinished">Elimina chiavi selezionate</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="237"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="239"/> <source>Delete the Checked keys</source> <translation type="unfinished">Elimina le chiavi selezionate</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="242"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="244"/> <source>Show Key Details</source> <translation type="unfinished">Mostra dettagli chiave</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="243"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="246"/> <source>Show Details for this Key</source> <translation type="unfinished">Mostra dettagli per questa chiave</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="247"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="248"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="250"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="252"/> <source>Set Owner Trust Level</source> <translation type="unfinished">Imposta il livello di attendibilità del proprietario</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="265"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="285"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="269"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="289"/> <source>Key</source> <translation type="unfinished">Chiave</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="266"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="270"/> <source>Generate Key</source> <translation type="unfinished">Genera chiave</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="270"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="298"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="274"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="302"/> <source>Import Key</source> <translation type="unfinished">Importa chiave</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="276"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="306"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="307"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="280"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="310"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="311"/> <source>Export Key</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="297"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="301"/> <source>Import key</source> <translation type="unfinished">Importa chiave</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="340"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="344"/> <source>Deleting Keys</source> <translation type="unfinished">Cancellazione chiavi</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="341"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="345"/> <source>Are you sure that you want to delete the following keys?</source> <translation type="unfinished">Sei sicuro di voler eliminare le seguenti chiavi?</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="343"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="347"/> <source>The action can not be undone.</source> <translation type="unfinished">L'azione non può essere annullata.</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="359"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="408"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="420"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="448"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="487"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="498"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="511"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="541"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="549"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="565"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="573"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="589"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="363"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="412"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="424"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="452"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="491"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="502"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="515"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="545"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="553"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="569"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="577"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="593"/> <source>Error</source> <translation type="unfinished">Errore</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="359"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="448"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="363"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="452"/> <source>Key Not Found.</source> <translation type="unfinished">Chiave non trovata.</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="370"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="383"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="466"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="472"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="374"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="387"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="470"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="476"/> <source>Forbidden</source> <translation type="unfinished">Vietato</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="371"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="384"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="375"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="388"/> <source>Please check some keys before doing this operation.</source> <translation type="unfinished">Si prega di controllare alcune chiavi prima di eseguire questa operazione.</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="376"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="524"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="380"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="528"/> <source>key(s) exported</source> <translation type="unfinished">chiavi esportate</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="400"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="479"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="404"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="483"/> <source>Exporting</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="409"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="421"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="488"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="499"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="413"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="425"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="492"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="503"/> <source>Unknown error occurred</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="442"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="452"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="446"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="456"/> <source>Invalid Operation</source> <translation type="unfinished">Operazione non valida</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="443"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="447"/> <source>Please select one KeyPair before doing this operation.</source> <translation type="unfinished">Si prega di selezionare un KeyPair prima di eseguire questa operazione.</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="453"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="457"/> <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">Se una coppia di chiavi non dispone di una chiave privata, non sarà in grado di generare sottochiavi.</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="467"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="471"/> <source>Please check a key before performing this operation.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="473"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="477"/> <source>This operation accepts just a single key.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="512"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="516"/> <source>This key may not be able to export as OpenSSH format. Please check the key-size of the subkey(s) used to sign.</source> <translation type="unfinished">Questa chiave potrebbe non essere in grado di esportare come formato OpenSSH. Si prega di controllare la dimensione della chiave della/e sottochiave/i utilizzata/e per firmare.</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="519"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="523"/> <source>Export OpenSSH Key To File</source> <translation type="unfinished">Esporta chiave OpenSSH in file</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="520"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="524"/> <source>OpenSSH Public Key Files</source> <translation type="unfinished">File di chiavi pubbliche OpenSSH</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="532"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="536"/> <source>Import Key Package</source> <translation type="unfinished">Importa pacchetto chiave</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="542"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="566"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="546"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="570"/> <source>Cannot open this file. Please make sure that this is a regular file and it's readable.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="550"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="554"/> <source>The target file is too large for a key package.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="555"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="559"/> <source>Import Key Package Passphrase File</source> <translation type="unfinished">Importa file passphrase pacchetto chiave</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="556"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="560"/> <source>Key Package Passphrase File</source> <translation type="unfinished">File di passphrase del pacchetto chiave</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="574"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="578"/> <source>The target file is too large for a key package passphrase.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="580"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="584"/> <source>Importing</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="596"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="600"/> <source>key(s) imported</source> <translation type="unfinished">chiavi importate</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="590"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="594"/> <source>An error occur in importing key package.</source> <translation type="unfinished">Si è verificato un errore durante l'importazione del pacchetto di chiavi.</translation> </message> @@ -3175,138 +3274,138 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::KeyServerImportDialog</name> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="58"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="56"/> <source>Close</source> <translation type="unfinished">Chiudi</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="61"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="59"/> <source>Import ALL</source> <translation type="unfinished">Importa TUTTO</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="65"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="63"/> <source>Search</source> <translation type="unfinished">Ricerca</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="70"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="68"/> <source>Search String</source> <translation type="unfinished">Stringa di ricerca</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="70"/> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="74"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="68"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="72"/> <source>: </source> <translation type="unfinished">: </translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="74"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="72"/> <source>Key Server</source> <translation type="unfinished">Server chiave</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="115"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="113"/> <source>Import Keys from Keyserver</source> <translation type="unfinished">Importa chiavi dal server delle chiavi</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="155"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="153"/> <source>UID</source> <translation type="unfinished">UID</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="155"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="153"/> <source>Creation date</source> <translation type="unfinished">Data di creazione</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="155"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="153"/> <source>KeyID</source> <translation type="unfinished">ID chiave</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="155"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="153"/> <source>Tag</source> <translation type="unfinished">Etichetta</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="178"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="176"/> <source>Text is empty.</source> <translation type="unfinished">Il testo è vuoto.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="225"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="223"/> <source>Not Key Found</source> <translation type="unfinished">Chiave non trovata</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="228"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="226"/> <source>Timeout</source> <translation type="unfinished">Tempo scaduto</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="231"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="229"/> <source>Key Server Not Found</source> <translation type="unfinished">Server chiave non trovato</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="234"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="232"/> <source>Connection Error</source> <translation type="unfinished">Errore di connessione</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="243"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="241"/> <source>Too many responses from keyserver!</source> <translation type="unfinished">Troppe risposte dal server delle chiavi!</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="252"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="253"/> <source>No keys found, input may be kexId, retrying search with 0x.</source> <translation type="unfinished">Nessuna chiave trovata, l'input potrebbe essere kexId, riprovando la ricerca con 0x.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="261"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="263"/> <source>No keys found containing the search string!</source> <translation type="unfinished">Nessuna chiave trovata contenente la stringa di ricerca!</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="267"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="270"/> <source>Insufficiently specific search string!</source> <translation type="unfinished">Stringa di ricerca non sufficientemente specifica!</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="301"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="305"/> <source>revoked</source> <translation type="unfinished">revocato</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="304"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="308"/> <source>disabled</source> <translation type="unfinished">disabilitato</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="349"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="353"/> <source>%1 keys found. Double click a key to import it.</source> <translation type="unfinished">%1 chiavi trovate. Fare doppio clic su una chiave per importarla.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="371"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="374"/> <source>Warning</source> <translation type="unfinished">Avvertimento</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="372"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="375"/> <source>Please select one KeyPair before doing this operation.</source> <translation type="unfinished">Si prega di selezionare un KeyPair prima di eseguire questa operazione.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="419"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="422"/> <source>Key Imported</source> <translation type="unfinished">Chiave importata</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="430"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="433"/> <source>Processing ...</source> <translation type="unfinished"></translation> </message> @@ -3314,27 +3413,27 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::KeyServerImportTask</name> <message> - <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="74"/> + <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="79"/> <source>Key not found in the Keyserver.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="77"/> + <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="82"/> <source>Network connection timeout.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="80"/> + <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="85"/> <source>Cannot resolve the address of target key server.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="83"/> + <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="88"/> <source>General connection error occurred.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="89"/> + <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="94"/> <source>Success</source> <translation type="unfinished">Successo</translation> </message> @@ -3423,52 +3522,52 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::KeyUploadDialog</name> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="59"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="60"/> <source>Uploading Public Key</source> <translation type="unfinished">Caricamento della chiave pubblica</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="77"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="78"/> <source>Error</source> <translation type="unfinished">Errore</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="78"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="79"/> <source>Unknown error occurred</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="147"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="150"/> <source>Key Not Found</source> <translation type="unfinished">Chiave non trovata</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="150"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="153"/> <source>Timeout</source> <translation type="unfinished">Tempo scaduto</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="153"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="156"/> <source>Key Server Not Found</source> <translation type="unfinished">Server chiave non trovato</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="156"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="159"/> <source>Connection Error</source> <translation type="unfinished">Errore di connessione</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="158"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="161"/> <source>Upload Failed</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="162"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="165"/> <source>Upload Success</source> <translation type="unfinished">Caricamento riuscito</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="163"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="166"/> <source>Upload Public Key Successfully</source> <translation type="unfinished">Carica chiave pubblica con successo</translation> </message> @@ -3605,13 +3704,13 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::MainWindow</name> <message> - <location filename="../../../../src/ui/main_window/MainWindow.cpp" line="156"/> - <location filename="../../../../src/ui/main_window/MainWindow.cpp" line="159"/> + <location filename="../../../../src/ui/main_window/MainWindow.cpp" line="154"/> + <location filename="../../../../src/ui/main_window/MainWindow.cpp" line="157"/> <source>Critical error occur while loading GpgFrontend.</source> <translation type="unfinished">Si è verificato un errore critico durante il caricamento di GpgFrontend.</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindow.cpp" line="158"/> + <location filename="../../../../src/ui/main_window/MainWindow.cpp" line="156"/> <source>Loading Failed</source> <translation type="unfinished">Caricamento non riuscito</translation> </message> @@ -3633,20 +3732,20 @@ This will result in loss of all cached form positions, statuses, key servers, et <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="380"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="435"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="454"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="489"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="508"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="536"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="576"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="613"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="639"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="679"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="717"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="743"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="751"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="775"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="812"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="822"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="847"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="490"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="509"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="537"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="577"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="614"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="640"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="680"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="718"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="744"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="752"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="776"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="813"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="823"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="848"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="74"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="121"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="177"/> @@ -3655,14 +3754,14 @@ This will result in loss of all cached form positions, statuses, key servers, et <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="322"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="368"/> <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="97"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="120"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="140"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="156"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="169"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="182"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="197"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="247"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="255"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="121"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="141"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="157"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="170"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="183"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="198"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="248"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="256"/> <source>Error</source> <translation type="unfinished">Errore</translation> </message> @@ -3673,10 +3772,10 @@ This will result in loss of all cached form positions, statuses, key servers, et <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="330"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="381"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="455"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="537"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="640"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="744"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="813"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="538"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="641"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="745"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="814"/> <source>Cannot read from file: %1</source> <translation type="unfinished"></translation> </message> @@ -3692,10 +3791,10 @@ This will result in loss of all cached form positions, statuses, key servers, et <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="288"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="338"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="416"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="583"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="686"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="757"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="828"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="584"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="687"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="758"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="829"/> <source>Warning</source> <translation type="unfinished">Avvertimento</translation> </message> @@ -3704,10 +3803,10 @@ This will result in loss of all cached form positions, statuses, key servers, et <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="190"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="298"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="348"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="577"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="680"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="752"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="823"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="578"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="681"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="753"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="824"/> <source>Cannot write to file: %1</source> <translation type="unfinished"></translation> </message> @@ -3738,11 +3837,11 @@ This will result in loss of all cached form positions, statuses, key servers, et <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="312"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="362"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="436"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="509"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="614"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="718"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="776"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="848"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="510"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="615"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="719"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="777"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="849"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="75"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="122"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="178"/> @@ -3756,8 +3855,8 @@ This will result in loss of all cached form positions, statuses, key servers, et <message> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="126"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="241"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="558"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="661"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="559"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="662"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="279"/> <source>Invalid KeyPair</source> <translation type="unfinished">Coppia di chiavi non valida</translation> @@ -3765,8 +3864,8 @@ This will result in loss of all cached form positions, statuses, key servers, et <message> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="127"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="242"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="559"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="662"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="560"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="663"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="280"/> <source>The selected keypair cannot be used for encryption.</source> <translation type="unfinished">La coppia di chiavi selezionata non può essere utilizzata per la crittografia.</translation> @@ -3774,8 +3873,8 @@ This will result in loss of all cached form positions, statuses, key servers, et <message> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="128"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="243"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="560"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="663"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="561"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="664"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="103"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="159"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="281"/> @@ -3801,8 +3900,8 @@ This will result in loss of all cached form positions, statuses, key servers, et <message> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="289"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="339"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="584"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="687"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="585"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="688"/> <source>The target file already exists, do you need to overwrite it?</source> <translation type="unfinished">Il file di destinazione esiste già, è necessario sovrascriverlo?</translation> </message> @@ -3819,8 +3918,8 @@ This will result in loss of all cached form positions, statuses, key servers, et </message> <message> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="390"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="547"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="650"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="548"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="651"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="147"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="267"/> <source>No Key Checked</source> @@ -3828,8 +3927,8 @@ This will result in loss of all cached form positions, statuses, key servers, et </message> <message> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="391"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="548"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="651"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="549"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="652"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="148"/> <source>Please check the key in the key toolbox on the right.</source> <translation type="unfinished">Si prega di controllare la chiave nella casella degli strumenti della chiave a destra.</translation> @@ -3874,41 +3973,41 @@ If Data And Signature is COMBINED within a single file, KEEP THIS EMPTY: </sourc <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="490"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="491"/> <source>Please select the appropriate origin file or signature file. Ensure that both are in this directory.</source> <translation type="unfinished">Si prega di selezionare il file di origine appropriato o il file di firma. Assicurati che entrambi siano in questa directory.</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="499"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="500"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="237"/> <source>Verifying</source> <translation type="unfinished">Verifica</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="602"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="603"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="310"/> <source>Encrypting and Signing</source> <translation type="unfinished">Crittografa e Firma</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="705"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="706"/> <source>Archiving & Encrypting & Signing</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="758"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="829"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="759"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="830"/> <source>The output file %1 already exists, do you need to overwrite it?</source> <translation type="unfinished">Il file di output %1 esiste già, devi sovrascriverlo?</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="767"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="768"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="358"/> <source>Decrypting and Verifying</source> <translation type="unfinished">Decifra e verifica</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="838"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="839"/> <source>Decrypting & Verifying & Extracting</source> <translation type="unfinished"></translation> </message> @@ -3934,12 +4033,12 @@ If Data And Signature is COMBINED within a single file, KEEP THIS EMPTY: </sourc </message> <message> <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="97"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="120"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="140"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="156"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="169"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="182"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="197"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="121"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="141"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="157"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="170"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="183"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="198"/> <source>Key Not Found.</source> <translation type="unfinished">Chiave non trovata.</translation> </message> @@ -3954,805 +4053,962 @@ If Data And Signature is COMBINED within a single file, KEEP THIS EMPTY: </sourc <translation type="unfinished">UTC</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="125"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="126"/> <source>Local Time</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="248"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="249"/> <source>Cannot open this file. Please make sure that this is a regular file and it's readable.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="256"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="257"/> <source>Cannot open this file. The file is TOO LARGE (>1MB) for GpgFrontend Text Editor.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="302"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="298"/> <source>GpgFrontend Upgradeable (New Version: %1).</source> <translation type="unfinished">GpgFrontend aggiornabile (nuova versione: %1).</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="312"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="302"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="448"/> + <source>Update</source> + <translation type="unfinished">Aggiorna</translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="308"/> <source>Withdrawn Version</source> <translation type="unfinished">Versione ritirata</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="314"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="310"/> <source>This version(%1) may have been withdrawn by the developer due to serious problems. Please stop using this version immediately and use the latest stable version.</source> <translation type="unfinished">Questa versione (%1) potrebbe essere stata ritirata dallo sviluppatore a causa di seri problemi. Si prega di interrompere immediatamente l'utilizzo di questa versione e utilizzare l'ultima versione stabile.</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="319"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="315"/> <source>You can download the latest stable version(%1) on Github Releases Page.<br/></source> <translation type="unfinished">Puoi scaricare l'ultima versione stabile (%1) dalla pagina dei rilasci di Github.<br/></translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="324"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="320"/> <source>This maybe a BETA Version (Latest Stable Version: %1).</source> <translation type="unfinished">Questa potrebbe essere una versione BETA (ultima versione stabile: %1).</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="44"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="45"/> <source>New</source> <translation type="unfinished">Nuovo</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="50"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="51"/> <source>Open a new file</source> <translation type="unfinished">Apri un nuovo file</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="53"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="54"/> <source>Open...</source> <translation type="unfinished">Apri...</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="56"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="57"/> <source>Open an existing file</source> <translation type="unfinished">Apri un file esistente</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="59"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="60"/> <source>File Browser</source> <translation type="unfinished">Cerca file</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="62"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="63"/> <source>Open a file browser</source> <translation type="unfinished">Apri un browser di file</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="66"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="67"/> <source>Save File</source> <translation type="unfinished">Salva</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="69"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="70"/> <source>Save the current File</source> <translation type="unfinished">Salva il file corrente</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="72"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="73"/> <source>Save As</source> <translation type="unfinished">Salva come</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="75"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="76"/> <source>Save the current File as...</source> <translation type="unfinished">Salva il file corrente come...</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="78"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="79"/> <source>Print</source> <translation type="unfinished">Stampa</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="81"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="82"/> <source>Print Document</source> <translation type="unfinished">Stampa documento</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="84"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="85"/> <source>Close</source> <translation type="unfinished">Chiudi</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="86"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="88"/> <source>Close file</source> <translation type="unfinished">Chiudi file</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="89"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="91"/> <source>Quit</source> <translation type="unfinished">Uscire</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="92"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="94"/> <source>Quit Program</source> <translation type="unfinished">Esci dal programma</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="97"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="99"/> <source>Undo</source> <translation type="unfinished">Annulla</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="99"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="102"/> <source>Undo Last Edit Action</source> <translation type="unfinished">Annulla l'ultima azione di modifica</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="102"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="105"/> <source>Redo</source> <translation type="unfinished">Ripeti</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="104"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="108"/> <source>Redo Last Edit Action</source> <translation type="unfinished">Ripeti l'ultima azione di modifica</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="107"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="111"/> <source>Zoom In</source> <translation type="unfinished">Ingrandisci</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="111"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="116"/> <source>Zoom Out</source> <translation type="unfinished">Rimpicciolisci</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="115"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="121"/> <source>Paste</source> <translation type="unfinished">Incolla</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="118"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="124"/> <source>Paste Text From Clipboard</source> <translation type="unfinished">Incolla il testo dagli appunti</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="121"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="127"/> <source>Cut</source> <translation type="unfinished">Taglia</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="125"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="131"/> <source>Cut the current selection's contents to the clipboard</source> <translation type="unfinished">Taglia il contenuto della selezione corrente negli appunti</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="129"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="135"/> <source>Copy</source> <translation type="unfinished">Copia</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="133"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="139"/> <source>Copy the current selection's contents to the clipboard</source> <translation type="unfinished">Copia il contenuto della selezione corrente negli appunti</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="137"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="143"/> <source>Quote</source> <translation type="unfinished">Citazione</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="139"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="145"/> <source>Quote whole text</source> <translation type="unfinished">Cita tutto il testo</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="142"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="148"/> <source>Select All</source> <translation type="unfinished">Seleziona tutto</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="145"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="151"/> <source>Select the whole text</source> <translation type="unfinished">Seleziona l'intero testo</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="149"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="155"/> <source>Find</source> <translation type="unfinished">Trova</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="152"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="158"/> <source>Find a word</source> <translation type="unfinished">Trova una parola</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="155"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="161"/> <source>Remove spacing</source> <translation type="unfinished">Rimuovi spaziatura</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="160"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="166"/> <source>Remove double linebreaks, e.g. in pasted text from Web Mailer</source> <translation type="unfinished">Rimuovi le doppie interruzioni di riga, ad es. nel testo incollato da Web Mailer</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="164"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="170"/> <source>Settings</source> <translation type="unfinished">Impostazioni</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="165"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="171"/> <source>Open settings dialog</source> <translation type="unfinished">Apri la finestra di dialogo delle impostazioni</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="173"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="179"/> <source>Encrypt</source> <translation type="unfinished">Crittografa</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="177"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="183"/> <source>Encrypt Message</source> <translation type="unfinished">Crittografa il messaggio</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="195"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="201"/> <source>Encrypt Sign</source> <translation type="unfinished">Crittografa e Firma</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="200"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="206"/> <source>Encrypt and Sign Message</source> <translation type="unfinished">Crittografa e Firma Messaggio</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="218"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="224"/> <source>Decrypt</source> <translation type="unfinished">Decifra</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="221"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="227"/> <source>Decrypt Message</source> <translation type="unfinished">Decifra messaggio</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="243"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="249"/> <source>Decrypt Verify</source> <translation type="unfinished">Decifra Verifica</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="247"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="253"/> <source>Decrypt and Verify Message</source> <translation type="unfinished">Decifra e verifica il messaggio</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="269"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="275"/> <source>Sign</source> <translation type="unfinished">Firma</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="272"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="278"/> <source>Sign Message</source> <translation type="unfinished">Firma il messaggio</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="284"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="290"/> <source>Verify</source> <translation type="unfinished">Verifica</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="287"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="293"/> <source>Verify Message</source> <translation type="unfinished">Verifica messaggio</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="302"/> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="540"/> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="614"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="308"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="554"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="636"/> <source>File</source> <translation type="unfinished">File</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="304"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="310"/> <source>Import New Key From File</source> <translation type="unfinished">Importa nuova chiave da file</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="308"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="314"/> <source>Clipboard</source> <translation type="unfinished">Appunti</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="312"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="318"/> <source>Import New Key From Clipboard</source> <translation type="unfinished">Importa nuova chiave dagli appunti</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="323"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="329"/> <source>Keyserver</source> <translation type="unfinished">Server delle chiavi</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="327"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="333"/> <source>Import New Key From Keyserver</source> <translation type="unfinished">Importa nuova chiave dal server delle chiavi</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="333"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="339"/> <source>Editor</source> <translation type="unfinished">Editor</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="335"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="341"/> <source>Import New Key From Editor</source> <translation type="unfinished">Importa nuova chiave dall'editor</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="339"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="345"/> <source>Manage Keys</source> <translation type="unfinished">Gestisci chiavi</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="341"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="347"/> <source>Open Key Management</source> <translation type="unfinished">Gestione delle chiavi aperte</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="345"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="351"/> <source>Clear Password Cache</source> <translation type="unfinished">Cancella cache delle password</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="348"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="354"/> <source>Clear Password Cache of GnuPG</source> <translation type="unfinished">Cancella la cache delle password di GnuPG</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="353"/> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="370"/> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="391"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="359"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="376"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="397"/> <source>Successful Operation</source> <translation type="unfinished">Operazione riuscita</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="354"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="360"/> <source>Clear password cache successfully</source> <translation type="unfinished">Cancella la cache delle password con successo</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="356"/> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="374"/> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="395"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="362"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="380"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="401"/> <source>Failed Operation</source> <translation type="unfinished">Operazione fallita</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="357"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="363"/> <source>Failed to clear password cache of GnuPG</source> <translation type="unfinished">Impossibile cancellare la cache delle password di GnuPG</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="362"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="368"/> <source>Reload All Components</source> <translation type="unfinished">Ricarica tutti i componenti</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="364"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="370"/> <source>Reload All GnuPG's Components</source> <translation type="unfinished">Ricarica tutti i componenti di GnuPG</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="371"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="377"/> <source>Reload all the GnuPG's components successfully</source> <translation type="unfinished">Ricarica correttamente tutti i componenti di GnuPG</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="375"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="381"/> <source>Failed to reload all or one of the GnuPG's component(s)</source> <translation type="unfinished">Impossibile ricaricare tutti o uno dei componenti di GnuPG</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="380"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="386"/> <source>Restart All Components</source> <translation type="unfinished">Riavvia tutti i componenti</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="382"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="388"/> <source>Restart All GnuPG's Components</source> <translation type="unfinished">Riavvia tutti i componenti di GnuPG</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="392"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="398"/> <source>Restart all the GnuPG's components successfully</source> <translation type="unfinished">Riavvia correttamente tutti i componenti di GnuPG</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="396"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="402"/> <source>Failed to restart all or one of the GnuPG's component(s)</source> <translation type="unfinished">Impossibile riavviare tutti o uno dei componenti di GnuPG</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="401"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="407"/> <source>Open GnuPG Controller</source> <translation type="unfinished">Apri il controller GnuPG</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="403"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="409"/> <source>Open GnuPG Controller Dialog</source> <translation type="unfinished">Apri la finestra di dialogo del controller GnuPG</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="410"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="413"/> + <source>Open Module Controller</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="415"/> + <source>Open Module Controller Dialog</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="422"/> <source>About</source> <translation type="unfinished">Informazioni</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="412"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="424"/> <source>Show the application's About box</source> <translation type="unfinished">Mostra la casella Informazioni sull'applicazione</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="417"/> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="590"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="430"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="434"/> <source>GnuPG</source> <translation type="unfinished">GnuPG</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="419"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="432"/> <source>Information about Gnupg</source> <translation type="unfinished">Informazioni su Gnupg</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="423"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="437"/> <source>Translate</source> <translation type="unfinished">Traduci</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="425"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="439"/> <source>Information about translation</source> <translation type="unfinished">Informazioni sulla traduzione</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="432"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="441"/> + <source>Translators</source> + <translation type="unfinished">Traduttori</translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="444"/> <source>Check for Updates</source> <translation type="unfinished">Controlla gli Aggiornamenti</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="434"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="446"/> <source>Check for updates</source> <translation type="unfinished">Controlla gli aggiornamenti</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="438"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="451"/> <source>Open Wizard</source> <translation type="unfinished">Apri procedura guidata</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="439"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="453"/> <source>Open the wizard</source> <translation type="unfinished">Apri la procedura guidata</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="444"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="458"/> <source>Append Public Key to Editor</source> <translation type="unfinished">Aggiungi la chiave pubblica all'editor</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="446"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="460"/> <source>Append selected Keypair's Public Key to Editor</source> <translation type="unfinished">Aggiungi la chiave pubblica della coppia di chiavi selezionata all'editor</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="451"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="465"/> <source>Append Create DateTime to Editor</source> <translation type="unfinished">Aggiungi Create DateTime all'editor</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="453"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="467"/> <source>Append selected Key's creation date and time to Editor</source> <translation type="unfinished">Aggiungi la data e l'ora di creazione della chiave selezionata all'editor</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="458"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="472"/> <source>Append Expire DateTime to Editor</source> <translation type="unfinished">Aggiungi Expire DateTime all'editor</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="460"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="474"/> <source>Append selected Key's expiration date and time to Editor</source> <translation type="unfinished">Aggiungi la data e l'ora di scadenza della chiave selezionata all'Editor</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="465"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="479"/> <source>Append Fingerprint to Editor</source> <translation type="unfinished">Aggiungi impronta digitale all'editor</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="467"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="481"/> <source>Append selected Key's Fingerprint to Editor</source> <translation type="unfinished">Aggiungi l'impronta digitale della chiave selezionata all'editor</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="471"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="485"/> <source>Copy Email</source> <translation type="unfinished">Copia e-mail</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="473"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="487"/> <source>Copy selected Keypair's to clipboard</source> <translation type="unfinished">Copia la coppia di chiavi selezionata negli appunti</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="478"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="492"/> <source>Copy Default UID</source> <translation type="unfinished">Copia UID predefinito</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="480"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="494"/> <source>Copy selected Keypair's default UID to clipboard</source> <translation type="unfinished">Copia l'UID predefinito della coppia di chiavi selezionata negli appunti</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="484"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="498"/> <source>Copy Key ID</source> <translation type="unfinished">Copia ID chiave</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="486"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="500"/> <source>Copy selected Keypair's ID to clipboard</source> <translation type="unfinished">Copia l'ID della coppia di chiavi selezionata negli appunti</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="490"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="504"/> <source>Show Key Details</source> <translation type="unfinished">Mostra dettagli chiave</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="491"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="505"/> <source>Show Details for this Key</source> <translation type="unfinished">Mostra dettagli per questa chiave</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="495"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="509"/> <source>Add To Favourite</source> <translation type="unfinished">Aggiungi ai preferiti</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="496"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="510"/> <source>Add this key to Favourite Table</source> <translation type="unfinished">Aggiungi questa chiave alla tabella dei preferiti</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="502"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="516"/> <source>Remove From Favourite</source> <translation type="unfinished">Rimuovi dai preferiti</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="504"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="518"/> <source>Remove this key from Favourite Table</source> <translation type="unfinished">Rimuovi questa chiave dalla tabella dei preferiti</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="510"/> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="511"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="524"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="525"/> <source>Set Owner Trust Level</source> <translation type="unfinished">Imposta il livello di attendibilità del proprietario</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="530"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="544"/> <source>Remove PGP Header</source> <translation type="unfinished">Rimuovi intestazione PGP</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="534"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="548"/> <source>Add PGP Header</source> <translation type="unfinished">Aggiungi intestazione PGP</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="553"/> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="636"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="567"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="658"/> <source>Edit</source> <translation type="unfinished">Modifica</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="571"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="585"/> <source>Crypt</source> <translation type="unfinished">Crittografa</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="581"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="595"/> <source>Keys</source> <translation type="unfinished">Chiavi</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="582"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="596"/> <source>Import Key</source> <translation type="unfinished">Importa chiave</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="598"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="604"/> + <source>Advance</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="612"/> <source>Steganography</source> <translation type="unfinished">Steganografia</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="602"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="616"/> <source>View</source> <translation type="unfinished">Visualizzazione</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="604"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="618"/> <source>Help</source> <translation type="unfinished">Aiuto</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="621"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="643"/> <source>Operations</source> <translation type="unfinished">Operazioni</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="631"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="653"/> <source>Key</source> <translation type="unfinished">Chiave</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="644"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="666"/> <source>Special Edit</source> <translation type="unfinished">Modifica speciale</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="656"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="678"/> <source>Import key from...</source> <translation type="unfinished">Importa chiave da...</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="657"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="679"/> <source>Import key</source> <translation type="unfinished">Importa chiave</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="673"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="695"/> <source>Ready</source> <translation type="unfinished">Pronto</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="680"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="702"/> <source>Key ToolBox</source> <translation type="unfinished">Casella degli strumenti chiave</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="688"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="710"/> <source>Default</source> <translation type="unfinished">Predefinito</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="696"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="718"/> <source>Favourite</source> <translation type="unfinished">Preferito</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="704"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="726"/> <source>Only Public Key</source> <translation type="unfinished">Solo chiave pubblica</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="714"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="736"/> <source>Has Private Key</source> <translation type="unfinished">Ha una chiave privata</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="728"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="750"/> <source>Information Board</source> <translation type="unfinished">Scheda informativa</translation> </message> </context> <context> + <name>GpgFrontend::UI::ModuleControllerDialog</name> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="49"/> + <source>Module Informations</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="50"/> + <source>Actions</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="51"/> + <source>Show Mods Directory</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="53"/> + <source>Registered Modules</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="54"/> + <source>Global Register Table</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="55"/> + <source>Debugger</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="58"/> + <source>Tips: Module name front with "*" stands for integrated module.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="60"/> + <source>Module Controller</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="84"/> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="184"/> + <source>Enable Auto Activate</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="133"/> + <source>BASIC INFO</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="135"/> + <source>ID</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="137"/> + <source>Version</source> + <translation type="unfinished">Versione</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="139"/> + <source>SDK Version</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="141"/> + <source>Qt ENV Version</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="143"/> + <source>Hash</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="144"/> + <source>Path</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="148"/> + <source>Auto Activate</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="149"/> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="151"/> + <source>True</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="149"/> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="151"/> + <source>False</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="150"/> + <source>Active</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="155"/> + <source>METADATA</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="171"/> + <source>Listening Event</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="180"/> + <source>Deactivate</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="181"/> + <source>Activate</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="183"/> + <source>Disable Auto Activate</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>GpgFrontend::UI::NetworkTab</name> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="71"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="72"/> <source>Proxy</source> <translation type="unfinished">Proxy</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="72"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="73"/> <source>Network Ability</source> <translation type="unfinished">Capacità di rete</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="73"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="74"/> <source>Operations</source> <translation type="unfinished">Operazioni</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="75"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="76"/> <source>Enable Proxy</source> <translation type="unfinished">Abilita proxy</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="76"/> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="79"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="77"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="80"/> <source>Port</source> <translation type="unfinished">Porta</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="78"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="79"/> <source>Host Address</source> <translation type="unfinished">Indirizzo dell'host</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="80"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="81"/> <source>Proxy Type</source> <translation type="unfinished">Tipo di proxy</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="81"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="82"/> <source>Username</source> <translation type="unfinished">Nome utente</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="82"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="83"/> <source>Password</source> <translation type="unfinished">Password</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="85"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="86"/> <source>Apply Proxy Settings and Check Proxy Connection</source> <translation type="unfinished">Applica impostazioni proxy e verifica connessione proxy</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="88"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="89"/> <source>Forbid all GnuPG network connection.</source> <translation type="unfinished">Proibisci tutte le connessioni di rete GnuPG.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="90"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="93"/> <source>Prohibit checking for version updates when the program starts.</source> <translation type="unfinished">Proibisci il controllo degli aggiornamenti di versione all'avvio del programma.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="92"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="96"/> <source>Automatically import a missing key for signature verification.</source> <translation type="unfinished">Importa automaticamente una chiave mancante per la verifica della firma.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="94"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="98"/> <source>Tips: These Option Changes take effect only after the application restart.</source> <translation type="unfinished">Suggerimenti: queste modifiche alle opzioni hanno effetto solo dopo il riavvio dell'applicazione.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="170"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="173"/> <source>Test Server Url Accessibility</source> <translation type="unfinished">Verifica l'accessibilità dell'URL del server</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="171"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="174"/> <source>Server Url</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="181"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="184"/> <source>Success</source> <translation type="unfinished">Successo</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="182"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="185"/> <source>Successfully connect to the target server through the proxy server.</source> <translation type="unfinished">Connettiti correttamente al server di destinazione tramite il server proxy.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="186"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="189"/> <source>Failed</source> <translation type="unfinished">Fallito</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="187"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="190"/> <source>Unable to connect to the target server through the proxy server. Proxy settings may be invalid.</source> <translation type="unfinished">Impossibile connettersi al server di destinazione tramite il server proxy. Le impostazioni del proxy potrebbero non essere valide.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="197"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="200"/> <source>Test Proxy Server Connection...</source> <translation type="unfinished">Prova connessione server proxy...</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="198"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="201"/> <source>Is using your proxy settings to access the url. Note that this test operation will apply your proxy settings to the entire software.</source> <translation type="unfinished">Sta utilizzando le impostazioni del proxy per accedere all'URL. Nota che questa operazione di prova applicherà le tue impostazioni proxy all'intero software.</translation> </message> @@ -4938,37 +5194,37 @@ If Data And Signature is COMBINED within a single file, KEEP THIS EMPTY: </sourc <context> <name>GpgFrontend::UI::SettingsDialog</name> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="54"/> + <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="53"/> <source>General</source> <translation type="unfinished">Generale</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="55"/> + <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="54"/> <source>Appearance</source> <translation type="unfinished">Aspetto</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="56"/> + <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="55"/> <source>Key Server</source> <translation type="unfinished">Server chiave</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="57"/> + <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="56"/> <source>Network</source> <translation type="unfinished">Rete</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="68"/> + <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="67"/> <source>Settings</source> <translation type="unfinished">Impostazioni</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="72"/> + <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="71"/> <source>Preference</source> <translation type="unfinished">Preferenze</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="128"/> + <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="124"/> <source>System Default</source> <translation type="unfinished">Default del sistema</translation> </message> @@ -5211,7 +5467,7 @@ If Data And Signature is COMBINED within a single file, KEEP THIS EMPTY: </sourc <context> <name>GpgFrontend::UI::TranslatorsTab</name> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="131"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="145"/> <source>If you think there are any problems with the translation, why not participate in the translation work? If you want to participate, please read the document or contact me via email.</source> <translation type="unfinished">Se pensi che ci siano problemi con la traduzione, perché non partecipare al lavoro di traduzione? Se vuoi partecipare, leggi il documento o contattami via email.</translation> </message> @@ -5219,63 +5475,63 @@ If Data And Signature is COMBINED within a single file, KEEP THIS EMPTY: </sourc <context> <name>GpgFrontend::UI::UpdateTab</name> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="154"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="163"/> <source>It is recommended that you always check the version of GpgFrontend and upgrade to the latest version.</source> <translation type="unfinished">Si consiglia di controllare sempre la versione di GpgFrontend e di aggiornare all'ultima versione.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="157"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="166"/> <source>New versions not only represent new features, but also often represent functional and security fixes.</source> <translation type="unfinished">Le nuove versioni non rappresentano solo nuove funzionalità, ma spesso rappresentano anche correzioni funzionali e di sicurezza.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="163"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="172"/> <source>Current Version</source> <translation type="unfinished">Versione corrente</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="164"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="173"/> <source>: </source> <translation type="unfinished">: </translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="246"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="248"/> <source>Latest Version From Github</source> <translation type="unfinished">Ultima versione da Github</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="252"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="254"/> <source>The current version is less than the latest version on github.</source> <translation type="unfinished">La versione corrente è inferiore all'ultima versione su github.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="254"/> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="265"/> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="277"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="256"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="267"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="279"/> <source>Please click</source> <translation type="unfinished">Per favore clicca</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="257"/> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="268"/> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="280"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="259"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="270"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="282"/> <source>Here</source> <translation type="unfinished">Qui</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="257"/> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="268"/> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="280"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="259"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="270"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="282"/> <source>to download the latest stable version.</source> <translation type="unfinished">per scaricare l'ultima versione stabile.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="263"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="265"/> <source>This version has serious problems and has been withdrawn. Please stop using it immediately.</source> <translation type="unfinished">Questa versione ha seri problemi ed è stata ritirata. Si prega di smettere di usarlo immediatamente.</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="274"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="276"/> <source>This version has not been released yet, it may be a beta version. If you are not a tester and care about version stability, please do not use this version.</source> <translation type="unfinished">Questa versione non è ancora stata rilasciata, potrebbe essere una versione beta. Se non sei un tester e ti interessa la stabilità della versione, non utilizzare questa versione.</translation> </message> @@ -5472,7 +5728,7 @@ If Data And Signature is COMBINED within a single file, KEEP THIS EMPTY: </sourc <context> <name>GpgFrontend::UI::Wizard</name> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="44"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="43"/> <source>First Start Wizard</source> <translation type="unfinished">Procedura guidata al primo avvio</translation> </message> @@ -5513,17 +5769,17 @@ If Data And Signature is COMBINED within a single file, KEEP THIS EMPTY: </sourc <context> <name>QCoreApplication</name> <message> - <location filename="../../../../src/cmd.cpp" line="49"/> + <location filename="../../../../src/cmd.cpp" line="47"/> <source>This is free software; see the source for copying conditions.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/cmd.cpp" line="54"/> + <location filename="../../../../src/cmd.cpp" line="52"/> <source>Build DateTime: </source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/cmd.cpp" line="55"/> + <location filename="../../../../src/cmd.cpp" line="54"/> <source>Build Version: </source> <translation type="unfinished"></translation> </message> @@ -5533,27 +5789,27 @@ If Data And Signature is COMBINED within a single file, KEEP THIS EMPTY: </sourc <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/GpgFrontendUIInit.cpp" line="54"/> + <location filename="../../../../src/ui/GpgFrontendUIInit.cpp" line="56"/> <source>Loading Gnupg Info...</source> <translation type="unfinished">Caricamento informazioni Gnupg...</translation> </message> <message> - <location filename="../../../../src/ui/GpgFrontendUIInit.cpp" line="55"/> + <location filename="../../../../src/ui/GpgFrontendUIInit.cpp" line="57"/> <source>If this process is too slow, please set the key server address appropriately in the gnupg configuration file (depending on the network situation in your country or region).</source> <translation type="unfinished">Se questo processo è troppo lento, impostare l'indirizzo del server delle chiavi in modo appropriato nel file di configurazione di gnupg (a seconda della situazione della rete nel proprio paese o regione).</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="63"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="64"/> <source>Show Verify Details</source> <translation type="unfinished">Mostra dettagli di verifica</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="71"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="72"/> <source>Public key not found locally</source> <translation type="unfinished">Chiave pubblica non trovata localmente</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="72"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="73"/> <source>There is no target public key content in local for GpgFrontend to gather enough information about this Signature. Do you want to import the public key from Keyserver now?</source> <translation type="unfinished">Non c'è contenuto di chiave pubblica di destinazione in locale per GpgFrontend per raccogliere informazioni sufficienti su questa firma. Vuoi importare la chiave pubblica da Keyserver adesso?</translation> </message> @@ -5611,20 +5867,30 @@ If Data And Signature is COMBINED within a single file, KEEP THIS EMPTY: </sourc <translation type="unfinished">Successo</translation> </message> <message> - <location filename="../../../../src/core/GpgCoreInit.cpp" line="294"/> + <location filename="../../../../src/core/GpgCoreInit.cpp" line="303"/> <source>GpgME initiation failed</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/core/GpgCoreInit.cpp" line="397"/> + <location filename="../../../../src/core/GpgCoreInit.cpp" line="409"/> <source>GpgME Context initiation failed</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/core/GpgCoreInit.cpp" line="406"/> + <location filename="../../../../src/core/GpgCoreInit.cpp" line="418"/> <source>Gpg Key Detabase initiation failed</source> <translation type="unfinished"></translation> </message> + <message> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="486"/> + <source>Sync All Public Key</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="487"/> + <source>You have not checked any public keys that you want to synchronize, do you want to synchronize all local public keys from the key server?</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>QObject</name> diff --git a/resource/lfs/locale/ts/GpgFrontend.zh_CN.ts b/resource/lfs/locale/ts/GpgFrontend.zh_CN.ts index a67c2a5e..9ef9da83 100644 --- a/resource/lfs/locale/ts/GpgFrontend.zh_CN.ts +++ b/resource/lfs/locale/ts/GpgFrontend.zh_CN.ts @@ -221,12 +221,12 @@ </message> <message> <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="105"/> - <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="109"/> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="107"/> <source>Sign Date</source> <translation>签署日期</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="130"/> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="128"/> <source>Signer</source> <translation>签署人</translation> </message> @@ -250,23 +250,23 @@ <translation>世界标准时间</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="109"/> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="107"/> <source>Localized</source> <translation>本地化</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="124"/> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="122"/> <source>Invalid Signers</source> <translation>无效签署人</translation> </message> <message> <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="98"/> - <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="132"/> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="130"/> <source>Fingerprint</source> <translation>指纹</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="134"/> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="132"/> <source>Reason</source> <translation>原因</translation> </message> @@ -290,126 +290,126 @@ </message> <message> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="57"/> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="61"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="60"/> <source>Signed On</source> <translation type="unfinished">签署于</translation> </message> <message> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="57"/> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="192"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="191"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="237"/> <source>UTC</source> <translation type="unfinished">世界标准时间</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="61"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="60"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="194"/> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="239"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="240"/> <source>Localized</source> <translation type="unfinished">本地化</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="64"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="63"/> <source>Signatures List</source> <translation type="unfinished">签名列表</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="71"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="70"/> <source>Signature [%1]:</source> <translation type="unfinished">签名 [%1]:</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="72"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="71"/> <source>Status</source> <translation type="unfinished">状态</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="75"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="74"/> <source>A Bad Signature.</source> <translation type="unfinished">一个错误的签名。</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="77"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="76"/> <source>This Signature is invalid.</source> <translation type="unfinished">此签名无效。</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="82"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="81"/> <source>A</source> <translation type="unfinished">一种</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="84"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="83"/> <source>Good</source> <translation type="unfinished">正常</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="87"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="86"/> <source>Bad</source> <translation type="unfinished">异常</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="90"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="89"/> <source>Expired</source> <translation type="unfinished">已到期</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="93"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="92"/> <source>Missing Key's</source> <translation type="unfinished">密钥缺失</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="96"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="95"/> <source>Revoked Key's</source> <translation type="unfinished">撤销的密钥</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="99"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="98"/> <source>Expired Key's</source> <translation type="unfinished">过期的密钥</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="102"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="101"/> <source>Missing CRL's</source> <translation type="unfinished">CRL缺失</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="106"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="105"/> <source>Signature Fully Valid.</source> <translation type="unfinished">签名完全有效。</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="108"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="107"/> <source>Signature Not Fully Valid.</source> <translation type="unfinished">签名不完全有效。</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="109"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="108"/> <source>Tips</source> <translation type="unfinished">提示</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="110"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="109"/> <source>Adjust Trust Level to make it Fully Vaild</source> <translation type="unfinished">可以调整信任级别,使签名完全有效</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="184"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="183"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="228"/> <source>Fingerprint</source> <translation type="unfinished">指纹</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="186"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="185"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="229"/> <source><unknown></source> <translation type="unfinished"><未知></translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="192"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="191"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="194"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="237"/> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="239"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="240"/> <source>Sign Date</source> <translation type="unfinished">签署日期</translation> </message> @@ -435,47 +435,47 @@ <translation type="unfinished">密钥创建时间</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="117"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="116"/> <source>Key is NOT present with ID 0x</source> <translation type="unfinished">密钥不存在,ID 为 0x</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="126"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="125"/> <source>A signature could NOT be verified due to a Missing Key</source> <translation type="unfinished">由于缺少密钥,无法验证签名</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="132"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="131"/> <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/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="141"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="140"/> <source>A signature is valid but expired</source> <translation type="unfinished">签名有效但已过期</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="148"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="147"/> <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/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="156"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="155"/> <source>There was some other error which prevented the signature verification.</source> <translation type="unfinished">还有一些其他错误阻止了签名验证。</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="164"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="163"/> <source>Error for key with fingerprint</source> <translation type="unfinished">带指纹的密钥错误</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="175"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="174"/> <source>Could not find information that can be used for verification.</source> <translation type="unfinished">找不到可用于验证的信息。</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="184"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="183"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="205"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="228"/> <source>Signed By</source> @@ -486,13 +486,13 @@ <translation type="obsolete">未知</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="189"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="188"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="234"/> <source>Public Key Algo</source> <translation type="unfinished">公钥算法</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="191"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="190"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="236"/> <source>Hash Algo</source> <translation type="unfinished">哈希算法</translation> @@ -503,27 +503,72 @@ </message> </context> <context> + <name>GpgFrontend::Module::GlobalRegisterTable</name> + <message> + <location filename="../../../../src/core/module/GlobalRegisterTable.cpp" line="47"/> + <source>NODE</source> + <translation type="unfinished">结点</translation> + </message> + <message> + <location filename="../../../../src/core/module/GlobalRegisterTable.cpp" line="82"/> + <source>LEAF</source> + <translation type="unfinished">叶结点</translation> + </message> +</context> +<context> + <name>GpgFrontend::Module::GlobalRegisterTableTreeModel::Impl</name> + <message> + <location filename="../../../../src/core/module/GlobalRegisterTable.cpp" line="193"/> + <source><EMPTY></source> + <translation type="unfinished"><空></translation> + </message> + <message> + <location filename="../../../../src/core/module/GlobalRegisterTable.cpp" line="232"/> + <source><UNSUPPORTED></source> + <translation type="unfinished"><不支持></translation> + </message> + <message> + <location filename="../../../../src/core/module/GlobalRegisterTable.cpp" line="267"/> + <source>Key</source> + <translation type="unfinished">键</translation> + </message> + <message> + <location filename="../../../../src/core/module/GlobalRegisterTable.cpp" line="269"/> + <source>Type</source> + <translation type="unfinished">类型</translation> + </message> + <message> + <location filename="../../../../src/core/module/GlobalRegisterTable.cpp" line="271"/> + <source>Value Type</source> + <translation type="unfinished">值类型</translation> + </message> + <message> + <location filename="../../../../src/core/module/GlobalRegisterTable.cpp" line="273"/> + <source>Value</source> + <translation type="unfinished">值</translation> + </message> +</context> +<context> <name>GpgFrontend::Module::Integrated::GnuPGInfoGatheringModule::GnuPGInfoGatheringModule</name> <message> - <location filename="../../../../src/module/integrated/gnupg_info_gathering_module/GnuPGInfoGatheringModule.cpp" line="123"/> <source>Embedded In</source> - <translation type="unfinished">嵌入</translation> + <translation type="obsolete">嵌入</translation> </message> </context> <context> <name>GpgFrontend::UI::AboutDialog</name> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="44"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="41"/> <source>About</source> <translation type="unfinished">关于</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="52"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="47"/> <source>About GpgFrontend</source> <translation type="unfinished">关于 GpgFrontend</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="53"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="51"/> <source>GnuPG</source> <translation type="unfinished">GnuPG</translation> </message> @@ -533,7 +578,7 @@ <translation type="unfinished">翻译贡献者</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="55"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="58"/> <source>Update</source> <translation type="unfinished">更新</translation> </message> @@ -541,131 +586,156 @@ <context> <name>GpgFrontend::UI::AppearanceTab</name> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="42"/> <source>Icon Size</source> - <translation type="unfinished">图标大小</translation> + <translation type="obsolete">图标大小</translation> </message> <message> <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="43"/> + <source>General</source> + <translation type="unfinished">通用</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="45"/> + <source>Theme</source> + <translation type="unfinished">主题</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="49"/> + <source>Toolbar Icon</source> + <translation type="unfinished">工具栏图标</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="51"/> + <source>Size</source> + <translation type="unfinished">大小</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="52"/> <source>small</source> <translation type="unfinished">小</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="44"/> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="53"/> <source>medium</source> <translation type="unfinished">中</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="45"/> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="54"/> <source>large</source> <translation type="unfinished">大</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="47"/> <source>Icon Style</source> - <translation type="unfinished">图标样式</translation> + <translation type="obsolete">图标样式</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="48"/> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="57"/> <source>just text</source> <translation type="unfinished">只显示文字</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="49"/> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="58"/> <source>just icons</source> <translation type="unfinished">只显示图标</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="50"/> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="59"/> <source>text and icons</source> <translation type="unfinished">文字和图标</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="52"/> <source>Window State</source> - <translation type="unfinished">窗口状态</translation> + <translation type="obsolete">窗口状态</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="54"/> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="47"/> <source>Save window size and position on exit.</source> <translation type="unfinished">退出时保存窗口大小和位置。</translation> </message> <message> <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="56"/> + <source>Style</source> + <translation type="unfinished">样式</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="61"/> + <source>Font Size</source> + <translation type="unfinished">字体大小</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="63"/> <source>Text Editor</source> <translation type="unfinished">文本编辑器</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="57"/> <source>Font Size in Text Editor</source> - <translation type="unfinished">文本编辑器中的字体大小</translation> + <translation type="obsolete">文本编辑器中的字体大小</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="59"/> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="64"/> <source>Information Board</source> <translation type="unfinished">信息面板</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="61"/> <source>Font Size in Information Board</source> - <translation type="unfinished">信息面板中的字体大小</translation> + <translation type="obsolete">信息面板中的字体大小</translation> </message> </context> <context> <name>GpgFrontend::UI::ChoosePage</name> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="112"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="107"/> <source>Choose your action...</source> <translation type="unfinished">选择你的行动...</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="113"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="108"/> <source>...by clicking on the appropriate link.</source> <translation type="unfinished">...通过点击相应的链接。</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="116"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="111"/> <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">如果您以前从未使用过 GpgFrontend,而且还没有 gpg 密钥,您可能需要阅读如何</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="120"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="114"/> <source>Generate Key</source> <translation type="unfinished">生成密钥</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="127"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="121"/> <source>If you want to learn how to encrypt, decrypt, sign and verify text, you can read </source> <translation>如果您想了解如何加密、解密、签名和验证文本,可以阅读 </translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="132"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="124"/> <source>Encrypt & Decrypt Text</source> <translation type="unfinished">加密和解密文本</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="132"/> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="148"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="124"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="136"/> <source>or</source> <translation type="unfinished">或者</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="136"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="126"/> <source>Sign & Verify Text</source> <translation type="unfinished">签名和验证文本</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="144"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="134"/> <source>If you want to operate file, you can read </source> <translation>如果要操作文件,可以阅读 </translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="148"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="136"/> <source>Encrypt & Sign File</source> <translation>加密并签署文件</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="152"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="138"/> <source>Sign & Verify File</source> <translation>签署并验证文件</translation> </message> @@ -673,12 +743,12 @@ <context> <name>GpgFrontend::UI::CommonUtils</name> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="185"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="186"/> <source>GnuPG Context Loading Failed</source> <translation type="unfinished">GnuPG 上下文加载失败</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="187"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="188"/> <source>Gnupg(gpg) is not installed correctly, please follow <a href='https://www.gpgfrontend.bktus.com/#/faq?id=how-to-deal-with-39env-loading-failed39'>this notes</a> in FAQ to install Gnupg and then open GpgFrontend. <br />Or, you can open GnuPG Controller to set a custom GnuPG which GpgFrontend should use. Then, GpgFrontend will restart. <br /><br />Breif Reason: %1</source> <translation type="unfinished">Gnupg(gpg) 未正确安装,请按照常见问题中的 <a href='https://www.gpgfrontend.bktus.com/#/faq?id=how-to-deal-with-39env-loading-failed39'>this notes</a> 安装 Gnupg,然后打开 GpgFrontend。<br />或者,您可以打开 GnuPG Controller 设置 GpgFrontend 应使用的自定义 GnuPG。然后,GpgFrontend 将重新启动。 <br /><br />错误原因:%1</translation> </message> @@ -687,29 +757,29 @@ <translation type="obsolete">找不到要导入的密钥</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="445"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="450"/> <source>Timeout</source> <translation type="unfinished">超时</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="250"/> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="381"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="251"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="382"/> <source>Success</source> <translation type="unfinished">成功</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="251"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="252"/> <source>Gpg Operation succeed.</source> <translation type="unfinished">Gpg 操作成功。</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="261"/> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="373"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="262"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="374"/> <source>Failure</source> <translation type="unfinished">失败</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="262"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="263"/> <source>Gpg Operation failed. Error code: %1 @@ -722,14 +792,14 @@ Description: %3</source> 说明: %3</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="287"/> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="294"/> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="497"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="288"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="295"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="502"/> <source>Error</source> <translation type="unfinished">错误</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="279"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="280"/> <source>Open Key</source> <translation type="unfinished">打开密钥</translation> </message> @@ -738,87 +808,87 @@ Description: %3</source> <translation type="obsolete">密钥文件</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="280"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="281"/> <source>Keyring files</source> <translation type="unfinished">密钥圈文件</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="288"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="289"/> <source>Cannot open this file. Please make sure that this is a regular file and it's readable.</source> <translation type="unfinished">无法打开此文件。请确保这是一个普通文件,并且有读取权限。</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="295"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="296"/> <source>The target file is too large for a keyring.</source> <translation>目标文件对于一个密钥来说太大。</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="301"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="302"/> <source>File Open Failed</source> <translation>文件打开失败</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="302"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="303"/> <source>Failed to open file: </source> <translation>打开文件失败: </translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="354"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="355"/> <source>Processing</source> <translation>处理中</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="374"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="375"/> <source>Failed to execute command.</source> <translation>执行命令失败。</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="382"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="383"/> <source>Succeed in executing command.</source> <translation>成功执行命令。</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="384"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="385"/> <source>Warning</source> <translation>警告</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="385"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="386"/> <source>Finished executing command.</source> <translation>命令执行完毕。</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="406"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="407"/> <source>Default Keyserver Not Found</source> <translation>未找到默认密钥服务器</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="407"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="408"/> <source>Cannot read default keyserver from your settings, please set a default keyserver first</source> <translation>无法从您的设置中读取默认密钥服务器,请先设置默认密钥服务器</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="442"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="447"/> <source>Key Not Found</source> <translation>未找到密钥</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="448"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="453"/> <source>Key Server Not Found</source> <translation>未找到密钥服务器</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="451"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="456"/> <source>Connection Error</source> <translation>连接错误</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="462"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="467"/> <source>The key has been updated</source> <translation>密钥已更新</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="464"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="469"/> <source>No need to update the key</source> <translation>无需更新密钥</translation> </message> @@ -834,39 +904,43 @@ Description: %3</source> <context> <name>GpgFrontend::UI::ConclusionPage</name> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="218"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="204"/> <source>Ready.</source> <translation type="unfinished">准备好。</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="219"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="205"/> <source>Have fun with GpgFrontend!</source> <translation type="unfinished">祝您使用 GpgFrontend 愉快!</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="222"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="208"/> <source>You are ready to use GpgFrontend now.<br><br></source> <translation type="unfinished">您现在可以使用 GpgFrontend。<br><br></translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="226"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="210"/> <source>The Online Document</source> <translation type="unfinished">在线文档</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="227"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="211"/> <source> will get you started with GpgFrontend. Anytime you encounter problems, please try to find help from the documentation</source> <translation type="unfinished"> 会让你学会 GpgFrontend 的基本操作。任何时候遇到问题,请尝试从文档中寻求帮助</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="236"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="220"/> <source>Open offline help.</source> <translation type="unfinished">打开离线帮助。</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="239"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="224"/> + <source>Don't show the wizard again.</source> + <translation type="unfinished">不要再显示向导界面。</translation> + </message> + <message> <source>Dont show the wizard again.</source> - <translation type="unfinished">不要再次显示向导。</translation> + <translation type="obsolete">不要再次显示向导。</translation> </message> </context> <context> @@ -1016,128 +1090,128 @@ Description: %3</source> <context> <name>GpgFrontend::UI::FileTreeView</name> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="90"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="103"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="166"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="212"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="234"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="275"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="92"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="105"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="168"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="214"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="236"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="277"/> <source>Error</source> <translation type="unfinished">错误</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="91"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="93"/> <source>The path is not exists, unprivileged or unreachable.</source> <translation type="unfinished">该路径不存在、没有特权或无法访问。</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="104"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="106"/> <source>The file is unprivileged or unreachable.</source> <translation type="unfinished">该目录不存在,或者您的权限不足。</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="157"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="159"/> <source>Warning</source> <translation type="unfinished">警告</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="158"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="160"/> <source>Are you sure you want to delete it?</source> <translation type="unfinished">你确定要删除吗?</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="167"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="169"/> <source>Unable to delete the file or folder.</source> <translation type="unfinished">无法删除文件或文件夹。</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="176"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="189"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="178"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="191"/> <source>Make New Directory</source> <translation type="unfinished">新建目录</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="177"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="190"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="179"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="192"/> <source>Directory Name</source> <translation type="unfinished">目录名称</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="204"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="226"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="206"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="228"/> <source>Create Empty File</source> <translation type="unfinished">创建空文件</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="204"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="226"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="206"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="228"/> <source>Filename (you can given extension)</source> <translation type="unfinished">文件名(您可以指定扩展名)</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="213"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="235"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="215"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="237"/> <source>Unable to create the file.</source> <translation type="unfinished">无法创建文件。</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="267"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="298"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="269"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="300"/> <source>Rename</source> <translation type="unfinished">改名</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="267"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="269"/> <source>New Filename</source> <translation type="unfinished">新文件名</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="276"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="278"/> <source>Unable to rename the file or folder.</source> <translation type="unfinished">无法重命名文件或文件夹。</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="293"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="295"/> <source>Open</source> <translation type="unfinished">打开</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="303"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="305"/> <source>Delete</source> <translation type="unfinished">删除</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="308"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="310"/> <source>Calculate Hash</source> <translation type="unfinished">计算哈希值</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="313"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="315"/> <source>Directory</source> <translation type="unfinished">目录</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="318"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="320"/> <source>File</source> <translation type="unfinished">文件</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="323"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="325"/> <source>Compress...</source> <translation type="unfinished">压缩...</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="330"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="332"/> <source>Open with Default System Application</source> <translation type="unfinished">使用默认系统应用程序打开</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="335"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="337"/> <source>New</source> <translation type="unfinished">新建</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="393"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="395"/> <source>Calculating</source> <translation type="unfinished">计算中</translation> </message> @@ -1239,17 +1313,17 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::GnuPGControllerDialog</name> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="45"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="45"/> <source>General</source> <translation>通用</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="46"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="46"/> <source>Key Database</source> <translation>密钥数据库</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="47"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="47"/> <source>Advanced</source> <translation>高级</translation> </message> @@ -1258,70 +1332,79 @@ This will result in loss of all cached form positions, statuses, key servers, et <translation type="obsolete">无 ASCII 模式</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="49"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="49"/> <source>Use Binary Mode for File Operations</source> <translation>使用二进制模式进行文件操作</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="51"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="51"/> <source>Use Pinentry as Password Input Dialog</source> <translation>使用 Pinentry 作为密码输入对话框</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="52"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="52"/> <source>Enable GpgME Debug Log</source> <translation>启用 GpgME 调试日志</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="53"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="53"/> <source>Use Custom GnuPG</source> <translation>使用自定义 GnuPG</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="54"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="54"/> <source>Select GnuPG Path</source> <translation>选择 GnuPG 路径</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="56"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="56"/> <source>Use Custom GnuPG Key Database Path</source> <translation>使用自定义 GnuPG 密钥数据库路径</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="58"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="58"/> <source>Select Key Database Path</source> <translation>选择密钥数据库路径</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="60"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="60"/> <source>Restart Gpg Agent on start</source> <translation>启动时重启 Gpg Agent</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="64"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="62"/> + <source>Kill all gnupg daemon at close</source> + <translation type="unfinished">在关闭程序时杀死所有GnuPG的守护进程</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="66"/> + <source>Tips: please select a directory where "gpgconf" is located in.</source> + <translation type="unfinished">提示:请选择一个包含有“gpgconf”可执行文件的目录</translation> + </message> + <message> <source>Tips: please select a directroy where "gpgconf" is located in.</source> - <translation>提示:请选择“gpgconf”所在目录。</translation> + <translation type="vanished">提示:请选择“gpgconf”所在目录。</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="66"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="68"/> <source>Tips: notice that modify any of these settings will cause an Application restart.</source> <translation>提示:请注意,修改任何这些设置都会导致应用程序重新启动。</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="98"/> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="118"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="100"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="120"/> <source>Open Directory</source> <translation>打开目录</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="171"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="173"/> <source>GnuPG Controller</source> <translation>GnuPG 控制器</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="356"/> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="363"/> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="375"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="364"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="371"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="383"/> <source>Illegal GnuPG Path</source> <translation>非法 GnuPG 路径</translation> </message> @@ -1330,22 +1413,22 @@ This will result in loss of all cached form positions, statuses, key servers, et <translation type="obsolete">目标 GnuPG 路径为空。</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="357"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="365"/> <source>Target GnuPG Path is not an exists readable directory.</source> <translation>目标 GnuPG 路径不是现有的可读目录。</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="364"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="372"/> <source>Target GnuPG Path is not an absolute path.</source> <translation>目标 GnuPG 路径不是绝对路径。</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="376"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="384"/> <source>Target GnuPG Path contains no "gpgconf" executable.</source> <translation>目标 GnuPG 路径不包含“gpgconf”可执行文件。</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="389"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="397"/> <source>Illegal GnuPG Key Database Path</source> <translation>非法的 GnuPG 密钥数据库路径</translation> </message> @@ -1354,7 +1437,7 @@ This will result in loss of all cached form positions, statuses, key servers, et <translation type="obsolete">目标 GnuPG 密钥数据库路径为空。</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="390"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="398"/> <source>Target GnuPG Key Database Path is not an exists readable directory.</source> <translation>目标 GnuPG 密钥数据库路径不是现有的可读目录。</translation> </message> @@ -1362,53 +1445,53 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::GnupgTab</name> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="44"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="46"/> <source>Name</source> <translation>名称</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="44"/> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="90"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="46"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="92"/> <source>Description</source> <translation>描述</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="44"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="46"/> <source>Version</source> <translation>版本</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="45"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="47"/> <source>Checksum</source> <translation>校验和</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="45"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="47"/> <source>Binary Path</source> <translation>二进制路径</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="47"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="49"/> <source>Components</source> <translation>组件</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="48"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="50"/> <source>Directories</source> <translation>目录</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="49"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="51"/> <source>Options</source> <translation>参数</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="68"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="70"/> <source>Directory Type</source> <translation>目录类型</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="68"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="70"/> <source>Path</source> <translation>路径</translation> </message> @@ -1417,27 +1500,27 @@ This will result in loss of all cached form positions, statuses, key servers, et <translation type="obsolete">配置</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="89"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="91"/> <source>Component</source> <translation>组件</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="89"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="91"/> <source>Group</source> <translation>组</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="89"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="91"/> <source>Key</source> <translation>键</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="90"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="92"/> <source>Default Value</source> <translation>默认值</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="91"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="93"/> <source>Value</source> <translation>值</translation> </message> @@ -1445,22 +1528,22 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::GpgFrontendApplication</name> <message> - <location filename="../../../../src/ui/GpgFrontendApplication.cpp" line="64"/> + <location filename="../../../../src/ui/GpgFrontendApplication.cpp" line="62"/> <source>Standard Exception Thrown</source> <translation>小意外</translation> </message> <message> - <location filename="../../../../src/ui/GpgFrontendApplication.cpp" line="65"/> + <location filename="../../../../src/ui/GpgFrontendApplication.cpp" line="63"/> <source>Oops, an standard exception was thrown during the running of the program. This is not a serious problem, it may be the negligence of the programmer, please report this problem if you can.</source> <translation>糟糕,在程序运行期间遇到了一个小异常。这不是一个严重的问题,应该是由程序员的疏忽导致的,如果可以的话,请报告这个问题。</translation> </message> <message> - <location filename="../../../../src/ui/GpgFrontendApplication.cpp" line="73"/> + <location filename="../../../../src/ui/GpgFrontendApplication.cpp" line="71"/> <source>Unhandled Exception Thrown</source> <translation>未处理的异常</translation> </message> <message> - <location filename="../../../../src/ui/GpgFrontendApplication.cpp" line="74"/> + <location filename="../../../../src/ui/GpgFrontendApplication.cpp" line="72"/> <source>Oops, an unhandled exception was thrown during the running of the program. This is not a serious problem, it may be the negligence of the programmer, please report this problem if you can.</source> <translation>糟糕,在程序运行期间引发了未处理的异常。这不是一个严重的问题,可能是程序员的疏忽,如果可以的话,请报告这个问题。</translation> </message> @@ -1506,37 +1589,37 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::InfoTab</name> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="89"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="102"/> <source>GpgFrontend is an easy-to-use, compact, cross-platform, and installation-free GnuPG Frontend.It visualizes most of the common operations of GnuPG.GpgFrontend is licensed under the GPLv3</source> <translation type="unfinished">GpgFrontend 是一个易于使用、紧凑、跨平台、免安装的 GnuPG 前端。它将 GnuPG 的大部分常用操作可视化。GpgFrontend 是在 GPLv3 下授权的</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="95"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="108"/> <source>Developer:</source> <translation type="unfinished">开发者:</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="96"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="109"/> <source>If you have any questions or suggestions, raise an issue at</source> <translation type="unfinished">如果您有任何问题或建议,请在以下位置提出问题</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="99"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="112"/> <source>or send a mail to my mailing list at</source> <translation type="unfinished">或发送邮件到我的邮件列表</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="101"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="114"/> <source>Built with Qt</source> <translation type="unfinished">用 Qt 构建</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="102"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="115"/> <source>and</source> <translation type="unfinished">和</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="103"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="116"/> <source>Built at</source> <translation type="unfinished">构建于</translation> </message> @@ -1544,42 +1627,58 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::IntroPage</name> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="74"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="71"/> <source>Getting Started...</source> <translation type="unfinished">入门...</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="75"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="72"/> <source>... with GpgFrontend</source> <translation type="unfinished">... 使用 GpgFrontend</translation> </message> <message> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="75"/> + <source>Welcome to GpgFrontend for decrypting and signing text or files!</source> + <translation type="unfinished">欢迎使用GpgFrontend!你可以使用该工具解密、签名文本与文件。</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="77"/> + <source>is a Powerful, Easy-to-Use, Compact, Cross-Platform, and Installation-Free OpenPGP Crypto Tool. </source> + <translation type="unfinished">是一个强大、易用、灵活、跨平台与免安装的OpenPGP加密工具。</translation> + </message> + <message> <location filename="../../../../src/ui/dialog/Wizard.cpp" line="79"/> - <source>Welcome to use GpgFrontend for decrypting and signing text or file!</source> - <translation type="unfinished">欢迎使用 GpgFrontend 对文本或文件进行解密和签名!</translation> + <source>To get started, be sure to check out the</source> + <translation type="unfinished">初次使用,确认阅读过</translation> </message> <message> <location filename="../../../../src/ui/dialog/Wizard.cpp" line="82"/> + <source>by clicking the link, the page will open in your web browser</source> + <translation type="unfinished">点击链接后,将通过浏览器打开该页面</translation> + </message> + <message> + <source>Welcome to use GpgFrontend for decrypting and signing text or file!</source> + <translation type="obsolete">欢迎使用 GpgFrontend 对文本或文件进行解密和签名!</translation> + </message> + <message> <source>is a Powerful, Easy-to-Use, Compact, Cross-Platform, and Installation-Free OpenPGP Crypto Tool.</source> - <translation type="unfinished">是一款功能强大、易于使用、紧凑、跨平台且免安装的 OpenPGP 加密工具。</translation> + <translation type="obsolete">是一款功能强大、易于使用、紧凑、跨平台且免安装的 OpenPGP 加密工具。</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="84"/> <source>For brief information have a look at the</source> - <translation type="unfinished">简要信息,请查看</translation> + <translation type="obsolete">简要信息,请查看</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="86"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="81"/> <source>Overview</source> <translation type="unfinished">概述</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="87"/> <source>by clicking the link, the page will open in the web browser</source> - <translation type="unfinished">单击来在网络浏览器中打开链接</translation> + <translation type="obsolete">单击来在网络浏览器中打开链接</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="96"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="91"/> <source>If it supports the language currently being used in your system, GpgFrontend will automatically set it.</source> <translation type="unfinished">GpgFrontend 已经自动将语言设置为中文。</translation> </message> @@ -1635,87 +1734,87 @@ This will result in loss of all cached form positions, statuses, key servers, et <translation type="unfinished">过期时间太长。</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="151"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="152"/> <source>Generating</source> <translation type="unfinished">生成</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="160"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="161"/> <source>Error</source> <translation type="unfinished">错误</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="161"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="162"/> <source>Unknown error occurred</source> <translation type="unfinished">发生了未知错误</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="197"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="198"/> <source>Key Usage</source> <translation type="unfinished">密钥使用</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="199"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="200"/> <source>Encryption</source> <translation type="unfinished">加密</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="202"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="203"/> <source>Signing</source> <translation type="unfinished">签名</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="205"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="206"/> <source>Certification</source> <translation type="unfinished">认证</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="208"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="209"/> <source>Authentication</source> <translation type="unfinished">验证</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="435"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="436"/> <source>Name</source> <translation type="unfinished">姓名</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="436"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="437"/> <source>Email Address</source> <translation type="unfinished">电子邮件地址</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="437"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="438"/> <source>Comment</source> <translation type="unfinished">注释</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="438"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="439"/> <source>Expiration Date</source> <translation type="unfinished">截止日期</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="439"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="440"/> <source>Never Expire</source> <translation type="unfinished">永不过期</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="440"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="441"/> <source>KeySize (in Bit)</source> <translation type="unfinished">密钥大小(以位为单位)</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="441"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="442"/> <source>Key Type</source> <translation type="unfinished">密钥类型</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="442"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="443"/> <source>Non Pass Phrase</source> <translation type="unfinished">不设置密码</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="455"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="456"/> <source>Basic Information</source> <translation type="unfinished">基本信息</translation> </message> @@ -1723,27 +1822,27 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::KeyGenPage</name> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="178"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="164"/> <source>Create a keypair...</source> <translation type="unfinished">创建密钥对...</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="179"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="165"/> <source>...for decrypting and signing messages</source> <translation type="unfinished">...用于解密和签署消息</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="181"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="167"/> <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">您应该创建一个新的密钥对。该对由一个公钥和一个私钥组成。<br>其他用户可以使用公钥为您加密消息并验证您签署的消息。您可以使用私钥解密和签名消息。<br>有关更多信息,请查看离线教程(然后显示在主窗口中):</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="193"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="179"/> <source>Offline tutorial</source> <translation type="unfinished">离线教程</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="197"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="183"/> <source>Create New Key</source> <translation type="unfinished">创建新密钥</translation> </message> @@ -1955,42 +2054,42 @@ This will result in loss of all cached form positions, statuses, key servers, et <translation type="unfinished">正在刷新密钥列表...</translation> </message> <message> - <location filename="../../../../src/ui/widgets/KeyList.cpp" line="354"/> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="374"/> <source>Import Keys</source> <translation type="unfinished">导入密钥</translation> </message> <message> - <location filename="../../../../src/ui/widgets/KeyList.cpp" line="356"/> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="376"/> <source>You've dropped something on the table.</source> <translation type="unfinished">你把东西掉在桌子上了。</translation> </message> <message> - <location filename="../../../../src/ui/widgets/KeyList.cpp" line="357"/> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="377"/> <source>GpgFrontend will now try to import key(s).</source> <translation type="unfinished">GpgFrontend 现在将尝试导入密钥。</translation> </message> <message> - <location filename="../../../../src/ui/widgets/KeyList.cpp" line="360"/> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="380"/> <source>Always import without bothering.</source> <translation type="unfinished">始终导入而无需打扰。</translation> </message> <message> - <location filename="../../../../src/ui/widgets/KeyList.cpp" line="455"/> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="475"/> <source>Key List Refreshed.</source> <translation type="unfinished">密钥列表已刷新。</translation> </message> <message> - <location filename="../../../../src/ui/widgets/KeyList.cpp" line="476"/> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="510"/> <source>Syncing Key List...</source> <translation type="unfinished">正在同步密钥列表...</translation> </message> <message> - <location filename="../../../../src/ui/widgets/KeyList.cpp" line="484"/> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="518"/> <source>Sync [%1/%2] %3 %4</source> <translation type="unfinished">同步 [%1/%2] %3 %4</translation> </message> <message> - <location filename="../../../../src/ui/widgets/KeyList.cpp" line="494"/> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="528"/> <source>Key List Sync Done.</source> <translation type="unfinished">密钥列表同步完成。</translation> </message> @@ -2070,7 +2169,7 @@ This will result in loss of all cached form positions, statuses, key servers, et </message> <message> <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="171"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="261"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="265"/> <source>File</source> <translation type="unfinished">文件</translation> </message> @@ -2101,7 +2200,7 @@ This will result in loss of all cached form positions, statuses, key servers, et </message> <message> <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="202"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="532"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="536"/> <source>Key Package</source> <translation type="unfinished">密钥包</translation> </message> @@ -2146,220 +2245,220 @@ This will result in loss of all cached form positions, statuses, key servers, et <translation type="unfinished">删除这些选定的密钥</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="232"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="233"/> <source>Delete the Selected keys</source> <translation type="unfinished">删除这个选定的密钥</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="236"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="237"/> <source>Delete Checked Key(s)</source> <translation type="unfinished">删除选中的密钥</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="237"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="239"/> <source>Delete the Checked keys</source> <translation type="unfinished">删除选中的密钥</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="242"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="244"/> <source>Show Key Details</source> <translation type="unfinished">显示密钥细节</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="243"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="246"/> <source>Show Details for this Key</source> <translation type="unfinished">显示此密钥的详细信息</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="247"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="248"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="250"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="252"/> <source>Set Owner Trust Level</source> <translation type="unfinished">设置所有者信任级别</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="265"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="285"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="269"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="289"/> <source>Key</source> <translation type="unfinished">密钥</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="266"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="270"/> <source>Generate Key</source> <translation type="unfinished">生成密钥</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="270"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="298"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="274"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="302"/> <source>Import Key</source> <translation type="unfinished">导入密钥</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="276"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="306"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="307"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="280"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="310"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="311"/> <source>Export Key</source> <translation type="unfinished">导出密钥</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="297"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="301"/> <source>Import key</source> <translation type="unfinished">导入密钥</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="340"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="344"/> <source>Deleting Keys</source> <translation type="unfinished">删除密钥</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="341"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="345"/> <source>Are you sure that you want to delete the following keys?</source> <translation type="unfinished">您确定要删除以下密钥吗?</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="343"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="347"/> <source>The action can not be undone.</source> <translation type="unfinished">该操作无法撤消。</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="359"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="408"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="420"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="448"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="487"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="498"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="511"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="541"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="549"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="565"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="573"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="589"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="363"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="412"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="424"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="452"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="491"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="502"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="515"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="545"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="553"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="569"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="577"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="593"/> <source>Error</source> <translation type="unfinished">错误</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="359"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="448"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="363"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="452"/> <source>Key Not Found.</source> <translation type="unfinished">未找到密钥。</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="370"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="383"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="466"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="472"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="374"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="387"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="470"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="476"/> <source>Forbidden</source> <translation type="unfinished">操作被禁止</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="371"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="384"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="375"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="388"/> <source>Please check some keys before doing this operation.</source> <translation type="unfinished">请在执行此操作之前勾选一些密钥。</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="376"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="524"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="380"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="528"/> <source>key(s) exported</source> <translation type="unfinished">导出的密钥</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="400"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="479"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="404"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="483"/> <source>Exporting</source> <translation type="unfinished">导出中</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="409"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="421"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="488"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="499"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="413"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="425"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="492"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="503"/> <source>Unknown error occurred</source> <translation type="unfinished">发生了未知错误</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="442"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="452"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="446"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="456"/> <source>Invalid Operation</source> <translation type="unfinished">无效操作</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="443"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="447"/> <source>Please select one KeyPair before doing this operation.</source> <translation type="unfinished">请在执行此操作前选择一个钥对。</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="453"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="457"/> <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> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="467"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="471"/> <source>Please check a key before performing this operation.</source> <translation type="unfinished">请在执行此操作前勾选一个密钥。</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="473"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="477"/> <source>This operation accepts just a single key.</source> <translation type="unfinished">此操作只接受单个密钥。</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="512"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="516"/> <source>This key may not be able to export as OpenSSH format. Please check the key-size of the subkey(s) used to sign.</source> <translation type="unfinished">此密钥可能无法导出为 OpenSSH 格式。请检查用于签名的子密钥的密钥大小。</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="519"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="523"/> <source>Export OpenSSH Key To File</source> <translation type="unfinished">将 OpenSSH 密钥导出到文件</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="520"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="524"/> <source>OpenSSH Public Key Files</source> <translation type="unfinished">OpenSSH 公钥文件</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="532"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="536"/> <source>Import Key Package</source> <translation type="unfinished">导入密钥包</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="542"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="566"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="546"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="570"/> <source>Cannot open this file. Please make sure that this is a regular file and it's readable.</source> <translation type="unfinished">无法打开此文件。请确保这是一个普通文件,并且有读取权限。</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="550"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="554"/> <source>The target file is too large for a key package.</source> <translation type="unfinished">目标文件对于密钥包来说太大。</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="555"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="559"/> <source>Import Key Package Passphrase File</source> <translation type="unfinished">导入密钥包口令文件</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="556"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="560"/> <source>Key Package Passphrase File</source> <translation type="unfinished">密钥包口令文件</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="574"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="578"/> <source>The target file is too large for a key package passphrase.</source> <translation type="unfinished">目标文件对于密钥包口令来说太大。</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="580"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="584"/> <source>Importing</source> <translation type="unfinished">导入中</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="596"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="600"/> <source>key(s) imported</source> <translation type="unfinished">导入的密钥</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="590"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="594"/> <source>An error occur in importing key package.</source> <translation type="unfinished">导入密钥包出错。</translation> </message> @@ -3183,138 +3282,138 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::KeyServerImportDialog</name> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="58"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="56"/> <source>Close</source> <translation type="unfinished">关闭</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="61"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="59"/> <source>Import ALL</source> <translation type="unfinished">全部导入</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="65"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="63"/> <source>Search</source> <translation type="unfinished">搜索</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="70"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="68"/> <source>Search String</source> <translation type="unfinished">搜索字符串</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="70"/> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="74"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="68"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="72"/> <source>: </source> <translation>: </translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="74"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="72"/> <source>Key Server</source> <translation type="unfinished">密钥服务器</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="115"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="113"/> <source>Import Keys from Keyserver</source> <translation type="unfinished">从密钥服务器导入密钥</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="155"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="153"/> <source>UID</source> <translation type="unfinished">UID</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="155"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="153"/> <source>Creation date</source> <translation type="unfinished">创建日期</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="155"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="153"/> <source>KeyID</source> <translation type="unfinished">密钥 ID</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="155"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="153"/> <source>Tag</source> <translation type="unfinished">标签</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="178"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="176"/> <source>Text is empty.</source> <translation type="unfinished">文字为空。</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="225"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="223"/> <source>Not Key Found</source> <translation type="unfinished">未找到密钥</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="228"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="226"/> <source>Timeout</source> <translation type="unfinished">超时</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="231"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="229"/> <source>Key Server Not Found</source> <translation type="unfinished">未找到密钥服务器</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="234"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="232"/> <source>Connection Error</source> <translation type="unfinished">连接错误</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="243"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="241"/> <source>Too many responses from keyserver!</source> <translation type="unfinished">来自密钥服务器的响应太多!</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="252"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="253"/> <source>No keys found, input may be kexId, retrying search with 0x.</source> <translation type="unfinished">未找到密钥,输入可能是 kexId,正在使用 0x 重试。</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="261"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="263"/> <source>No keys found containing the search string!</source> <translation type="unfinished">未找到包含搜索字符串的密钥!</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="267"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="270"/> <source>Insufficiently specific search string!</source> <translation type="unfinished">不够具体的搜索字符串!</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="301"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="305"/> <source>revoked</source> <translation type="unfinished">撤销</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="304"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="308"/> <source>disabled</source> <translation type="unfinished">被禁用</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="349"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="353"/> <source>%1 keys found. Double click a key to import it.</source> <translation type="unfinished">找到 %1 个密钥。双击一个密钥来导入它。</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="371"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="374"/> <source>Warning</source> <translation type="unfinished">警告</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="372"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="375"/> <source>Please select one KeyPair before doing this operation.</source> <translation type="unfinished">请在执行此操作前选择一个钥对。</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="419"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="422"/> <source>Key Imported</source> <translation type="unfinished">密钥导入成功</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="430"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="433"/> <source>Processing ...</source> <translation type="unfinished">处理中 ......</translation> </message> @@ -3322,27 +3421,27 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::KeyServerImportTask</name> <message> - <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="74"/> + <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="79"/> <source>Key not found in the Keyserver.</source> <translation type="unfinished">密钥服务器中找不到密钥。</translation> </message> <message> - <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="77"/> + <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="82"/> <source>Network connection timeout.</source> <translation type="unfinished">网络连接错误。</translation> </message> <message> - <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="80"/> + <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="85"/> <source>Cannot resolve the address of target key server.</source> <translation type="unfinished">网络连接超时。</translation> </message> <message> - <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="83"/> + <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="88"/> <source>General connection error occurred.</source> <translation type="unfinished">出现一般连接错误。</translation> </message> <message> - <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="89"/> + <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="94"/> <source>Success</source> <translation type="unfinished">成功</translation> </message> @@ -3431,52 +3530,52 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::KeyUploadDialog</name> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="59"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="60"/> <source>Uploading Public Key</source> <translation type="unfinished">上传公钥</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="77"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="78"/> <source>Error</source> <translation type="unfinished">错误</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="78"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="79"/> <source>Unknown error occurred</source> <translation type="unfinished">发生未知错误</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="147"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="150"/> <source>Key Not Found</source> <translation type="unfinished">未找到密钥</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="150"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="153"/> <source>Timeout</source> <translation type="unfinished">超时</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="153"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="156"/> <source>Key Server Not Found</source> <translation type="unfinished">未找到密钥服务器</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="156"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="159"/> <source>Connection Error</source> <translation type="unfinished">连接错误</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="158"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="161"/> <source>Upload Failed</source> <translation type="unfinished">上传失败</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="162"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="165"/> <source>Upload Success</source> <translation type="unfinished">上传成功</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="163"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="166"/> <source>Upload Public Key Successfully</source> <translation type="unfinished">上传公钥成功</translation> </message> @@ -3613,13 +3712,13 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::MainWindow</name> <message> - <location filename="../../../../src/ui/main_window/MainWindow.cpp" line="156"/> - <location filename="../../../../src/ui/main_window/MainWindow.cpp" line="159"/> + <location filename="../../../../src/ui/main_window/MainWindow.cpp" line="154"/> + <location filename="../../../../src/ui/main_window/MainWindow.cpp" line="157"/> <source>Critical error occur while loading GpgFrontend.</source> <translation type="unfinished">加载 GpgFrontend 时发生严重错误。</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindow.cpp" line="158"/> + <location filename="../../../../src/ui/main_window/MainWindow.cpp" line="156"/> <source>Loading Failed</source> <translation type="unfinished">加载失败</translation> </message> @@ -3641,20 +3740,20 @@ This will result in loss of all cached form positions, statuses, key servers, et <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="380"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="435"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="454"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="489"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="508"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="536"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="576"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="613"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="639"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="679"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="717"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="743"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="751"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="775"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="812"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="822"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="847"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="490"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="509"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="537"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="577"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="614"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="640"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="680"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="718"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="744"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="752"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="776"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="813"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="823"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="848"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="74"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="121"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="177"/> @@ -3663,14 +3762,14 @@ This will result in loss of all cached form positions, statuses, key servers, et <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="322"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="368"/> <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="97"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="120"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="140"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="156"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="169"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="182"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="197"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="247"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="255"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="121"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="141"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="157"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="170"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="183"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="198"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="248"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="256"/> <source>Error</source> <translation type="unfinished">错误</translation> </message> @@ -3681,10 +3780,10 @@ This will result in loss of all cached form positions, statuses, key servers, et <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="330"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="381"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="455"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="537"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="640"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="744"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="813"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="538"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="641"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="745"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="814"/> <source>Cannot read from file: %1</source> <translation type="unfinished">无法读取文件:%1</translation> </message> @@ -3700,10 +3799,10 @@ This will result in loss of all cached form positions, statuses, key servers, et <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="288"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="338"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="416"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="583"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="686"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="757"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="828"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="584"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="687"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="758"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="829"/> <source>Warning</source> <translation type="unfinished">警告</translation> </message> @@ -3712,10 +3811,10 @@ This will result in loss of all cached form positions, statuses, key servers, et <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="190"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="298"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="348"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="577"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="680"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="752"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="823"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="578"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="681"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="753"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="824"/> <source>Cannot write to file: %1</source> <translation type="unfinished">无法写入文件:%1</translation> </message> @@ -3746,11 +3845,11 @@ This will result in loss of all cached form positions, statuses, key servers, et <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="312"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="362"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="436"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="509"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="614"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="718"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="776"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="848"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="510"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="615"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="719"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="777"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="849"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="75"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="122"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="178"/> @@ -3764,8 +3863,8 @@ This will result in loss of all cached form positions, statuses, key servers, et <message> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="126"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="241"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="558"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="661"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="559"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="662"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="279"/> <source>Invalid KeyPair</source> <translation type="unfinished">无效的密钥对</translation> @@ -3773,8 +3872,8 @@ This will result in loss of all cached form positions, statuses, key servers, et <message> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="127"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="242"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="559"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="662"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="560"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="663"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="280"/> <source>The selected keypair cannot be used for encryption.</source> <translation type="unfinished">所选的密钥对不能用于加密。</translation> @@ -3782,8 +3881,8 @@ This will result in loss of all cached form positions, statuses, key servers, et <message> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="128"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="243"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="560"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="663"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="561"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="664"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="103"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="159"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="281"/> @@ -3809,8 +3908,8 @@ This will result in loss of all cached form positions, statuses, key servers, et <message> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="289"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="339"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="584"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="687"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="585"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="688"/> <source>The target file already exists, do you need to overwrite it?</source> <translation type="unfinished">目标文件已经存在,是否需要覆盖?</translation> </message> @@ -3827,8 +3926,8 @@ This will result in loss of all cached form positions, statuses, key servers, et </message> <message> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="390"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="547"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="650"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="548"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="651"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="147"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="267"/> <source>No Key Checked</source> @@ -3836,8 +3935,8 @@ This will result in loss of all cached form positions, statuses, key servers, et </message> <message> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="391"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="548"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="651"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="549"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="652"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="148"/> <source>Please check the key in the key toolbox on the right.</source> <translation type="unfinished">请勾选右侧密钥工具箱中的密钥。</translation> @@ -3883,41 +3982,41 @@ If Data And Signature is COMBINED within a single file, KEEP THIS EMPTY: </sourc 如果确认数据和签名都在一个文件中,请置空: </translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="490"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="491"/> <source>Please select the appropriate origin file or signature file. Ensure that both are in this directory.</source> <translation type="unfinished">请选择合适的源文件或签名文件。确保两者都在此目录中。</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="499"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="500"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="237"/> <source>Verifying</source> <translation type="unfinished">验证</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="602"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="603"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="310"/> <source>Encrypting and Signing</source> <translation type="unfinished">加密和签名</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="705"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="706"/> <source>Archiving & Encrypting & Signing</source> <translation type="unfinished">正在进行打包、加密及签名操作</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="758"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="829"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="759"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="830"/> <source>The output file %1 already exists, do you need to overwrite it?</source> <translation type="unfinished">输出文件 %1 已经存在,是否需要覆盖?</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="767"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="768"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="358"/> <source>Decrypting and Verifying</source> <translation type="unfinished">解密和验证</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="838"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="839"/> <source>Decrypting & Verifying & Extracting</source> <translation type="unfinished">正在进行解包、解密及验证操作</translation> </message> @@ -3943,12 +4042,12 @@ If Data And Signature is COMBINED within a single file, KEEP THIS EMPTY: </sourc </message> <message> <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="97"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="120"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="140"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="156"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="169"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="182"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="197"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="121"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="141"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="157"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="170"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="183"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="198"/> <source>Key Not Found.</source> <translation type="unfinished">未找到密钥。</translation> </message> @@ -3963,805 +4062,962 @@ If Data And Signature is COMBINED within a single file, KEEP THIS EMPTY: </sourc <translation type="unfinished">世界标准时间</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="125"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="126"/> <source>Local Time</source> <translation type="unfinished">当地时间</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="248"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="249"/> <source>Cannot open this file. Please make sure that this is a regular file and it's readable.</source> <translation type="unfinished">无法打开此文件。请确保这是一个普通文件,并且有读取权限。</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="256"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="257"/> <source>Cannot open this file. The file is TOO LARGE (>1MB) for GpgFrontend Text Editor.</source> <translation type="unfinished">无法打开此文件。文件对于 GpgFrontend 文本编辑器来说过大(>1MB)。</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="302"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="298"/> <source>GpgFrontend Upgradeable (New Version: %1).</source> <translation type="unfinished">GpgFrontend 可升级(新版本:%1)。</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="312"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="302"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="448"/> + <source>Update</source> + <translation type="unfinished">更新</translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="308"/> <source>Withdrawn Version</source> <translation type="unfinished">被召回的版本</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="314"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="310"/> <source>This version(%1) may have been withdrawn by the developer due to serious problems. Please stop using this version immediately and use the latest stable version.</source> <translation type="unfinished">由于严重问题,此版本(%1) 可能已被开发人员召回。请立即停止使用此版本并使用最新的稳定版。</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="319"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="315"/> <source>You can download the latest stable version(%1) on Github Releases Page.<br/></source> <translation type="unfinished">您可以在 Github Releases Page 上下载最新的稳定版 (%1)。<br/></translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="324"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="320"/> <source>This maybe a BETA Version (Latest Stable Version: %1).</source> <translation type="unfinished">这可能是 BETA 版本(最新稳定版:%1)。</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="44"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="45"/> <source>New</source> <translation type="unfinished">新建</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="50"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="51"/> <source>Open a new file</source> <translation type="unfinished">打开一个新文件</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="53"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="54"/> <source>Open...</source> <translation type="unfinished">打开...</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="56"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="57"/> <source>Open an existing file</source> <translation type="unfinished">打开现有文件</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="59"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="60"/> <source>File Browser</source> <translation type="unfinished">文件浏览器</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="62"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="63"/> <source>Open a file browser</source> <translation type="unfinished">打开文件浏览器</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="66"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="67"/> <source>Save File</source> <translation type="unfinished">保存文件</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="69"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="70"/> <source>Save the current File</source> <translation type="unfinished">保存当前文件</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="72"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="73"/> <source>Save As</source> <translation type="unfinished">另存为</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="75"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="76"/> <source>Save the current File as...</source> <translation type="unfinished">将当前文件另存为...</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="78"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="79"/> <source>Print</source> <translation type="unfinished">打印</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="81"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="82"/> <source>Print Document</source> <translation type="unfinished">打印文件</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="84"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="85"/> <source>Close</source> <translation type="unfinished">关闭</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="86"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="88"/> <source>Close file</source> <translation type="unfinished">关闭文件</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="89"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="91"/> <source>Quit</source> <translation type="unfinished">退出</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="92"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="94"/> <source>Quit Program</source> <translation type="unfinished">退出程序</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="97"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="99"/> <source>Undo</source> <translation type="unfinished">撤消</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="99"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="102"/> <source>Undo Last Edit Action</source> <translation type="unfinished">撤消上次编辑操作</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="102"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="105"/> <source>Redo</source> <translation type="unfinished">重做</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="104"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="108"/> <source>Redo Last Edit Action</source> <translation type="unfinished">重做上次编辑操作</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="107"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="111"/> <source>Zoom In</source> <translation type="unfinished">放大</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="111"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="116"/> <source>Zoom Out</source> <translation type="unfinished">缩小</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="115"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="121"/> <source>Paste</source> <translation type="unfinished">粘贴</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="118"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="124"/> <source>Paste Text From Clipboard</source> <translation type="unfinished">从剪贴板粘贴文本</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="121"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="127"/> <source>Cut</source> <translation type="unfinished">剪切</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="125"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="131"/> <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="129"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="135"/> <source>Copy</source> <translation type="unfinished">复制</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="133"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="139"/> <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="137"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="143"/> <source>Quote</source> <translation type="unfinished">引用</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="139"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="145"/> <source>Quote whole text</source> <translation type="unfinished">引用全文</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="142"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="148"/> <source>Select All</source> <translation type="unfinished">全选</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="145"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="151"/> <source>Select the whole text</source> <translation type="unfinished">选择整个文本</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="149"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="155"/> <source>Find</source> <translation type="unfinished">查找</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="152"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="158"/> <source>Find a word</source> <translation type="unfinished">找一个词</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="155"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="161"/> <source>Remove spacing</source> <translation type="unfinished">删除间距</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="160"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="166"/> <source>Remove double linebreaks, e.g. in pasted text from Web Mailer</source> <translation type="unfinished">删除双换行符,例如在来自 Web Mailer 的粘贴文本中</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="164"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="170"/> <source>Settings</source> <translation type="unfinished">设置</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="165"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="171"/> <source>Open settings dialog</source> <translation type="unfinished">打开设置对话框</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="173"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="179"/> <source>Encrypt</source> <translation type="unfinished">加密</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="177"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="183"/> <source>Encrypt Message</source> <translation type="unfinished">加密消息</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="195"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="201"/> <source>Encrypt Sign</source> <translation type="unfinished">加密签名</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="200"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="206"/> <source>Encrypt and Sign Message</source> <translation type="unfinished">加密和签名消息</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="218"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="224"/> <source>Decrypt</source> <translation type="unfinished">解密</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="221"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="227"/> <source>Decrypt Message</source> <translation type="unfinished">解密消息</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="243"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="249"/> <source>Decrypt Verify</source> <translation type="unfinished">解密验证</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="247"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="253"/> <source>Decrypt and Verify Message</source> <translation type="unfinished">解密和验证消息</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="269"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="275"/> <source>Sign</source> <translation type="unfinished">签名</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="272"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="278"/> <source>Sign Message</source> <translation type="unfinished">签名留言</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="284"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="290"/> <source>Verify</source> <translation type="unfinished">验证</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="287"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="293"/> <source>Verify Message</source> <translation type="unfinished">验证消息</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="302"/> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="540"/> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="614"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="308"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="554"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="636"/> <source>File</source> <translation type="unfinished">文件</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="304"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="310"/> <source>Import New Key From File</source> <translation type="unfinished">从文件导入新密钥</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="308"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="314"/> <source>Clipboard</source> <translation type="unfinished">剪贴板</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="312"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="318"/> <source>Import New Key From Clipboard</source> <translation type="unfinished">从剪贴板导入新密钥</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="323"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="329"/> <source>Keyserver</source> <translation type="unfinished">密钥服务器</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="327"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="333"/> <source>Import New Key From Keyserver</source> <translation type="unfinished">从密钥服务器导入新密钥</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="333"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="339"/> <source>Editor</source> <translation type="unfinished">编辑</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="335"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="341"/> <source>Import New Key From Editor</source> <translation type="unfinished">从编辑器导入新密钥</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="339"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="345"/> <source>Manage Keys</source> <translation type="unfinished">管理密钥</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="341"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="347"/> <source>Open Key Management</source> <translation type="unfinished">打开密钥管理器</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="345"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="351"/> <source>Clear Password Cache</source> <translation type="unfinished">清除密码缓存</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="348"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="354"/> <source>Clear Password Cache of GnuPG</source> <translation type="unfinished">清除 GnuPG 的密码缓存</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="353"/> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="370"/> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="391"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="359"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="376"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="397"/> <source>Successful Operation</source> <translation type="unfinished">操作成功</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="354"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="360"/> <source>Clear password cache successfully</source> <translation type="unfinished">清除密码缓存成功</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="356"/> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="374"/> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="395"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="362"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="380"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="401"/> <source>Failed Operation</source> <translation type="unfinished">操作失败</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="357"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="363"/> <source>Failed to clear password cache of GnuPG</source> <translation type="unfinished">无法清除 GnuPG 的密码缓存</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="362"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="368"/> <source>Reload All Components</source> <translation type="unfinished">重新加载所有组件</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="364"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="370"/> <source>Reload All GnuPG's Components</source> <translation type="unfinished">重新加载所有 GnuPG 的组件</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="371"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="377"/> <source>Reload all the GnuPG's components successfully</source> <translation type="unfinished">成功重新加载所有 GnuPG 组件</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="375"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="381"/> <source>Failed to reload all or one of the GnuPG's component(s)</source> <translation type="unfinished">未能重新加载所有或其中一个 GnuPG 组件</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="380"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="386"/> <source>Restart All Components</source> <translation type="unfinished">重新启动所有组件</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="382"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="388"/> <source>Restart All GnuPG's Components</source> <translation type="unfinished">重新启动所有 GnuPG 的组件</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="392"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="398"/> <source>Restart all the GnuPG's components successfully</source> <translation type="unfinished">成功重启所有 GnuPG 组件</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="396"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="402"/> <source>Failed to restart all or one of the GnuPG's component(s)</source> <translation type="unfinished">无法重新启动所有或其中一个 GnuPG 组件</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="401"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="407"/> <source>Open GnuPG Controller</source> <translation type="unfinished">打开 GnuPG 控制器</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="403"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="409"/> <source>Open GnuPG Controller Dialog</source> <translation type="unfinished">打开 GnuPG 控制器对话框</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="410"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="413"/> + <source>Open Module Controller</source> + <translation type="unfinished">打开模组管理器</translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="415"/> + <source>Open Module Controller Dialog</source> + <translation type="unfinished">打开模组管理器窗口</translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="422"/> <source>About</source> <translation type="unfinished">关于</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="412"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="424"/> <source>Show the application's About box</source> <translation type="unfinished">显示应用程序的关于界面</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="417"/> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="590"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="430"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="434"/> <source>GnuPG</source> <translation type="unfinished">GnuPG</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="419"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="432"/> <source>Information about Gnupg</source> <translation type="unfinished">关于 Gnupg</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="423"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="437"/> <source>Translate</source> <translation type="unfinished">翻译</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="425"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="439"/> <source>Information about translation</source> <translation type="unfinished">翻译信息</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="432"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="441"/> + <source>Translators</source> + <translation type="unfinished">翻译贡献者</translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="444"/> <source>Check for Updates</source> <translation type="unfinished">检查更新</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="434"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="446"/> <source>Check for updates</source> <translation type="unfinished">检查更新</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="438"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="451"/> <source>Open Wizard</source> <translation type="unfinished">打开向导</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="439"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="453"/> <source>Open the wizard</source> <translation type="unfinished">打开向导</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="444"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="458"/> <source>Append Public Key to Editor</source> <translation type="unfinished">将公钥附加到编辑器</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="446"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="460"/> <source>Append selected Keypair's Public Key to Editor</source> <translation type="unfinished">将选定的密钥对的公钥附加到编辑器</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="451"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="465"/> <source>Append Create DateTime to Editor</source> <translation type="unfinished">将创建日期时间附加到编辑器</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="453"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="467"/> <source>Append selected Key's creation date and time to Editor</source> <translation type="unfinished">将所选密钥的创建日期和时间附加到编辑器</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="458"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="472"/> <source>Append Expire DateTime to Editor</source> <translation type="unfinished">将过期日期时间附加到编辑器</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="460"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="474"/> <source>Append selected Key's expiration date and time to Editor</source> <translation type="unfinished">将所选密钥的到期日期和时间附加到编辑器</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="465"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="479"/> <source>Append Fingerprint to Editor</source> <translation type="unfinished">将指纹附加到编辑器</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="467"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="481"/> <source>Append selected Key's Fingerprint to Editor</source> <translation type="unfinished">将所选密钥的指纹附加到编辑器</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="471"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="485"/> <source>Copy Email</source> <translation type="unfinished">复制电子邮件</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="473"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="487"/> <source>Copy selected Keypair's to clipboard</source> <translation type="unfinished">将选定的密钥对复制到剪贴板</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="478"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="492"/> <source>Copy Default UID</source> <translation type="unfinished">复制默认 UID</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="480"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="494"/> <source>Copy selected Keypair's default UID to clipboard</source> <translation type="unfinished">将所选密钥对的默认 UID 复制到剪贴板</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="484"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="498"/> <source>Copy Key ID</source> <translation type="unfinished">复制密钥 ID</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="486"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="500"/> <source>Copy selected Keypair's ID to clipboard</source> <translation type="unfinished">将所选密钥对的 ID 复制到剪贴板</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="490"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="504"/> <source>Show Key Details</source> <translation type="unfinished">显示密钥细节</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="491"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="505"/> <source>Show Details for this Key</source> <translation type="unfinished">显示此密钥的详细信息</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="495"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="509"/> <source>Add To Favourite</source> <translation type="unfinished">添加到收藏夹</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="496"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="510"/> <source>Add this key to Favourite Table</source> <translation type="unfinished">将此键添加到收藏夹表</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="502"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="516"/> <source>Remove From Favourite</source> <translation type="unfinished">从收藏夹中删除</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="504"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="518"/> <source>Remove this key from Favourite Table</source> <translation type="unfinished">从收藏表中删除此键</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="510"/> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="511"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="524"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="525"/> <source>Set Owner Trust Level</source> <translation type="unfinished">设置所有者信任级别</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="530"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="544"/> <source>Remove PGP Header</source> <translation type="unfinished">删除 PGP 标头</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="534"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="548"/> <source>Add PGP Header</source> <translation type="unfinished">添加 PGP 标头</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="553"/> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="636"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="567"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="658"/> <source>Edit</source> <translation type="unfinished">编辑</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="571"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="585"/> <source>Crypt</source> <translation type="unfinished">加密</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="581"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="595"/> <source>Keys</source> <translation type="unfinished">密钥</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="582"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="596"/> <source>Import Key</source> <translation type="unfinished">导入密钥</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="598"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="604"/> + <source>Advance</source> + <translation type="unfinished">高级</translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="612"/> <source>Steganography</source> <translation type="unfinished">隐写术</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="602"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="616"/> <source>View</source> <translation type="unfinished">查看</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="604"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="618"/> <source>Help</source> <translation type="unfinished">帮助</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="621"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="643"/> <source>Operations</source> <translation type="unfinished">操作</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="631"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="653"/> <source>Key</source> <translation type="unfinished">密钥</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="644"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="666"/> <source>Special Edit</source> <translation type="unfinished">特殊编辑操作</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="656"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="678"/> <source>Import key from...</source> <translation>从···导入密钥</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="657"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="679"/> <source>Import key</source> <translation type="unfinished">导入密钥</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="673"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="695"/> <source>Ready</source> <translation type="unfinished">准备好</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="680"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="702"/> <source>Key ToolBox</source> <translation type="unfinished">密钥工具箱</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="688"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="710"/> <source>Default</source> <translation type="unfinished">默认</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="696"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="718"/> <source>Favourite</source> <translation type="unfinished">最喜欢的</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="704"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="726"/> <source>Only Public Key</source> <translation type="unfinished">只有公钥</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="714"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="736"/> <source>Has Private Key</source> <translation type="unfinished">有私钥</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="728"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="750"/> <source>Information Board</source> <translation type="unfinished">信息面板</translation> </message> </context> <context> + <name>GpgFrontend::UI::ModuleControllerDialog</name> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="49"/> + <source>Module Informations</source> + <translation type="unfinished">模组信息</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="50"/> + <source>Actions</source> + <translation type="unfinished">操作</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="51"/> + <source>Show Mods Directory</source> + <translation type="unfinished">显示模组文件夹</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="53"/> + <source>Registered Modules</source> + <translation type="unfinished">已载入模组</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="54"/> + <source>Global Register Table</source> + <translation type="unfinished">全局注册表</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="55"/> + <source>Debugger</source> + <translation type="unfinished">调试器</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="58"/> + <source>Tips: Module name front with "*" stands for integrated module.</source> + <translation type="unfinished">提示:模块名称前面带“*”表示集成模块。</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="60"/> + <source>Module Controller</source> + <translation type="unfinished">模组管理器</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="84"/> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="184"/> + <source>Enable Auto Activate</source> + <translation type="unfinished">开启自动启用</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="133"/> + <source>BASIC INFO</source> + <translation type="unfinished">基本信息</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="135"/> + <source>ID</source> + <translation type="unfinished">ID</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="137"/> + <source>Version</source> + <translation type="unfinished">版本</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="139"/> + <source>SDK Version</source> + <translation type="unfinished">SDK 版本</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="141"/> + <source>Qt ENV Version</source> + <translation type="unfinished">Qt 环境版本</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="143"/> + <source>Hash</source> + <translation type="unfinished">哈希</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="144"/> + <source>Path</source> + <translation type="unfinished">路径</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="148"/> + <source>Auto Activate</source> + <translation type="unfinished">自动启用</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="149"/> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="151"/> + <source>True</source> + <translation type="unfinished">开</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="149"/> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="151"/> + <source>False</source> + <translation type="unfinished">关</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="150"/> + <source>Active</source> + <translation type="unfinished">启用状态</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="155"/> + <source>METADATA</source> + <translation type="unfinished">元数据</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="171"/> + <source>Listening Event</source> + <translation type="unfinished">监听事件</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="180"/> + <source>Deactivate</source> + <translation type="unfinished">禁用</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="181"/> + <source>Activate</source> + <translation type="unfinished">启用</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="183"/> + <source>Disable Auto Activate</source> + <translation type="unfinished">关闭自动启用</translation> + </message> +</context> +<context> <name>GpgFrontend::UI::NetworkTab</name> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="71"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="72"/> <source>Proxy</source> <translation type="unfinished">代理</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="72"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="73"/> <source>Network Ability</source> <translation type="unfinished">网络能力</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="73"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="74"/> <source>Operations</source> <translation type="unfinished">操作</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="75"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="76"/> <source>Enable Proxy</source> <translation type="unfinished">启用代理</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="76"/> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="79"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="77"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="80"/> <source>Port</source> <translation type="unfinished">端口</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="78"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="79"/> <source>Host Address</source> <translation type="unfinished">地址</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="80"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="81"/> <source>Proxy Type</source> <translation type="unfinished">代理类型</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="81"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="82"/> <source>Username</source> <translation type="unfinished">用户名</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="82"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="83"/> <source>Password</source> <translation type="unfinished">密码</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="85"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="86"/> <source>Apply Proxy Settings and Check Proxy Connection</source> <translation type="unfinished">应用代理设置并检查代理连接</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="88"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="89"/> <source>Forbid all GnuPG network connection.</source> <translation type="unfinished">禁止所有 GnuPG 网络连接。</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="90"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="93"/> <source>Prohibit checking for version updates when the program starts.</source> <translation type="unfinished">禁止在程序启动时检查版本更新。</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="92"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="96"/> <source>Automatically import a missing key for signature verification.</source> <translation type="unfinished">自动导入丢失的密钥以进行签名验证。</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="94"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="98"/> <source>Tips: These Option Changes take effect only after the application restart.</source> <translation type="unfinished">提示:这些选项更改仅在应用程序重新启动后生效。</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="170"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="173"/> <source>Test Server Url Accessibility</source> <translation type="unfinished">测试服务器 URL 连通性</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="171"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="174"/> <source>Server Url</source> <translation type="unfinished">服务器路径</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="181"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="184"/> <source>Success</source> <translation type="unfinished">成功</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="182"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="185"/> <source>Successfully connect to the target server through the proxy server.</source> <translation type="unfinished">连接目标服务器成功(通过代理)。</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="186"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="189"/> <source>Failed</source> <translation type="unfinished">失败</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="187"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="190"/> <source>Unable to connect to the target server through the proxy server. Proxy settings may be invalid.</source> <translation type="unfinished">无法通过代理服务器连接到目标服务器。代理设置可能错误。</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="197"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="200"/> <source>Test Proxy Server Connection...</source> <translation type="unfinished">测试代理服务器连接...</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="198"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="201"/> <source>Is using your proxy settings to access the url. Note that this test operation will apply your proxy settings to the entire software.</source> <translation type="unfinished">正在使用您的代理设置访问 url。请注意,此测试操作会将您的代理设置应用于整个软件。</translation> </message> @@ -4963,37 +5219,37 @@ If Data And Signature is COMBINED within a single file, KEEP THIS EMPTY: </sourc <context> <name>GpgFrontend::UI::SettingsDialog</name> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="54"/> + <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="53"/> <source>General</source> <translation type="unfinished">通用</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="55"/> + <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="54"/> <source>Appearance</source> <translation type="unfinished">显示</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="56"/> + <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="55"/> <source>Key Server</source> <translation type="unfinished">密钥服务器</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="57"/> + <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="56"/> <source>Network</source> <translation type="unfinished">网络</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="68"/> + <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="67"/> <source>Settings</source> <translation type="unfinished">设置</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="72"/> + <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="71"/> <source>Preference</source> <translation type="unfinished">偏好</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="128"/> + <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="124"/> <source>System Default</source> <translation type="unfinished">系统默认</translation> </message> @@ -5236,7 +5492,7 @@ If Data And Signature is COMBINED within a single file, KEEP THIS EMPTY: </sourc <context> <name>GpgFrontend::UI::TranslatorsTab</name> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="131"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="145"/> <source>If you think there are any problems with the translation, why not participate in the translation work? If you want to participate, please read the document or contact me via email.</source> <translation type="unfinished">如果觉得翻译有问题,何不参与翻译工作呢?如果您想参加,请阅读文档或通过电子邮件与我联系。</translation> </message> @@ -5244,63 +5500,63 @@ If Data And Signature is COMBINED within a single file, KEEP THIS EMPTY: </sourc <context> <name>GpgFrontend::UI::UpdateTab</name> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="154"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="163"/> <source>It is recommended that you always check the version of GpgFrontend and upgrade to the latest version.</source> <translation type="unfinished">建议您经常检查 GpgFrontend 的版本更新。</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="157"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="166"/> <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/dialog/help/AboutDialog.cpp" line="163"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="172"/> <source>Current Version</source> <translation type="unfinished">当前版本</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="164"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="173"/> <source>: </source> <translation>: </translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="246"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="248"/> <source>Latest Version From Github</source> <translation type="unfinished">来自 Github 的最新版本</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="252"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="254"/> <source>The current version is less than the latest version on github.</source> <translation type="unfinished">当前版本低于github上的最新版本。</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="254"/> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="265"/> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="277"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="256"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="267"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="279"/> <source>Please click</source> <translation type="unfinished">请点击</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="257"/> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="268"/> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="280"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="259"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="270"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="282"/> <source>Here</source> <translation type="unfinished">这里</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="257"/> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="268"/> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="280"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="259"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="270"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="282"/> <source>to download the latest stable version.</source> <translation type="unfinished">来下载最新的稳定版本。</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="263"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="265"/> <source>This version has serious problems and has been withdrawn. Please stop using it immediately.</source> <translation>此版本存在严重问题,已经被召回。请立即停止使用。</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="274"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="276"/> <source>This version has not been released yet, it may be a beta version. If you are not a tester and care about version stability, please do not use this version.</source> <translation type="unfinished">此版本尚未发布,可能是测试版。如果您不是测试人员并且关心版本稳定性,请不要使用此版本。</translation> </message> @@ -5497,7 +5753,7 @@ If Data And Signature is COMBINED within a single file, KEEP THIS EMPTY: </sourc <context> <name>GpgFrontend::UI::Wizard</name> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="44"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="43"/> <source>First Start Wizard</source> <translation type="unfinished">欢迎</translation> </message> @@ -5538,17 +5794,17 @@ If Data And Signature is COMBINED within a single file, KEEP THIS EMPTY: </sourc <context> <name>QCoreApplication</name> <message> - <location filename="../../../../src/cmd.cpp" line="49"/> + <location filename="../../../../src/cmd.cpp" line="47"/> <source>This is free software; see the source for copying conditions.</source> <translation type="unfinished">此为自由软件。关于版权信息,请参阅源代码中的版权文件。</translation> </message> <message> - <location filename="../../../../src/cmd.cpp" line="54"/> + <location filename="../../../../src/cmd.cpp" line="52"/> <source>Build DateTime: </source> <translation>构建时间: </translation> </message> <message> - <location filename="../../../../src/cmd.cpp" line="55"/> + <location filename="../../../../src/cmd.cpp" line="54"/> <source>Build Version: </source> <translation>构建版本: </translation> </message> @@ -5558,27 +5814,27 @@ If Data And Signature is COMBINED within a single file, KEEP THIS EMPTY: </sourc <translation>源代码版本: </translation> </message> <message> - <location filename="../../../../src/ui/GpgFrontendUIInit.cpp" line="54"/> + <location filename="../../../../src/ui/GpgFrontendUIInit.cpp" line="56"/> <source>Loading Gnupg Info...</source> <translation type="unfinished">正在加载 Gnupg 信息...</translation> </message> <message> - <location filename="../../../../src/ui/GpgFrontendUIInit.cpp" line="55"/> + <location filename="../../../../src/ui/GpgFrontendUIInit.cpp" line="57"/> <source>If this process is too slow, please set the key server address appropriately in the gnupg configuration file (depending on the network situation in your country or region).</source> <translation type="unfinished">如果此过程太慢,请在 gnupg 配置文件中适当设置密钥服务器地址(取决于您所在国家或地区的网络情况)。</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="63"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="64"/> <source>Show Verify Details</source> <translation type="unfinished">显示验证详细信息</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="71"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="72"/> <source>Public key not found locally</source> <translation type="unfinished">本地未找到公钥</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="72"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="73"/> <source>There is no target public key content in local for GpgFrontend to gather enough information about this Signature. Do you want to import the public key from Keyserver now?</source> <translation type="unfinished">本地没有目标公钥内容供 GpgFrontend 收集有关此签名的足够信息。现在要从密钥服务器导入公钥吗?</translation> </message> @@ -5636,20 +5892,30 @@ If Data And Signature is COMBINED within a single file, KEEP THIS EMPTY: </sourc <translation type="unfinished">成功</translation> </message> <message> - <location filename="../../../../src/core/GpgCoreInit.cpp" line="294"/> + <location filename="../../../../src/core/GpgCoreInit.cpp" line="303"/> <source>GpgME initiation failed</source> <translation type="unfinished">GpgME初始化失败</translation> </message> <message> - <location filename="../../../../src/core/GpgCoreInit.cpp" line="397"/> + <location filename="../../../../src/core/GpgCoreInit.cpp" line="409"/> <source>GpgME Context initiation failed</source> <translation type="unfinished">GpgME上下文初始化失败</translation> </message> <message> - <location filename="../../../../src/core/GpgCoreInit.cpp" line="406"/> + <location filename="../../../../src/core/GpgCoreInit.cpp" line="418"/> <source>Gpg Key Detabase initiation failed</source> <translation type="unfinished">密钥数据库初始化失败</translation> </message> + <message> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="486"/> + <source>Sync All Public Key</source> + <translation type="unfinished">同步所有公钥</translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="487"/> + <source>You have not checked any public keys that you want to synchronize, do you want to synchronize all local public keys from the key server?</source> + <translation type="unfinished">您没有选中任何要同步的公钥,是否要从密钥服务器同步所有本地公钥?</translation> + </message> </context> <context> <name>QObject</name> diff --git a/resource/lfs/locale/ts/GpgFrontend.zh_TW.ts b/resource/lfs/locale/ts/GpgFrontend.zh_TW.ts index 989a19e8..b0d2a8fc 100644 --- a/resource/lfs/locale/ts/GpgFrontend.zh_TW.ts +++ b/resource/lfs/locale/ts/GpgFrontend.zh_TW.ts @@ -217,12 +217,12 @@ </message> <message> <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="105"/> - <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="109"/> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="107"/> <source>Sign Date</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="130"/> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="128"/> <source>Signer</source> <translation type="unfinished">簽名者</translation> </message> @@ -246,23 +246,23 @@ <translation type="unfinished">世界標準時間</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="109"/> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="107"/> <source>Localized</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="124"/> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="122"/> <source>Invalid Signers</source> <translation type="unfinished">無效的簽名者</translation> </message> <message> <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="98"/> - <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="132"/> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="130"/> <source>Fingerprint</source> <translation type="unfinished">指紋</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="134"/> + <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="132"/> <source>Reason</source> <translation type="unfinished">原因</translation> </message> @@ -286,126 +286,126 @@ </message> <message> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="57"/> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="61"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="60"/> <source>Signed On</source> <translation type="unfinished">已登錄</translation> </message> <message> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="57"/> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="192"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="191"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="237"/> <source>UTC</source> <translation type="unfinished">世界標準時間</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="61"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="60"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="194"/> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="239"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="240"/> <source>Localized</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="64"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="63"/> <source>Signatures List</source> <translation type="unfinished">簽名列表</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="71"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="70"/> <source>Signature [%1]:</source> <translation type="unfinished">簽名 [%1]:</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="72"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="71"/> <source>Status</source> <translation type="unfinished">狀態</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="75"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="74"/> <source>A Bad Signature.</source> <translation type="unfinished">一個錯誤的簽名。</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="77"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="76"/> <source>This Signature is invalid.</source> <translation type="unfinished">此簽名無效。</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="82"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="81"/> <source>A</source> <translation type="unfinished">一種</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="84"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="83"/> <source>Good</source> <translation type="unfinished">好的</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="87"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="86"/> <source>Bad</source> <translation type="unfinished">壞的</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="90"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="89"/> <source>Expired</source> <translation type="unfinished">已到期</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="93"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="92"/> <source>Missing Key's</source> <translation type="unfinished">鑰匙不見了</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="96"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="95"/> <source>Revoked Key's</source> <translation type="unfinished">撤銷的鑰匙</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="99"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="98"/> <source>Expired Key's</source> <translation type="unfinished">過期的金鑰</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="102"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="101"/> <source>Missing CRL's</source> <translation type="unfinished">缺少 CRL</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="106"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="105"/> <source>Signature Fully Valid.</source> <translation type="unfinished">簽名完全有效。</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="108"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="107"/> <source>Signature Not Fully Valid.</source> <translation type="unfinished">簽名不完全有效。</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="109"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="108"/> <source>Tips</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="110"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="109"/> <source>Adjust Trust Level to make it Fully Vaild</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="184"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="183"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="228"/> <source>Fingerprint</source> <translation type="unfinished">指紋</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="186"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="185"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="229"/> <source><unknown></source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="192"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="191"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="194"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="237"/> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="239"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="240"/> <source>Sign Date</source> <translation type="unfinished"></translation> </message> @@ -431,47 +431,47 @@ <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="117"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="116"/> <source>Key is NOT present with ID 0x</source> <translation type="unfinished">金鑰不存在,ID 為 0x</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="126"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="125"/> <source>A signature could NOT be verified due to a Missing Key</source> <translation type="unfinished">由於缺少金鑰,無法驗證簽名</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="132"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="131"/> <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/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="141"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="140"/> <source>A signature is valid but expired</source> <translation type="unfinished">簽名有效但已過期</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="148"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="147"/> <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/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="156"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="155"/> <source>There was some other error which prevented the signature verification.</source> <translation type="unfinished">還有一些其他錯誤阻止了簽名驗證。</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="164"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="163"/> <source>Error for key with fingerprint</source> <translation type="unfinished">帶指紋的鑰匙錯誤</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="175"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="174"/> <source>Could not find information that can be used for verification.</source> <translation type="unfinished">找不到可用於驗證的信息。</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="184"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="183"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="205"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="228"/> <source>Signed By</source> @@ -482,13 +482,13 @@ <translation type="obsolete">未知</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="189"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="188"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="234"/> <source>Public Key Algo</source> <translation type="unfinished">公鑰算法</translation> </message> <message> - <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="191"/> + <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="190"/> <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="236"/> <source>Hash Algo</source> <translation type="unfinished">哈希算法</translation> @@ -499,27 +499,72 @@ </message> </context> <context> + <name>GpgFrontend::Module::GlobalRegisterTable</name> + <message> + <location filename="../../../../src/core/module/GlobalRegisterTable.cpp" line="47"/> + <source>NODE</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/module/GlobalRegisterTable.cpp" line="82"/> + <source>LEAF</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GpgFrontend::Module::GlobalRegisterTableTreeModel::Impl</name> + <message> + <location filename="../../../../src/core/module/GlobalRegisterTable.cpp" line="193"/> + <source><EMPTY></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/module/GlobalRegisterTable.cpp" line="232"/> + <source><UNSUPPORTED></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/module/GlobalRegisterTable.cpp" line="267"/> + <source>Key</source> + <translation type="unfinished">鑰匙</translation> + </message> + <message> + <location filename="../../../../src/core/module/GlobalRegisterTable.cpp" line="269"/> + <source>Type</source> + <translation type="unfinished">類型</translation> + </message> + <message> + <location filename="../../../../src/core/module/GlobalRegisterTable.cpp" line="271"/> + <source>Value Type</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/core/module/GlobalRegisterTable.cpp" line="273"/> + <source>Value</source> + <translation type="unfinished">價值</translation> + </message> +</context> +<context> <name>GpgFrontend::Module::Integrated::GnuPGInfoGatheringModule::GnuPGInfoGatheringModule</name> <message> - <location filename="../../../../src/module/integrated/gnupg_info_gathering_module/GnuPGInfoGatheringModule.cpp" line="123"/> <source>Embedded In</source> - <translation type="unfinished">嵌入</translation> + <translation type="obsolete">嵌入</translation> </message> </context> <context> <name>GpgFrontend::UI::AboutDialog</name> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="44"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="41"/> <source>About</source> <translation type="unfinished">關於</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="52"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="47"/> <source>About GpgFrontend</source> <translation type="unfinished">關於 GpgFrontend</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="53"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="51"/> <source>GnuPG</source> <translation type="unfinished">GnuPG</translation> </message> @@ -529,7 +574,7 @@ <translation type="unfinished">翻譯員</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="55"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="58"/> <source>Update</source> <translation type="unfinished">更新</translation> </message> @@ -537,131 +582,156 @@ <context> <name>GpgFrontend::UI::AppearanceTab</name> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="42"/> <source>Icon Size</source> - <translation type="unfinished">圖標大小</translation> + <translation type="obsolete">圖標大小</translation> </message> <message> <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="43"/> + <source>General</source> + <translation type="unfinished">一般設定</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="45"/> + <source>Theme</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="49"/> + <source>Toolbar Icon</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="51"/> + <source>Size</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="52"/> <source>small</source> <translation type="unfinished">小的</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="44"/> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="53"/> <source>medium</source> <translation type="unfinished">中等的</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="45"/> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="54"/> <source>large</source> <translation type="unfinished">大的</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="47"/> <source>Icon Style</source> - <translation type="unfinished">圖標樣式</translation> + <translation type="obsolete">圖標樣式</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="48"/> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="57"/> <source>just text</source> <translation type="unfinished">只是文字</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="49"/> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="58"/> <source>just icons</source> <translation type="unfinished">只是圖標</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="50"/> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="59"/> <source>text and icons</source> <translation type="unfinished">文字和圖標</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="52"/> <source>Window State</source> - <translation type="unfinished">窗口狀態</translation> + <translation type="obsolete">窗口狀態</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="54"/> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="47"/> <source>Save window size and position on exit.</source> <translation type="unfinished">退出時保存窗口大小和位置。</translation> </message> <message> <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="56"/> + <source>Style</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="61"/> + <source>Font Size</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="63"/> <source>Text Editor</source> <translation type="unfinished">文本編輯器</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="57"/> <source>Font Size in Text Editor</source> - <translation type="unfinished">文本編輯器中的字體大小</translation> + <translation type="obsolete">文本編輯器中的字體大小</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="59"/> + <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="64"/> <source>Information Board</source> <translation type="unfinished">信息板</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="61"/> <source>Font Size in Information Board</source> - <translation type="unfinished">信息板中的字體大小</translation> + <translation type="obsolete">信息板中的字體大小</translation> </message> </context> <context> <name>GpgFrontend::UI::ChoosePage</name> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="112"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="107"/> <source>Choose your action...</source> <translation type="unfinished">選擇你的行動...</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="113"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="108"/> <source>...by clicking on the appropriate link.</source> <translation type="unfinished">...通過點擊相應的鏈接。</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="116"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="111"/> <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">如果您以前從未使用過 GpgFrontend 並且也沒有 gpg 金鑰,您可能想閱讀如何</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="120"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="114"/> <source>Generate Key</source> <translation type="unfinished">生成金鑰</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="127"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="121"/> <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/dialog/Wizard.cpp" line="132"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="124"/> <source>Encrypt & Decrypt Text</source> <translation type="unfinished">加密和解密文本</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="132"/> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="148"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="124"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="136"/> <source>or</source> <translation type="unfinished">或者</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="136"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="126"/> <source>Sign & Verify Text</source> <translation type="unfinished">簽名和驗證文本</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="144"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="134"/> <source>If you want to operate file, you can read </source> <translation type="unfinished">如您想開始運行操作檔案,可詳讀 </translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="148"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="136"/> <source>Encrypt & Sign File</source> <translation type="unfinished">加密和簽名文件</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="152"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="138"/> <source>Sign & Verify File</source> <translation type="unfinished">簽署並驗證文件</translation> </message> @@ -669,12 +739,12 @@ <context> <name>GpgFrontend::UI::CommonUtils</name> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="185"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="186"/> <source>GnuPG Context Loading Failed</source> <translation type="unfinished">GnuPG 上下文加載失敗</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="187"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="188"/> <source>Gnupg(gpg) is not installed correctly, please follow <a href='https://www.gpgfrontend.bktus.com/#/faq?id=how-to-deal-with-39env-loading-failed39'>this notes</a> in FAQ to install Gnupg and then open GpgFrontend. <br />Or, you can open GnuPG Controller to set a custom GnuPG which GpgFrontend should use. Then, GpgFrontend will restart. <br /><br />Breif Reason: %1</source> <translation type="unfinished"></translation> </message> @@ -683,29 +753,29 @@ <translation type="obsolete">找不到要導入的金鑰</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="445"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="450"/> <source>Timeout</source> <translation type="unfinished">暫停</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="250"/> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="381"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="251"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="382"/> <source>Success</source> <translation type="unfinished">成功</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="251"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="252"/> <source>Gpg Operation succeed.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="261"/> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="373"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="262"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="374"/> <source>Failure</source> <translation type="unfinished">失敗</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="262"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="263"/> <source>Gpg Operation failed. Error code: %1 @@ -714,14 +784,14 @@ Description: %3</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="287"/> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="294"/> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="497"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="288"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="295"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="502"/> <source>Error</source> <translation type="unfinished">錯誤</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="279"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="280"/> <source>Open Key</source> <translation type="unfinished">開關鍵</translation> </message> @@ -730,87 +800,87 @@ Description: %3</source> <translation type="obsolete">關鍵文件</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="280"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="281"/> <source>Keyring files</source> <translation type="unfinished">鑰匙圈文件</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="288"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="289"/> <source>Cannot open this file. Please make sure that this is a regular file and it's readable.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="295"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="296"/> <source>The target file is too large for a keyring.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="301"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="302"/> <source>File Open Failed</source> <translation type="unfinished">文件打開失敗</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="302"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="303"/> <source>Failed to open file: </source> <translation type="unfinished">開啟檔案失敗原因 : </translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="354"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="355"/> <source>Processing</source> <translation type="unfinished">加工</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="374"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="375"/> <source>Failed to execute command.</source> <translation type="unfinished">無法執行命令。</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="382"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="383"/> <source>Succeed in executing command.</source> <translation type="unfinished">成功執行命令。</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="384"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="385"/> <source>Warning</source> <translation type="unfinished">警告</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="385"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="386"/> <source>Finished executing command.</source> <translation type="unfinished">命令執行完畢。</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="406"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="407"/> <source>Default Keyserver Not Found</source> <translation type="unfinished">未找到預設金鑰伺服器</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="407"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="408"/> <source>Cannot read default keyserver from your settings, please set a default keyserver first</source> <translation type="unfinished">無法從您的設定值中讀取預設金鑰伺服器,請先設定值預設金鑰伺服器</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="442"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="447"/> <source>Key Not Found</source> <translation type="unfinished">未找到金鑰</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="448"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="453"/> <source>Key Server Not Found</source> <translation type="unfinished">未找到金鑰伺服器</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="451"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="456"/> <source>Connection Error</source> <translation type="unfinished">連線錯誤</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="462"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="467"/> <source>The key has been updated</source> <translation type="unfinished">金鑰已更新</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="464"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="469"/> <source>No need to update the key</source> <translation type="unfinished">無需更新金鑰</translation> </message> @@ -826,39 +896,43 @@ Description: %3</source> <context> <name>GpgFrontend::UI::ConclusionPage</name> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="218"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="204"/> <source>Ready.</source> <translation type="unfinished">準備好。</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="219"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="205"/> <source>Have fun with GpgFrontend!</source> <translation type="unfinished">與 GpgFrontend 一起玩得開心!</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="222"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="208"/> <source>You are ready to use GpgFrontend now.<br><br></source> <translation type="unfinished">您現在可以使用 GpgFrontend。<br><br></translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="226"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="210"/> <source>The Online Document</source> <translation type="unfinished">在線文檔</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="227"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="211"/> <source> will get you started with GpgFrontend. Anytime you encounter problems, please try to find help from the documentation</source> <translation type="unfinished"> 會讓你開始使用 GpgFrontend。任何時候遇到問題,請嘗試從文檔中尋求幫助</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="236"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="220"/> <source>Open offline help.</source> <translation type="unfinished">打開離線幫助。</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="239"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="224"/> + <source>Don't show the wizard again.</source> + <translation type="unfinished"></translation> + </message> + <message> <source>Dont show the wizard again.</source> - <translation type="unfinished">不要再次顯示嚮導。</translation> + <translation type="obsolete">不要再次顯示嚮導。</translation> </message> </context> <context> @@ -1008,128 +1082,128 @@ Description: %3</source> <context> <name>GpgFrontend::UI::FileTreeView</name> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="90"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="103"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="166"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="212"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="234"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="275"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="92"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="105"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="168"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="214"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="236"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="277"/> <source>Error</source> <translation type="unfinished">錯誤</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="91"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="93"/> <source>The path is not exists, unprivileged or unreachable.</source> <translation type="unfinished">該路徑不存在、沒有特權或無法存取。</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="104"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="106"/> <source>The file is unprivileged or unreachable.</source> <translation type="unfinished">該文件沒有特權或無法存取。</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="157"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="159"/> <source>Warning</source> <translation type="unfinished">警告</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="158"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="160"/> <source>Are you sure you want to delete it?</source> <translation type="unfinished">你確定要刪除嗎?</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="167"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="169"/> <source>Unable to delete the file or folder.</source> <translation type="unfinished">無法刪除文件或文件夾。</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="176"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="189"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="178"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="191"/> <source>Make New Directory</source> <translation type="unfinished">新建目錄</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="177"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="190"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="179"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="192"/> <source>Directory Name</source> <translation type="unfinished">目錄名稱</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="204"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="226"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="206"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="228"/> <source>Create Empty File</source> <translation type="unfinished">創建空文件</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="204"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="226"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="206"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="228"/> <source>Filename (you can given extension)</source> <translation type="unfinished">文件名(您可以指定擴展名)</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="213"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="235"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="215"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="237"/> <source>Unable to create the file.</source> <translation type="unfinished">無法創建文件。</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="267"/> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="298"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="269"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="300"/> <source>Rename</source> <translation type="unfinished">改名</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="267"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="269"/> <source>New Filename</source> <translation type="unfinished">新文件名</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="276"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="278"/> <source>Unable to rename the file or folder.</source> <translation type="unfinished">無法重命名文件或文件夾。</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="293"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="295"/> <source>Open</source> <translation type="unfinished">打開</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="303"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="305"/> <source>Delete</source> <translation type="unfinished">刪除</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="308"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="310"/> <source>Calculate Hash</source> <translation type="unfinished">計算哈希</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="313"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="315"/> <source>Directory</source> <translation type="unfinished">目錄</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="318"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="320"/> <source>File</source> <translation type="unfinished">文件</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="323"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="325"/> <source>Compress...</source> <translation type="unfinished">壓縮...</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="330"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="332"/> <source>Open with Default System Application</source> <translation type="unfinished">使用預設系統應用程序打開</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="335"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="337"/> <source>New</source> <translation type="unfinished">新的</translation> </message> <message> - <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="393"/> + <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="395"/> <source>Calculating</source> <translation type="unfinished"></translation> </message> @@ -1231,17 +1305,17 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::GnuPGControllerDialog</name> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="45"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="45"/> <source>General</source> <translation type="unfinished">一般設定</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="46"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="46"/> <source>Key Database</source> <translation type="unfinished">金鑰數據庫</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="47"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="47"/> <source>Advanced</source> <translation type="unfinished">先進的</translation> </message> @@ -1250,70 +1324,79 @@ This will result in loss of all cached form positions, statuses, key servers, et <translation type="obsolete">無 ASCII 模式</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="49"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="49"/> <source>Use Binary Mode for File Operations</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="51"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="51"/> <source>Use Pinentry as Password Input Dialog</source> <translation type="unfinished">使用 Pinentry 作為密碼輸入對話框</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="52"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="52"/> <source>Enable GpgME Debug Log</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="53"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="53"/> <source>Use Custom GnuPG</source> <translation type="unfinished">使用自定義 GnuPG</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="54"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="54"/> <source>Select GnuPG Path</source> <translation type="unfinished">選擇 GnuPG 路徑</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="56"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="56"/> <source>Use Custom GnuPG Key Database Path</source> <translation type="unfinished">使用自定義 GnuPG 金鑰數據庫路徑</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="58"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="58"/> <source>Select Key Database Path</source> <translation type="unfinished">選擇金鑰數據庫路徑</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="60"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="60"/> <source>Restart Gpg Agent on start</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="64"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="62"/> + <source>Kill all gnupg daemon at close</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="66"/> + <source>Tips: please select a directory where "gpgconf" is located in.</source> + <translation type="unfinished"></translation> + </message> + <message> <source>Tips: please select a directroy where "gpgconf" is located in.</source> - <translation type="unfinished">提示:請選擇“gpgconf”所在目錄。</translation> + <translation type="obsolete">提示:請選擇“gpgconf”所在目錄。</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="66"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="68"/> <source>Tips: notice that modify any of these settings will cause an Application restart.</source> <translation type="unfinished">提示:請注意,修改任何這些設定值都會導致應用程序重新啟動。</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="98"/> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="118"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="100"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="120"/> <source>Open Directory</source> <translation type="unfinished">打開目錄</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="171"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="173"/> <source>GnuPG Controller</source> <translation type="unfinished">GnuPG 控制器</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="356"/> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="363"/> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="375"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="364"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="371"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="383"/> <source>Illegal GnuPG Path</source> <translation type="unfinished">非法 GnuPG 路徑</translation> </message> @@ -1322,22 +1405,22 @@ This will result in loss of all cached form positions, statuses, key servers, et <translation type="obsolete">目標 GnuPG 路徑為空。</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="357"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="365"/> <source>Target GnuPG Path is not an exists readable directory.</source> <translation type="unfinished">目標 GnuPG 路徑不是現有的可讀目錄。</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="364"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="372"/> <source>Target GnuPG Path is not an absolute path.</source> <translation type="unfinished">目標 GnuPG 路徑不是絕對路徑。</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="376"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="384"/> <source>Target GnuPG Path contains no "gpgconf" executable.</source> <translation type="unfinished">目標 GnuPG 路徑不包含“gpgconf”可執行文件。</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="389"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="397"/> <source>Illegal GnuPG Key Database Path</source> <translation type="unfinished">非法的 GnuPG 金鑰數據庫路徑</translation> </message> @@ -1346,7 +1429,7 @@ This will result in loss of all cached form positions, statuses, key servers, et <translation type="obsolete">目標 GnuPG 金鑰數據庫路徑為空。</translation> </message> <message> - <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="390"/> + <location filename="../../../../src/ui/dialog/controller/GnuPGControllerDialog.cpp" line="398"/> <source>Target GnuPG Key Database Path is not an exists readable directory.</source> <translation type="unfinished">目標 GnuPG 金鑰數據庫路徑不是現有的可讀目錄。</translation> </message> @@ -1354,53 +1437,53 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::GnupgTab</name> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="44"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="46"/> <source>Name</source> <translation type="unfinished">姓名</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="44"/> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="90"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="46"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="92"/> <source>Description</source> <translation type="unfinished">描述</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="44"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="46"/> <source>Version</source> <translation type="unfinished">版本</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="45"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="47"/> <source>Checksum</source> <translation type="unfinished">校驗和</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="45"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="47"/> <source>Binary Path</source> <translation type="unfinished">二進制路徑</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="47"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="49"/> <source>Components</source> <translation type="unfinished">成分</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="48"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="50"/> <source>Directories</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="49"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="51"/> <source>Options</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="68"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="70"/> <source>Directory Type</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="68"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="70"/> <source>Path</source> <translation type="unfinished"></translation> </message> @@ -1409,27 +1492,27 @@ This will result in loss of all cached form positions, statuses, key servers, et <translation type="obsolete">配置</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="89"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="91"/> <source>Component</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="89"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="91"/> <source>Group</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="89"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="91"/> <source>Key</source> <translation type="unfinished">鑰匙</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="90"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="92"/> <source>Default Value</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="91"/> + <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="93"/> <source>Value</source> <translation type="unfinished">價值</translation> </message> @@ -1437,22 +1520,22 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::GpgFrontendApplication</name> <message> - <location filename="../../../../src/ui/GpgFrontendApplication.cpp" line="64"/> + <location filename="../../../../src/ui/GpgFrontendApplication.cpp" line="62"/> <source>Standard Exception Thrown</source> <translation type="unfinished">拋出標準異常</translation> </message> <message> - <location filename="../../../../src/ui/GpgFrontendApplication.cpp" line="65"/> + <location filename="../../../../src/ui/GpgFrontendApplication.cpp" line="63"/> <source>Oops, an standard exception was thrown during the running of the program. This is not a serious problem, it may be the negligence of the programmer, please report this problem if you can.</source> <translation type="unfinished">糟糕,在程序運行期間拋出了一個標準異常。這不是一個嚴重的問題,可能是程序員的疏忽,如果可以的話,請報告這個問題。</translation> </message> <message> - <location filename="../../../../src/ui/GpgFrontendApplication.cpp" line="73"/> + <location filename="../../../../src/ui/GpgFrontendApplication.cpp" line="71"/> <source>Unhandled Exception Thrown</source> <translation type="unfinished">未處理的異常拋出</translation> </message> <message> - <location filename="../../../../src/ui/GpgFrontendApplication.cpp" line="74"/> + <location filename="../../../../src/ui/GpgFrontendApplication.cpp" line="72"/> <source>Oops, an unhandled exception was thrown during the running of the program. This is not a serious problem, it may be the negligence of the programmer, please report this problem if you can.</source> <translation type="unfinished">糟糕,在程序運行期間引發了未處理的異常。這不是一個嚴重的問題,可能是程序員的疏忽,如果可以的話,請報告這個問題。</translation> </message> @@ -1498,37 +1581,37 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::InfoTab</name> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="89"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="102"/> <source>GpgFrontend is an easy-to-use, compact, cross-platform, and installation-free GnuPG Frontend.It visualizes most of the common operations of GnuPG.GpgFrontend is licensed under the GPLv3</source> <translation type="unfinished">GpgFrontend 是一個易於使用、緊湊、跨平台、免安裝的 GnuPG 前端。它將 GnuPG 的大部分常用操作可視化。GpgFrontend 是在 GPLv3 下授權的</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="95"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="108"/> <source>Developer:</source> <translation type="unfinished">開發商:</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="96"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="109"/> <source>If you have any questions or suggestions, raise an issue at</source> <translation type="unfinished">如果您有任何問題或建議,請在以下位置提出問題</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="99"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="112"/> <source>or send a mail to my mailing list at</source> <translation type="unfinished">或發送郵件到我的郵件列表</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="101"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="114"/> <source>Built with Qt</source> <translation type="unfinished">用 Qt 構建</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="102"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="115"/> <source>and</source> <translation type="unfinished">和</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="103"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="116"/> <source>Built at</source> <translation type="unfinished">建於</translation> </message> @@ -1536,42 +1619,58 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::IntroPage</name> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="74"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="71"/> <source>Getting Started...</source> <translation type="unfinished">入門...</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="75"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="72"/> <source>... with GpgFrontend</source> <translation type="unfinished">... 使用 GpgFrontend</translation> </message> <message> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="75"/> + <source>Welcome to GpgFrontend for decrypting and signing text or files!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="77"/> + <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/dialog/Wizard.cpp" line="79"/> - <source>Welcome to use GpgFrontend for decrypting and signing text or file!</source> - <translation type="unfinished">歡迎使用 GpgFrontend 對文本或文件進行解密和簽名!</translation> + <source>To get started, be sure to check out the</source> + <translation type="unfinished"></translation> </message> <message> <location filename="../../../../src/ui/dialog/Wizard.cpp" line="82"/> + <source>by clicking the link, the page will open in your web browser</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Welcome to use GpgFrontend for decrypting and signing text or file!</source> + <translation type="obsolete">歡迎使用 GpgFrontend 對文本或文件進行解密和簽名!</translation> + </message> + <message> <source>is a Powerful, Easy-to-Use, Compact, Cross-Platform, and Installation-Free OpenPGP Crypto Tool.</source> - <translation type="unfinished">是一款功能強大、易於使用、緊湊、跨平台且免安裝的 OpenPGP 加密工具。</translation> + <translation type="obsolete">是一款功能強大、易於使用、緊湊、跨平台且免安裝的 OpenPGP 加密工具。</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="84"/> <source>For brief information have a look at the</source> - <translation type="unfinished">有關簡要信息,請查看</translation> + <translation type="obsolete">有關簡要信息,請查看</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="86"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="81"/> <source>Overview</source> <translation type="unfinished">概述</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="87"/> <source>by clicking the link, the page will open in the web browser</source> - <translation type="unfinished">單擊鏈接,頁面將在網絡瀏覽器中打開</translation> + <translation type="obsolete">單擊鏈接,頁面將在網絡瀏覽器中打開</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="96"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="91"/> <source>If it supports the language currently being used in your system, GpgFrontend will automatically set it.</source> <translation type="unfinished">如果它支持您系統中當前使用的語言,GpgFrontend 將自動設定它。</translation> </message> @@ -1627,87 +1726,87 @@ This will result in loss of all cached form positions, statuses, key servers, et <translation type="unfinished">過期時間太長。</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="151"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="152"/> <source>Generating</source> <translation type="unfinished">生成</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="160"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="161"/> <source>Error</source> <translation type="unfinished">錯誤</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="161"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="162"/> <source>Unknown error occurred</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="197"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="198"/> <source>Key Usage</source> <translation type="unfinished">金鑰使用</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="199"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="200"/> <source>Encryption</source> <translation type="unfinished">加密</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="202"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="203"/> <source>Signing</source> <translation type="unfinished">簽約</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="205"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="206"/> <source>Certification</source> <translation type="unfinished">認證</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="208"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="209"/> <source>Authentication</source> <translation type="unfinished">驗證</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="435"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="436"/> <source>Name</source> <translation type="unfinished">姓名</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="436"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="437"/> <source>Email Address</source> <translation type="unfinished">電子郵件位址</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="437"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="438"/> <source>Comment</source> <translation type="unfinished">評論</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="438"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="439"/> <source>Expiration Date</source> <translation type="unfinished">截止日期</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="439"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="440"/> <source>Never Expire</source> <translation type="unfinished">永不過期</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="440"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="441"/> <source>KeySize (in Bit)</source> <translation type="unfinished">金鑰大小(以位為單位)</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="441"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="442"/> <source>Key Type</source> <translation type="unfinished">鑰匙類型</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="442"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="443"/> <source>Non Pass Phrase</source> <translation type="unfinished">不合格短語</translation> </message> <message> - <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="455"/> + <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="456"/> <source>Basic Information</source> <translation type="unfinished">基本信息</translation> </message> @@ -1715,27 +1814,27 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::KeyGenPage</name> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="178"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="164"/> <source>Create a keypair...</source> <translation type="unfinished">創建金鑰對...</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="179"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="165"/> <source>...for decrypting and signing messages</source> <translation type="unfinished">...用於解密和簽署消息</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="181"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="167"/> <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">您應該創建一個新的金鑰對。該對由一個公鑰和一個私鑰組成。<br>其他用戶可以使用公鑰為您加密消息並驗證您簽署的消息。您可以使用私鑰解密和簽名消息。<br>有關更多信息,請查看離線教程(然後顯示在主窗口中):</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="193"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="179"/> <source>Offline tutorial</source> <translation type="unfinished">離線教程</translation> </message> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="197"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="183"/> <source>Create New Key</source> <translation type="unfinished">創建新金鑰</translation> </message> @@ -1947,42 +2046,42 @@ This will result in loss of all cached form positions, statuses, key servers, et <translation type="unfinished">正在刷新金鑰列表...</translation> </message> <message> - <location filename="../../../../src/ui/widgets/KeyList.cpp" line="354"/> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="374"/> <source>Import Keys</source> <translation type="unfinished">導入金鑰</translation> </message> <message> - <location filename="../../../../src/ui/widgets/KeyList.cpp" line="356"/> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="376"/> <source>You've dropped something on the table.</source> <translation type="unfinished">你把東西掉在桌子上了。</translation> </message> <message> - <location filename="../../../../src/ui/widgets/KeyList.cpp" line="357"/> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="377"/> <source>GpgFrontend will now try to import key(s).</source> <translation type="unfinished">GpgFrontend 現在將嘗試導入金鑰。</translation> </message> <message> - <location filename="../../../../src/ui/widgets/KeyList.cpp" line="360"/> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="380"/> <source>Always import without bothering.</source> <translation type="unfinished">始終導入而無需打擾。</translation> </message> <message> - <location filename="../../../../src/ui/widgets/KeyList.cpp" line="455"/> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="475"/> <source>Key List Refreshed.</source> <translation type="unfinished">金鑰列表已刷新。</translation> </message> <message> - <location filename="../../../../src/ui/widgets/KeyList.cpp" line="476"/> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="510"/> <source>Syncing Key List...</source> <translation type="unfinished">正在同步金鑰列表...</translation> </message> <message> - <location filename="../../../../src/ui/widgets/KeyList.cpp" line="484"/> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="518"/> <source>Sync [%1/%2] %3 %4</source> <translation type="unfinished">同步 [%1/%2] %3 %4</translation> </message> <message> - <location filename="../../../../src/ui/widgets/KeyList.cpp" line="494"/> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="528"/> <source>Key List Sync Done.</source> <translation type="unfinished">金鑰列表同步完成。</translation> </message> @@ -2062,7 +2161,7 @@ This will result in loss of all cached form positions, statuses, key servers, et </message> <message> <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="171"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="261"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="265"/> <source>File</source> <translation type="unfinished">文件</translation> </message> @@ -2093,7 +2192,7 @@ This will result in loss of all cached form positions, statuses, key servers, et </message> <message> <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="202"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="532"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="536"/> <source>Key Package</source> <translation type="unfinished">鑰匙包</translation> </message> @@ -2138,220 +2237,220 @@ This will result in loss of all cached form positions, statuses, key servers, et <translation type="unfinished">刪除選定的鍵</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="232"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="233"/> <source>Delete the Selected keys</source> <translation type="unfinished">刪除選定的鍵</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="236"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="237"/> <source>Delete Checked Key(s)</source> <translation type="unfinished">刪除選中的金鑰</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="237"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="239"/> <source>Delete the Checked keys</source> <translation type="unfinished">刪除選中的鍵</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="242"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="244"/> <source>Show Key Details</source> <translation type="unfinished">顯示關鍵細節</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="243"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="246"/> <source>Show Details for this Key</source> <translation type="unfinished">顯示此鍵的詳細信息</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="247"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="248"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="250"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="252"/> <source>Set Owner Trust Level</source> <translation type="unfinished">設定所有者信任級別</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="265"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="285"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="269"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="289"/> <source>Key</source> <translation type="unfinished">鑰匙</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="266"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="270"/> <source>Generate Key</source> <translation type="unfinished">生成金鑰</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="270"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="298"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="274"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="302"/> <source>Import Key</source> <translation type="unfinished">導入金鑰</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="276"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="306"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="307"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="280"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="310"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="311"/> <source>Export Key</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="297"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="301"/> <source>Import key</source> <translation type="unfinished">導入金鑰</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="340"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="344"/> <source>Deleting Keys</source> <translation type="unfinished">刪除金鑰</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="341"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="345"/> <source>Are you sure that you want to delete the following keys?</source> <translation type="unfinished">您確定要刪除以下鍵嗎?</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="343"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="347"/> <source>The action can not be undone.</source> <translation type="unfinished">該操作無法撤消。</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="359"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="408"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="420"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="448"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="487"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="498"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="511"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="541"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="549"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="565"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="573"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="589"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="363"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="412"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="424"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="452"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="491"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="502"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="515"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="545"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="553"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="569"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="577"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="593"/> <source>Error</source> <translation type="unfinished">錯誤</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="359"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="448"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="363"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="452"/> <source>Key Not Found.</source> <translation type="unfinished">未找到金鑰。</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="370"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="383"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="466"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="472"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="374"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="387"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="470"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="476"/> <source>Forbidden</source> <translation type="unfinished">禁止的</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="371"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="384"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="375"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="388"/> <source>Please check some keys before doing this operation.</source> <translation type="unfinished">請在執行此操作之前檢查一些鍵。</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="376"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="524"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="380"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="528"/> <source>key(s) exported</source> <translation type="unfinished">導出的金鑰</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="400"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="479"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="404"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="483"/> <source>Exporting</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="409"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="421"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="488"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="499"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="413"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="425"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="492"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="503"/> <source>Unknown error occurred</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="442"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="452"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="446"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="456"/> <source>Invalid Operation</source> <translation type="unfinished">無效操作</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="443"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="447"/> <source>Please select one KeyPair before doing this operation.</source> <translation type="unfinished">請在執行此操作前選擇一個 KeyPair。</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="453"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="457"/> <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> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="467"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="471"/> <source>Please check a key before performing this operation.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="473"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="477"/> <source>This operation accepts just a single key.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="512"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="516"/> <source>This key may not be able to export as OpenSSH format. Please check the key-size of the subkey(s) used to sign.</source> <translation type="unfinished">此金鑰可能無法導出為 OpenSSH 格式。請檢查用於簽名的子金鑰的金鑰大小。</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="519"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="523"/> <source>Export OpenSSH Key To File</source> <translation type="unfinished">將 OpenSSH 金鑰導出到文件</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="520"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="524"/> <source>OpenSSH Public Key Files</source> <translation type="unfinished">OpenSSH 公鑰文件</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="532"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="536"/> <source>Import Key Package</source> <translation type="unfinished">導入金鑰包</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="542"/> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="566"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="546"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="570"/> <source>Cannot open this file. Please make sure that this is a regular file and it's readable.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="550"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="554"/> <source>The target file is too large for a key package.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="555"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="559"/> <source>Import Key Package Passphrase File</source> <translation type="unfinished">導入金鑰包密碼文件</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="556"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="560"/> <source>Key Package Passphrase File</source> <translation type="unfinished">金鑰包密碼文件</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="574"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="578"/> <source>The target file is too large for a key package passphrase.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="580"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="584"/> <source>Importing</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="596"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="600"/> <source>key(s) imported</source> <translation type="unfinished">導入的金鑰</translation> </message> <message> - <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="590"/> + <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="594"/> <source>An error occur in importing key package.</source> <translation type="unfinished">導入金鑰包出錯。</translation> </message> @@ -3175,138 +3274,138 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::KeyServerImportDialog</name> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="58"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="56"/> <source>Close</source> <translation type="unfinished">關閉</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="61"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="59"/> <source>Import ALL</source> <translation type="unfinished">全部導入</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="65"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="63"/> <source>Search</source> <translation type="unfinished">搜索</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="70"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="68"/> <source>Search String</source> <translation type="unfinished">搜索字符串</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="70"/> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="74"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="68"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="72"/> <source>: </source> <translation type="unfinished">: </translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="74"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="72"/> <source>Key Server</source> <translation type="unfinished">金鑰伺服器</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="115"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="113"/> <source>Import Keys from Keyserver</source> <translation type="unfinished">從金鑰伺服器導入金鑰</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="155"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="153"/> <source>UID</source> <translation type="unfinished">用戶識別碼</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="155"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="153"/> <source>Creation date</source> <translation type="unfinished">創立日期</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="155"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="153"/> <source>KeyID</source> <translation type="unfinished">金鑰 ID</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="155"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="153"/> <source>Tag</source> <translation type="unfinished">標籤</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="178"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="176"/> <source>Text is empty.</source> <translation type="unfinished">文字為空。</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="225"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="223"/> <source>Not Key Found</source> <translation type="unfinished">未找到金鑰</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="228"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="226"/> <source>Timeout</source> <translation type="unfinished">暫停</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="231"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="229"/> <source>Key Server Not Found</source> <translation type="unfinished">未找到金鑰伺服器</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="234"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="232"/> <source>Connection Error</source> <translation type="unfinished">連線錯誤</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="243"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="241"/> <source>Too many responses from keyserver!</source> <translation type="unfinished">來自金鑰伺服器的響應太多!</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="252"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="253"/> <source>No keys found, input may be kexId, retrying search with 0x.</source> <translation type="unfinished">未找到鍵,輸入可能是 kexId,使用 0x 重試搜索。</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="261"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="263"/> <source>No keys found containing the search string!</source> <translation type="unfinished">未找到包含搜索字符串的鍵!</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="267"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="270"/> <source>Insufficiently specific search string!</source> <translation type="unfinished">不夠具體的搜索字符串!</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="301"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="305"/> <source>revoked</source> <translation type="unfinished">撤銷</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="304"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="308"/> <source>disabled</source> <translation type="unfinished">殘疾</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="349"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="353"/> <source>%1 keys found. Double click a key to import it.</source> <translation type="unfinished">找到 %1 個金鑰。雙擊一個鍵來導入它。</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="371"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="374"/> <source>Warning</source> <translation type="unfinished">警告</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="372"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="375"/> <source>Please select one KeyPair before doing this operation.</source> <translation type="unfinished">請在執行此操作前選擇一個 KeyPair。</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="419"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="422"/> <source>Key Imported</source> <translation type="unfinished">鑰匙進口</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="430"/> + <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="433"/> <source>Processing ...</source> <translation type="unfinished"></translation> </message> @@ -3314,27 +3413,27 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::KeyServerImportTask</name> <message> - <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="74"/> + <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="79"/> <source>Key not found in the Keyserver.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="77"/> + <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="82"/> <source>Network connection timeout.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="80"/> + <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="85"/> <source>Cannot resolve the address of target key server.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="83"/> + <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="88"/> <source>General connection error occurred.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="89"/> + <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="94"/> <source>Success</source> <translation type="unfinished">成功</translation> </message> @@ -3423,52 +3522,52 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::KeyUploadDialog</name> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="59"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="60"/> <source>Uploading Public Key</source> <translation type="unfinished">上傳公開金鑰</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="77"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="78"/> <source>Error</source> <translation type="unfinished">錯誤</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="78"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="79"/> <source>Unknown error occurred</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="147"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="150"/> <source>Key Not Found</source> <translation type="unfinished">未找到金鑰</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="150"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="153"/> <source>Timeout</source> <translation type="unfinished">暫停</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="153"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="156"/> <source>Key Server Not Found</source> <translation type="unfinished">未找到金鑰伺服器</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="156"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="159"/> <source>Connection Error</source> <translation type="unfinished">連線錯誤</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="158"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="161"/> <source>Upload Failed</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="162"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="165"/> <source>Upload Success</source> <translation type="unfinished">上傳成功</translation> </message> <message> - <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="163"/> + <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="166"/> <source>Upload Public Key Successfully</source> <translation type="unfinished">上傳公鑰成功</translation> </message> @@ -3605,13 +3704,13 @@ This will result in loss of all cached form positions, statuses, key servers, et <context> <name>GpgFrontend::UI::MainWindow</name> <message> - <location filename="../../../../src/ui/main_window/MainWindow.cpp" line="156"/> - <location filename="../../../../src/ui/main_window/MainWindow.cpp" line="159"/> + <location filename="../../../../src/ui/main_window/MainWindow.cpp" line="154"/> + <location filename="../../../../src/ui/main_window/MainWindow.cpp" line="157"/> <source>Critical error occur while loading GpgFrontend.</source> <translation type="unfinished">加載 GpgFrontend 時發生嚴重錯誤。</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindow.cpp" line="158"/> + <location filename="../../../../src/ui/main_window/MainWindow.cpp" line="156"/> <source>Loading Failed</source> <translation type="unfinished">加載失敗</translation> </message> @@ -3633,20 +3732,20 @@ This will result in loss of all cached form positions, statuses, key servers, et <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="380"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="435"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="454"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="489"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="508"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="536"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="576"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="613"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="639"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="679"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="717"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="743"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="751"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="775"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="812"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="822"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="847"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="490"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="509"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="537"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="577"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="614"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="640"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="680"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="718"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="744"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="752"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="776"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="813"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="823"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="848"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="74"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="121"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="177"/> @@ -3655,14 +3754,14 @@ This will result in loss of all cached form positions, statuses, key servers, et <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="322"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="368"/> <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="97"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="120"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="140"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="156"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="169"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="182"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="197"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="247"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="255"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="121"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="141"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="157"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="170"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="183"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="198"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="248"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="256"/> <source>Error</source> <translation type="unfinished">錯誤</translation> </message> @@ -3673,10 +3772,10 @@ This will result in loss of all cached form positions, statuses, key servers, et <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="330"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="381"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="455"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="537"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="640"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="744"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="813"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="538"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="641"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="745"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="814"/> <source>Cannot read from file: %1</source> <translation type="unfinished"></translation> </message> @@ -3692,10 +3791,10 @@ This will result in loss of all cached form positions, statuses, key servers, et <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="288"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="338"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="416"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="583"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="686"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="757"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="828"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="584"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="687"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="758"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="829"/> <source>Warning</source> <translation type="unfinished">警告</translation> </message> @@ -3704,10 +3803,10 @@ This will result in loss of all cached form positions, statuses, key servers, et <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="190"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="298"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="348"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="577"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="680"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="752"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="823"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="578"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="681"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="753"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="824"/> <source>Cannot write to file: %1</source> <translation type="unfinished"></translation> </message> @@ -3738,11 +3837,11 @@ This will result in loss of all cached form positions, statuses, key servers, et <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="312"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="362"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="436"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="509"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="614"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="718"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="776"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="848"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="510"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="615"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="719"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="777"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="849"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="75"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="122"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="178"/> @@ -3756,8 +3855,8 @@ This will result in loss of all cached form positions, statuses, key servers, et <message> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="126"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="241"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="558"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="661"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="559"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="662"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="279"/> <source>Invalid KeyPair</source> <translation type="unfinished">無效的金鑰對</translation> @@ -3765,8 +3864,8 @@ This will result in loss of all cached form positions, statuses, key servers, et <message> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="127"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="242"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="559"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="662"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="560"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="663"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="280"/> <source>The selected keypair cannot be used for encryption.</source> <translation type="unfinished">所選的金鑰對不能用於加密。</translation> @@ -3774,8 +3873,8 @@ This will result in loss of all cached form positions, statuses, key servers, et <message> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="128"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="243"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="560"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="663"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="561"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="664"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="103"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="159"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="281"/> @@ -3801,8 +3900,8 @@ This will result in loss of all cached form positions, statuses, key servers, et <message> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="289"/> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="339"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="584"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="687"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="585"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="688"/> <source>The target file already exists, do you need to overwrite it?</source> <translation type="unfinished">目標文件已經存在,是否需要覆蓋?</translation> </message> @@ -3819,8 +3918,8 @@ This will result in loss of all cached form positions, statuses, key servers, et </message> <message> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="390"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="547"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="650"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="548"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="651"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="147"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="267"/> <source>No Key Checked</source> @@ -3828,8 +3927,8 @@ This will result in loss of all cached form positions, statuses, key servers, et </message> <message> <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="391"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="548"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="651"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="549"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="652"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="148"/> <source>Please check the key in the key toolbox on the right.</source> <translation type="unfinished">請檢查右側鑰匙工具箱中的鑰匙。</translation> @@ -3874,41 +3973,41 @@ If Data And Signature is COMBINED within a single file, KEEP THIS EMPTY: </sourc <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="490"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="491"/> <source>Please select the appropriate origin file or signature file. Ensure that both are in this directory.</source> <translation type="unfinished">請選擇合適的源文件或簽名文件。確保兩者都在此目錄中。</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="499"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="500"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="237"/> <source>Verifying</source> <translation type="unfinished">驗證</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="602"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="603"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="310"/> <source>Encrypting and Signing</source> <translation type="unfinished">加密和簽名</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="705"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="706"/> <source>Archiving & Encrypting & Signing</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="758"/> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="829"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="759"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="830"/> <source>The output file %1 already exists, do you need to overwrite it?</source> <translation type="unfinished">輸出文件 %1 已經存在,是否需要覆蓋?</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="767"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="768"/> <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="358"/> <source>Decrypting and Verifying</source> <translation type="unfinished">解密和驗證</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="838"/> + <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="839"/> <source>Decrypting & Verifying & Extracting</source> <translation type="unfinished"></translation> </message> @@ -3934,12 +4033,12 @@ If Data And Signature is COMBINED within a single file, KEEP THIS EMPTY: </sourc </message> <message> <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="97"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="120"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="140"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="156"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="169"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="182"/> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="197"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="121"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="141"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="157"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="170"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="183"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="198"/> <source>Key Not Found.</source> <translation type="unfinished">未找到金鑰。</translation> </message> @@ -3954,805 +4053,962 @@ If Data And Signature is COMBINED within a single file, KEEP THIS EMPTY: </sourc <translation type="unfinished">世界標準時間</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="125"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="126"/> <source>Local Time</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="248"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="249"/> <source>Cannot open this file. Please make sure that this is a regular file and it's readable.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="256"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="257"/> <source>Cannot open this file. The file is TOO LARGE (>1MB) for GpgFrontend Text Editor.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="302"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="298"/> <source>GpgFrontend Upgradeable (New Version: %1).</source> <translation type="unfinished">GpgFrontend 可升級(新版本:%1)。</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="312"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="302"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="448"/> + <source>Update</source> + <translation type="unfinished">更新</translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="308"/> <source>Withdrawn Version</source> <translation type="unfinished">撤回版</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="314"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="310"/> <source>This version(%1) may have been withdrawn by the developer due to serious problems. Please stop using this version immediately and use the latest stable version.</source> <translation type="unfinished">由於嚴重問題,此版本(%1) 可能已被開發人員撤回。請立即停止使用此版本並使用最新的穩定版本。</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="319"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="315"/> <source>You can download the latest stable version(%1) on Github Releases Page.<br/></source> <translation type="unfinished">您可以在 Github Releases Page 上下載最新的穩定版本 (%1)。<br/></translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="324"/> + <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="320"/> <source>This maybe a BETA Version (Latest Stable Version: %1).</source> <translation type="unfinished">這可能是 BETA 版本(最新穩定版本:%1)。</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="44"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="45"/> <source>New</source> <translation type="unfinished">新的</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="50"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="51"/> <source>Open a new file</source> <translation type="unfinished">打開一個新文件</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="53"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="54"/> <source>Open...</source> <translation type="unfinished">打開...</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="56"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="57"/> <source>Open an existing file</source> <translation type="unfinished">打開現有文件</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="59"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="60"/> <source>File Browser</source> <translation type="unfinished">文件瀏覽器</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="62"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="63"/> <source>Open a file browser</source> <translation type="unfinished">打開文件瀏覽器</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="66"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="67"/> <source>Save File</source> <translation type="unfinished">保存存檔</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="69"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="70"/> <source>Save the current File</source> <translation type="unfinished">保存當前文件</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="72"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="73"/> <source>Save As</source> <translation type="unfinished">另存為</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="75"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="76"/> <source>Save the current File as...</source> <translation type="unfinished">將當前文件另存為...</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="78"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="79"/> <source>Print</source> <translation type="unfinished">打印</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="81"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="82"/> <source>Print Document</source> <translation type="unfinished">打印文件</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="84"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="85"/> <source>Close</source> <translation type="unfinished">關閉</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="86"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="88"/> <source>Close file</source> <translation type="unfinished">關閉文件</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="89"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="91"/> <source>Quit</source> <translation type="unfinished">退出</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="92"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="94"/> <source>Quit Program</source> <translation type="unfinished">退出程序</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="97"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="99"/> <source>Undo</source> <translation type="unfinished">撤消</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="99"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="102"/> <source>Undo Last Edit Action</source> <translation type="unfinished">撤消上次編輯操作</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="102"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="105"/> <source>Redo</source> <translation type="unfinished">重做</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="104"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="108"/> <source>Redo Last Edit Action</source> <translation type="unfinished">重做上次編輯操作</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="107"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="111"/> <source>Zoom In</source> <translation type="unfinished">放大</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="111"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="116"/> <source>Zoom Out</source> <translation type="unfinished">縮小</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="115"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="121"/> <source>Paste</source> <translation type="unfinished">粘貼</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="118"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="124"/> <source>Paste Text From Clipboard</source> <translation type="unfinished">從剪貼板粘貼文本</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="121"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="127"/> <source>Cut</source> <translation type="unfinished">切</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="125"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="131"/> <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="129"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="135"/> <source>Copy</source> <translation type="unfinished">複製</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="133"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="139"/> <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="137"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="143"/> <source>Quote</source> <translation type="unfinished">引用</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="139"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="145"/> <source>Quote whole text</source> <translation type="unfinished">引用全文</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="142"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="148"/> <source>Select All</source> <translation type="unfinished">全選</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="145"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="151"/> <source>Select the whole text</source> <translation type="unfinished">選擇整個文本</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="149"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="155"/> <source>Find</source> <translation type="unfinished">找</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="152"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="158"/> <source>Find a word</source> <translation type="unfinished">找一個詞</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="155"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="161"/> <source>Remove spacing</source> <translation type="unfinished">刪除間距</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="160"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="166"/> <source>Remove double linebreaks, e.g. in pasted text from Web Mailer</source> <translation type="unfinished">刪除雙換行符,例如在來自 Web Mailer 的粘貼文本中</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="164"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="170"/> <source>Settings</source> <translation type="unfinished">設定值</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="165"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="171"/> <source>Open settings dialog</source> <translation type="unfinished">打開設定值對話框</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="173"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="179"/> <source>Encrypt</source> <translation type="unfinished">加密</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="177"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="183"/> <source>Encrypt Message</source> <translation type="unfinished">加密消息</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="195"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="201"/> <source>Encrypt Sign</source> <translation type="unfinished">加密簽名</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="200"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="206"/> <source>Encrypt and Sign Message</source> <translation type="unfinished">加密和簽名消息</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="218"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="224"/> <source>Decrypt</source> <translation type="unfinished">解密</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="221"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="227"/> <source>Decrypt Message</source> <translation type="unfinished">解密消息</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="243"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="249"/> <source>Decrypt Verify</source> <translation type="unfinished">解密驗證</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="247"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="253"/> <source>Decrypt and Verify Message</source> <translation type="unfinished">解密和驗證消息</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="269"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="275"/> <source>Sign</source> <translation type="unfinished">標誌</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="272"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="278"/> <source>Sign Message</source> <translation type="unfinished">簽名留言</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="284"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="290"/> <source>Verify</source> <translation type="unfinished">核實</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="287"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="293"/> <source>Verify Message</source> <translation type="unfinished">驗證消息</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="302"/> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="540"/> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="614"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="308"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="554"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="636"/> <source>File</source> <translation type="unfinished">文件</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="304"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="310"/> <source>Import New Key From File</source> <translation type="unfinished">從文件導入新金鑰</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="308"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="314"/> <source>Clipboard</source> <translation type="unfinished">剪貼板</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="312"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="318"/> <source>Import New Key From Clipboard</source> <translation type="unfinished">從剪貼板導入新金鑰</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="323"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="329"/> <source>Keyserver</source> <translation type="unfinished">金鑰伺服器</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="327"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="333"/> <source>Import New Key From Keyserver</source> <translation type="unfinished">從金鑰伺服器導入新金鑰</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="333"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="339"/> <source>Editor</source> <translation type="unfinished">編輯</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="335"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="341"/> <source>Import New Key From Editor</source> <translation type="unfinished">從編輯器導入新金鑰</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="339"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="345"/> <source>Manage Keys</source> <translation type="unfinished">管理金鑰</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="341"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="347"/> <source>Open Key Management</source> <translation type="unfinished">開放式金鑰管理</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="345"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="351"/> <source>Clear Password Cache</source> <translation type="unfinished">清除密碼緩存</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="348"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="354"/> <source>Clear Password Cache of GnuPG</source> <translation type="unfinished">清除 GnuPG 的密碼緩存</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="353"/> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="370"/> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="391"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="359"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="376"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="397"/> <source>Successful Operation</source> <translation type="unfinished">成功運作</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="354"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="360"/> <source>Clear password cache successfully</source> <translation type="unfinished">清除密碼緩存成功</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="356"/> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="374"/> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="395"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="362"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="380"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="401"/> <source>Failed Operation</source> <translation type="unfinished">操作失敗</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="357"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="363"/> <source>Failed to clear password cache of GnuPG</source> <translation type="unfinished">無法清除 GnuPG 的密碼緩存</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="362"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="368"/> <source>Reload All Components</source> <translation type="unfinished">重新加載所有組件</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="364"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="370"/> <source>Reload All GnuPG's Components</source> <translation type="unfinished">重新加載所有 GnuPG 的組件</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="371"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="377"/> <source>Reload all the GnuPG's components successfully</source> <translation type="unfinished">成功重新加載所有 GnuPG 組件</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="375"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="381"/> <source>Failed to reload all or one of the GnuPG's component(s)</source> <translation type="unfinished">未能重新加載所有或其中一個 GnuPG 組件</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="380"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="386"/> <source>Restart All Components</source> <translation type="unfinished">重新啟動所有組件</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="382"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="388"/> <source>Restart All GnuPG's Components</source> <translation type="unfinished">重新啟動所有 GnuPG 的組件</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="392"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="398"/> <source>Restart all the GnuPG's components successfully</source> <translation type="unfinished">成功重啟所有 GnuPG 組件</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="396"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="402"/> <source>Failed to restart all or one of the GnuPG's component(s)</source> <translation type="unfinished">無法重新啟動所有或其中一個 GnuPG 組件</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="401"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="407"/> <source>Open GnuPG Controller</source> <translation type="unfinished">打開 GnuPG 控制器</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="403"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="409"/> <source>Open GnuPG Controller Dialog</source> <translation type="unfinished">打開 GnuPG 控制器對話框</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="410"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="413"/> + <source>Open Module Controller</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="415"/> + <source>Open Module Controller Dialog</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="422"/> <source>About</source> <translation type="unfinished">關於</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="412"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="424"/> <source>Show the application's About box</source> <translation type="unfinished">顯示應用程序的關於框</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="417"/> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="590"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="430"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="434"/> <source>GnuPG</source> <translation type="unfinished">GnuPG</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="419"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="432"/> <source>Information about Gnupg</source> <translation type="unfinished">關於 Gnupg 的信息</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="423"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="437"/> <source>Translate</source> <translation type="unfinished">翻譯</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="425"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="439"/> <source>Information about translation</source> <translation type="unfinished">翻譯信息</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="432"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="441"/> + <source>Translators</source> + <translation type="unfinished">翻譯員</translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="444"/> <source>Check for Updates</source> <translation type="unfinished">檢查更新</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="434"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="446"/> <source>Check for updates</source> <translation type="unfinished">檢查更新</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="438"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="451"/> <source>Open Wizard</source> <translation type="unfinished">打開嚮導</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="439"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="453"/> <source>Open the wizard</source> <translation type="unfinished">打開嚮導</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="444"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="458"/> <source>Append Public Key to Editor</source> <translation type="unfinished">將公鑰附加到編輯器</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="446"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="460"/> <source>Append selected Keypair's Public Key to Editor</source> <translation type="unfinished">將選定的金鑰對的公鑰附加到編輯器</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="451"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="465"/> <source>Append Create DateTime to Editor</source> <translation type="unfinished">將創建日期時間附加到編輯器</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="453"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="467"/> <source>Append selected Key's creation date and time to Editor</source> <translation type="unfinished">將所選金鑰的創建日期和時間附加到編輯器</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="458"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="472"/> <source>Append Expire DateTime to Editor</source> <translation type="unfinished">將過期日期時間附加到編輯器</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="460"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="474"/> <source>Append selected Key's expiration date and time to Editor</source> <translation type="unfinished">將所選金鑰的到期日期和時間附加到編輯器</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="465"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="479"/> <source>Append Fingerprint to Editor</source> <translation type="unfinished">將指紋附加到編輯器</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="467"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="481"/> <source>Append selected Key's Fingerprint to Editor</source> <translation type="unfinished">將所選金鑰的指紋附加到編輯器</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="471"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="485"/> <source>Copy Email</source> <translation type="unfinished">複製電子郵件</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="473"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="487"/> <source>Copy selected Keypair's to clipboard</source> <translation type="unfinished">將選定的金鑰對複製到剪貼板</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="478"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="492"/> <source>Copy Default UID</source> <translation type="unfinished">複製預設 UID</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="480"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="494"/> <source>Copy selected Keypair's default UID to clipboard</source> <translation type="unfinished">將所選金鑰對的預設 UID 複製到剪貼板</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="484"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="498"/> <source>Copy Key ID</source> <translation type="unfinished">複製金鑰 ID</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="486"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="500"/> <source>Copy selected Keypair's ID to clipboard</source> <translation type="unfinished">將所選金鑰對的 ID 複製到剪貼板</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="490"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="504"/> <source>Show Key Details</source> <translation type="unfinished">顯示關鍵細節</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="491"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="505"/> <source>Show Details for this Key</source> <translation type="unfinished">顯示此鍵的詳細信息</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="495"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="509"/> <source>Add To Favourite</source> <translation type="unfinished">加入到收藏夾</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="496"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="510"/> <source>Add this key to Favourite Table</source> <translation type="unfinished">將此鍵加入到收藏夾表</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="502"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="516"/> <source>Remove From Favourite</source> <translation type="unfinished">從收藏夾中刪除</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="504"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="518"/> <source>Remove this key from Favourite Table</source> <translation type="unfinished">從收藏表中刪除此鍵</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="510"/> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="511"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="524"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="525"/> <source>Set Owner Trust Level</source> <translation type="unfinished">設定所有者信任級別</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="530"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="544"/> <source>Remove PGP Header</source> <translation type="unfinished">刪除 PGP 標頭</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="534"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="548"/> <source>Add PGP Header</source> <translation type="unfinished">加入 PGP 標頭</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="553"/> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="636"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="567"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="658"/> <source>Edit</source> <translation type="unfinished">編輯</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="571"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="585"/> <source>Crypt</source> <translation type="unfinished">地穴</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="581"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="595"/> <source>Keys</source> <translation type="unfinished">鑰匙</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="582"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="596"/> <source>Import Key</source> <translation type="unfinished">導入金鑰</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="598"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="604"/> + <source>Advance</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="612"/> <source>Steganography</source> <translation type="unfinished">隱寫術</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="602"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="616"/> <source>View</source> <translation type="unfinished">看法</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="604"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="618"/> <source>Help</source> <translation type="unfinished">幫助</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="621"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="643"/> <source>Operations</source> <translation type="unfinished">運作中</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="631"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="653"/> <source>Key</source> <translation type="unfinished">鑰匙</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="644"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="666"/> <source>Special Edit</source> <translation type="unfinished">特別編輯</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="656"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="678"/> <source>Import key from...</source> <translation type="unfinished">匯入金鑰位置...</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="657"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="679"/> <source>Import key</source> <translation type="unfinished">導入金鑰</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="673"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="695"/> <source>Ready</source> <translation type="unfinished">準備好</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="680"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="702"/> <source>Key ToolBox</source> <translation type="unfinished">鑰匙工具箱</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="688"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="710"/> <source>Default</source> <translation type="unfinished">預設</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="696"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="718"/> <source>Favourite</source> <translation type="unfinished">最喜歡的</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="704"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="726"/> <source>Only Public Key</source> <translation type="unfinished">只有公鑰</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="714"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="736"/> <source>Has Private Key</source> <translation type="unfinished">有私鑰</translation> </message> <message> - <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="728"/> + <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="750"/> <source>Information Board</source> <translation type="unfinished">信息板</translation> </message> </context> <context> + <name>GpgFrontend::UI::ModuleControllerDialog</name> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="49"/> + <source>Module Informations</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="50"/> + <source>Actions</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="51"/> + <source>Show Mods Directory</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="53"/> + <source>Registered Modules</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="54"/> + <source>Global Register Table</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="55"/> + <source>Debugger</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="58"/> + <source>Tips: Module name front with "*" stands for integrated module.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="60"/> + <source>Module Controller</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="84"/> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="184"/> + <source>Enable Auto Activate</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="133"/> + <source>BASIC INFO</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="135"/> + <source>ID</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="137"/> + <source>Version</source> + <translation type="unfinished">版本</translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="139"/> + <source>SDK Version</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="141"/> + <source>Qt ENV Version</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="143"/> + <source>Hash</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="144"/> + <source>Path</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="148"/> + <source>Auto Activate</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="149"/> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="151"/> + <source>True</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="149"/> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="151"/> + <source>False</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="150"/> + <source>Active</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="155"/> + <source>METADATA</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="171"/> + <source>Listening Event</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="180"/> + <source>Deactivate</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="181"/> + <source>Activate</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/dialog/controller/ModuleControllerDialog.cpp" line="183"/> + <source>Disable Auto Activate</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>GpgFrontend::UI::NetworkTab</name> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="71"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="72"/> <source>Proxy</source> <translation type="unfinished">代理伺服器</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="72"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="73"/> <source>Network Ability</source> <translation type="unfinished">網路適性</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="73"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="74"/> <source>Operations</source> <translation type="unfinished">運作中</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="75"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="76"/> <source>Enable Proxy</source> <translation type="unfinished">啟用代理伺服器</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="76"/> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="79"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="77"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="80"/> <source>Port</source> <translation type="unfinished">連接埠</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="78"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="79"/> <source>Host Address</source> <translation type="unfinished">主機位址</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="80"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="81"/> <source>Proxy Type</source> <translation type="unfinished">代理伺服器類型</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="81"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="82"/> <source>Username</source> <translation type="unfinished">使用者名稱</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="82"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="83"/> <source>Password</source> <translation type="unfinished">密碼</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="85"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="86"/> <source>Apply Proxy Settings and Check Proxy Connection</source> <translation type="unfinished">套用代理伺服器設定值並檢查代理伺服器連線</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="88"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="89"/> <source>Forbid all GnuPG network connection.</source> <translation type="unfinished">禁止所有 GnuPG 網路連線</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="90"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="93"/> <source>Prohibit checking for version updates when the program starts.</source> <translation type="unfinished">禁止程式啟動時進行檢查版本更新</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="92"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="96"/> <source>Automatically import a missing key for signature verification.</source> <translation type="unfinished">自動匯入缺少的金鑰以利簽署驗證</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="94"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="98"/> <source>Tips: These Option Changes take effect only after the application restart.</source> <translation type="unfinished">提示: 選項變更僅在應用程式重新啟動後才會生效。</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="170"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="173"/> <source>Test Server Url Accessibility</source> <translation type="unfinished">測試伺服器 Url 存取可用性</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="171"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="174"/> <source>Server Url</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="181"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="184"/> <source>Success</source> <translation type="unfinished">成功</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="182"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="185"/> <source>Successfully connect to the target server through the proxy server.</source> <translation type="unfinished">成功連線經由代理伺服器至目標伺服器</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="186"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="189"/> <source>Failed</source> <translation type="unfinished">失敗</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="187"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="190"/> <source>Unable to connect to the target server through the proxy server. Proxy settings may be invalid.</source> <translation type="unfinished">無法連線經由代理伺服器至目標伺服器。代理伺服器設定值可能為無效的。</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="197"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="200"/> <source>Test Proxy Server Connection...</source> <translation type="unfinished">測試代理伺服器連線...</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="198"/> + <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="201"/> <source>Is using your proxy settings to access the url. Note that this test operation will apply your proxy settings to the entire software.</source> <translation type="unfinished">正在使用您的代理伺服器設定值存取 url。請注意,此測試操作會將您的代理伺服器設定值應用於整個軟件。</translation> </message> @@ -4938,37 +5194,37 @@ If Data And Signature is COMBINED within a single file, KEEP THIS EMPTY: </sourc <context> <name>GpgFrontend::UI::SettingsDialog</name> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="54"/> + <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="53"/> <source>General</source> <translation type="unfinished">一般設定</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="55"/> + <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="54"/> <source>Appearance</source> <translation type="unfinished">外觀</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="56"/> + <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="55"/> <source>Key Server</source> <translation type="unfinished">金鑰伺服器</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="57"/> + <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="56"/> <source>Network</source> <translation type="unfinished">網絡</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="68"/> + <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="67"/> <source>Settings</source> <translation type="unfinished">設定值</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="72"/> + <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="71"/> <source>Preference</source> <translation type="unfinished">喜好設定</translation> </message> <message> - <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="128"/> + <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="124"/> <source>System Default</source> <translation type="unfinished">系統預設值</translation> </message> @@ -5211,7 +5467,7 @@ If Data And Signature is COMBINED within a single file, KEEP THIS EMPTY: </sourc <context> <name>GpgFrontend::UI::TranslatorsTab</name> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="131"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="145"/> <source>If you think there are any problems with the translation, why not participate in the translation work? If you want to participate, please read the document or contact me via email.</source> <translation type="unfinished">如果覺得翻譯有問題,何不參與翻譯工作呢?如果您想參加,請閱讀文檔或通過電子郵件與我聯繫。</translation> </message> @@ -5219,63 +5475,63 @@ If Data And Signature is COMBINED within a single file, KEEP THIS EMPTY: </sourc <context> <name>GpgFrontend::UI::UpdateTab</name> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="154"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="163"/> <source>It is recommended that you always check the version of GpgFrontend and upgrade to the latest version.</source> <translation type="unfinished">建議您經常檢查 GpgFrontend 的版本併升級到最新版本。</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="157"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="166"/> <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/dialog/help/AboutDialog.cpp" line="163"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="172"/> <source>Current Version</source> <translation type="unfinished">當前版本</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="164"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="173"/> <source>: </source> <translation type="unfinished">: </translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="246"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="248"/> <source>Latest Version From Github</source> <translation type="unfinished">來自 Github 的最新版本</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="252"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="254"/> <source>The current version is less than the latest version on github.</source> <translation type="unfinished">當前版本低於github上的最新版本。</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="254"/> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="265"/> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="277"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="256"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="267"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="279"/> <source>Please click</source> <translation type="unfinished">請點擊</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="257"/> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="268"/> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="280"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="259"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="270"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="282"/> <source>Here</source> <translation type="unfinished">這裡</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="257"/> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="268"/> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="280"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="259"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="270"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="282"/> <source>to download the latest stable version.</source> <translation type="unfinished">下載最新的穩定版本。</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="263"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="265"/> <source>This version has serious problems and has been withdrawn. Please stop using it immediately.</source> <translation type="unfinished">此版本存在嚴重問題,已撤回。請立即停止使用。</translation> </message> <message> - <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="274"/> + <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="276"/> <source>This version has not been released yet, it may be a beta version. If you are not a tester and care about version stability, please do not use this version.</source> <translation type="unfinished">此版本尚未發布,可能是測試版。如果您不是測試人員並且關心版本穩定性,請不要使用此版本。</translation> </message> @@ -5472,7 +5728,7 @@ If Data And Signature is COMBINED within a single file, KEEP THIS EMPTY: </sourc <context> <name>GpgFrontend::UI::Wizard</name> <message> - <location filename="../../../../src/ui/dialog/Wizard.cpp" line="44"/> + <location filename="../../../../src/ui/dialog/Wizard.cpp" line="43"/> <source>First Start Wizard</source> <translation type="unfinished">首次啟動嚮導</translation> </message> @@ -5513,17 +5769,17 @@ If Data And Signature is COMBINED within a single file, KEEP THIS EMPTY: </sourc <context> <name>QCoreApplication</name> <message> - <location filename="../../../../src/cmd.cpp" line="49"/> + <location filename="../../../../src/cmd.cpp" line="47"/> <source>This is free software; see the source for copying conditions.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/cmd.cpp" line="54"/> + <location filename="../../../../src/cmd.cpp" line="52"/> <source>Build DateTime: </source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/cmd.cpp" line="55"/> + <location filename="../../../../src/cmd.cpp" line="54"/> <source>Build Version: </source> <translation type="unfinished"></translation> </message> @@ -5533,27 +5789,27 @@ If Data And Signature is COMBINED within a single file, KEEP THIS EMPTY: </sourc <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/ui/GpgFrontendUIInit.cpp" line="54"/> + <location filename="../../../../src/ui/GpgFrontendUIInit.cpp" line="56"/> <source>Loading Gnupg Info...</source> <translation type="unfinished">正在加載 Gnupg 信息...</translation> </message> <message> - <location filename="../../../../src/ui/GpgFrontendUIInit.cpp" line="55"/> + <location filename="../../../../src/ui/GpgFrontendUIInit.cpp" line="57"/> <source>If this process is too slow, please set the key server address appropriately in the gnupg configuration file (depending on the network situation in your country or region).</source> <translation type="unfinished">如果此過程太慢,請在 gnupg 組態檔案中適當設定金鑰伺服器位址(取決於您所在國家或地區的網絡情況)。</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="63"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="64"/> <source>Show Verify Details</source> <translation type="unfinished">顯示驗證詳細信息</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="71"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="72"/> <source>Public key not found locally</source> <translation type="unfinished">本地未找到公鑰</translation> </message> <message> - <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="72"/> + <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="73"/> <source>There is no target public key content in local for GpgFrontend to gather enough information about this Signature. Do you want to import the public key from Keyserver now?</source> <translation type="unfinished">本地沒有目標公鑰內容供 GpgFrontend 收集有關此簽名的足夠信息。現在要從 Keyserver 導入公鑰嗎?</translation> </message> @@ -5611,20 +5867,30 @@ If Data And Signature is COMBINED within a single file, KEEP THIS EMPTY: </sourc <translation type="unfinished">成功</translation> </message> <message> - <location filename="../../../../src/core/GpgCoreInit.cpp" line="294"/> + <location filename="../../../../src/core/GpgCoreInit.cpp" line="303"/> <source>GpgME initiation failed</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/core/GpgCoreInit.cpp" line="397"/> + <location filename="../../../../src/core/GpgCoreInit.cpp" line="409"/> <source>GpgME Context initiation failed</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../../../src/core/GpgCoreInit.cpp" line="406"/> + <location filename="../../../../src/core/GpgCoreInit.cpp" line="418"/> <source>Gpg Key Detabase initiation failed</source> <translation type="unfinished"></translation> </message> + <message> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="486"/> + <source>Sync All Public Key</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../../../src/ui/widgets/KeyList.cpp" line="487"/> + <source>You have not checked any public keys that you want to synchronize, do you want to synchronize all local public keys from the key server?</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>QObject</name> diff --git a/resource/lfs/pixmaps/com.bktus.gpgfrontend.png b/resource/lfs/pixmaps/com.bktus.gpgfrontend.png Binary files differindex b3268b01..041fb0e2 100644 --- a/resource/lfs/pixmaps/com.bktus.gpgfrontend.png +++ b/resource/lfs/pixmaps/com.bktus.gpgfrontend.png diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 8fa51056..48efd191 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -61,7 +61,7 @@ if(GPGFRONTEND_QT5_BUILD) else() # Introduce Qt # Support Qt version: 6.x - find_package(Qt6 6 COMPONENTS Core Widgets PrintSupport Network Core5Compat LinguistTools REQUIRED) + find_package(Qt6 6 COMPONENTS Core Widgets PrintSupport Network LinguistTools REQUIRED) endif() @@ -73,20 +73,29 @@ set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC_OPTIONS "--compress;9") set(CMAKE_AUTOUIC_SEARCH_PATHS ${CMAKE_AUTOUIC_SEARCH_PATHS} ${CMAKE_SOURCE_DIR}/ui) +# Set Build Information +configure_file(${CMAKE_SOURCE_DIR}/src/GpgFrontend.h.in ${CMAKE_SOURCE_DIR}/src/GpgFrontend.h @ONLY) +configure_file(${CMAKE_SOURCE_DIR}/src/GpgFrontendBuildInfo.h.in ${CMAKE_SOURCE_DIR}/src/GpgFrontendBuildInfo.h @ONLY) +configure_file(${CMAKE_SOURCE_DIR}/src/GpgFrontendBuildInstallInfo.h.in ${CMAKE_SOURCE_DIR}/src/GpgFrontendBuildInstallInfo.h @ONLY) +configure_file(${CMAKE_SOURCE_DIR}/src/module/sdk/GFSDKBuildInfo.h.in ${CMAKE_SOURCE_DIR}/src/module/sdk/GFSDKBuildInfo.h @ONLY) +if (APPLE) + configure_file(${CMAKE_SOURCE_DIR}/resource/plist/ExportOptions.plist.in ${CMAKE_BINARY_DIR}/ExportOptions.plist @ONLY) +endif () + +# Set Runtime Output Directory +if (NOT XCODE_BUILD) + # Set Binary Output Path + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/artifacts) +else () + # Set Binary Output Path + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}) +endif () # configure for output path and resources if (BUILD_APPLICATION) aux_source_directory(. BASE_SOURCE) set(APP_ICON_RESOURCE_WINDOWS "${CMAKE_SOURCE_DIR}/gpgfrontend.rc") set_property(SOURCE gpgfrontend.rc APPEND PROPERTY OBJECT_DEPENDS ${CMAKE_SOURCE_DIR}/gpgfrontend.ico) - - if (NOT XCODE_BUILD) - # Set Binary Output Path - set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/artifacts) - else () - # Set Binary Output Path - set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}) - endif () endif () if (BUILD_CORE) @@ -121,10 +130,12 @@ if (BUILD_APPLICATION) if (APPLE) set(RESOURCE_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Resources) elseif (LINUX AND NOT LINUX_INSTALL_SOFTWARE) - file(COPY ${CMAKE_SOURCE_DIR}/resource/lfs/app-image/gpgfrontend DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ FOLLOW_SYMLINK_CHAIN) - file(COPY ${CMAKE_SOURCE_DIR}/resource/appstream/com.bktus.gpgfrontend.metainfo.xml DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/gpgfrontend/usr/share/metainfo FOLLOW_SYMLINK_CHAIN) - file(COPY ${CMAKE_SOURCE_DIR}/resource/appstream/com.bktus.gpgfrontend.desktop DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/gpgfrontend/usr/share/applications FOLLOW_SYMLINK_CHAIN) - set(RESOURCE_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/gpgfrontend/usr/share) + file(MAKE_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/AppDir) + file(COPY ${CMAKE_SOURCE_DIR}/resource/lfs/hicolor DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/AppDir/usr/share/icons) + file(COPY ${CMAKE_SOURCE_DIR}/resource/appstream/com.bktus.gpgfrontend.metainfo.xml DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/AppDir/usr/share/metainfo FOLLOW_SYMLINK_CHAIN) + file(COPY ${CMAKE_SOURCE_DIR}/resource/appstream/com.bktus.gpgfrontend.desktop DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/AppDir/usr/share/applications FOLLOW_SYMLINK_CHAIN) + file(COPY ${CMAKE_SOURCE_DIR}/resource/lfs/pixmaps/com.bktus.gpgfrontend.png DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/AppDir FOLLOW_SYMLINK_CHAIN) + set(RESOURCE_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/AppDir/usr/share) else () set(RESOURCE_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) endif () @@ -133,31 +144,14 @@ if (BUILD_APPLICATION) endif () endif () -if (BASIC_ENV_CONFIG) - # Set Build Information - configure_file(${CMAKE_SOURCE_DIR}/src/GpgFrontend.h.in ${CMAKE_SOURCE_DIR}/src/GpgFrontend.h @ONLY) - configure_file(${CMAKE_SOURCE_DIR}/src/GpgFrontendBuildInfo.h.in ${CMAKE_SOURCE_DIR}/src/GpgFrontendBuildInfo.h @ONLY) - configure_file(${CMAKE_SOURCE_DIR}/src/GpgFrontendBuildInstallInfo.h.in ${CMAKE_SOURCE_DIR}/src/GpgFrontendBuildInstallInfo.h @ONLY) - if (APPLE) - configure_file(${CMAKE_SOURCE_DIR}/resource/plist/ExportOptions.plist.in ${CMAKE_BINARY_DIR}/ExportOptions.plist @ONLY) - endif () -endif () - -if (BUILD_APPLICATION) - # Copy Resource Files - file(COPY ${CMAKE_SOURCE_DIR}/resource/css DESTINATION ${RESOURCE_OUTPUT_DIRECTORY}/ FOLLOW_SYMLINK_CHAIN) - file(COPY ${CMAKE_SOURCE_DIR}/resource/lfs/icons DESTINATION ${RESOURCE_OUTPUT_DIRECTORY}/ FOLLOW_SYMLINK_CHAIN) - file(COPY ${CMAKE_SOURCE_DIR}/TRANSLATORS DESTINATION ${RESOURCE_OUTPUT_DIRECTORY} FOLLOW_SYMLINK_CHAIN) -endif () - if (BUILD_APPLICATION) if (${CMAKE_BUILD_TYPE} STREQUAL "Release") if (APPLE) - file(COPY ${CMAKE_SOURCE_DIR}/gpgfrontend.icns DESTINATION ${RESOURCE_OUTPUT_DIRECTORY}/ FOLLOW_SYMLINK_CHAIN) - # Refresh App Bundle - file(REMOVE ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${AppName}.app) + set(GPGFRONTEND_MACOS_ICON ${CMAKE_SOURCE_DIR}/gpgfrontend.icns) + set_source_files_properties(${GPGFRONTEND_MACOS_ICON} PROPERTIES + MACOSX_PACKAGE_LOCATION "Resources") elseif (LINUX AND NOT LINUX_INSTALL_SOFTWARE) - file(REMOVE ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/gpgfrontend/usr/bin/${AppName}) + file(REMOVE ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/AppDir/usr/bin/${AppName}) endif () endif () endif () @@ -341,39 +335,31 @@ if (BUILD_APPLICATION) add_custom_command(TARGET ${AppName} POST_BUILD COMMAND windeployqt-qt6.exe --force ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${AppName}.exe) endif() - elseif (APPLE AND NOT XCODE_BUILD) - # custom app bundle packing - add_executable(${AppName} MACOSX_BUNDLE ${ICON_RESOURCE} ${BASE_SOURCE} ${RESOURCE_FILES}) - set_target_properties(${AppName} PROPERTIES - BUNDLE True - MACOSX_BUNDLE_GUI_IDENTIFIER com.bktus.gpgfrontend - MACOSX_BUNDLE_BUNDLE_NAME ${AppName} - MACOSX_BUNDLE_LONG_VERSION_STRING ${BUILD_VERSION} - MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION} - MACOSX_BUNDLE_BUNDLE_VERSION ${BUILD_VERSION} - MACOSX_BUNDLE_ICON_FILE "gpgfrontend.icns") - add_custom_command(TARGET ${AppName} POST_BUILD - COMMAND /bin/rm -rf ./${AppName}.app/Contents/Resources - WORKING_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} - COMMENT "Deleting Resources in App Bundle") - add_custom_command(TARGET ${AppName} POST_BUILD - COMMAND /bin/mv -n ./Resources ./${AppName}.app/Contents/ - WORKING_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} - COMMENT "Copying Resources into App Bundle Resource") elseif (LINUX AND NOT LINUX_INSTALL_SOFTWARE) add_executable(${AppName} ${BASE_SOURCE} ${RESOURCE_FILES}) + add_custom_command(TARGET ${AppName} POST_BUILD - COMMAND /bin/mkdir -p ./gpgfrontend/usr/bin && /bin/mv -f ./${AppName} ./gpgfrontend/usr/bin/ - WORKING_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} - COMMENT "Copying Binary into App Image") + COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/AppDir/usr/bin" + COMMAND ${CMAKE_COMMAND} -E rename "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${AppName}" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/AppDir/usr/bin/${AppName}" + COMMENT "Copying Binary into App Image" + ) + add_custom_command(TARGET ${AppName} POST_BUILD - COMMAND /bin/mkdir -p ./gpgfrontend/usr/lib - WORKING_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} - COMMENT "Complement to build the required architecture") - # app bundle packing using xcode + COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/AppDir/usr/plugins" + COMMENT "Complement to build the required architecture" + ) + + add_custom_command(TARGET ${AppName} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/AppDir/usr/plugins/mods" + COMMAND ${CMAKE_COMMAND} -E rename "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/mods" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/AppDir/usr/plugins/mods" + COMMENT "Copying Mods into App Image" + ) + + # app bundle packing using xcode elseif (APPLE AND XCODE_BUILD) # standard app bundle packing - add_executable(${AppName} MACOSX_BUNDLE ${ICON_RESOURCE} ${BASE_SOURCE} ${RESOURCE_FILES}) + add_executable(${AppName} MACOSX_BUNDLE ${GPGFRONTEND_MACOS_ICON} ${BASE_SOURCE} ${RESOURCE_FILES}) + set_target_properties(${AppName} PROPERTIES BUNDLE True MACOSX_BUNDLE_GUI_IDENTIFIER com.bktus.gpgfrontend @@ -384,20 +370,7 @@ if (BUILD_APPLICATION) MACOSX_BUNDLE_COPYRIGHT "GPL-3.0" MACOSX_BUNDLE_INFO_STRING "An OpenPGP Crypto Tool" MACOSX_BUNDLE_ICON_FILE "gpgfrontend.icns" - MACOSX_BUNDLE_INFO_PLIST ${CMAKE_SOURCE_DIR}/resource/plist/MacOSXBundleInfo.plist.in - ) - add_custom_command(TARGET ${AppName} POST_BUILD - COMMAND /bin/rm -rf ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${AppName}.app/Contents/Resources - WORKING_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} - COMMENT "Deleting Resources in App Bundle") - add_custom_command(TARGET ${AppName} POST_BUILD - COMMAND /bin/cp -rf ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Resources ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${CMAKE_BUILD_TYPE}/${AppName}.app/Contents/ - WORKING_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} - COMMENT "Copying Resources into App Bundle Resource") - add_custom_command(TARGET ${AppName} POST_BUILD - COMMAND macdeployqt ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${CMAKE_BUILD_TYPE}/${AppName}.app - WORKING_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} - COMMENT "Resolving Qt Dependency") + MACOSX_BUNDLE_INFO_PLIST ${CMAKE_SOURCE_DIR}/resource/plist/MacOSXBundleInfo.plist.in) # option for sandbox mode, still under test if(GPGFRONTEND_XOCDE_ENABLE_SANDBOX) @@ -408,8 +381,7 @@ if (BUILD_APPLICATION) WORKING_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} COMMENT "Copying Buddled GnuPG into App Bundle Resource") set_target_properties(${AppName} PROPERTIES - XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS "${CMAKE_SOURCE_DIR}/resource/entitlements/GpgFrontend.entitlements" - ) + XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS "${CMAKE_SOURCE_DIR}/resource/entitlements/GpgFrontend.entitlements") else() message(STATUS "Build Application Without App Sandbox") set(CUSTOM_ATTRIBUTE_ENABLE_APP_SANDBOX "No") @@ -421,10 +393,11 @@ if (BUILD_APPLICATION) XCODE_ATTRIBUTE_OTHER_CODE_SIGN_FLAGS "--deep --entitlements ${CMAKE_SOURCE_DIR}/resource/plist/entitlement.plist" XCODE_ATTRIBUTE_ENABLE_APP_SANDBOX "${CUSTOM_ATTRIBUTE_ENABLE_APP_SANDBOX}" XCODE_ATTRIBUTE_ENABLE_HARDENED_RUNTIME "Yes" - XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "${GPGFRONTEND_XOCDE_CODE_SIGN_IDENTITY}" - ) - else () + XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "${GPGFRONTEND_XOCDE_CODE_SIGN_IDENTITY}") + elseif(LINUX AND LINUX_INSTALL_SOFTWARE) add_executable(${AppName} ${BASE_SOURCE} ${RESOURCE_FILES}) + else () + message(FATAL_ERROR "cannot find a defined method to release application.") endif () else () # if the status is debug @@ -451,7 +424,7 @@ endif () # link options for GpgFrontend if (BUILD_APPLICATION) - target_link_libraries(${AppName} gpgfrontend_ui gpgfrontend_module gpgfrontend_test) + target_link_libraries(${AppName} gpgfrontend_ui gpgfrontend_test) if (MINGW) message(STATUS "Link Application Library For MINGW") target_link_libraries(${AppName} crypto) @@ -466,7 +439,8 @@ endif () # add i18n support if (BUILD_APPLICATION) set(LOCALE_TS_PATH ${CMAKE_SOURCE_DIR}/resource/lfs/locale/ts) - set(TS_FILES "${LOCALE_TS_PATH}/GpgFrontend.de_DE.ts" + set(TS_FILES "${LOCALE_TS_PATH}/GpgFrontend.en_US.ts" + "${LOCALE_TS_PATH}/GpgFrontend.de_DE.ts" "${LOCALE_TS_PATH}/GpgFrontend.fr_FR.ts" "${LOCALE_TS_PATH}/GpgFrontend.zh_CN.ts" "${LOCALE_TS_PATH}/GpgFrontend.zh_TW.ts" @@ -521,42 +495,35 @@ if (BUILD_APPLICATION) FILES ${QT_TRANSLATIONS_QM}) endif() - endif() # if building linux package if (LINUX AND LINUX_INSTALL_SOFTWARE) include(GNUInstallDirs) - if (INSTALL_GPGFRONTEND_APP) - install(TARGETS ${AppName} gpgfrontend_core gpgfrontend_ui - EXPORT GpgFrontendTargets - RUNTIME DESTINATION ${CMAKE_INSTALL_FULL_BINDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR}) - install(DIRECTORY ${PC_GPGME_LIBDIR} - DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR} - FILES_MATCHING PATTERN "libgpgme.so*" - PATTERN "lib" EXCLUDE) - install(DIRECTORY ${PC_GPGME_LIBDIR} - DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR} - FILES_MATCHING PATTERN "libassuan.so*" - PATTERN "lib" EXCLUDE) - install(DIRECTORY ${PC_GPGME_LIBDIR} - DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR} - FILES_MATCHING PATTERN "libgpg-error.so*" - PATTERN "lib" EXCLUDE) - install(FILES ${CMAKE_SOURCE_DIR}/TRANSLATORS - DESTINATION ${CMAKE_INSTALL_FULL_DATAROOTDIR}/${AppName}/) - install(FILES ${CMAKE_SOURCE_DIR}/resource/appstream/com.bktus.gpgfrontend.appdata.xml - DESTINATION ${CMAKE_INSTALL_FULL_DATAROOTDIR}/metainfo/) - install(FILES ${CMAKE_SOURCE_DIR}/resource/appstream/com.bktus.gpgfrontend.desktop - DESTINATION ${CMAKE_INSTALL_FULL_DATAROOTDIR}/applications/) - install(DIRECTORY ${CMAKE_SOURCE_DIR}/resource/lfs/pixmaps/ - DESTINATION ${CMAKE_INSTALL_FULL_DATAROOTDIR}/pixmaps/) - install(DIRECTORY ${CMAKE_SOURCE_DIR}/resource/lfs/hicolor/ - DESTINATION ${CMAKE_INSTALL_FULL_DATAROOTDIR}/icons/hicolor/) - endif () + set(GPGFRONTEND_INSTALL_LIBRARIES + mimalloc + spdlog + gpgfrontend_core + gpgfrontend_ui + gpgfrontend_test + gpgfrontend_pinentry + gpgfrontend_module_sdk) + + message(STATUS "GpgFrontend Install Libraries: ${GPGFRONTEND_INSTALL_LIBRARIES}") + install(TARGETS ${AppName} ${GPGFRONTEND_INSTALL_LIBRARIES} + EXPORT GpgFrontendTargets + RUNTIME DESTINATION ${CMAKE_INSTALL_FULL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR}) + + install(FILES ${CMAKE_SOURCE_DIR}/TRANSLATORS + DESTINATION ${CMAKE_INSTALL_FULL_DATAROOTDIR}/${AppName}/) + install(FILES ${CMAKE_SOURCE_DIR}/resource/appstream/com.bktus.gpgfrontend.appdata.xml + DESTINATION ${CMAKE_INSTALL_FULL_DATAROOTDIR}/metainfo/) + install(FILES ${CMAKE_SOURCE_DIR}/resource/appstream/com.bktus.gpgfrontend.desktop + DESTINATION ${CMAKE_INSTALL_FULL_DATAROOTDIR}/applications/) + install(DIRECTORY ${CMAKE_SOURCE_DIR}/resource/lfs/pixmaps/ + DESTINATION ${CMAKE_INSTALL_FULL_DATAROOTDIR}/pixmaps/) + install(DIRECTORY ${CMAKE_SOURCE_DIR}/resource/lfs/hicolor/ + DESTINATION ${CMAKE_INSTALL_FULL_DATAROOTDIR}/icons/hicolor/) endif () - -message(STATUS "Resource Files: ${RESOURCE_OUTPUT_DIRECTORY}") -message(STATUS "Runtime Files: ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}") diff --git a/src/GpgFrontendBuildInfo.h.in b/src/GpgFrontendBuildInfo.h.in index c6242b1e..37338de0 100644 --- a/src/GpgFrontendBuildInfo.h.in +++ b/src/GpgFrontendBuildInfo.h.in @@ -52,4 +52,10 @@ */ #define BUILD_FLAG "@BUILD_FLAG@" #define BUILD_TIMESTAMP "@BUILD_TIMESTAMP@" -#define APP_INSTALL_FLAG "@APP_INSTALL_FLAG@"
\ No newline at end of file +#define APP_INSTALL_FLAG "@APP_INSTALL_FLAG@" + +/** + * @brief Network + * + */ +#define HTTP_REQUEST_USER_AGENT "@HTTP_REQUEST_USER_AGENT@"
\ No newline at end of file diff --git a/src/app.cpp b/src/app.cpp index a5539a37..9aa72894 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -29,7 +29,7 @@ #include "GpgFrontendContext.h" #include "core/GpgConstants.h" #include "core/GpgCoreInit.h" -#include "module/GpgFrontendModuleInit.h" +#include "core/module/ModuleInit.h" #include "ui/GpgFrontendUIInit.h" // main diff --git a/src/cmd.cpp b/src/cmd.cpp index cef0a984..d41b6de0 100644 --- a/src/cmd.cpp +++ b/src/cmd.cpp @@ -28,13 +28,13 @@ #include "cmd.h" +#include "core/utils/BuildInfoUtils.h" #include "main.h" // std #include <iostream> // GpgFrontend -#include "GpgFrontendBuildInfo.h" #include "GpgFrontendContext.h" #include "test/GpgFrontendTest.h" @@ -42,19 +42,19 @@ namespace GpgFrontend { auto PrintVersion() -> int { QTextStream stream(stdout); - stream << PROJECT_NAME << " " - << "v" << VERSION_MAJOR << "." << VERSION_MINOR << "." << VERSION_PATCH - << '\n'; + stream << PROJECT_NAME << " " << GetProjectVersion() << '\n'; stream << "Copyright (©) 2021 Saturneric <[email protected]>" << '\n' << QCoreApplication::tr( "This is free software; see the source for copying conditions.") << '\n' << '\n'; - stream << QCoreApplication::tr("Build DateTime: ") << BUILD_TIMESTAMP << '\n' - << QCoreApplication::tr("Build Version: ") << BUILD_VERSION << '\n' - << QCoreApplication::tr("Source Code Version: ") << GIT_VERSION - << '\n'; + stream << QCoreApplication::tr("Build DateTime: ") + << QLocale().toString(GetProjectBuildTimestamp()) << '\n' + << QCoreApplication::tr("Build Version: ") << GetProjectBuildVersion() + << '\n' + << QCoreApplication::tr("Source Code Version: ") + << GetProjectBuildGitVersion() << '\n'; stream << Qt::endl; return 0; diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index cc1f6742..cedbe69a 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -129,7 +129,6 @@ if (MINGW) target_link_libraries(gpgfrontend_core PUBLIC wsock32) elseif (APPLE) message(STATUS "Link GPG Static Library For macOS") - target_link_libraries(gpgfrontend_core PUBLIC dl) if (XCODE_BUILD) set_target_properties(gpgfrontend_core PROPERTIES diff --git a/src/core/GpgConstants.h b/src/core/GpgConstants.h index c2125650..91d5f1ef 100644 --- a/src/core/GpgConstants.h +++ b/src/core/GpgConstants.h @@ -30,6 +30,7 @@ namespace GpgFrontend { +constexpr int kNonRestartCode = 0; constexpr int kRestartCode = 1000; ///< only refresh ui constexpr int kDeepRestartCode = 1001; // refresh core and ui @@ -51,4 +52,10 @@ constexpr const char* PGP_PUBLIC_KEY_BEGIN = constexpr const char* PGP_PRIVATE_KEY_BEGIN = "-----BEGIN PGP PRIVATE KEY BLOCK-----"; ///< +// MODULE ID +const QString kGnuPGInfoGatheringModuleID = + "com.bktus.gpgfrontend.module.gnupg_info_gathering"; +const QString kVersionCheckingModuleID = + "com.bktus.gpgfrontend.module.version_checking"; + } // namespace GpgFrontend diff --git a/src/core/GpgCoreInit.cpp b/src/core/GpgCoreInit.cpp index 3a56c02a..2952d6e4 100644 --- a/src/core/GpgCoreInit.cpp +++ b/src/core/GpgCoreInit.cpp @@ -45,7 +45,17 @@ namespace GpgFrontend { -void DestroyGpgFrontendCore() { SingletonStorageCollection::Destroy(); } +void DestroyGpgFrontendCore() { + // kill all daemon if necessary + auto settings = GlobalSettingStation::GetInstance().GetSettings(); + auto kill_all_gnupg_daemon_at_close = + settings.value("gnupg/kill_all_gnupg_daemon_at_close", false).toBool(); + if (kill_all_gnupg_daemon_at_close) { + GpgAdvancedOperator::KillAllGpgComponents(); + } + + SingletonStorageCollection::Destroy(); +} auto VerifyGpgconfPath(const QFileInfo& gnupg_install_fs_path) -> bool { return gnupg_install_fs_path.isAbsolute() && gnupg_install_fs_path.exists() && @@ -176,7 +186,7 @@ auto InitGpgME(const QString& gpgconf_path, const QString& gnupg_path) -> bool { GF_CORE_LOG_DEBUG("got gnupg version from rt: {}", gnupg_version); // conditional check: only support gpg 2.1.x now - if (!(CompareSoftwareVersion(gnupg_version, "2.1.0") >= 0 && find_gpgconf && + if (!(GFCompareSoftwareVersion(gnupg_version, "2.1.0") >= 0 && find_gpgconf && find_openpgp && find_cms)) { GF_CORE_LOG_ERROR("gpgme env check failed, abort"); return false; @@ -276,7 +286,6 @@ void InitGpgFrontendCore(CoreInitArgs args) { // initialize global register table Module::UpsertRTValue("core", "env.state.gpgme", 0); Module::UpsertRTValue("core", "env.state.ctx", 0); - Module::UpsertRTValue("core", "env.state.gnupg", 0); Module::UpsertRTValue("core", "env.state.basic", 0); Module::UpsertRTValue("core", "env.state.all", 0); @@ -319,7 +328,10 @@ void InitGpgFrontendCore(CoreInitArgs args) { .toString(); auto use_pinentry_as_password_input_dialog = - settings.value("gnupg/use_pinentry_as_password_input_dialog", true) + settings + .value( + "gnupg/use_pinentry_as_password_input_dialog", + QString::fromLocal8Bit(qgetenv("container")) != "flatpak") .toBool(); GF_CORE_LOG_DEBUG("core loaded if use custom key databse path: {}", @@ -406,60 +418,22 @@ void InitGpgFrontendCore(CoreInitArgs args) { QCoreApplication::tr("Gpg Key Detabase initiation failed")); }; } + GF_CORE_LOG_DEBUG( - "basic env checking finished, " - "including gpgme, ctx, and key infos"); + "basic env checking finished, including gpgme, ctx, and key infos"); + Module::UpsertRTValue("core", "env.state.basic", 1); CoreSignalStation::GetInstance()->SignalGoodGnupgEnv(); - // if gnupg-info-gathering module activated - if (args.gather_external_gnupg_info && - Module::IsModuleAcivate("com.bktus.gpgfrontend.module." - "integrated.gnupg-info-gathering")) { - GF_CORE_LOG_DEBUG( - "module gnupg-info-gathering is activated, " - "loading external gnupg info..."); - - // gather external gnupg info - Module::TriggerEvent( - "GPGFRONTEND_CORE_INITLIZED", - [](const Module::EventIdentifier& /*e*/, - const Module::Event::ListenerIdentifier& l_id, - DataObjectPtr o) { - GF_CORE_LOG_DEBUG( - "received event GPGFRONTEND_CORE_INITLIZED callback " - "from module: {}", - l_id); - - if (l_id == - "com.bktus.gpgfrontend.module.integrated.gnupg-info-" - "gathering") { - GF_CORE_LOG_DEBUG( - "received callback from gnupg-info-gathering "); - - // try to restart all components - auto settings = - GlobalSettingStation::GetInstance().GetSettings(); - auto restart_all_gnupg_components_on_start = - settings.value("gnupg/restart_gpg_agent_on_start", false) - .toBool(); - - if (restart_all_gnupg_components_on_start) { - GpgAdvancedOperator::RestartGpgComponents(); - } - Module::UpsertRTValue("core", "env.state.gnupg", 1); + // try to restart all components + auto restart_all_gnupg_components_on_start = + settings.value("gnupg/restart_gpg_agent_on_start", false).toBool(); - // announce that all checkings were finished - GF_CORE_LOG_INFO( - "all env checking finished, including gpgme, " - "ctx and gnupg"); - Module::UpsertRTValue("core", "env.state.all", 1); - } - }); - } else { - GF_CORE_LOG_DEBUG("gnupg-info-gathering is not activated"); - Module::UpsertRTValue("core", "env.state.all", 1); + if (restart_all_gnupg_components_on_start) { + GpgAdvancedOperator::RestartGpgComponents(); } + + Module::UpsertRTValue("core", "env.state.all", 1); return 0; }, "core_init_task"); diff --git a/src/core/GpgCoreInit.h b/src/core/GpgCoreInit.h index 15f0254d..ecd6afea 100644 --- a/src/core/GpgCoreInit.h +++ b/src/core/GpgCoreInit.h @@ -28,7 +28,7 @@ #pragma once -#include "GpgConstants.h" +#include "core/GpgFrontendCoreExport.h" namespace GpgFrontend { diff --git a/src/core/GpgFrontendCore.h b/src/core/GpgFrontendCore.h index 14b1f878..f07824cf 100644 --- a/src/core/GpgFrontendCore.h +++ b/src/core/GpgFrontendCore.h @@ -30,23 +30,3 @@ // Qt #include <QtCore> - -// std -#include <cstdint> -#include <vector> - -// spdlog library configuration -#define SPDLOG_ACTIVE_LEVEL SPDLOG_LEVEL_TRACE -#include <spdlog/spdlog.h> - -// logger fmt -#include "log/QtLoggerFmt.h" - -// gpgme library -#include <gpgme.h> - -// logbal includes or macroes -#include "GpgFrontend.h" - -// dll export macroes -#include "GpgFrontendCoreExport.h" diff --git a/src/core/function/CoreSignalStation.h b/src/core/function/CoreSignalStation.h index e0a11fa3..8827c803 100644 --- a/src/core/function/CoreSignalStation.h +++ b/src/core/function/CoreSignalStation.h @@ -28,7 +28,7 @@ #pragma once -#include "core/GpgFrontendCore.h" +#include "core/GpgFrontendCoreExport.h" namespace GpgFrontend { diff --git a/src/core/function/GlobalSettingStation.cpp b/src/core/function/GlobalSettingStation.cpp index 7b21ebca..45ab11f9 100644 --- a/src/core/function/GlobalSettingStation.cpp +++ b/src/core/function/GlobalSettingStation.cpp @@ -69,6 +69,7 @@ class GlobalSettingStation::Impl { if (!QDir(app_data_path_).exists()) QDir(app_data_path_).mkpath("."); if (!QDir(app_log_path_).exists()) QDir(app_log_path_).mkpath("."); + if (!QDir(GetModulesDir()).exists()) QDir(GetModulesDir()).mkpath("."); } [[nodiscard]] auto GetSettings() -> QSettings { @@ -124,6 +125,15 @@ class GlobalSettingStation::Impl { */ [[nodiscard]] auto GetLogDir() const -> QString { return app_log_path_; } + /** + * @brief Get the Modules Dir object + * + * @return QString + */ + [[nodiscard]] auto GetModulesDir() const -> QString { + return GetAppDataPath() + "/mods"; + } + private: QString working_path_ = QDir::currentPath(); @@ -174,6 +184,10 @@ auto GlobalSettingStation::GetAppDataPath() const -> QString { return p_->GetLogDir(); } +[[nodiscard]] auto GlobalSettingStation::GetModulesDir() const -> QString { + return p_->GetModulesDir(); +} + auto GlobalSettingStation::GetLogFilesSize() const -> QString { return p_->GetLogFilesSize(); } diff --git a/src/core/function/GlobalSettingStation.h b/src/core/function/GlobalSettingStation.h index 85ac57b4..c907bdb5 100644 --- a/src/core/function/GlobalSettingStation.h +++ b/src/core/function/GlobalSettingStation.h @@ -83,6 +83,13 @@ class GPGFRONTEND_CORE_EXPORT GlobalSettingStation [[nodiscard]] auto GetLogDir() const -> QString; /** + * @brief Get the Modules Dir object + * + * @return QString + */ + [[nodiscard]] auto GetModulesDir() const -> QString; + + /** * @brief Get the Log Files Size object * * @return QString diff --git a/src/core/function/SecureMemoryAllocator.h b/src/core/function/SecureMemoryAllocator.h index e9f1c1c3..e86d54d6 100644 --- a/src/core/function/SecureMemoryAllocator.h +++ b/src/core/function/SecureMemoryAllocator.h @@ -28,9 +28,7 @@ #pragma once -#include <cstdint> -#include <memory> - +#include "core/GpgFrontendCoreExport.h" #include "core/utils/LogUtils.h" namespace GpgFrontend { diff --git a/src/core/function/basic/GpgFunctionObject.h b/src/core/function/basic/GpgFunctionObject.h index 1ea352b6..422af4a1 100644 --- a/src/core/function/basic/GpgFunctionObject.h +++ b/src/core/function/basic/GpgFunctionObject.h @@ -29,7 +29,6 @@ #pragma once #include <mutex> -#include <stdexcept> #include "core/GpgFrontendCoreExport.h" #include "core/function/basic/ChannelObject.h" diff --git a/src/core/function/gpg/GpgAdvancedOperator.cpp b/src/core/function/gpg/GpgAdvancedOperator.cpp index 3fc831ed..cb8fec00 100644 --- a/src/core/function/gpg/GpgAdvancedOperator.cpp +++ b/src/core/function/gpg/GpgAdvancedOperator.cpp @@ -76,6 +76,34 @@ void GpgFrontend::GpgAdvancedOperator::ReloadGpgComponents( }}); } +void GpgFrontend::GpgAdvancedOperator::KillAllGpgComponents() { + const auto gpgconf_path = Module::RetrieveRTValueTypedOrDefault<>( + "core", "gpgme.ctx.gpgconf_path", QString{}); + GF_CORE_LOG_DEBUG("got gpgconf path from rt: {}", gpgconf_path); + + if (gpgconf_path.isEmpty()) { + GF_CORE_LOG_ERROR("cannot get valid gpgconf path from rt, abort."); + return; + } + + GpgFrontend::GpgCommandExecutor::ExecuteSync( + {gpgconf_path, QStringList{"--verbose", "--kill", "all"}, + [=](int exit_code, const QString &p_out, const QString &p_err) { + GF_CORE_LOG_DEBUG("gpgconf --kill all command got exit code: {}", + exit_code); + bool success = true; + if (exit_code != 0) { + success = false; + GF_CORE_LOG_ERROR( + "gpgconf execute error, process stderr: {}, process stdout: {}", + p_err, p_out); + return; + } + + GF_CORE_LOG_DEBUG("gpgconf --kill --all execute result: {}", success); + }}); +} + void GpgFrontend::GpgAdvancedOperator::RestartGpgComponents() { const auto gpgconf_path = Module::RetrieveRTValueTypedOrDefault<>( "core", "gpgme.ctx.gpgconf_path", QString{}); @@ -139,14 +167,17 @@ void GpgFrontend::GpgAdvancedOperator::ResetConfigures(OperationCallback cb) { } void GpgFrontend::GpgAdvancedOperator::StartGpgAgent(OperationCallback cb) { + if (!Module::IsModuleActivate(kGnuPGInfoGatheringModuleID)) { + cb(-1, TransferParams()); + return; + } + const auto gpg_agent_path = Module::RetrieveRTValueTypedOrDefault<>( - "com.bktus.gpgfrontend.module.integrated.gnupg-info-gathering", - "gnupg.gpg_agent_path", QString{}); + kGnuPGInfoGatheringModuleID, "gnupg.gpg_agent_path", QString{}); GF_CORE_LOG_DEBUG("got gnupg agent path from rt: {}", gpg_agent_path); const auto home_path = Module::RetrieveRTValueTypedOrDefault<>( - "com.bktus.gpgfrontend.module.integrated.gnupg-info-gathering", - "gnupg.home_path", QString{}); + kGnuPGInfoGatheringModuleID, "gnupg.home_path", QString{}); GF_CORE_LOG_DEBUG("got gnupg home path from rt: {}", home_path); if (gpg_agent_path.isEmpty()) { @@ -164,14 +195,17 @@ void GpgFrontend::GpgAdvancedOperator::StartGpgAgent(OperationCallback cb) { } void GpgFrontend::GpgAdvancedOperator::StartDirmngr(OperationCallback cb) { + if (!Module::IsModuleActivate(kGnuPGInfoGatheringModuleID)) { + cb(-1, TransferParams()); + return; + } + const auto dirmngr_path = Module::RetrieveRTValueTypedOrDefault<>( - "com.bktus.gpgfrontend.module.integrated.gnupg-info-gathering", - "gnupg.dirmngr_path", QString{}); + kGnuPGInfoGatheringModuleID, "gnupg.dirmngr_path", QString{}); GF_CORE_LOG_DEBUG("got gnupg dirmngr path from rt: {}", dirmngr_path); const auto home_path = Module::RetrieveRTValueTypedOrDefault<>( - "com.bktus.gpgfrontend.module.integrated.gnupg-info-gathering", - "gnupg.home_path", QString{}); + kGnuPGInfoGatheringModuleID, "gnupg.home_path", QString{}); GF_CORE_LOG_DEBUG("got gnupg home path from rt: {}", home_path); if (dirmngr_path.isEmpty()) { @@ -189,14 +223,17 @@ void GpgFrontend::GpgAdvancedOperator::StartDirmngr(OperationCallback cb) { } void GpgFrontend::GpgAdvancedOperator::StartKeyBoxd(OperationCallback cb) { + if (!Module::IsModuleActivate(kGnuPGInfoGatheringModuleID)) { + cb(-1, TransferParams()); + return; + } + const auto keyboxd_path = Module::RetrieveRTValueTypedOrDefault<>( - "com.bktus.gpgfrontend.module.integrated.gnupg-info-gathering", - "gnupg.keyboxd_path", QString{}); + kGnuPGInfoGatheringModuleID, "gnupg.keyboxd_path", QString{}); GF_CORE_LOG_DEBUG("got gnupg keyboxd path from rt: {}", keyboxd_path); const auto home_path = Module::RetrieveRTValueTypedOrDefault<>( - "com.bktus.gpgfrontend.module.integrated.gnupg-info-gathering", - "gnupg.home_path", QString{}); + kGnuPGInfoGatheringModuleID, "gnupg.home_path", QString{}); GF_CORE_LOG_DEBUG("got gnupg home path from rt: {}", home_path); if (keyboxd_path.isEmpty()) { diff --git a/src/core/function/gpg/GpgAdvancedOperator.h b/src/core/function/gpg/GpgAdvancedOperator.h index d6b57095..26391e03 100644 --- a/src/core/function/gpg/GpgAdvancedOperator.h +++ b/src/core/function/gpg/GpgAdvancedOperator.h @@ -93,6 +93,12 @@ class GPGFRONTEND_CORE_EXPORT GpgAdvancedOperator { * @return false */ static void StartKeyBoxd(OperationCallback); + + /** + * @brief + * + */ + static void KillAllGpgComponents(); }; } // namespace GpgFrontend diff --git a/src/core/function/gpg/GpgContext.cpp b/src/core/function/gpg/GpgContext.cpp index 7c84d3c4..7dec318e 100644 --- a/src/core/function/gpg/GpgContext.cpp +++ b/src/core/function/gpg/GpgContext.cpp @@ -94,18 +94,18 @@ class GpgContext::Impl { int fd) -> gpgme_error_t { size_t res; #ifdef QT5_BUILD - QString pass_qstr = "abcdefg\n"; - QByteArray pass = pass_qstr.toUtf8(); + QString pass_qstr = "abcdefg\n"; + QByteArray pass = pass_qstr.toUtf8(); #else - QString pass = "abcdefg\n"; + QString pass = "abcdefg\n"; #endif - + auto passpahrase_size = pass.size(); size_t off = 0; do { #ifdef QT5_BUILD - const char* p_pass = pass.data(); + const char *p_pass = pass.data(); res = gpgme_io_write(fd, &p_pass[off], passpahrase_size - off); #else res = gpgme_io_write(fd, &pass[off], passpahrase_size - off); @@ -246,15 +246,14 @@ class GpgContext::Impl { } // set context offline mode - GF_CORE_LOG_DEBUG("gpg context offline mode: {}", args_.offline_mode); + GF_CORE_LOG_DEBUG("gpg context: offline mode: {}", args_.offline_mode); + GF_CORE_LOG_DEBUG("gpg context: auto import missing key: {}", + args_.auto_import_missing_key); gpgme_set_offline(ctx, args_.offline_mode ? 1 : 0); // set option auto import missing key - // invalid at offline mode - GF_CORE_LOG_DEBUG("gpg context auto import missing key: {}", - args_.offline_mode); - if (!args.offline_mode && args.auto_import_missing_key) { - if (CheckGpgError(gpgme_set_ctx_flag(ctx, "auto-key-import", "1")) != + if (!args_.offline_mode && args.auto_import_missing_key) { + if (CheckGpgError(gpgme_set_ctx_flag(ctx, "auto-key-retrieve", "1")) != GPG_ERR_NO_ERROR) { return false; } diff --git a/src/core/function/gpg/GpgContext.h b/src/core/function/gpg/GpgContext.h index d473a341..2a8f6fdd 100644 --- a/src/core/function/gpg/GpgContext.h +++ b/src/core/function/gpg/GpgContext.h @@ -28,6 +28,8 @@ #pragma once +#include <gpgme.h> + #include "core/function/SecureMemoryAllocator.h" #include "core/function/basic/GpgFunctionObject.h" diff --git a/src/core/function/gpg/GpgKeyOpera.cpp b/src/core/function/gpg/GpgKeyOpera.cpp index e0ecb3ce..14d58a10 100644 --- a/src/core/function/gpg/GpgKeyOpera.cpp +++ b/src/core/function/gpg/GpgKeyOpera.cpp @@ -502,7 +502,7 @@ auto GpgKeyOpera::ModifyTOFUPolicy(const GpgKey& key, "core", "gpgme.ctx.gnupg_version", QString{"2.0.0"}); GF_CORE_LOG_DEBUG("got gnupg version from rt: {}", gnupg_version); - if (CompareSoftwareVersion(gnupg_version, "2.1.10") < 0) { + if (GFCompareSoftwareVersion(gnupg_version, "2.1.10") < 0) { GF_CORE_LOG_ERROR("operator not support"); return GPG_ERR_NOT_SUPPORTED; } diff --git a/src/core/function/result_analyse/GpgSignResultAnalyse.cpp b/src/core/function/result_analyse/GpgSignResultAnalyse.cpp index 3f3040b8..e02996b3 100644 --- a/src/core/function/result_analyse/GpgSignResultAnalyse.cpp +++ b/src/core/function/result_analyse/GpgSignResultAnalyse.cpp @@ -103,11 +103,9 @@ void GpgSignResultAnalyse::doAnalyse() { stream_ << "- " << tr("Hash Algo") << ": " << gpgme_hash_algo_name(new_sign->hash_algo) << Qt::endl; stream_ << "- " << tr("Sign Date") << "(" << tr("UTC") << ")" - << ": " - << QDateTime::fromSecsSinceEpoch(new_sign->timestamp).toString() - << Qt::endl; + << ": " << GetUTCDateByTimestamp(new_sign->timestamp) << Qt::endl; stream_ << "- " << tr("Sign Date") << "(" << tr("Localized") << ")" - << ": " << GetFormatedDateByTimestamp(new_sign->timestamp) + << ": " << GetLocalizedDateByTimestamp(new_sign->timestamp) << Qt::endl; stream_ << Qt::endl diff --git a/src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp b/src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp index df6b58b0..0a098a93 100644 --- a/src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp +++ b/src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp @@ -55,11 +55,10 @@ void GpgFrontend::GpgVerifyResultAnalyse::doAnalyse() { auto *sign = result->signatures; stream_ << "-> " << tr("Signed On") << "(" << tr("UTC") << ")" - << ": " << QDateTime::fromSecsSinceEpoch(sign->timestamp).toString() - << Qt::endl; + << ": " << GetUTCDateByTimestamp(sign->timestamp) << Qt::endl; stream_ << "-> " << tr("Signed On") << "(" << tr("Localized") << ")" - << ": " << GetFormatedDateByTimestamp(sign->timestamp) << Qt::endl; + << ": " << GetLocalizedDateByTimestamp(sign->timestamp) << Qt::endl; stream_ << Qt::endl << "## " << tr("Signatures List") << ":" << Qt::endl; stream_ << Qt::endl; @@ -190,7 +189,8 @@ auto GpgFrontend::GpgVerifyResultAnalyse::print_signer_without_key( << Qt::endl; stream << "- " << tr("Hash Algo") << ": " << sign.GetHashAlgo() << Qt::endl; stream << "- " << tr("Sign Date") << "(" << tr("UTC") << ")" - << ": " << sign.GetCreateTime().toString() << Qt::endl; + << ": " << QLocale().toString(sign.GetCreateTime().toUTC()) + << Qt::endl; stream << "- " << tr("Sign Date") << "(" << tr("Localized") << ")" << ": " << QLocale().toString(sign.GetCreateTime()) << Qt::endl; return true; @@ -235,7 +235,8 @@ auto GpgFrontend::GpgVerifyResultAnalyse::print_signer(QTextStream &stream, << Qt::endl; stream << "- " << tr("Hash Algo") << ": " << sign.GetHashAlgo() << Qt::endl; stream << "- " << tr("Sign Date") << "(" << tr("UTC") << ")" - << ": " << sign.GetCreateTime().toString() << Qt::endl; + << ": " << QLocale().toString(sign.GetCreateTime().toUTC()) + << Qt::endl; stream << "- " << tr("Sign Date") << "(" << tr("Localized") << ")" << ": " << QLocale().toString(sign.GetCreateTime()) << Qt::endl; stream << Qt::endl; diff --git a/src/ui/struct/CacheObject.cpp b/src/core/model/CacheObject.cpp index bd3b9818..37dedd92 100644 --- a/src/ui/struct/CacheObject.cpp +++ b/src/core/model/CacheObject.cpp @@ -30,7 +30,7 @@ #include "core/function/CacheManager.h" -namespace GpgFrontend::UI { +namespace GpgFrontend { CacheObject::CacheObject(QString cache_name) : cache_name_(std::move(cache_name)) { @@ -42,4 +42,4 @@ CacheObject::~CacheObject() { CacheManager::GetInstance().SaveDurableCache(cache_name_, *this); } -} // namespace GpgFrontend::UI
\ No newline at end of file +} // namespace GpgFrontend
\ No newline at end of file diff --git a/src/ui/struct/CacheObject.h b/src/core/model/CacheObject.h index ae8aa056..3cfa8083 100644 --- a/src/ui/struct/CacheObject.h +++ b/src/core/model/CacheObject.h @@ -28,9 +28,11 @@ #pragma once -namespace GpgFrontend::UI { +#include "core/GpgFrontendCoreExport.h" -class CacheObject : public QJsonDocument { +namespace GpgFrontend { + +class GPGFRONTEND_CORE_EXPORT CacheObject : public QJsonDocument { public: /** * @brief Construct a new Cache Object object @@ -49,4 +51,4 @@ class CacheObject : public QJsonDocument { QString cache_name_; ///< }; -} // namespace GpgFrontend::UI
\ No newline at end of file +} // namespace GpgFrontend
\ No newline at end of file diff --git a/src/core/model/GpgData.h b/src/core/model/GpgData.h index 358ebd19..eb1d7621 100644 --- a/src/core/model/GpgData.h +++ b/src/core/model/GpgData.h @@ -28,6 +28,8 @@ #pragma once +#include <gpgme.h> + #include "core/GpgFrontendCoreExport.h" #include "core/model/GFBuffer.h" #include "core/typedef/CoreTypedef.h" diff --git a/src/core/model/GpgGenKeyInfo.h b/src/core/model/GpgGenKeyInfo.h index 166c6b0f..65a7d03e 100644 --- a/src/core/model/GpgGenKeyInfo.h +++ b/src/core/model/GpgGenKeyInfo.h @@ -28,6 +28,8 @@ #pragma once +#include "core/GpgFrontendCoreExport.h" + namespace GpgFrontend { class GPGFRONTEND_CORE_EXPORT GenKeyInfo { diff --git a/src/core/model/GpgGenerateKeyResult.h b/src/core/model/GpgGenerateKeyResult.h index f312d415..dfd92ae1 100644 --- a/src/core/model/GpgGenerateKeyResult.h +++ b/src/core/model/GpgGenerateKeyResult.h @@ -28,6 +28,8 @@ #pragma once +#include <gpgme.h> + #include "core/GpgFrontendCore.h" #include "core/GpgFrontendCoreExport.h" diff --git a/src/core/model/GpgImportInformation.h b/src/core/model/GpgImportInformation.h index 5f85a338..cbe5a265 100644 --- a/src/core/model/GpgImportInformation.h +++ b/src/core/model/GpgImportInformation.h @@ -28,6 +28,10 @@ #pragma once +#include <gpgme.h> + +#include "core/GpgFrontendCoreExport.h" + namespace GpgFrontend { /** diff --git a/src/core/model/GpgPassphraseContext.cpp b/src/core/model/GpgPassphraseContext.cpp index 5df3f5a8..0156c04d 100644 --- a/src/core/model/GpgPassphraseContext.cpp +++ b/src/core/model/GpgPassphraseContext.cpp @@ -28,6 +28,7 @@ #include "GpgPassphraseContext.h" + namespace GpgFrontend { GpgPassphraseContext::GpgPassphraseContext(const QString& uids_info, diff --git a/src/core/model/GpgPassphraseContext.h b/src/core/model/GpgPassphraseContext.h index 2bc1ac75..1db36f62 100644 --- a/src/core/model/GpgPassphraseContext.h +++ b/src/core/model/GpgPassphraseContext.h @@ -30,6 +30,8 @@ #pragma once +#include "core/GpgFrontendCoreExport.h" + namespace GpgFrontend { class GPGFRONTEND_CORE_EXPORT GpgPassphraseContext : public QObject { diff --git a/src/core/model/GpgSubKey.h b/src/core/model/GpgSubKey.h index 83d75e2d..8257eab8 100644 --- a/src/core/model/GpgSubKey.h +++ b/src/core/model/GpgSubKey.h @@ -28,6 +28,10 @@ #pragma once +#include <gpgme.h> + +#include "core/GpgFrontendCoreExport.h" + namespace GpgFrontend { /** diff --git a/src/core/model/GpgTOFUInfo.h b/src/core/model/GpgTOFUInfo.h index ec4c49b7..5e8d83d4 100644 --- a/src/core/model/GpgTOFUInfo.h +++ b/src/core/model/GpgTOFUInfo.h @@ -28,6 +28,10 @@ #pragma once +#include <gpgme.h> + +#include "core/GpgFrontendCoreExport.h" + namespace GpgFrontend { /** * @brief diff --git a/src/ui/struct/SettingsObject.cpp b/src/core/model/SettingsObject.cpp index cc5e85bf..09824f12 100644 --- a/src/ui/struct/SettingsObject.cpp +++ b/src/core/model/SettingsObject.cpp @@ -30,25 +30,25 @@ #include "core/function/DataObjectOperator.h" -namespace GpgFrontend::UI { +namespace GpgFrontend { SettingsObject::SettingsObject(QString settings_name) : settings_name_(std::move(settings_name)) { try { - GF_UI_LOG_DEBUG("loading settings from: {}", this->settings_name_); + GF_CORE_LOG_DEBUG("loading settings from: {}", this->settings_name_); auto json_optional = DataObjectOperator::GetInstance().GetDataObject(settings_name_); if (json_optional.has_value() && json_optional->isObject()) { - GF_UI_LOG_DEBUG("settings object: {} loaded.", settings_name_); + GF_CORE_LOG_DEBUG("settings object: {} loaded.", settings_name_); QJsonObject::operator=(json_optional.value().object()); } else { - GF_UI_LOG_DEBUG("settings object: {} not found.", settings_name_); + GF_CORE_LOG_DEBUG("settings object: {} not found.", settings_name_); QJsonObject::operator=({}); } } catch (std::exception& e) { - GF_UI_LOG_ERROR("load setting object error: {}", e.what()); + GF_CORE_LOG_ERROR("load setting object error: {}", e.what()); } } @@ -66,4 +66,4 @@ void SettingsObject::Store(const QJsonObject& json) { auto* parent = (static_cast<QJsonObject*>(this)); *parent = json; } -} // namespace GpgFrontend::UI
\ No newline at end of file +} // namespace GpgFrontend
\ No newline at end of file diff --git a/src/ui/struct/SettingsObject.h b/src/core/model/SettingsObject.h index a9e5819f..4b52f31d 100644 --- a/src/ui/struct/SettingsObject.h +++ b/src/core/model/SettingsObject.h @@ -28,14 +28,16 @@ #pragma once -namespace GpgFrontend::UI { +#include "core/GpgFrontendCoreExport.h" + +namespace GpgFrontend { /** * @brief The SettingsObject class * This class is used to store data for the application securely. * */ -class SettingsObject : public QJsonObject { +class GPGFRONTEND_CORE_EXPORT SettingsObject : public QJsonObject { public: /** * @brief Construct a new Settings Object object @@ -66,4 +68,4 @@ class SettingsObject : public QJsonObject { private: QString settings_name_; ///< }; -} // namespace GpgFrontend::UI +} // namespace GpgFrontend diff --git a/src/core/module/Event.cpp b/src/core/module/Event.cpp index fab26453..4b0b989b 100644 --- a/src/core/module/Event.cpp +++ b/src/core/module/Event.cpp @@ -28,6 +28,8 @@ #include "Event.h" +#include "core/utils/CommonUtils.h" + namespace GpgFrontend::Module { class Event::Impl { @@ -67,7 +69,11 @@ class Event::Impl { auto GetIdentifier() -> EventIdentifier { return event_identifier_; } - void AddParameter(const QString& key, const ParameterValue& value) { + auto GetTriggerIdentifier() -> EventTriggerIdentifier { + return trigger_uuid_; + } + + void AddParameter(const QString& key, const QString& value) { data_[key] = value; } @@ -95,9 +101,37 @@ class Event::Impl { } } + auto ToModuleEvent() -> GFModuleEvent* { + auto* event = + static_cast<GFModuleEvent*>(SecureMalloc(sizeof(GFModuleEvent))); + + event->id = GFStrDup(event_identifier_); + event->trigger_id = GFStrDup(trigger_uuid_); + + GFModuleEventParam* l_param = nullptr; + GFModuleEventParam* p_param; + + int index = 0; + for (const auto& data : data_) { + p_param = static_cast<GFModuleEventParam*>( + SecureMalloc(sizeof(GFModuleEventParam))); + if (index++ == 0) event->params = p_param; + + p_param->name = GFStrDup(data.first); + p_param->value = GFStrDup(data.second); + p_param->next = nullptr; + + if (l_param != nullptr) l_param->next = p_param; + l_param = p_param; + } + + return event; + } + private: EventIdentifier event_identifier_; - std::map<QString, ParameterValue> data_; + EventTriggerIdentifier trigger_uuid_ = QUuid::createUuid().toString(); + std::map<QString, QString> data_; EventCallback callback_; QThread* callback_thread_ = nullptr; ///< }; @@ -128,7 +162,11 @@ auto Event::Event::GetIdentifier() -> EventIdentifier { return p_->GetIdentifier(); } -void Event::AddParameter(const QString& key, const ParameterValue& value) { +auto Event::Event::GetTriggerIdentifier() -> EventTriggerIdentifier { + return p_->GetTriggerIdentifier(); +} + +void Event::AddParameter(const QString& key, const QString& value) { p_->AddParameter(key, value); } @@ -136,4 +174,6 @@ void Event::ExecuteCallback(ListenerIdentifier l_id, DataObjectPtr d_o) { p_->ExecuteCallback(std::move(l_id), d_o); } +auto Event::ToModuleEvent() -> GFModuleEvent* { return p_->ToModuleEvent(); } + } // namespace GpgFrontend::Module
\ No newline at end of file diff --git a/src/core/module/Event.h b/src/core/module/Event.h index 92268216..b629caae 100644 --- a/src/core/module/Event.h +++ b/src/core/module/Event.h @@ -34,13 +34,15 @@ #include "core/GpgFrontendCore.h" #include "core/model/DataObject.h" +#include "module/sdk/GFSDKModule.h" namespace GpgFrontend::Module { class Event; -using EventRefrernce = std::shared_ptr<Event>; +using EventReference = std::shared_ptr<Event>; using EventIdentifier = QString; +using EventTriggerIdentifier = QString; using Evnets = std::vector<Event>; class GPGFRONTEND_CORE_EXPORT Event { @@ -52,7 +54,7 @@ class GPGFRONTEND_CORE_EXPORT Event { std::function<void(EventIdentifier, ListenerIdentifier, DataObjectPtr)>; struct ParameterInitializer { QString key; - ParameterValue value; + QString value; }; explicit Event(const QString&, @@ -75,10 +77,14 @@ class GPGFRONTEND_CORE_EXPORT Event { auto GetIdentifier() -> EventIdentifier; - void AddParameter(const QString& key, const ParameterValue& value); + auto GetTriggerIdentifier() -> EventTriggerIdentifier; + + void AddParameter(const QString& key, const QString& value); void ExecuteCallback(ListenerIdentifier, DataObjectPtr); + auto ToModuleEvent() -> GFModuleEvent*; + private: class Impl; SecureUniquePtr<Impl> p_; @@ -86,7 +92,7 @@ class GPGFRONTEND_CORE_EXPORT Event { template <typename... Args> auto MakeEvent(const EventIdentifier& event_id, Args&&... args, - Event::EventCallback e_cb) -> EventRefrernce { + Event::EventCallback e_cb) -> EventReference { std::initializer_list<Event::ParameterInitializer> params = { Event::ParameterInitializer{std::forward<Args>(args)}...}; return GpgFrontend::SecureCreateSharedObject<Event>(event_id, params, e_cb); diff --git a/src/core/module/GlobalModuleContext.cpp b/src/core/module/GlobalModuleContext.cpp index 9bc4f06b..e67e48f9 100644 --- a/src/core/module/GlobalModuleContext.cpp +++ b/src/core/module/GlobalModuleContext.cpp @@ -31,6 +31,7 @@ #include <set> #include <unordered_map> #include <unordered_set> +#include <utility> #include "core/module/Event.h" #include "core/module/Module.h" @@ -49,6 +50,18 @@ class GlobalModuleContext::Impl { acquired_channel_.insert(kGpgFrontendNonAsciiChannel); } + auto SearchModule(ModuleIdentifier module_id) -> ModulePtr { + // Search for the module in the register table. + auto module_info_opt = search_module_register_table(module_id); + if (!module_info_opt.has_value()) { + GF_CORE_LOG_ERROR("cannot find module id {} at register table", + module_id); + return nullptr; + } + + return module_info_opt.value()->module; + } + auto GetChannel(ModuleRawPtr module) -> int { // Search for the module in the register table. auto module_info_opt = @@ -85,7 +98,7 @@ class GlobalModuleContext::Impl { return default_task_runner_; } - auto RegisterModule(const ModulePtr& module) -> bool { + auto RegisterModule(const ModulePtr& module, bool integrated_module) -> bool { GF_CORE_LOG_DEBUG("attempting to register module: {}", module->GetModuleIdentifier()); // Check if the module is null or already registered. @@ -97,7 +110,7 @@ class GlobalModuleContext::Impl { return false; } - if (!module->Register()) { + if (module->Register() != 0) { GF_CORE_LOG_ERROR("register module {} failed", module->GetModuleIdentifier()); return false; @@ -107,6 +120,7 @@ class GlobalModuleContext::Impl { GpgFrontend::SecureCreateSharedObject<ModuleRegisterInfo>(); register_info->module = module; register_info->channel = acquire_new_unique_channel(); + register_info->integrated = integrated_module; // move module to its task runner' thread register_info->module->setParent(nullptr); @@ -158,6 +172,15 @@ class GlobalModuleContext::Impl { auto ListenEvent(ModuleIdentifier module_id, EventIdentifier event) -> bool { GF_CORE_LOG_DEBUG("module: {} is attempting to listen to event {}", module_id, event); + + // module -> event + auto module_info_opt = search_module_register_table(module_id); + if (!module_info_opt.has_value()) { + GF_CORE_LOG_ERROR("cannot find module id {} at register table", + module_id); + return false; + } + // Check if the event exists, if not, create it. auto met_it = module_events_table_.find(event); if (met_it == module_events_table_.end()) { @@ -166,6 +189,8 @@ class GlobalModuleContext::Impl { GF_CORE_LOG_DEBUG("new event {} of module system created", event); } + module_info_opt.value()->listening_event_ids.push_back(event); + auto& listeners_set = met_it->second; // Add the listener (module) to the event. auto listener_it = listeners_set.find(module_id); @@ -176,7 +201,7 @@ class GlobalModuleContext::Impl { } auto DeactivateModule(ModuleIdentifier module_id) -> bool { - // Search for the module in the register table. + // search for the module in the register table. auto module_info_opt = search_module_register_table(module_id); if (!module_info_opt.has_value()) { GF_CORE_LOG_ERROR("cannot find module id {} at register table", @@ -185,15 +210,23 @@ class GlobalModuleContext::Impl { } auto module_info = module_info_opt.value(); - // Activate the module if it is not already deactive. - if (!module_info->activate && module_info->module->Deactive()) { + // activate the module if it is not already deactive. + if (module_info->activate && (module_info->module->Deactive() == 0)) { + for (const auto& event_ids : module_info->listening_event_ids) { + auto& modules = module_events_table_[event_ids]; + if (auto it = modules.find(module_id); it != modules.end()) { + modules.erase(it); + } + } + + module_info->listening_event_ids.clear(); module_info->activate = false; } return !module_info->activate; } - auto TriggerEvent(const EventRefrernce& event) -> bool { + auto TriggerEvent(const EventReference& event) -> bool { auto event_id = event->GetIdentifier(); GF_CORE_LOG_DEBUG("attempting to trigger event: {}", event_id); @@ -222,6 +255,9 @@ class GlobalModuleContext::Impl { GF_CORE_LOG_DEBUG("event {}'s current listeners size: {}", event->GetIdentifier(), listeners_set.size()); + // register trigger id index table + module_on_triggering_events_table_[event->GetTriggerIdentifier()] = event; + // Iterate through each listener and execute the corresponding module for (const auto& listener_module_id : listeners_set) { // Search for the module's information in the registration table @@ -272,16 +308,49 @@ class GlobalModuleContext::Impl { return true; } - auto IsModuleActivated(const ModuleIdentifier& m_id) const -> bool { + auto SearchEvent(const EventTriggerIdentifier& trigger_id) + -> std::optional<EventReference> { + if (module_on_triggering_events_table_.find(trigger_id) != + module_on_triggering_events_table_.end()) { + return module_on_triggering_events_table_[trigger_id]; + } + return {}; + } + + [[nodiscard]] auto IsModuleActivated(const ModuleIdentifier& m_id) const + -> bool { auto m = search_module_register_table(m_id); return m.has_value() && m->get()->activate; } + auto IsIntegratedModule(ModuleIdentifier m_id) -> bool { + auto m = search_module_register_table(m_id); + return m.has_value() && m->get()->integrated; + } + + auto ListAllRegisteredModuleID() -> QList<ModuleIdentifier> { + QList<ModuleIdentifier> module_ids; + for (const auto& module : module_register_table_) { + module_ids.append(module.first); + } + module_ids.sort(); + return module_ids; + } + + auto GetModuleListening(const ModuleIdentifier& module_id) + -> QList<EventIdentifier> { + auto module_info = search_module_register_table(module_id); + if (!module_info.has_value()) return {}; + return module_info->get()->listening_event_ids; + } + private: struct ModuleRegisterInfo { int channel; ModulePtr module; bool activate; + bool integrated; + QList<QString> listening_event_ids; }; using ModuleRegisterInfoPtr = std::shared_ptr<ModuleRegisterInfo>; @@ -290,6 +359,8 @@ class GlobalModuleContext::Impl { module_register_table_; std::map<EventIdentifier, std::unordered_set<ModuleIdentifier>> module_events_table_; + std::map<EventTriggerIdentifier, EventReference> + module_on_triggering_events_table_; std::set<int> acquired_channel_; TaskRunnerPtr default_task_runner_; @@ -307,7 +378,8 @@ class GlobalModuleContext::Impl { } // Function to search for a module in the register table. - auto search_module_register_table(const ModuleIdentifier& identifier) const + [[nodiscard]] auto search_module_register_table( + const ModuleIdentifier& identifier) const -> std::optional<ModuleRegisterInfoPtr> { auto mrt_it = module_register_table_.find(identifier); if (mrt_it == module_register_table_.end()) { @@ -323,6 +395,11 @@ GlobalModuleContext::GlobalModuleContext() GlobalModuleContext::~GlobalModuleContext() = default; +auto GlobalModuleContext::SearchModule(ModuleIdentifier module_id) + -> ModulePtr { + return p_->SearchModule(std::move(module_id)); +} + // Function to get the task runner associated with a module. auto GlobalModuleContext::GetTaskRunner(ModuleRawPtr module) -> std::optional<TaskRunnerPtr> { @@ -341,8 +418,9 @@ auto GlobalModuleContext::GetGlobalTaskRunner() return p_->GetGlobalTaskRunner(); } -auto GlobalModuleContext::RegisterModule(ModulePtr module) -> bool { - return p_->RegisterModule(std::move(module)); +auto GlobalModuleContext::RegisterModule(ModulePtr module, + bool integrated_module) -> bool { + return p_->RegisterModule(module, integrated_module); } auto GlobalModuleContext::ActiveModule(ModuleIdentifier module_id) -> bool { @@ -358,8 +436,13 @@ auto GlobalModuleContext::DeactivateModule(ModuleIdentifier module_id) -> bool { return p_->DeactivateModule(std::move(module_id)); } -auto GlobalModuleContext::TriggerEvent(EventRefrernce event) -> bool { - return p_->TriggerEvent(std::move(event)); +auto GlobalModuleContext::TriggerEvent(EventReference event) -> bool { + return p_->TriggerEvent(event); +} + +auto GlobalModuleContext::SearchEvent(EventTriggerIdentifier trigger_id) + -> std::optional<EventReference> { + return p_->SearchEvent(trigger_id); } auto GlobalModuleContext::GetChannel(ModuleRawPtr module) -> int { @@ -371,7 +454,20 @@ auto GlobalModuleContext::GetDefaultChannel(ModuleRawPtr channel) -> int { } auto GlobalModuleContext::IsModuleActivated(ModuleIdentifier m_id) -> bool { - return p_->IsModuleActivated(std::move(m_id)); + return p_->IsModuleActivated(m_id); } +auto GlobalModuleContext::IsIntegratedModule(ModuleIdentifier m_id) -> bool { + return p_->IsIntegratedModule(m_id); +} + +auto GlobalModuleContext::ListAllRegisteredModuleID() + -> QList<ModuleIdentifier> { + return p_->ListAllRegisteredModuleID(); +} + +auto GlobalModuleContext::GetModuleListening(ModuleIdentifier module_id) + -> QList<EventIdentifier> { + return p_->GetModuleListening(module_id); +} } // namespace GpgFrontend::Module diff --git a/src/core/module/GlobalModuleContext.h b/src/core/module/GlobalModuleContext.h index 1c971bb5..8942b04d 100644 --- a/src/core/module/GlobalModuleContext.h +++ b/src/core/module/GlobalModuleContext.h @@ -58,6 +58,8 @@ class GPGFRONTEND_CORE_EXPORT GlobalModuleContext : public QObject { ~GlobalModuleContext() override; + auto SearchModule(ModuleIdentifier) -> ModulePtr; + auto GetChannel(ModuleRawPtr) -> int; static auto GetDefaultChannel(ModuleRawPtr) -> int; @@ -68,7 +70,7 @@ class GPGFRONTEND_CORE_EXPORT GlobalModuleContext : public QObject { auto GetGlobalTaskRunner() -> std::optional<TaskRunnerPtr>; - auto RegisterModule(ModulePtr) -> bool; + auto RegisterModule(ModulePtr, bool) -> bool; auto ActiveModule(ModuleIdentifier) -> bool; @@ -76,10 +78,18 @@ class GPGFRONTEND_CORE_EXPORT GlobalModuleContext : public QObject { auto ListenEvent(ModuleIdentifier, EventIdentifier) -> bool; - auto TriggerEvent(EventRefrernce) -> bool; + auto TriggerEvent(EventReference) -> bool; + + auto SearchEvent(EventTriggerIdentifier) -> std::optional<EventReference>; + + auto GetModuleListening(ModuleIdentifier) -> QList<EventIdentifier>; auto IsModuleActivated(ModuleIdentifier) -> bool; + auto IsIntegratedModule(ModuleIdentifier) -> bool; + + auto ListAllRegisteredModuleID() -> QList<ModuleIdentifier>; + private: class Impl; SecureUniquePtr<Impl> p_; diff --git a/src/core/module/GlobalRegisterTable.cpp b/src/core/module/GlobalRegisterTable.cpp index c16eba37..bac51d85 100644 --- a/src/core/module/GlobalRegisterTable.cpp +++ b/src/core/module/GlobalRegisterTable.cpp @@ -31,10 +31,10 @@ #include <any> #include <optional> #include <shared_mutex> -#include <sstream> -#include <unordered_map> +#include <utility> #include <vector> +#include "GlobalRegisterTableTreeModel.h" #include "function/SecureMemoryAllocator.h" #include "utils/MemoryUtils.h" @@ -43,33 +43,45 @@ namespace GpgFrontend::Module { class GlobalRegisterTable::Impl { public: struct RTNode { - std::optional<std::any> value = std::nullopt; - std::unordered_map<QString, SecureUniquePtr<RTNode>> children; + QString name; + QString type = tr("NODE"); int version = 0; - const std::type_info* type = nullptr; + const std::type_info* value_type = nullptr; + std::optional<std::any> value = std::nullopt; + QMap<QString, QSharedPointer<RTNode>> children; + QWeakPointer<RTNode> parent; + + explicit RTNode(QString name, const QSharedPointer<RTNode>& parent) + : name(std::move(name)), parent(parent) {} }; - explicit Impl(GlobalRegisterTable* parent) : parent_(parent) {} + using RTNodePtr = QSharedPointer<RTNode>; + + explicit Impl(GlobalRegisterTable* parent) + : parent_(parent), + root_node_(SecureCreateQSharedObject<RTNode>("", nullptr)) {} auto PublishKV(const Namespace& n, const Key& k, std::any v) -> bool { - QStringList const segments = k.split('.'); + QStringList const segments = (n + "." + k).split('.'); int version = 0; { std::unique_lock lock(lock_); - auto& root_rt_node = - global_register_table_.emplace(n, SecureCreateUniqueObject<RTNode>()) - .first->second; - RTNode* current = root_rt_node.get(); + auto current = root_node_; for (const QString& segment : segments) { - current = current->children - .emplace(segment, SecureCreateUniqueObject<RTNode>()) - .first->second.get(); + auto it = current->children.find(segment); + if (it == current->children.end()) { + it = current->children.insert( + segment, SecureCreateQSharedObject<RTNode>(segment, current)); + } + current = it.value(); } + current->name = segments.back(); + current->type = tr("LEAF"); current->value = v; - current->type = &v.type(); + current->value_type = &v.type(); version = ++current->version; } @@ -78,19 +90,17 @@ class GlobalRegisterTable::Impl { } auto LookupKV(const Namespace& n, const Key& k) -> std::optional<std::any> { - QStringList const segments = k.split('.'); + QStringList const segments = (n + "." + k).split('.'); std::optional<std::any> rtn = std::nullopt; { std::shared_lock const lock(lock_); - auto it = global_register_table_.find(n); - if (it == global_register_table_.end()) return std::nullopt; - RTNode* current = it->second.get(); + auto current = root_node_; for (const QString& segment : segments) { auto it = current->children.find(segment); if (it == current->children.end()) return std::nullopt; - current = it->second.get(); + current = it.value(); } rtn = current->value; } @@ -98,24 +108,20 @@ class GlobalRegisterTable::Impl { } auto ListChildKeys(const Namespace& n, const Key& k) -> std::vector<Key> { - QStringList const segments = k.split('.'); + QStringList const segments = (n + "." + k).split('.'); std::vector<Key> rtn; { std::shared_lock lock(lock_); - auto it = global_register_table_.find(n); - if (it == global_register_table_.end()) return {}; - RTNode* current = it->second.get(); + auto current = root_node_; for (const QString& segment : segments) { auto it = current->children.find(segment); if (it == current->children.end()) return {}; - current = it->second.get(); + current = it.value(); } - for (auto& it : current->children) { - rtn.emplace_back(it.first); - } + for (auto& key : current->children.keys()) rtn.emplace_back(key); } return rtn; } @@ -132,12 +138,149 @@ class GlobalRegisterTable::Impl { }) == nullptr; } + auto RootRTNode() -> RTNode* { return root_node_.get(); } + private: - using Table = std::map<Namespace, SecureUniquePtr<RTNode>>; std::shared_mutex lock_; GlobalRegisterTable* parent_; - Table global_register_table_; + RTNodePtr root_node_; +}; + +class GlobalRegisterTableTreeModel::Impl { + public: + using RTNode = GlobalRegisterTable::Impl::RTNode; + + Impl(GlobalRegisterTableTreeModel* parent, GlobalRegisterTable::Impl* grt) + : parent_(parent), root_node_(grt->RootRTNode()) {} + + [[nodiscard]] auto RowCount(const QModelIndex& parent) const -> int { + auto* parent_node = !parent.isValid() + ? root_node_.get() + : static_cast<RTNode*>(parent.internalPointer()); + return parent_node->children.size(); + } + + [[nodiscard]] auto ColumnCount(const QModelIndex& parent) const -> int { + return 4; + } + + [[nodiscard]] auto Data(const QModelIndex& index, int role) const + -> QVariant { + if (!index.isValid()) return {}; + + if (role == Qt::DisplayRole) { + auto* node = static_cast<RTNode*>(index.internalPointer()); + switch (index.column()) { + case 0: + return node->name; + case 1: + return node->type; + case 2: + return QString(node->value && node->value.has_value() + ? node->value->type().name() + : ""); + case 3: + return Any2QVariant(node->value); + default: + return {}; + } + } + return {}; + } + + static auto Any2QVariant(std::optional<std::any> op) -> QVariant { + if (!op) return tr("<EMPTY>"); + + auto& o = op.value(); + if (o.type() == typeid(QString)) { + return QVariant::fromValue(std::any_cast<QString>(o)); + } + if (o.type() == typeid(std::string)) { + return QVariant::fromValue( + QString::fromStdString(std::any_cast<std::string>(o))); + } + if (o.type() == typeid(int)) { + return QVariant::fromValue(std::any_cast<int>(o)); + } + if (o.type() == typeid(long)) { + return QVariant::fromValue( + static_cast<qlonglong>(std::any_cast<long>(o))); + } + if (o.type() == typeid(long long)) { + return QVariant::fromValue(std::any_cast<long long>(o)); + } + if (o.type() == typeid(unsigned)) { + return QVariant::fromValue(std::any_cast<unsigned>(o)); + } + if (o.type() == typeid(unsigned long)) { + return QVariant::fromValue( + static_cast<qulonglong>(std::any_cast<unsigned long>(o))); + } + if (o.type() == typeid(unsigned long long)) { + return QVariant::fromValue(std::any_cast<unsigned long long>(o)); + } + if (o.type() == typeid(float)) { + return QVariant::fromValue(std::any_cast<float>(o)); + } + if (o.type() == typeid(double)) { + return QVariant::fromValue(std::any_cast<double>(o)); + } + if (o.type() == typeid(bool)) { + return QVariant::fromValue(std::any_cast<bool>(o)); + } + return tr("<UNSUPPORTED>"); + } + + [[nodiscard]] auto Index(int row, int column, const QModelIndex& parent) const + -> QModelIndex { + if (!parent_->hasIndex(row, column, parent)) return {}; + + auto* parent_node = !parent.isValid() + ? root_node_.get() + : static_cast<RTNode*>(parent.internalPointer()); + auto key = parent_node->children.keys().at(row); + auto child_node = parent_node->children.value(key); + return parent_->createIndex(row, column, child_node.get()); + } + + [[nodiscard]] auto Parent(const QModelIndex& index) const -> QModelIndex { + if (!index.isValid()) return {}; + + auto* child_node = static_cast<RTNode*>(index.internalPointer()); + auto parent_node = child_node->parent.lock(); + + if (!parent_node || parent_node == root_node_) return {}; + + int const row = static_cast<int>( + parent_node->parent.lock()->children.keys().indexOf(parent_node->name)); + return parent_->createIndex(row, 0, parent_node.data()); + } + + [[nodiscard]] static auto HeaderData(int section, Qt::Orientation orientation, + int role) -> QVariant { + if (role != Qt::DisplayRole) return {}; + + if (orientation == Qt::Horizontal) { + switch (section) { + case 0: + return tr("Key"); + case 1: + return tr("Type"); + case 2: + return tr("Value Type"); + case 3: + return tr("Value"); + default: + return {}; + } + } + return {}; + } + + private: + GlobalRegisterTableTreeModel* parent_; + GlobalRegisterTable::Impl::RTNodePtr root_node_; }; GlobalRegisterTable::GlobalRegisterTable() @@ -164,4 +307,39 @@ auto GlobalRegisterTable::ListChildKeys(Namespace n, Key k) return p_->ListChildKeys(n, k); } +GlobalRegisterTableTreeModel::GlobalRegisterTableTreeModel( + GlobalRegisterTable* grt) + : p_(SecureCreateUniqueObject<Impl>(this, grt->p_.get())) {} + +auto GlobalRegisterTableTreeModel::rowCount(const QModelIndex& parent) const + -> int { + return p_->RowCount(parent); +} + +auto GlobalRegisterTableTreeModel::columnCount(const QModelIndex& parent) const + -> int { + return p_->ColumnCount(parent); +} + +auto GlobalRegisterTableTreeModel::data(const QModelIndex& index, + int role) const -> QVariant { + return p_->Data(index, role); +} + +auto GlobalRegisterTableTreeModel::index(int row, int column, + const QModelIndex& parent) const + -> QModelIndex { + return p_->Index(row, column, parent); +} + +auto GlobalRegisterTableTreeModel::parent(const QModelIndex& index) const + -> QModelIndex { + return p_->Parent(index); +} + +auto GlobalRegisterTableTreeModel::headerData(int section, + Qt::Orientation orientation, + int role) const -> QVariant { + return p_->HeaderData(section, orientation, role); +} } // namespace GpgFrontend::Module
\ No newline at end of file diff --git a/src/core/module/GlobalRegisterTable.h b/src/core/module/GlobalRegisterTable.h index db68c888..1d3e43da 100644 --- a/src/core/module/GlobalRegisterTable.h +++ b/src/core/module/GlobalRegisterTable.h @@ -32,7 +32,7 @@ #include <functional> #include <optional> -#include "function/SecureMemoryAllocator.h" +#include "core/function/SecureMemoryAllocator.h" namespace GpgFrontend::Module { @@ -43,6 +43,8 @@ using LPCallback = std::function<void(Namespace, Key, int, std::any)>; class GlobalRegisterTable : public QObject { Q_OBJECT public: + friend class GlobalRegisterTableTreeModel; + GlobalRegisterTable(); ~GlobalRegisterTable() override; diff --git a/src/core/module/GlobalRegisterTableTreeModel.h b/src/core/module/GlobalRegisterTableTreeModel.h new file mode 100644 index 00000000..fe4242a2 --- /dev/null +++ b/src/core/module/GlobalRegisterTableTreeModel.h @@ -0,0 +1,61 @@ +/** + * Copyright (C) 2021 Saturneric <[email protected]> + * + * 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. + * + * GpgFrontend 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 GpgFrontend. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from + * the gpg4usb project, which is under GPL-3.0-or-later. + * + * All the source code of GpgFrontend was modified and released by + * Saturneric <[email protected]> starting on May 12, 2021. + * + * SPDX-License-Identifier: GPL-3.0-or-later + * + */ + +#pragma once + +#include "core/module/GlobalRegisterTable.h" + +namespace GpgFrontend::Module { +class GPGFRONTEND_CORE_EXPORT GlobalRegisterTableTreeModel + : public QAbstractItemModel { + public: + explicit GlobalRegisterTableTreeModel(GlobalRegisterTable *grt); + + [[nodiscard]] auto rowCount(const QModelIndex &parent) const -> int override; + + [[nodiscard]] auto columnCount(const QModelIndex &parent) const + -> int override; + + [[nodiscard]] auto data(const QModelIndex &index, int role) const + -> QVariant override; + + [[nodiscard]] auto index(int row, int column, const QModelIndex &parent) const + -> QModelIndex override; + + [[nodiscard]] auto parent(const QModelIndex &index) const + -> QModelIndex override; + + [[nodiscard]] auto headerData(int section, Qt::Orientation orientation, + int role) const -> QVariant override; + + private: + class Impl; + SecureUniquePtr<Impl> p_; +}; + +}; // namespace GpgFrontend::Module
\ No newline at end of file diff --git a/src/core/module/Module.cpp b/src/core/module/Module.cpp index 9076dc2c..9c875fce 100644 --- a/src/core/module/Module.cpp +++ b/src/core/module/Module.cpp @@ -29,6 +29,10 @@ #include "Module.h" #include "core/module/GlobalModuleContext.h" +#include "core/utils/CommonUtils.h" +#include "core/utils/IOUtils.h" +#include "module/sdk/GFSDKModule.h" +#include "utils/BuildInfoUtils.h" namespace GpgFrontend::Module { @@ -43,7 +47,127 @@ class Module::Impl { : m_ptr_(m_ptr), identifier_(std::move(id)), version_(std::move(version)), - meta_data_(std::move(meta_data)) {} + meta_data_(std::move(meta_data)), + good_(true) {} + + Impl(ModuleRawPtr m_ptr, QLibrary& module_library) + : m_ptr_(m_ptr), + module_hash_(CalculateBinaryChacksum(module_library.fileName())), + module_library_path_(module_library.fileName()), + good_(false) { + for (auto& required_symbol : module_required_symbols_) { + *required_symbol.pointer = + reinterpret_cast<void*>(module_library.resolve(required_symbol.name)); + if (*required_symbol.pointer == nullptr) { + GF_CORE_LOG_WARN( + "illegal module: {}, reason: cannot load symbol: {}, abort...", + module_library.fileName(), required_symbol.name); + return; + } + } + + identifier_ = GFUnStrDup(get_id_api_()); + version_ = GFUnStrDup(get_version_api_()); + gf_sdk_ver_ = GFUnStrDup(get_sdk_ver_api_()); + qt_env_ver_ = GFUnStrDup(get_qt_ver_api_()); + + if (!module_identifier_regex_exp_.match(identifier_).hasMatch()) { + GF_CORE_LOG_WARN( + "illegal module: {}, reasson invalid module id, abort...", + identifier_); + return; + } + + if (!module_version_regex_exp_.match(version_).hasMatch()) { + GF_CORE_LOG_WARN( + "illegal module: {}, reasson invalid version: {}, abort...", + identifier_, version_); + return; + } + + if (!module_version_regex_exp_.match(gf_sdk_ver_).hasMatch()) { + GF_CORE_LOG_WARN( + "illegal module: {}, reasson invalid sdk version: {}, abort...", + identifier_, gf_sdk_ver_); + return; + } + + if (GFCompareSoftwareVersion(gf_sdk_ver_, GetProjectVersion()) > 0) { + GF_CORE_LOG_WARN( + "uncompatible module: {}, sdk version: {} greater than " + "current sdk version: {}, abort...", + identifier_, gf_sdk_ver_, GetProjectVersion()); + return; + } + + auto qt_env_ver_regex_match = module_version_regex_exp_.match(qt_env_ver_); + if (!qt_env_ver_regex_match.hasMatch()) { + GF_CORE_LOG_WARN( + "illegal module: {}, reasson invalid qt env version: {}, abort...", + identifier_, qt_env_ver_); + return; + } + + auto qt_env_ver_major = qt_env_ver_regex_match.captured(1); + auto qt_env_ver_minor = qt_env_ver_regex_match.captured(2); + + if (qt_env_ver_major != QString::number(QT_VERSION_MAJOR) + "." || + qt_env_ver_minor != QString::number(QT_VERSION_MINOR) + ".") { + GF_CORE_LOG_WARN( + "uncompatible module: {}, qt version: {} is not binary uncompatible " + "with application's qt env version: {}, abort...", + identifier_, qt_env_ver_, QString::fromUtf8(QT_VERSION_STR)); + return; + } + + GF_CORE_LOG_INFO( + "module loaded, id: {}, version: {}, " + "sdk version: {}, qt env version: {}, hash: {}, path: {}", + identifier_, version_, gf_sdk_ver_, qt_env_ver_, module_hash_, + module_library_path_); + + ::GFModuleMetaData* p_meta_data = get_metadata_api_(); + + while (p_meta_data != nullptr) { + ::GFModuleMetaData* l_meta_data; + meta_data_[QString::fromUtf8(p_meta_data->key)] = + QString::fromUtf8(p_meta_data->value); + l_meta_data = p_meta_data; + p_meta_data = p_meta_data->next; + SecureFree(l_meta_data); + } + + good_ = true; + } + + [[nodiscard]] auto IsGood() const -> bool { return good_; } + + auto Register() -> int { + if (good_ && register_api_ != nullptr) return register_api_(); + return -1; + } + + auto Active() -> int { + if (good_ && activate_api_ != nullptr) return activate_api_(); + return -1; + } + + auto Exec(const EventReference& event) -> int { + if (good_ && execute_api_ != nullptr) { + return execute_api_(event->ToModuleEvent()); + } + return -1; + } + + auto Deactive() -> int { + if (good_ && deactivate_api_ != nullptr) return deactivate_api_(); + return -1; + } + + auto UnRegister() -> int { + if (good_ && unregister_api_ != nullptr) return unregister_api_(); + return -1; + } auto GetChannel() -> int { return get_gpc()->GetChannel(m_ptr_); } @@ -63,14 +187,77 @@ class Module::Impl { return identifier_; } + [[nodiscard]] auto GetModuleVersion() const -> ModuleVersion { + return version_; + } + + [[nodiscard]] auto GetModuleSDKVersion() const -> QString { + return gf_sdk_ver_; + } + + [[nodiscard]] auto GetModuleQtEnvVersion() const -> QString { + return qt_env_ver_; + } + + [[nodiscard]] auto GetModuleMetaData() const -> ModuleMetaData { + return meta_data_; + } + + [[nodiscard]] auto GetModulePath() const -> QString { + return module_library_path_; + } + + [[nodiscard]] auto GetModuleHash() const -> QString { return module_hash_; } + void SetGPC(GlobalModuleContext* gpc) { gpc_ = gpc; } private: GlobalModuleContext* gpc_{}; Module* m_ptr_; - const ModuleIdentifier identifier_; - const ModuleVersion version_; - const ModuleMetaData meta_data_; + ModuleIdentifier identifier_; + ModuleVersion version_; + ModuleMetaData meta_data_; + QString module_hash_; + QString module_library_path_; + QString gf_sdk_ver_; + QString qt_env_ver_; + + QRegularExpression module_identifier_regex_exp_ = QRegularExpression( + R"(^([A-Za-z]{1}[A-Za-z\d_]*\.)+[A-Za-z][A-Za-z\d_]*$)"); + QRegularExpression module_version_regex_exp_ = + QRegularExpression(R"(^(\d+\.)?(\d+\.)?(\*|\d+)$)"); + + bool good_; + + GFModuleAPIGetModuleGFSDKVersion get_sdk_ver_api_; + GFModuleAPIGetModuleQtEnvVersion get_qt_ver_api_; + + GFModuleAPIGetModuleID get_id_api_; + GFModuleAPIGetModuleVersion get_version_api_; + GFModuleAPIGetModuleMetaData get_metadata_api_; + GFModuleAPIRegisterModule register_api_; + GFModuleAPIActivateModule activate_api_; + GFModuleAPIExecuteModule execute_api_; + GFModuleAPIDeactivateModule deactivate_api_; + GFModuleAPIUnregisterModule unregister_api_; + + struct Symbol { + const char* name; + void** pointer; + }; + + QList<Symbol> module_required_symbols_ = { + {"GFGetModuleGFSDKVersion", reinterpret_cast<void**>(&get_sdk_ver_api_)}, + {"GFGetModuleQtEnvVersion", reinterpret_cast<void**>(&get_qt_ver_api_)}, + {"GFGetModuleID", reinterpret_cast<void**>(&get_id_api_)}, + {"GFGetModuleVersion", reinterpret_cast<void**>(&get_version_api_)}, + {"GFGetModuleMetaData", reinterpret_cast<void**>(&get_metadata_api_)}, + {"GFRegisterModule", reinterpret_cast<void**>(®ister_api_)}, + {"GFActiveModule", reinterpret_cast<void**>(&activate_api_)}, + {"GFExecuteModule", reinterpret_cast<void**>(&execute_api_)}, + {"GFDeactiveModule", reinterpret_cast<void**>(&deactivate_api_)}, + {"GFUnregisterModule", reinterpret_cast<void**>(&unregister_api_)}, + }; auto get_gpc() -> GlobalModuleContext* { if (gpc_ == nullptr) { @@ -84,8 +271,25 @@ Module::Module(ModuleIdentifier id, ModuleVersion version, const ModuleMetaData& meta_data) : p_(SecureCreateUniqueObject<Impl>(this, id, version, meta_data)) {} +Module::Module(QLibrary& module_library) + : p_(SecureCreateUniqueObject<Impl>(this, module_library)) {} + Module::~Module() = default; +auto Module::IsGood() -> bool { return p_->IsGood(); } + +auto Module::Register() -> int { return p_->Register(); } + +auto Module::Active() -> int { return p_->Active(); } + +auto Module::Exec(EventReference event) -> int { + return p_->Exec(std::move(event)); +} + +auto Module::Deactive() -> int { return p_->Deactive(); } + +auto Module::UnRegister() -> int { return p_->UnRegister(); } + auto Module::getChannel() -> int { return p_->GetChannel(); } auto Module::getDefaultChannel() -> int { return p_->GetDefaultChannel(); } @@ -102,5 +306,29 @@ auto Module::GetModuleIdentifier() const -> ModuleIdentifier { return p_->GetModuleIdentifier(); } +[[nodiscard]] auto Module::GetModuleVersion() const -> ModuleVersion { + return p_->GetModuleVersion(); +} + +[[nodiscard]] auto Module::GetModuleMetaData() const -> ModuleMetaData { + return p_->GetModuleMetaData(); +} + +[[nodiscard]] auto Module::GetModulePath() const -> QString { + return p_->GetModulePath(); +} + +[[nodiscard]] auto Module::GetModuleHash() const -> QString { + return p_->GetModuleHash(); +} + +[[nodiscard]] auto Module::GetModuleSDKVersion() const -> QString { + return p_->GetModuleSDKVersion(); +} + +[[nodiscard]] auto Module::GetModuleQtEnvVersion() const -> QString { + return p_->GetModuleQtEnvVersion(); +} + void Module::SetGPC(GlobalModuleContext* gpc) { p_->SetGPC(gpc); } } // namespace GpgFrontend::Module
\ No newline at end of file diff --git a/src/core/module/Module.h b/src/core/module/Module.h index 2a5b54e7..c332d455 100644 --- a/src/core/module/Module.h +++ b/src/core/module/Module.h @@ -39,7 +39,7 @@ class ModuleManager; using ModuleIdentifier = QString; using ModuleVersion = QString; -using ModuleMetaData = std::map<QString, QString>; +using ModuleMetaData = QMap<QString, QString>; using ModulePtr = std::shared_ptr<Module>; using TaskRunnerPtr = std::shared_ptr<Thread::TaskRunner>; @@ -47,21 +47,39 @@ using TaskRunnerPtr = std::shared_ptr<Thread::TaskRunner>; class GPGFRONTEND_CORE_EXPORT Module : public QObject { Q_OBJECT public: - Module(ModuleIdentifier, ModuleVersion, const ModuleMetaData&); + Module(ModuleIdentifier, ModuleVersion, const ModuleMetaData &); + + explicit Module(QLibrary &module_library); ~Module(); - virtual auto Register() -> bool = 0; + auto IsGood() -> bool; + + virtual auto Register() -> int; + + virtual auto Active() -> int; - virtual auto Active() -> bool = 0; + virtual auto Exec(EventReference) -> int; - virtual auto Exec(EventRefrernce) -> int = 0; + virtual auto Deactive() -> int; - virtual auto Deactive() -> bool = 0; + virtual auto UnRegister() -> int; [[nodiscard]] auto GetModuleIdentifier() const -> ModuleIdentifier; - void SetGPC(GlobalModuleContext*); + [[nodiscard]] auto GetModuleVersion() const -> ModuleVersion; + + [[nodiscard]] auto GetModuleMetaData() const -> ModuleMetaData; + + [[nodiscard]] auto GetModulePath() const -> QString; + + [[nodiscard]] auto GetModuleHash() const -> QString; + + [[nodiscard]] auto GetModuleSDKVersion() const -> QString; + + [[nodiscard]] auto GetModuleQtEnvVersion() const -> QString; + + void SetGPC(GlobalModuleContext *); protected: auto getChannel() -> int; diff --git a/src/core/module/ModuleInit.cpp b/src/core/module/ModuleInit.cpp new file mode 100644 index 00000000..ceb5987e --- /dev/null +++ b/src/core/module/ModuleInit.cpp @@ -0,0 +1,117 @@ +/** + * Copyright (C) 2021 Saturneric <[email protected]> + * + * 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. + * + * GpgFrontend 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 GpgFrontend. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from + * the gpg4usb project, which is under GPL-3.0-or-later. + * + * All the source code of GpgFrontend was modified and released by + * Saturneric <[email protected]> starting on May 12, 2021. + * + * SPDX-License-Identifier: GPL-3.0-or-later + * + */ + +#include "ModuleInit.h" + +#include <QCoreApplication> +#include <QDir> + +#include "core/function/GlobalSettingStation.h" +#include "core/module/ModuleManager.h" +#include "core/thread/Task.h" +#include "core/thread/TaskRunnerGetter.h" + +namespace GpgFrontend::Module { + +void LoadModuleFromPath(const QString& mods_path, bool integrated) { + for (const auto& module_library_name : + QDir(mods_path).entryList(QStringList() << "*.so" + << "*.dll" + << "*.dylib", + QDir::Files)) { + ModuleManager::GetInstance().LoadModule( + mods_path + "/" + module_library_name, integrated); + } +} + +auto LoadIntegratedMods() -> bool { + auto exec_binary_path = QCoreApplication::applicationDirPath(); + +#if defined(MACOS) && defined(RELEASE) + // App Bundle + auto mods_path = exec_binary_path + "/../PlugIns/mods"; +#else + // Debug Or Windows Platform + auto mods_path = exec_binary_path + "/mods"; +#endif + + // AppImage + if (!qEnvironmentVariable("APPIMAGE").isEmpty()) { + mods_path = qEnvironmentVariable("APPDIR") + "/usr/plugins/mods"; + } + + // Flatpak + if (!qEnvironmentVariable("container").isEmpty()) { + mods_path = "/app/lib/mods"; + } + + GF_CORE_LOG_DEBUG("try loading integrated modules at path: {} ...", + mods_path); + if (!QDir(mods_path).exists()) { + GF_CORE_LOG_WARN( + "integrated module directory at path {} not found, abort...", + mods_path); + return false; + } + + LoadModuleFromPath(mods_path, true); + + GF_CORE_LOG_DEBUG("load integrated modules done."); + return true; +} + +auto LoadExternalMods() -> bool { + auto mods_path = + GpgFrontend::GlobalSettingStation::GetInstance().GetModulesDir(); + + GF_CORE_LOG_DEBUG("try loading external modules at path: {} ...", mods_path); + if (!QDir(mods_path).exists()) { + GF_CORE_LOG_WARN("external module directory at path {} not found, abort...", + mods_path); + return false; + } + + LoadModuleFromPath(mods_path, false); + + GF_CORE_LOG_DEBUG("load integrated modules done."); + return true; +} + +void LoadGpgFrontendModules(ModuleInitArgs) { + // must init at default thread before core + Thread::TaskRunnerGetter::GetInstance().GetTaskRunner()->PostTask( + new Thread::Task( + [](const DataObjectPtr&) -> int { + return LoadIntegratedMods() && LoadExternalMods() ? 0 : -1; + }, + "modules_system_init_task")); +} + +void ShutdownGpgFrontendModules() {} + +} // namespace GpgFrontend::Module
\ No newline at end of file diff --git a/src/module/GpgFrontendModuleInit.h b/src/core/module/ModuleInit.h index a3a8bbd3..e7e86f0f 100644 --- a/src/module/GpgFrontendModuleInit.h +++ b/src/core/module/ModuleInit.h @@ -28,7 +28,9 @@ #pragma once -#include "module/GpgFrontendModule.h" +#include <spdlog/spdlog.h> + +#include "core/GpgFrontendCoreExport.h" namespace GpgFrontend::Module { @@ -40,12 +42,12 @@ struct ModuleInitArgs { * @brief init the module library * */ -void GPGFRONTEND_MODULE_EXPORT LoadGpgFrontendModules(ModuleInitArgs args); +void GPGFRONTEND_CORE_EXPORT LoadGpgFrontendModules(ModuleInitArgs args); /** * @brief shutdown the module library * */ -void GPGFRONTEND_MODULE_EXPORT ShutdownGpgFrontendModules(); +void GPGFRONTEND_CORE_EXPORT ShutdownGpgFrontendModules(); }; // namespace GpgFrontend::Module diff --git a/src/core/module/ModuleManager.cpp b/src/core/module/ModuleManager.cpp index 83e7c1ff..d07ca989 100644 --- a/src/core/module/ModuleManager.cpp +++ b/src/core/module/ModuleManager.cpp @@ -29,16 +29,18 @@ #include "ModuleManager.h" #include <memory> +#include <utility> -#include "GpgConstants.h" +#include "core/function/SecureMemoryAllocator.h" +#include "core/function/basic/GpgFunctionObject.h" +#include "core/model/SettingsObject.h" #include "core/module/GlobalModuleContext.h" #include "core/module/GlobalRegisterTable.h" #include "core/module/Module.h" +#include "core/struct/settings_object/ModuleSO.h" #include "core/thread/Task.h" -#include "function/SecureMemoryAllocator.h" -#include "function/basic/GpgFunctionObject.h" -#include "thread/TaskRunnerGetter.h" -#include "utils/MemoryUtils.h" +#include "core/thread/TaskRunnerGetter.h" +#include "core/utils/MemoryUtils.h" namespace GpgFrontend::Module { @@ -50,19 +52,95 @@ class ModuleManager::Impl { ~Impl() = default; + auto LoadAndRegisterModule(const QString& module_library_path, + bool integrated_module) -> void { + Thread::TaskRunnerGetter::GetInstance() + .GetTaskRunner(Thread::TaskRunnerGetter::kTaskRunnerType_Default) + ->PostTask(new Thread::Task( + [=](GpgFrontend::DataObjectPtr) -> int { + QLibrary module_library(module_library_path); + if (!module_library.load()) { + GF_CORE_LOG_WARN( + "module manager failed to load module, " + "reason: broken library: {} ", + module_library.fileName()); + return -1; + } + + auto module = SecureCreateSharedObject<Module>(module_library); + if (!module->IsGood()) { + GF_CORE_LOG_WARN( + "module manager failed to load module, " + "reason: illegal module: {}", + module_library.fileName()); + return -1; + } + + module->SetGPC(gmc_.get()); + if (!gmc_->RegisterModule(module, integrated_module)) return -1; + + const auto module_id = module->GetModuleIdentifier(); + const auto module_hash = module->GetModuleHash(); + + SettingsObject so(QString("module.%1.so").arg(module_id)); + ModuleSO module_so(so); + + // reset module settings if necessary + if (module_so.module_id != module_id || + module_so.module_hash != module_hash) { + module_so.module_id = module_id; + module_so.module_hash = module_hash; + // auto active integrated module by default + module_so.auto_activate = integrated_module; + module_so.set_by_user = false; + + so.Store(module_so.ToJson()); + } + + // if this module need auto active + if (module_so.auto_activate) { + if (!gmc_->ActiveModule(module_id)) { + return -1; + } + } + + return 0; + }, + __func__, nullptr)); + } + + auto SearchModule(ModuleIdentifier module_id) -> ModulePtr { + return gmc_->SearchModule(std::move(module_id)); + } + + auto ListAllRegisteredModuleID() -> QList<ModuleIdentifier> { + return gmc_->ListAllRegisteredModuleID(); + } + void RegisterModule(const ModulePtr& module) { Thread::TaskRunnerGetter::GetInstance() .GetTaskRunner(Thread::TaskRunnerGetter::kTaskRunnerType_Default) ->PostTask(new Thread::Task( [=](GpgFrontend::DataObjectPtr) -> int { module->SetGPC(gmc_.get()); - gmc_->RegisterModule(module); + return gmc_->RegisterModule(module, false) ? 0 : -1; + }, + __func__, nullptr)); + } + + void ListenEvent(const ModuleIdentifier& module_id, + const EventIdentifier& event_id) { + Thread::TaskRunnerGetter::GetInstance() + .GetTaskRunner(Thread::TaskRunnerGetter::kTaskRunnerType_Default) + ->PostTask(new Thread::Task( + [=](const GpgFrontend::DataObjectPtr&) -> int { + gmc_->ListenEvent(module_id, event_id); return 0; }, __func__, nullptr)); } - void TriggerEvent(const EventRefrernce& event) { + void TriggerEvent(const EventReference& event) { Thread::TaskRunnerGetter::GetInstance() .GetTaskRunner(Thread::TaskRunnerGetter::kTaskRunnerType_Default) ->PostTask(new Thread::Task( @@ -73,6 +151,16 @@ class ModuleManager::Impl { __func__, nullptr)); } + auto SearchEvent(EventTriggerIdentifier trigger_id) + -> std::optional<EventReference> { + return gmc_->SearchEvent(std::move(trigger_id)); + } + + auto GetModuleListening(ModuleIdentifier module_id) + -> QList<EventIdentifier> { + return gmc_->GetModuleListening(std::move(module_id)); + } + void ActiveModule(const ModuleIdentifier& identifier) { Thread::TaskRunnerGetter::GetInstance() .GetTaskRunner(Thread::TaskRunnerGetter::kTaskRunnerType_Default) @@ -84,6 +172,17 @@ class ModuleManager::Impl { __func__, nullptr)); } + void DeactiveModule(const ModuleIdentifier& identifier) { + Thread::TaskRunnerGetter::GetInstance() + .GetTaskRunner(Thread::TaskRunnerGetter::kTaskRunnerType_Default) + ->PostTask(new Thread::Task( + [=](const GpgFrontend::DataObjectPtr&) -> int { + gmc_->DeactivateModule(identifier); + return 0; + }, + __func__, nullptr)); + } + auto GetTaskRunner(ModuleIdentifier module_id) -> std::optional<TaskRunnerPtr> { return gmc_->GetTaskRunner(std::move(module_id)); @@ -109,13 +208,20 @@ class ModuleManager::Impl { return gmc_->IsModuleActivated(id); } + auto IsIntegratedModule(ModuleIdentifier id) -> bool { + return gmc_->IsIntegratedModule(id); + } + + auto GRT() -> GlobalRegisterTable* { return grt_.get(); } + private: static ModuleMangerPtr global_module_manager; SecureUniquePtr<GlobalModuleContext> gmc_; SecureUniquePtr<GlobalRegisterTable> grt_; + QList<QLibrary> module_libraries_; }; -auto IsModuleAcivate(ModuleIdentifier id) -> bool { +auto IsModuleActivate(ModuleIdentifier id) -> bool { return ModuleManager::GetInstance().IsModuleActivated(id); } @@ -141,18 +247,46 @@ ModuleManager::ModuleManager(int channel) ModuleManager::~ModuleManager() = default; +void ModuleManager::LoadModule(QString module_library_path, + bool integrated_module) { + return p_->LoadAndRegisterModule(module_library_path, integrated_module); +} + +auto ModuleManager::SearchModule(ModuleIdentifier module_id) -> ModulePtr { + return p_->SearchModule(std::move(module_id)); +} + void ModuleManager::RegisterModule(ModulePtr module) { return p_->RegisterModule(module); } -void ModuleManager::TriggerEvent(EventRefrernce event) { +void ModuleManager::ListenEvent(ModuleIdentifier module, + EventIdentifier event) { + return p_->ListenEvent(module, event); +} + +auto ModuleManager::GetModuleListening(ModuleIdentifier module_id) + -> QList<EventIdentifier> { + return p_->GetModuleListening(module_id); +} + +void ModuleManager::TriggerEvent(EventReference event) { return p_->TriggerEvent(event); } +auto ModuleManager::SearchEvent(EventTriggerIdentifier trigger_id) + -> std::optional<EventReference> { + return p_->SearchEvent(std::move(trigger_id)); +} + void ModuleManager::ActiveModule(ModuleIdentifier id) { return p_->ActiveModule(id); } +void ModuleManager::DeactiveModule(ModuleIdentifier id) { + return p_->DeactiveModule(id); +} + auto ModuleManager::GetTaskRunner(ModuleIdentifier id) -> std::optional<TaskRunnerPtr> { return p_->GetTaskRunner(std::move(id)); @@ -181,4 +315,14 @@ auto ModuleManager::IsModuleActivated(ModuleIdentifier id) -> bool { return p_->IsModuleActivated(id); } +auto ModuleManager::IsIntegratedModule(ModuleIdentifier id) -> bool { + return p_->IsIntegratedModule(id); +} + +auto ModuleManager::ListAllRegisteredModuleID() -> QList<ModuleIdentifier> { + return p_->ListAllRegisteredModuleID(); +}; + +auto ModuleManager::GRT() -> GlobalRegisterTable* { return p_->GRT(); } + } // namespace GpgFrontend::Module
\ No newline at end of file diff --git a/src/core/module/ModuleManager.h b/src/core/module/ModuleManager.h index 93b89e95..ea2d88cb 100644 --- a/src/core/module/ModuleManager.h +++ b/src/core/module/ModuleManager.h @@ -48,8 +48,9 @@ class Event; class Module; class GlobalModuleContext; class ModuleManager; +class GlobalRegisterTable; -using EventRefrernce = std::shared_ptr<Event>; +using EventReference = std::shared_ptr<Event>; using ModuleIdentifier = QString; using ModulePtr = std::shared_ptr<Module>; using ModuleMangerPtr = std::shared_ptr<ModuleManager>; @@ -65,11 +66,25 @@ class GPGFRONTEND_CORE_EXPORT ModuleManager virtual ~ModuleManager() override; + auto LoadModule(QString, bool) -> void; + + auto SearchModule(ModuleIdentifier) -> ModulePtr; + + auto ListAllRegisteredModuleID() -> QList<ModuleIdentifier>; + void RegisterModule(ModulePtr); auto IsModuleActivated(ModuleIdentifier) -> bool; - void TriggerEvent(EventRefrernce); + auto IsIntegratedModule(ModuleIdentifier) -> bool; + + void ListenEvent(ModuleIdentifier, EventIdentifier); + + void TriggerEvent(EventReference); + + auto SearchEvent(EventTriggerIdentifier) -> std::optional<EventReference>; + + auto GetModuleListening(ModuleIdentifier) -> QList<EventIdentifier>; void ActiveModule(ModuleIdentifier); @@ -85,6 +100,8 @@ class GPGFRONTEND_CORE_EXPORT ModuleManager auto ListRTChildKeys(const QString&, const QString&) -> std::vector<Key>; + auto GRT() -> GlobalRegisterTable*; + private: class Impl; SecureUniquePtr<Impl> p_; @@ -118,7 +135,7 @@ void TriggerEvent(const EventIdentifier& event_id, Args&&... args, * @return true * @return false */ -auto GPGFRONTEND_CORE_EXPORT IsModuleAcivate(ModuleIdentifier) -> bool; +auto GPGFRONTEND_CORE_EXPORT IsModuleActivate(ModuleIdentifier) -> bool; /** * @brief diff --git a/src/core/struct/settings_object/ModuleSO.h b/src/core/struct/settings_object/ModuleSO.h new file mode 100644 index 00000000..b0139b1f --- /dev/null +++ b/src/core/struct/settings_object/ModuleSO.h @@ -0,0 +1,74 @@ +/** + * Copyright (C) 2021 Saturneric <[email protected]> + * + * 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. + * + * GpgFrontend 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 GpgFrontend. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from + * the gpg4usb project, which is under GPL-3.0-or-later. + * + * All the source code of GpgFrontend was modified and released by + * Saturneric <[email protected]> starting on May 12, 2021. + * + * SPDX-License-Identifier: GPL-3.0-or-later + * + */ + +#pragma once + +namespace GpgFrontend { + +struct ModuleSO { + QString module_id; + QString module_version; + QString module_hash; + bool auto_activate; + bool set_by_user; + + ModuleSO() = default; + + explicit ModuleSO(const QJsonObject& j) { + if (const auto v = j["module_id"]; v.isString()) { + module_id = v.toString(); + } + + if (const auto v = j["module_version"]; v.isString()) { + module_version = v.toString(); + } + + if (const auto v = j["module_hash"]; v.isString()) { + module_hash = v.toString(); + } + + if (const auto v = j["auto_activate"]; v.isBool()) { + auto_activate = v.toBool(); + } + + if (const auto v = j["set_by_user"]; v.isBool()) { + set_by_user = v.toBool(); + } + } + + [[nodiscard]] auto ToJson() const -> QJsonObject { + QJsonObject j; + j["module_id"] = module_id; + j["module_version"] = module_version; + j["module_hash"] = module_hash; + j["auto_activate"] = auto_activate; + j["set_by_user"] = set_by_user; + return j; + } +}; +} // namespace GpgFrontend
\ No newline at end of file diff --git a/src/core/thread/TaskRunner.h b/src/core/thread/TaskRunner.h index 8a93ad0b..fe1555ec 100644 --- a/src/core/thread/TaskRunner.h +++ b/src/core/thread/TaskRunner.h @@ -76,8 +76,6 @@ class GPGFRONTEND_CORE_EXPORT TaskRunner : public QObject { */ auto IsRunning() -> bool; - public slots: - /** * @brief * diff --git a/src/core/typedef/GpgTypedef.h b/src/core/typedef/GpgTypedef.h index cf0887bf..599c5c59 100644 --- a/src/core/typedef/GpgTypedef.h +++ b/src/core/typedef/GpgTypedef.h @@ -28,7 +28,7 @@ #pragma once -#include <tuple> +#include <gpgme.h> #include "core/model/DataObject.h" diff --git a/src/core/utils/AsyncUtils.cpp b/src/core/utils/AsyncUtils.cpp index 9ce94247..3c007fb6 100644 --- a/src/core/utils/AsyncUtils.cpp +++ b/src/core/utils/AsyncUtils.cpp @@ -45,7 +45,7 @@ auto RunGpgOperaAsync(const GpgOperaRunnable& runnable, GF_CORE_LOG_DEBUG("got gnupg version from rt: {}, operation: {}", gnupg_version, operation); - if (CompareSoftwareVersion(gnupg_version, minial_version) < 0) { + if (GFCompareSoftwareVersion(gnupg_version, minial_version) < 0) { GF_CORE_LOG_ERROR("operaton {} not support for gnupg version: {}", operation, gnupg_version); callback(GPG_ERR_NOT_SUPPORTED, TransferParams()); @@ -85,7 +85,7 @@ auto RunGpgOperaSync(const GpgOperaRunnable& runnable, const QString& operation, GF_CORE_LOG_DEBUG("got gnupg version from rt: {}, operation: {}", gnupg_version, operation); - if (CompareSoftwareVersion(gnupg_version, minial_version) < 0) { + if (GFCompareSoftwareVersion(gnupg_version, minial_version) < 0) { GF_CORE_LOG_ERROR("operaton {} not support for gnupg version: {}", operation, gnupg_version); return {GPG_ERR_NOT_SUPPORTED, TransferParams()}; diff --git a/src/core/utils/BuildInfoUtils.cpp b/src/core/utils/BuildInfoUtils.cpp new file mode 100644 index 00000000..a7d914ef --- /dev/null +++ b/src/core/utils/BuildInfoUtils.cpp @@ -0,0 +1,26 @@ + +#include "BuildInfoUtils.h" + +#include "GpgFrontendBuildInfo.h" + +namespace GpgFrontend { + +auto GetProjectVersion() -> QString { + return QString("v") + VERSION_MAJOR + "." + VERSION_MINOR + "." + + VERSION_PATCH; +} + +auto GetProjectBuildVersion() -> QString { return BUILD_VERSION; } + +auto GetProjectBuildTimestamp() -> QDateTime { + return QDateTime::fromString(BUILD_TIMESTAMP, Qt::ISODate); +} + +auto GetProjectBuildGitBranchName() -> QString { return GIT_BRANCH_NAME; } + +auto GetProjectBuildGitCommitHash() -> QString { return GIT_COMMIT_HASH; } + +auto GetProjectBuildGitVersion() -> QString { return GIT_VERSION; } + +auto GetHttpRequestUserAgent() -> QString { return HTTP_REQUEST_USER_AGENT; } +}; // namespace GpgFrontend
\ No newline at end of file diff --git a/src/module/integrated/version_checking_module/VersionCheckingModule.h b/src/core/utils/BuildInfoUtils.h index 0730feed..07b0bb21 100644 --- a/src/module/integrated/version_checking_module/VersionCheckingModule.h +++ b/src/core/utils/BuildInfoUtils.h @@ -28,34 +28,57 @@ #pragma once -#include "GpgFrontendModuleExport.h" -#include "SoftwareVersion.h" -#include "core/module/Module.h" +#include "core/GpgFrontendCoreExport.h" -namespace GpgFrontend::Module::Integrated::VersionCheckingModule { +namespace GpgFrontend { -class GPGFRONTEND_INTEGRATED_MODULE_VERSION_CHECKING_EXPORT - VersionCheckingModule : public Module { - Q_OBJECT - public: - VersionCheckingModule(); - - ~VersionCheckingModule() override; - - auto Register() -> bool override; +/** + * @brief + * + * @return QString + */ +auto GPGFRONTEND_CORE_EXPORT GetProjectVersion() -> QString; - auto Active() -> bool override; +/** + * @brief + * + * @return QString + */ +auto GPGFRONTEND_CORE_EXPORT GetProjectBuildVersion() -> QString; - auto Exec(EventRefrernce) -> int override; +/** + * @brief + * + * @return QString + */ +auto GPGFRONTEND_CORE_EXPORT GetProjectBuildTimestamp() -> QDateTime; - auto Deactive() -> bool override; +/** + * @brief + * + * @return QString + */ +auto GPGFRONTEND_CORE_EXPORT GetProjectBuildGitBranchName() -> QString; - signals: +/** + * @brief + * + * @return QString + */ +auto GPGFRONTEND_CORE_EXPORT GetProjectBuildGitCommitHash() -> QString; - void SignalVersionCheckDone(SoftwareVersion); +/** + * @brief + * + * @return QString + */ +auto GPGFRONTEND_CORE_EXPORT GetProjectBuildGitVersion() -> QString; - public slots: +/** + * @brief + * + * @return QString + */ +auto GPGFRONTEND_CORE_EXPORT GetHttpRequestUserAgent() -> QString; - void SlotVersionCheckDone(SoftwareVersion); -}; -} // namespace GpgFrontend::Module::Integrated::VersionCheckingModule +} // namespace GpgFrontend
\ No newline at end of file diff --git a/src/core/utils/CacheUtils.h b/src/core/utils/CacheUtils.h index 48b9ac4b..eae45353 100644 --- a/src/core/utils/CacheUtils.h +++ b/src/core/utils/CacheUtils.h @@ -28,6 +28,8 @@ #pragma once +#include "core/GpgFrontendCoreExport.h" + namespace GpgFrontend { /** diff --git a/src/core/utils/CommonUtils.cpp b/src/core/utils/CommonUtils.cpp index 0b182241..d1704312 100644 --- a/src/core/utils/CommonUtils.cpp +++ b/src/core/utils/CommonUtils.cpp @@ -43,7 +43,7 @@ auto BeautifyFingerprint(QString fingerprint) -> QString { return out.readAll(); } -auto CompareSoftwareVersion(const QString& a, const QString& b) -> int { +auto GFCompareSoftwareVersion(const QString& a, const QString& b) -> int { auto remove_prefix = [](const QString& version) { return version.startsWith('v') ? version.mid(1) : version; }; @@ -71,4 +71,25 @@ auto CompareSoftwareVersion(const QString& a, const QString& b) -> int { return 0; } + +auto GFStrDup(const QString& str) -> char* { + auto utf8_str = str.toUtf8(); + auto* c_str = + static_cast<char*>(SecureMalloc((utf8_str.size() + 1) * sizeof(char))); + + memcpy(c_str, utf8_str.constData(), utf8_str.size()); + c_str[utf8_str.size()] = '\0'; + return c_str; +} + +auto GPGFRONTEND_CORE_EXPORT GFUnStrDup(char* str) -> QString { + auto qt_str = QString::fromUtf8(str); + SecureFree(static_cast<void*>(const_cast<char*>(str))); + return qt_str; +} + +auto GPGFRONTEND_CORE_EXPORT GFUnStrDup(const char* str) -> QString { + return GFUnStrDup(const_cast<char*>(str)); +} + } // namespace GpgFrontend
\ No newline at end of file diff --git a/src/core/utils/CommonUtils.h b/src/core/utils/CommonUtils.h index a45c6056..6ef38fad 100644 --- a/src/core/utils/CommonUtils.h +++ b/src/core/utils/CommonUtils.h @@ -48,7 +48,21 @@ auto GPGFRONTEND_CORE_EXPORT BeautifyFingerprint(QString fingerprint) * @param b * @return int */ -auto GPGFRONTEND_CORE_EXPORT CompareSoftwareVersion(const QString& a, - const QString& b) -> int; +auto GPGFRONTEND_CORE_EXPORT GFCompareSoftwareVersion(const QString& a, + const QString& b) -> int; + +/** + * @brief + * + * @return char* + */ +auto GPGFRONTEND_CORE_EXPORT GFStrDup(const QString&) -> char*; + +/** + * @brief + * + * @return QString + */ +auto GPGFRONTEND_CORE_EXPORT GFUnStrDup(const char*) -> QString; } // namespace GpgFrontend
\ No newline at end of file diff --git a/src/core/utils/FilesystemUtils.h b/src/core/utils/FilesystemUtils.h index 0b58bbb7..0bc90ac5 100644 --- a/src/core/utils/FilesystemUtils.h +++ b/src/core/utils/FilesystemUtils.h @@ -28,6 +28,8 @@ #pragma once +#include "core/GpgFrontendCoreExport.h" + namespace GpgFrontend { /** @@ -54,8 +56,8 @@ auto GPGFRONTEND_CORE_EXPORT GetOnlyFileNameWithPath(const QString& path) * @param filename_pattern The pattern of the file name, e.g. "*.txt" * @return int64_t */ -auto GPGFRONTEND_CORE_EXPORT GetFileSizeByPath( - const QString& path, const QString& filename_pattern) +auto GPGFRONTEND_CORE_EXPORT GetFileSizeByPath(const QString& path, + const QString& filename_pattern) -> int64_t; /** @@ -72,7 +74,7 @@ auto GPGFRONTEND_CORE_EXPORT GetHumanFriendlyFileSize(int64_t size) -> QString; * @param path * @param filename_pattern */ -void GPGFRONTEND_CORE_EXPORT DeleteAllFilesByPattern( - const QString& path, const QString& filename_pattern); +void GPGFRONTEND_CORE_EXPORT +DeleteAllFilesByPattern(const QString& path, const QString& filename_pattern); } // namespace GpgFrontend
\ No newline at end of file diff --git a/src/core/utils/IOUtils.cpp b/src/core/utils/IOUtils.cpp index 1002badd..0be11755 100644 --- a/src/core/utils/IOUtils.cpp +++ b/src/core/utils/IOUtils.cpp @@ -180,4 +180,42 @@ auto GetFullExtension(const QString& path) -> QString { return filename.mid(dot_index); } +auto CalculateBinaryChacksum(const QString& path) -> QString { + // check file info and access rights + QFileInfo info(path); + if (!info.exists() || !info.isFile() || !info.isReadable()) { + GF_CORE_LOG_ERROR("get info for file {} error, exists: {}", info.filePath(), + info.exists()); + return {}; + } + + // open and read file + QFile f(info.filePath()); + if (!f.open(QIODevice::ReadOnly)) { + GF_CORE_LOG_ERROR("open {} to calculate checksum error: {}", + path.toStdString(), f.errorString().toStdString()); + return {}; + } + + QCryptographicHash hash_sha(QCryptographicHash::Sha256); + + // read data by chunks + const qint64 buffer_size = 8192; // Define a suitable buffer size + while (!f.atEnd()) { + QByteArray const buffer = f.read(buffer_size); + if (buffer.isEmpty()) { + GF_CORE_LOG_ERROR("error reading file {} during checksum calculation", + path.toStdString()); + return {}; + } + hash_sha.addData(buffer); + } + + // close the file + f.close(); + + // return the SHA-256 hash of the file + return hash_sha.result().toHex(); +} + } // namespace GpgFrontend
\ No newline at end of file diff --git a/src/core/utils/IOUtils.h b/src/core/utils/IOUtils.h index 2c48f38c..3e18394d 100644 --- a/src/core/utils/IOUtils.h +++ b/src/core/utils/IOUtils.h @@ -85,6 +85,15 @@ auto GPGFRONTEND_CORE_EXPORT CalculateHash(const QString &file_path) -> QString; * @brief * * @param path + * @return QString + */ +auto GPGFRONTEND_CORE_EXPORT CalculateBinaryChacksum(const QString &path) + -> QString; + +/** + * @brief + * + * @param path * @param out_buffer * @return true * @return false diff --git a/src/core/utils/LocalizedUtils.cpp b/src/core/utils/LocalizedUtils.cpp index 6c020ed7..e5c9b434 100644 --- a/src/core/utils/LocalizedUtils.cpp +++ b/src/core/utils/LocalizedUtils.cpp @@ -32,7 +32,12 @@ namespace GpgFrontend { -auto GetFormatedDateByTimestamp(time_t timestamp) -> QString { +auto GetLocalizedDateByTimestamp(time_t timestamp) -> QString { return QLocale().toString(QDateTime::fromSecsSinceEpoch(timestamp)); } + +auto GetUTCDateByTimestamp(time_t timestamp) -> QString { + return QLocale().toString(QDateTime::fromSecsSinceEpoch(timestamp).toUTC()); +} + } // namespace GpgFrontend diff --git a/src/core/utils/LocalizedUtils.h b/src/core/utils/LocalizedUtils.h index d7aaf0c8..10ada833 100644 --- a/src/core/utils/LocalizedUtils.h +++ b/src/core/utils/LocalizedUtils.h @@ -28,8 +28,12 @@ #pragma once +#include "core/GpgFrontendCoreExport.h" + namespace GpgFrontend { -auto GPGFRONTEND_CORE_EXPORT GetFormatedDateByTimestamp(time_t) -> QString; +auto GPGFRONTEND_CORE_EXPORT GetLocalizedDateByTimestamp(time_t) -> QString; + +auto GPGFRONTEND_CORE_EXPORT GetUTCDateByTimestamp(time_t) -> QString; -}
\ No newline at end of file +} // namespace GpgFrontend
\ No newline at end of file diff --git a/src/core/utils/LogUtils.h b/src/core/utils/LogUtils.h index a1a5685a..e8dc6f3b 100644 --- a/src/core/utils/LogUtils.h +++ b/src/core/utils/LogUtils.h @@ -28,6 +28,49 @@ #pragma once +// spdlog library configuration +#undef SPDLOG_ACTIVE_LEVEL +#define SPDLOG_ACTIVE_LEVEL SPDLOG_LEVEL_TRACE +#include <spdlog/spdlog.h> + +// logger fmt +#include "core/GpgFrontendCoreExport.h" + +template <> +struct fmt::formatter<QString> { + // Parses format specifications. + constexpr auto parse(format_parse_context& ctx) -> decltype(ctx.begin()) { + return ctx.begin(); + } + + // Formats the QString qstr and writes it to the output. + template <typename FormatContext> + auto format(const QString& qstr, FormatContext& ctx) const + -> decltype(ctx.out()) { + // Convert QString to UTF-8 QString (to handle Unicode characters + // correctly) + QByteArray utf8_array = qstr.toUtf8(); + return fmt::format_to(ctx.out(), "{}", utf8_array.constData()); + } +}; + +template <> +struct fmt::formatter<QByteArray> { + // Parses format specifications. + constexpr auto parse(format_parse_context& ctx) -> decltype(ctx.begin()) { + return ctx.begin(); + } + + // Formats the QString qstr and writes it to the output. + template <typename FormatContext> + auto format(const QByteArray& qarray, FormatContext& ctx) const + -> decltype(ctx.out()) { + // Convert QString to UTF-8 QString (to handle Unicode characters + // correctly) + return fmt::format_to(ctx.out(), "{}", qarray.constData()); + } +}; + namespace GpgFrontend { /** @@ -50,7 +93,7 @@ auto GPGFRONTEND_CORE_EXPORT GetCoreLogger() -> std::shared_ptr<spdlog::logger>; * * @return std::shared_ptr<spdlog::logger> */ -auto GPGFRONTEND_CORE_EXPORT GetLogger(const QString &) +auto GPGFRONTEND_CORE_EXPORT GetLogger(const QString&) -> std::shared_ptr<spdlog::logger>; /** @@ -65,7 +108,7 @@ void GPGFRONTEND_CORE_EXPORT SetDefaultLogLevel(spdlog::level::level_enum); * * @return auto */ -void GPGFRONTEND_CORE_EXPORT RegisterAsyncLogger(const QString &, +void GPGFRONTEND_CORE_EXPORT RegisterAsyncLogger(const QString&, spdlog::level::level_enum); /** @@ -73,7 +116,7 @@ void GPGFRONTEND_CORE_EXPORT RegisterAsyncLogger(const QString &, * * @return auto */ -void GPGFRONTEND_CORE_EXPORT RegisterSyncLogger(const QString &, +void GPGFRONTEND_CORE_EXPORT RegisterSyncLogger(const QString&, spdlog::level::level_enum); } // namespace GpgFrontend diff --git a/src/init.cpp b/src/init.cpp index 76c1fd4c..b3156d1f 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -31,9 +31,9 @@ #include "core/GpgCoreInit.h" #include "core/function/GlobalSettingStation.h" #include "core/function/gpg/GpgAdvancedOperator.h" +#include "core/module/ModuleInit.h" #include "core/thread/TaskRunnerGetter.h" #include "core/utils/LogUtils.h" -#include "module/GpgFrontendModuleInit.h" #include "ui/GpgFrontendUIInit.h" // main @@ -106,7 +106,7 @@ void InitGlobalPathEnv() { } } -void InitGlobalBasicalEnv(const GFCxtWPtr &p_ctx, bool gui_mode) { +void InitGlobalBasicEnv(const GFCxtWPtr &p_ctx, bool gui_mode) { GFCxtSPtr ctx = p_ctx.lock(); if (ctx == nullptr) { return; @@ -161,7 +161,7 @@ void InitLocale() { QLocale::setDefault(target_locale); } -void ShutdownGlobalBasicalEnv(const GFCxtWPtr &p_ctx) { +void ShutdownGlobalBasicEnv(const GFCxtWPtr &p_ctx) { GFCxtSPtr ctx = p_ctx.lock(); if (ctx == nullptr) { return; @@ -56,13 +56,13 @@ void InitLocale(); * * @param args */ -void InitGlobalBasicalEnv(const GFCxtWPtr &, bool); +void InitGlobalBasicEnv(const GFCxtWPtr &, bool); /** * @brief * * @param p_ctx */ -void ShutdownGlobalBasicalEnv(const GFCxtWPtr &p_ctx); +void ShutdownGlobalBasicEnv(const GFCxtWPtr &p_ctx); } // namespace GpgFrontend
\ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index abc6ed56..a99f3e30 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -33,9 +33,11 @@ #include "GpgFrontendContext.h" #include "app.h" #include "cmd.h" -#include "core/utils/MemoryUtils.h" #include "init.h" +// +#include "core/utils/MemoryUtils.h" + /** * * @param argc @@ -43,7 +45,7 @@ * @return */ auto main(int argc, char* argv[]) -> int { - GpgFrontend::GFCxtSPtr ctx = + GpgFrontend::GFCxtSPtr const ctx = GpgFrontend::SecureCreateSharedObject<GpgFrontend::GpgFrontendContext>( argc, argv); ctx->InitApplication(); @@ -79,17 +81,17 @@ auto main(int argc, char* argv[]) -> int { ctx->gather_external_gnupg_info = false; ctx->load_default_gpg_context = false; - InitGlobalBasicalEnv(ctx, false); + InitGlobalBasicEnv(ctx, false); rtn = RunTest(ctx); - ShutdownGlobalBasicalEnv(ctx); + ShutdownGlobalBasicEnv(ctx); return rtn; } ctx->gather_external_gnupg_info = true; ctx->load_default_gpg_context = true; - InitGlobalBasicalEnv(ctx, true); + InitGlobalBasicEnv(ctx, true); rtn = StartApplication(ctx); - ShutdownGlobalBasicalEnv(ctx); + ShutdownGlobalBasicEnv(ctx); return rtn; } diff --git a/src/module/CMakeLists.txt b/src/module/CMakeLists.txt index a741f0af..8d894b00 100644 --- a/src/module/CMakeLists.txt +++ b/src/module/CMakeLists.txt @@ -30,15 +30,16 @@ set(CMAKE_VISIBILITY_INLINES_HIDDEN 1) aux_source_directory(sdk MODULE_SDK_SOURCE) add_library(gpgfrontend_module_sdk SHARED ${MODULE_SDK_SOURCE}) -set(_export_file_sdk "${CMAKE_CURRENT_SOURCE_DIR}/sdk/GpgFrontendModuleSDKExport.h") +set(_export_file_sdk "${CMAKE_CURRENT_SOURCE_DIR}/sdk/GFSDKExport.h") generate_export_header(gpgfrontend_module_sdk EXPORT_FILE_NAME "${_export_file_sdk}") -target_include_directories(gpgfrontend_module_sdk PUBLIC - sdk +target_include_directories(gpgfrontend_module_sdk PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/gpgfrontend_module_sdk_autogen/include ${CMAKE_SOURCE_DIR}/third_party/spdlog/include) +target_include_directories(gpgfrontend_module_sdk PUBLIC sdk) + # link module system -target_link_libraries(gpgfrontend_module_sdk PUBLIC gpgfrontend_core) +target_link_libraries(gpgfrontend_module_sdk PRIVATE gpgfrontend_core) if (XCODE_BUILD) set_target_properties(gpgfrontend_module_sdk @@ -50,51 +51,14 @@ if (XCODE_BUILD) XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "${GPGFRONTEND_XOCDE_CODE_SIGN_IDENTITY}") endif () -# tracking integrated modules +# tracking modules set(all_integrated_module_libraries "") -file(GLOB children LIST_DIRECTORIES true "integrated/*") +file(GLOB children LIST_DIRECTORIES true "mods/*") foreach(child ${children}) if(IS_DIRECTORY ${child}) get_filename_component(dirName ${child} NAME) - add_subdirectory("integrated/${dirName}") - - string(REPLACE "_module" "" stripped_module ${dirName}) - set(integrated_lib_name "gpgfrontend_integrated_module_${stripped_module}") - list(APPEND all_integrated_module_libraries ${integrated_lib_name}) + add_subdirectory("mods/${dirName}") + + list(APPEND all_integrated_module_libraries ${dirName}) endif() -endforeach() - -aux_source_directory(. MODULE_SOURCE) -add_library(gpgfrontend_module SHARED ${MODULE_SOURCE}) - -set(_export_file "${CMAKE_CURRENT_SOURCE_DIR}/GpgFrontendModuleExport.h") -generate_export_header(gpgfrontend_module EXPORT_FILE_NAME "${_export_file}") - -# set up pch -target_precompile_headers(gpgfrontend_module PUBLIC GpgFrontendModule.h) - -# add ui generator include path -target_include_directories(gpgfrontend_module PUBLIC - ${CMAKE_CURRENT_BINARY_DIR}/gpgfrontend_module_autogen/include - ${CMAKE_SOURCE_DIR}/third_party/spdlog/include) - -# link gpgfrontend_module_sdk -target_link_libraries(gpgfrontend_module PRIVATE gpgfrontend_module_sdk) - -if (XCODE_BUILD) - set_target_properties(gpgfrontend_module - PROPERTIES - ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE} - LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE} - LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE} - XCODE_ATTRIBUTE_SKIP_INSTALL "Yes" - XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "${GPGFRONTEND_XOCDE_CODE_SIGN_IDENTITY}") -endif () - - -# link all integrated modules -message(STATUS "All Module Libraries: ${all_integrated_module_libraries}") -target_link_libraries(gpgfrontend_module PRIVATE ${all_integrated_module_libraries}) - -# using std c++ 17 -target_compile_features(gpgfrontend_module PUBLIC cxx_std_17)
\ No newline at end of file +endforeach()
\ No newline at end of file diff --git a/src/module/GpgFrontendModuleExport.h b/src/module/GpgFrontendModuleExport.h deleted file mode 100644 index 33ecbd3b..00000000 --- a/src/module/GpgFrontendModuleExport.h +++ /dev/null @@ -1,42 +0,0 @@ - -#ifndef GPGFRONTEND_MODULE_EXPORT_H -#define GPGFRONTEND_MODULE_EXPORT_H - -#ifdef GPGFRONTEND_MODULE_STATIC_DEFINE -# define GPGFRONTEND_MODULE_EXPORT -# define GPGFRONTEND_MODULE_NO_EXPORT -#else -# ifndef GPGFRONTEND_MODULE_EXPORT -# ifdef gpgfrontend_module_EXPORTS - /* We are building this library */ -# define GPGFRONTEND_MODULE_EXPORT __attribute__((visibility("default"))) -# else - /* We are using this library */ -# define GPGFRONTEND_MODULE_EXPORT __attribute__((visibility("default"))) -# endif -# endif - -# ifndef GPGFRONTEND_MODULE_NO_EXPORT -# define GPGFRONTEND_MODULE_NO_EXPORT __attribute__((visibility("hidden"))) -# endif -#endif - -#ifndef GPGFRONTEND_MODULE_DEPRECATED -# define GPGFRONTEND_MODULE_DEPRECATED __attribute__ ((__deprecated__)) -#endif - -#ifndef GPGFRONTEND_MODULE_DEPRECATED_EXPORT -# define GPGFRONTEND_MODULE_DEPRECATED_EXPORT GPGFRONTEND_MODULE_EXPORT GPGFRONTEND_MODULE_DEPRECATED -#endif - -#ifndef GPGFRONTEND_MODULE_DEPRECATED_NO_EXPORT -# define GPGFRONTEND_MODULE_DEPRECATED_NO_EXPORT GPGFRONTEND_MODULE_NO_EXPORT GPGFRONTEND_MODULE_DEPRECATED -#endif - -#if 0 /* DEFINE_NO_DEPRECATED */ -# ifndef GPGFRONTEND_MODULE_NO_DEPRECATED -# define GPGFRONTEND_MODULE_NO_DEPRECATED -# endif -#endif - -#endif /* GPGFRONTEND_MODULE_EXPORT_H */ diff --git a/src/module/GpgFrontendModuleInit.cpp b/src/module/GpgFrontendModuleInit.cpp deleted file mode 100644 index 6f88b9ec..00000000 --- a/src/module/GpgFrontendModuleInit.cpp +++ /dev/null @@ -1,66 +0,0 @@ -/** - * Copyright (C) 2021 Saturneric <[email protected]> - * - * 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. - * - * GpgFrontend 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 GpgFrontend. If not, see <https://www.gnu.org/licenses/>. - * - * The initial version of the source code is inherited from - * the gpg4usb project, which is under GPL-3.0-or-later. - * - * All the source code of GpgFrontend was modified and released by - * Saturneric <[email protected]> starting on May 12, 2021. - * - * SPDX-License-Identifier: GPL-3.0-or-later - * - */ - -#include "GpgFrontendModuleInit.h" - -#include <core/module/ModuleManager.h> - -#include "core/thread/Task.h" -#include "core/thread/TaskRunnerGetter.h" - -// integrated modules -#include "integrated/gnupg_info_gathering_module/GnuPGInfoGatheringModule.h" -#include "integrated/version_checking_module/VersionCheckingModule.h" -#include "spdlog/common.h" - -namespace GpgFrontend::Module { - -void LoadGpgFrontendModules(ModuleInitArgs) { - // must init at default thread before core - Thread::TaskRunnerGetter::GetInstance().GetTaskRunner()->PostTask( - new Thread::Task( - [](const DataObjectPtr&) -> int { - MODULE_LOG_INFO("loading integrated module..."); - - // VersionCheckingModule - RegisterAndActivateModule< - Integrated::VersionCheckingModule::VersionCheckingModule>(); - - // VersionCheckingModule - RegisterAndActivateModule<Integrated::GnuPGInfoGatheringModule:: - GnuPGInfoGatheringModule>(); - - MODULE_LOG_INFO("load integrated module done."); - return 0; - }, - "modules_system_init_task")); -} - -void ShutdownGpgFrontendModules() {} - -} // namespace GpgFrontend::Module
\ No newline at end of file diff --git a/src/module/integrated/gnupg_info_gathering_module/GnuPGInfoGatheringModule.cpp b/src/module/integrated/gnupg_info_gathering_module/GnuPGInfoGatheringModule.cpp deleted file mode 100644 index a1e5cd5a..00000000 --- a/src/module/integrated/gnupg_info_gathering_module/GnuPGInfoGatheringModule.cpp +++ /dev/null @@ -1,352 +0,0 @@ -/** - * Copyright (C) 2021 Saturneric <[email protected]> - * - * 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. - * - * GpgFrontend 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 GpgFrontend. If not, see <https://www.gnu.org/licenses/>. - * - * The initial version of the source code is inherited from - * the gpg4usb project, which is under GPL-3.0-or-later. - * - * All the source code of GpgFrontend was modified and released by - * Saturneric <[email protected]> starting on May 12, 2021. - * - * SPDX-License-Identifier: GPL-3.0-or-later - * - */ - -#include "GnuPGInfoGatheringModule.h" - -#include <vector> - -#include "GpgInfo.h" -#include "Log.h" -#include "core/function/gpg/GpgCommandExecutor.h" -#include "core/module/ModuleManager.h" - -namespace GpgFrontend::Module::Integrated::GnuPGInfoGatheringModule { - -auto CheckBinaryChacksum(QString path) -> std::optional<QString> { - // check file info and access rights - QFileInfo info(path); - if (!info.exists() || !info.isFile() || !info.isReadable()) { - MODULE_LOG_ERROR("get info for file {} error, exists: {}", info.filePath(), - info.exists()); - return {}; - } - - // open and read file - QFile f(info.filePath()); - if (!f.open(QIODevice::ReadOnly)) { - MODULE_LOG_ERROR("open {} to calculate check sum error: {}", path, - f.errorString()); - return {}; - } - - // read all data from file - auto buffer = f.readAll(); - f.close(); - - auto hash_sha = QCryptographicHash(QCryptographicHash::Sha256); - // md5 - hash_sha.addData(buffer); - return QString(hash_sha.result().toHex()).left(6); -} - -GnuPGInfoGatheringModule::GnuPGInfoGatheringModule() - : Module( - "com.bktus.gpgfrontend.module.integrated.gnupg-info-gathering", - "1.0.0", - ModuleMetaData{{"description", "try to gathering gnupg informations"}, - {"author", "saturneric"}}) {} - -GnuPGInfoGatheringModule::~GnuPGInfoGatheringModule() = default; - -auto GnuPGInfoGatheringModule::Register() -> bool { - MODULE_LOG_DEBUG("gnupg info gathering module registering"); - listenEvent("GPGFRONTEND_CORE_INITLIZED"); - return true; -} - -auto GnuPGInfoGatheringModule::Active() -> bool { - MODULE_LOG_DEBUG("gnupg info gathering module activating"); - return true; -} - -auto GnuPGInfoGatheringModule::Exec(EventRefrernce event) -> int { - MODULE_LOG_DEBUG("gnupg info gathering module executing, event id: {}", - event->GetIdentifier()); - - const auto gpgme_version = RetrieveRTValueTypedOrDefault<>( - "core", "gpgme.version", QString{"0.0.0"}); - MODULE_LOG_DEBUG("got gpgme version from rt: {}", gpgme_version); - - const auto gpgconf_path = RetrieveRTValueTypedOrDefault<>( - "core", "gpgme.ctx.gpgconf_path", QString{}); - MODULE_LOG_DEBUG("got gpgconf path from rt: {}", gpgconf_path); - - MODULE_LOG_DEBUG("start to load extra info at module gnupginfogathering..."); - - // get all components - GpgCommandExecutor::ExecuteSync( - {gpgconf_path, QStringList{"--list-components"}, - [this, gpgme_version, gpgconf_path](int exit_code, const QString &p_out, - const QString &p_err) { - MODULE_LOG_DEBUG( - "gpgconf components exit_code: {} process stdout size: {}", - exit_code, p_out.size()); - - if (exit_code != 0) { - MODULE_LOG_ERROR( - "gpgconf execute error, process stderr: {}, " - "process stdout: {}", - p_err, p_out); - return; - } - - std::vector<GpgComponentInfo> component_infos; - GpgComponentInfo c_i_gpgme; - c_i_gpgme.name = "gpgme"; - c_i_gpgme.desc = "GPG Made Easy"; - c_i_gpgme.version = gpgme_version; - c_i_gpgme.path = tr("Embedded In"); - c_i_gpgme.binary_checksum = "/"; - - GpgComponentInfo c_i_gpgconf; - c_i_gpgconf.name = "gpgconf"; - c_i_gpgconf.desc = "GPG Configure"; - c_i_gpgconf.version = "/"; - c_i_gpgconf.path = gpgconf_path; - auto gpgconf_binary_checksum = CheckBinaryChacksum(gpgconf_path); - c_i_gpgconf.binary_checksum = (gpgconf_binary_checksum.has_value() - ? gpgconf_binary_checksum.value() - : QString("/")); - - component_infos.push_back(c_i_gpgme); - component_infos.push_back(c_i_gpgconf); - - auto const jsonlized_gpgme_component_info = c_i_gpgme.Json(); - auto const jsonlized_gpgconf_component_info = c_i_gpgconf.Json(); - UpsertRTValue(GetModuleIdentifier(), "gnupg.components.gpgme", - QJsonDocument(jsonlized_gpgme_component_info).toJson()); - UpsertRTValue( - GetModuleIdentifier(), "gnupg.components.gpgconf", - QJsonDocument(jsonlized_gpgconf_component_info).toJson()); - - auto line_split_list = p_out.split("\n"); - - for (const auto &line : line_split_list) { - auto info_split_list = line.split(":"); - - if (info_split_list.size() != 3) continue; - - auto component_name = info_split_list[0].trimmed(); - auto component_desc = info_split_list[1].trimmed(); - auto component_path = info_split_list[2].trimmed(); - -#ifdef WINDOWS - // replace some special substrings on windows platform - component_path.replace("%3a", ":"); -#endif - - auto binary_checksum = CheckBinaryChacksum(component_path); - - MODULE_LOG_DEBUG( - "gnupg component name: {} desc: {} checksum: {} path: {} ", - component_name, component_desc, - binary_checksum.has_value() ? binary_checksum.value() : "/", - component_path); - - QString version = "/"; - - if (component_name == "gpg") { - version = RetrieveRTValueTypedOrDefault<>( - "core", "gpgme.ctx.gnupg_version", QString{"2.0.0"}); - } - if (component_name == "gpg-agent") { - UpsertRTValue(GetModuleIdentifier(), "gnupg.gpg_agent_path", - QString(component_path)); - } - if (component_name == "dirmngr") { - UpsertRTValue(GetModuleIdentifier(), "gnupg.dirmngr_path", - QString(component_path)); - } - if (component_name == "keyboxd") { - UpsertRTValue(GetModuleIdentifier(), "gnupg.keyboxd_path", - QString(component_path)); - } - - { - GpgComponentInfo c_i; - c_i.name = component_name; - c_i.desc = component_desc; - c_i.version = version; - c_i.path = component_path; - c_i.binary_checksum = - (binary_checksum.has_value() ? binary_checksum.value() - : QString("/")); - - auto const jsonlized_component_info = c_i.Json(); - UpsertRTValue(GetModuleIdentifier(), - QString("gnupg.components.%1").arg(component_name), - QJsonDocument(jsonlized_component_info).toJson()); - - component_infos.push_back(c_i); - } - } - }, - getTaskRunner()}); - - GpgCommandExecutor::ExecuteContexts exec_contexts; -#ifdef QT5_BUILD - exec_contexts.push_back(GpgCommandExecutor::ExecuteContext{ -#else - exec_contexts.emplace_back(GpgCommandExecutor::ExecuteContext{ -#endif - gpgconf_path, QStringList{"--list-dirs"}, - [this](int exit_code, const QString &p_out, const QString &p_err) { - if (exit_code != 0) return; - - auto line_split_list = p_out.split("\n"); - - for (const auto &line : line_split_list) { - auto info_split_list = line.split(":"); - MODULE_LOG_DEBUG("gpgconf direcrotries info line: {} info size: {}", - line, info_split_list.size()); - - if (info_split_list.size() != 2) continue; - - auto configuration_name = info_split_list[0].trimmed(); - auto configuration_value = info_split_list[1].trimmed(); - -#ifdef WINDOWS - // replace some special substrings on windows platform - configuration_value.replace("%3a", ":"); -#endif - - // record gnupg home path - if (configuration_name == "homedir") { - UpsertRTValue(GetModuleIdentifier(), "gnupg.home_path", - configuration_value); - } - - UpsertRTValue(GetModuleIdentifier(), - QString("gnupg.dirs.%1").arg(configuration_name), - configuration_value); - } - }, - getTaskRunner()}); - - auto components = ListRTChildKeys(GetModuleIdentifier(), "gnupg.components"); - - for (const auto &component : components) { - auto component_info_json = RetrieveRTValueTypedOrDefault( - GetModuleIdentifier(), QString("gnupg.components.%1").arg(component), - QByteArray{}); - - auto jsonlized_component_info = - QJsonDocument::fromJson(component_info_json); - assert(jsonlized_component_info.isObject()); - - auto component_info = GpgComponentInfo(jsonlized_component_info.object()); - MODULE_LOG_DEBUG("gpgconf check options ready, component: {}", - component_info.name); - - if (component_info.name == "gpgme" || component_info.name == "gpgconf") { - continue; - } - -#ifdef QT5_BUILD - exec_contexts.push_back(GpgCommandExecutor::ExecuteContext{ -#else - exec_contexts.emplace_back(GpgCommandExecutor::ExecuteContext{ -#endif - gpgconf_path, QStringList{"--list-options", component_info.name}, - [this, component_info](int exit_code, const QString &p_out, - const QString &p_err) { - MODULE_LOG_DEBUG( - "gpgconf {} avaliable options exit_code: {} process stdout " - "size: {} ", - component_info.name, exit_code, p_out.size()); - - if (exit_code != 0) { - MODULE_LOG_ERROR( - "gpgconf {} avaliable options execute error, process stderr: " - "{} , process stdout:", - component_info.name, p_err, p_out); - return; - } - - std::vector<GpgOptionsInfo> options_infos; - - auto line_split_list = p_out.split("\n"); - - for (const auto &line : line_split_list) { - auto info_split_list = line.split(":"); - - MODULE_LOG_DEBUG( - "component {} avaliable options line: {} info size: {}", - component_info.name, line, info_split_list.size()); - - if (info_split_list.size() < 10) continue; - - // The format of each line is: - // name:flags:level:description:type:alt-type:argname:default:argdef:value - - auto option_name = info_split_list[0].trimmed(); - auto option_flags = info_split_list[1].trimmed(); - auto option_level = info_split_list[2].trimmed(); - auto option_desc = info_split_list[3].trimmed(); - auto option_type = info_split_list[4].trimmed(); - auto option_alt_type = info_split_list[5].trimmed(); - auto option_argname = info_split_list[6].trimmed(); - auto option_default = info_split_list[7].trimmed(); - auto option_argdef = info_split_list[8].trimmed(); - auto option_value = info_split_list[9].trimmed(); - - GpgOptionsInfo info; - info.name = option_name; - info.flags = option_flags; - info.level = option_level; - info.description = option_desc; - info.type = option_type; - info.alt_type = option_alt_type; - info.argname = option_argname; - info.default_value = option_default; - info.argdef = option_argdef; - info.value = option_value; - - auto const jsonlized_option_info = info.Json(); - UpsertRTValue(GetModuleIdentifier(), - QString("gnupg.components.%1.options.%2") - .arg(component_info.name) - .arg(option_name), - QJsonDocument(jsonlized_option_info).toJson()); - options_infos.push_back(info); - } - }, - getTaskRunner()}); - } - - GpgCommandExecutor::ExecuteConcurrentlySync(exec_contexts); - UpsertRTValue(GetModuleIdentifier(), "gnupg.gathering_done", true); - event->ExecuteCallback(GetModuleIdentifier(), TransferParams(true)); - - MODULE_LOG_DEBUG("gnupg external info gathering done"); - return 0; -} - -auto GnuPGInfoGatheringModule::Deactive() -> bool { return true; } - -} // namespace GpgFrontend::Module::Integrated::GnuPGInfoGatheringModule diff --git a/src/module/integrated/gnupg_info_gathering_module/GpgFrontendModuleExport.h b/src/module/integrated/gnupg_info_gathering_module/GpgFrontendModuleExport.h deleted file mode 100644 index 3a5ba68b..00000000 --- a/src/module/integrated/gnupg_info_gathering_module/GpgFrontendModuleExport.h +++ /dev/null @@ -1,42 +0,0 @@ - -#ifndef GPGFRONTEND_INTEGRATED_MODULE_GNUPG_INFO_GATHERING_EXPORT_H -#define GPGFRONTEND_INTEGRATED_MODULE_GNUPG_INFO_GATHERING_EXPORT_H - -#ifdef GPGFRONTEND_INTEGRATED_MODULE_GNUPG_INFO_GATHERING_STATIC_DEFINE -# define GPGFRONTEND_INTEGRATED_MODULE_GNUPG_INFO_GATHERING_EXPORT -# define GPGFRONTEND_INTEGRATED_MODULE_GNUPG_INFO_GATHERING_NO_EXPORT -#else -# ifndef GPGFRONTEND_INTEGRATED_MODULE_GNUPG_INFO_GATHERING_EXPORT -# ifdef gpgfrontend_integrated_module_gnupg_info_gathering_EXPORTS - /* We are building this library */ -# define GPGFRONTEND_INTEGRATED_MODULE_GNUPG_INFO_GATHERING_EXPORT __attribute__((visibility("default"))) -# else - /* We are using this library */ -# define GPGFRONTEND_INTEGRATED_MODULE_GNUPG_INFO_GATHERING_EXPORT __attribute__((visibility("default"))) -# endif -# endif - -# ifndef GPGFRONTEND_INTEGRATED_MODULE_GNUPG_INFO_GATHERING_NO_EXPORT -# define GPGFRONTEND_INTEGRATED_MODULE_GNUPG_INFO_GATHERING_NO_EXPORT __attribute__((visibility("hidden"))) -# endif -#endif - -#ifndef GPGFRONTEND_INTEGRATED_MODULE_GNUPG_INFO_GATHERING_DEPRECATED -# define GPGFRONTEND_INTEGRATED_MODULE_GNUPG_INFO_GATHERING_DEPRECATED __attribute__ ((__deprecated__)) -#endif - -#ifndef GPGFRONTEND_INTEGRATED_MODULE_GNUPG_INFO_GATHERING_DEPRECATED_EXPORT -# define GPGFRONTEND_INTEGRATED_MODULE_GNUPG_INFO_GATHERING_DEPRECATED_EXPORT GPGFRONTEND_INTEGRATED_MODULE_GNUPG_INFO_GATHERING_EXPORT GPGFRONTEND_INTEGRATED_MODULE_GNUPG_INFO_GATHERING_DEPRECATED -#endif - -#ifndef GPGFRONTEND_INTEGRATED_MODULE_GNUPG_INFO_GATHERING_DEPRECATED_NO_EXPORT -# define GPGFRONTEND_INTEGRATED_MODULE_GNUPG_INFO_GATHERING_DEPRECATED_NO_EXPORT GPGFRONTEND_INTEGRATED_MODULE_GNUPG_INFO_GATHERING_NO_EXPORT GPGFRONTEND_INTEGRATED_MODULE_GNUPG_INFO_GATHERING_DEPRECATED -#endif - -#if 0 /* DEFINE_NO_DEPRECATED */ -# ifndef GPGFRONTEND_INTEGRATED_MODULE_GNUPG_INFO_GATHERING_NO_DEPRECATED -# define GPGFRONTEND_INTEGRATED_MODULE_GNUPG_INFO_GATHERING_NO_DEPRECATED -# endif -#endif - -#endif /* GPGFRONTEND_INTEGRATED_MODULE_GNUPG_INFO_GATHERING_EXPORT_H */ diff --git a/src/module/integrated/version_checking_module/GpgFrontendModuleExport.h b/src/module/integrated/version_checking_module/GpgFrontendModuleExport.h deleted file mode 100644 index 0ac60b2f..00000000 --- a/src/module/integrated/version_checking_module/GpgFrontendModuleExport.h +++ /dev/null @@ -1,42 +0,0 @@ - -#ifndef GPGFRONTEND_INTEGRATED_MODULE_VERSION_CHECKING_EXPORT_H -#define GPGFRONTEND_INTEGRATED_MODULE_VERSION_CHECKING_EXPORT_H - -#ifdef GPGFRONTEND_INTEGRATED_MODULE_VERSION_CHECKING_STATIC_DEFINE -# define GPGFRONTEND_INTEGRATED_MODULE_VERSION_CHECKING_EXPORT -# define GPGFRONTEND_INTEGRATED_MODULE_VERSION_CHECKING_NO_EXPORT -#else -# ifndef GPGFRONTEND_INTEGRATED_MODULE_VERSION_CHECKING_EXPORT -# ifdef gpgfrontend_integrated_module_version_checking_EXPORTS - /* We are building this library */ -# define GPGFRONTEND_INTEGRATED_MODULE_VERSION_CHECKING_EXPORT __attribute__((visibility("default"))) -# else - /* We are using this library */ -# define GPGFRONTEND_INTEGRATED_MODULE_VERSION_CHECKING_EXPORT __attribute__((visibility("default"))) -# endif -# endif - -# ifndef GPGFRONTEND_INTEGRATED_MODULE_VERSION_CHECKING_NO_EXPORT -# define GPGFRONTEND_INTEGRATED_MODULE_VERSION_CHECKING_NO_EXPORT __attribute__((visibility("hidden"))) -# endif -#endif - -#ifndef GPGFRONTEND_INTEGRATED_MODULE_VERSION_CHECKING_DEPRECATED -# define GPGFRONTEND_INTEGRATED_MODULE_VERSION_CHECKING_DEPRECATED __attribute__ ((__deprecated__)) -#endif - -#ifndef GPGFRONTEND_INTEGRATED_MODULE_VERSION_CHECKING_DEPRECATED_EXPORT -# define GPGFRONTEND_INTEGRATED_MODULE_VERSION_CHECKING_DEPRECATED_EXPORT GPGFRONTEND_INTEGRATED_MODULE_VERSION_CHECKING_EXPORT GPGFRONTEND_INTEGRATED_MODULE_VERSION_CHECKING_DEPRECATED -#endif - -#ifndef GPGFRONTEND_INTEGRATED_MODULE_VERSION_CHECKING_DEPRECATED_NO_EXPORT -# define GPGFRONTEND_INTEGRATED_MODULE_VERSION_CHECKING_DEPRECATED_NO_EXPORT GPGFRONTEND_INTEGRATED_MODULE_VERSION_CHECKING_NO_EXPORT GPGFRONTEND_INTEGRATED_MODULE_VERSION_CHECKING_DEPRECATED -#endif - -#if 0 /* DEFINE_NO_DEPRECATED */ -# ifndef GPGFRONTEND_INTEGRATED_MODULE_VERSION_CHECKING_NO_DEPRECATED -# define GPGFRONTEND_INTEGRATED_MODULE_VERSION_CHECKING_NO_DEPRECATED -# endif -#endif - -#endif /* GPGFRONTEND_INTEGRATED_MODULE_VERSION_CHECKING_EXPORT_H */ diff --git a/src/module/integrated/version_checking_module/SoftwareVersion.cpp b/src/module/integrated/version_checking_module/SoftwareVersion.cpp deleted file mode 100644 index 7d41b1c5..00000000 --- a/src/module/integrated/version_checking_module/SoftwareVersion.cpp +++ /dev/null @@ -1,58 +0,0 @@ -/** - * Copyright (C) 2021 Saturneric <[email protected]> - * - * 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. - * - * GpgFrontend 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 GpgFrontend. If not, see <https://www.gnu.org/licenses/>. - * - * The initial version of the source code is inherited from - * the gpg4usb project, which is under GPL-3.0-or-later. - * - * All the source code of GpgFrontend was modified and released by - * Saturneric <[email protected]> starting on May 12, 2021. - * - * SPDX-License-Identifier: GPL-3.0-or-later - * - */ - -#include "SoftwareVersion.h" - -#include "core/utils/CommonUtils.h" -#include "module/sdk/Log.h" - -namespace GpgFrontend::Module::Integrated::VersionCheckingModule { - -auto VersionCheckingModule::SoftwareVersion::NeedUpgrade() const -> bool { - MODULE_LOG_DEBUG("compair version current {} latest {}, result {}", - current_version, latest_version, - CompareSoftwareVersion(current_version, latest_version)); - - MODULE_LOG_DEBUG("load done: {}, pre-release: {}, draft: {}", loading_done, - latest_prerelease_version_from_remote, - latest_draft_from_remote); - return loading_done && !latest_prerelease_version_from_remote && - !latest_draft_from_remote && - CompareSoftwareVersion(current_version, latest_version) < 0; -} - -auto VersionCheckingModule::SoftwareVersion::VersionWithdrawn() const -> bool { - return loading_done && !current_version_publish_in_remote && - current_version_is_a_prerelease && !current_version_is_drafted; -} - -auto VersionCheckingModule::SoftwareVersion::CurrentVersionReleased() const - -> bool { - return loading_done && current_version_publish_in_remote; -} -} // namespace GpgFrontend::Module::Integrated::VersionCheckingModule
\ No newline at end of file diff --git a/src/module/integrated/version_checking_module/VersionCheckingModule.cpp b/src/module/integrated/version_checking_module/VersionCheckingModule.cpp deleted file mode 100644 index 9b62a9c8..00000000 --- a/src/module/integrated/version_checking_module/VersionCheckingModule.cpp +++ /dev/null @@ -1,105 +0,0 @@ -/** - * Copyright (C) 2021 Saturneric <[email protected]> - * - * 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. - * - * GpgFrontend 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 GpgFrontend. If not, see <https://www.gnu.org/licenses/>. - * - * The initial version of the source code is inherited from - * the gpg4usb project, which is under GPL-3.0-or-later. - * - * All the source code of GpgFrontend was modified and released by - * Saturneric <[email protected]> starting on May 12, 2021. - * - * SPDX-License-Identifier: GPL-3.0-or-later - * - */ - -#include "VersionCheckingModule.h" - -#include "Log.h" -#include "SoftwareVersion.h" -#include "VersionCheckTask.h" -#include "core/module/Module.h" -#include "core/module/ModuleManager.h" - -namespace GpgFrontend::Module::Integrated::VersionCheckingModule { - -VersionCheckingModule::VersionCheckingModule() - : Module("com.bktus.gpgfrontend.module.integrated.version-checking", - "1.0.0", - ModuleMetaData{{"description", "try to check gpgfrontend version"}, - {"author", "saturneric"}}) {} - -VersionCheckingModule::~VersionCheckingModule() = default; - -auto VersionCheckingModule::Register() -> bool { - MODULE_LOG_INFO("version checking module registering"); - listenEvent("APPLICATION_LOADED"); - listenEvent("CHECK_APPLICATION_VERSION"); - return true; -} - -auto VersionCheckingModule::Active() -> bool { - MODULE_LOG_INFO("version checking module activating"); - return true; -} - -auto VersionCheckingModule::Exec(EventRefrernce event) -> int { - MODULE_LOG_INFO("version checking module executing, event id: {}", - event->GetIdentifier()); - - auto* task = new VersionCheckTask(); - connect(task, &VersionCheckTask::SignalUpgradeVersion, this, - &VersionCheckingModule::SignalVersionCheckDone); - connect(this, &VersionCheckingModule::SignalVersionCheckDone, this, - [this, event](SoftwareVersion version) { - SlotVersionCheckDone(std::move(version)); - event->ExecuteCallback(GetModuleIdentifier(), - TransferParams(version.loading_done)); - }); - getTaskRunner()->PostTask(task); - return 0; -} - -auto VersionCheckingModule::Deactive() -> bool { return true; } - -void VersionCheckingModule::SlotVersionCheckDone(SoftwareVersion version) { - MODULE_LOG_DEBUG("registering software information info to rt"); - UpsertRTValue(GetModuleIdentifier(), "version.current_version", - version.current_version); - UpsertRTValue(GetModuleIdentifier(), "version.latest_version", - version.latest_version); - UpsertRTValue(GetModuleIdentifier(), "version.current_version_is_drafted", - version.current_version_is_drafted); - UpsertRTValue(GetModuleIdentifier(), - "version.current_version_is_a_prerelease", - version.current_version_is_a_prerelease); - UpsertRTValue(GetModuleIdentifier(), - "version.current_version_publish_in_remote", - version.current_version_publish_in_remote); - UpsertRTValue(GetModuleIdentifier(), - "version.latest_prerelease_version_from_remote", - version.latest_prerelease_version_from_remote); - UpsertRTValue(GetModuleIdentifier(), "version.need_upgrade", - version.NeedUpgrade()); - UpsertRTValue(GetModuleIdentifier(), "version.current_version_released", - version.CurrentVersionReleased()); - UpsertRTValue(GetModuleIdentifier(), "version.current_a_withdrawn_version", - version.VersionWithdrawn()); - UpsertRTValue(GetModuleIdentifier(), "version.loading_done", - version.loading_done); - MODULE_LOG_DEBUG("register software information to rt done"); -} -} // namespace GpgFrontend::Module::Integrated::VersionCheckingModule diff --git a/src/module/integrated/gnupg_info_gathering_module/CMakeLists.txt b/src/module/mods/gpg_info/CMakeLists.txt index 48dbd0de..6660f5cb 100644 --- a/src/module/integrated/gnupg_info_gathering_module/CMakeLists.txt +++ b/src/module/mods/gpg_info/CMakeLists.txt @@ -23,31 +23,54 @@ # # SPDX-License-Identifier: GPL-3.0-or-later -# com.bktus.gpgfrontend.module.integrated.gnupg-info-gathering +# com.bktus.gpgfrontend.module.integrated.gnupg_info_gathering aux_source_directory(. INTEGRATED_MODULE_SOURCE) # define libgpgfrontend_module -add_library(gpgfrontend_integrated_module_gnupg_info_gathering SHARED ${INTEGRATED_MODULE_SOURCE}) -set(_export_file "${CMAKE_CURRENT_SOURCE_DIR}/GpgFrontendModuleExport.h") -generate_export_header(gpgfrontend_integrated_module_gnupg_info_gathering EXPORT_FILE_NAME "${_export_file}") +add_library(mod_gpg_info SHARED ${INTEGRATED_MODULE_SOURCE}) +set(_export_file "${CMAKE_CURRENT_SOURCE_DIR}/GFModuleExport.h") +generate_export_header(mod_gpg_info + BASE_NAME "GF_MODULE" + EXPORT_FILE_NAME "${_export_file}") + +target_include_directories(mod_gpg_info PRIVATE + ${CMAKE_SOURCE_DIR}/third_party/spdlog/include) + +# set output directory +set_target_properties(mod_gpg_info PROPERTIES + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/mods + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/mods) if (XCODE_BUILD) - set_target_properties(gpgfrontend_integrated_module_gnupg_info_gathering + set_target_properties(mod_gpg_info PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE} LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE} - LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE} + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE} XCODE_ATTRIBUTE_SKIP_INSTALL "Yes" XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "${GPGFRONTEND_XOCDE_CODE_SIGN_IDENTITY}") endif () +if (LINUX AND LINUX_INSTALL_SOFTWARE) + install(TARGETS mod_gpg_info + LIBRARY DESTINATION "${CMAKE_INSTALL_FULL_LIBDIR}/mods/") +endif() + # link sdk -target_link_libraries(gpgfrontend_integrated_module_gnupg_info_gathering PRIVATE - gpgfrontend_module_sdk) +target_link_libraries(mod_gpg_info PRIVATE + gpgfrontend_module_sdk) + +if(GPGFRONTEND_QT5_BUILD) + # link Qt core + target_link_libraries(mod_gpg_info PRIVATE Qt5::Core) +else() + # link Qt core + target_link_libraries(mod_gpg_info PRIVATE Qt6::Core) +endif() # property -set_property(TARGET gpgfrontend_integrated_module_gnupg_info_gathering PROPERTY AUTOMOC ON) +set_property(TARGET mod_gpg_info PROPERTY AUTOMOC ON) # using std c++ 17 -target_compile_features(gpgfrontend_integrated_module_gnupg_info_gathering PRIVATE cxx_std_17)
\ No newline at end of file +target_compile_features(mod_gpg_info PRIVATE cxx_std_17)
\ No newline at end of file diff --git a/src/module/mods/gpg_info/GFModuleExport.h b/src/module/mods/gpg_info/GFModuleExport.h new file mode 100644 index 00000000..a1fc1053 --- /dev/null +++ b/src/module/mods/gpg_info/GFModuleExport.h @@ -0,0 +1,42 @@ + +#ifndef GF_MODULE_EXPORT_H +#define GF_MODULE_EXPORT_H + +#ifdef GF_MODULE_STATIC_DEFINE +# define GF_MODULE_EXPORT +# define GF_MODULE_NO_EXPORT +#else +# ifndef GF_MODULE_EXPORT +# ifdef mod_gpg_info_EXPORTS + /* We are building this library */ +# define GF_MODULE_EXPORT __attribute__((visibility("default"))) +# else + /* We are using this library */ +# define GF_MODULE_EXPORT __attribute__((visibility("default"))) +# endif +# endif + +# ifndef GF_MODULE_NO_EXPORT +# define GF_MODULE_NO_EXPORT __attribute__((visibility("hidden"))) +# endif +#endif + +#ifndef GF_MODULE_DEPRECATED +# define GF_MODULE_DEPRECATED __attribute__ ((__deprecated__)) +#endif + +#ifndef GF_MODULE_DEPRECATED_EXPORT +# define GF_MODULE_DEPRECATED_EXPORT GF_MODULE_EXPORT GF_MODULE_DEPRECATED +#endif + +#ifndef GF_MODULE_DEPRECATED_NO_EXPORT +# define GF_MODULE_DEPRECATED_NO_EXPORT GF_MODULE_NO_EXPORT GF_MODULE_DEPRECATED +#endif + +#if 0 /* DEFINE_NO_DEPRECATED */ +# ifndef GF_MODULE_NO_DEPRECATED +# define GF_MODULE_NO_DEPRECATED +# endif +#endif + +#endif /* GF_MODULE_EXPORT_H */ diff --git a/src/module/mods/gpg_info/GnuPGInfoGatheringModule.cpp b/src/module/mods/gpg_info/GnuPGInfoGatheringModule.cpp new file mode 100644 index 00000000..8d400c89 --- /dev/null +++ b/src/module/mods/gpg_info/GnuPGInfoGatheringModule.cpp @@ -0,0 +1,526 @@ +/** + * Copyright (C) 2021 Saturneric <[email protected]> + * + * 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. + * + * GpgFrontend 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 GpgFrontend. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from + * the gpg4usb project, which is under GPL-3.0-or-later. + * + * All the source code of GpgFrontend was modified and released by + * Saturneric <[email protected]> starting on May 12, 2021. + * + * SPDX-License-Identifier: GPL-3.0-or-later + * + */ + +#include "GnuPGInfoGatheringModule.h" + +#include <GFSDKBasic.h> +#include <GFSDKBuildInfo.h> +#include <GFSDKLog.h> +#include <spdlog/spdlog.h> + +// qt +#include <QCryptographicHash> +#include <QFileInfo> +#include <QJsonDocument> +#include <QString> + +// c++ +#include <optional> + +#include "GpgInfo.h" + +template <> +struct fmt::formatter<QString> { + // Parses format specifications. + constexpr auto parse(format_parse_context &ctx) -> decltype(ctx.begin()) { + return ctx.begin(); + } + + // Formats the QString qstr and writes it to the output. + template <typename FormatContext> + auto format(const QString &qstr, FormatContext &ctx) const + -> decltype(ctx.out()) { + // Convert QString to UTF-8 QString (to handle Unicode characters + // correctly) + QByteArray utf8_array = qstr.toUtf8(); + return fmt::format_to(ctx.out(), "{}", utf8_array.constData()); + } +}; + +template <> +struct fmt::formatter<QByteArray> { + // Parses format specifications. + constexpr auto parse(format_parse_context &ctx) -> decltype(ctx.begin()) { + return ctx.begin(); + } + + // Formats the QString qstr and writes it to the output. + template <typename FormatContext> + auto format(const QByteArray &qarray, FormatContext &ctx) const + -> decltype(ctx.out()) { + // Convert QString to UTF-8 QString (to handle Unicode characters + // correctly) + return fmt::format_to(ctx.out(), "{}", qarray.constData()); + } +}; + +extern auto CalculateBinaryChacksum(const QString &path) + -> std::optional<QString>; + +extern void GetGpgComponentInfos(void *, int, const char *, const char *); + +extern void GetGpgDirectoryInfos(void *, int, const char *, const char *); + +extern void GetGpgOptionInfos(void *, int, const char *, const char *); + +using Context = struct { + QString gpgme_version; + QString gpgconf_path; + GpgComponentInfo component_info; +}; + +auto GFGetModuleGFSDKVersion() -> const char * { + return GFModuleStrDup(GF_SDK_VERSION_STR); +} + +auto GFGetModuleQtEnvVersion() -> const char * { + return GFModuleStrDup(QT_VERSION_STR); +} + +auto GFGetModuleID() -> const char * { + return GFModuleStrDup("com.bktus.gpgfrontend.module.gnupg_info_gathering"); +} + +auto GFGetModuleVersion() -> const char * { return GFModuleStrDup("1.0.0"); } + +auto GFGetModuleMetaData() -> GFModuleMetaData * { + auto *p_meta = static_cast<GFModuleMetaData *>( + GFAllocateMemory(sizeof(GFModuleMetaData))); + auto *h_meta = p_meta; + + p_meta->key = "Name"; + p_meta->value = "GatherGnupgInfo"; + p_meta->next = static_cast<GFModuleMetaData *>( + GFAllocateMemory(sizeof(GFModuleMetaData))); + p_meta = p_meta->next; + + p_meta->key = "Description"; + p_meta->value = "Try gathering gnupg informations"; + p_meta->next = static_cast<GFModuleMetaData *>( + GFAllocateMemory(sizeof(GFModuleMetaData))); + p_meta = p_meta->next; + + p_meta->key = "Author"; + p_meta->value = "Saturneric"; + p_meta->next = nullptr; + return h_meta; +} + +auto GFRegisterModule() -> int { + GFModuleLogDebug("gnupg info gathering module registering"); + return 0; +} + +auto GFActiveModule() -> int { + GFModuleLogDebug("gnupg info gathering module activating"); + GFModuleListenEvent(GFGetModuleID(), + GFModuleStrDup("REQUEST_GATHERING_GNUPG_INFO")); + return 0; +} + +auto GFExecuteModule(GFModuleEvent *event) -> int { + GFModuleLogDebug( + fmt::format("gnupg info gathering module executing, event id: {}", + event->id) + .c_str()); + + GFModuleLogDebug("start to load extra info at module gnupginfogathering..."); + + const auto *const gpgme_version = GFModuleRetrieveRTValueOrDefault( + GFModuleStrDup("core"), GFModuleStrDup("gpgme.version"), + GFModuleStrDup("0.0.0")); + GFModuleLogDebug( + fmt::format("got gpgme version from rt: {}", gpgme_version).c_str()); + + const auto *const gpgconf_path = GFModuleRetrieveRTValueOrDefault( + GFModuleStrDup("core"), GFModuleStrDup("gpgme.ctx.gpgconf_path"), + GFModuleStrDup("")); + GFModuleLogDebug( + fmt::format("got gpgconf path from rt: {}", gpgconf_path).c_str()); + + auto context = Context{gpgme_version, gpgconf_path}; + + // get all components + const char *argv[] = {GFModuleStrDup("--list-components")}; + GFExecuteCommandSync(gpgconf_path, 1, argv, GetGpgComponentInfos, &context); + GFModuleLogDebug("load gnupg component info done."); + +#ifdef QT5_BUILD + QVector<GFCommandExecuteContext> exec_contexts; +#else + QList<GFCommandExecuteContext> exec_contexts; +#endif + + const char **argv_0 = + static_cast<const char **>(GFAllocateMemory(sizeof(const char *))); + argv_0[0] = GFModuleStrDup("--list-dirs"); + + exec_contexts.push_back( + {gpgconf_path, 1, argv_0, GetGpgDirectoryInfos, nullptr}); + + char **components_c_array; + int ret = GFModuleListRTChildKeys( + GFGetModuleID(), GFModuleStrDup("gnupg.components"), &components_c_array); + if (components_c_array == nullptr || ret == 0) return -1; + + QStringList components; + auto *p_a = components_c_array; + for (int i = 0; i < ret; i++) components.append(QString::fromUtf8(p_a[i])); + + for (const auto &component : components) { + const auto *component_info_json = GFModuleRetrieveRTValueOrDefault( + GFGetModuleID(), + GFModuleStrDup(QString("gnupg.components.%1").arg(component).toUtf8()), + nullptr); + + if (component_info_json == nullptr) continue; + + auto jsonlized_component_info = + QJsonDocument::fromJson(component_info_json); + assert(jsonlized_component_info.isObject()); + + auto component_info = GpgComponentInfo(jsonlized_component_info.object()); + GFModuleLogDebug(fmt::format("gpgconf check options ready, " + "component: {}", + component_info.name) + .c_str()); + + if (component_info.name == "gpgme" || component_info.name == "gpgconf") { + continue; + } + + auto *context = new (GFAllocateMemory(sizeof(Context))) + Context{gpgme_version, gpgconf_path, component_info}; + + const char **argv_0 = + static_cast<const char **>(GFAllocateMemory(sizeof(const char *) * 2)); + argv_0[0] = GFModuleStrDup("--list-options"), + argv_0[1] = GFModuleStrDup(component_info.name.toUtf8()); + exec_contexts.push_back( + {gpgconf_path, 2, argv_0, GetGpgOptionInfos, context}); + } + + GFExecuteCommandBatchSync(static_cast<int32_t>(exec_contexts.size()), + exec_contexts.constData()); + GFModuleUpsertRTValueBool(GFGetModuleID(), + GFModuleStrDup("gnupg.gathering_done"), 1); + + char **event_argv = + static_cast<char **>(GFAllocateMemory(sizeof(char **) * 1)); + event_argv[0] = GFModuleStrDup("0"); + + GFModuleTriggerModuleEventCallback(event, GFGetModuleID(), 1, event_argv); + + GFModuleLogDebug("gnupg external info gathering done"); + return 0; +} + +auto GFDeactiveModule() -> int { return 0; } + +auto GFUnregisterModule() -> int { + GFModuleLogDebug("gnupg info gathering module unregistering"); + return 0; +} + +auto CalculateBinaryChacksum(const QString &path) -> std::optional<QString> { + // check file info and access rights + QFileInfo info(path); + if (!info.exists() || !info.isFile() || !info.isReadable()) { + GFModuleLogError(fmt::format("get info for file {} error, exists: {}", + info.filePath(), info.exists()) + .c_str()); + return {}; + } + + // open and read file + QFile f(info.filePath()); + if (!f.open(QIODevice::ReadOnly)) { + GFModuleLogError(fmt::format("open {} to calculate checksum error: {}", + path.toStdString(), + f.errorString().toStdString()) + .c_str()); + return {}; + } + + QCryptographicHash hash_sha(QCryptographicHash::Sha256); + + // read data by chunks + const qint64 buffer_size = 8192; // Define a suitable buffer size + while (!f.atEnd()) { + QByteArray const buffer = f.read(buffer_size); + if (buffer.isEmpty()) { + GFModuleLogError(fmt::format("error reading file {} during " + "checksum calculation", + path.toStdString()) + .c_str()); + return {}; + } + hash_sha.addData(buffer); + } + + // close the file + f.close(); + + // return the first 6 characters of the SHA-256 hash + // of the file + return QString(hash_sha.result().toHex()).left(6); +} + +void GetGpgComponentInfos(void *data, int exit_code, const char *out, + const char *err) { + auto *context = reinterpret_cast<Context *>(data); + auto p_out = QString::fromUtf8(out); + auto p_err = QString::fromUtf8(err); + + GFModuleLogDebug(fmt::format("gpgconf components exit_code: {} " + "process stdout size: {}", + exit_code, p_out.size()) + .c_str()); + + if (exit_code != 0) { + GFModuleLogError(fmt::format("gpgconf execute error, process " + "stderr: {}, " + "process stdout: {}", + p_err, p_out) + .c_str()); + return; + } + + std::vector<GpgComponentInfo> component_infos; + GpgComponentInfo c_i_gpgme; + c_i_gpgme.name = "gpgme"; + c_i_gpgme.desc = "GPG Made Easy"; + c_i_gpgme.version = context->gpgme_version; + c_i_gpgme.path = "Embedded In"; + c_i_gpgme.binary_checksum = "/"; + + GpgComponentInfo c_i_gpgconf; + c_i_gpgconf.name = "gpgconf"; + c_i_gpgconf.desc = "GPG Configure"; + c_i_gpgconf.version = "/"; + c_i_gpgconf.path = context->gpgconf_path; + auto gpgconf_binary_checksum = CalculateBinaryChacksum(context->gpgconf_path); + c_i_gpgconf.binary_checksum = + (gpgconf_binary_checksum.has_value() ? gpgconf_binary_checksum.value() + : QString("/")); + + component_infos.push_back(c_i_gpgme); + component_infos.push_back(c_i_gpgconf); + + auto const jsonlized_gpgme_component_info = c_i_gpgme.Json(); + auto const jsonlized_gpgconf_component_info = c_i_gpgconf.Json(); + GFModuleUpsertRTValue( + GFGetModuleID(), GFModuleStrDup("gnupg.components.gpgme"), + GFModuleStrDup(QJsonDocument(jsonlized_gpgme_component_info).toJson())); + GFModuleUpsertRTValue( + GFGetModuleID(), GFModuleStrDup("gnupg.components.gpgconf"), + GFModuleStrDup(QJsonDocument(jsonlized_gpgconf_component_info).toJson())); + + auto line_split_list = p_out.split("\n"); + + for (const auto &line : line_split_list) { + auto info_split_list = line.split(":"); + + if (info_split_list.size() != 3) continue; + + auto component_name = info_split_list[0].trimmed(); + auto component_desc = info_split_list[1].trimmed(); + auto component_path = info_split_list[2].trimmed(); + +#ifdef WINDOWS + // replace some special substrings on windows + // platform + component_path.replace("%3a", ":"); +#endif + + auto binary_checksum = CalculateBinaryChacksum(component_path); + + GFModuleLogDebug( + fmt::format("gnupg component name: {} desc: " + "{} checksum: {} path: {} ", + component_name, component_desc, + binary_checksum.has_value() ? binary_checksum.value() : "/", + component_path) + .c_str()); + + QString version = "/"; + + if (component_name == "gpg") { + version = GFModuleRetrieveRTValueOrDefault( + GFModuleStrDup("core"), GFModuleStrDup("gpgme.ctx.gnupg_version"), + GFModuleStrDup("2.0.0")); + } + if (component_name == "gpg-agent") { + GFModuleUpsertRTValue(GFGetModuleID(), + GFModuleStrDup("gnupg.gpg_agent_path"), + GFModuleStrDup(QString(component_path).toUtf8())); + } + if (component_name == "dirmngr") { + GFModuleUpsertRTValue(GFGetModuleID(), + GFModuleStrDup("gnupg.dirmngr_path"), + GFModuleStrDup(QString(component_path).toUtf8())); + } + if (component_name == "keyboxd") { + GFModuleUpsertRTValue(GFGetModuleID(), + GFModuleStrDup("gnupg.keyboxd_path"), + GFModuleStrDup(QString(component_path).toUtf8())); + } + + { + GpgComponentInfo c_i; + c_i.name = component_name; + c_i.desc = component_desc; + c_i.version = version; + c_i.path = component_path; + c_i.binary_checksum = + (binary_checksum.has_value() ? binary_checksum.value() + : QString("/")); + + auto const jsonlized_component_info = c_i.Json(); + GFModuleUpsertRTValue( + GFGetModuleID(), + GFModuleStrDup( + QString("gnupg.components.%1").arg(component_name).toUtf8()), + GFModuleStrDup(QJsonDocument(jsonlized_component_info).toJson())); + + component_infos.push_back(c_i); + } + + GFModuleLogDebug("load gnupg component info actually done."); + } +} + +void GetGpgDirectoryInfos(void *, int exit_code, const char *out, + const char *err) { + if (exit_code != 0) return; + + auto p_out = QString::fromUtf8(out); + auto p_err = QString::fromUtf8(err); + auto line_split_list = p_out.split("\n"); + + for (const auto &line : line_split_list) { + auto info_split_list = line.split(":"); + GFModuleLogDebug(fmt::format("gpgconf direcrotries info line: " + "{} info size: {}", + line, info_split_list.size()) + .c_str()); + + if (info_split_list.size() != 2) continue; + + auto configuration_name = info_split_list[0].trimmed(); + auto configuration_value = info_split_list[1].trimmed(); + +#ifdef WINDOWS + // replace some special substrings on windows + // platform + configuration_value.replace("%3a", ":"); +#endif + + // record gnupg home path + if (configuration_name == "homedir") { + GFModuleUpsertRTValue(GFGetModuleID(), GFModuleStrDup("gnupg.home_path"), + GFModuleStrDup(configuration_value.toUtf8())); + } + + GFModuleUpsertRTValue( + GFGetModuleID(), + GFModuleStrDup( + QString("gnupg.dirs.%1").arg(configuration_name).toUtf8()), + GFModuleStrDup(configuration_value.toUtf8())); + } +} + +void GetGpgOptionInfos(void *data, int exit_code, const char *out, + const char *err) { + if (exit_code != 0) return; + + auto p_out = QString::fromUtf8(out); + auto p_err = QString::fromUtf8(err); + auto *context = reinterpret_cast<Context *>(data); + auto component_name = context->component_info.name; + + GFModuleLogDebug(fmt::format("gpgconf {} avaliable options " + "exit_code: {} process stdout " + "size: {} ", + component_name, exit_code, p_out.size()) + .c_str()); + + std::vector<GpgOptionsInfo> options_infos; + + auto line_split_list = p_out.split("\n"); + + for (const auto &line : line_split_list) { + auto info_split_list = line.split(":"); + + GFModuleLogDebug(fmt::format("component {} avaliable options " + "line: {} info size: {}", + component_name, line, info_split_list.size()) + .c_str()); + + if (info_split_list.size() < 10) continue; + + // The format of each line is: + // name:flags:level:description:type:alt-type:argname:default:argdef:value + + auto option_name = info_split_list[0].trimmed(); + auto option_flags = info_split_list[1].trimmed(); + auto option_level = info_split_list[2].trimmed(); + auto option_desc = info_split_list[3].trimmed(); + auto option_type = info_split_list[4].trimmed(); + auto option_alt_type = info_split_list[5].trimmed(); + auto option_argname = info_split_list[6].trimmed(); + auto option_default = info_split_list[7].trimmed(); + auto option_argdef = info_split_list[8].trimmed(); + auto option_value = info_split_list[9].trimmed(); + + GpgOptionsInfo info; + info.name = option_name; + info.flags = option_flags; + info.level = option_level; + info.description = option_desc; + info.type = option_type; + info.alt_type = option_alt_type; + info.argname = option_argname; + info.default_value = option_default; + info.argdef = option_argdef; + info.value = option_value; + + auto const jsonlized_option_info = info.Json(); + GFModuleUpsertRTValue( + GFGetModuleID(), + GFModuleStrDup(QString("gnupg.components.%1.options.%2") + .arg(component_name) + .arg(option_name) + .toUtf8()), + GFModuleStrDup(QJsonDocument(jsonlized_option_info).toJson())); + options_infos.push_back(info); + } + + context->~Context(); + GFFreeMemory(context); +} diff --git a/src/module/mods/gpg_info/GnuPGInfoGatheringModule.h b/src/module/mods/gpg_info/GnuPGInfoGatheringModule.h new file mode 100644 index 00000000..35ee4ac3 --- /dev/null +++ b/src/module/mods/gpg_info/GnuPGInfoGatheringModule.h @@ -0,0 +1,56 @@ +/** + * Copyright (C) 2021 Saturneric <[email protected]> + * + * 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. + * + * GpgFrontend 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 GpgFrontend. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from + * the gpg4usb project, which is under GPL-3.0-or-later. + * + * All the source code of GpgFrontend was modified and released by + * Saturneric <[email protected]> starting on May 12, 2021. + * + * SPDX-License-Identifier: GPL-3.0-or-later + * + */ + +#pragma once + +#include <GFSDKModule.h> + +#include "GFModuleExport.h" + +extern "C" { + +auto GF_MODULE_EXPORT GFGetModuleGFSDKVersion() -> const char *; + +auto GF_MODULE_EXPORT GFGetModuleQtEnvVersion() -> const char *; + +auto GF_MODULE_EXPORT GFGetModuleID() -> const char *; + +auto GF_MODULE_EXPORT GFGetModuleVersion() -> const char *; + +auto GF_MODULE_EXPORT GFGetModuleMetaData() -> GFModuleMetaData *; + +auto GF_MODULE_EXPORT GFRegisterModule() -> int; + +auto GF_MODULE_EXPORT GFActiveModule() -> int; + +auto GF_MODULE_EXPORT GFExecuteModule(GFModuleEvent *) -> int; + +auto GF_MODULE_EXPORT GFDeactiveModule() -> int; + +auto GF_MODULE_EXPORT GFUnregisterModule() -> int; +}; diff --git a/src/module/integrated/gnupg_info_gathering_module/GpgInfo.cpp b/src/module/mods/gpg_info/GpgInfo.cpp index 2015bc0a..680f4a8a 100644 --- a/src/module/integrated/gnupg_info_gathering_module/GpgInfo.cpp +++ b/src/module/mods/gpg_info/GpgInfo.cpp @@ -26,9 +26,7 @@ * */ -#include "module/integrated/gnupg_info_gathering_module/GpgInfo.h" - -namespace GpgFrontend::Module::Integrated::GnuPGInfoGatheringModule { +#include "GpgInfo.h" GpgOptionsInfo::GpgOptionsInfo(const QJsonObject &j) { if (const auto v = j["name"]; v.isString()) name = v.toString(); @@ -38,8 +36,9 @@ GpgOptionsInfo::GpgOptionsInfo(const QJsonObject &j) { if (const auto v = j["type"]; v.isString()) type = v.toString(); if (const auto v = j["alt_type"]; v.isString()) alt_type = v.toString(); if (const auto v = j["argname"]; v.isString()) argname = v.toString(); - if (const auto v = j["default_value"]; v.isString()) + if (const auto v = j["default_value"]; v.isString()) { default_value = v.toString(); + } if (const auto v = j["argdef"]; v.isString()) argdef = v.toString(); if (const auto v = j["value"]; v.isString()) value = v.toString(); } @@ -74,7 +73,7 @@ GpgComponentInfo::GpgComponentInfo(const QJsonObject &j) { if (const auto v = j["desc"]; v.isString()) desc = v.toString(); if (const auto v = j["version"]; v.isString()) version = v.toString(); if (const auto v = j["path"]; v.isString()) path = v.toString(); - if (const auto v = j["binary_checksum"]; v.isString()) + if (const auto v = j["binary_checksum"]; v.isString()) { binary_checksum = v.toString(); + } } -} // namespace GpgFrontend::Module::Integrated::GnuPGInfoGatheringModule diff --git a/src/module/integrated/gnupg_info_gathering_module/GpgInfo.h b/src/module/mods/gpg_info/GpgInfo.h index fb12b811..1aacc207 100644 --- a/src/module/integrated/gnupg_info_gathering_module/GpgInfo.h +++ b/src/module/mods/gpg_info/GpgInfo.h @@ -28,7 +28,10 @@ #pragma once -namespace GpgFrontend::Module::Integrated::GnuPGInfoGatheringModule { +#include <QJsonObject> +#include <QString> +#include <map> + /** * @brief Use to record some info about gnupg * @@ -83,5 +86,3 @@ struct GpgOptionsInfo { [[nodiscard]] auto Json() const -> QJsonObject; }; - -} // namespace GpgFrontend::Module::Integrated::GnuPGInfoGatheringModule diff --git a/src/core/log/QtLoggerFmt.h b/src/module/mods/gpg_info/QtLoggerFmt.h index e7ac2c82..23997465 100644 --- a/src/core/log/QtLoggerFmt.h +++ b/src/module/mods/gpg_info/QtLoggerFmt.h @@ -28,6 +28,10 @@ #pragma once +#include <spdlog/spdlog.h> + +#include <QString> + template <> struct fmt::formatter<QString> { // Parses format specifications. diff --git a/src/module/integrated/version_checking_module/CMakeLists.txt b/src/module/mods/ver_check/CMakeLists.txt index 76459b0e..b07a499a 100644 --- a/src/module/integrated/version_checking_module/CMakeLists.txt +++ b/src/module/mods/ver_check/CMakeLists.txt @@ -23,39 +23,54 @@ # # SPDX-License-Identifier: GPL-3.0-or-later -# com.bktus.gpgfrontend.module.integrated.version-checking +# com.bktus.gpgfrontend.module.integrated.version_checking aux_source_directory(. INTEGRATED_MODULE_SOURCE) # define libgpgfrontend_module -add_library(gpgfrontend_integrated_module_version_checking SHARED ${INTEGRATED_MODULE_SOURCE}) -set(_export_file "${CMAKE_CURRENT_SOURCE_DIR}/GpgFrontendModuleExport.h") -generate_export_header(gpgfrontend_integrated_module_version_checking EXPORT_FILE_NAME "${_export_file}") +add_library(mod_ver_check SHARED ${INTEGRATED_MODULE_SOURCE}) +set(_export_file "${CMAKE_CURRENT_SOURCE_DIR}/GFModuleExport.h") +generate_export_header(mod_ver_check + BASE_NAME "GF_MODULE" + EXPORT_FILE_NAME "${_export_file}") + +target_include_directories(mod_ver_check PRIVATE + ${CMAKE_SOURCE_DIR}/third_party/spdlog/include) + +# set output directory +set_target_properties(mod_ver_check PROPERTIES + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/mods + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/mods) if (XCODE_BUILD) - set_target_properties(gpgfrontend_integrated_module_version_checking + set_target_properties(mod_ver_check PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE} LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE} - LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE} + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE} XCODE_ATTRIBUTE_SKIP_INSTALL "Yes" XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "${GPGFRONTEND_XOCDE_CODE_SIGN_IDENTITY}") endif () +if (LINUX AND LINUX_INSTALL_SOFTWARE) + install(TARGETS mod_ver_check + LIBRARY DESTINATION "${CMAKE_INSTALL_FULL_LIBDIR}/mods/") +endif() + # link sdk -target_link_libraries(gpgfrontend_integrated_module_version_checking PRIVATE - gpgfrontend_module_sdk) +target_link_libraries(mod_ver_check PRIVATE + gpgfrontend_module_sdk) if(GPGFRONTEND_QT5_BUILD) # link Qt - target_link_libraries(gpgfrontend_integrated_module_version_checking PUBLIC Qt5::Network) + target_link_libraries(mod_ver_check PUBLIC Qt5::Core Qt5::Network) else() # link Qt - target_link_libraries(gpgfrontend_integrated_module_version_checking PUBLIC Qt6::Network) + target_link_libraries(mod_ver_check PUBLIC Qt6::Core Qt6::Network) endif() # property -set_property(TARGET gpgfrontend_integrated_module_version_checking PROPERTY AUTOMOC ON) +set_property(TARGET mod_ver_check PROPERTY AUTOMOC ON) # using std c++ 17 -target_compile_features(gpgfrontend_integrated_module_version_checking PRIVATE cxx_std_17)
\ No newline at end of file +target_compile_features(mod_ver_check PRIVATE cxx_std_17)
\ No newline at end of file diff --git a/src/module/mods/ver_check/GFModuleExport.h b/src/module/mods/ver_check/GFModuleExport.h new file mode 100644 index 00000000..ce663b5f --- /dev/null +++ b/src/module/mods/ver_check/GFModuleExport.h @@ -0,0 +1,42 @@ + +#ifndef GF_MODULE_EXPORT_H +#define GF_MODULE_EXPORT_H + +#ifdef GF_MODULE_STATIC_DEFINE +# define GF_MODULE_EXPORT +# define GF_MODULE_NO_EXPORT +#else +# ifndef GF_MODULE_EXPORT +# ifdef mod_ver_check_EXPORTS + /* We are building this library */ +# define GF_MODULE_EXPORT __attribute__((visibility("default"))) +# else + /* We are using this library */ +# define GF_MODULE_EXPORT __attribute__((visibility("default"))) +# endif +# endif + +# ifndef GF_MODULE_NO_EXPORT +# define GF_MODULE_NO_EXPORT __attribute__((visibility("hidden"))) +# endif +#endif + +#ifndef GF_MODULE_DEPRECATED +# define GF_MODULE_DEPRECATED __attribute__ ((__deprecated__)) +#endif + +#ifndef GF_MODULE_DEPRECATED_EXPORT +# define GF_MODULE_DEPRECATED_EXPORT GF_MODULE_EXPORT GF_MODULE_DEPRECATED +#endif + +#ifndef GF_MODULE_DEPRECATED_NO_EXPORT +# define GF_MODULE_DEPRECATED_NO_EXPORT GF_MODULE_NO_EXPORT GF_MODULE_DEPRECATED +#endif + +#if 0 /* DEFINE_NO_DEPRECATED */ +# ifndef GF_MODULE_NO_DEPRECATED +# define GF_MODULE_NO_DEPRECATED +# endif +#endif + +#endif /* GF_MODULE_EXPORT_H */ diff --git a/src/module/mods/ver_check/QtLoggerFmt.h b/src/module/mods/ver_check/QtLoggerFmt.h new file mode 100644 index 00000000..23997465 --- /dev/null +++ b/src/module/mods/ver_check/QtLoggerFmt.h @@ -0,0 +1,68 @@ +/** + * Copyright (C) 2021 Saturneric <[email protected]> + * + * 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. + * + * GpgFrontend 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 GpgFrontend. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from + * the gpg4usb project, which is under GPL-3.0-or-later. + * + * All the source code of GpgFrontend was modified and released by + * Saturneric <[email protected]> starting on May 12, 2021. + * + * SPDX-License-Identifier: GPL-3.0-or-later + * + */ + +#pragma once + +#include <spdlog/spdlog.h> + +#include <QString> + +template <> +struct fmt::formatter<QString> { + // Parses format specifications. + constexpr auto parse(format_parse_context& ctx) -> decltype(ctx.begin()) { + return ctx.begin(); + } + + // Formats the QString qstr and writes it to the output. + template <typename FormatContext> + auto format(const QString& qstr, FormatContext& ctx) const + -> decltype(ctx.out()) { + // Convert QString to UTF-8 QString (to handle Unicode characters + // correctly) + QByteArray utf8_array = qstr.toUtf8(); + return fmt::format_to(ctx.out(), "{}", utf8_array.constData()); + } +}; + +template <> +struct fmt::formatter<QByteArray> { + // Parses format specifications. + constexpr auto parse(format_parse_context& ctx) -> decltype(ctx.begin()) { + return ctx.begin(); + } + + // Formats the QString qstr and writes it to the output. + template <typename FormatContext> + auto format(const QByteArray& qarray, FormatContext& ctx) const + -> decltype(ctx.out()) { + // Convert QString to UTF-8 QString (to handle Unicode characters + // correctly) + return fmt::format_to(ctx.out(), "{}", qarray.constData()); + } +}; diff --git a/src/module/mods/ver_check/SoftwareVersion.cpp b/src/module/mods/ver_check/SoftwareVersion.cpp new file mode 100644 index 00000000..cd864195 --- /dev/null +++ b/src/module/mods/ver_check/SoftwareVersion.cpp @@ -0,0 +1,100 @@ +/** + * Copyright (C) 2021 Saturneric <[email protected]> + * + * 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. + * + * GpgFrontend 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 GpgFrontend. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from + * the gpg4usb project, which is under GPL-3.0-or-later. + * + * All the source code of GpgFrontend was modified and released by + * Saturneric <[email protected]> starting on May 12, 2021. + * + * SPDX-License-Identifier: GPL-3.0-or-later + * + */ + +#include "SoftwareVersion.h" + +#include <GFSDKBasic.h> +#include <GFSDKExtra.h> +#include <GFSDKLog.h> +#include <spdlog/spdlog.h> + +#include <QString> + +template <> +struct fmt::formatter<QString> { + // Parses format specifications. + constexpr auto parse(format_parse_context& ctx) -> decltype(ctx.begin()) { + return ctx.begin(); + } + + // Formats the QString qstr and writes it to the output. + template <typename FormatContext> + auto format(const QString& qstr, FormatContext& ctx) const + -> decltype(ctx.out()) { + // Convert QString to UTF-8 QString (to handle Unicode characters + // correctly) + QByteArray utf8_array = qstr.toUtf8(); + return fmt::format_to(ctx.out(), "{}", utf8_array.constData()); + } +}; + +template <> +struct fmt::formatter<QByteArray> { + // Parses format specifications. + constexpr auto parse(format_parse_context& ctx) -> decltype(ctx.begin()) { + return ctx.begin(); + } + + // Formats the QString qstr and writes it to the output. + template <typename FormatContext> + auto format(const QByteArray& qarray, FormatContext& ctx) const + -> decltype(ctx.out()) { + // Convert QString to UTF-8 QString (to handle Unicode characters + // correctly) + return fmt::format_to(ctx.out(), "{}", qarray.constData()); + } +}; + +auto SoftwareVersion::NeedUpgrade() const -> bool { + GFModuleLogDebug( + fmt::format( + "compair version current {} latest {}, result {}", current_version, + latest_version, + GFCompareSoftwareVersion(GFModuleStrDup(current_version.toUtf8()), + GFModuleStrDup(latest_version.toUtf8()))) + .c_str()); + + GFModuleLogDebug(fmt::format("load done: {}, pre-release: {}, draft: {}", + loading_done, + latest_prerelease_version_from_remote, + latest_draft_from_remote) + .c_str()); + return loading_done && !latest_prerelease_version_from_remote && + !latest_draft_from_remote && + GFCompareSoftwareVersion(GFModuleStrDup(current_version.toUtf8()), + GFModuleStrDup(latest_version.toUtf8())) < 0; +} + +auto SoftwareVersion::VersionWithdrawn() const -> bool { + return loading_done && !current_version_publish_in_remote && + current_version_is_a_prerelease && !current_version_is_drafted; +} + +auto SoftwareVersion::CurrentVersionReleased() const -> bool { + return loading_done && current_version_publish_in_remote; +}
\ No newline at end of file diff --git a/src/module/integrated/version_checking_module/SoftwareVersion.h b/src/module/mods/ver_check/SoftwareVersion.h index 43f718fa..6b05d413 100644 --- a/src/module/integrated/version_checking_module/SoftwareVersion.h +++ b/src/module/mods/ver_check/SoftwareVersion.h @@ -28,9 +28,8 @@ #pragma once -#include <module/sdk/GpgFrontendModuleSDK.h> +#include <QString> -namespace GpgFrontend::Module::Integrated::VersionCheckingModule { /** * @brief * @@ -53,7 +52,7 @@ struct SoftwareVersion { * @return true * @return false */ - [[nodiscard]] bool InfoValid() const { return loading_done; } + [[nodiscard]] auto InfoValid() const -> bool { return loading_done; } /** * @brief @@ -61,7 +60,7 @@ struct SoftwareVersion { * @return true * @return false */ - [[nodiscard]] bool NeedUpgrade() const; + [[nodiscard]] auto NeedUpgrade() const -> bool; /** * @brief @@ -69,7 +68,7 @@ struct SoftwareVersion { * @return true * @return false */ - [[nodiscard]] bool VersionWithdrawn() const; + [[nodiscard]] auto VersionWithdrawn() const -> bool; /** * @brief @@ -77,9 +76,8 @@ struct SoftwareVersion { * @return true * @return false */ - [[nodiscard]] bool CurrentVersionReleased() const; + [[nodiscard]] auto CurrentVersionReleased() const -> bool; private: - static int version_compare(const QString& a, const QString& b); + static auto version_compare(const QString& a, const QString& b) -> int; }; -} // namespace GpgFrontend::Module::Integrated::VersionCheckingModule diff --git a/src/module/integrated/version_checking_module/VersionCheckTask.cpp b/src/module/mods/ver_check/VersionCheckTask.cpp index 83844af8..5ea9c48e 100644 --- a/src/module/integrated/version_checking_module/VersionCheckTask.cpp +++ b/src/module/mods/ver_check/VersionCheckTask.cpp @@ -28,30 +28,30 @@ #include "VersionCheckTask.h" +#include <GFSDKBasic.h> +#include <GFSDKExtra.h> +#include <GFSDKLog.h> + #include <QMetaType> #include <QtNetwork> -#include "GpgFrontendBuildInfo.h" - -namespace GpgFrontend::Module::Integrated::VersionCheckingModule { - VersionCheckTask::VersionCheckTask() - : Task("version_check_task"), - network_manager_(new QNetworkAccessManager(this)), - current_version_(QString("v") + VERSION_MAJOR + "." + VERSION_MINOR + - "." + VERSION_PATCH) { - HoldOnLifeCycle(true); + : network_manager_(new QNetworkAccessManager(this)), + current_version_(GFProjectVersion()) { qRegisterMetaType<SoftwareVersion>("SoftwareVersion"); version_.current_version = current_version_; } auto VersionCheckTask::Run() -> int { - MODULE_LOG_DEBUG("current project version: {}", current_version_); + GFModuleLogDebug( + fmt::format("current project version: {}", current_version_).c_str()); QString latest_version_url = "https://api.github.com/repos/saturneric/gpgfrontend/releases/latest"; - QNetworkRequest latest_request; - latest_request.setUrl(QUrl(latest_version_url)); + QNetworkRequest latest_request(latest_version_url); + latest_request.setHeader(QNetworkRequest::UserAgentHeader, + GFHttpRequestUserAgent()); + latest_reply_ = network_manager_->get(latest_request); connect(latest_reply_, &QNetworkReply::finished, this, &VersionCheckTask::slot_parse_latest_version_info); @@ -63,8 +63,9 @@ void VersionCheckTask::slot_parse_latest_version_info() { version_.latest_version = current_version_; version_.loading_done = false; } else if (latest_reply_->error() != QNetworkReply::NoError) { - MODULE_LOG_ERROR("latest version request error: ", - latest_reply_->errorString()); + GFModuleLogError(fmt::format("latest version request error: ", + latest_reply_->errorString()) + .c_str()); version_.latest_version = current_version_; } else { latest_reply_bytes_ = latest_reply_->readAll(); @@ -77,11 +78,15 @@ void VersionCheckTask::slot_parse_latest_version_info() { auto version_match = re.match(latest_version); if (version_match.hasMatch()) { latest_version = version_match.captured(0); - MODULE_LOG_INFO("latest version from github: {}", latest_version); + GFModuleLogInfo(fmt::format("latest released version from github: {}", + latest_version) + .c_str()); } else { latest_version = current_version_; - MODULE_LOG_WARN("latest version unknown, set to current version: {}", - current_version_); + GFModuleLogWarn( + fmt::format("latest version unknown, set to current version: {}", + current_version_) + .c_str()); } bool prerelease = latest_reply_json["prerelease"].toBool(); @@ -94,8 +99,9 @@ void VersionCheckTask::slot_parse_latest_version_info() { version_.publish_date = publish_date; version_.release_note = release_note; } else { - MODULE_LOG_WARN("cannot parse data got from github: {}", - latest_reply_bytes_); + GFModuleLogWarn(fmt::format("cannot parse data got from github: {}", + latest_reply_bytes_) + .c_str()); } } @@ -107,17 +113,20 @@ void VersionCheckTask::slot_parse_latest_version_info() { QString current_version_url = "https://api.github.com/repos/saturneric/gpgfrontend/releases/tags/" + current_version_; - MODULE_LOG_DEBUG("current version info query url: {}", current_version_url); + GFModuleLogDebug( + fmt::format("current version info query url: {}", current_version_url) + .c_str()); + + QNetworkRequest current_request(current_version_url); + current_request.setHeader(QNetworkRequest::UserAgentHeader, + GFHttpRequestUserAgent()); - QNetworkRequest current_request; - current_request.setUrl(QUrl(current_version_url)); current_reply_ = network_manager_->get(current_request); connect(current_reply_, &QNetworkReply::finished, this, &VersionCheckTask::slot_parse_current_version_info); } catch (...) { - MODULE_LOG_ERROR("current version request create error"); - emit SignalTaskShouldEnd(-1); + GFModuleLogError("current version request create error"); } } @@ -127,8 +136,9 @@ void VersionCheckTask::slot_parse_current_version_info() { version_.loading_done = false; } else if (current_reply_->error() != QNetworkReply::NoError) { - MODULE_LOG_ERROR("current version request network error: {}", - current_reply_->errorString()); + GFModuleLogError(fmt::format("current version request network error: {}", + current_reply_->errorString()) + .c_str()); // loading done version_.loading_done = true; @@ -146,17 +156,16 @@ void VersionCheckTask::slot_parse_current_version_info() { // loading done version_.loading_done = true; } else { - MODULE_LOG_WARN("cannot parse data got from github: {}", - current_reply_bytes_); + GFModuleLogWarn(fmt::format("cannot parse data got from github: {}", + current_reply_bytes_) + .c_str()); } } - MODULE_LOG_DEBUG("current version parse done: {}", - version_.current_version_publish_in_remote); + GFModuleLogDebug(fmt::format("current version parse done: {}", + version_.current_version_publish_in_remote) + .c_str()); if (current_reply_ != nullptr) current_reply_->deleteLater(); emit SignalUpgradeVersion(version_); - emit SignalTaskShouldEnd(0); } - -} // namespace GpgFrontend::Module::Integrated::VersionCheckingModule diff --git a/src/module/integrated/version_checking_module/VersionCheckTask.h b/src/module/mods/ver_check/VersionCheckTask.h index f5091819..df801570 100644 --- a/src/module/integrated/version_checking_module/VersionCheckTask.h +++ b/src/module/mods/ver_check/VersionCheckTask.h @@ -29,20 +29,17 @@ #pragma once #include <core/thread/Task.h> -#include <module/sdk/GpgFrontendModuleSDK.h> #include "SoftwareVersion.h" class QNetworkReply; class QNetworkAccessManager; -namespace GpgFrontend::Module::Integrated::VersionCheckingModule { - /** * @brief * */ -class VersionCheckTask : public Thread::Task { +class VersionCheckTask : public QObject { Q_OBJECT public: /** @@ -51,22 +48,21 @@ class VersionCheckTask : public Thread::Task { */ VersionCheckTask(); - signals: - /** * @brief * - * @param version + * @return int */ - void SignalUpgradeVersion(SoftwareVersion version); + auto Run() -> int; + + signals: - protected: /** * @brief - * + * @param version */ - auto Run() -> int override; + void SignalUpgradeVersion(SoftwareVersion version); private slots: @@ -91,6 +87,3 @@ class VersionCheckTask : public Thread::Task { QString current_version_; SoftwareVersion version_; }; - -} // namespace GpgFrontend::Module::Integrated::VersionCheckingModule - // GpgFrontend::Module::Custom::IntegradedModule::VersionCheckingModule diff --git a/src/module/mods/ver_check/VersionCheckingModule.cpp b/src/module/mods/ver_check/VersionCheckingModule.cpp new file mode 100644 index 00000000..35d3b82e --- /dev/null +++ b/src/module/mods/ver_check/VersionCheckingModule.cpp @@ -0,0 +1,164 @@ +/** + * Copyright (C) 2021 Saturneric <[email protected]> + * + * 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. + * + * GpgFrontend 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 GpgFrontend. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from + * the gpg4usb project, which is under GPL-3.0-or-later. + * + * All the source code of GpgFrontend was modified and released by + * Saturneric <[email protected]> starting on May 12, 2021. + * + * SPDX-License-Identifier: GPL-3.0-or-later + * + */ + +#include "VersionCheckingModule.h" + +#include <GFSDKBasic.h> +#include <GFSDKBuildInfo.h> +#include <GFSDKExtra.h> +#include <GFSDKLog.h> +#include <spdlog/spdlog.h> + +#include <QMetaType> +#include <QtNetwork> + +#include "SoftwareVersion.h" +#include "VersionCheckTask.h" + +extern void VersionCheckDone(const SoftwareVersion& version); + +auto GFGetModuleGFSDKVersion() -> const char* { + return GFModuleStrDup(GF_SDK_VERSION_STR); +} + +auto GFGetModuleQtEnvVersion() -> const char* { + return GFModuleStrDup(QT_VERSION_STR); +} + +auto GFGetModuleID() -> const char* { + return GFModuleStrDup("com.bktus.gpgfrontend.module.version_checking"); +} + +auto GFGetModuleVersion() -> const char* { return GFModuleStrDup("1.0.0"); } + +auto GFGetModuleMetaData() -> GFModuleMetaData* { + auto* p_meta = static_cast<GFModuleMetaData*>( + GFAllocateMemory(sizeof(GFModuleMetaData))); + auto* h_meta = p_meta; + + p_meta->key = "Name"; + p_meta->value = "VersionChecking"; + p_meta->next = static_cast<GFModuleMetaData*>( + GFAllocateMemory(sizeof(GFModuleMetaData))); + p_meta = p_meta->next; + + p_meta->key = "Description"; + p_meta->value = "Try checking gpgfrontend version"; + p_meta->next = static_cast<GFModuleMetaData*>( + GFAllocateMemory(sizeof(GFModuleMetaData))); + p_meta = p_meta->next; + + p_meta->key = "Author"; + p_meta->value = "Saturneric"; + p_meta->next = nullptr; + + return h_meta; +} + +auto GFRegisterModule() -> int { + GFModuleLogInfo("version checking module registering"); + return 0; +} + +auto GFActiveModule() -> int { + GFModuleLogInfo("version checking module activating"); + + GFModuleListenEvent(GFGetModuleID(), GFModuleStrDup("APPLICATION_LOADED")); + GFModuleListenEvent(GFGetModuleID(), + GFModuleStrDup("CHECK_APPLICATION_VERSION")); + return 0; +} + +auto GFExecuteModule(GFModuleEvent* event) -> int { + GFModuleLogInfo( + fmt::format("version checking module executing, event id: {}", event->id) + .c_str()); + + auto* task = new VersionCheckTask(); + QObject::connect( + task, &VersionCheckTask::SignalUpgradeVersion, QThread::currentThread(), + [event](const SoftwareVersion& version) { + VersionCheckDone(version); + + char** event_argv = + static_cast<char**>(GFAllocateMemory(sizeof(char**) * 1)); + event_argv[0] = GFModuleStrDup("0"); + + GFModuleTriggerModuleEventCallback(event, GFGetModuleID(), 1, + event_argv); + }); + QObject::connect(task, &VersionCheckTask::SignalUpgradeVersion, task, + &QObject::deleteLater); + task->Run(); + + return 0; +} + +auto GFDeactiveModule() -> int { return 0; } + +auto GFUnregisterModule() -> int { return 0; } + +void VersionCheckDone(const SoftwareVersion& version) { + GFModuleLogDebug("filling software information info in rt..."); + + GFModuleUpsertRTValue(GFGetModuleID(), + GFModuleStrDup("version.current_version"), + GFModuleStrDup(version.current_version.toUtf8())); + GFModuleUpsertRTValue(GFGetModuleID(), + GFModuleStrDup("version.latest_version"), + GFModuleStrDup(version.latest_version.toUtf8())); + GFModuleUpsertRTValueBool( + GFGetModuleID(), GFModuleStrDup("version.current_version_is_drafted"), + version.current_version_is_drafted ? 1 : 0); + GFModuleUpsertRTValueBool( + GFGetModuleID(), + GFModuleStrDup("version.current_version_is_a_prerelease"), + version.current_version_is_a_prerelease ? 1 : 0); + GFModuleUpsertRTValueBool( + GFGetModuleID(), + GFModuleStrDup("version.current_version_publish_in_remote"), + version.current_version_publish_in_remote ? 1 : 0); + GFModuleUpsertRTValueBool( + GFGetModuleID(), + GFModuleStrDup("version.latest_prerelease_version_from_remote"), + version.latest_prerelease_version_from_remote ? 1 : 0); + GFModuleUpsertRTValueBool(GFGetModuleID(), + GFModuleStrDup("version.need_upgrade"), + version.NeedUpgrade() ? 1 : 0); + GFModuleUpsertRTValueBool(GFGetModuleID(), + GFModuleStrDup("version.current_version_released"), + version.CurrentVersionReleased() ? 1 : 0); + GFModuleUpsertRTValueBool( + GFGetModuleID(), GFModuleStrDup("version.current_a_withdrawn_version"), + version.VersionWithdrawn() ? 1 : 0); + GFModuleUpsertRTValueBool(GFGetModuleID(), + GFModuleStrDup("version.loading_done"), + version.loading_done ? 1 : 0); + + GFModuleLogDebug("software information filled in rt"); +} diff --git a/src/module/mods/ver_check/VersionCheckingModule.h b/src/module/mods/ver_check/VersionCheckingModule.h new file mode 100644 index 00000000..35ee4ac3 --- /dev/null +++ b/src/module/mods/ver_check/VersionCheckingModule.h @@ -0,0 +1,56 @@ +/** + * Copyright (C) 2021 Saturneric <[email protected]> + * + * 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. + * + * GpgFrontend 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 GpgFrontend. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from + * the gpg4usb project, which is under GPL-3.0-or-later. + * + * All the source code of GpgFrontend was modified and released by + * Saturneric <[email protected]> starting on May 12, 2021. + * + * SPDX-License-Identifier: GPL-3.0-or-later + * + */ + +#pragma once + +#include <GFSDKModule.h> + +#include "GFModuleExport.h" + +extern "C" { + +auto GF_MODULE_EXPORT GFGetModuleGFSDKVersion() -> const char *; + +auto GF_MODULE_EXPORT GFGetModuleQtEnvVersion() -> const char *; + +auto GF_MODULE_EXPORT GFGetModuleID() -> const char *; + +auto GF_MODULE_EXPORT GFGetModuleVersion() -> const char *; + +auto GF_MODULE_EXPORT GFGetModuleMetaData() -> GFModuleMetaData *; + +auto GF_MODULE_EXPORT GFRegisterModule() -> int; + +auto GF_MODULE_EXPORT GFActiveModule() -> int; + +auto GF_MODULE_EXPORT GFExecuteModule(GFModuleEvent *) -> int; + +auto GF_MODULE_EXPORT GFDeactiveModule() -> int; + +auto GF_MODULE_EXPORT GFUnregisterModule() -> int; +}; diff --git a/src/module/sdk/GFSDK.h b/src/module/sdk/GFSDK.h new file mode 100644 index 00000000..77e019af --- /dev/null +++ b/src/module/sdk/GFSDK.h @@ -0,0 +1,44 @@ +/** + * Copyright (C) 2021 Saturneric <[email protected]> + * + * 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. + * + * GpgFrontend 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 GpgFrontend. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from + * the gpg4usb project, which is under GPL-3.0-or-later. + * + * All the source code of GpgFrontend was modified and released by + * Saturneric <[email protected]> starting on May 12, 2021. + * + * SPDX-License-Identifier: GPL-3.0-or-later + * + */ + +#pragma once + +#include "GFSDKExport.h" + +extern "C" { + +void GPGFRONTEND_MODULE_SDK_EXPORT GFModuleLogTrace(const char*); + +void GPGFRONTEND_MODULE_SDK_EXPORT GFModuleLogDebug(const char*); + +void GPGFRONTEND_MODULE_SDK_EXPORT GFModuleLogInfo(const char*); + +void GPGFRONTEND_MODULE_SDK_EXPORT GFModuleLogWarn(const char*); + +void GPGFRONTEND_MODULE_SDK_EXPORT GFModuleLogError(const char*); +}
\ No newline at end of file diff --git a/src/module/sdk/GFSDKBasic.cpp b/src/module/sdk/GFSDKBasic.cpp new file mode 100644 index 00000000..4d8af6c8 --- /dev/null +++ b/src/module/sdk/GFSDKBasic.cpp @@ -0,0 +1,106 @@ +/** + * Copyright (C) 2021 Saturneric <[email protected]> + * + * 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. + * + * GpgFrontend 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 GpgFrontend. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from + * the gpg4usb project, which is under GPL-3.0-or-later. + * + * All the source code of GpgFrontend was modified and released by + * Saturneric <[email protected]> starting on May 12, 2021. + * + * SPDX-License-Identifier: GPL-3.0-or-later + * + */ + +#include "GFSDKBasic.h" + +#include "core/function/SecureMemoryAllocator.h" +#include "core/function/gpg/GpgCommandExecutor.h" +#include "core/utils/BuildInfoUtils.h" +#include "core/utils/CommonUtils.h" + +auto GFAllocateMemory(uint32_t size) -> void* { + return GpgFrontend::SecureMemoryAllocator::Allocate(size); +} + +void GFFreeMemory(void* ptr) { + return GpgFrontend::SecureMemoryAllocator::Deallocate(ptr); +} + +auto GFProjectVersion() -> const char* { + return GpgFrontend::GFStrDup(GpgFrontend::GetProjectVersion()); +} + +auto GFQtEnvVersion() -> const char* { + return GpgFrontend::GFStrDup(QT_VERSION_STR); +} + +void GFExecuteCommandSync(const char* cmd, int32_t argc, const char** argv, + GFCommandExeucteCallback cb, void* data) { + QStringList args; + for (int i = 0; i < argc; i++) { + args.append(GpgFrontend::GFUnStrDup(argv[i])); + } + + GpgFrontend::GpgCommandExecutor::ExecuteContext const context{ + cmd, args, [=](int exit_code, const QString& out, const QString& err) { + cb(data, exit_code, out.toUtf8(), err.toUtf8()); + }}; + + GpgFrontend::GpgCommandExecutor::ExecuteSync(context); +} + +void GFExecuteCommandBatchSync(int32_t context_size, + const GFCommandExecuteContext* context) { + QList<GpgFrontend::GpgCommandExecutor::ExecuteContext> contexts; + + for (int i = 0; i < context_size; i++) { + const auto& exec_context = context[i]; + + QStringList args; + const char** argv = exec_context.argv; + for (int j = 0; j < exec_context.argc; j++) { + args.append(GpgFrontend::GFUnStrDup(argv[j])); + } + + contexts.append( + {exec_context.cmd, args, + [data = exec_context.data, cb = exec_context.cb]( + int exit_code, const QString& out, const QString& err) { + cb(data, exit_code, out.toUtf8(), err.toUtf8()); + }}); + } + + GpgFrontend::GpgCommandExecutor::ExecuteConcurrentlySync(contexts); +} + +auto StrlenSafe(const char* str, size_t max_len) -> size_t { + const char* end = static_cast<const char*>(memchr(str, '\0', max_len)); + if (end == nullptr) return max_len; + return end - str; +} + +auto GPGFRONTEND_MODULE_SDK_EXPORT GFModuleStrDup(const char* src) -> char* { + auto len = StrlenSafe(src, kGfStrlenMax); + if (len > kGfStrlenMax) return nullptr; + + char* dst = static_cast<char*>(GFAllocateMemory((len + 1) * sizeof(char))); + memcpy(dst, src, len); + dst[len] = '\0'; + + return dst; +}
\ No newline at end of file diff --git a/src/module/sdk/GFSDKBasic.h b/src/module/sdk/GFSDKBasic.h new file mode 100644 index 00000000..07ff6ed7 --- /dev/null +++ b/src/module/sdk/GFSDKBasic.h @@ -0,0 +1,107 @@ +/** + * Copyright (C) 2021 Saturneric <[email protected]> + * + * 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. + * + * GpgFrontend 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 GpgFrontend. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from + * the gpg4usb project, which is under GPL-3.0-or-later. + * + * All the source code of GpgFrontend was modified and released by + * Saturneric <[email protected]> starting on May 12, 2021. + * + * SPDX-License-Identifier: GPL-3.0-or-later + * + */ + +#pragma once + +#include <cstddef> +#include <cstdint> + +#include "GFSDKExport.h" + +extern "C" { + +constexpr int32_t kGfStrlenMax = static_cast<const int32_t>(1024 * 8); + +using GFCommandExeucteCallback = void (*)(void* data, int errcode, + const char* out, const char* err); + +using GFCommandExecuteContext = struct { + const char* cmd; + int32_t argc; + const char** argv; + GFCommandExeucteCallback cb; + void* data; +}; + +/** + * @brief + * + * @param size + * @return void* + */ +auto GPGFRONTEND_MODULE_SDK_EXPORT GFAllocateMemory(uint32_t size) -> void*; + +/** + * @brief + * + * @return const char* + */ +auto GPGFRONTEND_MODULE_SDK_EXPORT GFProjectVersion() -> const char*; + +/** + * @brief + * + * @return const char* + */ +auto GPGFRONTEND_MODULE_SDK_EXPORT GFQtEnvVersion() -> const char*; + +/** + * @brief + * + */ +void GPGFRONTEND_MODULE_SDK_EXPORT GFFreeMemory(void*); + +/** + * @brief + * + * @param cmd + * @param argc + * @param argv + * @param cb + * @param data + */ +void GPGFRONTEND_MODULE_SDK_EXPORT +GFExecuteCommandSync(const char* cmd, int32_t argc, const char** argv, + GFCommandExeucteCallback cb, void* data); + +/** + * @brief + * + * @param context_size + * @param context + */ +void GPGFRONTEND_MODULE_SDK_EXPORT GFExecuteCommandBatchSync( + int32_t context_size, const GFCommandExecuteContext* context); + +/** + * @brief + * + * @return char* + */ +auto GPGFRONTEND_MODULE_SDK_EXPORT GFModuleStrDup(const char*) -> char*; +}
\ No newline at end of file diff --git a/src/module/sdk/Basic.h b/src/module/sdk/GFSDKBuildInfo.h index 62a547b3..a64d95c5 100644 --- a/src/module/sdk/Basic.h +++ b/src/module/sdk/GFSDKBuildInfo.h @@ -28,9 +28,9 @@ #pragma once -namespace GpgFrontend::Module::SDK { +#define GF_SDK_VERSION_MAJOR "2" +#define GF_SDK_VERSION_MINOR "1" +#define GF_SDK_VERSION_PATCH "3" - - - -}
\ No newline at end of file +#define GF_SDK_VERSION_STR \ + GF_SDK_VERSION_MAJOR "." GF_SDK_VERSION_MINOR "." GF_SDK_VERSION_PATCH diff --git a/src/module/GpgFrontendModule.h b/src/module/sdk/GFSDKBuildInfo.h.in index cf7d8557..508c35d4 100644 --- a/src/module/GpgFrontendModule.h +++ b/src/module/sdk/GFSDKBuildInfo.h.in @@ -28,9 +28,9 @@ #pragma once -/** - * Project internal dependencies - */ -#include "GpgFrontend.h" -#include "GpgFrontendModuleExport.h" -#include "core/GpgFrontendCore.h" +#define GF_SDK_VERSION_MAJOR "@CMAKE_PROJECT_VERSION_MAJOR@" +#define GF_SDK_VERSION_MINOR "@CMAKE_PROJECT_VERSION_MINOR@" +#define GF_SDK_VERSION_PATCH "@CMAKE_PROJECT_VERSION_PATCH@" + +#define GF_SDK_VERSION_STR \ + GF_SDK_VERSION_MAJOR "." GF_SDK_VERSION_MINOR "." GF_SDK_VERSION_PATCH
\ No newline at end of file diff --git a/src/module/sdk/GpgFrontendModuleSDKExport.h b/src/module/sdk/GFSDKExport.h index a62168bc..a62168bc 100644 --- a/src/module/sdk/GpgFrontendModuleSDKExport.h +++ b/src/module/sdk/GFSDKExport.h diff --git a/src/module/sdk/Log.cpp b/src/module/sdk/GFSDKExtra.cpp index 384fac1d..bbfa8575 100644 --- a/src/module/sdk/Log.cpp +++ b/src/module/sdk/GFSDKExtra.cpp @@ -26,11 +26,17 @@ * */ -#include "Log.h" +#include "GFSDKExtra.h" +#include "core/utils/BuildInfoUtils.h" +#include "core/utils/CommonUtils.h" -#include <stdexcept> - -#include "core/function/GlobalSettingStation.h" - -namespace GpgFrontend::Module::SDK {} // namespace GpgFrontend::Module::SDK +auto GFCompareSoftwareVersion(const char *current_version, + const char *latest_version) -> int { + return GpgFrontend::GFCompareSoftwareVersion( + GpgFrontend::GFUnStrDup(current_version), + GpgFrontend::GFUnStrDup(latest_version)); +} +auto GFHttpRequestUserAgent() -> const char * { + return GpgFrontend::GFStrDup(GpgFrontend::GetHttpRequestUserAgent()); +}
\ No newline at end of file diff --git a/src/module/sdk/GpgFrontendModuleSDK.h b/src/module/sdk/GFSDKExtra.h index 97769462..3d7f4226 100644 --- a/src/module/sdk/GpgFrontendModuleSDK.h +++ b/src/module/sdk/GFSDKExtra.h @@ -28,6 +28,12 @@ #pragma once -#include <core/module/GpgFrontendModuleSystem.h> -#include <module/sdk/GpgFrontendModuleSDKExport.h> -#include <module/sdk/Log.h>
\ No newline at end of file +#include "GFSDKExport.h" + +extern "C" { + +auto GPGFRONTEND_MODULE_SDK_EXPORT GFCompareSoftwareVersion( + const char *current_version, const char *latest_version) -> int; + +auto GPGFRONTEND_MODULE_SDK_EXPORT GFHttpRequestUserAgent() -> const char *; +}
\ No newline at end of file diff --git a/src/module/sdk/Basic.cpp b/src/module/sdk/GFSDKGpg.cpp index 63859763..63859763 100644 --- a/src/module/sdk/Basic.cpp +++ b/src/module/sdk/GFSDKGpg.cpp diff --git a/src/module/sdk/UI.cpp b/src/module/sdk/GFSDKGpg.h index 63859763..8823bfc5 100644 --- a/src/module/sdk/UI.cpp +++ b/src/module/sdk/GFSDKGpg.h @@ -24,4 +24,10 @@ * * SPDX-License-Identifier: GPL-3.0-or-later * - */
\ No newline at end of file + */ + +#pragma once + +extern "C" { + +}
\ No newline at end of file diff --git a/src/module/sdk/Log.h b/src/module/sdk/GFSDKLog.cpp index 0c40a097..603cc325 100644 --- a/src/module/sdk/Log.h +++ b/src/module/sdk/GFSDKLog.cpp @@ -26,10 +26,9 @@ * */ -#pragma once +#include "GFSDKLog.h" #include "core/utils/LogUtils.h" -#include "module/sdk/GpgFrontendModuleSDK.h" #define MODULE_LOG_TRACE(...) GF_LOG_TRACE("module", __VA_ARGS__) #define MODULE_LOG_DEBUG(...) GF_LOG_DEBUG("module", __VA_ARGS__) @@ -37,35 +36,12 @@ #define MODULE_LOG_WARN(...) GF_LOG_WARN("module", __VA_ARGS__) #define MODULE_LOG_ERROR(...) GF_LOG_ERROR("module", __VA_ARGS__) -namespace spdlog { -class logger; -} +void GFModuleLogTrace(const char* l) { MODULE_LOG_TRACE(l); } -namespace GpgFrontend::Module::SDK { +void GFModuleLogDebug(const char* l) { MODULE_LOG_DEBUG(l); } -template <typename... Args> -void ModuleLogTrace(const char* fmt, const Args&... args) { - MODULE_LOG_TRACE(fmt, args...); -} +void GFModuleLogInfo(const char* l) { MODULE_LOG_INFO(l); } -template <typename... Args> -void ModuleLogDebug(const char* fmt, const Args&... args) { - MODULE_LOG_DEBUG(fmt, args...); -} +void GFModuleLogWarn(const char* l) { MODULE_LOG_WARN(l); } -template <typename... Args> -void ModuleLogInfo(const char* fmt, const Args&... args) { - MODULE_LOG_INFO(fmt, args...); -} - -template <typename... Args> -void ModuleLogWarn(const char* fmt, const Args&... args) { - MODULE_LOG_WARN(fmt, args...); -} - -template <typename... Args> -void ModuleLogError(const char* fmt, const Args&... args) { - MODULE_LOG_ERROR(fmt, args...); -} - -} // namespace GpgFrontend::Module::SDK +void GFModuleLogError(const char* l) { MODULE_LOG_ERROR(l); } diff --git a/src/module/sdk/GFSDKLog.h b/src/module/sdk/GFSDKLog.h new file mode 100644 index 00000000..77e019af --- /dev/null +++ b/src/module/sdk/GFSDKLog.h @@ -0,0 +1,44 @@ +/** + * Copyright (C) 2021 Saturneric <[email protected]> + * + * 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. + * + * GpgFrontend 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 GpgFrontend. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from + * the gpg4usb project, which is under GPL-3.0-or-later. + * + * All the source code of GpgFrontend was modified and released by + * Saturneric <[email protected]> starting on May 12, 2021. + * + * SPDX-License-Identifier: GPL-3.0-or-later + * + */ + +#pragma once + +#include "GFSDKExport.h" + +extern "C" { + +void GPGFRONTEND_MODULE_SDK_EXPORT GFModuleLogTrace(const char*); + +void GPGFRONTEND_MODULE_SDK_EXPORT GFModuleLogDebug(const char*); + +void GPGFRONTEND_MODULE_SDK_EXPORT GFModuleLogInfo(const char*); + +void GPGFRONTEND_MODULE_SDK_EXPORT GFModuleLogWarn(const char*); + +void GPGFRONTEND_MODULE_SDK_EXPORT GFModuleLogError(const char*); +}
\ No newline at end of file diff --git a/src/module/sdk/GFSDKModule.cpp b/src/module/sdk/GFSDKModule.cpp new file mode 100644 index 00000000..00594488 --- /dev/null +++ b/src/module/sdk/GFSDKModule.cpp @@ -0,0 +1,98 @@ +/** + * Copyright (C) 2021 Saturneric <[email protected]> + * + * 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. + * + * GpgFrontend 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 GpgFrontend. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from + * the gpg4usb project, which is under GPL-3.0-or-later. + * + * All the source code of GpgFrontend was modified and released by + * Saturneric <[email protected]> starting on May 12, 2021. + * + * SPDX-License-Identifier: GPL-3.0-or-later + * + */ + +#include "GFSDKModule.h" + +#include <core/module/ModuleManager.h> +#include <core/utils/CommonUtils.h> + +#include "GFSDKBasic.h" + +void GFModuleListenEvent(const char *module_id, const char *event_id) { + return GpgFrontend::Module::ModuleManager::GetInstance().ListenEvent( + GpgFrontend::GFUnStrDup(module_id).toLower(), + GpgFrontend::GFUnStrDup(event_id).toUpper()); +} + +auto GFModuleRetrieveRTValueOrDefault(const char *namespace_, const char *key, + const char *default_value) -> const + char * { + return GpgFrontend::GFStrDup( + GpgFrontend::Module::RetrieveRTValueTypedOrDefault( + GpgFrontend::GFUnStrDup(namespace_), GpgFrontend::GFUnStrDup(key), + GpgFrontend::GFUnStrDup(default_value))); +} + +void GFModuleUpsertRTValue(const char *namespace_, const char *key, + const char *vaule) { + GpgFrontend::Module::UpsertRTValue( + GpgFrontend::GFUnStrDup(namespace_).toLower(), + GpgFrontend::GFUnStrDup(key).toLower(), GpgFrontend::GFUnStrDup(vaule)); +} + +void GFModuleUpsertRTValueBool(const char *namespace_, const char *key, + int value) { + GpgFrontend::Module::UpsertRTValue( + GpgFrontend::GFUnStrDup(namespace_).toLower(), + GpgFrontend::GFUnStrDup(key).toLower(), value != 0); +} + +auto GFModuleListRTChildKeys(const char *namespace_, const char *key, + char ***child_keys) -> int32_t { + *child_keys = nullptr; + auto keys = GpgFrontend::Module::ListRTChildKeys( + GpgFrontend::GFUnStrDup(namespace_).toLower(), + GpgFrontend::GFUnStrDup(key).toLower()); + + if (keys.empty()) return 0; + + *child_keys = + static_cast<char **>(GFAllocateMemory(sizeof(char **) * keys.size())); + + for (int i = 0; i < keys.size(); i++) { + (*child_keys)[i] = GpgFrontend::GFStrDup(keys[i]); + } + + return static_cast<int32_t>(keys.size()); +} + +void GFModuleTriggerModuleEventCallback(GFModuleEvent *module_event, + const char *module_id, int argc, + char **argv) { + auto data_object = GpgFrontend::TransferParams(); + for (int i = 0; i < argc; i++) { + data_object->AppendObject(GpgFrontend::GFUnStrDup(argv[i])); + } + + auto event = GpgFrontend::Module::ModuleManager::GetInstance().SearchEvent( + GpgFrontend::GFUnStrDup(module_event->trigger_id).toLower()); + if (!event) return; + + event.value()->ExecuteCallback(GpgFrontend::GFUnStrDup(module_id), + data_object); +}
\ No newline at end of file diff --git a/src/module/sdk/GFSDKModule.h b/src/module/sdk/GFSDKModule.h new file mode 100644 index 00000000..67c1f492 --- /dev/null +++ b/src/module/sdk/GFSDKModule.h @@ -0,0 +1,94 @@ +/** + * Copyright (C) 2021 Saturneric <[email protected]> + * + * 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. + * + * GpgFrontend 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 GpgFrontend. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from + * the gpg4usb project, which is under GPL-3.0-or-later. + * + * All the source code of GpgFrontend was modified and released by + * Saturneric <[email protected]> starting on May 12, 2021. + * + * SPDX-License-Identifier: GPL-3.0-or-later + * + */ + +#pragma once + +#include "GFSDKExport.h" + +extern "C" { + +#include <stdint.h> + +struct GFModuleMetaData { + const char *key; + const char *value; + GFModuleMetaData *next; +}; + +struct GFModuleEventParam { + const char *name; + const char *value; + GFModuleEventParam *next; +}; + +struct GFModuleEvent { + const char *id; + const char *trigger_id; + GFModuleEventParam *params; +}; + +using GFModuleAPIGetModuleGFSDKVersion = auto (*)() -> const char *; + +using GFModuleAPIGetModuleQtEnvVersion = auto (*)() -> const char *; + +using GFModuleAPIGetModuleID = auto (*)() -> const char *; + +using GFModuleAPIGetModuleVersion = auto (*)() -> const char *; + +using GFModuleAPIGetModuleMetaData = auto (*)() -> GFModuleMetaData *; + +using GFModuleAPIRegisterModule = auto (*)() -> int; + +using GFModuleAPIActivateModule = auto (*)() -> int; + +using GFModuleAPIExecuteModule = auto (*)(GFModuleEvent *) -> int; + +using GFModuleAPIDeactivateModule = auto (*)() -> int; + +using GFModuleAPIUnregisterModule = auto (*)() -> int; + +void GPGFRONTEND_MODULE_SDK_EXPORT GFModuleListenEvent(const char *module_id, + const char *event_id); + +auto GPGFRONTEND_MODULE_SDK_EXPORT GFModuleRetrieveRTValueOrDefault( + const char *namespace_, const char *key, const char *default_value) -> const + char *; + +void GPGFRONTEND_MODULE_SDK_EXPORT GFModuleUpsertRTValue(const char *namespace_, + const char *key, + const char *vaule); + +void GPGFRONTEND_MODULE_SDK_EXPORT +GFModuleUpsertRTValueBool(const char *namespace_, const char *key, int value); + +auto GPGFRONTEND_MODULE_SDK_EXPORT GFModuleListRTChildKeys( + const char *namespace_, const char *key, char ***child_keys) -> int32_t; + +void GPGFRONTEND_MODULE_SDK_EXPORT GFModuleTriggerModuleEventCallback( + GFModuleEvent *event, const char *module_id, int argc, char **argv); +};
\ No newline at end of file diff --git a/src/module/sdk/Gpg.cpp b/src/module/sdk/GFSDKUI.cpp index 63859763..63859763 100644 --- a/src/module/sdk/Gpg.cpp +++ b/src/module/sdk/GFSDKUI.cpp diff --git a/src/module/sdk/Gpg.h b/src/module/sdk/GFSDKUI.h index 0702632a..0702632a 100644 --- a/src/module/sdk/Gpg.h +++ b/src/module/sdk/GFSDKUI.h diff --git a/src/module/sdk/UI.h b/src/module/sdk/GFSDKUtils.cpp index 0702632a..fcb510e3 100644 --- a/src/module/sdk/UI.h +++ b/src/module/sdk/GFSDKUtils.cpp @@ -26,4 +26,4 @@ * */ -#pragma once
\ No newline at end of file +#include "GFSDKUtils.h"
\ No newline at end of file diff --git a/src/module/sdk/GFSDKUtils.h b/src/module/sdk/GFSDKUtils.h new file mode 100644 index 00000000..7d72e9ee --- /dev/null +++ b/src/module/sdk/GFSDKUtils.h @@ -0,0 +1,34 @@ +/** + * Copyright (C) 2021 Saturneric <[email protected]> + * + * 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. + * + * GpgFrontend 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 GpgFrontend. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from + * the gpg4usb project, which is under GPL-3.0-or-later. + * + * All the source code of GpgFrontend was modified and released by + * Saturneric <[email protected]> starting on May 12, 2021. + * + * SPDX-License-Identifier: GPL-3.0-or-later + * + */ + +#pragma once + +extern "C" { + + +}
\ No newline at end of file diff --git a/src/pinentry/CMakeLists.txt b/src/pinentry/CMakeLists.txt index 3145719a..cce5fcfb 100644 --- a/src/pinentry/CMakeLists.txt +++ b/src/pinentry/CMakeLists.txt @@ -45,30 +45,18 @@ else() target_link_libraries(gpgfrontend_pinentry PUBLIC Qt6::Widgets) endif() +if (XCODE_BUILD) + set_target_properties(gpgfrontend_pinentry + PROPERTIES + ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE} + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE} + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE} + XCODE_ATTRIBUTE_SKIP_INSTALL "Yes" + XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "${GPGFRONTEND_XOCDE_CODE_SIGN_IDENTITY}") +endif () + # spdlog target_link_libraries(gpgfrontend_pinentry PRIVATE spdlog) # using std c++ 17 target_compile_features(gpgfrontend_pinentry PUBLIC cxx_std_17) - -# link for different platforms -if (MINGW) - message(STATUS "Link GPG Static Library For MINGW") - target_link_libraries(gpgfrontend_pinentry PUBLIC wsock32) -elseif (APPLE) - message(STATUS "Link GPG Static Library For macOS") - target_link_libraries(gpgfrontend_pinentry PUBLIC dl) - if (XCODE_BUILD) - set_target_properties(gpgfrontend_pinentry - PROPERTIES - ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE} - LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE} - LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE} - XCODE_ATTRIBUTE_SKIP_INSTALL "Yes" - XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "${GPGFRONTEND_XOCDE_CODE_SIGN_IDENTITY}") - endif () -else () - # linux - message(STATUS "Link GPG Static Library For Unix") - target_link_libraries(gpgfrontend_pinentry PUBLIC pthread dl) -endif () diff --git a/src/ui/CMakeLists.txt b/src/ui/CMakeLists.txt index 3f0686e2..e6b41b50 100644 --- a/src/ui/CMakeLists.txt +++ b/src/ui/CMakeLists.txt @@ -36,7 +36,7 @@ aux_source_directory(thread UI_SOURCE) aux_source_directory(dialog/details UI_SOURCE) aux_source_directory(struct UI_SOURCE) aux_source_directory(dialog/import_export UI_SOURCE) -aux_source_directory(dialog/gnupg UI_SOURCE) +aux_source_directory(dialog/controller UI_SOURCE) aux_source_directory(dialog UI_SOURCE) aux_source_directory(function UI_SOURCE) @@ -54,7 +54,7 @@ if(GPGFRONTEND_QT5_BUILD) else() # link Qt target_link_libraries(gpgfrontend_ui - Qt6::Core Qt6::Widgets Qt6::Network Qt6::PrintSupport Qt6::Core5Compat) + Qt6::Core Qt6::Widgets Qt6::Network Qt6::PrintSupport) endif() diff --git a/src/ui/GpgFrontendApplication.cpp b/src/ui/GpgFrontendApplication.cpp index 1304aad5..b3c12de6 100644 --- a/src/ui/GpgFrontendApplication.cpp +++ b/src/ui/GpgFrontendApplication.cpp @@ -28,30 +28,28 @@ #include "ui/GpgFrontendApplication.h" -#include <QTextCodec> - -#include "GpgFrontendBuildInfo.h" +#include "core/utils/BuildInfoUtils.h" namespace GpgFrontend::UI { GpgFrontendApplication::GpgFrontendApplication(int &argc, char *argv[]) : QApplication(argc, argv) { -#ifndef MACOS - this->setWindowIcon(QIcon(":/icons/gpgfrontend.png")); +#if defined(DEBUG) || !defined(MACOS) + GpgFrontend::UI::GpgFrontendApplication::setWindowIcon( + QIcon(":/icons/gpgfrontend.png")); #endif // set the extra information of the build - GpgFrontendApplication::setApplicationVersion(BUILD_VERSION); - GpgFrontendApplication::setApplicationName(PROJECT_NAME); - GpgFrontendApplication::setApplicationDisplayName(PROJECT_NAME); - GpgFrontendApplication::setOrganizationName(PROJECT_NAME); + GpgFrontendApplication::setApplicationVersion(GetProjectBuildVersion()); + GpgFrontendApplication::setApplicationName(QString::fromUtf8((PROJECT_NAME))); + GpgFrontendApplication::setApplicationDisplayName( + QString::fromUtf8((PROJECT_NAME))); + GpgFrontendApplication::setOrganizationName( + QString::fromUtf8((PROJECT_NAME))); GpgFrontendApplication::setQuitOnLastWindowClosed(true); // don't show icons in menus GpgFrontendApplication::setAttribute(Qt::AA_DontShowIconsInMenus); - - // unicode in source - QTextCodec::setCodecForLocale(QTextCodec::codecForName("utf-8")); } bool GpgFrontendApplication::notify(QObject *receiver, QEvent *event) { diff --git a/src/ui/GpgFrontendUIInit.cpp b/src/ui/GpgFrontendUIInit.cpp index 08cf012d..046c25d7 100644 --- a/src/ui/GpgFrontendUIInit.cpp +++ b/src/ui/GpgFrontendUIInit.cpp @@ -41,6 +41,8 @@ namespace GpgFrontend::UI { +QList<QTranslator*> registered_translators; + extern void InitUITranslations(); void WaitEnvCheckingProcess() { @@ -75,14 +77,14 @@ void WaitEnvCheckingProcess() { &QEventLoop::quit); QApplication::connect(waiting_dialog, &QProgressDialog::canceled, [=]() { - GF_UI_LOG_DEBUG("cancel clicked on wairing dialog"); + GF_UI_LOG_DEBUG("cancel clicked on waiting dialog"); QApplication::quit(); exit(0); }); auto env_state = Module::RetrieveRTValueTypedOrDefault<>("core", "env.state.basic", 0); - GF_UI_LOG_DEBUG("ui is ready to wating for env initialized, env_state: {}", + GF_UI_LOG_DEBUG("ui is ready to waiting for env initialized, env_state: {}", env_state); // check twice to avoid some unlucky sitations @@ -108,11 +110,22 @@ void InitGpgFrontendUI(QApplication* /*app*/) { // init locale InitUITranslations(); + auto settings = GlobalSettingStation::GetInstance().GetSettings(); + auto theme = settings.value("appearance/theme").toString(); + #ifdef WINDOWS - // support dark mode on windows - QApplication::setStyle("fusion"); + if (theme.isEmpty()) { + // support dark mode on windows + QApplication::setStyle(QStyleFactory::create("Fusion")); + } #endif + auto available_styles = QStyleFactory::keys(); + for (QString& s : available_styles) s = s.toLower(); + if (!theme.isEmpty() && available_styles.contains(theme)) { + QApplication::setStyle(QStyleFactory::create(theme)); + } + // register meta types qRegisterMetaType<QSharedPointer<GpgPassphraseContext> >( "QSharedPointer<GpgPassphraseContext>"); @@ -123,10 +136,8 @@ void InitGpgFrontendUI(QApplication* /*app*/) { // init common utils CommonUtils::GetInstance(); - auto settings = GlobalSettingStation::GetInstance().GetSettings(); - // application proxy configure - bool proxy_enable = settings.value("proxy/enable", false).toBool(); + auto proxy_enable = settings.value("proxy/enable", false).toBool(); // if enable proxy for application if (proxy_enable) { @@ -136,9 +147,9 @@ void InitGpgFrontendUI(QApplication* /*app*/) { QString proxy_host = settings.value("proxy/proxy_host", QString{}).toString(); int proxy_port = settings.value("prox/port", 0).toInt(); - QString proxy_username = + QString const proxy_username = settings.value("proxy/username", QString{}).toString(); - QString proxy_password = + QString const proxy_password = settings.value("proxy/password", QString{}).toString(); GF_UI_LOG_DEBUG("proxy settings: type {}, host {}, port: {}", proxy_type, proxy_host, proxy_port); @@ -191,7 +202,7 @@ auto RunGpgFrontendUI(QApplication* app) -> int { // pre-check, if application need to restart if (CommonUtils::GetInstance()->isApplicationNeedRestart()) { - GF_UI_LOG_DEBUG("application need to restart, before mian window init"); + GF_UI_LOG_DEBUG("application need to restart, before main window init"); return kDeepRestartCode; } @@ -213,31 +224,38 @@ void GPGFRONTEND_UI_EXPORT DestroyGpgFrontendUI() {} * */ void InitUITranslations() { + for (const auto& translator : registered_translators) { + QCoreApplication::removeTranslator(translator); + } + registered_translators.clear(); + auto* translator = new QTranslator(QCoreApplication::instance()); - if (translator->load(QLocale(), QLatin1String(PROJECT_NAME), - QLatin1String("."), QLatin1String(":/i18n"), - QLatin1String(".qm"))) { - GF_UI_LOG_DEBUG("load target translation file done, locale: {}", + if (translator->load(QLocale(), QLatin1String("qt"), QLatin1String("_"), + QLatin1String(":/i18n_qt"), QLatin1String(".qm"))) { + GF_UI_LOG_DEBUG("load qt translation file done, locale: {}", QLocale().name()); + QCoreApplication::installTranslator(translator); + registered_translators.append(translator); } - auto* base_translation = new QTranslator(QCoreApplication::instance()); - if (base_translation->load(QLocale(), QLatin1String("qt"), QLatin1String("_"), - QLatin1String(":/i18n_qt"), - QLatin1String(".qm"))) { - GF_UI_LOG_DEBUG("load qt translation file done, locale: {}", + translator = new QTranslator(QCoreApplication::instance()); + if (translator->load(QLocale(), QLatin1String("qtbase"), QLatin1String("_"), + QLatin1String(":/i18n_qt"), QLatin1String(".qm"))) { + GF_UI_LOG_DEBUG("load qtbase translation file done, locale: {}", QLocale().name()); - QCoreApplication::installTranslator(base_translation); + QCoreApplication::installTranslator(translator); + registered_translators.append(translator); } - base_translation = new QTranslator(QCoreApplication::instance()); - if (base_translation->load(QLocale(), QLatin1String("qtbase"), - QLatin1String("_"), QLatin1String(":/i18n_qt"), - QLatin1String(".qm"))) { - GF_UI_LOG_DEBUG("load qtbase translation file done, locale: {}", + translator = new QTranslator(QCoreApplication::instance()); + if (translator->load(QLocale(), QLatin1String(PROJECT_NAME), + QLatin1String("."), QLatin1String(":/i18n"), + QLatin1String(".qm"))) { + GF_UI_LOG_DEBUG("load target translation file done, locale: {}", QLocale().name()); - QCoreApplication::installTranslator(base_translation); + QCoreApplication::installTranslator(translator); + registered_translators.append(translator); } } diff --git a/src/ui/UserInterfaceUtils.cpp b/src/ui/UserInterfaceUtils.cpp index ab8aeac9..806ceb9e 100644 --- a/src/ui/UserInterfaceUtils.cpp +++ b/src/ui/UserInterfaceUtils.cpp @@ -33,21 +33,22 @@ #include "core/GpgConstants.h" #include "core/function/CoreSignalStation.h" #include "core/function/gpg/GpgKeyGetter.h" +#include "core/model/CacheObject.h" #include "core/model/GpgImportInformation.h" +#include "core/model/SettingsObject.h" #include "core/module/ModuleManager.h" #include "core/thread/Task.h" #include "core/thread/TaskRunnerGetter.h" #include "core/typedef/GpgTypedef.h" +#include "core/utils/BuildInfoUtils.h" #include "core/utils/GpgUtils.h" #include "core/utils/IOUtils.h" #include "thread/KeyServerImportTask.h" #include "ui/UISignalStation.h" #include "ui/dialog/WaitingDialog.h" -#include "ui/dialog/gnupg/GnuPGControllerDialog.h" +#include "ui/dialog/controller/GnuPGControllerDialog.h" #include "ui/dialog/import_export/KeyServerImportDialog.h" -#include "ui/struct/CacheObject.h" -#include "ui/struct/SettingsObject.h" -#include "ui/struct/settings/KeyServerSO.h" +#include "ui/struct/settings_object/KeyServerSO.h" #include "ui/widgets/TextEdit.h" namespace GpgFrontend::UI { @@ -64,8 +65,8 @@ void show_verify_details(QWidget *parent, InfoBoardWidget *info_board, [=]() { VerifyDetailsDialog(parent, error, verify_result); }); } -void import_unknown_key_from_keyserver( - QWidget *parent, const GpgVerifyResultAnalyse &verify_res) { +void ImportUnknownKeyFromKeyserver( + QWidget *parent, const GpgVerifyResultAnalyse &verify_result) { QMessageBox::StandardButton reply; reply = QMessageBox::question( parent, QCoreApplication::tr("Public key not found locally"), @@ -77,7 +78,7 @@ void import_unknown_key_from_keyserver( if (reply == QMessageBox::Yes) { auto dialog = KeyServerImportDialog(parent); auto key_ids = std::make_unique<KeyIdArgsList>(); - auto *signature = verify_res.GetSignatures(); + auto *signature = verify_result.GetSignatures(); while (signature != nullptr) { GF_UI_LOG_DEBUG("signature fpr: {}", signature->fpr); key_ids->push_back(signature->fpr); @@ -428,7 +429,11 @@ void CommonUtils::SlotImportKeyFromKeyServer( GF_UI_LOG_DEBUG("request url: {}", req_url.toString()); // Waiting for reply - QNetworkReply *reply = network_manager->get(QNetworkRequest(req_url)); + auto request = QNetworkRequest(req_url); + request.setHeader(QNetworkRequest::UserAgentHeader, + GetHttpRequestUserAgent()); + + QNetworkReply *reply = network_manager->get(request); QEventLoop loop; connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit); loop.exec(); diff --git a/src/ui/UserInterfaceUtils.h b/src/ui/UserInterfaceUtils.h index 728e825f..304ba37b 100644 --- a/src/ui/UserInterfaceUtils.h +++ b/src/ui/UserInterfaceUtils.h @@ -63,7 +63,7 @@ void show_verify_details(QWidget* parent, InfoBoardWidget* info_board, * @param parent * @param verify_res */ -void import_unknown_key_from_keyserver( +void ImportUnknownKeyFromKeyserver( QWidget* parent, const GpgVerifyResultAnalyse& verify_res); /** diff --git a/src/ui/dialog/GeneralDialog.cpp b/src/ui/dialog/GeneralDialog.cpp index 386573a3..2015322f 100644 --- a/src/ui/dialog/GeneralDialog.cpp +++ b/src/ui/dialog/GeneralDialog.cpp @@ -28,8 +28,8 @@ #include "GeneralDialog.h" -#include "ui/struct/SettingsObject.h" -#include "ui/struct/settings/WindowStateSO.h" +#include "core/model/SettingsObject.h" +#include "ui/struct/settings_object/WindowStateSO.h" namespace GpgFrontend { diff --git a/src/ui/dialog/SignersPicker.cpp b/src/ui/dialog/SignersPicker.cpp index 378a58c7..9c342cc7 100644 --- a/src/ui/dialog/SignersPicker.cpp +++ b/src/ui/dialog/SignersPicker.cpp @@ -78,7 +78,7 @@ SignersPicker::SignersPicker(QWidget* parent) } auto SignersPicker::GetCheckedSigners() -> GpgFrontend::KeyIdArgsListPtr { - return key_list_->GetPrivateChecked(); + return key_list_->GetCheckedPrivateKey(); } auto SignersPicker::GetStatus() const -> bool { return this->accepted_; } diff --git a/src/ui/dialog/SignersPicker.h b/src/ui/dialog/SignersPicker.h index c7e1bfa5..cea8dd9a 100644 --- a/src/ui/dialog/SignersPicker.h +++ b/src/ui/dialog/SignersPicker.h @@ -56,13 +56,13 @@ class SignersPicker : public GeneralDialog { * * @return GpgFrontend::KeyIdArgsListPtr */ - KeyIdArgsListPtr GetCheckedSigners(); + auto GetCheckedSigners() -> KeyIdArgsListPtr; /** * * @return */ - [[nodiscard]] bool GetStatus() const; + [[nodiscard]] auto GetStatus() const -> bool; private: KeyList* key_list_; ///< diff --git a/src/ui/dialog/Wizard.cpp b/src/ui/dialog/Wizard.cpp index 8b15e9b7..e65366dd 100644 --- a/src/ui/dialog/Wizard.cpp +++ b/src/ui/dialog/Wizard.cpp @@ -28,7 +28,6 @@ #include "Wizard.h" -#include "core/GpgModel.h" #include "core/function/GlobalSettingStation.h" namespace GpgFrontend::UI { @@ -43,10 +42,8 @@ Wizard::Wizard(QWidget* parent) : QWizard(parent) { #endif setWindowTitle(tr("First Start Wizard")); - // http://www.flickr.com/photos/laureenp/6141822934/ - setPixmap(QWizard::WatermarkPixmap, QPixmap(":/icons/keys2.jpg")); - setPixmap(QWizard::LogoPixmap, QPixmap(":/icons/logo_small.png")); - setPixmap(QWizard::BannerPixmap, QPixmap(":/icons/banner.png")); + setPixmap(QWizard::LogoPixmap, + QPixmap(":/icons/gpgfrontend_logo.png").scaled(64, 64)); int next_page_id = GlobalSettingStation::GetInstance() .GetSettings() @@ -74,10 +71,8 @@ IntroPage::IntroPage(QWidget* parent) : QWizardPage(parent) { setTitle(tr("Getting Started...")); setSubTitle(tr("... with GpgFrontend")); - auto* topLabel = new QLabel( - QString( - tr("Welcome to GpgFrontend for decrypting and signing text or " - "files!")) + + auto* top_label = new QLabel( + tr("Welcome to GpgFrontend for decrypting and signing text or files!") + " <br><br><a href='https://gpgfrontend.bktus.com'>GpgFrontend</a> " + tr("is a Powerful, Easy-to-Use, Compact, Cross-Platform, and " "Installation-Free OpenPGP Crypto Tool. ") + @@ -86,10 +81,10 @@ IntroPage::IntroPage(QWidget* parent) : QWizardPage(parent) { tr("Overview") + "</a> (" + tr("by clicking the link, the page will open in your web browser") + "). <br>"); - topLabel->setTextFormat(Qt::RichText); - topLabel->setTextInteractionFlags(Qt::TextBrowserInteraction); - topLabel->setOpenExternalLinks(true); - topLabel->setWordWrap(true); + top_label->setTextFormat(Qt::RichText); + top_label->setTextInteractionFlags(Qt::TextBrowserInteraction); + top_label->setOpenExternalLinks(true); + top_label->setWordWrap(true); // QComboBox for language selection auto* lang_label = @@ -99,7 +94,7 @@ IntroPage::IntroPage(QWidget* parent) : QWizardPage(parent) { // set layout and add widgets auto* layout = new QVBoxLayout; - layout->addWidget(topLabel); + layout->addWidget(top_label); layout->addStretch(); layout->addWidget(lang_label); @@ -122,7 +117,7 @@ ChoosePage::ChoosePage(QWidget* parent) : QWizardPage(parent) { keygen_label->setOpenExternalLinks(true); keygen_label->setWordWrap(true); - auto* encr_decy_text_label = new QLabel( + auto* encr_decy_text_label = new QLabel( tr("If you want to learn how to encrypt, decrypt, sign and verify text, " "you can read ") + "<a href=\"https://gpgfrontend.bktus.com/guides/encrypt-decrypt-text\">" + @@ -135,12 +130,12 @@ ChoosePage::ChoosePage(QWidget* parent) : QWizardPage(parent) { encr_decy_text_label->setOpenExternalLinks(true); encr_decy_text_label->setWordWrap(true); - auto* sign_verify_text_label = - new QLabel(tr("If you want to operate file, you can read ") + - "<a href=\"https://gpgfrontend.bktus.com/guides/encrypt-decrypt-file\">" + - tr("Encrypt & Sign File") + "</a> " + tr("or") + - " <a href=\"https://gpgfrontend.bktus.com/guides/sign-verify-file\">" + - tr("Sign & Verify File") + "</a><hr>"); + auto* sign_verify_text_label = new QLabel( + tr("If you want to operate file, you can read ") + + "<a href=\"https://gpgfrontend.bktus.com/guides/encrypt-decrypt-file\">" + + tr("Encrypt & Sign File") + "</a> " + tr("or") + + " <a href=\"https://gpgfrontend.bktus.com/guides/sign-verify-file\">" + + tr("Sign & Verify File") + "</a><hr>"); sign_verify_text_label->setTextFormat(Qt::RichText); sign_verify_text_label->setTextInteractionFlags(Qt::TextBrowserInteraction); sign_verify_text_label->setOpenExternalLinks(true); @@ -157,9 +152,9 @@ ChoosePage::ChoosePage(QWidget* parent) : QWizardPage(parent) { int ChoosePage::nextId() const { return next_page_; } void ChoosePage::slot_jump_page(const QString& page) { - QMetaObject qmo = Wizard::staticMetaObject; - int index = qmo.indexOfEnumerator("WizardPages"); - QMetaEnum m = qmo.enumerator(index); + QMetaObject const qmo = Wizard::staticMetaObject; + int const index = qmo.indexOfEnumerator("WizardPages"); + QMetaEnum const m = qmo.enumerator(index); next_page_ = m.keyToValue(page.toUtf8().data()); wizard()->next(); @@ -225,7 +220,8 @@ ConclusionPage::ConclusionPage(QWidget* parent) : QWizardPage(parent) { open_help_check_box_ = new QCheckBox(tr("Open offline help.")); open_help_check_box_->setChecked(true); - dont_show_wizard_checkbox_ = new QCheckBox(tr("Don't show the wizard again.")); + dont_show_wizard_checkbox_ = + new QCheckBox(tr("Don't show the wizard again.")); dont_show_wizard_checkbox_->setChecked(true); registerField("showWizard", dont_show_wizard_checkbox_); diff --git a/src/ui/dialog/gnupg/GnuPGControllerDialog.cpp b/src/ui/dialog/controller/GnuPGControllerDialog.cpp index ea0a27c9..1874e255 100644 --- a/src/ui/dialog/gnupg/GnuPGControllerDialog.cpp +++ b/src/ui/dialog/controller/GnuPGControllerDialog.cpp @@ -52,16 +52,18 @@ GnuPGControllerDialog::GnuPGControllerDialog(QWidget* parent) ui_->gpgmeDebugLogCheckBox->setText(tr("Enable GpgME Debug Log")); ui_->useCustomGnuPGInstallPathCheckBox->setText(tr("Use Custom GnuPG")); ui_->useCustomGnuPGInstallPathButton->setText(tr("Select GnuPG Path")); - ui_->keyDatabseUseCustomCheckBox->setText( + ui_->keyDatabaseUseCustomCheckBox->setText( tr("Use Custom GnuPG Key Database Path")); ui_->customKeyDatabasePathSelectButton->setText( tr("Select Key Database Path")); ui_->restartGpgAgentOnStartCheckBox->setText( tr("Restart Gpg Agent on start")); + ui_->killAllGnuPGDaemonCheckBox->setText( + tr("Kill all gnupg daemon at close")); // tips ui_->customGnuPGPathTipsLabel->setText( - tr("Tips: please select a directroy where \"gpgconf\" is located in.")); + tr("Tips: please select a directory where \"gpgconf\" is located in.")); ui_->restartTipsLabel->setText( tr("Tips: notice that modify any of these settings will cause an " "Application restart.")); @@ -71,7 +73,7 @@ GnuPGControllerDialog::GnuPGControllerDialog(QWidget* parent) UISignalStation::GetInstance(), &UISignalStation::SignalRestartApplication); - connect(ui_->keyDatabseUseCustomCheckBox, &QCheckBox::stateChanged, this, + connect(ui_->keyDatabaseUseCustomCheckBox, &QCheckBox::stateChanged, this, [=](int state) { ui_->customKeyDatabasePathSelectButton->setDisabled( state != Qt::CheckState::Checked); @@ -83,7 +85,7 @@ GnuPGControllerDialog::GnuPGControllerDialog(QWidget* parent) state != Qt::CheckState::Checked); }); - connect(ui_->keyDatabseUseCustomCheckBox, &QCheckBox::stateChanged, this, + connect(ui_->keyDatabaseUseCustomCheckBox, &QCheckBox::stateChanged, this, &GnuPGControllerDialog::slot_update_custom_key_database_path_label); connect(ui_->useCustomGnuPGInstallPathCheckBox, &QCheckBox::stateChanged, @@ -98,7 +100,7 @@ GnuPGControllerDialog::GnuPGControllerDialog(QWidget* parent) this, tr("Open Directory"), {}, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); - GF_UI_LOG_DEBUG("key databse path selected: {}", + GF_UI_LOG_DEBUG("key database path selected: {}", selected_custom_key_database_path); custom_key_database_path_ = selected_custom_key_database_path; @@ -108,7 +110,7 @@ GnuPGControllerDialog::GnuPGControllerDialog(QWidget* parent) // update ui this->slot_update_custom_key_database_path_label( - this->ui_->keyDatabseUseCustomCheckBox->checkState()); + this->ui_->keyDatabaseUseCustomCheckBox->checkState()); }); connect( @@ -185,9 +187,6 @@ void GnuPGControllerDialog::SlotAccept() { void GnuPGControllerDialog::slot_update_custom_key_database_path_label( int state) { - // announce the restart - this->slot_set_restart_needed(kDeepRestartCode); - // hide label (not necessary to show the default path) this->ui_->currentKeyDatabasePathLabel->setHidden(state != Qt::CheckState::Checked); @@ -225,9 +224,6 @@ void GnuPGControllerDialog::slot_update_custom_key_database_path_label( void GnuPGControllerDialog::slot_update_custom_gnupg_install_path_label( int state) { - // announce the restart - this->slot_set_restart_needed(kDeepRestartCode); - // hide label (not necessary to show the default path) this->ui_->currentCustomGnuPGInstallPathLabel->setHidden( state != Qt::CheckState::Checked); @@ -269,52 +265,61 @@ void GnuPGControllerDialog::slot_update_custom_gnupg_install_path_label( void GnuPGControllerDialog::set_settings() { auto settings = GlobalSettingStation::GetInstance().GetSettings(); - bool non_ascii_at_file_operation = + auto non_ascii_at_file_operation = settings.value("gnupg/non_ascii_at_file_operation", true).toBool(); - if (non_ascii_at_file_operation) + if (non_ascii_at_file_operation) { ui_->asciiModeCheckBox->setCheckState(Qt::Checked); + } - bool const use_custom_key_database_path = + auto use_custom_key_database_path = settings.value("gnupg/use_custom_key_database_path", false).toBool(); if (use_custom_key_database_path) { - ui_->keyDatabseUseCustomCheckBox->setCheckState(Qt::Checked); + ui_->keyDatabaseUseCustomCheckBox->setCheckState(Qt::Checked); } - bool const enable_gpgme_debug_log = + auto enable_gpgme_debug_log = settings.value("gnupg/enable_gpgme_debug_log", false).toBool(); if (enable_gpgme_debug_log) { ui_->gpgmeDebugLogCheckBox->setCheckState(Qt::Checked); } + auto kill_all_gnupg_daemon_at_close = + settings.value("gnupg/kill_all_gnupg_daemon_at_close", false).toBool(); + if (kill_all_gnupg_daemon_at_close) { + ui_->killAllGnuPGDaemonCheckBox->setCheckState(Qt::Checked); + } + this->slot_update_custom_key_database_path_label( - ui_->keyDatabseUseCustomCheckBox->checkState()); + ui_->keyDatabaseUseCustomCheckBox->checkState()); - bool const use_custom_gnupg_install_path = + auto use_custom_gnupg_install_path = settings.value("gnupg/use_custom_gnupg_install_path", false).toBool(); if (use_custom_gnupg_install_path) { ui_->useCustomGnuPGInstallPathCheckBox->setCheckState(Qt::Checked); } - bool const use_pinentry_as_password_input_dialog = - settings.value("gnupg/use_pinentry_as_password_input_dialog", true) + auto use_pinentry_as_password_input_dialog = + settings + .value("gnupg/use_pinentry_as_password_input_dialog", + QString::fromLocal8Bit(qgetenv("container")) != "flatpak") .toBool(); if (use_pinentry_as_password_input_dialog) { ui_->usePinentryAsPasswordInputDialogCheckBox->setCheckState(Qt::Checked); } - bool const restart_gpg_agent_on_start = + auto restart_gpg_agent_on_start = settings.value("gnupg/restart_gpg_agent_on_start", false).toBool(); if (restart_gpg_agent_on_start) { ui_->restartGpgAgentOnStartCheckBox->setCheckState(Qt::Checked); } - this->slot_set_restart_needed(false); - this->slot_update_custom_key_database_path_label( use_custom_key_database_path ? Qt::Checked : Qt::Unchecked); this->slot_update_custom_gnupg_install_path_label( use_custom_gnupg_install_path ? Qt::Checked : Qt::Unchecked); + + this->slot_set_restart_needed(kNonRestartCode); } void GnuPGControllerDialog::apply_settings() { @@ -324,7 +329,7 @@ void GnuPGControllerDialog::apply_settings() { settings.setValue("gnupg/non_ascii_at_file_operation", ui_->asciiModeCheckBox->isChecked()); settings.setValue("gnupg/use_custom_key_database_path", - ui_->keyDatabseUseCustomCheckBox->isChecked()); + ui_->keyDatabaseUseCustomCheckBox->isChecked()); settings.setValue("gnupg/use_custom_gnupg_install_path", ui_->useCustomGnuPGInstallPathCheckBox->isChecked()); settings.setValue("gnupg/use_pinentry_as_password_input_dialog", @@ -337,20 +342,23 @@ void GnuPGControllerDialog::apply_settings() { ui_->currentCustomGnuPGInstallPathLabel->text()); settings.setValue("gnupg/restart_gpg_agent_on_start", ui_->restartGpgAgentOnStartCheckBox->isChecked()); + settings.setValue("gnupg/kill_all_gnupg_daemon_at_close", + ui_->killAllGnuPGDaemonCheckBox->isChecked()); } -int GnuPGControllerDialog::get_restart_needed() const { - return this->restart_needed_; +auto GnuPGControllerDialog::get_restart_needed() const -> int { + return this->restart_mode_; } void GnuPGControllerDialog::slot_set_restart_needed(int mode) { - this->restart_needed_ = mode; + GF_UI_LOG_INFO("announce restart needed, mode: {}", mode); + this->restart_mode_ = mode; } auto GnuPGControllerDialog::check_custom_gnupg_path(QString path) -> bool { if (path.isEmpty()) return false; - QFileInfo dir_info(path); + QFileInfo const dir_info(path); if (!dir_info.exists() || !dir_info.isReadable() || !dir_info.isDir()) { QMessageBox::critical( this, tr("Illegal GnuPG Path"), @@ -358,15 +366,15 @@ auto GnuPGControllerDialog::check_custom_gnupg_path(QString path) -> bool { return false; } - QDir dir(path); + QDir const dir(path); if (!dir.isAbsolute()) { QMessageBox::critical(this, tr("Illegal GnuPG Path"), tr("Target GnuPG Path is not an absolute path.")); } #ifdef WINDOWS - QFileInfo gpgconf_info(path + "/gpgconf.exe"); + QFileInfo const gpgconf_info(path + "/gpgconf.exe"); #else - QFileInfo gpgconf_info(path + "/gpgconf"); + QFileInfo const gpgconf_info(path + "/gpgconf"); #endif if (!gpgconf_info.exists() || !gpgconf_info.isFile() || @@ -384,7 +392,7 @@ auto GnuPGControllerDialog::check_custom_gnupg_key_database_path(QString path) -> bool { if (path.isEmpty()) return false; - QFileInfo dir_info(path); + QFileInfo const dir_info(path); if (!dir_info.exists() || !dir_info.isReadable() || !dir_info.isDir()) { QMessageBox::critical(this, tr("Illegal GnuPG Key Database Path"), tr("Target GnuPG Key Database Path is not an " diff --git a/src/ui/dialog/gnupg/GnuPGControllerDialog.h b/src/ui/dialog/controller/GnuPGControllerDialog.h index 6e8ef797..e8a4b83c 100644 --- a/src/ui/dialog/gnupg/GnuPGControllerDialog.h +++ b/src/ui/dialog/controller/GnuPGControllerDialog.h @@ -83,7 +83,7 @@ class GnuPGControllerDialog : public GeneralDialog { private: std::shared_ptr<Ui_GnuPGControllerDialog> ui_; ///< - int restart_needed_{0}; ///< + int restart_mode_{0}; ///< QString custom_key_database_path_; QString custom_gnupg_path_; diff --git a/src/ui/dialog/controller/ModuleControllerDialog.cpp b/src/ui/dialog/controller/ModuleControllerDialog.cpp new file mode 100644 index 00000000..4c727b48 --- /dev/null +++ b/src/ui/dialog/controller/ModuleControllerDialog.cpp @@ -0,0 +1,186 @@ +/** + * Copyright (C) 2021 Saturneric <[email protected]> + * + * 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. + * + * GpgFrontend 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 GpgFrontend. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from + * the gpg4usb project, which is under GPL-3.0-or-later. + * + * All the source code of GpgFrontend was modified and released by + * Saturneric <[email protected]> starting on May 12, 2021. + * + * SPDX-License-Identifier: GPL-3.0-or-later + * + */ + +#include "ModuleControllerDialog.h" + +#include "core/function/GlobalSettingStation.h" +#include "core/model/SettingsObject.h" +#include "core/struct/settings_object/ModuleSO.h" +#include "ui_ModuleControllerDialog.h" + +// +#include "core/module/ModuleManager.h" +#include "ui/widgets/ModuleListView.h" + +namespace GpgFrontend::UI { + +ModuleControllerDialog::ModuleControllerDialog(QWidget* parent) + : QDialog(parent), + ui_(std::make_shared<Ui_ModuleControllerDialog>()), + module_manager_(&Module::ModuleManager::GetInstance()) { + ui_->setupUi(this); + ui_->actionsGroupBox->hide(); + + ui_->moduleInfoLabel->setText(tr("Module Informations")); + ui_->actionsGroupBox->setTitle(tr("Actions")); + ui_->showModsDirButton->setText(tr("Show Mods Directory")); + + ui_->tabWidget->setTabText(0, tr("Registered Modules")); + ui_->tabWidget->setTabText(1, tr("Global Register Table")); + ui_->tabWidget->setTabText(2, tr("Debugger")); + + ui_->tipsLabel->setText( + tr("Tips: Module name front with \"*\" stands for integrated module.")); + + this->setWindowTitle(tr("Module Controller")); + + connect(ui_->moduleListView, &ModuleListView::SignalSelectModule, this, + &ModuleControllerDialog::slot_load_module_details); + + connect(ui_->activateOrDeactiveButton, &QPushButton::clicked, this, [=]() { + auto module_id = ui_->moduleListView->GetCurrentModuleID(); + if (module_id.isEmpty()) return; + + if (!module_manager_->IsModuleActivated(module_id)) { + module_manager_->ActiveModule(module_id); + } else { + module_manager_->DeactiveModule(module_id); + } + + QTimer::singleShot(1000, [=]() { slot_load_module_details(module_id); }); + }); + + connect(ui_->autoActivateButton, &QPushButton::clicked, this, [=]() { + auto module_id = ui_->moduleListView->GetCurrentModuleID(); + SettingsObject so(QString("module.%1.so").arg(module_id)); + ModuleSO module_so(so); + + module_so.auto_activate = + ui_->autoActivateButton->text() == tr("Enable Auto Activate"); + so.Store(module_so.ToJson()); + + QTimer::singleShot(1000, [=]() { slot_load_module_details(module_id); }); + }); + + connect(ui_->triggerEventButton, &QPushButton::clicked, this, [=]() { + auto event_id = + QInputDialog::getText(this, "Please provide an Event ID", "Event ID"); + Module::TriggerEvent(event_id); + }); + + connect(ui_->showModsDirButton, &QPushButton::clicked, this, [=]() { + QDesktopServices::openUrl(QUrl::fromLocalFile( + GlobalSettingStation::GetInstance().GetModulesDir())); + }); + +#ifdef RELEASE + ui_->tabWidget->setTabEnabled(2, false); +#endif +} + +void ModuleControllerDialog::slot_load_module_details( + Module::ModuleIdentifier module_id) { + GF_UI_LOG_DEBUG("loading module details, module id: {}", module_id); + auto module = module_manager_->SearchModule(module_id); + SettingsObject so(QString("module.%1.so").arg(module_id)); + ModuleSO module_so(so); + + if (module_id.isEmpty() || module == nullptr) { + ui_->actionsGroupBox->hide(); + return; + } + + ui_->actionsGroupBox->show(); + + if (module_so.module_id != module_id || + module_so.module_hash != module->GetModuleHash()) { + module_so.module_id = module_id; + module_so.module_hash = module->GetModuleHash(); + module_so.auto_activate = false; + GF_UI_LOG_DEBUG("reseting module settings object, module id: {}", + module_id); + so.Store(module_so.ToJson()); + } + + QString buffer; + QTextStream info(&buffer); + + info << "# " << tr("BASIC INFO") << Qt::endl << Qt::endl; + + info << " - " << tr("ID") << ": " << module->GetModuleIdentifier() + << Qt::endl; + info << " - " << tr("Version") << ": " << module->GetModuleVersion() + << Qt::endl; + info << " - " << tr("SDK Version") << ": " << module->GetModuleSDKVersion() + << Qt::endl; + info << " - " << tr("Qt ENV Version") << ": " + << module->GetModuleQtEnvVersion() << Qt::endl; + info << " - " << tr("Hash") << ": " << module->GetModuleHash() << Qt::endl; + info << " - " << tr("Path") << ": " << module->GetModulePath() << Qt::endl; + + auto if_activated = module_manager_->IsModuleActivated(module_id); + + info << " - " << tr("Auto Activate") << ": " + << (module_so.auto_activate ? tr("True") : tr("False")) << Qt::endl; + info << " - " << tr("Active") << ": " + << (if_activated ? tr("True") : tr("False")) << Qt::endl; + + info << Qt::endl; + + info << "# " << tr("METADATA") << Qt::endl << Qt::endl; + +#ifdef QT5_BUILD + auto map = module->GetModuleMetaData(); + for (auto it = map.keyValueBegin(); it != map.keyValueEnd(); ++it) { + info << " - " << it->first << ": " << it->second << "\n"; + } +#else + for (const auto& metadata : module->GetModuleMetaData().asKeyValueRange()) { + info << " - " << metadata.first << ": " << metadata.second << "\n"; + } +#endif + + info << Qt::endl; + + if (if_activated) { + info << "# " << tr("Listening Event") << Qt::endl << Qt::endl; + + auto listening_event_ids = module_manager_->GetModuleListening(module_id); + for (const auto& event_id : listening_event_ids) { + info << " - " << event_id << "\n"; + } + } + + ui_->moduleInfoTextBrowser->setText(buffer); + ui_->activateOrDeactiveButton->setText(if_activated ? tr("Deactivate") + : tr("Activate")); + ui_->autoActivateButton->setText(module_so.auto_activate + ? tr("Disable Auto Activate") + : tr("Enable Auto Activate")); +} +} // namespace GpgFrontend::UI diff --git a/src/module/integrated/gnupg_info_gathering_module/GnuPGInfoGatheringModule.h b/src/ui/dialog/controller/ModuleControllerDialog.h index 88f64d7d..6ded4808 100644 --- a/src/module/integrated/gnupg_info_gathering_module/GnuPGInfoGatheringModule.h +++ b/src/ui/dialog/controller/ModuleControllerDialog.h @@ -28,28 +28,34 @@ #pragma once -#include "GpgFrontendModuleExport.h" #include "core/module/Module.h" -namespace GpgFrontend::Module::Integrated::GnuPGInfoGatheringModule { +class Ui_ModuleControllerDialog; -/** - * @brief Use to record some info about gnupg - * - */ -class GPGFRONTEND_INTEGRATED_MODULE_GNUPG_INFO_GATHERING_EXPORT - GnuPGInfoGatheringModule : public Module { - public: - GnuPGInfoGatheringModule(); - - ~GnuPGInfoGatheringModule() override; +namespace GpgFrontend::UI { - auto Register() -> bool override; +class ModuleListView; - auto Active() -> bool override; - - auto Exec(EventRefrernce) -> int override; - - auto Deactive() -> bool override; +class ModuleControllerDialog : public QDialog { + Q_OBJECT + public: + /** + * @brief Construct a new Module Controller Dialog object + * + * @param parent + */ + explicit ModuleControllerDialog(QWidget* parent); + + private slots: + /** + * @brief + * + */ + void slot_load_module_details(Module::ModuleIdentifier); + + private: + std::shared_ptr<Ui_ModuleControllerDialog> ui_; ///< + Module::ModuleManager* module_manager_; }; -} // namespace GpgFrontend::Module::Integrated::GnuPGInfoGatheringModule + +} // namespace GpgFrontend::UI diff --git a/src/ui/dialog/help/AboutDialog.cpp b/src/ui/dialog/help/AboutDialog.cpp index e4a189a3..0735ddba 100644 --- a/src/ui/dialog/help/AboutDialog.cpp +++ b/src/ui/dialog/help/AboutDialog.cpp @@ -30,35 +30,46 @@ #include <openssl/opensslv.h> -#include <any> - -#include "GpgFrontendBuildInfo.h" -#include "core/function/GlobalSettingStation.h" #include "core/module/ModuleManager.h" +#include "core/utils/BuildInfoUtils.h" #include "ui/dialog/help/GnupgTab.h" namespace GpgFrontend::UI { -AboutDialog::AboutDialog(int defaultIndex, QWidget* parent) +AboutDialog::AboutDialog(const QString& default_tab_name, QWidget* parent) : GeneralDialog(typeid(AboutDialog).name(), parent) { this->setWindowTitle(tr("About") + " " + qApp->applicationName()); auto* tab_widget = new QTabWidget; auto* info_tab = new InfoTab(); - auto* gnupg_tab = new GnupgTab(); auto* translators_tab = new TranslatorsTab(); - update_tab_ = new UpdateTab(); tab_widget->addTab(info_tab, tr("About GpgFrontend")); - tab_widget->addTab(gnupg_tab, tr("GnuPG")); + + if (Module::IsModuleActivate(kGnuPGInfoGatheringModuleID)) { + auto* gnupg_tab = new GnupgTab(); + tab_widget->addTab(gnupg_tab, tr("GnuPG")); + } + tab_widget->addTab(translators_tab, tr("Translators")); - tab_widget->addTab(update_tab_, tr("Update")); + + if (Module::IsModuleActivate(kVersionCheckingModuleID)) { + auto* update_tab = new UpdateTab(); + tab_widget->addTab(update_tab, tr("Update")); + } connect(tab_widget, &QTabWidget::currentChanged, this, [&](int index) { GF_UI_LOG_DEBUG("current index: {}", index); }); - if (defaultIndex < tab_widget->count() && defaultIndex >= 0) { - tab_widget->setCurrentIndex(defaultIndex); + int default_index = 0; + for (int i = 0; i < tab_widget->count(); i++) { + if (tab_widget->tabText(i) == default_tab_name) { + default_index = i; + } + } + + if (default_index < tab_widget->count() && default_index >= 0) { + tab_widget->setCurrentIndex(default_index); } auto* button_box = new QDialogButtonBox(QDialogButtonBox::Ok); @@ -69,7 +80,7 @@ AboutDialog::AboutDialog(int defaultIndex, QWidget* parent) main_layout->addWidget(button_box); setLayout(main_layout); - this->resize(550, 650); + this->resize(520, 620); this->setMinimumWidth(450); this->show(); } @@ -81,11 +92,13 @@ InfoTab::InfoTab(QWidget* parent) : QWidget(parent) { "core", "gpgme.version", QString{"2.0.0"}); GF_UI_LOG_DEBUG("got gpgme version from rt: {}", gpgme_version); - auto* pixmap = new QPixmap(":/icons/gpgfrontend-logo.png"); - auto* text = new QString( + auto pixmap = QPixmap(":/icons/gpgfrontend_logo.png"); + pixmap = pixmap.scaled(128, 128); + + auto text = "<center><h2>" + qApp->applicationName() + "</h2></center>" + - "<center><b>" + qApp->applicationVersion() + "</b></center>" + - "<center>" + GIT_VERSION + "</center>" + "<br><center>" + + "<center><b>" + "v" + qApp->applicationVersion() + "</b></center>" + + "<center>" + GetProjectBuildGitVersion() + "</center>" + "<br><center>" + tr("GpgFrontend is an easy-to-use, compact, cross-platform, " "and installation-free GnuPG Frontend." "It visualizes most of the common operations of GnuPG." @@ -100,14 +113,15 @@ InfoTab::InfoTab(QWidget* parent) : QWidget(parent) { "href=\"mailto:[email protected]\">[email protected]</a>." + "<br><br> " + tr("Built with Qt") + " " + qVersion() + ", " + OPENSSL_VERSION_TEXT + " " + tr("and") + " " + "GPGME" + " " + gpgme_version + "<br>" + - tr("Built at") + " " + BUILD_TIMESTAMP + "</center>"); + tr("Built at") + " " + QLocale().toString(GetProjectBuildTimestamp()) + + "</center>"; auto* layout = new QGridLayout(); auto* pixmap_label = new QLabel(); - pixmap_label->setPixmap(*pixmap); + pixmap_label->setPixmap(pixmap); layout->addWidget(pixmap_label, 0, 0, 1, -1, Qt::AlignCenter); auto* about_label = new QLabel(); - about_label->setText(*text); + about_label->setText(text); about_label->setWordWrap(true); about_label->setOpenExternalLinks(true); layout->addWidget(about_label, 1, 0, 1, -1); @@ -139,14 +153,9 @@ TranslatorsTab::TranslatorsTab(QWidget* parent) : QWidget(parent) { } UpdateTab::UpdateTab(QWidget* parent) : QWidget(parent) { - auto* pixmap = new QPixmap(":/icons/gpgfrontend-logo.png"); auto* layout = new QGridLayout(); - auto* pixmap_label = new QLabel(); - pixmap_label->setPixmap(*pixmap); - layout->addWidget(pixmap_label, 0, 0, 1, -1, Qt::AlignCenter); - current_version_ = - QString("v") + VERSION_MAJOR + "." + VERSION_MINOR + "." + VERSION_PATCH; + current_version_ = GetProjectVersion(); auto* tips_label = new QLabel(); tips_label->setText( @@ -194,17 +203,15 @@ void UpdateTab::showEvent(QShowEvent* event) { GF_UI_LOG_DEBUG("loading version loading info from rt"); auto is_loading_done = Module::RetrieveRTValueTypedOrDefault<>( - "com.bktus.gpgfrontend.module.integrated.version-checking", - "version.loading_done", false); + kVersionCheckingModuleID, "version.loading_done", false); if (!is_loading_done) { Module::ListenRTPublishEvent( - this, "com.bktus.gpgfrontend.module.integrated.version-checking", - "version.loading_done", + this, kVersionCheckingModuleID, "version.loading_done", [=](Module::Namespace, Module::Key, int, std::any) { GF_UI_LOG_DEBUG( - "versionchecking version.loading_done changed, calling slot " - "version upgrade"); + "version_checking module version.loading_done changed, calling " + "slot version upgrade"); this->slot_show_version_status(); }); Module::TriggerEvent("CHECK_APPLICATION_VERSION"); @@ -218,29 +225,24 @@ void UpdateTab::slot_show_version_status() { this->pb_->setHidden(true); auto is_loading_done = Module::RetrieveRTValueTypedOrDefault<>( - "com.bktus.gpgfrontend.module.integrated.version-checking", - "version.loading_done", false); + kVersionCheckingModuleID, "version.loading_done", false); if (!is_loading_done) { - GF_UI_LOG_DEBUG("version info loading havn't been done yet."); + GF_UI_LOG_DEBUG("version info loading haven't been done yet."); return; } auto is_need_upgrade = Module::RetrieveRTValueTypedOrDefault<>( - "com.bktus.gpgfrontend.module.integrated.version-checking", - "version.need_upgrade", false); + kVersionCheckingModuleID, "version.need_upgrade", false); auto is_current_a_withdrawn_version = Module::RetrieveRTValueTypedOrDefault<>( - "com.bktus.gpgfrontend.module.integrated.version-checking", - "version.current_a_withdrawn_version", false); + kVersionCheckingModuleID, "version.current_a_withdrawn_version", false); auto is_current_version_released = Module::RetrieveRTValueTypedOrDefault<>( - "com.bktus.gpgfrontend.module.integrated.version-checking", - "version.current_version_released", false); + kVersionCheckingModuleID, "version.current_version_released", false); auto latest_version = Module::RetrieveRTValueTypedOrDefault<>( - "com.bktus.gpgfrontend.module.integrated.version-checking", - "version.latest_version", QString{}); + kVersionCheckingModuleID, "version.latest_version", QString{}); latest_version_label_->setText("<center><b>" + tr("Latest Version From Github") + ": " + diff --git a/src/ui/dialog/help/AboutDialog.h b/src/ui/dialog/help/AboutDialog.h index b7871a29..6d152afb 100644 --- a/src/ui/dialog/help/AboutDialog.h +++ b/src/ui/dialog/help/AboutDialog.h @@ -120,7 +120,7 @@ class AboutDialog : public GeneralDialog { * @param defaultIndex * @param parent */ - explicit AboutDialog(int defaultIndex, QWidget* parent); + explicit AboutDialog(const QString& default_tab_name, QWidget* parent); protected: /** @@ -129,9 +129,6 @@ class AboutDialog : public GeneralDialog { * @param ev */ void showEvent(QShowEvent* ev) override; - - private: - UpdateTab* update_tab_; ///< }; } // namespace GpgFrontend::UI diff --git a/src/ui/dialog/help/GnupgTab.cpp b/src/ui/dialog/help/GnupgTab.cpp index 1aceed1a..ac018def 100644 --- a/src/ui/dialog/help/GnupgTab.cpp +++ b/src/ui/dialog/help/GnupgTab.cpp @@ -35,7 +35,9 @@ #include "core/module/ModuleManager.h" #include "ui_GnuPGInfo.h" -GpgFrontend::UI::GnupgTab::GnupgTab(QWidget* parent) +namespace GpgFrontend::UI { + +GnupgTab::GnupgTab(QWidget* parent) : QWidget(parent), ui_(GpgFrontend::SecureCreateSharedObject<Ui_GnuPGInfo>()) { ui_->setupUi(this); @@ -55,11 +57,11 @@ GpgFrontend::UI::GnupgTab::GnupgTab(QWidget* parent) ui_->componentDetailsTable->setSelectionBehavior( QAbstractItemView::SelectRows); - // tableitems not editable + // table items not editable ui_->componentDetailsTable->setEditTriggers( QAbstractItemView::NoEditTriggers); - // no focus (rectangle around tableitems) + // no focus (rectangle around table items) // may be it should focus on whole row ui_->componentDetailsTable->setFocusPolicy(Qt::NoFocus); ui_->componentDetailsTable->setAlternatingRowColors(true); @@ -68,7 +70,7 @@ GpgFrontend::UI::GnupgTab::GnupgTab(QWidget* parent) directories_column_titles << tr("Directory Type") << tr("Path"); ui_->directoriesDetailsTable->setColumnCount( - directories_column_titles.length()); + static_cast<int>(directories_column_titles.length())); ui_->directoriesDetailsTable->setHorizontalHeaderLabels( directories_column_titles); ui_->directoriesDetailsTable->horizontalHeader()->setStretchLastSection( @@ -76,11 +78,11 @@ GpgFrontend::UI::GnupgTab::GnupgTab(QWidget* parent) ui_->directoriesDetailsTable->setSelectionBehavior( QAbstractItemView::SelectRows); - // tableitems not editable + // table items not editable ui_->directoriesDetailsTable->setEditTriggers( QAbstractItemView::NoEditTriggers); - // no focus (rectangle around tableitems) + // no focus (rectangle around table items) // may be it should focus on whole row ui_->directoriesDetailsTable->setFocusPolicy(Qt::NoFocus); ui_->directoriesDetailsTable->setAlternatingRowColors(true); @@ -95,18 +97,23 @@ GpgFrontend::UI::GnupgTab::GnupgTab(QWidget* parent) ui_->optionDetailsTable->horizontalHeader()->setStretchLastSection(false); ui_->optionDetailsTable->setSelectionBehavior(QAbstractItemView::SelectRows); - // tableitems not editable + // table items not editable ui_->optionDetailsTable->setEditTriggers(QAbstractItemView::NoEditTriggers); - // no focus (rectangle around tableitems) + // no focus (rectangle around table items) // may be it should focus on whole row ui_->optionDetailsTable->setFocusPolicy(Qt::NoFocus); ui_->optionDetailsTable->setAlternatingRowColors(true); - process_software_info(); + if (Module::RetrieveRTValueTypedOrDefault( + "ui", "env.state.gnupg_info_gathering", 0) == 1) { + process_software_info(); + } else { + gather_gnupg_info(); + } } -void GpgFrontend::UI::GnupgTab::process_software_info() { +void GnupgTab::process_software_info() { const auto gnupg_version = Module::RetrieveRTValueTypedOrDefault<>( "core", "gpgme.ctx.gnupg_version", QString{"2.0.0"}); GF_UI_LOG_DEBUG("got gnupg version from rt: {}", gnupg_version); @@ -114,9 +121,8 @@ void GpgFrontend::UI::GnupgTab::process_software_info() { ui_->gnupgVersionLabel->setText( QString::fromStdString(fmt::format("Version: {}", gnupg_version))); - auto components = Module::ListRTChildKeys( - "com.bktus.gpgfrontend.module.integrated.gnupg-info-gathering", - "gnupg.components"); + auto components = + Module::ListRTChildKeys(kGnuPGInfoGatheringModuleID, "gnupg.components"); GF_UI_LOG_DEBUG("got gnupg components from rt, size: {}", components.size()); ui_->componentDetailsTable->setRowCount(components.size()); @@ -124,12 +130,12 @@ void GpgFrontend::UI::GnupgTab::process_software_info() { int row = 0; for (auto& component : components) { auto component_info_json_bytes = Module::RetrieveRTValueTypedOrDefault( - "com.bktus.gpgfrontend.module.integrated.gnupg-info-gathering", - QString("gnupg.components.%1").arg(component), QByteArray{}); + kGnuPGInfoGatheringModuleID, + QString("gnupg.components.%1").arg(component), QString{}); GF_UI_LOG_DEBUG("got gnupg component {} info from rt", component); auto component_info_json = - QJsonDocument::fromJson(component_info_json_bytes); + QJsonDocument::fromJson(component_info_json_bytes.toUtf8()); if (!component_info_json.isObject()) { GF_UI_LOG_WARN("illegal gnupg component info, json: {}", QString(component_info_json_bytes)); @@ -170,17 +176,17 @@ void GpgFrontend::UI::GnupgTab::process_software_info() { ui_->componentDetailsTable->resizeColumnsToContents(); - auto directories = Module::ListRTChildKeys( - "com.bktus.gpgfrontend.module.integrated.gnupg-info-gathering", - QString("gnupg.dirs")); + auto directories = Module::ListRTChildKeys(kGnuPGInfoGatheringModuleID, + QString("gnupg.dirs")); - ui_->directoriesDetailsTable->setRowCount(directories.size()); + ui_->directoriesDetailsTable->setRowCount( + static_cast<int>(directories.size())); row = 0; for (auto& dir : directories) { const auto dir_path = Module::RetrieveRTValueTypedOrDefault( - "com.bktus.gpgfrontend.module.integrated.gnupg-info-gathering", - QString("gnupg.dirs.%1").arg(dir), QString{}); + kGnuPGInfoGatheringModuleID, QString("gnupg.dirs.%1").arg(dir), + QString{}); if (dir_path.isEmpty()) continue; @@ -197,20 +203,21 @@ void GpgFrontend::UI::GnupgTab::process_software_info() { ui_->directoriesDetailsTable->resizeColumnsToContents(); - // calcualte the total row number of configuration table + // calculate the total row number of configuration table row = 0; for (auto& component : components) { auto options = Module::ListRTChildKeys( - "com.bktus.gpgfrontend.module.integrated.gnupg-info-gathering", + kGnuPGInfoGatheringModuleID, QString("gnupg.components.%1.options").arg(component)); for (auto& option : options) { const auto option_info_json = QJsonDocument::fromJson(Module::RetrieveRTValueTypedOrDefault( - "com.bktus.gpgfrontend.module.integrated.gnupg-info-gathering", - QString("gnupg.components.%1.options.%2") - .arg(component) - .arg(option), - QByteArray{})); + kGnuPGInfoGatheringModuleID, + QString("gnupg.components.%1.options.%2") + .arg(component) + .arg(option), + QString{}) + .toUtf8()); if (!option_info_json.isObject()) continue; @@ -228,18 +235,19 @@ void GpgFrontend::UI::GnupgTab::process_software_info() { QString configuration_group; for (auto& component : components) { auto options = Module::ListRTChildKeys( - "com.bktus.gpgfrontend.module.integrated.gnupg-info-gathering", + kGnuPGInfoGatheringModuleID, QString("gnupg.components.%1.options").arg(component)); for (auto& option : options) { auto option_info_json_bytes = Module::RetrieveRTValueTypedOrDefault( - "com.bktus.gpgfrontend.module.integrated.gnupg-info-gathering", + kGnuPGInfoGatheringModuleID, QString("gnupg.components.%1.options.%2").arg(component).arg(option), - QByteArray{}); + QString{}); GF_UI_LOG_DEBUG("got gnupg component's option {} info from rt, info: {}", component, option_info_json_bytes); - auto option_info_json = QJsonDocument::fromJson(option_info_json_bytes); + auto option_info_json = + QJsonDocument::fromJson(option_info_json_bytes.toUtf8()); if (!option_info_json.isObject()) { GF_UI_LOG_WARN("illegal gnupg option info, json: {}", @@ -289,5 +297,40 @@ void GpgFrontend::UI::GnupgTab::process_software_info() { row++; } } - // ui_->configurationDetailsTable->resizeColumnsToContents(); + + ui_->loadProgressBar->hide(); + ui_->tabWidget->setDisabled(false); } + +void GnupgTab::gather_gnupg_info() { + // if gnupg_info_gathering module activated + if (Module::IsModuleActivate(kGnuPGInfoGatheringModuleID)) { + GF_CORE_LOG_DEBUG( + "module gnupg_info_gathering is activated, " + "loading external gnupg info..."); + + ui_->loadProgressBar->show(); + ui_->tabWidget->setDisabled(true); + + // gather external gnupg info + Module::TriggerEvent( + "REQUEST_GATHERING_GNUPG_INFO", + [=](const Module::EventIdentifier& /*e*/, + const Module::Event::ListenerIdentifier& l_id, DataObjectPtr o) { + GF_CORE_LOG_DEBUG( + "received event REQUEST_GATHERING_GNUPG_INFO callback " + "from module: {}", + l_id); + + if (l_id == kGnuPGInfoGatheringModuleID) { + Module::UpsertRTValue("ui", "env.state.gnupg_info_gathering", 1); + + // gnupg info gathering process finished + GF_CORE_LOG_INFO("gnupg information gathering finished"); + process_software_info(); + } + }); + } +} + +} // namespace GpgFrontend::UI
\ No newline at end of file diff --git a/src/ui/dialog/help/GnupgTab.h b/src/ui/dialog/help/GnupgTab.h index 9e6191db..60abd048 100644 --- a/src/ui/dialog/help/GnupgTab.h +++ b/src/ui/dialog/help/GnupgTab.h @@ -50,6 +50,16 @@ class GnupgTab : public QWidget { private: std::shared_ptr<Ui_GnuPGInfo> ui_; ///< + /** + * @brief + * + */ void process_software_info(); + + /** + * @brief + * + */ + void gather_gnupg_info(); }; } // namespace GpgFrontend::UI diff --git a/src/ui/dialog/import_export/KeyServerImportDialog.cpp b/src/ui/dialog/import_export/KeyServerImportDialog.cpp index 296df539..575a97e4 100644 --- a/src/ui/dialog/import_export/KeyServerImportDialog.cpp +++ b/src/ui/dialog/import_export/KeyServerImportDialog.cpp @@ -28,14 +28,12 @@ #include "KeyServerImportDialog.h" -#include <QRegExp> - #include "core/GpgModel.h" #include "core/function/GlobalSettingStation.h" #include "core/function/gpg/GpgKeyImportExporter.h" +#include "core/model/SettingsObject.h" #include "ui/UISignalStation.h" -#include "ui/struct/SettingsObject.h" -#include "ui/struct/settings/KeyServerSO.h" +#include "ui/struct/settings_object/KeyServerSO.h" #include "ui/thread/KeyServerImportTask.h" #include "ui/thread/KeyServerSearchTask.h" @@ -243,11 +241,14 @@ void KeyServerImportDialog::slot_search_finished( set_message("<h4>" + tr("Too many responses from keyserver!") + "</h4>", true); return; - } else if (text.contains("No keys found")) { + } + + if (text.contains("No keys found")) { + auto query = search_line_edit_->text(); + // if string looks like hex string, search again with 0x prepended - QRegExp rx("[0-9A-Fa-f]*"); - QString query = search_line_edit_->text(); - if (rx.exactMatch(query)) { + QRegularExpression rx("[0-9A-Fa-f]*"); + if (rx.match(query).hasMatch()) { set_message("<h4>" + tr("No keys found, input may be kexId, retrying search " "with 0x.") + @@ -257,102 +258,104 @@ void KeyServerImportDialog::slot_search_finished( this->slot_search(); return; } + set_message( "<h4>" + tr("No keys found containing the search string!") + "</h4>", true); return; + } - } else if (text.contains("Insufficiently specific words")) { + if (text.contains("Insufficiently specific words")) { set_message( "<h4>" + tr("Insufficiently specific search string!") + "</h4>", true); return; - } else { - set_message(text, true); - return; } - } else { - int row = 0; - bool strikeout = false; - - // read lines until end of steam - while (!stream.atEnd()) { - QStringList line = - QString::fromUtf8(QByteArray::fromPercentEncoding( - stream.readLine().trimmed().toUtf8())) - .split(":"); - - // TODO: have a look at two following pub lines - if (line[0] == "pub") { - strikeout = false; - - QString flags = line[line.size() - 1]; - keys_table_->setRowCount(row + 1); - - // flags can be "d" for disabled, "r" for revoked - // or "e" for expired - if (flags.contains("r") or flags.contains("d") or flags.contains("e")) { - strikeout = true; - if (flags.contains("e")) { - keys_table_->setItem(row, 3, - new QTableWidgetItem(QString("expired"))); - } - if (flags.contains("r")) { - keys_table_->setItem(row, 3, new QTableWidgetItem(tr("revoked"))); - } - if (flags.contains("d")) { - keys_table_->setItem(row, 3, new QTableWidgetItem(tr("disabled"))); - } - } - QStringList line2 = QString(QByteArray::fromPercentEncoding( - stream.readLine().trimmed().toUtf8())) - .split(":"); + set_message(text, true); + return; + } - auto* uid = new QTableWidgetItem(); - if (line2.size() > 1) { - uid->setText(line2[1]); - keys_table_->setItem(row, 0, uid); + int row = 0; + bool strikeout = false; + + // read lines until end of steam + while (!stream.atEnd()) { + QStringList line = + QString::fromUtf8(QByteArray::fromPercentEncoding( + stream.readLine().trimmed().toUtf8())) + .split(":"); + + // TODO: have a look at two following pub lines + if (line[0] == "pub") { + strikeout = false; + + QString flags = line[line.size() - 1]; + keys_table_->setRowCount(row + 1); + + // flags can be "d" for disabled, "r" for revoked + // or "e" for expired + if (flags.contains("r") or flags.contains("d") or flags.contains("e")) { + strikeout = true; + if (flags.contains("e")) { + keys_table_->setItem(row, 3, + new QTableWidgetItem(QString("expired"))); + } + if (flags.contains("r")) { + keys_table_->setItem(row, 3, new QTableWidgetItem(tr("revoked"))); + } + if (flags.contains("d")) { + keys_table_->setItem(row, 3, new QTableWidgetItem(tr("disabled"))); } - auto* creation_date = - new QTableWidgetItem(QDateTime::fromSecsSinceEpoch(line[4].toInt()) - .toString("dd. MMM. yyyy")); - keys_table_->setItem(row, 1, creation_date); - auto* keyid = new QTableWidgetItem(line[1]); - keys_table_->setItem(row, 2, keyid); + } + + QStringList line2 = QString(QByteArray::fromPercentEncoding( + stream.readLine().trimmed().toUtf8())) + .split(":"); + + auto* uid = new QTableWidgetItem(); + if (line2.size() > 1) { + uid->setText(line2[1]); + keys_table_->setItem(row, 0, uid); + } + auto* creation_date = + new QTableWidgetItem(QDateTime::fromSecsSinceEpoch(line[4].toInt()) + .toString("dd. MMM. yyyy")); + keys_table_->setItem(row, 1, creation_date); + auto* keyid = new QTableWidgetItem(line[1]); + keys_table_->setItem(row, 2, keyid); + if (strikeout) { + QFont strike = uid->font(); + strike.setStrikeOut(true); + uid->setFont(strike); + creation_date->setFont(strike); + keyid->setFont(strike); + } + row++; + } else { + if (line[0] == "uid") { + QStringList l; + int height = keys_table_->rowHeight(row - 1); + keys_table_->setRowHeight(row - 1, height + 16); + QString tmp = keys_table_->item(row - 1, 0)->text(); + tmp.append(QString("\n") + line[1]); + auto* tmp1 = new QTableWidgetItem(tmp); + keys_table_->setItem(row - 1, 0, tmp1); if (strikeout) { - QFont strike = uid->font(); + QFont strike = tmp1->font(); strike.setStrikeOut(true); - uid->setFont(strike); - creation_date->setFont(strike); - keyid->setFont(strike); - } - row++; - } else { - if (line[0] == "uid") { - QStringList l; - int height = keys_table_->rowHeight(row - 1); - keys_table_->setRowHeight(row - 1, height + 16); - QString tmp = keys_table_->item(row - 1, 0)->text(); - tmp.append(QString("\n") + line[1]); - auto* tmp1 = new QTableWidgetItem(tmp); - keys_table_->setItem(row - 1, 0, tmp1); - if (strikeout) { - QFont strike = tmp1->font(); - strike.setStrikeOut(true); - tmp1->setFont(strike); - } + tmp1->setFont(strike); } } - set_message( - QString("<h4>") + - tr("%1 keys found. Double click a key to import it.").arg(row) + - "</h4>", - false); } - keys_table_->resizeColumnsToContents(); - import_button_->setDisabled(keys_table_->size().isEmpty()); + set_message( + QString("<h4>") + + tr("%1 keys found. Double click a key to import it.").arg(row) + + "</h4>", + false); } + keys_table_->resizeColumnsToContents(); + import_button_->setDisabled(keys_table_->size().isEmpty()); } void KeyServerImportDialog::slot_import() { diff --git a/src/ui/dialog/import_export/KeyUploadDialog.cpp b/src/ui/dialog/import_export/KeyUploadDialog.cpp index f59f9daa..7ab34c49 100644 --- a/src/ui/dialog/import_export/KeyUploadDialog.cpp +++ b/src/ui/dialog/import_export/KeyUploadDialog.cpp @@ -33,10 +33,11 @@ #include "core/GpgModel.h" #include "core/function/gpg/GpgKeyGetter.h" #include "core/function/gpg/GpgKeyImportExporter.h" +#include "core/model/SettingsObject.h" +#include "core/utils/BuildInfoUtils.h" #include "core/utils/GpgUtils.h" #include "ui/UserInterfaceUtils.h" -#include "ui/struct/SettingsObject.h" -#include "ui/struct/settings/KeyServerSO.h" +#include "ui/struct/settings_object/KeyServerSO.h" namespace GpgFrontend::UI { @@ -115,6 +116,8 @@ void KeyUploadDialog::slot_upload_key_to_server( data.replace(" ", "+"); QNetworkRequest request(req_url); + request.setHeader(QNetworkRequest::UserAgentHeader, + GetHttpRequestUserAgent()); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); diff --git a/src/ui/dialog/key_generate/KeygenDialog.cpp b/src/ui/dialog/key_generate/KeygenDialog.cpp index 5251d15e..7585d6f0 100644 --- a/src/ui/dialog/key_generate/KeygenDialog.cpp +++ b/src/ui/dialog/key_generate/KeygenDialog.cpp @@ -141,7 +141,8 @@ void KeyGenDialog::slot_key_gen_accept() { if (!GlobalSettingStation::GetInstance() .GetSettings() - .value("gnupg/use_pinentry_as_password_input_dialog", true) + .value("gnupg/use_pinentry_as_password_input_dialog", + QString::fromLocal8Bit(qgetenv("container")) != "flatpak") .toBool() && !no_pass_phrase_check_box_->isChecked()) { SetCacheValue("PinentryContext", "NEW_PASSPHRASE"); diff --git a/src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp b/src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp index 1528b7d8..2a9a4c96 100644 --- a/src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp +++ b/src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp @@ -319,7 +319,7 @@ void KeyPairSubkeyTab::slot_edit_subkey() { void KeyPairSubkeyTab::slot_revoke_subkey() {} void KeyPairSubkeyTab::contextMenuEvent(QContextMenuEvent* event) { - if (!subkey_list_->selectedItems().isEmpty()) { + if (key_.IsPrivateKey() && !subkey_list_->selectedItems().isEmpty()) { subkey_opera_menu_->exec(event->globalPos()); } } diff --git a/src/ui/dialog/settings/SettingsAppearance.cpp b/src/ui/dialog/settings/SettingsAppearance.cpp index d4f97c4c..f09f9823 100644 --- a/src/ui/dialog/settings/SettingsAppearance.cpp +++ b/src/ui/dialog/settings/SettingsAppearance.cpp @@ -28,9 +28,10 @@ #include "SettingsAppearance.h" +#include "core/function/GlobalSettingStation.h" +#include "core/model/SettingsObject.h" #include "core/utils/MemoryUtils.h" -#include "ui/struct/SettingsObject.h" -#include "ui/struct/settings/AppearanceSO.h" +#include "ui/struct/settings_object/AppearanceSO.h" #include "ui_AppearanceSettings.h" namespace GpgFrontend::UI { @@ -39,26 +40,28 @@ AppearanceTab::AppearanceTab(QWidget* parent) : QWidget(parent), ui_(SecureCreateSharedObject<Ui_AppearanceSettings>()) { ui_->setupUi(this); - ui_->iconSizeBox->setTitle(tr("Icon Size")); + ui_->generalBox->setTitle(tr("General")); + + ui_->themaLabel->setText(tr("Theme")); + ui_->windowStateCheckBox->setText( + tr("Save window size and position on exit.")); + + ui_->toolbarIconBox->setTitle(tr("Toolbar Icon")); + + ui_->toolbarIconSizeLabel->setText(tr("Size")); ui_->smallRadioButton->setText(tr("small")); ui_->mediumRadioButton->setText(tr("medium")); ui_->largeRadioButton->setText(tr("large")); - ui_->iconStyleBox->setTitle(tr("Icon Style")); + ui_->toolbarIconStyleLabel->setText(tr("Style")); ui_->justTextRadioButton->setText(tr("just text")); ui_->justIconRadioButton->setText(tr("just icons")); ui_->textAndIconsRadioButton->setText(tr("text and icons")); - ui_->windowStateBox->setTitle(tr("Window State")); - ui_->windowStateCheckBox->setText( - tr("Save window size and position on exit.")); - - ui_->textEditorBox->setTitle(tr("Text Editor")); - ui_->fontSizeTextEditorLabel->setText(tr("Font Size in Text Editor")); + ui_->fontSizeBox->setTitle(tr("Font Size")); - ui_->informationBoardBox->setTitle(tr("Information Board")); - ui_->fontSizeInformationBoardLabel->setText( - tr("Font Size in Information Board")); + ui_->fontSizeTextEditorLabel->setText(tr("Text Editor")); + ui_->fontSizeInformationBoardLabel->setText(tr("Information Board")); icon_size_group_ = new QButtonGroup(this); icon_size_group_->addButton(ui_->smallRadioButton, 1); @@ -71,10 +74,13 @@ AppearanceTab::AppearanceTab(QWidget* parent) icon_style_group_->addButton(ui_->textAndIconsRadioButton, 3); SetSettings(); + + connect(ui_->themeComboBox, qOverload<int>(&QComboBox::currentIndexChanged), + this, &AppearanceTab::SignalRestartNeeded); } void AppearanceTab::SetSettings() { - AppearanceSO appearance(SettingsObject("general_settings_state")); + AppearanceSO const appearance(SettingsObject("general_settings_state")); auto icon_size = QSize(appearance.tool_bar_icon_width, appearance.tool_bar_icon_height); @@ -123,6 +129,34 @@ void AppearanceTab::SetSettings() { text_editor_info_font_size = 10; } ui_->fontSizeTextEditorLabelSpinBox->setValue(text_editor_info_font_size); + + // init available styles + for (const auto& s : QStyleFactory::keys()) { + ui_->themeComboBox->addItem(s.toLower()); + } + + auto settings = GlobalSettingStation::GetInstance().GetSettings(); + auto theme = settings.value("appearance/theme").toString(); + + auto target_theme_index = ui_->themeComboBox->findText(theme); + if (theme.isEmpty() || target_theme_index == -1) { +#ifdef QT5_BUILD + GF_UI_LOG_DEBUG( + "There is not valid theme found from settings, " + "using current theme (qt5): {}", + QApplication::style()->metaObject()->className()); + ui_->themeComboBox->setCurrentIndex(ui_->themeComboBox->findText( + QApplication::style()->metaObject()->className())); +#else + GF_UI_LOG_DEBUG( + "There is not valid theme found from settings, using current theme: {}", + QApplication::style()->name()); + ui_->themeComboBox->setCurrentIndex( + ui_->themeComboBox->findText(QApplication::style()->name())); +#endif + } else { + ui_->themeComboBox->setCurrentIndex(target_theme_index); + } } void AppearanceTab::ApplySettings() { @@ -169,6 +203,9 @@ void AppearanceTab::ApplySettings() { ui_->fontSizeTextEditorLabelSpinBox->value(); general_settings_state.Store(appearance.ToJson()); + + auto settings = GlobalSettingStation::GetInstance().GetSettings(); + settings.setValue("appearance/theme", ui_->themeComboBox->currentText()); } } // namespace GpgFrontend::UI diff --git a/src/ui/dialog/settings/SettingsAppearance.h b/src/ui/dialog/settings/SettingsAppearance.h index 6d426934..ca520ba7 100644 --- a/src/ui/dialog/settings/SettingsAppearance.h +++ b/src/ui/dialog/settings/SettingsAppearance.h @@ -70,7 +70,7 @@ class AppearanceTab : public QWidget { * * @param needed */ - void signalRestartNeeded(bool needed); + void SignalRestartNeeded(); }; } // namespace GpgFrontend::UI diff --git a/src/ui/dialog/settings/SettingsDialog.cpp b/src/ui/dialog/settings/SettingsDialog.cpp index cb17eb0d..70b8c7b0 100644 --- a/src/ui/dialog/settings/SettingsDialog.cpp +++ b/src/ui/dialog/settings/SettingsDialog.cpp @@ -30,7 +30,6 @@ #include "core/GpgConstants.h" #include "core/GpgModel.h" -#include "core/function/GlobalSettingStation.h" #include "ui/dialog/settings/SettingsAppearance.h" #include "ui/dialog/settings/SettingsGeneral.h" #include "ui/dialog/settings/SettingsKeyServer.h" @@ -74,24 +73,17 @@ SettingsDialog::SettingsDialog(QWidget* parent) setLayout(main_layout); - // slots for handling the restart needed member - this->slot_set_restart_needed(0); - // restart ui connect(general_tab_, &GeneralTab::SignalRestartNeeded, this, - [=](bool needed) { - if (needed && restart_needed_ < kRestartCode) { - this->restart_needed_ = kRestartCode; - } - }); + &SettingsDialog::slot_declare_a_restart); // restart core and ui connect(general_tab_, &GeneralTab::SignalDeepRestartNeeded, this, - [=](bool needed) { - if (needed && restart_needed_ < kDeepRestartCode) { - this->restart_needed_ = kDeepRestartCode; - } - }); + &SettingsDialog::slot_declare_a_deep_restart); + + // restart core and ui + connect(appearance_tab_, &AppearanceTab::SignalRestartNeeded, this, + &SettingsDialog::slot_declare_a_restart); // announce main window connect(this, &SettingsDialog::SignalRestartNeeded, @@ -102,12 +94,16 @@ SettingsDialog::SettingsDialog(QWidget* parent) this->show(); } -auto SettingsDialog::get_restart_needed() const -> int { - return this->restart_needed_; +void SettingsDialog::slot_declare_a_restart() { + if (restart_mode_ < kRestartCode) { + this->restart_mode_ = kRestartCode; + } } -void SettingsDialog::slot_set_restart_needed(int mode) { - this->restart_needed_ = mode; +void SettingsDialog::slot_declare_a_deep_restart() { + if (restart_mode_ < kDeepRestartCode) { + this->restart_mode_ = kDeepRestartCode; + } } void SettingsDialog::SlotAccept() { @@ -116,9 +112,9 @@ void SettingsDialog::SlotAccept() { key_server_tab_->ApplySettings(); network_tab_->ApplySettings(); - GF_UI_LOG_DEBUG("restart needed: {}", get_restart_needed()); - if (get_restart_needed() != 0) { - emit SignalRestartNeeded(get_restart_needed()); + GF_UI_LOG_DEBUG("ui restart status: {}", restart_mode_); + if (restart_mode_ != kNonRestartCode) { + emit SignalRestartNeeded(restart_mode_); } close(); } @@ -127,7 +123,7 @@ auto SettingsDialog::ListLanguages() -> QHash<QString, QString> { QHash<QString, QString> languages; languages.insert(QString(), tr("System Default")); - QStringList filenames = QDir(QLatin1String(":/i18n")).entryList(); + auto filenames = QDir(QLatin1String(":/i18n")).entryList(); for (const auto& file : filenames) { GF_UI_LOG_DEBUG("get locale from locale directory: {}", file); diff --git a/src/ui/dialog/settings/SettingsDialog.h b/src/ui/dialog/settings/SettingsDialog.h index c99ac23c..f74b2cc0 100644 --- a/src/ui/dialog/settings/SettingsDialog.h +++ b/src/ui/dialog/settings/SettingsDialog.h @@ -82,26 +82,23 @@ class SettingsDialog : public GeneralDialog { void SignalRestartNeeded(int); private: - QTabWidget* tab_widget_; ///< - QDialogButtonBox* button_box_; ///< - int restart_needed_{0}; ///< + QTabWidget* tab_widget_; ///< + QDialogButtonBox* button_box_; ///< + int restart_mode_{kNonRestartCode}; ///< + + private slots: /** - * @brief Get the Restart Needed object + * @brief * - * @return true - * @return false */ - int get_restart_needed() const; - - private slots: + void slot_declare_a_restart(); /** * @brief * - * @param needed */ - void slot_set_restart_needed(int); + void slot_declare_a_deep_restart(); }; } // namespace GpgFrontend::UI diff --git a/src/ui/dialog/settings/SettingsGeneral.cpp b/src/ui/dialog/settings/SettingsGeneral.cpp index bcf42867..9764b747 100644 --- a/src/ui/dialog/settings/SettingsGeneral.cpp +++ b/src/ui/dialog/settings/SettingsGeneral.cpp @@ -73,7 +73,7 @@ GeneralTab::GeneralTab(QWidget* parent) ui_->langSelectBox->addItem(l); } connect(ui_->langSelectBox, qOverload<int>(&QComboBox::currentIndexChanged), - this, &GeneralTab::slot_language_changed); + this, &GeneralTab::SignalRestartNeeded); connect(ui_->clearAllLogFilesButton, &QPushButton::clicked, this, [=]() { GlobalSettingStation::GetInstance().ClearAllLogFiles(); @@ -109,28 +109,28 @@ GeneralTab::GeneralTab(QWidget* parent) void GeneralTab::SetSettings() { auto settings = GlobalSettingStation::GetInstance().GetSettings(); - bool clear_gpg_password_cache = + auto clear_gpg_password_cache = settings.value("basic/clear_gpg_password_cache", true).toBool(); ui_->clearGpgPasswordCacheCheckBox->setCheckState( clear_gpg_password_cache ? Qt::Checked : Qt::Unchecked); - bool restore_text_editor_page = + auto restore_text_editor_page = settings.value("basic/restore_text_editor_page", true).toBool(); ui_->restoreTextEditorPageCheckBox->setCheckState( restore_text_editor_page ? Qt::Checked : Qt::Unchecked); - bool longer_expiration_date = + auto longer_expiration_date = settings.value("basic/longer_expiration_date", false).toBool(); ui_->longerKeyExpirationDateCheckBox->setCheckState( longer_expiration_date ? Qt::Checked : Qt::Unchecked); - bool confirm_import_keys = + auto confirm_import_keys = settings.value("basic/confirm_import_keys", false).toBool(); ui_->importConfirmationCheckBox->setCheckState( confirm_import_keys ? Qt::Checked : Qt::Unchecked); - QString lang_key = settings.value("basic/lang").toString(); - QString lang_value = lang_.value(lang_key); + auto lang_key = settings.value("basic/lang").toString(); + auto lang_value = lang_.value(lang_key); GF_UI_LOG_DEBUG("lang settings current: {}", lang_value); if (!lang_.empty()) { ui_->langSelectBox->setCurrentIndex( @@ -155,6 +155,4 @@ void GeneralTab::ApplySettings() { settings.setValue("basic/lang", lang_.key(ui_->langSelectBox->currentText())); } -void GeneralTab::slot_language_changed() { emit SignalRestartNeeded(true); } - } // namespace GpgFrontend::UI diff --git a/src/ui/dialog/settings/SettingsGeneral.h b/src/ui/dialog/settings/SettingsGeneral.h index 284843d4..d6e954de 100644 --- a/src/ui/dialog/settings/SettingsGeneral.h +++ b/src/ui/dialog/settings/SettingsGeneral.h @@ -69,27 +69,19 @@ class GeneralTab : public QWidget { * * @param needed */ - void SignalRestartNeeded(bool needed); + void SignalRestartNeeded(); /** * @brief * * @param needed */ - void SignalDeepRestartNeeded(bool needed); + void SignalDeepRestartNeeded(); private: std::shared_ptr<Ui_GeneralSettings> ui_; ///< QHash<QString, QString> lang_; ///< std::vector<QString> key_ids_list_; ///< KeyList* m_key_list_{}; ///< - - private slots: - - /** - * @brief - * - */ - void slot_language_changed(); }; } // namespace GpgFrontend::UI diff --git a/src/ui/dialog/settings/SettingsKeyServer.cpp b/src/ui/dialog/settings/SettingsKeyServer.cpp index 5613ed45..fb6e624c 100644 --- a/src/ui/dialog/settings/SettingsKeyServer.cpp +++ b/src/ui/dialog/settings/SettingsKeyServer.cpp @@ -31,10 +31,10 @@ #include <cstddef> #include "core/function/GlobalSettingStation.h" +#include "core/model/SettingsObject.h" #include "core/thread/Task.h" #include "core/thread/TaskRunnerGetter.h" -#include "ui/struct/SettingsObject.h" -#include "ui/struct/settings/KeyServerSO.h" +#include "ui/struct/settings_object/KeyServerSO.h" #include "ui/thread/ListedKeyServerTestTask.h" #include "ui_KeyServerSettings.h" diff --git a/src/ui/dialog/settings/SettingsNetwork.cpp b/src/ui/dialog/settings/SettingsNetwork.cpp index c7e1e9f6..d4840063 100644 --- a/src/ui/dialog/settings/SettingsNetwork.cpp +++ b/src/ui/dialog/settings/SettingsNetwork.cpp @@ -29,6 +29,7 @@ #include "SettingsNetwork.h" #include "core/function/GlobalSettingStation.h" +#include "core/module/ModuleManager.h" #include "ui/thread/ProxyConnectionTestTask.h" #include "ui_NetworkSettings.h" @@ -86,60 +87,62 @@ GpgFrontend::UI::NetworkTab::NetworkTab(QWidget *parent) ui_->forbidALLGnuPGNetworkConnectionCheckBox->setText( tr("Forbid all GnuPG network connection.")); - ui_->prohibitUpdateCheck->setText( - tr("Prohibit checking for version updates when the program starts.")); + + if (Module::IsModuleActivate(kVersionCheckingModuleID)) { + ui_->prohibitUpdateCheck->setText( + tr("Prohibit checking for version updates when the program starts.")); + } ui_->autoImportMissingKeyCheckBox->setText( tr("Automatically import a missing key for signature verification.")); ui_->networkAbilityTipsLabel->setText( tr("Tips: These Option Changes take effect only after the " "application restart.")); - SetSettings(); } void GpgFrontend::UI::NetworkTab::SetSettings() { auto settings = GlobalSettingStation::GetInstance().GetSettings(); - QString proxy_host = settings.value("proxy/proxy_host").toString(); + auto proxy_host = settings.value("proxy/proxy_host").toString(); ui_->proxyServerAddressEdit->setText(proxy_host); - QString username = settings.value("proxy/username").toString(); + auto username = settings.value("proxy/username").toString(); ui_->usernameEdit->setText(username); - QString password = settings.value("proxy/password").toString(); + auto password = settings.value("proxy/password").toString(); ui_->passwordEdit->setText(password); - int port = settings.value("proxy/port", 0).toInt(); + auto port = settings.value("proxy/port", 0).toInt(); ui_->portSpin->setValue(port); ui_->proxyTypeComboBox->setCurrentText("HTTP"); - QString proxy_type = settings.value("proxy/proxy_type").toString(); + auto proxy_type = settings.value("proxy/proxy_type").toString(); ui_->proxyTypeComboBox->setCurrentText(proxy_type); switch_ui_proxy_type(ui_->proxyTypeComboBox->currentText()); ui_->enableProxyCheckBox->setCheckState(Qt::Unchecked); - bool proxy_enable = settings.value("proxy/enable", false).toBool(); + auto proxy_enable = settings.value("proxy/enable", false).toBool(); ui_->enableProxyCheckBox->setCheckState(proxy_enable ? Qt::Checked : Qt::Unchecked); - bool forbid_all_gnupg_connection = + auto forbid_all_gnupg_connection = settings.value("network/forbid_all_gnupg_connection").toBool(); ui_->forbidALLGnuPGNetworkConnectionCheckBox->setCheckState( forbid_all_gnupg_connection ? Qt::Checked : Qt::Unchecked); - bool prohibit_update_checking = + auto prohibit_update_checking = settings.value("network/prohibit_update_checking").toBool(); ui_->prohibitUpdateCheck->setCheckState( prohibit_update_checking ? Qt::Checked : Qt::Unchecked); - bool auto_import_missing_key = + auto auto_import_missing_key = settings.value("network/auto_import_missing_key", true).toBool(); ui_->autoImportMissingKeyCheckBox->setCheckState( auto_import_missing_key ? Qt::Checked : Qt::Unchecked); - switch_ui_enabled(ui_->enableProxyCheckBox->isChecked()); switch_ui_proxy_type(ui_->proxyTypeComboBox->currentText()); + switch_ui_enabled(ui_->enableProxyCheckBox->isChecked()); } void GpgFrontend::UI::NetworkTab::ApplySettings() { @@ -171,7 +174,7 @@ void GpgFrontend::UI::NetworkTab::slot_test_proxy_connection_result() { tr("Server Url"), QLineEdit::Normal, "https://", &ok); if (ok && !url.isEmpty()) { - auto task = new ProxyConnectionTestTask(url, 800); + auto *task = new ProxyConnectionTestTask(url, 800); connect(task, &GpgFrontend::UI::ProxyConnectionTestTask:: SignalProxyConnectionTestResult, @@ -193,7 +196,7 @@ void GpgFrontend::UI::NetworkTab::slot_test_proxy_connection_result() { auto *waiting_dialog = new QProgressDialog(this); waiting_dialog->setMaximum(0); waiting_dialog->setMinimum(0); - auto waiting_dialog_label = new QLabel( + auto *waiting_dialog_label = new QLabel( tr("Test Proxy Server Connection...") + "<br /><br />" + tr("Is using your proxy settings to access the url. Note that this " "test " diff --git a/src/ui/main_window/GeneralMainWindow.cpp b/src/ui/main_window/GeneralMainWindow.cpp index f58326f9..3d662332 100644 --- a/src/ui/main_window/GeneralMainWindow.cpp +++ b/src/ui/main_window/GeneralMainWindow.cpp @@ -28,9 +28,9 @@ #include "GeneralMainWindow.h" -#include "ui/struct/SettingsObject.h" -#include "ui/struct/settings/AppearanceSO.h" -#include "ui/struct/settings/WindowStateSO.h" +#include "core/model/SettingsObject.h" +#include "ui/struct/settings_object/AppearanceSO.h" +#include "ui/struct/settings_object/WindowStateSO.h" namespace GpgFrontend::UI { @@ -65,6 +65,8 @@ void GpgFrontend::UI::GeneralMainWindow::slot_restore_settings() noexcept { QByteArray::fromBase64(window_state.window_state_data.toUtf8())); } + this->setMinimumSize(640, 480); + // restore window size & location if (window_state.window_save) { pos_ = {window_state.x, window_state.y}; @@ -96,16 +98,16 @@ void GpgFrontend::UI::GeneralMainWindow::slot_restore_settings() noexcept { parent_size.height()); if (parent_pos != QPoint{0, 0}) { - QPoint parent_center{parent_pos.x() + parent_size.width() / 2, - parent_pos.y() + parent_size.height() / 2}; + QPoint const parent_center{parent_pos.x() + parent_size.width() / 2, + parent_pos.y() + parent_size.height() / 2}; pos_ = {parent_center.x() - size_.width() / 2, parent_center.y() - size_.height() / 2}; } } - if (size_.width() < 600) size_.setWidth(600); - if (size_.height() < 400) size_.setHeight(400); + if (size_.width() < 640) size_.setWidth(640); + if (size_.height() < 480) size_.setHeight(480); this->move(pos_); this->resize(size_); @@ -114,7 +116,7 @@ void GpgFrontend::UI::GeneralMainWindow::slot_restore_settings() noexcept { } // appearance - AppearanceSO appearance(SettingsObject("general_settings_state")); + AppearanceSO const appearance(SettingsObject("general_settings_state")); icon_size_ = {appearance.tool_bar_icon_width, appearance.tool_bar_icon_height}; @@ -125,7 +127,7 @@ void GpgFrontend::UI::GeneralMainWindow::slot_restore_settings() noexcept { icon_style_ = toolButtonStyle(); } catch (...) { - GF_UI_LOG_ERROR("gernal main window: {}, caught exception", name_); + GF_UI_LOG_ERROR("general main window: {}, caught exception", name_); } } @@ -148,7 +150,7 @@ void GpgFrontend::UI::GeneralMainWindow::slot_save_settings() noexcept { general_windows_state.Store(window_state.Json()); } catch (...) { - GF_UI_LOG_ERROR("gernal main window: {}, caught exception", name_); + GF_UI_LOG_ERROR("general main window: {}, caught exception", name_); } } diff --git a/src/ui/main_window/KeyMgmt.cpp b/src/ui/main_window/KeyMgmt.cpp index 96df89d1..afc6129c 100644 --- a/src/ui/main_window/KeyMgmt.cpp +++ b/src/ui/main_window/KeyMgmt.cpp @@ -121,7 +121,7 @@ KeyMgmt::KeyMgmt(QWidget* parent) this->statusBar()->show(); setWindowTitle(tr("KeyPair Management")); - setMinimumSize(QSize(600, 400)); + setMinimumSize(QSize(640, 480)); key_list_->AddMenuAction(generate_subkey_act_); key_list_->AddMenuAction(delete_selected_keys_act_); @@ -229,22 +229,26 @@ void KeyMgmt::create_actions() { &KeyMgmt::SlotExportAsOpenSSHFormat); delete_selected_keys_act_ = new QAction(tr("Delete Selected Key(s)"), this); + delete_selected_keys_act_->setIcon(QIcon(":/icons/button_delete.png")); delete_selected_keys_act_->setToolTip(tr("Delete the Selected keys")); connect(delete_selected_keys_act_, &QAction::triggered, this, &KeyMgmt::SlotDeleteSelectedKeys); delete_checked_keys_act_ = new QAction(tr("Delete Checked Key(s)"), this); - delete_checked_keys_act_->setToolTip(tr("Delete the Checked keys")); delete_checked_keys_act_->setIcon(QIcon(":/icons/button_delete.png")); + delete_checked_keys_act_->setToolTip(tr("Delete the Checked keys")); + connect(delete_checked_keys_act_, &QAction::triggered, this, &KeyMgmt::SlotDeleteCheckedKeys); show_key_details_act_ = new QAction(tr("Show Key Details"), this); + show_key_details_act_->setIcon(QIcon(":/icons/detail.png")); show_key_details_act_->setToolTip(tr("Show Details for this Key")); connect(show_key_details_act_, &QAction::triggered, this, &KeyMgmt::SlotShowKeyDetails); set_owner_trust_of_key_act_ = new QAction(tr("Set Owner Trust Level"), this); + set_owner_trust_of_key_act_->setIcon(QIcon(":/icons/stairs.png")); set_owner_trust_of_key_act_->setToolTip(tr("Set Owner Trust Level")); set_owner_trust_of_key_act_->setData(QVariant("set_owner_trust_level")); connect(set_owner_trust_of_key_act_, &QAction::triggered, this, [this]() { diff --git a/src/ui/main_window/MainWindow.cpp b/src/ui/main_window/MainWindow.cpp index a7bd63d8..c50cfc5e 100644 --- a/src/ui/main_window/MainWindow.cpp +++ b/src/ui/main_window/MainWindow.cpp @@ -31,13 +31,12 @@ #include "core/function/CacheManager.h" #include "core/function/CoreSignalStation.h" #include "core/function/GlobalSettingStation.h" -#include "core/function/gpg/GpgAdvancedOperator.h" #include "core/model/GpgPassphraseContext.h" +#include "core/model/SettingsObject.h" #include "core/module/ModuleManager.h" #include "ui/UISignalStation.h" #include "ui/main_window/GeneralMainWindow.h" -#include "ui/struct/SettingsObject.h" -#include "ui/struct/settings/KeyServerSO.h" +#include "ui/struct/settings_object/KeyServerSO.h" #include "ui/widgets/KeyList.h" #include "ui/widgets/TextEdit.h" @@ -120,7 +119,7 @@ void MainWindow::Init() noexcept { m_key_list_->AddMenuAction(copy_key_default_uid_to_clipboard_act_); m_key_list_->AddMenuAction(copy_key_id_to_clipboard_act_); m_key_list_->AddMenuAction(set_owner_trust_of_key_act_); - m_key_list_->AddMenuAction(add_key_2_favourtie_act_); + m_key_list_->AddMenuAction(add_key_2_favourite_act_); m_key_list_->AddMenuAction(remove_key_from_favourtie_act_); m_key_list_->AddSeparator(); @@ -131,13 +130,12 @@ void MainWindow::Init() noexcept { edit_->CurTextPage()->setFocus(); Module::ListenRTPublishEvent( - this, "com.bktus.gpgfrontend.module.integrated.version-checking", - "version.loading_done", + this, kVersionCheckingModuleID, "version.loading_done", [=](Module::Namespace, Module::Key, int, std::any) { GF_UI_LOG_DEBUG( - "versionchecking version.loading_done changed, calling slot " + "version-checking version.loading_done changed, calling slot " "version upgrade"); - this->slot_version_upgrade_nofity(); + this->slot_version_upgrade_notify(); }); // loading process is done @@ -149,7 +147,7 @@ void MainWindow::Init() noexcept { // check if need to open wizard window auto settings = GlobalSettingStation::GetInstance().GetSettings(); - bool show_wizard = settings.value("wizard/show_wizard", true).toBool(); + auto show_wizard = settings.value("wizard/show_wizard", true).toBool(); if (show_wizard) slot_start_wizard(); } catch (...) { @@ -196,7 +194,7 @@ void MainWindow::recover_editor_unsaved_pages_from_cache() { bool first = true; - QJsonArray unsaved_page_array = json_data.array(); + auto unsaved_page_array = json_data.array(); for (const auto &value_ref : unsaved_page_array) { if (!value_ref.isObject()) continue; auto unsaved_page_json = value_ref.toObject(); @@ -206,8 +204,8 @@ void MainWindow::recover_editor_unsaved_pages_from_cache() { continue; } - QString title = unsaved_page_json["title"].toString(); - QString content = unsaved_page_json["content"].toString(); + auto title = unsaved_page_json["title"].toString(); + auto content = unsaved_page_json["content"].toString(); GF_UI_LOG_DEBUG( "recovering unsaved page from cache, page title: {}, content size", @@ -247,9 +245,6 @@ void MainWindow::closeEvent(QCloseEvent *event) { CacheManager::GetInstance().SaveDurableCache( "editor_unsaved_pages", QJsonDocument(QJsonArray()), true); - // clear password from memory - // GpgContext::GetInstance().clearPasswordCache(); - // call parent GeneralMainWindow::closeEvent(event); } diff --git a/src/ui/main_window/MainWindow.h b/src/ui/main_window/MainWindow.h index 523c14f0..f53a4a03 100644 --- a/src/ui/main_window/MainWindow.h +++ b/src/ui/main_window/MainWindow.h @@ -357,7 +357,7 @@ class MainWindow : public GeneralMainWindow { /** * @details called when need to upgrade. */ - void slot_version_upgrade_nofity(); + void slot_version_upgrade_notify(); /** * @details @@ -421,16 +421,11 @@ class MainWindow : public GeneralMainWindow { */ void recover_editor_unsaved_pages_from_cache(); - /** - * @brief return true, if restart is needed - */ - [[nodiscard]] int get_restart_needed() const; - TextEdit* edit_{}; ///< Tabwidget holding the edit-windows QMenu* file_menu_{}; ///< Submenu for file-operations QMenu* edit_menu_{}; ///< Submenu for text-operations QMenu* crypt_menu_{}; ///< Submenu for crypt-operations - QMenu* gpg_menu_{}; ///< Submenu for help-operations + QMenu* advance_menu_{}; ///< Submenu for help-operations QMenu* help_menu_{}; ///< Submenu for help-operations QMenu* key_menu_{}; ///< Submenu for key-operations QMenu* view_menu_{}; ///< Submenu for view operations @@ -473,6 +468,7 @@ class MainWindow : public GeneralMainWindow { ///< breaks QAction* gnupg_controller_open_act_{}; ///< + QAction* module_controller_open_act_{}; ///< QAction* clean_gpg_password_cache_act_{}; ///< QAction* reload_components_act_{}; ///< QAction* restart_components_act_{}; ///< @@ -488,7 +484,7 @@ class MainWindow : public GeneralMainWindow { QAction* copy_key_id_to_clipboard_act_{}; ///< QAction* copy_key_default_uid_to_clipboard_act_{}; ///< - QAction* add_key_2_favourtie_act_{}; ///< + QAction* add_key_2_favourite_act_{}; ///< QAction* remove_key_from_favourtie_act_{}; ///< QAction* set_owner_trust_of_key_act_{}; ///< @@ -522,7 +518,7 @@ class MainWindow : public GeneralMainWindow { InfoBoardWidget* info_board_{}; ///< bool attachment_dock_created_{}; ///< - int restart_needed_{0}; ///< + int restart_mode_{0}; ///< bool prohibit_update_checking_ = false; ///< }; diff --git a/src/ui/main_window/MainWindowGpgOperaFunction.cpp b/src/ui/main_window/MainWindowGpgOperaFunction.cpp index b1b22a6e..3cef497d 100644 --- a/src/ui/main_window/MainWindowGpgOperaFunction.cpp +++ b/src/ui/main_window/MainWindowGpgOperaFunction.cpp @@ -141,7 +141,7 @@ void MainWindow::SlotEncrypt() { void MainWindow::SlotSign() { if (edit_->SlotCurPageTextEdit() == nullptr) return; - auto key_ids = m_key_list_->GetPrivateChecked(); + auto key_ids = m_key_list_->GetCheckedPrivateKey(); if (key_ids->empty()) { QMessageBox::critical( this, tr("No Key Checked"), diff --git a/src/ui/main_window/MainWindowSlotFunction.cpp b/src/ui/main_window/MainWindowSlotFunction.cpp index 6f0a99fb..7d50b85a 100644 --- a/src/ui/main_window/MainWindowSlotFunction.cpp +++ b/src/ui/main_window/MainWindowSlotFunction.cpp @@ -101,8 +101,9 @@ void MainWindow::slot_append_keys_create_datetime() { auto create_datetime_format_str_local = QLocale().toString(key.GetCreateTime()) + " (" + tr("Localize") + ") " + "\n"; - auto create_datetime_format_str = key.GetCreateTime().toString(Qt::ISODate) + - " (" + tr("UTC") + ") " + "\n "; + auto create_datetime_format_str = + QLocale().toString(key.GetCreateTime().toUTC()) + " (" + tr("UTC") + + ") " + "\n "; edit_->SlotAppendText2CurTextPage(create_datetime_format_str_local + create_datetime_format_str); } @@ -125,7 +126,7 @@ void MainWindow::slot_append_keys_expire_datetime() { QLocale().toString(key.GetCreateTime()) + " (" + tr("Local Time") + ") " + "\n"; auto expire_datetime_format_str = - key.GetCreateTime().toString(Qt::ISODate) + " (UTC) " + "\n"; + QLocale().toString(key.GetCreateTime().toUTC()) + " (UTC) " + "\n"; edit_->SlotAppendText2CurTextPage(expire_datetime_format_str_local + expire_datetime_format_str); @@ -261,12 +262,11 @@ void MainWindow::SlotOpenFile(const QString& path) { edit_->SlotOpenFile(path); } -void MainWindow::slot_version_upgrade_nofity() { +void MainWindow::slot_version_upgrade_notify() { GF_UI_LOG_DEBUG( "slot version upgrade notify called, checking version info from rt..."); auto is_loading_done = Module::RetrieveRTValueTypedOrDefault<>( - "com.bktus.gpgfrontend.module.integrated.version-checking", - "version.loading_done", false); + kVersionCheckingModuleID, "version.loading_done", false); GF_UI_LOG_DEBUG("checking version info from rt, is loading done state: {}", is_loading_done); @@ -276,20 +276,16 @@ void MainWindow::slot_version_upgrade_nofity() { } auto is_need_upgrade = Module::RetrieveRTValueTypedOrDefault<>( - "com.bktus.gpgfrontend.module.integrated.version-checking", - "version.need_upgrade", false); + kVersionCheckingModuleID, "version.need_upgrade", false); auto is_current_a_withdrawn_version = Module::RetrieveRTValueTypedOrDefault<>( - "com.bktus.gpgfrontend.module.integrated.version-checking", - "version.current_a_withdrawn_version", false); + kVersionCheckingModuleID, "version.current_a_withdrawn_version", false); auto is_current_version_released = Module::RetrieveRTValueTypedOrDefault<>( - "com.bktus.gpgfrontend.module.integrated.version-checking", - "version.current_version_released", false); + kVersionCheckingModuleID, "version.current_version_released", false); auto latest_version = Module::RetrieveRTValueTypedOrDefault<>( - "com.bktus.gpgfrontend.module.integrated.version-checking", - "version.latest_version", QString{}); + kVersionCheckingModuleID, "version.latest_version", QString{}); GF_UI_LOG_DEBUG( "got version info from rt, need upgrade: {}, with drawn: {}, " @@ -303,7 +299,7 @@ void MainWindow::slot_version_upgrade_nofity() { 30000); auto* update_button = new QPushButton("Update GpgFrontend", this); connect(update_button, &QPushButton::clicked, [=]() { - auto* about_dialog = new AboutDialog(2, this); + auto* about_dialog = new AboutDialog(tr("Update"), this); about_dialog->show(); }); statusBar()->addPermanentWidget(update_button, 0); diff --git a/src/ui/main_window/MainWindowSlotUI.cpp b/src/ui/main_window/MainWindowSlotUI.cpp index 99a26626..39ceedc6 100644 --- a/src/ui/main_window/MainWindowSlotUI.cpp +++ b/src/ui/main_window/MainWindowSlotUI.cpp @@ -28,13 +28,14 @@ #include "MainWindow.h" #include "core/GpgConstants.h" +#include "core/function/CacheManager.h" #include "core/model/GpgPassphraseContext.h" +#include "core/model/SettingsObject.h" #include "ui/UserInterfaceUtils.h" #include "ui/dialog/Wizard.h" #include "ui/function/RaisePinentry.h" #include "ui/main_window/KeyMgmt.h" -#include "ui/struct/SettingsObject.h" -#include "ui/struct/settings/AppearanceSO.h" +#include "ui/struct/settings_object/AppearanceSO.h" #include "ui/widgets/TextEdit.h" namespace GpgFrontend::UI { @@ -121,10 +122,13 @@ void MainWindow::slot_open_settings_dialog() { import_button_->setIconSize( QSize(appearance.tool_bar_icon_width, appearance.tool_bar_icon_height)); - // restart mainwindow if necessary - if (get_restart_needed() != 0) { + // restart main window if necessary + if (restart_mode_ != kNonRestartCode) { if (edit_->MaybeSaveAnyTab()) { - emit SignalRestartApplication(get_restart_needed()); + // clear cache of unsaved page + CacheManager::GetInstance().SaveDurableCache( + "editor_unsaved_pages", QJsonDocument(QJsonArray()), true); + emit SignalRestartApplication(restart_mode_); } } }); @@ -180,11 +184,9 @@ void MainWindow::slot_cut_pgp_header() { void MainWindow::SlotSetRestartNeeded(int mode) { GF_UI_LOG_DEBUG("restart mode: {}", mode); - this->restart_needed_ = mode; + this->restart_mode_ = mode; } -int MainWindow::get_restart_needed() const { return this->restart_needed_; } - void MainWindow::SlotUpdateCryptoMenuStatus(unsigned int type) { MainWindow::CryptoMenu::OperationType opera_type = type; GF_UI_LOG_DEBUG("update crypto menu status, type: {}", opera_type); diff --git a/src/ui/main_window/MainWindowUI.cpp b/src/ui/main_window/MainWindowUI.cpp index 8b6fc74c..8b611152 100644 --- a/src/ui/main_window/MainWindowUI.cpp +++ b/src/ui/main_window/MainWindowUI.cpp @@ -30,8 +30,9 @@ #include "core/function/GlobalSettingStation.h" #include "core/function/gpg/GpgAdvancedOperator.h" #include "core/module/ModuleManager.h" +#include "dialog/controller/ModuleControllerDialog.h" #include "ui/UserInterfaceUtils.h" -#include "ui/dialog/gnupg/GnuPGControllerDialog.h" +#include "ui/dialog/controller/GnuPGControllerDialog.h" #include "ui/dialog/help/AboutDialog.h" #include "ui/widgets/KeyList.h" #include "ui/widgets/TextEdit.h" @@ -82,6 +83,7 @@ void MainWindow::create_actions() { connect(print_act_, &QAction::triggered, edit_, &TextEdit::SlotPrint); close_tab_act_ = new QAction(tr("Close"), this); + close_tab_act_->setIcon(QIcon(":/icons/close.png")); close_tab_act_->setShortcut(QKeySequence::Close); close_tab_act_->setToolTip(tr("Close file")); connect(close_tab_act_, &QAction::triggered, edit_, &TextEdit::SlotCloseTab); @@ -95,20 +97,24 @@ void MainWindow::create_actions() { /* Edit Menu */ undo_act_ = new QAction(tr("Undo"), this); + undo_act_->setIcon(QIcon(":/icons/undo.png")); undo_act_->setShortcut(QKeySequence::Undo); undo_act_->setToolTip(tr("Undo Last Edit Action")); connect(undo_act_, &QAction::triggered, edit_, &TextEdit::SlotUndo); redo_act_ = new QAction(tr("Redo"), this); + redo_act_->setIcon(QIcon(":/icons/redo.png")); redo_act_->setShortcut(QKeySequence::Redo); redo_act_->setToolTip(tr("Redo Last Edit Action")); connect(redo_act_, &QAction::triggered, edit_, &TextEdit::SlotRedo); zoom_in_act_ = new QAction(tr("Zoom In"), this); + zoom_in_act_->setIcon(QIcon(":/icons/zoomin.png")); zoom_in_act_->setShortcut(QKeySequence::ZoomIn); connect(zoom_in_act_, &QAction::triggered, edit_, &TextEdit::SlotZoomIn); zoom_out_act_ = new QAction(tr("Zoom Out"), this); + zoom_out_act_->setIcon(QIcon(":/icons/zoomout.png")); zoom_out_act_->setShortcut(QKeySequence::ZoomOut); connect(zoom_out_act_, &QAction::triggered, edit_, &TextEdit::SlotZoomOut); @@ -343,7 +349,7 @@ void MainWindow::create_actions() { &MainWindow::slot_open_key_management); clean_gpg_password_cache_act_ = new QAction(tr("Clear Password Cache"), this); - clean_gpg_password_cache_act_->setIcon(QIcon(":/icons/configure.png")); + clean_gpg_password_cache_act_->setIcon(QIcon(":/icons/clear-f.png")); clean_gpg_password_cache_act_->setToolTip( tr("Clear Password Cache of GnuPG")); connect(clean_gpg_password_cache_act_, &QAction::triggered, this, [=]() { @@ -360,7 +366,7 @@ void MainWindow::create_actions() { }); reload_components_act_ = new QAction(tr("Reload All Components"), this); - reload_components_act_->setIcon(QIcon(":/icons/configure.png")); + reload_components_act_->setIcon(QIcon(":/icons/restart.png")); reload_components_act_->setToolTip(tr("Reload All GnuPG's Components")); connect(reload_components_act_, &QAction::triggered, this, [=]() { GpgFrontend::GpgAdvancedOperator::ReloadGpgComponents( @@ -378,7 +384,7 @@ void MainWindow::create_actions() { }); restart_components_act_ = new QAction(tr("Restart All Components"), this); - restart_components_act_->setIcon(QIcon(":/icons/configure.png")); + restart_components_act_->setIcon(QIcon(":/icons/restart.png")); restart_components_act_->setToolTip(tr("Restart All GnuPG's Components")); connect(restart_components_act_, &QAction::triggered, this, [=]() { GpgFrontend::GpgAdvancedOperator::RestartGpgComponents(); @@ -404,6 +410,12 @@ void MainWindow::create_actions() { connect(gnupg_controller_open_act_, &QAction::triggered, this, [this]() { (new GnuPGControllerDialog(this))->exec(); }); + module_controller_open_act_ = new QAction(tr("Open Module Controller"), this); + module_controller_open_act_->setIcon(QIcon(":/icons/module.png")); + module_controller_open_act_->setToolTip(tr("Open Module Controller Dialog")); + connect(module_controller_open_act_, &QAction::triggered, this, + [this]() { (new ModuleControllerDialog(this))->exec(); }); + /* * About Menu */ @@ -414,28 +426,30 @@ void MainWindow::create_actions() { connect(about_act_, &QAction::triggered, this, [=]() { new AboutDialog(0, this); }); - gnupg_act_ = new QAction(tr("GnuPG"), this); - gnupg_act_->setIcon(QIcon(":/icons/help.png")); - gnupg_act_->setToolTip(tr("Information about Gnupg")); - connect(gnupg_act_, &QAction::triggered, this, - [=]() { new AboutDialog(1, this); }); + if (Module::IsModuleActivate(kGnuPGInfoGatheringModuleID)) { + gnupg_act_ = new QAction(tr("GnuPG"), this); + gnupg_act_->setIcon(QIcon(":/icons/key.png")); + gnupg_act_->setToolTip(tr("Information about Gnupg")); + connect(gnupg_act_, &QAction::triggered, this, + [=]() { new AboutDialog(tr("GnuPG"), this); }); + } translate_act_ = new QAction(tr("Translate"), this); - translate_act_->setIcon(QIcon(":/icons/help.png")); + translate_act_->setIcon(QIcon(":/icons/translate.png")); translate_act_->setToolTip(tr("Information about translation")); connect(translate_act_, &QAction::triggered, this, - [=]() { new AboutDialog(2, this); }); + [=]() { new AboutDialog(tr("Translators"), this); }); - /* - * Check Update Menu - */ - check_update_act_ = new QAction(tr("Check for Updates"), this); - check_update_act_->setIcon(QIcon(":/icons/help.png")); - check_update_act_->setToolTip(tr("Check for updates")); - connect(check_update_act_, &QAction::triggered, this, - [=]() { new AboutDialog(3, this); }); + if (Module::IsModuleActivate(kVersionCheckingModuleID)) { + check_update_act_ = new QAction(tr("Check for Updates"), this); + check_update_act_->setIcon(QIcon(":/icons/update.png")); + check_update_act_->setToolTip(tr("Check for updates")); + connect(check_update_act_, &QAction::triggered, this, + [=]() { new AboutDialog(tr("Update"), this); }); + } start_wizard_act_ = new QAction(tr("Open Wizard"), this); + start_wizard_act_->setIcon(QIcon(":/icons/wizard.png")); start_wizard_act_->setToolTip(tr("Open the wizard")); connect(start_wizard_act_, &QAction::triggered, this, &MainWindow::slot_start_wizard); @@ -492,10 +506,10 @@ void MainWindow::create_actions() { connect(show_key_details_act_, &QAction::triggered, this, &MainWindow::slot_show_key_details); - add_key_2_favourtie_act_ = new QAction(tr("Add To Favourite"), this); - add_key_2_favourtie_act_->setToolTip(tr("Add this key to Favourite Table")); - add_key_2_favourtie_act_->setData(QVariant("add_key_2_favourite_action")); - connect(add_key_2_favourtie_act_, &QAction::triggered, this, + add_key_2_favourite_act_ = new QAction(tr("Add To Favourite"), this); + add_key_2_favourite_act_->setToolTip(tr("Add this key to Favourite Table")); + add_key_2_favourite_act_->setData(QVariant("add_key_2_favourite_action")); + connect(add_key_2_favourite_act_, &QAction::triggered, this, &MainWindow::slot_add_key_2_favourite); remove_key_from_favourtie_act_ = @@ -587,13 +601,13 @@ void MainWindow::create_menus() { import_key_menu_->addAction(import_key_from_key_server_act_); key_menu_->addAction(open_key_management_act_); - gpg_menu_ = menuBar()->addMenu(tr("GnuPG")); - gpg_menu_->addAction(clean_gpg_password_cache_act_); - gpg_menu_->addSeparator(); - gpg_menu_->addAction(reload_components_act_); - gpg_menu_->addAction(restart_components_act_); - gpg_menu_->addSeparator(); - gpg_menu_->addAction(gnupg_controller_open_act_); + advance_menu_ = menuBar()->addMenu(tr("Advance")); + advance_menu_->addAction(clean_gpg_password_cache_act_); + advance_menu_->addAction(reload_components_act_); + advance_menu_->addAction(restart_components_act_); + advance_menu_->addSeparator(); + advance_menu_->addAction(gnupg_controller_open_act_); + advance_menu_->addAction(module_controller_open_act_); steganography_menu_ = menuBar()->addMenu(tr("Steganography")); steganography_menu_->addAction(cut_pgp_header_act_); @@ -604,9 +618,17 @@ void MainWindow::create_menus() { help_menu_ = menuBar()->addMenu(tr("Help")); help_menu_->addAction(start_wizard_act_); help_menu_->addSeparator(); - help_menu_->addAction(check_update_act_); - help_menu_->addAction(gnupg_act_); + + if (Module::IsModuleActivate(kGnuPGInfoGatheringModuleID)) { + help_menu_->addAction(gnupg_act_); + } + help_menu_->addAction(translate_act_); + + if (Module::IsModuleActivate(kVersionCheckingModuleID)) { + help_menu_->addAction(check_update_act_); + } + help_menu_->addAction(about_act_); } diff --git a/src/ui/struct/settings/AppearanceSO.h b/src/ui/struct/settings_object/AppearanceSO.h index 25262f22..25262f22 100644 --- a/src/ui/struct/settings/AppearanceSO.h +++ b/src/ui/struct/settings_object/AppearanceSO.h diff --git a/src/ui/struct/settings/KeyServerSO.h b/src/ui/struct/settings_object/KeyServerSO.h index 3c9320d2..3c9320d2 100644 --- a/src/ui/struct/settings/KeyServerSO.h +++ b/src/ui/struct/settings_object/KeyServerSO.h diff --git a/src/ui/struct/settings/WindowStateSO.h b/src/ui/struct/settings_object/WindowStateSO.h index 3fa56f3c..3fa56f3c 100644 --- a/src/ui/struct/settings/WindowStateSO.h +++ b/src/ui/struct/settings_object/WindowStateSO.h diff --git a/src/ui/thread/KeyServerImportTask.cpp b/src/ui/thread/KeyServerImportTask.cpp index 63cabbcd..8bcb2eab 100644 --- a/src/ui/thread/KeyServerImportTask.cpp +++ b/src/ui/thread/KeyServerImportTask.cpp @@ -29,8 +29,9 @@ #include "ui/thread/KeyServerImportTask.h" #include "core/function/gpg/GpgKeyImportExporter.h" -#include "ui/struct/SettingsObject.h" -#include "ui/struct/settings/KeyServerSO.h" +#include "core/model/SettingsObject.h" +#include "core/utils/BuildInfoUtils.h" +#include "ui/struct/settings_object/KeyServerSO.h" GpgFrontend::UI::KeyServerImportTask::KeyServerImportTask( QString keyserver_url, std::vector<QString> keyids) @@ -54,7 +55,11 @@ auto GpgFrontend::UI::KeyServerImportTask::Run() -> int { QUrl const req_url(keyserver_url.scheme() + "://" + keyserver_url.host() + "/pks/lookup?op=get&search=0x" + key_id + "&options=mr"); - reply_ = manager_->get(QNetworkRequest(req_url)); + auto request = QNetworkRequest(req_url); + request.setHeader(QNetworkRequest::UserAgentHeader, + GetHttpRequestUserAgent()); + + reply_ = manager_->get(request); connect(reply_, &QNetworkReply::finished, this, &KeyServerImportTask::dealing_reply_from_server); } diff --git a/src/ui/thread/KeyServerSearchTask.cpp b/src/ui/thread/KeyServerSearchTask.cpp index 2f05b774..828ce5ac 100644 --- a/src/ui/thread/KeyServerSearchTask.cpp +++ b/src/ui/thread/KeyServerSearchTask.cpp @@ -28,6 +28,8 @@ #include "ui/thread/KeyServerSearchTask.h" +#include "core/utils/BuildInfoUtils.h" + GpgFrontend::UI::KeyServerSearchTask::KeyServerSearchTask(QString keyserver_url, QString search_string) : Task("key_server_search_task"), @@ -42,7 +44,11 @@ auto GpgFrontend::UI::KeyServerSearchTask::Run() -> int { "/pks/lookup?search=" + search_string_ + "&op=index&options=mr"; - reply_ = manager_->get(QNetworkRequest(url_from_remote)); + auto request = QNetworkRequest(url_from_remote); + request.setHeader(QNetworkRequest::UserAgentHeader, + GetHttpRequestUserAgent()); + + reply_ = manager_->get(request); connect(reply_, &QNetworkReply::finished, this, &KeyServerSearchTask::dealing_reply_from_server); diff --git a/src/ui/thread/ListedKeyServerTestTask.cpp b/src/ui/thread/ListedKeyServerTestTask.cpp index f50a66ab..5f7e2dca 100644 --- a/src/ui/thread/ListedKeyServerTestTask.cpp +++ b/src/ui/thread/ListedKeyServerTestTask.cpp @@ -29,7 +29,8 @@ #include "ListedKeyServerTestTask.h" #include <QtNetwork> -#include <vector> + +#include "core/utils/BuildInfoUtils.h" GpgFrontend::UI::ListedKeyServerTestTask::ListedKeyServerTestTask( QStringList urls, int timeout, QWidget* /*parent*/) @@ -49,7 +50,11 @@ auto GpgFrontend::UI::ListedKeyServerTestTask::Run() -> int { auto key_url = QUrl{url}; GF_UI_LOG_DEBUG("key server request: {}", key_url.host()); - auto* network_reply = network_manager_->get(QNetworkRequest{key_url}); + auto request = QNetworkRequest(key_url); + request.setHeader(QNetworkRequest::UserAgentHeader, + GetHttpRequestUserAgent()); + + auto* network_reply = network_manager_->get(request); auto* timer = new QTimer(this); connect(network_reply, &QNetworkReply::finished, this, diff --git a/src/ui/thread/ProxyConnectionTestTask.cpp b/src/ui/thread/ProxyConnectionTestTask.cpp index b681ca6d..c1d2f3e6 100644 --- a/src/ui/thread/ProxyConnectionTestTask.cpp +++ b/src/ui/thread/ProxyConnectionTestTask.cpp @@ -30,6 +30,8 @@ #include <QtNetwork> +#include "core/utils/BuildInfoUtils.h" + GpgFrontend::UI::ProxyConnectionTestTask::ProxyConnectionTestTask(QString url, int timeout) : Task("proxy_connection_test_task"), @@ -40,7 +42,11 @@ GpgFrontend::UI::ProxyConnectionTestTask::ProxyConnectionTestTask(QString url, } auto GpgFrontend::UI::ProxyConnectionTestTask::Run() -> int { - auto* network_reply = network_manager_->get(QNetworkRequest{url_}); + auto request = QNetworkRequest(url_); + request.setHeader(QNetworkRequest::UserAgentHeader, + GetHttpRequestUserAgent()); + + auto* network_reply = network_manager_->get(request); auto* timer = new QTimer(this); connect(network_reply, &QNetworkReply::finished, this, diff --git a/src/ui/widgets/FileTreeView.cpp b/src/ui/widgets/FileTreeView.cpp index 7a725e10..de22ec83 100644 --- a/src/ui/widgets/FileTreeView.cpp +++ b/src/ui/widgets/FileTreeView.cpp @@ -54,6 +54,10 @@ FileTreeView::FileTreeView(QWidget* parent, const QString& target_path) &FileTreeView::slot_show_custom_context_menu); connect(this, &QTreeView::doubleClicked, this, &FileTreeView::slot_file_tree_view_item_double_clicked); + connect(dir_model_, &QFileSystemModel::layoutChanged, this, + &FileTreeView::slot_adjust_column_widths); + connect(dir_model_, &QFileSystemModel::dataChanged, this, + &FileTreeView::slot_adjust_column_widths); } void FileTreeView::selectionChanged(const QItemSelection& selected, @@ -82,9 +86,7 @@ void FileTreeView::SlotGoPath(const QString& target_path) { GF_UI_LOG_DEBUG("file tree view set target path: {}", current_path_); this->setRootIndex(dir_model_->index(file_info.filePath())); dir_model_->setRootPath(file_info.filePath()); - for (int i = 1; i < dir_model_->columnCount(); ++i) { - this->resizeColumnToContents(i); - } + slot_adjust_column_widths(); } else { QMessageBox::critical( this, tr("Error"), @@ -413,12 +415,21 @@ void FileTreeView::slot_compress_files() {} void FileTreeView::paintEvent(QPaintEvent* event) { QTreeView::paintEvent(event); - for (int i = 1; i < dir_model_->columnCount(); ++i) { - this->resizeColumnToContents(i); + + if (!initial_resize_done_) { + slot_adjust_column_widths(); + initial_resize_done_ = true; } } void FileTreeView::mousePressEvent(QMouseEvent* event) { QTreeView::mousePressEvent(event); } + +void FileTreeView::slot_adjust_column_widths() { + for (int i = 1; i < dir_model_->columnCount(); ++i) { + this->resizeColumnToContents(i); + } +} + } // namespace GpgFrontend::UI diff --git a/src/ui/widgets/FileTreeView.h b/src/ui/widgets/FileTreeView.h index cd3b1cb8..67ce49ef 100644 --- a/src/ui/widgets/FileTreeView.h +++ b/src/ui/widgets/FileTreeView.h @@ -147,7 +147,7 @@ class FileTreeView : public QTreeView { * @brief * */ - auto SlotDeleteSelectedItem() -> void; + void SlotDeleteSelectedItem(); /** * @brief @@ -219,6 +219,12 @@ class FileTreeView : public QTreeView { */ void slot_create_popup_menu(); + /** + * @brief + * + */ + void slot_adjust_column_widths(); + private: QFileSystemModel* dir_model_; ///< QString current_path_; ///< @@ -233,5 +239,7 @@ class FileTreeView : public QTreeView { QAction* action_create_empty_file_; QAction* action_make_directory_; QAction* action_compress_files_; + + bool initial_resize_done_ = false; }; } // namespace GpgFrontend::UI
\ No newline at end of file diff --git a/src/ui/widgets/GRTTreeView.cpp b/src/ui/widgets/GRTTreeView.cpp new file mode 100644 index 00000000..09d7dcf0 --- /dev/null +++ b/src/ui/widgets/GRTTreeView.cpp @@ -0,0 +1,66 @@ +/** + * Copyright (C) 2021 Saturneric <[email protected]> + * + * 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. + * + * GpgFrontend 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 GpgFrontend. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from + * the gpg4usb project, which is under GPL-3.0-or-later. + * + * All the source code of GpgFrontend was modified and released by + * Saturneric <[email protected]> starting on May 12, 2021. + * + * SPDX-License-Identifier: GPL-3.0-or-later + * + */ + +#include "GRTTreeView.h" + +#include "core/module/GlobalRegisterTableTreeModel.h" +#include "core/module/ModuleManager.h" + +namespace GpgFrontend::UI { + +GRTTreeView::GRTTreeView(QWidget* parent) : QTreeView(parent) { + setModel(new Module::GlobalRegisterTableTreeModel( + Module::ModuleManager::GetInstance().GRT())); + + connect(model(), &QFileSystemModel::layoutChanged, this, + &GRTTreeView::slot_adjust_column_widths); + connect(model(), &QFileSystemModel::dataChanged, this, + &GRTTreeView::slot_adjust_column_widths); + connect(this, &GRTTreeView::expanded, this, + &GRTTreeView::slot_adjust_column_widths); + connect(this, &GRTTreeView::collapsed, this, + &GRTTreeView::slot_adjust_column_widths); +} + +GRTTreeView::~GRTTreeView() = default; + +void GRTTreeView::paintEvent(QPaintEvent* event) { + QTreeView::paintEvent(event); + + if (!initial_resize_done_) { + slot_adjust_column_widths(); + initial_resize_done_ = true; + } +} + +void GRTTreeView::slot_adjust_column_widths() { + for (int i = 0; i < model()->columnCount(); ++i) { + this->resizeColumnToContents(i); + } +} +} // namespace GpgFrontend::UI
\ No newline at end of file diff --git a/src/ui/widgets/GRTTreeView.h b/src/ui/widgets/GRTTreeView.h new file mode 100644 index 00000000..6f3f83c8 --- /dev/null +++ b/src/ui/widgets/GRTTreeView.h @@ -0,0 +1,69 @@ +/** + * Copyright (C) 2021 Saturneric <[email protected]> + * + * 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. + * + * GpgFrontend 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 GpgFrontend. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from + * the gpg4usb project, which is under GPL-3.0-or-later. + * + * All the source code of GpgFrontend was modified and released by + * Saturneric <[email protected]> starting on May 12, 2021. + * + * SPDX-License-Identifier: GPL-3.0-or-later + * + */ + +#pragma once + +namespace GpgFrontend::UI { + +class GRTTreeView : public QTreeView { + Q_OBJECT + public: + /** + * @brief Construct a new GRTTreeView object + * + * @param parent + */ + explicit GRTTreeView(QWidget* parent); + + /** + * @brief Destroy the GRTTreeView object + * + */ + virtual ~GRTTreeView() override; + + protected: + /** + * @brief + * + * @param event + */ + void paintEvent(QPaintEvent* event) override; + + private slots: + + /** + * @brief + * + */ + void slot_adjust_column_widths(); + + private: + bool initial_resize_done_ = false; +}; + +} // namespace GpgFrontend::UI
\ No newline at end of file diff --git a/src/ui/widgets/InfoBoardWidget.cpp b/src/ui/widgets/InfoBoardWidget.cpp index d1a006c5..425e6ccd 100644 --- a/src/ui/widgets/InfoBoardWidget.cpp +++ b/src/ui/widgets/InfoBoardWidget.cpp @@ -29,9 +29,9 @@ #include "ui/widgets/InfoBoardWidget.h" #include "core/GpgModel.h" +#include "core/model/SettingsObject.h" #include "ui/UISignalStation.h" -#include "ui/struct/SettingsObject.h" -#include "ui/struct/settings/AppearanceSO.h" +#include "ui/struct/settings_object/AppearanceSO.h" #include "ui_InfoBoard.h" namespace GpgFrontend::UI { diff --git a/src/ui/widgets/KeyList.cpp b/src/ui/widgets/KeyList.cpp index 48c99269..be79a6fd 100644 --- a/src/ui/widgets/KeyList.cpp +++ b/src/ui/widgets/KeyList.cpp @@ -231,7 +231,7 @@ auto KeyList::GetAllPrivateKeys() -> KeyIdArgsListPtr { return ret; } -auto KeyList::GetPrivateChecked() -> KeyIdArgsListPtr { +auto KeyList::GetCheckedPrivateKey() -> KeyIdArgsListPtr { auto ret = std::make_unique<KeyIdArgsList>(); if (ui_->keyGroupTab->size().isEmpty()) return ret; @@ -242,7 +242,27 @@ auto KeyList::GetPrivateChecked() -> KeyIdArgsListPtr { for (int i = 0; i < key_list->rowCount(); i++) { if ((key_list->item(i, 0)->checkState() == Qt::Checked) && - ((key_list->item(i, 1)) != nullptr)) { + ((key_list->item(i, 1)) != nullptr) && + buffered_keys[i].IsPrivateKey()) { + ret->push_back(buffered_keys[i].GetId()); + } + } + return ret; +} + +auto KeyList::GetCheckedPublicKey() -> KeyIdArgsListPtr { + auto ret = std::make_unique<KeyIdArgsList>(); + if (ui_->keyGroupTab->size().isEmpty()) return ret; + + auto* key_list = + qobject_cast<QTableWidget*>(ui_->keyGroupTab->currentWidget()); + const auto& buffered_keys = + m_key_tables_[ui_->keyGroupTab->currentIndex()].buffered_keys_; + + for (int i = 0; i < key_list->rowCount(); i++) { + if ((key_list->item(i, 0)->checkState() == Qt::Checked) && + ((key_list->item(i, 1)) != nullptr) && + !buffered_keys[i].IsPrivateKey()) { ret->push_back(buffered_keys[i].GetId()); } } @@ -458,14 +478,28 @@ void KeyList::slot_refresh_ui() { } void KeyList::slot_sync_with_key_server() { + auto checked_public_keys = GetCheckedPublicKey(); + KeyIdArgsList key_ids; - { - std::lock_guard<std::mutex> guard(buffered_key_list_mutex_); - for (const auto& key : *buffered_keys_list_) { - if (!(key.IsPrivateKey() && key.IsHasMasterKey())) { - key_ids.push_back(key.GetId()); + if (checked_public_keys->empty()) { + QMessageBox::StandardButton const reply = QMessageBox::question( + this, QCoreApplication::tr("Sync All Public Key"), + QCoreApplication::tr("You have not checked any public keys that you " + "want to synchronize, do you want to synchronize " + "all local public keys from the key server?"), + QMessageBox::Yes | QMessageBox::No); + + if (reply == QMessageBox::No) return; + { + std::lock_guard<std::mutex> guard(buffered_key_list_mutex_); + for (const auto& key : *buffered_keys_list_) { + if (!(key.IsPrivateKey() && key.IsHasMasterKey())) { + key_ids.push_back(key.GetId()); + } } } + } else { + key_ids = *checked_public_keys; } if (key_ids.empty()) return; diff --git a/src/ui/widgets/KeyList.h b/src/ui/widgets/KeyList.h index 25180496..1761fb23 100644 --- a/src/ui/widgets/KeyList.h +++ b/src/ui/widgets/KeyList.h @@ -188,7 +188,7 @@ class KeyList : public QWidget { const QString& name, const QString& id, KeyListRow::KeyType selectType = KeyListRow::SECRET_OR_PUBLIC_KEY, KeyListColumn::InfoType infoType = KeyListColumn::ALL, - const KeyTable::KeyTableFilter filter = + KeyTable::KeyTableFilter filter = [](const GpgKey&, const KeyTable&) -> bool { return true; }); /** @@ -225,7 +225,7 @@ class KeyList : public QWidget { * * @return KeyIdArgsListPtr */ - KeyIdArgsListPtr GetChecked(); + auto GetChecked() -> KeyIdArgsListPtr; /** * @brief Get the Checked object @@ -233,21 +233,28 @@ class KeyList : public QWidget { * @param key_table * @return KeyIdArgsListPtr */ - static KeyIdArgsListPtr GetChecked(const KeyTable& key_table); + static auto GetChecked(const KeyTable& key_table) -> KeyIdArgsListPtr; /** * @brief Get the Private Checked object * * @return KeyIdArgsListPtr */ - KeyIdArgsListPtr GetPrivateChecked(); + auto GetCheckedPrivateKey() -> KeyIdArgsListPtr; + + /** + * @brief + * + * @return KeyIdArgsListPtr + */ + auto GetCheckedPublicKey() -> KeyIdArgsListPtr; /** * @brief Get the All Private Keys object * * @return KeyIdArgsListPtr */ - KeyIdArgsListPtr GetAllPrivateKeys(); + auto GetAllPrivateKeys() -> KeyIdArgsListPtr; /** * @brief Set the Checked object @@ -270,14 +277,14 @@ class KeyList : public QWidget { * * @return KeyIdArgsListPtr */ - KeyIdArgsListPtr GetSelected(); + auto GetSelected() -> KeyIdArgsListPtr; /** * @brief Get the Selected Key object * * @return QString */ - QString GetSelectedKey(); + auto GetSelectedKey() -> QString; /** * @brief @@ -285,7 +292,7 @@ class KeyList : public QWidget { * @return true * @return false */ - [[maybe_unused]] bool ContainsPrivateKeys(); + [[maybe_unused]] auto ContainsPrivateKeys() -> bool; signals: /** diff --git a/src/ui/widgets/ModuleListView.cpp b/src/ui/widgets/ModuleListView.cpp new file mode 100644 index 00000000..ced602fb --- /dev/null +++ b/src/ui/widgets/ModuleListView.cpp @@ -0,0 +1,74 @@ +/** + * Copyright (C) 2021 Saturneric <[email protected]> + * + * 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. + * + * GpgFrontend 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 GpgFrontend. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from + * the gpg4usb project, which is under GPL-3.0-or-later. + * + * All the source code of GpgFrontend was modified and released by + * Saturneric <[email protected]> starting on May 12, 2021. + * + * SPDX-License-Identifier: GPL-3.0-or-later + * + */ + +#include "ModuleListView.h" + +#include "core/module/ModuleManager.h" + +namespace GpgFrontend::UI { + +ModuleListView::ModuleListView(QWidget *parent) + : QListView(parent), model_(new QStandardItemModel(this)) { + setModel(model_); + setEditTriggers(QAbstractItemView::NoEditTriggers); + + load_module_informations(); +} + +void ModuleListView::currentChanged(const QModelIndex ¤t, + const QModelIndex &previous) { + QListView::currentChanged(current, previous); + auto *item = model_->itemFromIndex(current); + if (item != nullptr) { + emit this->SignalSelectModule(item->data(Qt::UserRole + 1).toString()); + } +} + +void ModuleListView::load_module_informations() { + auto &module_manager = Module::ModuleManager::GetInstance(); + auto module_ids = module_manager.ListAllRegisteredModuleID(); + + model_->clear(); + for (const auto &module_id : module_ids) { + auto module = module_manager.SearchModule(module_id); + auto integrated_module = module_manager.IsIntegratedModule(module_id); + auto meta_data = module->GetModuleMetaData(); + + auto *item = new QStandardItem((integrated_module ? "*" : "") + + meta_data.value("Name", module_id)); + + item->setData(module_id, Qt::UserRole + 1); + model_->appendRow(item); + } +} + +auto ModuleListView::GetCurrentModuleID() -> Module::ModuleIdentifier { + auto *item = model_->itemFromIndex(currentIndex()); + return item != nullptr ? item->data(Qt::UserRole + 1).toString() : ""; +} +}; // namespace GpgFrontend::UI diff --git a/src/ui/widgets/ModuleListView.h b/src/ui/widgets/ModuleListView.h new file mode 100644 index 00000000..0b294bbf --- /dev/null +++ b/src/ui/widgets/ModuleListView.h @@ -0,0 +1,53 @@ +/** + * Copyright (C) 2021 Saturneric <[email protected]> + * + * 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. + * + * GpgFrontend 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 GpgFrontend. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from + * the gpg4usb project, which is under GPL-3.0-or-later. + * + * All the source code of GpgFrontend was modified and released by + * Saturneric <[email protected]> starting on May 12, 2021. + * + * SPDX-License-Identifier: GPL-3.0-or-later + * + */ + +#pragma once + +#include "core/module/Module.h" + +namespace GpgFrontend::UI { +class ModuleListView : public QListView { + Q_OBJECT + public: + explicit ModuleListView(QWidget *parent); + + auto GetCurrentModuleID() -> Module::ModuleIdentifier; + + signals: + void SignalSelectModule(Module::ModuleIdentifier); + + protected: + void currentChanged(const QModelIndex ¤t, + const QModelIndex &previous) override; + + private: + QStandardItemModel *model_; + + void load_module_informations(); +}; +}; // namespace GpgFrontend::UI
\ No newline at end of file diff --git a/src/ui/widgets/PlainTextEditorPage.cpp b/src/ui/widgets/PlainTextEditorPage.cpp index 8f4890cc..874bbf3b 100644 --- a/src/ui/widgets/PlainTextEditorPage.cpp +++ b/src/ui/widgets/PlainTextEditorPage.cpp @@ -28,10 +28,10 @@ #include "PlainTextEditorPage.h" +#include "core/model/SettingsObject.h" #include "core/thread/FileReadTask.h" #include "core/thread/TaskRunnerGetter.h" -#include "ui/struct/SettingsObject.h" -#include "ui/struct/settings/AppearanceSO.h" +#include "ui/struct/settings_object/AppearanceSO.h" #include "ui_PlainTextEditor.h" namespace GpgFrontend::UI { diff --git a/src/ui/widgets/TextEdit.cpp b/src/ui/widgets/TextEdit.cpp index 1373c5d9..a0dba5f5 100644 --- a/src/ui/widgets/TextEdit.cpp +++ b/src/ui/widgets/TextEdit.cpp @@ -34,8 +34,8 @@ #include "core/GpgModel.h" #include "core/function/GlobalSettingStation.h" +#include "core/model/CacheObject.h" #include "ui/UISignalStation.h" -#include "ui/struct/CacheObject.h" namespace GpgFrontend::UI { @@ -261,7 +261,7 @@ void TextEdit::slot_remove_tab(int index) { * * If it returns false, the close event should be aborted. */ -bool TextEdit::maybe_save_current_tab(bool askToSave) { +auto TextEdit::maybe_save_current_tab(bool askToSave) -> bool { PlainTextEditorPage* page = SlotCurPageTextEdit(); // if this page is no textedit, there should be nothing to save if (page == nullptr) { @@ -304,8 +304,8 @@ bool TextEdit::maybe_save_current_tab(bool askToSave) { } auto TextEdit::MaybeSaveAnyTab() -> bool { - // get a list of all unsaved documents and their tabids - QHash<int, QString> unsaved_docs = this->UnsavedDocuments(); + // get a list of all unsaved documents and their tab ids + QHash<int, QString> const unsaved_docs = this->UnsavedDocuments(); /* * no unsaved documents, so app can be closed @@ -318,7 +318,7 @@ auto TextEdit::MaybeSaveAnyTab() -> bool { * and show normal unsaved doc dialog */ if (unsaved_docs.size() == 1) { - int modified_tab = unsaved_docs.keys().at(0); + int const modified_tab = unsaved_docs.keys().at(0); tab_widget_->setCurrentIndex(modified_tab); return maybe_save_current_tab(true); } diff --git a/ui/AppearanceSettings.ui b/ui/AppearanceSettings.ui index e49772c7..aed30461 100644 --- a/ui/AppearanceSettings.ui +++ b/ui/AppearanceSettings.ui @@ -14,88 +14,87 @@ <string>Appearance Settings</string> </property> <layout class="QGridLayout" name="gridLayout"> - <item row="0" column="0"> + <item row="2" column="0"> <layout class="QVBoxLayout" name="verticalLayout"> <item> - <widget class="QGroupBox" name="iconSizeBox"> + <widget class="QGroupBox" name="generalBox"> <property name="title"> - <string>Icon Size</string> + <string>General</string> </property> - <layout class="QGridLayout" name="gridLayout_2"> - <item row="0" column="0"> - <layout class="QHBoxLayout" name="horizontalLayout"> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_4"> <item> - <widget class="QRadioButton" name="smallRadioButton"> + <widget class="QLabel" name="themaLabel"> <property name="text"> - <string>small</string> + <string>Theme</string> </property> </widget> </item> <item> - <widget class="QRadioButton" name="mediumRadioButton"> - <property name="text"> - <string>medium</string> - </property> - </widget> - </item> - <item> - <widget class="QRadioButton" name="largeRadioButton"> - <property name="text"> - <string>large</string> - </property> - </widget> + <widget class="QComboBox" name="themeComboBox"/> </item> </layout> </item> + <item> + <widget class="QCheckBox" name="windowStateCheckBox"> + <property name="text"> + <string>Save window size and position on exit.</string> + </property> + </widget> + </item> </layout> </widget> </item> <item> - <widget class="QGroupBox" name="iconStyleBox"> + <widget class="QGroupBox" name="fontSizeBox"> <property name="title"> - <string>Icon Style</string> + <string>Font Size</string> </property> - <layout class="QGridLayout" name="gridLayout_3"> + <layout class="QGridLayout" name="gridLayout_8"> <item row="0" column="0"> - <layout class="QHBoxLayout" name="horizontalLayout_2"> + <layout class="QHBoxLayout" name="horizontalLayout_5"> <item> - <widget class="QRadioButton" name="justTextRadioButton"> + <widget class="QLabel" name="fontSizeTextEditorLabel"> <property name="text"> - <string>just text</string> + <string>Text Editor</string> </property> </widget> </item> <item> - <widget class="QRadioButton" name="justIconRadioButton"> - <property name="text"> - <string>just icons</string> + <widget class="QSpinBox" name="fontSizeTextEditorLabelSpinBox"> + <property name="minimum"> + <number>9</number> + </property> + <property name="maximum"> + <number>18</number> + </property> + <property name="value"> + <number>10</number> </property> </widget> </item> + </layout> + </item> + <item row="1" column="0"> + <layout class="QHBoxLayout" name="horizontalLayout_3"> <item> - <widget class="QRadioButton" name="textAndIconsRadioButton"> + <widget class="QLabel" name="fontSizeInformationBoardLabel"> <property name="text"> - <string>text and icons</string> + <string>Information Board</string> </property> </widget> </item> - </layout> - </item> - </layout> - </widget> - </item> - <item> - <widget class="QGroupBox" name="windowStateBox"> - <property name="title"> - <string>Window State</string> - </property> - <layout class="QGridLayout" name="gridLayout_4"> - <item row="0" column="0"> - <layout class="QVBoxLayout" name="verticalLayout_4"> <item> - <widget class="QCheckBox" name="windowStateCheckBox"> - <property name="text"> - <string>Save window size and position on exit.</string> + <widget class="QSpinBox" name="fontSizeInformationBoardSpinBox"> + <property name="minimum"> + <number>9</number> + </property> + <property name="maximum"> + <number>18</number> + </property> + <property name="value"> + <number>10</number> </property> </widget> </item> @@ -105,63 +104,70 @@ </widget> </item> <item> - <widget class="QGroupBox" name="textEditorBox"> + <widget class="QGroupBox" name="toolbarIconBox"> <property name="title"> - <string>Text Editor</string> + <string>Toolbar Icon</string> </property> - <layout class="QGridLayout" name="gridLayout_8"> + <layout class="QGridLayout" name="gridLayout_2"> <item row="0" column="0"> - <layout class="QHBoxLayout" name="horizontalLayout_5"> + <layout class="QHBoxLayout" name="horizontalLayout"> <item> - <widget class="QLabel" name="fontSizeTextEditorLabel"> + <widget class="QLabel" name="toolbarIconSizeLabel"> <property name="text"> - <string>Font Size in Text Editor</string> + <string>Size</string> </property> </widget> </item> <item> - <widget class="QSpinBox" name="fontSizeTextEditorLabelSpinBox"> - <property name="minimum"> - <number>9</number> + <widget class="QRadioButton" name="smallRadioButton"> + <property name="text"> + <string>small</string> </property> - <property name="maximum"> - <number>18</number> + </widget> + </item> + <item> + <widget class="QRadioButton" name="mediumRadioButton"> + <property name="text"> + <string>medium</string> </property> - <property name="value"> - <number>10</number> + </widget> + </item> + <item> + <widget class="QRadioButton" name="largeRadioButton"> + <property name="text"> + <string>large</string> </property> </widget> </item> </layout> </item> - </layout> - </widget> - </item> - <item> - <widget class="QGroupBox" name="informationBoardBox"> - <property name="title"> - <string>Information Board</string> - </property> - <layout class="QGridLayout" name="gridLayout_6"> - <item row="0" column="0"> - <layout class="QHBoxLayout" name="horizontalLayout_3"> + <item row="1" column="0"> + <layout class="QHBoxLayout" name="horizontalLayout_2"> <item> - <widget class="QLabel" name="fontSizeInformationBoardLabel"> + <widget class="QLabel" name="toolbarIconStyleLabel"> <property name="text"> - <string>Font Size in Information Board</string> + <string>Style</string> </property> </widget> </item> <item> - <widget class="QSpinBox" name="fontSizeInformationBoardSpinBox"> - <property name="minimum"> - <number>9</number> + <widget class="QRadioButton" name="justTextRadioButton"> + <property name="text"> + <string>just text</string> </property> - <property name="maximum"> - <number>18</number> + </widget> + </item> + <item> + <widget class="QRadioButton" name="justIconRadioButton"> + <property name="text"> + <string>just icons</string> </property> - <property name="value"> - <number>10</number> + </widget> + </item> + <item> + <widget class="QRadioButton" name="textAndIconsRadioButton"> + <property name="text"> + <string>text and icons</string> </property> </widget> </item> diff --git a/ui/GnuPGControllerDialog.ui b/ui/GnuPGControllerDialog.ui index e79fc041..4f0bdfc6 100644 --- a/ui/GnuPGControllerDialog.ui +++ b/ui/GnuPGControllerDialog.ui @@ -52,6 +52,13 @@ </property> </widget> </item> + <item> + <widget class="QCheckBox" name="killAllGnuPGDaemonCheckBox"> + <property name="text"> + <string>Kill all gnupg daemon at close</string> + </property> + </widget> + </item> </layout> </item> </layout> @@ -75,7 +82,7 @@ <item row="0" column="0"> <layout class="QVBoxLayout" name="verticalLayout_6"> <item> - <widget class="QCheckBox" name="keyDatabseUseCustomCheckBox"> + <widget class="QCheckBox" name="keyDatabaseUseCustomCheckBox"> <property name="text"> <string>Use Custom GnuPG Key Database Path</string> </property> diff --git a/ui/GnuPGInfo.ui b/ui/GnuPGInfo.ui index 19479a77..63e746a5 100644 --- a/ui/GnuPGInfo.ui +++ b/ui/GnuPGInfo.ui @@ -108,6 +108,19 @@ </property> </widget> </item> + <item row="1" column="0"> + <widget class="QProgressBar" name="loadProgressBar"> + <property name="maximum"> + <number>0</number> + </property> + <property name="value"> + <number>-1</number> + </property> + <property name="textVisible"> + <bool>false</bool> + </property> + </widget> + </item> </layout> </widget> <widget class="QWidget" name="tab_2"> diff --git a/ui/ModuleControllerDialog.ui b/ui/ModuleControllerDialog.ui new file mode 100644 index 00000000..97dd1397 --- /dev/null +++ b/ui/ModuleControllerDialog.ui @@ -0,0 +1,264 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>ModuleControllerDialog</class> + <widget class="QDialog" name="ModuleControllerDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>829</width> + <height>660</height> + </rect> + </property> + <property name="windowTitle"> + <string>Module Controller</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QTabWidget" name="tabWidget"> + <property name="tabPosition"> + <enum>QTabWidget::North</enum> + </property> + <property name="tabShape"> + <enum>QTabWidget::Rounded</enum> + </property> + <property name="currentIndex"> + <number>0</number> + </property> + <property name="documentMode"> + <bool>false</bool> + </property> + <widget class="QWidget" name="registeredModuleTab"> + <attribute name="title"> + <string>Registered Modules</string> + </attribute> + <layout class="QVBoxLayout" name="verticalLayout_6"> + <item> + <layout class="QHBoxLayout" name="moduleControllerLayout"> + <item> + <layout class="QVBoxLayout" name="moduleListViewLayout"> + <property name="sizeConstraint"> + <enum>QLayout::SetDefaultConstraint</enum> + </property> + <item> + <widget class="GpgFrontend::UI::ModuleListView" name="moduleListView"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Expanding"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>250</width> + <height>0</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>250</width> + <height>16777215</height> + </size> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="showModsDirButton"> + <property name="text"> + <string>Show Mods Directory</string> + </property> + </widget> + </item> + </layout> + </item> + <item> + <widget class="Line" name="line_2"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + </widget> + </item> + <item> + <layout class="QVBoxLayout" name="verticalLayout_3"> + <property name="sizeConstraint"> + <enum>QLayout::SetDefaultConstraint</enum> + </property> + <item> + <widget class="QLabel" name="moduleInfoLabel"> + <property name="text"> + <string>Module Informations</string> + </property> + </widget> + </item> + <item> + <widget class="QTextBrowser" name="moduleInfoTextBrowser"> + <property name="lineWrapMode"> + <enum>QTextEdit::NoWrap</enum> + </property> + </widget> + </item> + <item> + <widget class="Line" name="line"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + </widget> + </item> + <item> + <widget class="QGroupBox" name="actionsGroupBox"> + <property name="title"> + <string>Actions</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout_4"> + <item> + <widget class="QPushButton" name="activateOrDeactiveButton"> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="text"> + <string>Activate</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="autoActivateButton"> + <property name="text"> + <string>Auto Activate</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + </layout> + </item> + <item> + <widget class="Line" name="line_3"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="tipsLabel"> + <property name="text"> + <string>Tips: Module name front with "*" stands for integrated module.</string> + </property> + <property name="wordWrap"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> + </widget> + <widget class="QWidget" name="tab"> + <attribute name="title"> + <string>Global Register Table</string> + </attribute> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <item> + <widget class="GpgFrontend::UI::GRTTreeView" name="treeView"> + <property name="uniformRowHeights"> + <bool>false</bool> + </property> + </widget> + </item> + </layout> + </widget> + <widget class="QWidget" name="tab_2"> + <attribute name="title"> + <string>Debugger</string> + </attribute> + <layout class="QVBoxLayout" name="verticalLayout_8"> + <item> + <layout class="QVBoxLayout" name="verticalLayout_7"> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <item> + <layout class="QVBoxLayout" name="verticalLayout_10"> + <item> + <widget class="QPushButton" name="triggerEventButton"> + <property name="text"> + <string>Trigger Event</string> + </property> + </widget> + </item> + <item> + <spacer name="verticalSpacer_2"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item> + <layout class="QVBoxLayout" name="verticalLayout_11"> + <item> + <widget class="QPushButton" name="pushButton_4"> + <property name="text"> + <string>Upsert GRT Value</string> + </property> + </widget> + </item> + <item> + <spacer name="verticalSpacer_3"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + </layout> + </item> + </layout> + </item> + </layout> + </widget> + </widget> + </item> + </layout> + </widget> + <customwidgets> + <customwidget> + <class>GpgFrontend::UI::ModuleListView</class> + <extends>QListView</extends> + <header>ui/widgets/ModuleListView.h</header> + </customwidget> + <customwidget> + <class>GpgFrontend::UI::GRTTreeView</class> + <extends>QTreeView</extends> + <header>ui/widgets/GRTTreeView.h</header> + </customwidget> + </customwidgets> + <resources/> + <connections/> +</ui> |