aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--gpgfrontend.qrc2
-rw-r--r--resource/lfs/locale/po/zh_CN.po40
-rw-r--r--resource/lfs/locale/ts/GpgFrontend.zh_CN.ts9420
-rw-r--r--src/CMakeLists.txt70
-rw-r--r--src/GpgFrontend.h.in14
-rw-r--r--src/cmd.cpp25
-rw-r--r--src/core/CMakeLists.txt7
-rw-r--r--src/core/GpgCoreInit.cpp8
-rw-r--r--src/core/GpgFrontendCore.h2
-rw-r--r--src/core/function/GlobalSettingStation.cpp2
-rw-r--r--src/core/function/result_analyse/GpgDecryptResultAnalyse.cpp40
-rw-r--r--src/core/function/result_analyse/GpgDecryptResultAnalyse.h1
-rw-r--r--src/core/function/result_analyse/GpgEncryptResultAnalyse.cpp20
-rw-r--r--src/core/function/result_analyse/GpgEncryptResultAnalyse.h1
-rw-r--r--src/core/function/result_analyse/GpgResultAnalyse.h3
-rw-r--r--src/core/function/result_analyse/GpgSignResultAnalyse.cpp37
-rw-r--r--src/core/function/result_analyse/GpgSignResultAnalyse.h1
-rw-r--r--src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp82
-rw-r--r--src/core/function/result_analyse/GpgVerifyResultAnalyse.h1
-rw-r--r--src/core/model/GpgKey.cpp12
-rw-r--r--src/core/model/GpgKey.h1
-rw-r--r--src/core/utils/IOUtils.cpp25
-rw-r--r--src/module/integrated/gnupg_info_gathering_module/GnuPGInfoGatheringModule.cpp2
-rw-r--r--src/test/CMakeLists.txt4
-rw-r--r--src/ui/GpgFrontendApplication.cpp25
-rw-r--r--src/ui/GpgFrontendUIInit.cpp63
-rw-r--r--src/ui/UserInterfaceUtils.cpp156
-rwxr-xr-xsrc/ui/dialog/QuitDialog.cpp17
-rw-r--r--src/ui/dialog/SignersPicker.cpp14
-rw-r--r--src/ui/dialog/Wizard.cpp161
-rw-r--r--src/ui/dialog/details/VerifyDetailsDialog.cpp16
-rw-r--r--src/ui/dialog/gnupg/GnuPGControllerDialog.cpp56
-rw-r--r--src/ui/dialog/help/AboutDialog.cpp84
-rw-r--r--src/ui/dialog/help/GnupgTab.cpp14
-rw-r--r--src/ui/dialog/import_export/ExportKeyPackageDialog.cpp78
-rw-r--r--src/ui/dialog/import_export/KeyImportDetailDialog.cpp46
-rw-r--r--src/ui/dialog/import_export/KeyServerImportDialog.cpp69
-rw-r--r--src/ui/dialog/import_export/KeyUploadDialog.cpp14
-rw-r--r--src/ui/dialog/key_generate/KeygenDialog.cpp48
-rw-r--r--src/ui/dialog/key_generate/SubkeyGenerateDialog.cpp43
-rw-r--r--src/ui/dialog/keypair_details/KeyDetailsDialog.cpp10
-rw-r--r--src/ui/dialog/keypair_details/KeyNewUIDDialog.cpp25
-rw-r--r--src/ui/dialog/keypair_details/KeyPairDetailTab.cpp72
-rw-r--r--src/ui/dialog/keypair_details/KeyPairOperaTab.cpp108
-rw-r--r--src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp62
-rw-r--r--src/ui/dialog/keypair_details/KeyPairUIDTab.cpp117
-rw-r--r--src/ui/dialog/keypair_details/KeySetExpireDateDialog.cpp22
-rw-r--r--src/ui/dialog/keypair_details/KeyUIDSignDialog.cpp15
-rw-r--r--src/ui/dialog/settings/SettingsAppearance.cpp28
-rw-r--r--src/ui/dialog/settings/SettingsDialog.cpp31
-rw-r--r--src/ui/dialog/settings/SettingsGeneral.cpp39
-rw-r--r--src/ui/dialog/settings/SettingsKeyServer.cpp70
-rw-r--r--src/ui/dialog/settings/SettingsNetwork.cpp54
-rw-r--r--src/ui/function/ArchiveDirectory.cpp86
-rw-r--r--src/ui/function/ArchiveDirectory.h53
-rw-r--r--src/ui/function/RaisePinentry.cpp23
-rw-r--r--src/ui/function/SetOwnerTrustLevel.cpp29
-rw-r--r--src/ui/main_window/KeyMgmt.cpp203
-rw-r--r--src/ui/main_window/MainWindow.cpp7
-rw-r--r--src/ui/main_window/MainWindowFileSlotFunction.cpp237
-rw-r--r--src/ui/main_window/MainWindowGpgOperaFunction.cpp54
-rw-r--r--src/ui/main_window/MainWindowSlotFunction.cpp54
-rw-r--r--src/ui/main_window/MainWindowUI.cpp351
-rw-r--r--src/ui/thread/KeyServerImportTask.cpp11
-rw-r--r--src/ui/widgets/FilePage.cpp4
-rw-r--r--src/ui/widgets/FileTreeView.cpp70
-rw-r--r--src/ui/widgets/FindWidget.cpp43
-rw-r--r--src/ui/widgets/InfoBoardWidget.cpp12
-rw-r--r--src/ui/widgets/KeyList.cpp43
-rw-r--r--src/ui/widgets/PlainTextEditorPage.cpp12
-rw-r--r--src/ui/widgets/TOFUInfoPage.cpp17
-rw-r--r--src/ui/widgets/TextEdit.cpp57
-rw-r--r--src/ui/widgets/VerifyKeyDetailBox.cpp81
-rw-r--r--ui/FilePage.ui8
-rw-r--r--ui/GnuPGInfo.ui2
-rw-r--r--ui/InfoBoard.ui6
-rw-r--r--ui/KeyList.ui8
77 files changed, 11010 insertions, 1838 deletions
diff --git a/gpgfrontend.qrc b/gpgfrontend.qrc
index 2322e6e9..986e0917 100644
--- a/gpgfrontend.qrc
+++ b/gpgfrontend.qrc
@@ -1,6 +1,6 @@
<!DOCTYPE RCC>
<RCC>
- <qresource prefix="/">
+ <qresource prefix="/icons">
<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>
diff --git a/resource/lfs/locale/po/zh_CN.po b/resource/lfs/locale/po/zh_CN.po
index 58dd105c..4fccb3c6 100644
--- a/resource/lfs/locale/po/zh_CN.po
+++ b/resource/lfs/locale/po/zh_CN.po
@@ -1225,8 +1225,8 @@ msgid "Error Validating signature"
msgstr "验证签名时出错"
#: /home/eric/develop/cpp/GpgFrontend/src/ui/dialog/details/VerifyDetailsDialog.cpp:78
-msgid "File was signed on %1%"
-msgstr "文件已在 %1% 上签名"
+msgid "File was signed on %1"
+msgstr "文件已在 %1 上签名"
#: /home/eric/develop/cpp/GpgFrontend/src/ui/dialog/details/VerifyDetailsDialog.cpp:81
#: /home/eric/develop/cpp/GpgFrontend/src/ui/dialog/details/VerifyDetailsDialog.cpp:87
@@ -1234,8 +1234,8 @@ msgid "It Contains"
msgstr "它包含了"
#: /home/eric/develop/cpp/GpgFrontend/src/ui/dialog/details/VerifyDetailsDialog.cpp:84
-msgid "Signed on %1%"
-msgstr "已在 %1% 上签名"
+msgid "Signed on %1"
+msgstr "已在 %1 上签名"
#: /home/eric/develop/cpp/GpgFrontend/src/ui/dialog/SignersPicker.cpp:37
msgid "Cancel"
@@ -1259,8 +1259,8 @@ msgstr "未保存的文件"
#: /home/eric/develop/cpp/GpgFrontend/src/ui/dialog/QuitDialog.cpp:86
msgid ""
-"%1% files contain unsaved information.<br/>Save the changes before closing?"
-msgstr "%1% 个文件包含未保存的信息。<br/>要在关闭前保存更改吗?"
+"%1 files contain unsaved information.<br/>Save the changes before closing?"
+msgstr "%1 个文件包含未保存的信息。<br/>要在关闭前保存更改吗?"
#: /home/eric/develop/cpp/GpgFrontend/src/ui/dialog/QuitDialog.cpp:100
msgid "Check the files you want to save:"
@@ -2382,8 +2382,8 @@ msgid "Making Tarball"
msgstr "制作压缩包"
#: /home/eric/develop/cpp/GpgFrontend/src/ui/main_window/MainWindowFileSlotFunction.cpp:196
-msgid "The target file %1% already exists, do you need to overwrite it?"
-msgstr "目标文件 %1% 已经存在,是否需要覆盖?"
+msgid "The target file %1 already exists, do you need to overwrite it?"
+msgstr "目标文件 %1 已经存在,是否需要覆盖?"
#: /home/eric/develop/cpp/GpgFrontend/src/ui/main_window/MainWindowFileSlotFunction.cpp:210
#: /home/eric/develop/cpp/GpgFrontend/src/ui/main_window/MainWindowFileSlotFunction.cpp:614
@@ -3242,8 +3242,8 @@ msgid "Syncing Key List..."
msgstr "正在同步密钥列表..."
#: /home/eric/develop/cpp/GpgFrontend/src/ui/widgets/KeyList.cpp:502
-msgid "Sync [%1%/%2%] %3% %4%"
-msgstr "同步 [%1%/%2%] %3% %4%"
+msgid "Sync [%1/%2] %3 %4"
+msgstr "同步 [%1/%2] %3 %4"
#: /home/eric/develop/cpp/GpgFrontend/src/ui/widgets/KeyList.cpp:510
msgid "Key List Sync Done."
@@ -3264,8 +3264,8 @@ msgstr "UTF-8"
#: /home/eric/develop/cpp/GpgFrontend/src/ui/widgets/PlainTextEditorPage.cpp:70
#: /home/eric/develop/cpp/GpgFrontend/src/ui/widgets/PlainTextEditorPage.cpp:257
-msgid "%1% character(s)"
-msgstr "%1% 个字符"
+msgid "%1 character(s)"
+msgstr "%1 个字符"
#: /home/eric/develop/cpp/GpgFrontend/src/ui/widgets/PlainTextEditorPage.cpp:79
msgid "Loading..."
@@ -3276,8 +3276,8 @@ msgid "UTF-8"
msgstr "UTF-8"
#: /home/eric/develop/cpp/GpgFrontend/src/ui/widgets/PlainTextEditorPage.cpp:237
-msgid "%1% byte(s)"
-msgstr "%1% 字节"
+msgid "%1 byte(s)"
+msgstr "%1 字节"
#: /home/eric/develop/cpp/GpgFrontend/src/ui/widgets/PlainTextEditorPage.cpp:281
msgid "binary"
@@ -3292,11 +3292,11 @@ msgstr "无标题"
#: /home/eric/develop/cpp/GpgFrontend/src/ui/widgets/TextEdit.cpp:223
#: /home/eric/develop/cpp/GpgFrontend/src/ui/widgets/TextEdit.cpp:450
msgid ""
-"Cannot read file %1%:\n"
-"%2%."
+"Cannot read file %1:\n"
+"%2."
msgstr ""
-"无法读取文件 %1%:\n"
-"%2%。"
+"无法读取文件 %1:\n"
+"%2。"
#: /home/eric/develop/cpp/GpgFrontend/src/ui/widgets/TextEdit.cpp:152
msgid "Open file"
@@ -3617,8 +3617,8 @@ msgid "Signatures List"
msgstr "签名列表"
#: /home/eric/develop/cpp/GpgFrontend/src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp:70
-msgid "Signature [%1%]:"
-msgstr "签名 [%1%]:"
+msgid "Signature [%1]:"
+msgstr "签名 [%1]:"
#: /home/eric/develop/cpp/GpgFrontend/src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp:73
msgid "A Bad Signature."
diff --git a/resource/lfs/locale/ts/GpgFrontend.zh_CN.ts b/resource/lfs/locale/ts/GpgFrontend.zh_CN.ts
new file mode 100644
index 00000000..b931ad77
--- /dev/null
+++ b/resource/lfs/locale/ts/GpgFrontend.zh_CN.ts
@@ -0,0 +1,9420 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="zh_CN">
+<context>
+ <name></name>
+ <message>
+ <source>Proxy</source>
+ <translation type="vanished">代理</translation>
+ </message>
+ <message>
+ <source>Network Ability</source>
+ <translation type="vanished">网络能力</translation>
+ </message>
+ <message>
+ <source>Operations</source>
+ <translation type="vanished">操作</translation>
+ </message>
+ <message>
+ <source>Enable Proxy</source>
+ <translation type="vanished">启用代理</translation>
+ </message>
+ <message>
+ <source>Port</source>
+ <translation type="vanished">端口</translation>
+ </message>
+ <message>
+ <source>Host Address</source>
+ <translation type="vanished">地址</translation>
+ </message>
+ <message>
+ <source>Proxy Type</source>
+ <translation type="vanished">代理类型</translation>
+ </message>
+ <message>
+ <source>Username</source>
+ <translation type="vanished">用户名</translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <translation type="vanished">密码</translation>
+ </message>
+ <message>
+ <source>Apply Proxy Settings and Check Proxy Connection</source>
+ <translation type="vanished">应用代理设置并检查代理连接</translation>
+ </message>
+ <message>
+ <source>Forbid all GnuPG network connection.</source>
+ <translation type="vanished">禁止所有 GnuPG 网络连接。</translation>
+ </message>
+ <message>
+ <source>Prohibit checking for version updates when the program starts.</source>
+ <translation type="vanished">禁止在程序启动时检查版本更新。</translation>
+ </message>
+ <message>
+ <source>Automatically import a missing key for signature verification.</source>
+ <translation type="vanished">自动导入丢失的密钥以进行签名验证。</translation>
+ </message>
+ <message>
+ <source>Tips: These Option Changes take effect only after the application restart.</source>
+ <translation type="vanished">提示:这些选项更改仅在应用程序重新启动后生效。</translation>
+ </message>
+ <message>
+ <source>Test Server Url Accessibility</source>
+ <translation type="vanished">测试服务器 URL 连通性</translation>
+ </message>
+ <message>
+ <source>Success</source>
+ <translation type="vanished">成功</translation>
+ </message>
+ <message>
+ <source>Successfully connect to the target server through the proxy server.</source>
+ <translation type="vanished">连接目标服务器成功(通过代理)。</translation>
+ </message>
+ <message>
+ <source>Failed</source>
+ <translation type="vanished">失败</translation>
+ </message>
+ <message>
+ <source>Unable to connect to the target server through the proxy server. Proxy settings may be invalid.</source>
+ <translation type="vanished">无法通过代理服务器连接到目标服务器。代理设置可能错误。</translation>
+ </message>
+ <message>
+ <source>Test Proxy Server Connection...</source>
+ <translation type="vanished">测试代理服务器连接...</translation>
+ </message>
+ <message>
+ <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="vanished">正在使用您的代理设置访问 url。请注意,此测试操作会将您的代理设置应用于整个软件。</translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation type="vanished">通用</translation>
+ </message>
+ <message>
+ <source>Appearance</source>
+ <translation type="vanished">显示</translation>
+ </message>
+ <message>
+ <source>Key Server</source>
+ <translation type="vanished">密钥服务器</translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="vanished">网络</translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="vanished">设置</translation>
+ </message>
+ <message>
+ <source>Keyserver List</source>
+ <translation type="vanished">密钥服务器列表</translation>
+ </message>
+ <message>
+ <source>Default</source>
+ <translation type="vanished">默认</translation>
+ </message>
+ <message>
+ <source>Keyserver Address</source>
+ <translation type="vanished">密钥服务器地址</translation>
+ </message>
+ <message>
+ <source>Security</source>
+ <translation type="vanished">安全</translation>
+ </message>
+ <message>
+ <source>Available</source>
+ <translation type="vanished">可用的</translation>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation type="vanished">添加</translation>
+ </message>
+ <message>
+ <source>Test Listed Keyserver</source>
+ <translation type="vanished">测试列出的密钥服务器</translation>
+ </message>
+ <message>
+ <source>Tips: Please Double-click table item to edit it.</source>
+ <translation type="vanished">提示:请双击表格项进行编辑。</translation>
+ </message>
+ <message>
+ <source>Delete Selected</source>
+ <translation type="vanished">删除所选</translation>
+ </message>
+ <message>
+ <source>Delete Selected Key Server</source>
+ <translation type="vanished">删除选定的密钥服务器</translation>
+ </message>
+ <message>
+ <source>Set As Default</source>
+ <translation type="vanished">设为默认</translation>
+ </message>
+ <message>
+ <source>Insecure keyserver address</source>
+ <translation type="vanished">不安全的密钥服务器地址</translation>
+ </message>
+ <message>
+ <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="vanished">出于安全原因,不建议使用 HTTP 作为与密钥服务器的通信协议。建议使用HTTPS。</translation>
+ </message>
+ <message>
+ <source>Warning</source>
+ <translation type="vanished">警告</translation>
+ </message>
+ <message>
+ <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="vanished">通常不会使用HTTPS或HTTP作为与密钥服务器通信的协议。当然,您可能需要这么做。但是,烦请您再次检查您输入的地址。您确定要将其添加到密钥服务器列表中吗?</translation>
+ </message>
+ <message>
+ <source>true</source>
+ <translation type="vanished">是</translation>
+ </message>
+ <message>
+ <source>false</source>
+ <translation type="vanished">错误的</translation>
+ </message>
+ <message>
+ <source>unknown</source>
+ <translation type="vanished">未知</translation>
+ </message>
+ <message>
+ <source>Set TCP Timeout</source>
+ <translation type="vanished">设置 TCP 超时</translation>
+ </message>
+ <message>
+ <source>Reachable</source>
+ <translation type="vanished">正常</translation>
+ </message>
+ <message>
+ <source>Not Reachable</source>
+ <translation type="vanished">离线</translation>
+ </message>
+ <message>
+ <source>Test Key Server Connection...</source>
+ <translation type="vanished">测试密钥服务器连通性...</translation>
+ </message>
+ <message>
+ <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="vanished">本测试仅测试密钥服务器的网络连通性。通过测试并不意味着密钥服务器在功能上可用。</translation>
+ </message>
+ <message>
+ <source>Cache</source>
+ <translation type="vanished">缓存</translation>
+ </message>
+ <message>
+ <source>Save checked private keys on exit and restore them on next start.</source>
+ <translation type="vanished">退出时保存检查的私钥并在下次启动时恢复它们。</translation>
+ </message>
+ <message>
+ <source>Clear gpg password cache when closing GpgFrontend.</source>
+ <translation type="vanished">关闭 GpgFrontend 时清除 gpg 密码缓存。</translation>
+ </message>
+ <message>
+ <source>Automatically restore unsaved Text Editor pages after an application crash.</source>
+ <translation type="vanished">应用程序崩溃后自动恢复未保存的文本编辑器页面。</translation>
+ </message>
+ <message>
+ <source>Operation</source>
+ <translation type="vanished">操作</translation>
+ </message>
+ <message>
+ <source>Enable to use longer key expiration date.</source>
+ <translation type="vanished">启用以使用更长的密钥到期日期。</translation>
+ </message>
+ <message>
+ <source>Import files dropped on the Key List without confirmation.</source>
+ <translation type="vanished">未经确认,导入放在密钥列表中的文件。</translation>
+ </message>
+ <message>
+ <source>Language</source>
+ <translation type="vanished">语言</translation>
+ </message>
+ <message>
+ <source>NOTE</source>
+ <translation type="vanished">提示</translation>
+ </message>
+ <message>
+ <source>: </source>
+ <translation type="vanished">:</translation>
+ </message>
+ <message>
+ <source>GpgFrontend will restart automatically if you change the language!</source>
+ <translation type="vanished">如果您更改语言,GpgFrontend 将自动重启!</translation>
+ </message>
+ <message>
+ <source>Data</source>
+ <translation type="vanished">数据</translation>
+ </message>
+ <message>
+ <source>Clear All Log (Total Size: %s)</source>
+ <translation type="vanished">清除所有日志(总大小:%s)</translation>
+ <extra-po-flags>c-format</extra-po-flags>
+ </message>
+ <message>
+ <source>Clear All Data Objects (Total Size: %s)</source>
+ <translation type="vanished">清除所有数据对象(总大小:%s)</translation>
+ <extra-po-flags>c-format</extra-po-flags>
+ </message>
+ <message>
+ <source>Confirm</source>
+ <translation type="vanished">确认</translation>
+ </message>
+ <message>
+ <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="vanished">您确定要清除所有数据对象吗?这将导致所有缓存的表单位置、状态、密钥服务器等丢失。</translation>
+ </message>
+ <message>
+ <source>Preference</source>
+ <translation type="vanished">偏好</translation>
+ </message>
+ <message>
+ <source>System Default</source>
+ <translation type="vanished">系统默认</translation>
+ </message>
+ <message>
+ <source>Show Steganography Options</source>
+ <translation type="vanished">显示隐写术选项</translation>
+ </message>
+ <message>
+ <source>Show Steganography Options.</source>
+ <translation type="vanished">显示隐写术选项。</translation>
+ </message>
+ <message>
+ <source>Pubkey Exchange</source>
+ <translation type="vanished">公钥交换</translation>
+ </message>
+ <message>
+ <source>Auto Pubkey Exchange</source>
+ <translation type="vanished">自动公钥交换</translation>
+ </message>
+ <message>
+ <source>Icon Size</source>
+ <translation type="vanished">图标大小</translation>
+ </message>
+ <message>
+ <source>small</source>
+ <translation type="vanished">小</translation>
+ </message>
+ <message>
+ <source>medium</source>
+ <translation type="vanished">中</translation>
+ </message>
+ <message>
+ <source>large</source>
+ <translation type="vanished">大</translation>
+ </message>
+ <message>
+ <source>Icon Style</source>
+ <translation type="vanished">图标样式</translation>
+ </message>
+ <message>
+ <source>just text</source>
+ <translation type="vanished">只显示文字</translation>
+ </message>
+ <message>
+ <source>just icons</source>
+ <translation type="vanished">只显示图标</translation>
+ </message>
+ <message>
+ <source>text and icons</source>
+ <translation type="vanished">文字和图标</translation>
+ </message>
+ <message>
+ <source>Window State</source>
+ <translation type="vanished">窗口状态</translation>
+ </message>
+ <message>
+ <source>Save window size and position on exit.</source>
+ <translation type="vanished">退出时保存窗口大小和位置。</translation>
+ </message>
+ <message>
+ <source>Text Editor</source>
+ <translation type="vanished">文本编辑器</translation>
+ </message>
+ <message>
+ <source>Font Size in Text Editor</source>
+ <translation type="vanished">文本编辑器中的字体大小</translation>
+ </message>
+ <message>
+ <source>Information Board</source>
+ <translation type="vanished">信息面板</translation>
+ </message>
+ <message>
+ <source>Font Size in Information Board</source>
+ <translation type="vanished">信息面板中的字体大小</translation>
+ </message>
+ <message>
+ <source>The expire date of the key pair has been updated.</source>
+ <translation type="vanished">密钥对的到期日期已更新。</translation>
+ </message>
+ <message>
+ <source>Failure</source>
+ <translation type="vanished">失败</translation>
+ </message>
+ <message>
+ <source>Failed to update the expire date of the key pair.</source>
+ <translation type="vanished">无法更新密钥对的过期日期。</translation>
+ </message>
+ <message>
+ <source>Modified Expiration Date (Local Time)</source>
+ <translation type="vanished">修改到期日期(本地时间)</translation>
+ </message>
+ <message>
+ <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="vanished">温馨提示:为安全起见,密钥有效期最长为两年。如果您是专家用户,请在设置中解锁更长的时间。</translation>
+ </message>
+ <message>
+ <source>No Expiration</source>
+ <translation type="vanished">无有效期</translation>
+ </message>
+ <message>
+ <source>Modified Expiration Date</source>
+ <translation type="vanished">修改到期日</translation>
+ </message>
+ <message>
+ <source>Owner</source>
+ <translation type="vanished">所有者</translation>
+ </message>
+ <message>
+ <source>Primary Key</source>
+ <translation type="vanished">主密钥</translation>
+ </message>
+ <message>
+ <source>Fingerprint</source>
+ <translation type="vanished">指纹</translation>
+ </message>
+ <message>
+ <source>Additional UIDs</source>
+ <translation type="vanished">额外的 UID</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation type="vanished">姓名</translation>
+ </message>
+ <message>
+ <source>Email Address</source>
+ <translation type="vanished">电子邮件地址</translation>
+ </message>
+ <message>
+ <source>Comment</source>
+ <translation type="vanished">注释</translation>
+ </message>
+ <message>
+ <source>Key ID</source>
+ <translation type="vanished">密钥编号</translation>
+ </message>
+ <message>
+ <source>Algorithm</source>
+ <translation type="vanished">算法</translation>
+ </message>
+ <message>
+ <source>Key Size</source>
+ <translation type="vanished">密钥大小</translation>
+ </message>
+ <message>
+ <source>Nominal Usage</source>
+ <translation type="vanished">名义用途</translation>
+ </message>
+ <message>
+ <source>Actual Usage</source>
+ <translation type="vanished">实际使用</translation>
+ </message>
+ <message>
+ <source>Owner Trust Level</source>
+ <translation type="vanished">所有者信级别</translation>
+ </message>
+ <message>
+ <source>Create Date (Local Time)</source>
+ <translation type="vanished">创建日期(本地时间)</translation>
+ </message>
+ <message>
+ <source>Expires on (Local Time)</source>
+ <translation type="vanished">到期时间(本地时间)</translation>
+ </message>
+ <message>
+ <source>Last Update (Local Time)</source>
+ <translation type="vanished">上次更新(本地时间)</translation>
+ </message>
+ <message>
+ <source>Primary Key Existence</source>
+ <translation type="vanished">主密钥存在</translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <translation type="vanished">复制</translation>
+ </message>
+ <message>
+ <source>copy fingerprint to clipboard</source>
+ <translation type="vanished">将指纹复制到剪贴板</translation>
+ </message>
+ <message>
+ <source>Exists</source>
+ <translation type="vanished">存在</translation>
+ </message>
+ <message>
+ <source>Not Exists</source>
+ <translation type="vanished">不存在</translation>
+ </message>
+ <message>
+ <source>Certificate</source>
+ <translation type="vanished">证书</translation>
+ </message>
+ <message>
+ <source>Encrypt</source>
+ <translation type="vanished">加密</translation>
+ </message>
+ <message>
+ <source>Sign</source>
+ <translation type="vanished">签名</translation>
+ </message>
+ <message>
+ <source>Auth</source>
+ <translation type="vanished">认证</translation>
+ </message>
+ <message>
+ <source>Never Expire</source>
+ <translation type="vanished">永不过期</translation>
+ </message>
+ <message>
+ <source>No Data</source>
+ <translation type="vanished">没有数据</translation>
+ </message>
+ <message>
+ <source>Warning: The primary key has expired.</source>
+ <translation type="vanished">警告:主密钥已过期。</translation>
+ </message>
+ <message>
+ <source>Warning: The primary key has been revoked.</source>
+ <translation type="vanished">警告:主密钥已被撤销。</translation>
+ </message>
+ <message>
+ <source>KeyPair</source>
+ <translation type="vanished">密钥对</translation>
+ </message>
+ <message>
+ <source>UIDs</source>
+ <translation type="vanished">UID</translation>
+ </message>
+ <message>
+ <source>Subkeys</source>
+ <translation type="vanished">子密钥</translation>
+ </message>
+ <message>
+ <source>Key Details</source>
+ <translation type="vanished">密钥详情</translation>
+ </message>
+ <message>
+ <source>New UID</source>
+ <translation type="vanished">新 UID</translation>
+ </message>
+ <message>
+ <source>UID Management</source>
+ <translation type="vanished">用户识别码管理</translation>
+ </message>
+ <message>
+ <source>TOFU</source>
+ <translation type="vanished">TOFU</translation>
+ </message>
+ <message>
+ <source>Signature of Selected UID</source>
+ <translation type="vanished">所选 UID 的签名</translation>
+ </message>
+ <message>
+ <source>Select</source>
+ <translation type="vanished">选择</translation>
+ </message>
+ <message>
+ <source>Email</source>
+ <translation type="vanished">电子邮件</translation>
+ </message>
+ <message>
+ <source>Create Date (UTC)</source>
+ <translation type="vanished">创建日期 (UTC)</translation>
+ </message>
+ <message>
+ <source>Expired Date (UTC)</source>
+ <translation type="vanished">到期日期 (UTC)</translation>
+ </message>
+ <message>
+ <source>TOFU %1</source>
+ <translation type="vanished">TOFU %1</translation>
+ </message>
+ <message>
+ <source>Never Expires</source>
+ <translation type="vanished">永不过期</translation>
+ </message>
+ <message>
+ <source>Invalid Operation</source>
+ <translation type="vanished">无效操作</translation>
+ </message>
+ <message>
+ <source>Cannot read default_keyserver From Settings</source>
+ <translation type="vanished">无法从设置读取密钥服务器</translation>
+ </message>
+ <message>
+ <source>Please select one or more UIDs before doing this operation.</source>
+ <translation type="vanished">请在执行此操作前选择一个或多个 UID。</translation>
+ </message>
+ <message>
+ <source>Sign Selected UID(s)</source>
+ <translation type="vanished">签署选定的 UID</translation>
+ </message>
+ <message>
+ <source>Delete Selected UID(s)</source>
+ <translation type="vanished">删除选定的 UID</translation>
+ </message>
+ <message>
+ <source>Successfully added a new UID.</source>
+ <translation type="vanished">成功添加了新的 UID。</translation>
+ </message>
+ <message>
+ <source>Operation Failed</source>
+ <translation type="vanished">操作失败</translation>
+ </message>
+ <message>
+ <source>An error occurred during the operation.</source>
+ <translation type="vanished">操作过程中发生错误。</translation>
+ </message>
+ <message>
+ <source>Deleting UIDs</source>
+ <translation type="vanished">删除 UID</translation>
+ </message>
+ <message>
+ <source>Are you sure that you want to delete the following UIDs?</source>
+ <translation type="vanished">您确定要删除以下 UID 吗?</translation>
+ </message>
+ <message>
+ <source>The action can not be undone.</source>
+ <translation type="vanished">该操作无法撤消。</translation>
+ </message>
+ <message>
+ <source>An error occurred during the delete %1 operation.</source>
+ <translation type="vanished">删除 %1 操作期间出错。</translation>
+ </message>
+ <message>
+ <source>Set Primary UID</source>
+ <translation type="vanished">设置主 UID</translation>
+ </message>
+ <message>
+ <source>Are you sure that you want to set the Primary UID to?</source>
+ <translation type="vanished">您确定要将主 UID 设置为吗?</translation>
+ </message>
+ <message>
+ <source>Set As Primary</source>
+ <translation type="vanished">设为主要</translation>
+ </message>
+ <message>
+ <source>Sign UID</source>
+ <translation type="vanished">签署 UID</translation>
+ </message>
+ <message>
+ <source>Delete UID</source>
+ <translation type="vanished">删除 UID</translation>
+ </message>
+ <message>
+ <source>Please select one UID before doing this operation.</source>
+ <translation type="vanished">请在执行此操作前选择一个 UID。</translation>
+ </message>
+ <message>
+ <source>Deleting UID</source>
+ <translation type="vanished">删除 UID</translation>
+ </message>
+ <message>
+ <source>Delete(Revoke) Key Signature</source>
+ <translation type="vanished">删除(撤销)密钥签名</translation>
+ </message>
+ <message>
+ <source>Please select one Key Signature before doing this operation.</source>
+ <translation type="vanished">请在执行此操作前选择一个密钥签名。</translation>
+ </message>
+ <message>
+ <source>To delete the signature, you need to have its corresponding public key in the local database.</source>
+ <translation type="vanished">要删除签名,您需要在本地数据库中有其对应的公钥。</translation>
+ </message>
+ <message>
+ <source>Deleting Key Signature</source>
+ <translation type="vanished">删除密钥签名</translation>
+ </message>
+ <message>
+ <source>Are you sure that you want to delete the following signature?</source>
+ <translation type="vanished">您确定要删除以下签名吗?</translation>
+ </message>
+ <message>
+ <source>General Operations</source>
+ <translation type="vanished">一般操作</translation>
+ </message>
+ <message>
+ <source>Export Public Key</source>
+ <translation type="vanished">导出公钥</translation>
+ </message>
+ <message>
+ <source>Export Private Key</source>
+ <translation type="vanished">导出私钥</translation>
+ </message>
+ <message>
+ <source>Modify Expiration Datetime (Primary Key)</source>
+ <translation type="vanished">修改到期日期时间(主密钥)</translation>
+ </message>
+ <message>
+ <source>Modify Password</source>
+ <translation type="vanished">修改密码</translation>
+ </message>
+ <message>
+ <source>Key Server Operation (Pubkey)</source>
+ <translation type="vanished">密钥服务器操作(公钥)</translation>
+ </message>
+ <message>
+ <source>Generate Revoke Certificate</source>
+ <translation type="vanished">生成撤销证书</translation>
+ </message>
+ <message>
+ <source>Modify TOFU Policy</source>
+ <translation type="vanished">修改TOFU策略</translation>
+ </message>
+ <message>
+ <source>Set Owner Trust Level</source>
+ <translation type="vanished">设置所有者信任级别</translation>
+ </message>
+ <message>
+ <source>Upload Key Pair to Key Server</source>
+ <translation type="vanished">上传密钥对到密钥服务器</translation>
+ </message>
+ <message>
+ <source>Sync Key Pair From Key Server</source>
+ <translation type="vanished">从密钥服务器同步密钥对</translation>
+ </message>
+ <message>
+ <source>Export Full Secret Key</source>
+ <translation type="vanished">导出完整密钥</translation>
+ </message>
+ <message>
+ <source>Export Shortest Secret Key</source>
+ <translation type="vanished">导出最短密钥</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation type="vanished">错误</translation>
+ </message>
+ <message>
+ <source>An error occurred during the export operation.</source>
+ <translation type="vanished">导出操作发生错误。</translation>
+ </message>
+ <message>
+ <source>Export Key To File</source>
+ <translation type="vanished">将密钥导出到文件</translation>
+ </message>
+ <message>
+ <source>Key Files</source>
+ <translation type="vanished">密钥文件</translation>
+ </message>
+ <message>
+ <source>Export Error</source>
+ <translation type="vanished">导出错误</translation>
+ </message>
+ <message>
+ <source>Couldn&apos;t open %1 for writing</source>
+ <translation type="vanished">无法打开 %1 进行写入</translation>
+ </message>
+ <message>
+ <source>Exporting short private Key</source>
+ <translation type="vanished">导出短私钥</translation>
+ </message>
+ <message>
+ <source>You are about to export your</source>
+ <translation type="vanished">您即将导出您的</translation>
+ </message>
+ <message>
+ <source> PRIVATE KEY </source>
+ <translation type="vanished"> 私钥</translation>
+ </message>
+ <message>
+ <source>This is NOT your Public Key, so DON&apos;T give it away.</source>
+ <translation type="vanished">这不是你的公钥,所以不要把它给别人!</translation>
+ </message>
+ <message>
+ <source>Do you REALLY want to export your PRIVATE KEY in a Minimum Size?</source>
+ <translation type="vanished">您真的想以最小尺寸导出您的私钥吗?</translation>
+ </message>
+ <message>
+ <source>For OpenPGP keys it removes all signatures except for the latest self-signatures.</source>
+ <translation type="vanished">对于 OpenPGP 密钥,它会删除除最新的自签名之外的所有签名。</translation>
+ </message>
+ <message>
+ <source>Exporting private Key</source>
+ <translation type="vanished">导出私钥</translation>
+ </message>
+ <message>
+ <source>Do you REALLY want to export your PRIVATE KEY?</source>
+ <translation type="vanished">你真的想导出你的私钥吗?</translation>
+ </message>
+ <message>
+ <source>Revocation Certificates</source>
+ <translation type="vanished">吊销证书</translation>
+ </message>
+ <message>
+ <source>Not Successful</source>
+ <translation type="vanished">不成功</translation>
+ </message>
+ <message>
+ <source>Modify password not successfully.</source>
+ <translation type="vanished">修改密码不成功。</translation>
+ </message>
+ <message>
+ <source>Policy Auto</source>
+ <translation type="vanished">策略:自动</translation>
+ </message>
+ <message>
+ <source>Policy Good</source>
+ <translation type="vanished">策略:正常</translation>
+ </message>
+ <message>
+ <source>Policy Bad</source>
+ <translation type="vanished">策略:异常</translation>
+ </message>
+ <message>
+ <source>Policy Ask</source>
+ <translation type="vanished">策略:咨询</translation>
+ </message>
+ <message>
+ <source>Policy Unknown</source>
+ <translation type="vanished">策略:未知</translation>
+ </message>
+ <message>
+ <source>Modify TOFU Policy(Default is Auto)</source>
+ <translation type="vanished">修改TOFU策略(默认为自动)</translation>
+ </message>
+ <message>
+ <source>Policy for the Key Pair:</source>
+ <translation type="vanished">密钥对策略:</translation>
+ </message>
+ <message>
+ <source>Modify TOFU policy not successfully.</source>
+ <translation type="vanished">修改 TOFU 策略不成功。</translation>
+ </message>
+ <message>
+ <source>Unknown</source>
+ <translation type="vanished">未知</translation>
+ </message>
+ <message>
+ <source>Undefined</source>
+ <translation type="vanished">不明确</translation>
+ </message>
+ <message>
+ <source>Never</source>
+ <translation type="vanished">绝不</translation>
+ </message>
+ <message>
+ <source>Marginal</source>
+ <translation type="vanished">边缘</translation>
+ </message>
+ <message>
+ <source>Full</source>
+ <translation type="vanished">完全</translation>
+ </message>
+ <message>
+ <source>Ultimate</source>
+ <translation type="vanished">终极</translation>
+ </message>
+ <message>
+ <source>Modify Owner Trust Level</source>
+ <translation type="vanished">修改所有者信任级别</translation>
+ </message>
+ <message>
+ <source>Trust for the Key Pair:</source>
+ <translation type="vanished">对密钥对的信任:</translation>
+ </message>
+ <message>
+ <source>Owner Trust Level cannot set to Unknown level, automately changing it into Undefined level.</source>
+ <translation type="vanished">所有者信任级别无法设置为未知级别,会自动将其更改为未定义级别。</translation>
+ </message>
+ <message>
+ <source>Modify Owner Trust Level failed.</source>
+ <translation type="vanished">修改所有者信任级别失败。</translation>
+ </message>
+ <message>
+ <source>Set Owner Trust Level successful.</source>
+ <translation type="vanished">设置所有者信任级别成功。</translation>
+ </message>
+ <message>
+ <source>Subkey List</source>
+ <translation type="vanished">子密钥列表</translation>
+ </message>
+ <message>
+ <source>Detail of Selected Subkey</source>
+ <translation type="vanished">所选子密钥的详细信息</translation>
+ </message>
+ <message>
+ <source>Generate A New Subkey</source>
+ <translation type="vanished">生成新的子密钥</translation>
+ </message>
+ <message>
+ <source>Usage</source>
+ <translation type="vanished">用法</translation>
+ </message>
+ <message>
+ <source>Expires On (Local Time)</source>
+ <translation type="vanished">到期时间(本地时间)</translation>
+ </message>
+ <message>
+ <source>Existence</source>
+ <translation type="vanished">存在</translation>
+ </message>
+ <message>
+ <source>Key in Smart Card</source>
+ <translation type="vanished">在智能卡中</translation>
+ </message>
+ <message>
+ <source>Subkey ID</source>
+ <translation type="vanished">子密钥 ID</translation>
+ </message>
+ <message>
+ <source>Algo</source>
+ <translation type="vanished">算法</translation>
+ </message>
+ <message>
+ <source>Expire Date (UTC)</source>
+ <translation type="vanished">到期日期 (UTC)</translation>
+ </message>
+ <message>
+ <source>Yes</source>
+ <translation type="vanished">是</translation>
+ </message>
+ <message>
+ <source>No</source>
+ <translation type="vanished">否</translation>
+ </message>
+ <message>
+ <source>Edit Expire Date</source>
+ <translation type="vanished">编辑到期日期</translation>
+ </message>
+ <message>
+ <source>Notice: The New UID Created will be set as Primary.</source>
+ <translation type="vanished">注意:创建的新 UID 将设置为主要。</translation>
+ </message>
+ <message>
+ <source>Create New UID</source>
+ <translation type="vanished">创建新的 UID</translation>
+ </message>
+ <message>
+ <source>Name must contain at least five characters.</source>
+ <translation type="vanished">名称必须至少包含五个字符。</translation>
+ </message>
+ <message>
+ <source>Please give a email address.</source>
+ <translation type="vanished">请提供一个电子邮件地址。</translation>
+ </message>
+ <message>
+ <source>Signers</source>
+ <translation type="vanished">签名者</translation>
+ </message>
+ <message>
+ <source>Expire Date</source>
+ <translation type="vanished">到期日期</translation>
+ </message>
+ <message>
+ <source>Sign For Key&apos;s UID(s)</source>
+ <translation type="vanished">为密钥的 UID 签名</translation>
+ </message>
+ <message>
+ <source>Unsuccessful Operation</source>
+ <translation type="vanished">不成功的操作</translation>
+ </message>
+ <message>
+ <source>Signature operation failed for UID %1</source>
+ <translation type="vanished">UID %1 的签名操作失败</translation>
+ </message>
+ <message>
+ <source>Operation Complete</source>
+ <translation type="vanished">操作完成</translation>
+ </message>
+ <message>
+ <source>The signature operation of the UID is complete</source>
+ <translation type="vanished">UID的签名操作完成</translation>
+ </message>
+ <message>
+ <source>Signatures Details</source>
+ <translation type="vanished">签名详情</translation>
+ </message>
+ <message>
+ <source>No valid input found</source>
+ <translation type="vanished">找不到有效的输入</translation>
+ </message>
+ <message>
+ <source>Error Validating signature</source>
+ <translation type="vanished">验证签名时出错</translation>
+ </message>
+ <message>
+ <source>File was signed on %1</source>
+ <translation type="vanished">文件已在 %1 上签名</translation>
+ </message>
+ <message>
+ <source>It Contains</source>
+ <translation type="vanished">它包含了</translation>
+ </message>
+ <message>
+ <source>Signed on %1</source>
+ <translation type="vanished">已在 %1 上签名</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="vanished">取消</translation>
+ </message>
+ <message>
+ <source>Select Signer(s)</source>
+ <translation type="vanished">选择签名者</translation>
+ </message>
+ <message>
+ <source>Please select one or more private keys you use for signing.</source>
+ <translation type="vanished">请选择您用于签名的一个或多个私钥。</translation>
+ </message>
+ <message>
+ <source>If no key is selected, the default key will be used for signing.</source>
+ <translation type="vanished">如果未选择密钥,则将使用默认密钥进行签名。</translation>
+ </message>
+ <message>
+ <source>Unsaved Files</source>
+ <translation type="vanished">未保存的文件</translation>
+ </message>
+ <message>
+ <source>%1 files contain unsaved information.&lt;br/&gt;Save the changes before closing?</source>
+ <translation type="vanished">%1 个文件包含未保存的信息。&lt;br/&gt;要在关闭前保存更改吗?</translation>
+ </message>
+ <message>
+ <source>Check the files you want to save:</source>
+ <translation type="vanished">检查您要保存的文件:</translation>
+ </message>
+ <message>
+ <source>Note</source>
+ <translation type="vanished">笔记</translation>
+ </message>
+ <message>
+ <source>If you don&apos;t save these files, all changes are lost.</source>
+ <translation type="vanished">如果您不保存这些文件,所有更改都将丢失。</translation>
+ </message>
+ <message>
+ <source>Generate Key</source>
+ <translation type="vanished">生成密钥</translation>
+ </message>
+ <message>
+ <source>Expiration time too long.</source>
+ <translation type="vanished">过期时间太长。</translation>
+ </message>
+ <message>
+ <source>Password is empty.</source>
+ <translation type="vanished">密码为空。</translation>
+ </message>
+ <message>
+ <source>Generating</source>
+ <translation type="vanished">生成</translation>
+ </message>
+ <message>
+ <source>The new key pair has been generated.</source>
+ <translation type="vanished">新的密钥对已经生成。</translation>
+ </message>
+ <message>
+ <source>Key generation failed.</source>
+ <translation type="vanished">密钥生成失败。</translation>
+ </message>
+ <message>
+ <source>Key Usage</source>
+ <translation type="vanished">密钥使用</translation>
+ </message>
+ <message>
+ <source>Encryption</source>
+ <translation type="vanished">加密</translation>
+ </message>
+ <message>
+ <source>Signing</source>
+ <translation type="vanished">签名</translation>
+ </message>
+ <message>
+ <source>Certification</source>
+ <translation type="vanished">认证</translation>
+ </message>
+ <message>
+ <source>Authentication</source>
+ <translation type="vanished">验证</translation>
+ </message>
+ <message>
+ <source>Successful Operation</source>
+ <translation type="vanished">操作成功</translation>
+ </message>
+ <message>
+ <source>Expiration Date</source>
+ <translation type="vanished">截止日期</translation>
+ </message>
+ <message>
+ <source>KeySize (in Bit)</source>
+ <translation type="vanished">密钥大小(以位为单位)</translation>
+ </message>
+ <message>
+ <source>Key Type</source>
+ <translation type="vanished">密钥类型</translation>
+ </message>
+ <message>
+ <source>Non Pass Phrase</source>
+ <translation type="vanished">不设置密码</translation>
+ </message>
+ <message>
+ <source>Basic Information</source>
+ <translation type="vanished">基本信息</translation>
+ </message>
+ <message>
+ <source>Tipps: if the key pair has a passphrase, the subkey&apos;s passphrase must be equal to it.</source>
+ <translation type="vanished">提示:如果密钥对有密码,则子密钥的密码必须与其相等。</translation>
+ </message>
+ <message>
+ <source>Generate New Subkey</source>
+ <translation type="vanished">生成新子密钥</translation>
+ </message>
+ <message>
+ <source>Expiration time no more than 2 years.</source>
+ <translation type="vanished">有效期不超过2年。</translation>
+ </message>
+ <message>
+ <source>The new subkey has been generated.</source>
+ <translation type="vanished">新的子密钥已生成。</translation>
+ </message>
+ <message>
+ <source>Failed to generate key.</source>
+ <translation type="vanished">无法生成密钥。</translation>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation type="vanished">描述</translation>
+ </message>
+ <message>
+ <source>Version</source>
+ <translation type="vanished">版本</translation>
+ </message>
+ <message>
+ <source>Checksum</source>
+ <translation type="vanished">校验和</translation>
+ </message>
+ <message>
+ <source>Binary Path</source>
+ <translation type="vanished">二进制路径</translation>
+ </message>
+ <message>
+ <source>Are you sure that you want to delete the following uid?</source>
+ <translation type="vanished">您确定要删除以下 UID 吗?</translation>
+ </message>
+ <message>
+ <source>Configurations</source>
+ <translation type="vanished">配置</translation>
+ </message>
+ <message>
+ <source>Key</source>
+ <translation type="vanished">密钥</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation type="vanished">价值</translation>
+ </message>
+ <message>
+ <source>About</source>
+ <translation type="vanished">关于</translation>
+ </message>
+ <message>
+ <source>About GpgFrontend</source>
+ <translation type="vanished">关于 GpgFrontend</translation>
+ </message>
+ <message>
+ <source>GnuPG</source>
+ <translation type="vanished">GnuPG</translation>
+ </message>
+ <message>
+ <source>Translators</source>
+ <translation type="vanished">翻译贡献者</translation>
+ </message>
+ <message>
+ <source>Update</source>
+ <translation type="vanished">更新</translation>
+ </message>
+ <message>
+ <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="vanished">GpgFrontend 是一个易于使用、紧凑、跨平台、免安装的 GnuPG 前端。它将 GnuPG 的大部分常用操作可视化。GpgFrontend 是在 GPLv3 下授权的</translation>
+ </message>
+ <message>
+ <source>Developer:</source>
+ <translation type="vanished">开发者:</translation>
+ </message>
+ <message>
+ <source>If you have any questions or suggestions, raise an issue at</source>
+ <translation type="vanished">如果您有任何问题或建议,请在以下位置提出问题</translation>
+ </message>
+ <message>
+ <source>or send a mail to my mailing list at</source>
+ <translation type="vanished">或发送邮件到我的邮件列表</translation>
+ </message>
+ <message>
+ <source>Built with Qt</source>
+ <translation type="vanished">用 Qt 构建</translation>
+ </message>
+ <message>
+ <source>and</source>
+ <translation type="vanished">和</translation>
+ </message>
+ <message>
+ <source>Built at</source>
+ <translation type="vanished">构建于</translation>
+ </message>
+ <message>
+ <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="vanished">如果觉得翻译有问题,何不参与翻译工作呢?如果您想参加,请阅读文档或通过电子邮件与我联系。</translation>
+ </message>
+ <message>
+ <source>It is recommended that you always check the version of GpgFrontend and upgrade to the latest version.</source>
+ <translation type="vanished">建议您经常检查 GpgFrontend 的版本更新。</translation>
+ </message>
+ <message>
+ <source>New versions not only represent new features, but also often represent functional and security fixes.</source>
+ <translation type="vanished">新版本不仅代表新功能,而且通常代表功能和安全修复。</translation>
+ </message>
+ <message>
+ <source>Current Version</source>
+ <translation type="vanished">当前版本</translation>
+ </message>
+ <message>
+ <source>Latest Version From Github</source>
+ <translation type="vanished">来自 Github 的最新版本</translation>
+ </message>
+ <message>
+ <source>The current version is less than the latest version on github.</source>
+ <translation type="vanished">当前版本低于github上的最新版本。</translation>
+ </message>
+ <message>
+ <source>Please click</source>
+ <translation type="vanished">请点击</translation>
+ </message>
+ <message>
+ <source>Here</source>
+ <translation type="vanished">这里</translation>
+ </message>
+ <message>
+ <source>to download the latest stable version.</source>
+ <translation type="vanished">来下载最新的稳定版本。</translation>
+ </message>
+ <message>
+ <source>This version has serious problems and has been withdrawn. Please stop using it immediately.</source>
+ <translation type="vanished">此版本存在严重问题,已经被召回。请立即停止使用!</translation>
+ </message>
+ <message>
+ <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="vanished">此版本尚未发布,可能是测试版。如果您不是测试人员并且关心版本稳定性,请不要使用此版本。</translation>
+ </message>
+ <message>
+ <source>Key Database</source>
+ <translation type="vanished">密钥数据库</translation>
+ </message>
+ <message>
+ <source>Advanced</source>
+ <translation type="vanished">高级</translation>
+ </message>
+ <message>
+ <source>No ASCII Mode</source>
+ <translation type="vanished">无 ASCII 模式</translation>
+ </message>
+ <message>
+ <source>Use Pinentry as Password Input Dialog</source>
+ <translation type="vanished">使用 Pinentry 作为密码输入对话框</translation>
+ </message>
+ <message>
+ <source>Use Custom GnuPG</source>
+ <translation type="vanished">使用自定义 GnuPG</translation>
+ </message>
+ <message>
+ <source>Select GnuPG Path</source>
+ <translation type="vanished">选择 GnuPG 路径</translation>
+ </message>
+ <message>
+ <source>Use Custom GnuPG Key Database Path</source>
+ <translation type="vanished">使用自定义 GnuPG 密钥数据库路径</translation>
+ </message>
+ <message>
+ <source>Select Key Database Path</source>
+ <translation type="vanished">选择密钥数据库路径</translation>
+ </message>
+ <message>
+ <source>Tips: please select a directroy where &quot;gpgconf&quot; is located in.</source>
+ <translation type="vanished">提示:请选择“gpgconf”所在目录。</translation>
+ </message>
+ <message>
+ <source>Tips: notice that modify any of these settings will cause an Application restart.</source>
+ <translation type="vanished">提示:请注意,修改任何这些设置都会导致应用程序重新启动。</translation>
+ </message>
+ <message>
+ <source>Open Directory</source>
+ <translation type="vanished">打开目录</translation>
+ </message>
+ <message>
+ <source>GnuPG Controller</source>
+ <translation type="vanished">GnuPG 控制器</translation>
+ </message>
+ <message>
+ <source>Illegal GnuPG Path</source>
+ <translation type="vanished">非法 GnuPG 路径</translation>
+ </message>
+ <message>
+ <source>Target GnuPG Path is empty.</source>
+ <translation type="vanished">目标 GnuPG 路径为空。</translation>
+ </message>
+ <message>
+ <source>Target GnuPG Path is not an exists readable directory.</source>
+ <translation type="vanished">目标 GnuPG 路径不是现有的可读目录。</translation>
+ </message>
+ <message>
+ <source>Target GnuPG Path is not an absolute path.</source>
+ <translation type="vanished">目标 GnuPG 路径不是绝对路径。</translation>
+ </message>
+ <message>
+ <source>Target GnuPG Path contains no &quot;gpgconf&quot; executable.</source>
+ <translation type="vanished">目标 GnuPG 路径不包含“gpgconf”可执行文件。</translation>
+ </message>
+ <message>
+ <source>Illegal GnuPG Key Database Path</source>
+ <translation type="vanished">非法的 GnuPG 密钥数据库路径</translation>
+ </message>
+ <message>
+ <source>Target GnuPG Key Database Path is empty.</source>
+ <translation type="vanished">目标 GnuPG 密钥数据库路径为空。</translation>
+ </message>
+ <message>
+ <source>Target GnuPG Key Database Path is not an exists readable directory.</source>
+ <translation type="vanished">目标 GnuPG 密钥数据库路径不是现有的可读目录。</translation>
+ </message>
+ <message>
+ <source>Key Update Details</source>
+ <translation type="vanished">密钥更新详情</translation>
+ </message>
+ <message>
+ <source>No keys found</source>
+ <translation type="vanished">没有找到密钥</translation>
+ </message>
+ <message>
+ <source>Key Import Details</source>
+ <translation type="vanished">密钥导入详细信息</translation>
+ </message>
+ <message>
+ <source>No keys found to import</source>
+ <translation type="vanished">找不到要导入的密钥</translation>
+ </message>
+ <message>
+ <source>General key info</source>
+ <translation type="vanished">一般密钥信息</translation>
+ </message>
+ <message>
+ <source>Considered</source>
+ <translation type="vanished">经过认证</translation>
+ </message>
+ <message>
+ <source>Public unchanged</source>
+ <translation type="vanished">公开且不变</translation>
+ </message>
+ <message>
+ <source>Imported</source>
+ <translation type="vanished">导入</translation>
+ </message>
+ <message>
+ <source>Not Imported</source>
+ <translation type="vanished">未导入</translation>
+ </message>
+ <message>
+ <source>Private Read</source>
+ <translation type="vanished">私有且可读</translation>
+ </message>
+ <message>
+ <source>Private Imported</source>
+ <translation type="vanished">私有并导入</translation>
+ </message>
+ <message>
+ <source>Private Unchanged</source>
+ <translation type="vanished">私有未变更</translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation type="vanished">状态</translation>
+ </message>
+ <message>
+ <source>Private</source>
+ <translation type="vanished">私有的</translation>
+ </message>
+ <message>
+ <source>Public</source>
+ <translation type="vanished">公开的</translation>
+ </message>
+ <message>
+ <source>Unchanged</source>
+ <translation type="vanished">未变化</translation>
+ </message>
+ <message>
+ <source>New Key</source>
+ <translation type="vanished">新密钥</translation>
+ </message>
+ <message>
+ <source>New Subkey</source>
+ <translation type="vanished">新子密钥</translation>
+ </message>
+ <message>
+ <source>New Signature</source>
+ <translation type="vanished">新签名</translation>
+ </message>
+ <message>
+ <source>Uploading Public Key</source>
+ <translation type="vanished">上传公钥</translation>
+ </message>
+ <message>
+ <source>Default Keyserver Not Found</source>
+ <translation type="vanished">未找到默认密钥服务器</translation>
+ </message>
+ <message>
+ <source>Cannot read default keyserver from your settings, please set a default keyserver first</source>
+ <translation type="vanished">无法从您的设置中读取默认密钥服务器,请先设置默认密钥服务器</translation>
+ </message>
+ <message>
+ <source>Key Not Found</source>
+ <translation type="vanished">未找到密钥</translation>
+ </message>
+ <message>
+ <source>Timeout</source>
+ <translation type="vanished">超时</translation>
+ </message>
+ <message>
+ <source>Key Server Not Found</source>
+ <translation type="vanished">未找到密钥服务器</translation>
+ </message>
+ <message>
+ <source>Connection Error</source>
+ <translation type="vanished">连接错误</translation>
+ </message>
+ <message>
+ <source>Upload Success</source>
+ <translation type="vanished">上传成功</translation>
+ </message>
+ <message>
+ <source>Upload Public Key Successfully</source>
+ <translation type="vanished">上传公钥成功</translation>
+ </message>
+ <message>
+ <source>Export Key Package</source>
+ <translation type="vanished">导出密钥包</translation>
+ </message>
+ <message>
+ <source>Key Package</source>
+ <translation type="vanished">密钥包</translation>
+ </message>
+ <message>
+ <source>Export Key Package Passphrase</source>
+ <translation type="vanished">导出密钥包密码</translation>
+ </message>
+ <message>
+ <source>Key File</source>
+ <translation type="vanished">密钥文件</translation>
+ </message>
+ <message>
+ <source>An error occurred while generating the passphrase file.</source>
+ <translation type="vanished">生成密码短语文件时出错。</translation>
+ </message>
+ <message>
+ <source>Forbidden</source>
+ <translation type="vanished">操作被禁止</translation>
+ </message>
+ <message>
+ <source>Please select an output path before exporting.</source>
+ <translation type="vanished">导出前请选择输出路径。</translation>
+ </message>
+ <message>
+ <source>Please generate a password to protect your key before exporting, it is very important. Don&apos;t forget to back up your password in a safe place.</source>
+ <translation type="vanished">请在导出前生成密钥文件以保护您的密钥,这非常重要。不要忘记在安全的地方备份您的密码。</translation>
+ </message>
+ <message>
+ <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="vanished">密钥包已成功生成并受到加密算法AES-256-ECB的保护。您可以安全地转移您的密钥包。</translation>
+ </message>
+ <message>
+ <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="vanished">但密钥文件在任何情况下都不能泄露。请在完成传输操作后尽快删除密钥包和密钥文件。</translation>
+ </message>
+ <message>
+ <source>An error occurred while exporting the key package.</source>
+ <translation type="vanished">导出密钥包时出错。</translation>
+ </message>
+ <message>
+ <source>Key Package Name</source>
+ <translation type="vanished">密钥包名称</translation>
+ </message>
+ <message>
+ <source>Output Path</source>
+ <translation type="vanished">输出路径</translation>
+ </message>
+ <message>
+ <source>Passphrase</source>
+ <translation type="vanished">密钥文件</translation>
+ </message>
+ <message>
+ <source>Tips: You can use Key Package to safely and conveniently transfer your public and private keys between devices.</source>
+ <translation type="vanished">提示:您可以使用密钥包在设备之间安全方便地传输您的公钥和私钥。</translation>
+ </message>
+ <message>
+ <source>Generate and Save Passphrase</source>
+ <translation type="vanished">生成并保存密码</translation>
+ </message>
+ <message>
+ <source>Generate Key Package Name</source>
+ <translation type="vanished">生成密钥包名</translation>
+ </message>
+ <message>
+ <source>Select Output Path</source>
+ <translation type="vanished">选择输出路径</translation>
+ </message>
+ <message>
+ <source>Include secret key (Think twice before acting)</source>
+ <translation type="vanished">一并导出私钥(勾选前请三思)</translation>
+ </message>
+ <message>
+ <source>Exclude keys that do not have a private key</source>
+ <translation type="vanished">只导出有私钥的钥对</translation>
+ </message>
+ <message>
+ <source>Export As Key Package</source>
+ <translation type="vanished">导出为密钥包</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation type="vanished">关闭</translation>
+ </message>
+ <message>
+ <source>Import ALL</source>
+ <translation type="vanished">全部导入</translation>
+ </message>
+ <message>
+ <source>Search</source>
+ <translation type="vanished">搜索</translation>
+ </message>
+ <message>
+ <source>Search String</source>
+ <translation type="vanished">搜索字符串</translation>
+ </message>
+ <message>
+ <source>Update Keys from Keyserver</source>
+ <translation type="vanished">从密钥服务器更新密钥</translation>
+ </message>
+ <message>
+ <source>Import Keys from Keyserver</source>
+ <translation type="vanished">从密钥服务器导入密钥</translation>
+ </message>
+ <message>
+ <source>UID</source>
+ <translation type="vanished">UID</translation>
+ </message>
+ <message>
+ <source>Creation date</source>
+ <translation type="vanished">创建日期</translation>
+ </message>
+ <message>
+ <source>KeyID</source>
+ <translation type="vanished">密钥 ID</translation>
+ </message>
+ <message>
+ <source>Tag</source>
+ <translation type="vanished">标签</translation>
+ </message>
+ <message>
+ <source>Text is empty.</source>
+ <translation type="vanished">文字为空。</translation>
+ </message>
+ <message>
+ <source>Not Key Found</source>
+ <translation type="vanished">未找到密钥</translation>
+ </message>
+ <message>
+ <source>Too many responses from keyserver!</source>
+ <translation type="vanished">来自密钥服务器的响应太多!</translation>
+ </message>
+ <message>
+ <source>No keys found, input may be kexId, retrying search with 0x.</source>
+ <translation type="vanished">未找到密钥,输入可能是 kexId,正在使用 0x 重试。</translation>
+ </message>
+ <message>
+ <source>No keys found containing the search string!</source>
+ <translation type="vanished">未找到包含搜索字符串的密钥!</translation>
+ </message>
+ <message>
+ <source>Insufficiently specific search string!</source>
+ <translation type="vanished">不够具体的搜索字符串!</translation>
+ </message>
+ <message>
+ <source>revoked</source>
+ <translation type="vanished">撤销</translation>
+ </message>
+ <message>
+ <source>disabled</source>
+ <translation type="vanished">被禁用</translation>
+ </message>
+ <message>
+ <source>%1 keys found. Double click a key to import it.</source>
+ <translation type="vanished">找到 %1 个密钥。双击一个密钥来导入它。</translation>
+ </message>
+ <message>
+ <source>key not found in the Keyserver</source>
+ <translation type="vanished">在密钥服务器中找不到密钥</translation>
+ </message>
+ <message>
+ <source>Host Not Found</source>
+ <translation type="vanished">主机未找到</translation>
+ </message>
+ <message>
+ <source>General Connection Error</source>
+ <translation type="vanished">一般连接错误</translation>
+ </message>
+ <message>
+ <source>Key Imported</source>
+ <translation type="vanished">密钥导入成功</translation>
+ </message>
+ <message>
+ <source>First Start Wizard</source>
+ <translation type="vanished">欢迎</translation>
+ </message>
+ <message>
+ <source>Getting Started...</source>
+ <translation type="vanished">入门...</translation>
+ </message>
+ <message>
+ <source>... with GpgFrontend</source>
+ <translation type="vanished">... 使用 GpgFrontend</translation>
+ </message>
+ <message>
+ <source>Welcome to use GpgFrontend for decrypting and signing text or file!</source>
+ <translation type="vanished">欢迎使用 GpgFrontend 对文本或文件进行解密和签名!</translation>
+ </message>
+ <message>
+ <source>is a Powerful, Easy-to-Use, Compact, Cross-Platform, and Installation-Free OpenPGP Crypto Tool.</source>
+ <translation type="vanished">是一款功能强大、易于使用、紧凑、跨平台且免安装的 OpenPGP 加密工具。</translation>
+ </message>
+ <message>
+ <source>For brief information have a look at the</source>
+ <translation type="vanished">简要信息,请查看</translation>
+ </message>
+ <message>
+ <source>Overview</source>
+ <translation type="vanished">概述</translation>
+ </message>
+ <message>
+ <source>by clicking the link, the page will open in the web browser</source>
+ <translation type="vanished">单击来在网络浏览器中打开链接</translation>
+ </message>
+ <message>
+ <source>If it supports the language currently being used in your system, GpgFrontend will automatically set it.</source>
+ <translation type="vanished">GpgFrontend 已经自动将语言设置为中文。</translation>
+ </message>
+ <message>
+ <source>Choose your action...</source>
+ <translation type="vanished">选择你的行动...</translation>
+ </message>
+ <message>
+ <source>...by clicking on the appropriate link.</source>
+ <translation type="vanished">...通过点击相应的链接。</translation>
+ </message>
+ <message>
+ <source>If you have never used GpgFrontend before and also don&apos;t own a gpg key yet you may possibly want to read how to</source>
+ <translation type="vanished">如果您以前从未使用过 GpgFrontend 并且也没有 gpg 密钥,您可能想阅读如何</translation>
+ </message>
+ <message>
+ <source>If you want to learn how to encrypt, decrypt, sign and verify text, you can read </source>
+ <translation type="vanished">如果你想学习如何加密、解密、签名和验证文本,你可以阅读</translation>
+ </message>
+ <message>
+ <source>Encrypt &amp; Decrypt Text</source>
+ <translation type="vanished">加密和解密文本</translation>
+ </message>
+ <message>
+ <source>or</source>
+ <translation type="vanished">或者</translation>
+ </message>
+ <message>
+ <source>Sign &amp; Verify Text</source>
+ <translation type="vanished">签名和验证文本</translation>
+ </message>
+ <message>
+ <source>If you want to operate file, you can read </source>
+ <translation type="vanished">如果要操作文件,可以阅读</translation>
+ </message>
+ <message>
+ <source>Encrypt &amp; Sign File</source>
+ <translation type="vanished">加密和签名文件</translation>
+ </message>
+ <message>
+ <source>Sign &amp; Verify File</source>
+ <translation type="vanished">签署并验证文件</translation>
+ </message>
+ <message>
+ <source>Create a keypair...</source>
+ <translation type="vanished">创建密钥对...</translation>
+ </message>
+ <message>
+ <source>...for decrypting and signing messages</source>
+ <translation type="vanished">...用于解密和签署消息</translation>
+ </message>
+ <message>
+ <source>You should create a new keypair.The pair consists of a public and a private key.&lt;br&gt;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.&lt;br&gt;For more information have a look at the offline tutorial (which then is shown in the main window):</source>
+ <translation type="vanished">您应该创建一个新的密钥对。该对由一个公钥和一个私钥组成。&lt;br&gt;其他用户可以使用公钥为您加密消息并验证您签署的消息。您可以使用私钥解密和签名消息。&lt;br&gt;有关更多信息,请查看离线教程(然后显示在主窗口中):</translation>
+ </message>
+ <message>
+ <source>Offline tutorial</source>
+ <translation type="vanished">离线教程</translation>
+ </message>
+ <message>
+ <source>Create New Key</source>
+ <translation type="vanished">创建新密钥</translation>
+ </message>
+ <message>
+ <source>Ready.</source>
+ <translation type="vanished">准备好。</translation>
+ </message>
+ <message>
+ <source>Have fun with GpgFrontend!</source>
+ <translation type="vanished">祝您使用 GpgFrontend 愉快!</translation>
+ </message>
+ <message>
+ <source>You are ready to use GpgFrontend now.&lt;br&gt;&lt;br&gt;</source>
+ <translation type="vanished">您现在可以使用 GpgFrontend。&lt;br&gt;&lt;br&gt;</translation>
+ </message>
+ <message>
+ <source>The Online Document</source>
+ <translation type="vanished">在线文档</translation>
+ </message>
+ <message>
+ <source> will get you started with GpgFrontend. Anytime you encounter problems, please try to find help from the documentation</source>
+ <translation type="vanished"> 会让你学会 GpgFrontend 的基本操作。任何时候遇到问题,请尝试从文档中寻求帮助</translation>
+ </message>
+ <message>
+ <source>Open offline help.</source>
+ <translation type="vanished">打开离线帮助。</translation>
+ </message>
+ <message>
+ <source>Dont show the wizard again.</source>
+ <translation type="vanished">不要再次显示向导。</translation>
+ </message>
+ <message>
+ <source>All</source>
+ <translation type="vanished">全部</translation>
+ </message>
+ <message>
+ <source>Only Public Key</source>
+ <translation type="vanished">只有公钥</translation>
+ </message>
+ <message>
+ <source>Has Private Key</source>
+ <translation type="vanished">有私钥</translation>
+ </message>
+ <message>
+ <source>No Primary Key</source>
+ <translation type="vanished">无主密钥</translation>
+ </message>
+ <message>
+ <source>Revoked</source>
+ <translation type="vanished">已吊销</translation>
+ </message>
+ <message>
+ <source>Expired</source>
+ <translation type="vanished">已到期</translation>
+ </message>
+ <message>
+ <source>KeyPair Management</source>
+ <translation type="vanished">密钥对管理</translation>
+ </message>
+ <message>
+ <source>Open</source>
+ <translation type="vanished">打开</translation>
+ </message>
+ <message>
+ <source>Ctrl+O</source>
+ <translation type="vanished">Ctrl+O</translation>
+ </message>
+ <message>
+ <source>Open Key File</source>
+ <translation type="vanished">打开密钥文件</translation>
+ </message>
+ <message>
+ <source>Ctrl+Q</source>
+ <translation type="vanished">Ctrl+Q</translation>
+ </message>
+ <message>
+ <source>New Keypair</source>
+ <translation type="vanished">新密钥对</translation>
+ </message>
+ <message>
+ <source>Ctrl+N</source>
+ <translation type="vanished">Ctrl+N</translation>
+ </message>
+ <message>
+ <source>Generate KeyPair</source>
+ <translation type="vanished">生成密钥对</translation>
+ </message>
+ <message>
+ <source>Ctrl+Shift+N</source>
+ <translation type="vanished">Ctrl+Shift+N</translation>
+ </message>
+ <message>
+ <source>Generate Subkey For Selected KeyPair</source>
+ <translation type="vanished">为选定的密钥对生成子密钥</translation>
+ </message>
+ <message>
+ <source>File</source>
+ <translation type="vanished">文件</translation>
+ </message>
+ <message>
+ <source>Import New Key From File</source>
+ <translation type="vanished">从文件导入新密钥</translation>
+ </message>
+ <message>
+ <source>Clipboard</source>
+ <translation type="vanished">剪贴板</translation>
+ </message>
+ <message>
+ <source>Import New Key From Clipboard</source>
+ <translation type="vanished">从剪贴板导入新密钥</translation>
+ </message>
+ <message>
+ <source>Keyserver</source>
+ <translation type="vanished">密钥服务器</translation>
+ </message>
+ <message>
+ <source>Import New Key From Keyserver</source>
+ <translation type="vanished">从密钥服务器导入新密钥</translation>
+ </message>
+ <message>
+ <source>Import Key(s) From a Key Package</source>
+ <translation type="vanished">从密钥包导入密钥</translation>
+ </message>
+ <message>
+ <source>Export To Clipboard</source>
+ <translation type="vanished">导出到剪贴板</translation>
+ </message>
+ <message>
+ <source>Export Selected Key(s) To Clipboard</source>
+ <translation type="vanished">将选定的密钥对导出到剪贴板</translation>
+ </message>
+ <message>
+ <source>Export To Key Package</source>
+ <translation type="vanished">导出到密钥包</translation>
+ </message>
+ <message>
+ <source>Export Checked Key(s) To a Key Package</source>
+ <translation type="vanished">将检查的密钥导出到密钥包</translation>
+ </message>
+ <message>
+ <source>Export As OpenSSH</source>
+ <translation type="vanished">导出为OpenSSH密钥</translation>
+ </message>
+ <message>
+ <source>Export Selected Key(s) As OpenSSH Format to File</source>
+ <translation type="vanished">将选定的密钥以 OpenSSH 格式导出到文件</translation>
+ </message>
+ <message>
+ <source>Delete Selected Key(s)</source>
+ <translation type="vanished">删除这些选定的密钥</translation>
+ </message>
+ <message>
+ <source>Delete the Selected keys</source>
+ <translation type="vanished">删除这个选定的密钥</translation>
+ </message>
+ <message>
+ <source>Delete Checked Key(s)</source>
+ <translation type="vanished">删除选中的密钥</translation>
+ </message>
+ <message>
+ <source>Delete the Checked keys</source>
+ <translation type="vanished">删除选中的密钥</translation>
+ </message>
+ <message>
+ <source>Show Key Details</source>
+ <translation type="vanished">显示密钥细节</translation>
+ </message>
+ <message>
+ <source>Show Details for this Key</source>
+ <translation type="vanished">显示此密钥的详细信息</translation>
+ </message>
+ <message>
+ <source>Import Key</source>
+ <translation type="vanished">导入密钥</translation>
+ </message>
+ <message>
+ <source>Import key</source>
+ <translation type="vanished">导入密钥</translation>
+ </message>
+ <message>
+ <source>Deleting Keys</source>
+ <translation type="vanished">删除密钥</translation>
+ </message>
+ <message>
+ <source>Are you sure that you want to delete the following keys?</source>
+ <translation type="vanished">您确定要删除以下密钥吗?</translation>
+ </message>
+ <message>
+ <source>Key Not Found.</source>
+ <translation type="vanished">未找到密钥。</translation>
+ </message>
+ <message>
+ <source>Please check some keys before doing this operation.</source>
+ <translation type="vanished">请在执行此操作之前检查一些密钥。</translation>
+ </message>
+ <message>
+ <source>key(s) exported</source>
+ <translation type="vanished">导出的密钥</translation>
+ </message>
+ <message>
+ <source>Please select one KeyPair before doing this operation.</source>
+ <translation type="vanished">请在执行此操作前选择一个钥对。</translation>
+ </message>
+ <message>
+ <source>If a key pair does not have a private key then it will not be able to generate sub-keys.</source>
+ <translation type="vanished">如果密钥对没有私钥,那么它将无法生成子密钥。</translation>
+ </message>
+ <message>
+ <source>Please select a key before performing this operation. If you select multiple keys, only the first key will be exported.</source>
+ <translation type="vanished">请在执行此操作前选择一个密钥。如果您选择多个密钥,则只会导出第一个密钥。</translation>
+ </message>
+ <message>
+ <source>An error occur in exporting.</source>
+ <translation type="vanished">导出时发生错误。</translation>
+ </message>
+ <message>
+ <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="vanished">此密钥可能无法导出为 OpenSSH 格式。请检查用于签名的子密钥的密钥大小。</translation>
+ </message>
+ <message>
+ <source>Export OpenSSH Key To File</source>
+ <translation type="vanished">将 OpenSSH 密钥导出到文件</translation>
+ </message>
+ <message>
+ <source>OpenSSH Public Key Files</source>
+ <translation type="vanished">OpenSSH 公钥文件</translation>
+ </message>
+ <message>
+ <source>Import Key Package</source>
+ <translation type="vanished">导入密钥包</translation>
+ </message>
+ <message>
+ <source>Import Key Package Passphrase File</source>
+ <translation type="vanished">导入密钥包密码文件</translation>
+ </message>
+ <message>
+ <source>Key Package Passphrase File</source>
+ <translation type="vanished">密钥包密码文件</translation>
+ </message>
+ <message>
+ <source>key(s) imported</source>
+ <translation type="vanished">导入的密钥</translation>
+ </message>
+ <message>
+ <source>An error occur in importing key package.</source>
+ <translation type="vanished">导入密钥包出错。</translation>
+ </message>
+ <message>
+ <source>The path %1 does not exist.</source>
+ <translation type="vanished">路径 %1 不存在。</translation>
+ </message>
+ <message>
+ <source>No permission to read this file.</source>
+ <translation type="vanished">没有读取此文件的权限。</translation>
+ </message>
+ <message>
+ <source>No permission to create file.</source>
+ <translation type="vanished">没有创建文件的权限。</translation>
+ </message>
+ <message>
+ <source>The file is not a tarball.</source>
+ <translation type="vanished">该文件不是压缩包。</translation>
+ </message>
+ <message>
+ <source>Extracting Tarball</source>
+ <translation type="vanished">解压压缩包</translation>
+ </message>
+ <message>
+ <source>Making Tarball</source>
+ <translation type="vanished">制作压缩包</translation>
+ </message>
+ <message>
+ <source>The target file %1 already exists, do you need to overwrite it?</source>
+ <translation type="vanished">目标文件 %1 已经存在,是否需要覆盖?</translation>
+ </message>
+ <message>
+ <source>Unable to convert the folder into tarball.</source>
+ <translation type="vanished">无法压缩文件夹。</translation>
+ </message>
+ <message>
+ <source>Symmetric Encryption</source>
+ <translation type="vanished">对称加密</translation>
+ </message>
+ <message>
+ <source>No Key Selected. Do you want to encrypt with a symmetric cipher using a passphrase?</source>
+ <translation type="vanished">未选择密钥。您想使用密码使用对称密码进行加密吗?</translation>
+ </message>
+ <message>
+ <source>Symmetrically Encrypting</source>
+ <translation type="vanished">对称加密</translation>
+ </message>
+ <message>
+ <source>Invalid KeyPair</source>
+ <translation type="vanished">无效的密钥对</translation>
+ </message>
+ <message>
+ <source>The selected keypair cannot be used for encryption.</source>
+ <translation type="vanished">所选的密钥对不能用于加密。</translation>
+ </message>
+ <message>
+ <source>For example the Following Key:</source>
+ <translation type="vanished">例如以下密钥:</translation>
+ </message>
+ <message>
+ <source>Encrypting</source>
+ <translation type="vanished">加密</translation>
+ </message>
+ <message>
+ <source>An error occurred during operation.</source>
+ <translation type="vanished">操作过程中发生错误。</translation>
+ </message>
+ <message>
+ <source>The target file already exists, do you need to overwrite it?</source>
+ <translation type="vanished">目标文件已经存在,是否需要覆盖?</translation>
+ </message>
+ <message>
+ <source>Decrypting</source>
+ <translation type="vanished">解密</translation>
+ </message>
+ <message>
+ <source>Do you want to extract and delete the decrypted tarball?</source>
+ <translation type="vanished">您要解压并删除删除解密的压缩包吗?</translation>
+ </message>
+ <message>
+ <source>Extracting tarball succeeded.</source>
+ <translation type="vanished">解压压缩包成功。</translation>
+ </message>
+ <message>
+ <source>Extracting tarball failed.</source>
+ <translation type="vanished">解压压缩包失败。</translation>
+ </message>
+ <message>
+ <source>No Key Checked</source>
+ <translation type="vanished">未检查密钥</translation>
+ </message>
+ <message>
+ <source>Please check the key in the key toolbox on the right.</source>
+ <translation type="vanished">请检查右侧密钥工具箱中的密钥。</translation>
+ </message>
+ <message>
+ <source>The selected key contains a key that does not actually have a sign usage.</source>
+ <translation type="vanished">所选密钥包含一个实际上没有符号用法的密钥。</translation>
+ </message>
+ <message>
+ <source>for example the Following Key:</source>
+ <translation type="vanished">例如以下密钥:</translation>
+ </message>
+ <message>
+ <source>The signature file &quot;%1&quot; exists, do you need to overwrite it?</source>
+ <translation type="vanished">签名文件“%1”存在,是否需要覆盖?</translation>
+ </message>
+ <message>
+ <source>Origin file to verify</source>
+ <translation type="vanished">要验证的原始文件</translation>
+ </message>
+ <message>
+ <source>Filepath</source>
+ <translation type="vanished">文件路径</translation>
+ </message>
+ <message>
+ <source>Please select the appropriate origin file or signature file. Ensure that both are in this directory.</source>
+ <translation type="vanished">请选择合适的源文件或签名文件。确保两者都在此目录中。</translation>
+ </message>
+ <message>
+ <source>Verifying</source>
+ <translation type="vanished">验证</translation>
+ </message>
+ <message>
+ <source>Encrypting and Signing</source>
+ <translation type="vanished">加密和签名</translation>
+ </message>
+ <message>
+ <source>The output file %1 already exists, do you need to overwrite it?</source>
+ <translation type="vanished">输出文件 %1 已经存在,是否需要覆盖?</translation>
+ </message>
+ <message>
+ <source>Decrypting and Verifying</source>
+ <translation type="vanished">解密和验证</translation>
+ </message>
+ <message>
+ <source>New</source>
+ <translation type="vanished">新建</translation>
+ </message>
+ <message>
+ <source>Open a new file</source>
+ <translation type="vanished">打开一个新文件</translation>
+ </message>
+ <message>
+ <source>Open...</source>
+ <translation type="vanished">打开...</translation>
+ </message>
+ <message>
+ <source>Open an existing file</source>
+ <translation type="vanished">打开现有文件</translation>
+ </message>
+ <message>
+ <source>File Browser</source>
+ <translation type="vanished">文件浏览器</translation>
+ </message>
+ <message>
+ <source>Open a file browser</source>
+ <translation type="vanished">打开文件浏览器</translation>
+ </message>
+ <message>
+ <source>Save File</source>
+ <translation type="vanished">保存文件</translation>
+ </message>
+ <message>
+ <source>Save the current File</source>
+ <translation type="vanished">保存当前文件</translation>
+ </message>
+ <message>
+ <source>Save As</source>
+ <translation type="vanished">另存为</translation>
+ </message>
+ <message>
+ <source>Save the current File as...</source>
+ <translation type="vanished">将当前文件另存为...</translation>
+ </message>
+ <message>
+ <source>Print</source>
+ <translation type="vanished">打印</translation>
+ </message>
+ <message>
+ <source>Print Document</source>
+ <translation type="vanished">打印文件</translation>
+ </message>
+ <message>
+ <source>Close file</source>
+ <translation type="vanished">关闭文件</translation>
+ </message>
+ <message>
+ <source>Quit</source>
+ <translation type="vanished">退出</translation>
+ </message>
+ <message>
+ <source>Quit Program</source>
+ <translation type="vanished">退出程序</translation>
+ </message>
+ <message>
+ <source>Undo</source>
+ <translation type="vanished">撤消</translation>
+ </message>
+ <message>
+ <source>Undo Last Edit Action</source>
+ <translation type="vanished">撤消上次编辑操作</translation>
+ </message>
+ <message>
+ <source>Redo</source>
+ <translation type="vanished">重做</translation>
+ </message>
+ <message>
+ <source>Redo Last Edit Action</source>
+ <translation type="vanished">重做上次编辑操作</translation>
+ </message>
+ <message>
+ <source>Zoom In</source>
+ <translation type="vanished">放大</translation>
+ </message>
+ <message>
+ <source>Zoom Out</source>
+ <translation type="vanished">缩小</translation>
+ </message>
+ <message>
+ <source>Paste</source>
+ <translation type="vanished">粘贴</translation>
+ </message>
+ <message>
+ <source>Paste Text From Clipboard</source>
+ <translation type="vanished">从剪贴板粘贴文本</translation>
+ </message>
+ <message>
+ <source>Cut</source>
+ <translation type="vanished">剪切</translation>
+ </message>
+ <message>
+ <source>Cut the current selection&apos;s contents to the clipboard</source>
+ <translation type="vanished">将当前选择的内容剪切到剪贴板</translation>
+ </message>
+ <message>
+ <source>Copy the current selection&apos;s contents to the clipboard</source>
+ <translation type="vanished">将当前选择的内容复制到剪贴板</translation>
+ </message>
+ <message>
+ <source>Quote</source>
+ <translation type="vanished">引用</translation>
+ </message>
+ <message>
+ <source>Quote whole text</source>
+ <translation type="vanished">引用全文</translation>
+ </message>
+ <message>
+ <source>Select All</source>
+ <translation type="vanished">全选</translation>
+ </message>
+ <message>
+ <source>Select the whole text</source>
+ <translation type="vanished">选择整个文本</translation>
+ </message>
+ <message>
+ <source>Find</source>
+ <translation type="vanished">查找</translation>
+ </message>
+ <message>
+ <source>Find a word</source>
+ <translation type="vanished">找一个词</translation>
+ </message>
+ <message>
+ <source>Remove spacing</source>
+ <translation type="vanished">删除间距</translation>
+ </message>
+ <message>
+ <source>Remove double linebreaks, e.g. in pasted text from Web Mailer</source>
+ <translation type="vanished">删除双换行符,例如在来自 Web Mailer 的粘贴文本中</translation>
+ </message>
+ <message>
+ <source>Open settings dialog</source>
+ <translation type="vanished">打开设置对话框</translation>
+ </message>
+ <message>
+ <source>Encrypt Message</source>
+ <translation type="vanished">加密消息</translation>
+ </message>
+ <message>
+ <source>Encrypt Sign</source>
+ <translation type="vanished">加密签名</translation>
+ </message>
+ <message>
+ <source>Encrypt and Sign Message</source>
+ <translation type="vanished">加密和签名消息</translation>
+ </message>
+ <message>
+ <source>Decrypt</source>
+ <translation type="vanished">解密</translation>
+ </message>
+ <message>
+ <source>Decrypt Message</source>
+ <translation type="vanished">解密消息</translation>
+ </message>
+ <message>
+ <source>Decrypt Verify</source>
+ <translation type="vanished">解密验证</translation>
+ </message>
+ <message>
+ <source>Decrypt and Verify Message</source>
+ <translation type="vanished">解密和验证消息</translation>
+ </message>
+ <message>
+ <source>Sign Message</source>
+ <translation type="vanished">签名留言</translation>
+ </message>
+ <message>
+ <source>Verify</source>
+ <translation type="vanished">验证</translation>
+ </message>
+ <message>
+ <source>Verify Message</source>
+ <translation type="vanished">验证消息</translation>
+ </message>
+ <message>
+ <source>Editor</source>
+ <translation type="vanished">编辑</translation>
+ </message>
+ <message>
+ <source>Import New Key From Editor</source>
+ <translation type="vanished">从编辑器导入新密钥</translation>
+ </message>
+ <message>
+ <source>Manage Keys</source>
+ <translation type="vanished">管理密钥</translation>
+ </message>
+ <message>
+ <source>Open Key Management</source>
+ <translation type="vanished">打开密钥管理器</translation>
+ </message>
+ <message>
+ <source>Clear Password Cache</source>
+ <translation type="vanished">清除密码缓存</translation>
+ </message>
+ <message>
+ <source>Clear Password Cache of GnuPG</source>
+ <translation type="vanished">清除 GnuPG 的密码缓存</translation>
+ </message>
+ <message>
+ <source>Clear password cache successfully</source>
+ <translation type="vanished">清除密码缓存成功</translation>
+ </message>
+ <message>
+ <source>Failed Operation</source>
+ <translation type="vanished">操作失败</translation>
+ </message>
+ <message>
+ <source>Failed to clear password cache of GnuPG</source>
+ <translation type="vanished">无法清除 GnuPG 的密码缓存</translation>
+ </message>
+ <message>
+ <source>Reload All Components</source>
+ <translation type="vanished">重新加载所有组件</translation>
+ </message>
+ <message>
+ <source>Reload All GnuPG&apos;s Components</source>
+ <translation type="vanished">重新加载所有 GnuPG 的组件</translation>
+ </message>
+ <message>
+ <source>Reload all the GnuPG&apos;s components successfully</source>
+ <translation type="vanished">成功重新加载所有 GnuPG 组件</translation>
+ </message>
+ <message>
+ <source>Failed to reload all or one of the GnuPG&apos;s component(s)</source>
+ <translation type="vanished">未能重新加载所有或其中一个 GnuPG 组件</translation>
+ </message>
+ <message>
+ <source>Restart All Components</source>
+ <translation type="vanished">重新启动所有组件</translation>
+ </message>
+ <message>
+ <source>Restart All GnuPG&apos;s Components</source>
+ <translation type="vanished">重新启动所有 GnuPG 的组件</translation>
+ </message>
+ <message>
+ <source>Restart all the GnuPG&apos;s components successfully</source>
+ <translation type="vanished">成功重启所有 GnuPG 组件</translation>
+ </message>
+ <message>
+ <source>Failed to restart all or one of the GnuPG&apos;s component(s)</source>
+ <translation type="vanished">无法重新启动所有或其中一个 GnuPG 组件</translation>
+ </message>
+ <message>
+ <source>Open GnuPG Controller</source>
+ <translation type="vanished">打开 GnuPG 控制器</translation>
+ </message>
+ <message>
+ <source>Open GnuPG Controller Dialog</source>
+ <translation type="vanished">打开 GnuPG 控制器对话框</translation>
+ </message>
+ <message>
+ <source>Show the application&apos;s About box</source>
+ <translation type="vanished">显示应用程序的关于界面</translation>
+ </message>
+ <message>
+ <source>Information about Gnupg</source>
+ <translation type="vanished">关于 Gnupg</translation>
+ </message>
+ <message>
+ <source>Translate</source>
+ <translation type="vanished">翻译</translation>
+ </message>
+ <message>
+ <source>Information about translation</source>
+ <translation type="vanished">翻译信息</translation>
+ </message>
+ <message>
+ <source>Check for Updates</source>
+ <translation type="vanished">检查更新</translation>
+ </message>
+ <message>
+ <source>Check for updates</source>
+ <translation type="vanished">检查更新</translation>
+ </message>
+ <message>
+ <source>Open Wizard</source>
+ <translation type="vanished">打开向导</translation>
+ </message>
+ <message>
+ <source>Open the wizard</source>
+ <translation type="vanished">打开向导</translation>
+ </message>
+ <message>
+ <source>Append Public Key to Editor</source>
+ <translation type="vanished">将公钥附加到编辑器</translation>
+ </message>
+ <message>
+ <source>Append selected Keypair&apos;s Public Key to Editor</source>
+ <translation type="vanished">将选定的密钥对的公钥附加到编辑器</translation>
+ </message>
+ <message>
+ <source>Append Create DateTime to Editor</source>
+ <translation type="vanished">将创建日期时间附加到编辑器</translation>
+ </message>
+ <message>
+ <source>Append selected Key&apos;s creation date and time to Editor</source>
+ <translation type="vanished">将所选密钥的创建日期和时间附加到编辑器</translation>
+ </message>
+ <message>
+ <source>Append Expire DateTime to Editor</source>
+ <translation type="vanished">将过期日期时间附加到编辑器</translation>
+ </message>
+ <message>
+ <source>Append selected Key&apos;s expiration date and time to Editor</source>
+ <translation type="vanished">将所选密钥的到期日期和时间附加到编辑器</translation>
+ </message>
+ <message>
+ <source>Append Fingerprint to Editor</source>
+ <translation type="vanished">将指纹附加到编辑器</translation>
+ </message>
+ <message>
+ <source>Append selected Key&apos;s Fingerprint to Editor</source>
+ <translation type="vanished">将所选密钥的指纹附加到编辑器</translation>
+ </message>
+ <message>
+ <source>Copy Email</source>
+ <translation type="vanished">复制电子邮件</translation>
+ </message>
+ <message>
+ <source>Copy selected Keypair&apos;s to clipboard</source>
+ <translation type="vanished">将选定的密钥对复制到剪贴板</translation>
+ </message>
+ <message>
+ <source>Copy Default UID</source>
+ <translation type="vanished">复制默认 UID</translation>
+ </message>
+ <message>
+ <source>Copy selected Keypair&apos;s default UID to clipboard</source>
+ <translation type="vanished">将所选密钥对的默认 UID 复制到剪贴板</translation>
+ </message>
+ <message>
+ <source>Copy Key ID</source>
+ <translation type="vanished">复制密钥 ID</translation>
+ </message>
+ <message>
+ <source>Copy selected Keypair&apos;s ID to clipboard</source>
+ <translation type="vanished">将所选密钥对的 ID 复制到剪贴板</translation>
+ </message>
+ <message>
+ <source>Add To Favourite</source>
+ <translation type="vanished">添加到收藏夹</translation>
+ </message>
+ <message>
+ <source>Add this key to Favourite Table</source>
+ <translation type="vanished">将此键添加到收藏夹表</translation>
+ </message>
+ <message>
+ <source>Remove From Favourite</source>
+ <translation type="vanished">从收藏夹中删除</translation>
+ </message>
+ <message>
+ <source>Remove this key from Favourite Table</source>
+ <translation type="vanished">从收藏表中删除此键</translation>
+ </message>
+ <message>
+ <source>Remove PGP Header</source>
+ <translation type="vanished">删除 PGP 标头</translation>
+ </message>
+ <message>
+ <source>Add PGP Header</source>
+ <translation type="vanished">添加 PGP 标头</translation>
+ </message>
+ <message>
+ <source>Edit</source>
+ <translation type="vanished">编辑</translation>
+ </message>
+ <message>
+ <source>Crypt</source>
+ <translation type="vanished">加密</translation>
+ </message>
+ <message>
+ <source>Keys</source>
+ <translation type="vanished">密钥</translation>
+ </message>
+ <message>
+ <source>Steganography</source>
+ <translation type="vanished">隐写术</translation>
+ </message>
+ <message>
+ <source>View</source>
+ <translation type="vanished">查看</translation>
+ </message>
+ <message>
+ <source>Help</source>
+ <translation type="vanished">帮助</translation>
+ </message>
+ <message>
+ <source>Special Edit</source>
+ <translation type="vanished">特殊编辑操作</translation>
+ </message>
+ <message>
+ <source>Import key from...</source>
+ <translation type="vanished">从...导入密钥</translation>
+ </message>
+ <message>
+ <source>Ready</source>
+ <translation type="vanished">准备好</translation>
+ </message>
+ <message>
+ <source>Key ToolBox</source>
+ <translation type="vanished">密钥工具箱</translation>
+ </message>
+ <message>
+ <source>Favourite</source>
+ <translation type="vanished">最喜欢的</translation>
+ </message>
+ <message>
+ <source>No Key Checked. Do you want to encrypt with a symmetric cipher using a passphrase?</source>
+ <translation type="vanished">未选中任何密钥。您想使用密码对文字进行对称加密吗?</translation>
+ </message>
+ <message>
+ <source>The selected key contains a key that does not actually have a encrypt usage.</source>
+ <translation type="vanished">所选密钥包含一个实际上没有加密用途的密钥。</translation>
+ </message>
+ <message>
+ <source>The selected key contains a key that does not actually have a signature usage.</source>
+ <translation type="vanished">所选密钥包含一个实际上没有签名用法的密钥。</translation>
+ </message>
+ <message>
+ <source>Notice</source>
+ <translation type="vanished">注意</translation>
+ </message>
+ <message>
+ <source>Short Crypto Text only supports Decrypt &amp; Verify.</source>
+ <translation type="vanished">短加密文本仅支持解密和验证。</translation>
+ </message>
+ <message>
+ <source>Please check some key in the key toolbox on the right.</source>
+ <translation type="vanished">请检查右侧密钥工具箱中的一些密钥。</translation>
+ </message>
+ <message>
+ <source>Key Export Operation Failed.</source>
+ <translation type="vanished">密钥导出操作失败。</translation>
+ </message>
+ <message>
+ <source>GpgFrontend Upgradeable (New Version: %1).</source>
+ <translation type="vanished">GpgFrontend 可升级(新版本:%1)。</translation>
+ </message>
+ <message>
+ <source>Withdrawn Version</source>
+ <translation type="vanished">被召回的版本</translation>
+ </message>
+ <message>
+ <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="vanished">由于严重问题,此版本(%1) 可能已被开发人员召回。请立即停止使用此版本并使用最新的稳定版。</translation>
+ </message>
+ <message>
+ <source>You can download the latest stable version(%1) on Github Releases Page.&lt;br/&gt;</source>
+ <translation type="vanished">您可以在 Github Releases Page 上下载最新的稳定版 (%1)。&lt;br/&gt;</translation>
+ </message>
+ <message>
+ <source>This maybe a BETA Version (Latest Stable Version: %1).</source>
+ <translation type="vanished">这可能是 BETA 版本(最新稳定版:%1)。</translation>
+ </message>
+ <message>
+ <source>Critical error occur while loading GpgFrontend.</source>
+ <translation type="vanished">加载 GpgFrontend 时发生严重错误。</translation>
+ </message>
+ <message>
+ <source>Loading Failed</source>
+ <translation type="vanished">加载失败</translation>
+ </message>
+ <message>
+ <source>Loading Gnupg Info...</source>
+ <translation type="vanished">正在加载 Gnupg 信息...</translation>
+ </message>
+ <message>
+ <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="vanished">如果此过程太慢,请在 gnupg 配置文件中适当设置密钥服务器地址(取决于您所在国家或地区的网络情况)。</translation>
+ </message>
+ <message>
+ <source>could not read properly from configure file</source>
+ <translation type="vanished">无法从配置文件中正确读取</translation>
+ </message>
+ <message>
+ <source>Import from keyserver</source>
+ <translation type="vanished">从密钥服务器导入</translation>
+ </message>
+ <message>
+ <source>Key not present with id 0x</source>
+ <translation type="vanished">不存在 ID 为 0x 的密钥</translation>
+ </message>
+ <message>
+ <source>:</source>
+ <translation type="vanished">:</translation>
+ </message>
+ <message>
+ <source>Key not present in key list</source>
+ <translation type="vanished">密钥不在密钥列表中</translation>
+ </message>
+ <message>
+ <source>A Signature</source>
+ <translation type="vanished">一个签名</translation>
+ </message>
+ <message>
+ <source>Key Information is NOT Available</source>
+ <translation type="vanished">密钥信息不可用</translation>
+ </message>
+ <message>
+ <source>Cert Revoked</source>
+ <translation type="vanished">证书吊销</translation>
+ </message>
+ <message>
+ <source>Signature Expired</source>
+ <translation type="vanished">签名过期</translation>
+ </message>
+ <message>
+ <source>Key Expired</source>
+ <translation type="vanished">密钥过期</translation>
+ </message>
+ <message>
+ <source>General Error</source>
+ <translation type="vanished">一般错误</translation>
+ </message>
+ <message>
+ <source>Unknown Error </source>
+ <translation type="vanished">未知错误</translation>
+ </message>
+ <message>
+ <source>Signer Name</source>
+ <translation type="vanished">签名者姓名</translation>
+ </message>
+ <message>
+ <source>Signer Email</source>
+ <translation type="vanished">签名者电子邮件</translation>
+ </message>
+ <message>
+ <source>Key&apos;s Fingerprint</source>
+ <translation type="vanished">密钥的指纹</translation>
+ </message>
+ <message>
+ <source>Valid</source>
+ <translation type="vanished">有效的</translation>
+ </message>
+ <message>
+ <source>Flags</source>
+ <translation type="vanished">标志</translation>
+ </message>
+ <message>
+ <source>Fully Valid</source>
+ <translation type="vanished">完全有效</translation>
+ </message>
+ <message>
+ <source>NOT Fully Valid</source>
+ <translation type="vanished">不完全有效</translation>
+ </message>
+ <message>
+ <source>Good</source>
+ <translation type="vanished">正常</translation>
+ </message>
+ <message>
+ <source>Bad</source>
+ <translation type="vanished">异常</translation>
+ </message>
+ <message>
+ <source>Missing Key</source>
+ <translation type="vanished">缺少密钥</translation>
+ </message>
+ <message>
+ <source>Revoked Key</source>
+ <translation type="vanished">撤销密钥</translation>
+ </message>
+ <message>
+ <source>Expired Key</source>
+ <translation type="vanished">过期密钥</translation>
+ </message>
+ <message>
+ <source>Missing CRL</source>
+ <translation type="vanished">缺少 CRL</translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation type="vanished">清空面板</translation>
+ </message>
+ <message>
+ <source>Save Information Board&apos;s Content</source>
+ <translation type="vanished">保存信息面板的内容</translation>
+ </message>
+ <message>
+ <source>The file path is not exists, unprivileged or unreachable.</source>
+ <translation type="vanished">文件路径不存在、无特权或无法访问。</translation>
+ </message>
+ <message>
+ <source>Expires on</source>
+ <translation type="vanished">到期</translation>
+ </message>
+ <message>
+ <source>Last Update</source>
+ <translation type="vanished">最后更新</translation>
+ </message>
+ <message>
+ <source>Secret Key Existence</source>
+ <translation type="vanished">秘钥存在</translation>
+ </message>
+ <message>
+ <source>Refresh</source>
+ <translation type="vanished">刷新</translation>
+ </message>
+ <message>
+ <source>Refresh the key list to synchronize changes.</source>
+ <translation type="vanished">刷新密钥列表以同步更改。</translation>
+ </message>
+ <message>
+ <source>Sync Public Key</source>
+ <translation type="vanished">同步公钥</translation>
+ </message>
+ <message>
+ <source>Sync public key with your default keyserver.</source>
+ <translation type="vanished">将公钥与您的默认密钥服务器同步。</translation>
+ </message>
+ <message>
+ <source>Uncheck ALL</source>
+ <translation type="vanished">全不选</translation>
+ </message>
+ <message>
+ <source>Cancel all checked items in the current tab at once.</source>
+ <translation type="vanished">一次性取消选中当前选项卡中所有的项目。</translation>
+ </message>
+ <message>
+ <source>Check ALL</source>
+ <translation type="vanished">全选</translation>
+ </message>
+ <message>
+ <source>Check all items in the current tab at once</source>
+ <translation type="vanished">一次性选中当前选项卡中的所有项目</translation>
+ </message>
+ <message>
+ <source>Search for keys...</source>
+ <translation type="vanished">搜索钥匙...</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation type="vanished">类型</translation>
+ </message>
+ <message>
+ <source>Trust</source>
+ <translation type="vanished">信任</translation>
+ </message>
+ <message>
+ <source>Finger Print</source>
+ <translation type="vanished">指纹</translation>
+ </message>
+ <message>
+ <source>Refreshing Key List...</source>
+ <translation type="vanished">正在刷新密钥列表...</translation>
+ </message>
+ <message>
+ <source>Import Keys</source>
+ <translation type="vanished">导入密钥</translation>
+ </message>
+ <message>
+ <source>You&apos;ve dropped something on the table.</source>
+ <translation type="vanished">你把东西掉在桌子上了。</translation>
+ </message>
+ <message>
+ <source>GpgFrontend will now try to import key(s).</source>
+ <translation type="vanished">GpgFrontend 现在将尝试导入密钥。</translation>
+ </message>
+ <message>
+ <source>Always import without bothering.</source>
+ <translation type="vanished">始终导入而无需打扰。</translation>
+ </message>
+ <message>
+ <source>Key List Refreshed.</source>
+ <translation type="vanished">密钥列表已刷新。</translation>
+ </message>
+ <message>
+ <source>Syncing Key List...</source>
+ <translation type="vanished">正在同步密钥列表...</translation>
+ </message>
+ <message>
+ <source>Sync [%1/%2] %3 %4</source>
+ <translation type="vanished">同步 [%1/%2] %3 %4</translation>
+ </message>
+ <message>
+ <source>Key List Sync Done.</source>
+ <translation type="vanished">密钥列表同步完成。</translation>
+ </message>
+ <message>
+ <source>0 character</source>
+ <translation type="vanished">0 个字符</translation>
+ </message>
+ <message>
+ <source>lf</source>
+ <translation type="vanished">如果</translation>
+ </message>
+ <message>
+ <source>utf-8</source>
+ <translation type="vanished">UTF-8</translation>
+ </message>
+ <message>
+ <source>%1 character(s)</source>
+ <translation type="vanished">%1 个字符</translation>
+ </message>
+ <message>
+ <source>Loading...</source>
+ <translation type="vanished">正在加载...</translation>
+ </message>
+ <message>
+ <source>UTF-8</source>
+ <translation type="vanished">UTF-8</translation>
+ </message>
+ <message>
+ <source>%1 byte(s)</source>
+ <translation type="vanished">%1 字节</translation>
+ </message>
+ <message>
+ <source>binary</source>
+ <translation type="vanished">二进制</translation>
+ </message>
+ <message>
+ <source>untitled</source>
+ <translation type="vanished">无标题</translation>
+ </message>
+ <message>
+ <source>Cannot read file %1:
+%2.</source>
+ <translation type="vanished">无法读取文件 %1:
+%2。</translation>
+ </message>
+ <message>
+ <source>Open file</source>
+ <translation type="vanished">打开文件</translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation type="vanished">保存</translation>
+ </message>
+ <message>
+ <source>After saving, the encoding of the current file will be converted to UTF-8 and the line endings will be changed to LF. </source>
+ <translation type="vanished">保存后,当前文件的编码将转换为UTF-8,行尾将更改为LF。</translation>
+ </message>
+ <message>
+ <source>If this is not the result you expect, please use &quot;save as&quot;.</source>
+ <translation type="vanished">如果您不希望这样,请使用“另存为”。</translation>
+ </message>
+ <message>
+ <source>Save file</source>
+ <translation type="vanished">保存存档</translation>
+ </message>
+ <message>
+ <source>Unsaved document</source>
+ <translation type="vanished">未保存的文件</translation>
+ </message>
+ <message>
+ <source>The document &quot;%1&quot; has been modified. Do you want to save your changes?</source>
+ <translation type="vanished">文档“%1”已被修改。是否要保存更改?</translation>
+ </message>
+ <message>
+ <source>Note:</source>
+ <translation type="vanished">笔记:</translation>
+ </message>
+ <message>
+ <source>The path is not exists, unprivileged or unreachable.</source>
+ <translation type="vanished">该路径不存在、没有特权或无法访问。</translation>
+ </message>
+ <message>
+ <source>Rename</source>
+ <translation type="vanished">改名</translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation type="vanished">删除</translation>
+ </message>
+ <message>
+ <source>Calculate Hash</source>
+ <translation type="vanished">计算哈希值</translation>
+ </message>
+ <message>
+ <source>Directory</source>
+ <translation type="vanished">目录</translation>
+ </message>
+ <message>
+ <source>Compress...</source>
+ <translation type="vanished">压缩...</translation>
+ </message>
+ <message>
+ <source>Open with Default System Application</source>
+ <translation type="vanished">使用默认系统应用程序打开</translation>
+ </message>
+ <message>
+ <source>Show Hidden File</source>
+ <translation type="vanished">显示隐藏文件</translation>
+ </message>
+ <message>
+ <source>Show System File</source>
+ <translation type="vanished">显示系统文件</translation>
+ </message>
+ <message>
+ <source>The directory is unprivileged or unreachable.</source>
+ <translation type="vanished">该目录不存在,或者您的权限不足。</translation>
+ </message>
+ <message>
+ <source>The file is unprivileged or unreachable.</source>
+ <translation type="vanished">该目录不存在,或者您的权限不足。</translation>
+ </message>
+ <message>
+ <source>New Filename</source>
+ <translation type="vanished">新文件名</translation>
+ </message>
+ <message>
+ <source>Unable to rename the file or folder.</source>
+ <translation type="vanished">无法重命名文件或文件夹。</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to delete it?</source>
+ <translation type="vanished">你确定要删除吗?</translation>
+ </message>
+ <message>
+ <source>Unable to delete the file or folder.</source>
+ <translation type="vanished">无法删除文件或文件夹。</translation>
+ </message>
+ <message>
+ <source>Make New Directory</source>
+ <translation type="vanished">新建目录</translation>
+ </message>
+ <message>
+ <source>Directory Name</source>
+ <translation type="vanished">目录名称</translation>
+ </message>
+ <message>
+ <source>Create Empty File</source>
+ <translation type="vanished">创建空文件</translation>
+ </message>
+ <message>
+ <source>Filename (you can given extension)</source>
+ <translation type="vanished">文件名(您可以指定扩展名)</translation>
+ </message>
+ <message>
+ <source>Unable to create the file.</source>
+ <translation type="vanished">无法创建文件。</translation>
+ </message>
+ <message>
+ <source>Show Verify Details</source>
+ <translation type="vanished">显示验证详细信息</translation>
+ </message>
+ <message>
+ <source>Public key not found locally</source>
+ <translation type="vanished">本地未找到公钥</translation>
+ </message>
+ <message>
+ <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="vanished">本地没有目标公钥内容供 GpgFrontend 收集有关此签名的足够信息。现在要从密钥服务器导入公钥吗?</translation>
+ </message>
+ <message>
+ <source>GnuPG Context Loading Failed</source>
+ <translation type="vanished">GnuPG 上下文加载失败</translation>
+ </message>
+ <message>
+ <source>Gnupg(gpg) is not installed correctly, please follow &lt;a href=&apos;https://www.gpgfrontend.bktus.com/#/faq?id=how-to-deal-with-39env-loading-failed39&apos;&gt;this notes&lt;/a&gt; in FAQ to install Gnupg and then open GpgFrontend. Or, you can open GnuPG Controller to set a custom GnuPG which GpgFrontend should use. Then, GpgFrontend will restart.</source>
+ <translation type="vanished">Gnupg(gpg) 未正确安装,请按照常见问题解答中的&lt;a href=&apos;https://www.gpgfrontend.bktus.com/#/faq?id=how-to-deal-with-39env-loading-failed39&apos;&gt;说明&lt;/a&gt;安装 Gnupg,然后打开 GpgFrontend。或者,您可以打开 GnuPG 控制器来设置 GpgFrontend 应使用的自定义 GnuPG。然后,GpgFrontend 将重新启动。</translation>
+ </message>
+ <message>
+ <source>Open Key</source>
+ <translation type="vanished">打开密钥</translation>
+ </message>
+ <message>
+ <source>Keyring files</source>
+ <translation type="vanished">密钥圈文件</translation>
+ </message>
+ <message>
+ <source>File Open Failed</source>
+ <translation type="vanished">文件打开失败</translation>
+ </message>
+ <message>
+ <source>Failed to open file: </source>
+ <translation type="vanished">打开文件失败:</translation>
+ </message>
+ <message>
+ <source>Processing</source>
+ <translation type="vanished">处理中</translation>
+ </message>
+ <message>
+ <source>Failed to execute command.</source>
+ <translation type="vanished">无法执行命令。</translation>
+ </message>
+ <message>
+ <source>Succeed in executing command.</source>
+ <translation type="vanished">成功执行命令。</translation>
+ </message>
+ <message>
+ <source>Finished executing command.</source>
+ <translation type="vanished">命令执行完毕。</translation>
+ </message>
+ <message>
+ <source>The key has been updated</source>
+ <translation type="vanished">密钥已更新</translation>
+ </message>
+ <message>
+ <source>No need to update the key</source>
+ <translation type="vanished">无需更新密钥</translation>
+ </message>
+ <message>
+ <source>Password Input Dialog</source>
+ <translation type="vanished">密码输入对话框</translation>
+ </message>
+ <message>
+ <source>Please Input The Password</source>
+ <translation type="vanished">请输入密码</translation>
+ </message>
+ <message>
+ <source>Standard Exception Thrown</source>
+ <translation type="vanished">小意外</translation>
+ </message>
+ <message>
+ <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="vanished">糟糕,在程序运行期间遇到了一个小异常。这不是一个严重的问题,应该是由程序员的疏忽导致的,如果可以的话,请报告这个问题。</translation>
+ </message>
+ <message>
+ <source>Unhandled Exception Thrown</source>
+ <translation type="vanished">未处理的异常</translation>
+ </message>
+ <message>
+ <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="vanished">糟糕,在程序运行期间引发了未处理的异常。这不是一个严重的问题,可能是程序员的疏忽,如果可以的话,请报告这个问题。</translation>
+ </message>
+ <message>
+ <source>Embedded In</source>
+ <translation type="vanished">嵌入</translation>
+ </message>
+ <message>
+ <source>Decrypt Operation</source>
+ <translation type="vanished">解密操作</translation>
+ </message>
+ <message>
+ <source>Unsupported Algo</source>
+ <translation type="vanished">不支持的算法</translation>
+ </message>
+ <message>
+ <source>File Name</source>
+ <translation type="vanished">文档名称</translation>
+ </message>
+ <message>
+ <source>MIME</source>
+ <translation type="vanished">MIME</translation>
+ </message>
+ <message>
+ <source>Recipient(s)</source>
+ <translation type="vanished">收件人</translation>
+ </message>
+ <message>
+ <source>Recipient</source>
+ <translation type="vanished">接受者</translation>
+ </message>
+ <message>
+ <source>Public Key Algo</source>
+ <translation type="vanished">公钥算法</translation>
+ </message>
+ <message>
+ <source>Sign Operation</source>
+ <translation type="vanished">签名操作</translation>
+ </message>
+ <message>
+ <source>Sign Mode</source>
+ <translation type="vanished">签名模式</translation>
+ </message>
+ <message>
+ <source>Normal</source>
+ <translation type="vanished">标准</translation>
+ </message>
+ <message>
+ <source>Detach</source>
+ <translation type="vanished">分离</translation>
+ </message>
+ <message>
+ <source>Signer</source>
+ <translation type="vanished">签名者</translation>
+ </message>
+ <message>
+ <source>Hash Algo</source>
+ <translation type="vanished">哈希算法</translation>
+ </message>
+ <message>
+ <source>Date</source>
+ <translation type="vanished">日期</translation>
+ </message>
+ <message>
+ <source>UTC</source>
+ <translation type="vanished">世界标准时间</translation>
+ </message>
+ <message>
+ <source>Invalid Signers</source>
+ <translation type="vanished">无效签名者</translation>
+ </message>
+ <message>
+ <source>Reason</source>
+ <translation type="vanished">原因</translation>
+ </message>
+ <message>
+ <source>Encrypt Operation</source>
+ <translation type="vanished">加密操作</translation>
+ </message>
+ <message>
+ <source>Invalid Recipients</source>
+ <translation type="vanished">无效的收件人</translation>
+ </message>
+ <message>
+ <source>Verify Operation</source>
+ <translation type="vanished">验证操作</translation>
+ </message>
+ <message>
+ <source>Signed On</source>
+ <translation type="vanished">已签名</translation>
+ </message>
+ <message>
+ <source>Signatures List</source>
+ <translation type="vanished">签名列表</translation>
+ </message>
+ <message>
+ <source>Signature [%1]:</source>
+ <translation type="vanished">签名 [%1]:</translation>
+ </message>
+ <message>
+ <source>A Bad Signature.</source>
+ <translation type="vanished">一个错误的签名。</translation>
+ </message>
+ <message>
+ <source>This Signature is invalid.</source>
+ <translation type="vanished">此签名无效。</translation>
+ </message>
+ <message>
+ <source>A</source>
+ <translation type="vanished">一种</translation>
+ </message>
+ <message>
+ <source>Missing Key&apos;s</source>
+ <translation type="vanished">密钥缺失</translation>
+ </message>
+ <message>
+ <source>Revoked Key&apos;s</source>
+ <translation type="vanished">撤销的密钥</translation>
+ </message>
+ <message>
+ <source>Expired Key&apos;s</source>
+ <translation type="vanished">过期的密钥</translation>
+ </message>
+ <message>
+ <source>Missing CRL&apos;s</source>
+ <translation type="vanished">CRL缺失</translation>
+ </message>
+ <message>
+ <source>Signature Fully Valid.</source>
+ <translation type="vanished">签名完全有效。</translation>
+ </message>
+ <message>
+ <source>Signature Not Fully Valid.</source>
+ <translation type="vanished">签名不完全有效。</translation>
+ </message>
+ <message>
+ <source>(May used a subkey to sign)</source>
+ <translation type="vanished">(可以使用子密钥签名)</translation>
+ </message>
+ <message>
+ <source>Key is NOT present with ID 0x</source>
+ <translation type="vanished">密钥不存在,ID 为 0x</translation>
+ </message>
+ <message>
+ <source>A signature could NOT be verified due to a Missing Key</source>
+ <translation type="vanished">由于缺少密钥,无法验证签名</translation>
+ </message>
+ <message>
+ <source>A signature is valid but the key used to verify the signature has been revoked</source>
+ <translation type="vanished">签名有效,但用于验证签名的密钥已被撤销</translation>
+ </message>
+ <message>
+ <source>A signature is valid but expired</source>
+ <translation type="vanished">签名有效但已过期</translation>
+ </message>
+ <message>
+ <source>A signature is valid but the key used to verify the signature has expired.</source>
+ <translation type="vanished">签名有效,但用于验证签名的密钥已过期。</translation>
+ </message>
+ <message>
+ <source>There was some other error which prevented the signature verification.</source>
+ <translation type="vanished">还有一些其他错误阻止了签名验证。</translation>
+ </message>
+ <message>
+ <source>Error for key with fingerprint</source>
+ <translation type="vanished">带指纹的密钥错误</translation>
+ </message>
+ <message>
+ <source>Could not find information that can be used for verification.</source>
+ <translation type="vanished">找不到可用于验证的信息。</translation>
+ </message>
+ <message>
+ <source>Signed By</source>
+ <translation type="vanished">被...签名</translation>
+ </message>
+ <message>
+ <source>File Hash Information</source>
+ <translation type="vanished">文件哈希信息</translation>
+ </message>
+ <message>
+ <source>filename</source>
+ <translation type="vanished">文档名称</translation>
+ </message>
+ <message>
+ <source>file size(bytes)</source>
+ <translation type="vanished">文件大小(字节)</translation>
+ </message>
+ <message>
+ <source>Error in Calculating File Hash </source>
+ <translation type="vanished">计算文件哈希时出错</translation>
+ </message>
+ <message>
+ <source>A serious error has occurred</source>
+ <translation type="vanished">发生了严重错误</translation>
+ </message>
+ <message>
+ <source>Oh no! GpgFrontend caught a serious error in the software, so it needs to be restarted. If the problem recurs, please manually terminate the program and report the problem to the developer.</source>
+ <translation type="vanished">不好了! GpgFrontend 在软件中发现了严重错误,因此需要重新启动。如果问题再次出现,请手动终止程序并将问题报告给开发人员。</translation>
+ </message>
+ <message>
+ <source>Validity</source>
+ <translation type="vanished">有效性</translation>
+ </message>
+ <message>
+ <source>ENV Loading Failed</source>
+ <translation type="vanished">ENV加载失败</translation>
+ </message>
+ <message>
+ <source>and GPGME</source>
+ <translation type="vanished">和GPGME</translation>
+ </message>
+ <message>
+ <source>Path</source>
+ <translation type="vanished">小路</translation>
+ </message>
+ <message>
+ <source>Generate</source>
+ <translation type="vanished">生成密钥</translation>
+ </message>
+ <message>
+ <source>Generate A New Keypair or Subkey</source>
+ <translation type="vanished">生成新的密钥对或子密钥</translation>
+ </message>
+ <message>
+ <source>Source: </source>
+ <translation type="vanished">来源:</translation>
+ </message>
+ <message>
+ <source>Description: </source>
+ <translation type="vanished">描述:</translation>
+ </message>
+ <message>
+ <source>Predict</source>
+ <translation type="vanished">预测</translation>
+ </message>
+ <message>
+ <source>Called</source>
+ <translation type="vanished">被调用</translation>
+ </message>
+ <message>
+ <source>log file path</source>
+ <translation type="vanished">日志文件路径</translation>
+ </message>
+ <message>
+ <source>Setting Operation Error</source>
+ <translation type="vanished">设置操作错误</translation>
+ </message>
+ <message>
+ <source>use_custom_key_database_path</source>
+ <translation type="vanished">使用_custom_key_database_path</translation>
+ </message>
+ <message>
+ <source>custom_key_database_path</source>
+ <translation type="vanished">自定义密钥数据库路径</translation>
+ </message>
+ <message>
+ <source>operator not support</source>
+ <translation type="vanished">操作不支持</translation>
+ </message>
+ <message>
+ <source>Updated ui configuration successfully written to</source>
+ <translation type="vanished">更新的 ui 配置成功写入</translation>
+ </message>
+ <message>
+ <source>I/O error while writing ui configuration file</source>
+ <translation type="vanished">写入 ui 配置文件时出现 I/O 错误</translation>
+ </message>
+ <message>
+ <source>App Path</source>
+ <translation type="vanished">应用路径</translation>
+ </message>
+ <message>
+ <source>App Configure Path</source>
+ <translation type="vanished">应用配置路径</translation>
+ </message>
+ <message>
+ <source>App Data Path</source>
+ <translation type="vanished">应用数据路径</translation>
+ </message>
+ <message>
+ <source>App Log Path</source>
+ <translation type="vanished">应用日志路径</translation>
+ </message>
+ <message>
+ <source>App Locale Path</source>
+ <translation type="vanished">应用语言文件路径</translation>
+ </message>
+ <message>
+ <source>App Conf Path</source>
+ <translation type="vanished">应用配置路径</translation>
+ </message>
+ <message>
+ <source>UserInterface configuration successfully written to</source>
+ <translation type="vanished">用户界面配置成功导出至</translation>
+ </message>
+ <message>
+ <source>I/O error while writing UserInterface configuration file</source>
+ <translation type="vanished">导出用户界面配置文件时出现 I/O 错误</translation>
+ </message>
+ <message>
+ <source>UserInterface configuration successfully read from</source>
+ <translation type="vanished">用户界面配置读取成功</translation>
+ </message>
+ <message>
+ <source>I/O error while reading UserInterface configure file</source>
+ <translation type="vanished">读取用户界面配置文件时出现 I/O 错误</translation>
+ </message>
+ <message>
+ <source>Parse error at </source>
+ <translation type="vanished">解析错误在</translation>
+ </message>
+ <message>
+ <source>started</source>
+ <translation type="vanished">开始</translation>
+ </message>
+ <message>
+ <source>Start Sign Result Analyse</source>
+ <translation type="vanished">开始签名结果分析</translation>
+ </message>
+ <message>
+ <source>Sign Result Analyse Getting Result</source>
+ <translation type="vanished">签名结果分析得到结果</translation>
+ </message>
+ <message>
+ <source>Signers Fingerprint</source>
+ <translation type="vanished">签名者指纹</translation>
+ </message>
+ <message>
+ <source>Sign Result Analyse Getting Invalid Signer</source>
+ <translation type="vanished">签名结果分析失败:无效签名者</translation>
+ </message>
+ <message>
+ <source>Start Encrypt Result Analyse</source>
+ <translation type="vanished">开始加密结果分析</translation>
+ </message>
+ <message>
+ <source>Failed to read app secure key file</source>
+ <translation type="vanished">读取应用安全密钥文件失败</translation>
+ </message>
+ <message>
+ <source>Saving data object</source>
+ <translation type="vanished">保存数据对象</translation>
+ </message>
+ <message>
+ <source>Get data object</source>
+ <translation type="vanished">获取数据对象</translation>
+ </message>
+ <message>
+ <source>Data object not found</source>
+ <translation type="vanished">未找到数据对象</translation>
+ </message>
+ <message>
+ <source>Failed to read data object</source>
+ <translation type="vanished">读取数据对象失败</translation>
+ </message>
+ <message>
+ <source>Data object found</source>
+ <translation type="vanished">找到数据对象</translation>
+ </message>
+ <message>
+ <source>Decrypting data object</source>
+ <translation type="vanished">正在解密数据对象</translation>
+ </message>
+ <message>
+ <source>Data object decoded</source>
+ <translation type="vanished">数据对象解码成功</translation>
+ </message>
+ <message>
+ <source>Failed to get data object</source>
+ <translation type="vanished">获取数据对象失败</translation>
+ </message>
+ <message>
+ <source>stegano_checked</source>
+ <translation type="vanished">stegano_checked</translation>
+ </message>
+ <message>
+ <source>auto_pubkey_exchange_checked</source>
+ <translation type="vanished">auto_pubkey_exchange_checked</translation>
+ </message>
+ <message>
+ <source>proxy_host</source>
+ <translation type="vanished">代理主机</translation>
+ </message>
+ <message>
+ <source>username</source>
+ <translation type="vanished">用户名</translation>
+ </message>
+ <message>
+ <source>password</source>
+ <translation type="vanished">密码</translation>
+ </message>
+ <message>
+ <source>port</source>
+ <translation type="vanished">端口</translation>
+ </message>
+ <message>
+ <source>proxy_type</source>
+ <translation type="vanished">代理类型</translation>
+ </message>
+ <message>
+ <source>proxy_enable</source>
+ <translation type="vanished">代理启用</translation>
+ </message>
+ <message>
+ <source>forbid_all_connection</source>
+ <translation type="vanished">禁止所有连接</translation>
+ </message>
+ <message>
+ <source>prohibit_update_checking</source>
+ <translation type="vanished">禁止更新检查</translation>
+ </message>
+ <message>
+ <source>Save Checked Keys</source>
+ <translation type="vanished">保存检查的密钥</translation>
+ </message>
+ <message>
+ <source>Unlock key expiration date setting up to 30 years.</source>
+ <translation type="vanished">解锁长达 30 年的密钥有效期。</translation>
+ </message>
+ <message>
+ <source>Confirm drag&apos;n&apos;drop key import</source>
+ <translation type="vanished">确认拖放密钥对导入</translation>
+ </message>
+ <message>
+ <source>ASCII encoding is not used when file encrypting and signing.</source>
+ <translation type="vanished">文件加密和签名时不使用 ASCII 编码。</translation>
+ </message>
+ <message>
+ <source>save_key_checked</source>
+ <translation type="vanished">save_key_checked</translation>
+ </message>
+ <message>
+ <source>longer_expiration_date</source>
+ <translation type="vanished">long_expiration_date</translation>
+ </message>
+ <message>
+ <source>lang</source>
+ <translation type="vanished">语言</translation>
+ </message>
+ <message>
+ <source>confirm_import_keys</source>
+ <translation type="vanished">Confirm_import_keys</translation>
+ </message>
+ <message>
+ <source>non_ascii_when_export</source>
+ <translation type="vanished">non_ascii_when_export</translation>
+ </message>
+ <message>
+ <source>try to get latest version</source>
+ <translation type="vanished">尝试获取最新版本</translation>
+ </message>
+ <message>
+ <source>called</source>
+ <translation type="vanished">叫</translation>
+ </message>
+ <message>
+ <source>Set target Key Server to default Key Server</source>
+ <translation type="vanished">将目标密钥服务器设置为默认密钥服务器</translation>
+ </message>
+ <message>
+ <source>Couldn&apos;t Open File</source>
+ <translation type="vanished">无法打开文件</translation>
+ </message>
+ <message>
+ <source>settings restored</source>
+ <translation type="vanished">设置已恢复</translation>
+ </message>
+ <message>
+ <source>GpgME Version</source>
+ <translation type="vanished">GpgME 版本</translation>
+ </message>
+ <message>
+ <source>PATHs</source>
+ <translation type="vanished">路径</translation>
+ </message>
+ <message>
+ <source>GpgConf</source>
+ <translation type="vanished">GpgConf</translation>
+ </message>
+ <message>
+ <source>CMS</source>
+ <translation type="vanished">内容管理系统</translation>
+ </message>
+ <message>
+ <source>About Software</source>
+ <translation type="vanished">关于此软件</translation>
+ </message>
+ <message>
+ <source>exportKeyPackageDialog</source>
+ <translation type="vanished">导出密钥包对话框</translation>
+ </message>
+ <message>
+ <source>Current Row</source>
+ <translation type="vanished">当前行</translation>
+ </message>
+ <message>
+ <source>Public key Not Found</source>
+ <translation type="vanished">未找到公钥</translation>
+ </message>
+ <message>
+ <source>icon_size</source>
+ <translation type="vanished">图标大小</translation>
+ </message>
+ <message>
+ <source>icon_style</source>
+ <translation type="vanished">图标样式</translation>
+ </message>
+ <message>
+ <source>Failed to read root certificate file</source>
+ <translation type="vanished">读取根证书文件失败</translation>
+ </message>
+ <message>
+ <source>Send Encrypted Mail</source>
+ <translation type="vanished">发送加密邮件</translation>
+ </message>
+ <message>
+ <source>Function Disabled</source>
+ <translation type="vanished">功能禁用</translation>
+ </message>
+ <message>
+ <source>Please go to the settings interface to enable and configure this function.</source>
+ <translation type="vanished">请到设置界面启用和配置此功能。</translation>
+ </message>
+ <message>
+ <source>Select Recipient(s)</source>
+ <translation type="vanished">选择收件人</translation>
+ </message>
+ <message>
+ <source>We use the public key provided by the recipient to encrypt the text.</source>
+ <translation type="vanished">我们使用收件人提供的公钥来加密文本。</translation>
+ </message>
+ <message>
+ <source>If you want to send to multiple recipients at the same time, you can select multiple keys.</source>
+ <translation type="vanished">如果您想同时发送给多个收件人,您可以选择多个密钥。</translation>
+ </message>
+ <message>
+ <source>Email List:</source>
+ <translation type="vanished">电子邮件列表:</translation>
+ </message>
+ <message>
+ <source>Tips: You can double-click the email address in the edit list, or click the email to pop up the option menu.</source>
+ <translation type="vanished">提示:您可以双击编辑列表中的邮箱地址,或点击邮箱弹出选项菜单。</translation>
+ </message>
+ <message>
+ <source>Add An Email Address</source>
+ <translation type="vanished">添加电子邮件地址</translation>
+ </message>
+ <message>
+ <source>Email List Editor</source>
+ <translation type="vanished">电子邮件列表编辑器</translation>
+ </message>
+ <message>
+ <source>Sender</source>
+ <translation type="vanished">发件人</translation>
+ </message>
+ <message>
+ <source>Select Sender</source>
+ <translation type="vanished">选择发件人</translation>
+ </message>
+ <message>
+ <source>As the sender of the mail, the private key is generally used.</source>
+ <translation type="vanished">作为邮件的发件人,一般使用私钥。</translation>
+ </message>
+ <message>
+ <source> The private key is generally used as a signature for the content of the mail.</source>
+ <translation type="vanished"> 私钥通常用作邮件内容的签名。</translation>
+ </message>
+ <message>
+ <source>The SMTP address is empty, please go to the setting interface to complete the configuration.</source>
+ <translation type="vanished">SMTP 地址为空,请进入设置界面完成配置。</translation>
+ </message>
+ <message>
+ <source>CC</source>
+ <translation type="vanished">抄送</translation>
+ </message>
+ <message>
+ <source>BCC</source>
+ <translation type="vanished">密件抄送</translation>
+ </message>
+ <message>
+ <source>Mail Subject</source>
+ <translation type="vanished">邮件主题</translation>
+ </message>
+ <message>
+ <source>Tips: You can fill in multiple email addresses, please separate them with &quot;;&quot;.</source>
+ <translation type="vanished">温馨提示:您可以填写多个邮箱,请用“;”隔开。</translation>
+ </message>
+ <message>
+ <source>Send Message</source>
+ <translation type="vanished">发信息</translation>
+ </message>
+ <message>
+ <source>Select Sender GPG Key</source>
+ <translation type="vanished">选择发件人 GPG 密钥</translation>
+ </message>
+ <message>
+ <source>Select Recipient(s) GPG Key</source>
+ <translation type="vanished">选择收件人 GPG 密钥</translation>
+ </message>
+ <message>
+ <source>GPG Operations</source>
+ <translation type="vanished">GPG 运营</translation>
+ </message>
+ <message>
+ <source>Attach signature</source>
+ <translation type="vanished">附上签名</translation>
+ </message>
+ <message>
+ <source>Attach sender&apos;s public key</source>
+ <translation type="vanished">附上发件人的公钥</translation>
+ </message>
+ <message>
+ <source>Encrypt content</source>
+ <translation type="vanished">加密内容</translation>
+ </message>
+ <message>
+ <source>Edit Recipients(s)</source>
+ <translation type="vanished">编辑收件人</translation>
+ </message>
+ <message>
+ <source>Edit CC(s)</source>
+ <translation type="vanished">编辑抄送</translation>
+ </message>
+ <message>
+ <source>Edit BCC(s)</source>
+ <translation type="vanished">编辑密件抄送</translation>
+ </message>
+ <message>
+ <source>Sender GPG Key: </source>
+ <translation type="vanished">发件人 GPG 密钥:</translation>
+ </message>
+ <message>
+ <source>Recipient(s) GPG Key: </source>
+ <translation type="vanished">收件人 GPG 密钥:</translation>
+ </message>
+ <message>
+ <source>New Message</source>
+ <translation type="vanished">新消息</translation>
+ </message>
+ <message>
+ <source>Recipient cannot be empty</source>
+ <translation type="vanished">收件人不能为空</translation>
+ </message>
+ <message>
+ <source>One or more recipient&apos;s email is invalid</source>
+ <translation type="vanished">一个或多个收件人的电子邮件无效</translation>
+ </message>
+ <message>
+ <source>Sender cannot be empty</source>
+ <translation type="vanished">发件人不能为空</translation>
+ </message>
+ <message>
+ <source>Sender&apos;s email is invalid</source>
+ <translation type="vanished">发件人的电子邮件无效</translation>
+ </message>
+ <message>
+ <source>Subject cannot be empty</source>
+ <translation type="vanished">主题不能为空</translation>
+ </message>
+ <message>
+ <source>One or more cc email is invalid</source>
+ <translation type="vanished">一封或多封抄送电子邮件无效</translation>
+ </message>
+ <message>
+ <source>One or more bcc email is invalid</source>
+ <translation type="vanished">一封或多封密件抄送电子邮件无效</translation>
+ </message>
+ <message>
+ <source>You have checked the encrypted email content, but you have not selected the recipient&apos;s GPG key. This is dangerous and the mail will not be encrypted. So the send operation is forbidden</source>
+ <translation type="vanished">您已检查加密的电子邮件内容,但尚未选择收件人的 GPG 密钥。这是危险的,邮件不会被加密。所以禁止发送操作</translation>
+ </message>
+ <message>
+ <source>You checked the option to attach signature to the email, but did not specify the sender&apos;s GPG Key. This will cause the content of the email to be inconsistent with your expectations, so the operation is prohibited.</source>
+ <translation type="vanished">您选中了将签名附加到电子邮件的选项,但没有指定发件人的 GPG 密钥。这会导致邮件内容与您的预期不一致,因此禁止操作。</translation>
+ </message>
+ <message>
+ <source>You checked the option to attach your public key to the email, but did not specify the sender&apos;s GPG Key. This will cause the content of the email to be inconsistent with your expectations, so the operation is prohibited.</source>
+ <translation type="vanished">您选中了将您的公钥附加到电子邮件的选项,但没有指定发件人的 GPG 密钥。这会导致邮件内容与您的预期不一致,因此禁止操作。</translation>
+ </message>
+ <message>
+ <source>Sending Email...</source>
+ <translation type="vanished">正在发送电子邮件...</translation>
+ </message>
+ <message>
+ <source>If the process does not end for a long time, please check again whether your SMTP server configuration is correct.</source>
+ <translation type="vanished">如果该过程长时间没有结束,请再次检查您的 SMTP 服务器配置是否正确。</translation>
+ </message>
+ <message>
+ <source>identity_enable</source>
+ <translation type="vanished">身份启用</translation>
+ </message>
+ <message>
+ <source>mail_address</source>
+ <translation type="vanished">邮件地址</translation>
+ </message>
+ <message>
+ <source>connection_type</source>
+ <translation type="vanished">连接类型</translation>
+ </message>
+ <message>
+ <source>default_sender</source>
+ <translation type="vanished">默认发送者</translation>
+ </message>
+ <message>
+ <source>default_sender_gpg_key_id</source>
+ <translation type="vanished">default_sender_gpg_key_id</translation>
+ </message>
+ <message>
+ <source>Fail</source>
+ <translation type="vanished">失败</translation>
+ </message>
+ <message>
+ <source>Fail to Connect SMTP Server.</source>
+ <translation type="vanished">无法连接 SMTP 服务器。</translation>
+ </message>
+ <message>
+ <source>Fail to Login.</source>
+ <translation type="vanished">登录失败。</translation>
+ </message>
+ <message>
+ <source>Succeed in connecting and login</source>
+ <translation type="vanished">连接和登录成功</translation>
+ </message>
+ <message>
+ <source>Succeed in sending the message to the SMTP Server</source>
+ <translation type="vanished">成功将邮件发送到 SMTP 服务器</translation>
+ </message>
+ <message>
+ <source>Encryption Error</source>
+ <translation type="vanished">加密错误</translation>
+ </message>
+ <message>
+ <source>An error occurred while encrypting the content of the email. This may be because you did not complete some operations during Gnupg encryption.</source>
+ <translation type="vanished">加密电子邮件内容时出错。这可能是因为您在 Gnupg 加密过程中没有完成某些操作。</translation>
+ </message>
+ <message>
+ <source>Unknown error.</source>
+ <translation type="vanished">未知错误。</translation>
+ </message>
+ <message>
+ <source>server_list</source>
+ <translation type="vanished">服务器列表</translation>
+ </message>
+ <message>
+ <source>default_server</source>
+ <translation type="vanished">默认服务器</translation>
+ </message>
+ <message>
+ <source>Automatic Key Exchange Warning</source>
+ <translation type="vanished">自动密钥交换警告</translation>
+ </message>
+ <message>
+ <source>Part of the automatic key exchange failed, which may be related to your key.</source>
+ <translation type="vanished">部分自动密钥交换失败,可能与您的密钥有关。</translation>
+ </message>
+ <message>
+ <source>If possible, try to use the RSA algorithm compatible with the server for signing.</source>
+ <translation type="vanished">如果可能,尝试使用与服务器兼容的 RSA 算法进行签名。</translation>
+ </message>
+ <message>
+ <source>Service Token Empty</source>
+ <translation type="vanished">服务令牌为空</translation>
+ </message>
+ <message>
+ <source>Please go to the settings interface to set Own Key and get Service Token.</source>
+ <translation type="vanished">请到设置界面设置Own Key并获取Service Token。</translation>
+ </message>
+ <message>
+ <source>Message Inbox</source>
+ <translation type="vanished">留言收件箱</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation type="vanished">没有</translation>
+ </message>
+ <message>
+ <source>ASCII(7 bits)</source>
+ <translation type="vanished">ASCII(7 位)</translation>
+ </message>
+ <message>
+ <source>ASCII(8 bits)</source>
+ <translation type="vanished">ASCII(8 位)</translation>
+ </message>
+ <message>
+ <source>UTF-16</source>
+ <translation type="vanished">UTF-16</translation>
+ </message>
+ <message>
+ <source>UTF-16(BE)</source>
+ <translation type="vanished">UTF-16(比利时)</translation>
+ </message>
+ <message>
+ <source>Send Mail</source>
+ <translation type="vanished">发邮件</translation>
+ </message>
+ <message>
+ <source>Identity Information</source>
+ <translation type="vanished">身份信息</translation>
+ </message>
+ <message>
+ <source>Enable Send Mail Ability</source>
+ <translation type="vanished">启用发送邮件功能</translation>
+ </message>
+ <message>
+ <source>Need Auth</source>
+ <translation type="vanished">需要认证</translation>
+ </message>
+ <message>
+ <source>SMTP Server Address</source>
+ <translation type="vanished">SMTP 服务器地址</translation>
+ </message>
+ <message>
+ <source>SMTP Server Port</source>
+ <translation type="vanished">SMTP 服务器端口</translation>
+ </message>
+ <message>
+ <source>SMTP Connection Security</source>
+ <translation type="vanished">SMTP 连接安全</translation>
+ </message>
+ <message>
+ <source>Default Sender Email</source>
+ <translation type="vanished">默认发件人电子邮件</translation>
+ </message>
+ <message>
+ <source>Check Connection</source>
+ <translation type="vanished">检查连接</translation>
+ </message>
+ <message>
+ <source>Send Test Email</source>
+ <translation type="vanished">发送测试邮件</translation>
+ </message>
+ <message>
+ <source>Default Sender GPG Key ID</source>
+ <translation type="vanished">默认发件人 GPG 密钥 ID</translation>
+ </message>
+ <message>
+ <source>Tips: It is recommended that you build your own mail server or use a trusted mail server. If you don&apos;t know the detailed configuration information, you can get it from the mail service provider.</source>
+ <translation type="vanished">温馨提示:建议您自建邮件服务器或使用可信赖的邮件服务器。如果您不知道详细的配置信息,可以从邮件服务提供商处获取。</translation>
+ </message>
+ <message>
+ <source>apply settings failed</source>
+ <translation type="vanished">应用设置失败</translation>
+ </message>
+ <message>
+ <source>Test SMTP Connection...</source>
+ <translation type="vanished">测试 SMTP 连接...</translation>
+ </message>
+ <message>
+ <source>Test SMTP Send Mail Ability...</source>
+ <translation type="vanished">测试 SMTP 发送邮件能力...</translation>
+ </message>
+ <message>
+ <source>Test Email from GpgFrontend</source>
+ <translation type="vanished">从 GpgFrontend 测试电子邮件</translation>
+ </message>
+ <message>
+ <source>Hello, this is a test email from GpgFrontend. If you receive this email, it means that you have configured the correct SMTP server parameters.</source>
+ <translation type="vanished">你好,这是一封来自 GpgFrontend 的测试邮件。如果您收到此电子邮件,则表示您已配置正确的 SMTP 服务器参数。</translation>
+ </message>
+ <message>
+ <source>Succeed in sending a test email to the SMTP Server</source>
+ <translation type="vanished">成功向 SMTP 服务器发送测试邮件</translation>
+ </message>
+ <message>
+ <source>root certs loaded</source>
+ <translation type="vanished">根证书已加载</translation>
+ </message>
+ <message>
+ <source>Nothing Reply. Please check the Internet connection.</source>
+ <translation type="vanished">什么都不回复。请检查互联网连接。</translation>
+ </message>
+ <message>
+ <source>Unknown Error</source>
+ <translation type="vanished">未知错误</translation>
+ </message>
+ <message>
+ <source>Network Error</source>
+ <translation type="vanished">网络错误</translation>
+ </message>
+ <message>
+ <source>Outdated Reply</source>
+ <translation type="vanished">过时的回复</translation>
+ </message>
+ <message>
+ <source>Unknown Reason</source>
+ <translation type="vanished">未知原因</translation>
+ </message>
+ <message>
+ <source>Unknown Reply Format</source>
+ <translation type="vanished">未知回复格式</translation>
+ </message>
+ <message>
+ <source>The communication content with the server does not meet the requirements</source>
+ <translation type="vanished">与服务器的通讯内容不符合要求</translation>
+ </message>
+ <message>
+ <source>(.gpg .asc)</source>
+ <translation type="vanished">(.gpg .asc)</translation>
+ </message>
+ <message>
+ <source>(.sig .gpg .asc)</source>
+ <translation type="vanished">(.sig .gpg .asc)</translation>
+ </message>
+ <message>
+ <source>Export Key(s) Failed.</source>
+ <translation type="vanished">导出密钥失败。</translation>
+ </message>
+ <message>
+ <source>info_font_size</source>
+ <translation type="vanished">info_font_size</translation>
+ </message>
+ <message>
+ <source>Invalid Own Key</source>
+ <translation type="vanished">无效的自己的密钥</translation>
+ </message>
+ <message>
+ <source>Own Key can not be use to do any operation. Please go to the setting interface to select an OwnKey and get a ServiceToken.</source>
+ <translation type="vanished">不能使用自己的密钥进行任何操作。请到设置界面选择一个OwnKey并获取一个ServiceToken。</translation>
+ </message>
+ <message>
+ <source>Please obtain a Service Token from the server in the settings.</source>
+ <translation type="vanished">请在设置中从服务器获取服务令牌。</translation>
+ </message>
+ <message>
+ <source>Getting Cpt From Server</source>
+ <translation type="vanished">从服务器获取 Cpt</translation>
+ </message>
+ <message>
+ <source>Invalid short ciphertext</source>
+ <translation type="vanished">短密文无效</translation>
+ </message>
+ <message>
+ <source>Invalid Service Token</source>
+ <translation type="vanished">无效的服务令牌</translation>
+ </message>
+ <message>
+ <source>Please go to the setting interface to get a ServiceToken.</source>
+ <translation type="vanished">请到设置界面获取ServiceToken。</translation>
+ </message>
+ <message>
+ <source>Own Key can not be use to do any operation.</source>
+ <translation type="vanished">不能使用自己的密钥进行任何操作。</translation>
+ </message>
+ <message>
+ <source>Getting Scpt From Server</source>
+ <translation type="vanished">从服务器获取 Scpt</translation>
+ </message>
+ <message>
+ <source>Notice: Use Decrypt &amp; Verify operation to decrypt this short crypto text.</source>
+ <translation type="vanished">注意:使用解密和验证操作来解密这个简短的加密文本。</translation>
+ </message>
+ <message>
+ <source>There is a problem with the communication with the server</source>
+ <translation type="vanished">与服务器的通信有问题</translation>
+ </message>
+ <message>
+ <source>Select a file before doing it.</source>
+ <translation type="vanished">在做之前选择一个文件。</translation>
+ </message>
+ <message>
+ <source>No Key Selected</source>
+ <translation type="vanished">未选择密钥</translation>
+ </message>
+ <message>
+ <source>No data was read from the key package.</source>
+ <translation type="vanished">没有从密钥包中读取数据。</translation>
+ </message>
+ <message>
+ <source>Wrong Passphrase</source>
+ <translation type="vanished">密码错误</translation>
+ </message>
+ <message>
+ <source>Please double check the passphrase you entered is correct.</source>
+ <translation type="vanished">请仔细检查您输入的密码是否正确。</translation>
+ </message>
+ <message>
+ <source>window_save</source>
+ <translation type="vanished">窗口_保存</translation>
+ </message>
+ <message>
+ <source>Show Steganographic Options.</source>
+ <translation type="vanished">显示隐写选项。</translation>
+ </message>
+ <message>
+ <source>Decrypt File</source>
+ <translation type="vanished">解密文件</translation>
+ </message>
+ <message>
+ <source>Encrypt File</source>
+ <translation type="vanished">加密文件</translation>
+ </message>
+ <message>
+ <source>Sign File</source>
+ <translation type="vanished">签名文件</translation>
+ </message>
+ <message>
+ <source>Verify File</source>
+ <translation type="vanished">验证文件</translation>
+ </message>
+ <message>
+ <source>Input Parameters</source>
+ <translation type="vanished">输入参数</translation>
+ </message>
+ <message>
+ <source>Target File</source>
+ <translation type="vanished">目标文件</translation>
+ </message>
+ <message>
+ <source>Signature File(.sig) Path</source>
+ <translation type="vanished">签名文件(.sig)路径</translation>
+ </message>
+ <message>
+ <source>Error Occurred During Encryption</source>
+ <translation type="vanished">加密过程中发生错误</translation>
+ </message>
+ <message>
+ <source>Error Occurred During Decryption</source>
+ <translation type="vanished">解密过程中发生错误</translation>
+ </message>
+ <message>
+ <source>Error Occurred During Signature</source>
+ <translation type="vanished">签名时发生错误</translation>
+ </message>
+ <message>
+ <source>Key List Menu: </source>
+ <translation type="vanished">密钥列表菜单:</translation>
+ </message>
+ <message>
+ <source>InfoBoard&apos;s Actions Menu</source>
+ <translation type="vanished">InfoBoard 的操作菜单</translation>
+ </message>
+ <message>
+ <source>No permission to read target file.</source>
+ <translation type="vanished">没有读取目标文件的权限。</translation>
+ </message>
+ <message>
+ <source>No permission to read signature file.</source>
+ <translation type="vanished">没有读取签名文件的权限。</translation>
+ </message>
+ <message>
+ <source>Append Selected Key(s) To Text</source>
+ <translation type="vanished">将选定的密钥对附加到文本</translation>
+ </message>
+ <message>
+ <source>Unreleased Version</source>
+ <translation type="vanished">未发布版本</translation>
+ </message>
+ <message>
+ <source>This version(%1) has not been officially released and is not recommended for use in a production environment. &lt;br/&gt;</source>
+ <translation type="vanished">此版本(%1)尚未正式发布,不建议在生产环境中使用。 &lt;br/&gt;</translation>
+ </message>
+ <message>
+ <source>Fail to Login into SMTP Server</source>
+ <translation type="vanished">无法登录到 SMTP 服务器</translation>
+ </message>
+ <message>
+ <source>Fail to Send Mail to SMTP Server</source>
+ <translation type="vanished">无法向 SMTP 服务器发送邮件</translation>
+ </message>
+ <message>
+ <source>Succeed in Sending Mail to SMTP Server</source>
+ <translation type="vanished">成功发送邮件到 SMTP 服务器</translation>
+ </message>
+ <message>
+ <source>Master Key</source>
+ <translation type="vanished">主密钥</translation>
+ </message>
+ <message>
+ <source>GpgFrontend Server</source>
+ <translation type="vanished">Gpg前端服务器</translation>
+ </message>
+ <message>
+ <source>Server that provides short key and key exchange services</source>
+ <translation type="vanished">提供短密钥和密钥交换服务的服务器</translation>
+ </message>
+ <message>
+ <source>Own key</source>
+ <translation type="vanished">我的密钥</translation>
+ </message>
+ <message>
+ <source>Get Service Token</source>
+ <translation type="vanished">获取服务令牌</translation>
+ </message>
+ <message>
+ <source>No Service Token Found</source>
+ <translation type="vanished">未找到服务令牌</translation>
+ </message>
+ <message>
+ <source>Key pair for synchronization and identity authentication</source>
+ <translation type="vanished">用于同步和身份认证的密钥对</translation>
+ </message>
+ <message>
+ <source>Own Key can not be None while getting service token.</source>
+ <translation type="vanished">获取服务令牌时,自己的密钥不能为 None。</translation>
+ </message>
+ <message>
+ <source>Key Not Exists</source>
+ <translation type="vanished">密钥不存在</translation>
+ </message>
+ <message>
+ <source>Succeed in getting service token</source>
+ <translation type="vanished">成功获取服务令牌</translation>
+ </message>
+ <message>
+ <source>Given a default sender first</source>
+ <translation type="vanished">首先给定一个默认发件人</translation>
+ </message>
+ <message>
+ <source>Hello, this is a test email from GpgFrontend.</source>
+ <translation type="vanished">你好,这是一封来自 GpgFrontend 的测试邮件。</translation>
+ </message>
+ <message>
+ <source>Fail to send a test email to the SMTP Server, please recheck your configuration.</source>
+ <translation type="vanished">无法向 SMTP 服务器发送测试电子邮件,请重新检查您的配置。</translation>
+ </message>
+ <message>
+ <source>Keu ID</source>
+ <translation type="vanished">密钥ID</translation>
+ </message>
+ <message>
+ <source>Public Algo</source>
+ <translation type="vanished">公钥算法</translation>
+ </message>
+ <message>
+ <source>Verify Result Analyse Started</source>
+ <translation type="vanished">验证结果分析开始</translation>
+ </message>
+ <message>
+ <source>Not Signature Found</source>
+ <translation type="vanished">未找到签名</translation>
+ </message>
+ <message>
+ <source>Edit Expire Datetime</source>
+ <translation type="vanished">编辑过期日期时间</translation>
+ </message>
+ <message>
+ <source>Selecting Nothing will eventually use default key to sign.</source>
+ <translation type="vanished">选择 Nothing 最终将使用默认密钥进行签名。</translation>
+ </message>
+ <message>
+ <source>Refresh Key From Key Server</source>
+ <translation type="vanished">从密钥服务器刷新密钥</translation>
+ </message>
+ <message>
+ <source>Upload Public Key(s) To Server</source>
+ <translation type="vanished">上传公钥到服务器</translation>
+ </message>
+ <message>
+ <source>Upload The Selected Public Keys To Server</source>
+ <translation type="vanished">将选定的公钥上传到服务器</translation>
+ </message>
+ <message>
+ <source>Update Key Pair</source>
+ <translation type="vanished">更新密钥对</translation>
+ </message>
+ <message>
+ <source>Default Key Server for Import</source>
+ <translation type="vanished">用于导入的默认密钥服务器</translation>
+ </message>
+ <message>
+ <source>File...</source>
+ <translation type="vanished">文件...</translation>
+ </message>
+ <message>
+ <source>Import missing key from Keyserver</source>
+ <translation type="vanished">从密钥服务器导入丢失的密钥</translation>
+ </message>
+ <message>
+ <source>Actions</source>
+ <translation type="vanished">行动</translation>
+ </message>
+ <message>
+ <source>Export Private Key (Include Subkey)</source>
+ <translation type="vanished">导出私钥(包括子密钥)</translation>
+ </message>
+ <message>
+ <source>Date &amp; Time</source>
+ <translation type="vanished">日期和时间</translation>
+ </message>
+</context>
+<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>Gernal 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">MIME</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="76"/>
+ <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="79"/>
+ <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="111"/>
+ <source>Signer</source>
+ <translation type="unfinished">签名者</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="82"/>
+ <source>Public Key Algo</source>
+ <translation type="unfinished">公钥算法</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="84"/>
+ <source>Hash Algo</source>
+ <translation type="unfinished">哈希算法</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="86"/>
+ <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="90"/>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="86"/>
+ <source>UTC</source>
+ <translation type="unfinished">世界标准时间</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="90"/>
+ <source>Localized</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="105"/>
+ <source>Invalid Signers</source>
+ <translation type="unfinished">无效签名者</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="113"/>
+ <source>Fingerprint</source>
+ <translation type="unfinished">指纹</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/core/function/result_analyse/GpgSignResultAnalyse.cpp" line="115"/>
+ <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="44"/>
+ <source>Verify Operation</source>
+ <translation type="unfinished">验证操作</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="47"/>
+ <source>Success</source>
+ <translation type="unfinished">成功</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="49"/>
+ <source>Failed</source>
+ <translation type="unfinished">失败</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="58"/>
+ <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="62"/>
+ <source>Signed On</source>
+ <translation type="unfinished">已签名</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="58"/>
+ <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="206"/>
+ <source>UTC</source>
+ <translation type="unfinished">世界标准时间</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="62"/>
+ <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="210"/>
+ <source>Localized</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="65"/>
+ <source>Signatures List</source>
+ <translation type="unfinished">签名列表</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="72"/>
+ <source>Signature [%1]:</source>
+ <translation type="unfinished">签名 [%1]:</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="74"/>
+ <source>Status</source>
+ <translation type="unfinished">状态</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="77"/>
+ <source>A Bad Signature.</source>
+ <translation type="unfinished">一个错误的签名。</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="79"/>
+ <source>This Signature is invalid.</source>
+ <translation type="unfinished">此签名无效。</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="84"/>
+ <source>A</source>
+ <translation type="unfinished">一种</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="86"/>
+ <source>Good</source>
+ <translation type="unfinished">正常</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="89"/>
+ <source>Bad</source>
+ <translation type="unfinished">异常</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="92"/>
+ <source>Expired</source>
+ <translation type="unfinished">已到期</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="95"/>
+ <source>Missing Key&apos;s</source>
+ <translation type="unfinished">密钥缺失</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="98"/>
+ <source>Revoked Key&apos;s</source>
+ <translation type="unfinished">撤销的密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="101"/>
+ <source>Expired Key&apos;s</source>
+ <translation type="unfinished">过期的密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="104"/>
+ <source>Missing CRL&apos;s</source>
+ <translation type="unfinished">CRL缺失</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="108"/>
+ <source>Signature Fully Valid.</source>
+ <translation type="unfinished">签名完全有效。</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="110"/>
+ <source>Signature Not Fully Valid.</source>
+ <translation type="unfinished">签名不完全有效。</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="111"/>
+ <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="118"/>
+ <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="127"/>
+ <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"/>
+ <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"/>
+ <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"/>
+ <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"/>
+ <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"/>
+ <source>Error for key with fingerprint</source>
+ <translation type="unfinished">带指纹的密钥错误</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="175"/>
+ <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="189"/>
+ <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="194"/>
+ <source>Signed By</source>
+ <translation type="unfinished">被...签名</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="190"/>
+ <source>Unknown</source>
+ <translation type="unfinished">未知</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="198"/>
+ <source>Public Key Algo</source>
+ <translation type="unfinished">公钥算法</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="202"/>
+ <source>Hash Algo</source>
+ <translation type="unfinished">哈希算法</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="206"/>
+ <location filename="../../../../src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp" line="210"/>
+ <source>Date</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="124"/>
+ <source>Embedded In</source>
+ <translation type="unfinished">嵌入</translation>
+ </message>
+</context>
+<context>
+ <name>GpgFrontend::UI::AboutDialog</name>
+ <message>
+ <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="46"/>
+ <source>About</source>
+ <translation type="unfinished">关于</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="54"/>
+ <source>About GpgFrontend</source>
+ <translation type="unfinished">关于 GpgFrontend</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="55"/>
+ <source>GnuPG</source>
+ <translation type="unfinished">GnuPG</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="56"/>
+ <source>Translators</source>
+ <translation type="unfinished">翻译贡献者</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="57"/>
+ <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="42"/>
+ <source>Icon Size</source>
+ <translation type="unfinished">图标大小</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="43"/>
+ <source>small</source>
+ <translation type="unfinished">小</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="44"/>
+ <source>medium</source>
+ <translation type="unfinished">中</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="45"/>
+ <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>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="48"/>
+ <source>just text</source>
+ <translation type="unfinished">只显示文字</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="49"/>
+ <source>just icons</source>
+ <translation type="unfinished">只显示图标</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="50"/>
+ <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>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="54"/>
+ <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>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>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/settings/SettingsAppearance.cpp" line="59"/>
+ <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>
+ </message>
+</context>
+<context>
+ <name>GpgFrontend::UI::ChoosePage</name>
+ <message>
+ <location filename="../../../../src/ui/dialog/Wizard.cpp" line="112"/>
+ <source>Choose your action...</source>
+ <translation type="unfinished">选择你的行动...</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/Wizard.cpp" line="113"/>
+ <source>...by clicking on the appropriate link.</source>
+ <translation type="unfinished">...通过点击相应的链接。</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/Wizard.cpp" line="123"/>
+ <source>Generate Key</source>
+ <translation type="unfinished">生成密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/Wizard.cpp" line="136"/>
+ <source>Encrypt &amp; Decrypt Text</source>
+ <translation type="unfinished">加密和解密文本</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/Wizard.cpp" line="136"/>
+ <location filename="../../../../src/ui/dialog/Wizard.cpp" line="152"/>
+ <source>or</source>
+ <translation type="unfinished">或者</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/Wizard.cpp" line="140"/>
+ <source>Sign &amp; Verify Text</source>
+ <translation type="unfinished">签名和验证文本</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/Wizard.cpp" line="148"/>
+ <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="152"/>
+ <source>Encrypt &amp; Sign File</source>
+ <translation type="unfinished">加密和签名文件</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/Wizard.cpp" line="156"/>
+ <source>Sign &amp; Verify File</source>
+ <translation type="unfinished">签署并验证文件</translation>
+ </message>
+</context>
+<context>
+ <name>GpgFrontend::UI::CommonUtils</name>
+ <message>
+ <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="188"/>
+ <source>GnuPG Context Loading Failed</source>
+ <translation type="unfinished">GnuPG 上下文加载失败</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="190"/>
+ <source>Gnupg(gpg) is not installed correctly, please follow &lt;a href=&apos;https://www.gpgfrontend.bktus.com/#/faq?id=how-to-deal-with-39env-loading-failed39&apos;&gt;this notes&lt;/a&gt; in FAQ to install Gnupg and then open GpgFrontend. &lt;br /&gt;Or, you can open GnuPG Controller to set a custom GnuPG which GpgFrontend should use. Then, GpgFrontend will restart. &lt;br /&gt;&lt;br /&gt;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="445"/>
+ <source>Timeout</source>
+ <translation type="unfinished">超时</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="252"/>
+ <source>Operation has timeout, aborted...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="264"/>
+ <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="381"/>
+ <source>Success</source>
+ <translation type="unfinished">成功</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="265"/>
+ <source>Gpg Operation succeed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="276"/>
+ <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="373"/>
+ <source>Failure</source>
+ <translation type="unfinished">失败</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="277"/>
+ <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="294"/>
+ <source>Open Key</source>
+ <translation type="unfinished">打开密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="295"/>
+ <source>Key Files</source>
+ <translation type="unfinished">密钥文件</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="295"/>
+ <source>Keyring files</source>
+ <translation type="unfinished">密钥圈文件</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="300"/>
+ <source>File Open Failed</source>
+ <translation type="unfinished">文件打开失败</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="301"/>
+ <source>Failed to open file: </source>
+ <translation type="unfinished">打开文件失败:</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="354"/>
+ <source>Processing</source>
+ <translation type="unfinished">处理中</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="374"/>
+ <source>Failed to execute command.</source>
+ <translation type="unfinished">无法执行命令。</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="382"/>
+ <source>Succeed in executing command.</source>
+ <translation type="unfinished">成功执行命令。</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="384"/>
+ <source>Warning</source>
+ <translation type="unfinished">警告</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="385"/>
+ <source>Finished executing command.</source>
+ <translation type="unfinished">命令执行完毕。</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="406"/>
+ <source>Default Keyserver Not Found</source>
+ <translation type="unfinished">未找到默认密钥服务器</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="407"/>
+ <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"/>
+ <source>Key Not Found</source>
+ <translation type="unfinished">未找到密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="448"/>
+ <source>Key Server Not Found</source>
+ <translation type="unfinished">未找到密钥服务器</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="451"/>
+ <source>Connection Error</source>
+ <translation type="unfinished">连接错误</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="462"/>
+ <source>The key has been updated</source>
+ <translation type="unfinished">密钥已更新</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="464"/>
+ <source>No need to update the key</source>
+ <translation type="unfinished">无需更新密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="495"/>
+ <source>Password Input Dialog</source>
+ <translation type="unfinished">密码输入对话框</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="498"/>
+ <source>Please Input The Password</source>
+ <translation type="unfinished">请输入密码</translation>
+ </message>
+</context>
+<context>
+ <name>GpgFrontend::UI::ConclusionPage</name>
+ <message>
+ <location filename="../../../../src/ui/dialog/Wizard.cpp" line="222"/>
+ <source>Ready.</source>
+ <translation type="unfinished">准备好。</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/Wizard.cpp" line="223"/>
+ <source>Have fun with GpgFrontend!</source>
+ <translation type="unfinished">祝您使用 GpgFrontend 愉快!</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/Wizard.cpp" line="226"/>
+ <source>You are ready to use GpgFrontend now.&lt;br&gt;&lt;br&gt;</source>
+ <translation type="unfinished">您现在可以使用 GpgFrontend。&lt;br&gt;&lt;br&gt;</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/Wizard.cpp" line="230"/>
+ <source>The Online Document</source>
+ <translation type="unfinished">在线文档</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/Wizard.cpp" line="231"/>
+ <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="240"/>
+ <source>Open offline help.</source>
+ <translation type="unfinished">打开离线帮助。</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/Wizard.cpp" line="243"/>
+ <source>Dont 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&apos;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">密钥包已成功生成并受到加密算法AES-256-ECB的保护。您可以安全地转移您的密钥包。</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="68"/>
+ <source>Show Hidden File</source>
+ <translation type="unfinished">显示隐藏文件</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/FilePage.cpp" line="74"/>
+ <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="84"/>
+ <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="97"/>
+ <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="167"/>
+ <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="219"/>
+ <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="242"/>
+ <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="294"/>
+ <source>Error</source>
+ <translation type="unfinished">错误</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="85"/>
+ <source>The path is not exists, unprivileged or unreachable.</source>
+ <translation type="unfinished">该路径不存在、没有特权或无法访问。</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="98"/>
+ <source>The file is unprivileged or unreachable.</source>
+ <translation type="unfinished">该目录不存在,或者您的权限不足。</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="158"/>
+ <source>Warning</source>
+ <translation type="unfinished">警告</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="159"/>
+ <source>Are you sure you want to delete it?</source>
+ <translation type="unfinished">你确定要删除吗?</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="168"/>
+ <source>Unable to delete the file or folder.</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"/>
+ <source>Make New Directory</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>Directory Name</source>
+ <translation type="unfinished">目录名称</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="209"/>
+ <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="232"/>
+ <source>Create Empty File</source>
+ <translation type="unfinished">创建空文件</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="209"/>
+ <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="232"/>
+ <source>Filename (you can given extension)</source>
+ <translation type="unfinished">文件名(您可以指定扩展名)</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="220"/>
+ <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="243"/>
+ <source>Unable to create the file.</source>
+ <translation type="unfinished">无法创建文件。</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="277"/>
+ <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="314"/>
+ <source>Rename</source>
+ <translation type="unfinished">改名</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="277"/>
+ <source>New Filename</source>
+ <translation type="unfinished">新文件名</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="295"/>
+ <source>Unable to rename the file or folder.</source>
+ <translation type="unfinished">无法重命名文件或文件夹。</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="308"/>
+ <source>Open</source>
+ <translation type="unfinished">打开</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="319"/>
+ <source>Delete</source>
+ <translation type="unfinished">删除</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="324"/>
+ <source>Calculate Hash</source>
+ <translation type="unfinished">计算哈希值</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="329"/>
+ <source>Directory</source>
+ <translation type="unfinished">目录</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="334"/>
+ <source>File</source>
+ <translation type="unfinished">文件</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="339"/>
+ <source>Compress...</source>
+ <translation type="unfinished">压缩...</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="346"/>
+ <source>Open with Default System Application</source>
+ <translation type="unfinished">使用默认系统应用程序打开</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/FileTreeView.cpp" line="351"/>
+ <source>New</source>
+ <translation type="unfinished">新建</translation>
+ </message>
+</context>
+<context>
+ <name>GpgFrontend::UI::FindWidget</name>
+ <message>
+ <location filename="../../../../src/ui/widgets/FindWidget.cpp" line="46"/>
+ <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">关闭 GpgFrontend 时清除 gpg 密码缓存。</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">如果您更改语言,GpgFrontend 将自动重启!</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="79"/>
+ <source>Clear All Log (Total Size: %1)</source>
+ <translation type="unfinished">清除所有日志(总大小:%1)</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/settings/SettingsGeneral.cpp" line="66"/>
+ <location filename="../../../../src/ui/dialog/settings/SettingsGeneral.cpp" line="94"/>
+ <source>Clear All Data Objects (Total Size: %1)</source>
+ <translation type="unfinished">清除所有数据对象(总大小:%1)</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/settings/SettingsGeneral.cpp" line="86"/>
+ <source>Confirm</source>
+ <translation type="unfinished">确认</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/settings/SettingsGeneral.cpp" line="87"/>
+ <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/gnupg/GnuPGControllerDialog.cpp" line="45"/>
+ <source>General</source>
+ <translation type="unfinished">通用</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="46"/>
+ <source>Key Database</source>
+ <translation type="unfinished">密钥数据库</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="47"/>
+ <source>Advanced</source>
+ <translation type="unfinished">高级</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="49"/>
+ <source>No ASCII Mode</source>
+ <translation type="unfinished">无 ASCII 模式</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/gnupg/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"/>
+ <source>Use Custom GnuPG</source>
+ <translation type="unfinished">使用自定义 GnuPG</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="53"/>
+ <source>Select GnuPG Path</source>
+ <translation type="unfinished">选择 GnuPG 路径</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="55"/>
+ <source>Use Custom GnuPG Key Database Path</source>
+ <translation type="unfinished">使用自定义 GnuPG 密钥数据库路径</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="57"/>
+ <source>Select Key Database Path</source>
+ <translation type="unfinished">选择密钥数据库路径</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="61"/>
+ <source>Tips: please select a directroy where &quot;gpgconf&quot; is located in.</source>
+ <translation type="unfinished">提示:请选择“gpgconf”所在目录。</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="63"/>
+ <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="95"/>
+ <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="126"/>
+ <source>Open Directory</source>
+ <translation type="unfinished">打开目录</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="172"/>
+ <source>GnuPG Controller</source>
+ <translation type="unfinished">GnuPG 控制器</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="331"/>
+ <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="339"/>
+ <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="346"/>
+ <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="358"/>
+ <source>Illegal GnuPG Path</source>
+ <translation type="unfinished">非法 GnuPG 路径</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="332"/>
+ <source>Target GnuPG Path is empty.</source>
+ <translation type="unfinished">目标 GnuPG 路径为空。</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="340"/>
+ <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="347"/>
+ <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="359"/>
+ <source>Target GnuPG Path contains no &quot;gpgconf&quot; executable.</source>
+ <translation type="unfinished">目标 GnuPG 路径不包含“gpgconf”可执行文件。</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="369"/>
+ <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="376"/>
+ <source>Illegal GnuPG Key Database Path</source>
+ <translation type="unfinished">非法的 GnuPG 密钥数据库路径</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="370"/>
+ <source>Target GnuPG Key Database Path is empty.</source>
+ <translation type="unfinished">目标 GnuPG 密钥数据库路径为空。</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/gnupg/GnuPGControllerDialog.cpp" line="377"/>
+ <source>Target GnuPG Key Database Path is not an exists readable directory.</source>
+ <translation type="unfinished">目标 GnuPG 密钥数据库路径不是现有的可读目录。</translation>
+ </message>
+</context>
+<context>
+ <name>GpgFrontend::UI::GnupgTab</name>
+ <message>
+ <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="44"/>
+ <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="59"/>
+ <source>Description</source>
+ <translation type="unfinished">描述</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="44"/>
+ <source>Version</source>
+ <translation type="unfinished">版本</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="45"/>
+ <source>Checksum</source>
+ <translation type="unfinished">校验和</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="45"/>
+ <source>Binary Path</source>
+ <translation type="unfinished">二进制路径</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="47"/>
+ <source>Components</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="48"/>
+ <source>Configurations</source>
+ <translation type="unfinished">配置</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="58"/>
+ <source>Component</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="58"/>
+ <source>Group</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="58"/>
+ <source>Key</source>
+ <translation type="unfinished">密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="59"/>
+ <source>Default Value</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/help/GnupgTab.cpp" line="60"/>
+ <source>Value</source>
+ <translation type="unfinished">价值</translation>
+ </message>
+</context>
+<context>
+ <name>GpgFrontend::UI::GpgFrontendApplication</name>
+ <message>
+ <location filename="../../../../src/ui/GpgFrontendApplication.cpp" line="64"/>
+ <source>Standard Exception Thrown</source>
+ <translation type="unfinished">小意外</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/GpgFrontendApplication.cpp" line="65"/>
+ <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"/>
+ <source>Unhandled Exception Thrown</source>
+ <translation type="unfinished">未处理的异常</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/GpgFrontendApplication.cpp" line="74"/>
+ <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&apos;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="91"/>
+ <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="97"/>
+ <source>Developer:</source>
+ <translation type="unfinished">开发者:</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="98"/>
+ <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="101"/>
+ <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="103"/>
+ <source>Built with Qt</source>
+ <translation type="unfinished">用 Qt 构建</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="104"/>
+ <source>and</source>
+ <translation type="unfinished">和</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="105"/>
+ <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="74"/>
+ <source>Getting Started...</source>
+ <translation type="unfinished">入门...</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/Wizard.cpp" line="75"/>
+ <source>... with GpgFrontend</source>
+ <translation type="unfinished">... 使用 GpgFrontend</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>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/Wizard.cpp" line="82"/>
+ <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="84"/>
+ <source>For brief information have a look at the</source>
+ <translation type="unfinished">简要信息,请查看</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/Wizard.cpp" line="86"/>
+ <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>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/Wizard.cpp" line="96"/>
+ <source>If it supports the language currently being used in your system, GpgFrontend will automatically set it.</source>
+ <translation type="unfinished">GpgFrontend 已经自动将语言设置为中文。</translation>
+ </message>
+</context>
+<context>
+ <name>GpgFrontend::UI::KeyDetailsDialog</name>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyDetailsDialog.cpp" line="42"/>
+ <source>KeyPair</source>
+ <translation type="unfinished">密钥对</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyDetailsDialog.cpp" line="43"/>
+ <source>UIDs</source>
+ <translation type="unfinished">UID</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyDetailsDialog.cpp" line="45"/>
+ <source>Subkeys</source>
+ <translation type="unfinished">子密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyDetailsDialog.cpp" line="47"/>
+ <source>Operations</source>
+ <translation type="unfinished">操作</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyDetailsDialog.cpp" line="57"/>
+ <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="67"/>
+ <source>Generate Key</source>
+ <translation type="unfinished">生成密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="101"/>
+ <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="106"/>
+ <source>Please give a email address.</source>
+ <translation type="unfinished">请提供一个电子邮件地址。</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="114"/>
+ <source>Expiration time too long.</source>
+ <translation type="unfinished">过期时间太长。</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="146"/>
+ <source>Generating</source>
+ <translation type="unfinished">生成</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="186"/>
+ <source>Key Usage</source>
+ <translation type="unfinished">密钥使用</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="188"/>
+ <source>Encryption</source>
+ <translation type="unfinished">加密</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="191"/>
+ <source>Signing</source>
+ <translation type="unfinished">签名</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="194"/>
+ <source>Certification</source>
+ <translation type="unfinished">认证</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="197"/>
+ <source>Authentication</source>
+ <translation type="unfinished">验证</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="409"/>
+ <source>Name</source>
+ <translation type="unfinished">姓名</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="410"/>
+ <source>Email Address</source>
+ <translation type="unfinished">电子邮件地址</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="411"/>
+ <source>Comment</source>
+ <translation type="unfinished">注释</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="412"/>
+ <source>Expiration Date</source>
+ <translation type="unfinished">截止日期</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="413"/>
+ <source>Never Expire</source>
+ <translation type="unfinished">永不过期</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="414"/>
+ <source>KeySize (in Bit)</source>
+ <translation type="unfinished">密钥大小(以位为单位)</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="415"/>
+ <source>Key Type</source>
+ <translation type="unfinished">密钥类型</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="416"/>
+ <source>Non Pass Phrase</source>
+ <translation type="unfinished">不设置密码</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/key_generate/KeygenDialog.cpp" line="429"/>
+ <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="182"/>
+ <source>Create a keypair...</source>
+ <translation type="unfinished">创建密钥对...</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/Wizard.cpp" line="183"/>
+ <source>...for decrypting and signing messages</source>
+ <translation type="unfinished">...用于解密和签署消息</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/Wizard.cpp" line="185"/>
+ <source>You should create a new keypair.The pair consists of a public and a private key.&lt;br&gt;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.&lt;br&gt;For more information have a look at the offline tutorial (which then is shown in the main window):</source>
+ <translation type="unfinished">您应该创建一个新的密钥对。该对由一个公钥和一个私钥组成。&lt;br&gt;其他用户可以使用公钥为您加密消息并验证您签署的消息。您可以使用私钥解密和签名消息。&lt;br&gt;有关更多信息,请查看离线教程(然后显示在主窗口中):</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/Wizard.cpp" line="197"/>
+ <source>Offline tutorial</source>
+ <translation type="unfinished">离线教程</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/Wizard.cpp" line="201"/>
+ <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="42"/>
+ <location filename="../../../../src/ui/dialog/import_export/KeyImportDetailDialog.cpp" line="58"/>
+ <source>Key Import Details</source>
+ <translation type="unfinished">密钥导入详细信息</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/import_export/KeyImportDetailDialog.cpp" line="43"/>
+ <source>No keys found to import</source>
+ <translation type="unfinished">找不到要导入的密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/import_export/KeyImportDetailDialog.cpp" line="72"/>
+ <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="89"/>
+ <source>Imported</source>
+ <translation type="unfinished">导入</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/import_export/KeyImportDetailDialog.cpp" line="96"/>
+ <source>Not Imported</source>
+ <translation type="unfinished">未导入</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/import_export/KeyImportDetailDialog.cpp" line="103"/>
+ <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="132"/>
+ <source>Name</source>
+ <translation type="unfinished">姓名</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/import_export/KeyImportDetailDialog.cpp" line="132"/>
+ <source>Email</source>
+ <translation type="unfinished">电子邮件</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/import_export/KeyImportDetailDialog.cpp" line="132"/>
+ <source>Status</source>
+ <translation type="unfinished">状态</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/import_export/KeyImportDetailDialog.cpp" line="133"/>
+ <source>Fingerprint</source>
+ <translation type="unfinished">指纹</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/import_export/KeyImportDetailDialog.cpp" line="159"/>
+ <source>Private</source>
+ <translation type="unfinished">私有的</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/import_export/KeyImportDetailDialog.cpp" line="162"/>
+ <source>Public</source>
+ <translation type="unfinished">公开的</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/import_export/KeyImportDetailDialog.cpp" line="165"/>
+ <source>Unchanged</source>
+ <translation type="unfinished">未变化</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/import_export/KeyImportDetailDialog.cpp" line="168"/>
+ <source>New Key</source>
+ <translation type="unfinished">新密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/import_export/KeyImportDetailDialog.cpp" line="171"/>
+ <source>New Subkey</source>
+ <translation type="unfinished">新子密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/import_export/KeyImportDetailDialog.cpp" line="175"/>
+ <source>New Signature</source>
+ <translation type="unfinished">新签名</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/import_export/KeyImportDetailDialog.cpp" line="179"/>
+ <source>New UID</source>
+ <translation type="unfinished">新 UID</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="167"/>
+ <source>Select</source>
+ <translation type="unfinished">选择</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/KeyList.cpp" line="167"/>
+ <source>Type</source>
+ <translation type="unfinished">类型</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/KeyList.cpp" line="167"/>
+ <source>Name</source>
+ <translation type="unfinished">姓名</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/KeyList.cpp" line="167"/>
+ <source>Email Address</source>
+ <translation type="unfinished">电子邮件地址</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/KeyList.cpp" line="168"/>
+ <source>Usage</source>
+ <translation type="unfinished">用法</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/KeyList.cpp" line="168"/>
+ <source>Trust</source>
+ <translation type="unfinished">信任</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/KeyList.cpp" line="168"/>
+ <source>Finger Print</source>
+ <translation type="unfinished">指纹</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/KeyList.cpp" line="183"/>
+ <source>Refreshing Key List...</source>
+ <translation type="unfinished">正在刷新密钥列表...</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/KeyList.cpp" line="351"/>
+ <source>Import Keys</source>
+ <translation type="unfinished">导入密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/KeyList.cpp" line="354"/>
+ <source>You&apos;ve dropped something on the table.</source>
+ <translation type="unfinished">你把东西掉在桌子上了。</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/KeyList.cpp" line="355"/>
+ <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"/>
+ <source>Always import without bothering.</source>
+ <translation type="unfinished">始终导入而无需打扰。</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/KeyList.cpp" line="455"/>
+ <source>Key List Refreshed.</source>
+ <translation type="unfinished">密钥列表已刷新。</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/KeyList.cpp" line="476"/>
+ <source>Syncing Key List...</source>
+ <translation type="unfinished">正在同步密钥列表...</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/KeyList.cpp" line="484"/>
+ <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"/>
+ <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="53"/>
+ <source>All</source>
+ <translation type="unfinished">全部</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="57"/>
+ <source>Only Public Key</source>
+ <translation type="unfinished">只有公钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="67"/>
+ <source>Has Private Key</source>
+ <translation type="unfinished">有私钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="77"/>
+ <source>No Primary Key</source>
+ <translation type="unfinished">无主密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="86"/>
+ <source>Revoked</source>
+ <translation type="unfinished">已吊销</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="94"/>
+ <source>Expired</source>
+ <translation type="unfinished">已到期</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="119"/>
+ <source>KeyPair Management</source>
+ <translation type="unfinished">密钥对管理</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="139"/>
+ <source>Open</source>
+ <translation type="unfinished">打开</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="141"/>
+ <source>Open Key File</source>
+ <translation type="unfinished">打开密钥文件</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="145"/>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="148"/>
+ <source>Close</source>
+ <translation type="unfinished">关闭</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="151"/>
+ <source>New Keypair</source>
+ <translation type="unfinished">新密钥对</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="154"/>
+ <source>Generate KeyPair</source>
+ <translation type="unfinished">生成密钥对</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="158"/>
+ <source>New Subkey</source>
+ <translation type="unfinished">新子密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="162"/>
+ <source>Generate Subkey For Selected KeyPair</source>
+ <translation type="unfinished">为选定的密钥对生成子密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="166"/>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="256"/>
+ <source>File</source>
+ <translation type="unfinished">文件</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="168"/>
+ <source>Import New Key From File</source>
+ <translation type="unfinished">从文件导入新密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="172"/>
+ <source>Clipboard</source>
+ <translation type="unfinished">剪贴板</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="176"/>
+ <source>Import New Key From Clipboard</source>
+ <translation type="unfinished">从剪贴板导入新密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="187"/>
+ <source>Keyserver</source>
+ <translation type="unfinished">密钥服务器</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="191"/>
+ <source>Import New Key From Keyserver</source>
+ <translation type="unfinished">从密钥服务器导入新密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="197"/>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="515"/>
+ <source>Key Package</source>
+ <translation type="unfinished">密钥包</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="200"/>
+ <source>Import Key(s) From a Key Package</source>
+ <translation type="unfinished">从密钥包导入密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="204"/>
+ <source>Export To Clipboard</source>
+ <translation type="unfinished">导出到剪贴板</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="208"/>
+ <source>Export Checked Key(s) To Clipboard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="212"/>
+ <source>Export As Key Package</source>
+ <translation type="unfinished">导出为密钥包</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="215"/>
+ <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="219"/>
+ <source>Export As OpenSSH</source>
+ <translation type="unfinished">导出为OpenSSH密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="222"/>
+ <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="226"/>
+ <source>Delete Selected Key(s)</source>
+ <translation type="unfinished">删除这些选定的密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="227"/>
+ <source>Delete the Selected keys</source>
+ <translation type="unfinished">删除这个选定的密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="231"/>
+ <source>Delete Checked Key(s)</source>
+ <translation type="unfinished">删除选中的密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="232"/>
+ <source>Delete the Checked keys</source>
+ <translation type="unfinished">删除选中的密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="237"/>
+ <source>Show Key Details</source>
+ <translation type="unfinished">显示密钥细节</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="238"/>
+ <source>Show Details for this Key</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="243"/>
+ <source>Set Owner Trust Level</source>
+ <translation type="unfinished">设置所有者信任级别</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="260"/>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="280"/>
+ <source>Key</source>
+ <translation type="unfinished">密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="261"/>
+ <source>Generate Key</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="293"/>
+ <source>Import Key</source>
+ <translation type="unfinished">导入密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="271"/>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="302"/>
+ <source>Export Key</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="292"/>
+ <source>Import key</source>
+ <translation type="unfinished">导入密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="301"/>
+ <source>Export key</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="335"/>
+ <source>Deleting Keys</source>
+ <translation type="unfinished">删除密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="338"/>
+ <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="340"/>
+ <source>The action can not be undone.</source>
+ <translation type="unfinished">该操作无法撤消。</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="356"/>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="436"/>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="491"/>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="535"/>
+ <source>Error</source>
+ <translation type="unfinished">错误</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="356"/>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="436"/>
+ <source>Key Not Found.</source>
+ <translation type="unfinished">未找到密钥。</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="367"/>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="380"/>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="454"/>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="460"/>
+ <source>Forbidden</source>
+ <translation type="unfinished">操作被禁止</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="368"/>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="381"/>
+ <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="373"/>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="504"/>
+ <source>key(s) exported</source>
+ <translation type="unfinished">导出的密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="397"/>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="467"/>
+ <source>Exporting</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="430"/>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="440"/>
+ <source>Invalid Operation</source>
+ <translation type="unfinished">无效操作</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="431"/>
+ <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="441"/>
+ <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="455"/>
+ <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="461"/>
+ <source>This operation accepts just a single key.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="492"/>
+ <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="499"/>
+ <source>Export OpenSSH Key To File</source>
+ <translation type="unfinished">将 OpenSSH 密钥导出到文件</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="500"/>
+ <source>OpenSSH Public Key Files</source>
+ <translation type="unfinished">OpenSSH 公钥文件</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="514"/>
+ <source>Import Key Package</source>
+ <translation type="unfinished">导入密钥包</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="518"/>
+ <source>Import Key Package Passphrase File</source>
+ <translation type="unfinished">导入密钥包密码文件</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="519"/>
+ <source>Key Package Passphrase File</source>
+ <translation type="unfinished">密钥包密码文件</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="529"/>
+ <source>key(s) imported</source>
+ <translation type="unfinished">导入的密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/KeyMgmt.cpp" line="536"/>
+ <source>An error occur in importing key package.</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">注意:创建的新 UID 将设置为主要。</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyNewUIDDialog.cpp" line="68"/>
+ <source>Create New UID</source>
+ <translation type="unfinished">创建新的 UID</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">额外的 UID</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="70"/>
+ <source>Name</source>
+ <translation type="unfinished">姓名</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="71"/>
+ <source>Email Address</source>
+ <translation type="unfinished">电子邮件地址</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="72"/>
+ <source>Comment</source>
+ <translation type="unfinished">注释</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="77"/>
+ <source>Key ID</source>
+ <translation type="unfinished">密钥编号</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="78"/>
+ <source>Algorithm</source>
+ <translation type="unfinished">算法</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="79"/>
+ <source>Key Size</source>
+ <translation type="unfinished">密钥大小</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="80"/>
+ <source>Nominal Usage</source>
+ <translation type="unfinished">名义用途</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="81"/>
+ <source>Actual Usage</source>
+ <translation type="unfinished">实际使用</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="82"/>
+ <source>Owner Trust Level</source>
+ <translation type="unfinished">所有者信级别</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="83"/>
+ <source>Create Date (Local Time)</source>
+ <translation type="unfinished">创建日期(本地时间)</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="85"/>
+ <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="89"/>
+ <source>Primary Key Existence</source>
+ <translation type="unfinished">主密钥存在</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="104"/>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="129"/>
+ <source>Copy</source>
+ <translation type="unfinished">复制</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="131"/>
+ <source>copy fingerprint to clipboard</source>
+ <translation type="unfinished">将指纹复制到剪贴板</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="177"/>
+ <source>Exists</source>
+ <translation type="unfinished">存在</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="177"/>
+ <source>Not Exists</source>
+ <translation type="unfinished">不存在</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="210"/>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="222"/>
+ <source>Certificate</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="225"/>
+ <source>Encrypt</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="228"/>
+ <source>Sign</source>
+ <translation type="unfinished">签名</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="214"/>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="231"/>
+ <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="273"/>
+ <source>Warning: The primary key has expired.</source>
+ <translation type="unfinished">警告:主密钥已过期。</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairDetailTab.cpp" line="278"/>
+ <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="51"/>
+ <source>General Operations</source>
+ <translation type="unfinished">一般操作</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="57"/>
+ <source>Export Public Key</source>
+ <translation type="unfinished">导出公钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="63"/>
+ <source>Export Private Key</source>
+ <translation type="unfinished">导出私钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="70"/>
+ <source>Modify Expiration Datetime (Primary Key)</source>
+ <translation type="unfinished">修改到期日期时间(主密钥)</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="73"/>
+ <source>Modify Password</source>
+ <translation type="unfinished">修改密码</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="92"/>
+ <source>Key Server Operation (Pubkey)</source>
+ <translation type="unfinished">密钥服务器操作(公钥)</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="100"/>
+ <source>Generate Revoke Certificate</source>
+ <translation type="unfinished">生成撤销证书</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="106"/>
+ <source>Modify TOFU Policy</source>
+ <translation type="unfinished">修改TOFU策略</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="111"/>
+ <source>Set Owner Trust Level</source>
+ <translation type="unfinished">设置所有者信任级别</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="135"/>
+ <source>Upload Key Pair to Key Server</source>
+ <translation type="unfinished">上传密钥对到密钥服务器</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="143"/>
+ <source>Sync Key Pair From Key Server</source>
+ <translation type="unfinished">从密钥服务器同步密钥对</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="158"/>
+ <source>Export Full Secret Key</source>
+ <translation type="unfinished">导出完整密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="164"/>
+ <source>Export Shortest Secret Key</source>
+ <translation type="unfinished">导出最短密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="191"/>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="238"/>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="282"/>
+ <source>Export Key To File</source>
+ <translation type="unfinished">将密钥导出到文件</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="192"/>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="239"/>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="283"/>
+ <source>Key Files</source>
+ <translation type="unfinished">密钥文件</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="198"/>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="245"/>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="289"/>
+ <source>Export Error</source>
+ <translation type="unfinished">导出错误</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="199"/>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="246"/>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="290"/>
+ <source>Couldn&apos;t open %1 for writing</source>
+ <translation type="unfinished">无法打开 %1 进行写入</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="207"/>
+ <source>Exporting short private Key</source>
+ <translation type="unfinished">导出短私钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="208"/>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="256"/>
+ <source>You are about to export your</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="257"/>
+ <source> PRIVATE KEY </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="258"/>
+ <source>This is NOT your Public Key, so DON&apos;T give it away.</source>
+ <translation type="unfinished">这不是你的公钥,所以不要把它给别人!</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="211"/>
+ <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="214"/>
+ <source>For OpenPGP keys it removes all signatures except for the latest self-signatures.</source>
+ <translation type="unfinished">对于 OpenPGP 密钥,它会删除除最新的自签名之外的所有签名。</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="255"/>
+ <source>Exporting private Key</source>
+ <translation type="unfinished">导出私钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="259"/>
+ <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="318"/>
+ <source>Revocation Certificates</source>
+ <translation type="unfinished">吊销证书</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="329"/>
+ <source>Generate revocation certificate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="350"/>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="360"/>
+ <source>Policy Auto</source>
+ <translation type="unfinished">策略:自动</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="350"/>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="362"/>
+ <source>Policy Good</source>
+ <translation type="unfinished">策略:正常</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="350"/>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="364"/>
+ <source>Policy Bad</source>
+ <translation type="unfinished">策略:异常</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="351"/>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="366"/>
+ <source>Policy Ask</source>
+ <translation type="unfinished">策略:咨询</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="351"/>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="368"/>
+ <source>Policy Unknown</source>
+ <translation type="unfinished">策略:未知</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="355"/>
+ <source>Modify TOFU Policy(Default is Auto)</source>
+ <translation type="unfinished">修改TOFU策略(默认为自动)</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="356"/>
+ <source>Policy for the Key Pair:</source>
+ <translation type="unfinished">密钥对策略:</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="374"/>
+ <source>Not Successful</source>
+ <translation type="unfinished">不成功</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairOperaTab.cpp" line="375"/>
+ <source>Modify TOFU policy not successfully.</source>
+ <translation type="unfinished">修改 TOFU 策略不成功。</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="67"/>
+ <source>Algorithm</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="161"/>
+ <source>Key Size</source>
+ <translation type="unfinished">密钥大小</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="71"/>
+ <source>Usage</source>
+ <translation type="unfinished">用法</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="74"/>
+ <source>Expires On (Local Time)</source>
+ <translation type="unfinished">到期时间(本地时间)</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="76"/>
+ <source>Create Date (Local Time)</source>
+ <translation type="unfinished">创建日期(本地时间)</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="77"/>
+ <source>Existence</source>
+ <translation type="unfinished">存在</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="80"/>
+ <source>Key in Smart Card</source>
+ <translation type="unfinished">在智能卡中</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="81"/>
+ <source>Fingerprint</source>
+ <translation type="unfinished">指纹</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="104"/>
+ <source>Copy</source>
+ <translation type="unfinished">复制</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="161"/>
+ <source>Subkey ID</source>
+ <translation type="unfinished">子密钥 ID</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="161"/>
+ <source>Algo</source>
+ <translation type="unfinished">算法</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="161"/>
+ <source>Create Date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="162"/>
+ <source>Expire Date</source>
+ <translation type="unfinished">到期日期</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="204"/>
+ <source>Never Expire</source>
+ <translation type="unfinished">永不过期</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="241"/>
+ <source>Never Expires</source>
+ <translation type="unfinished">永不过期</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="263"/>
+ <source>Certificate</source>
+ <translation type="unfinished">证书</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="265"/>
+ <source>Encrypt</source>
+ <translation type="unfinished">加密</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="266"/>
+ <source>Sign</source>
+ <translation type="unfinished">签名</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="267"/>
+ <source>Auth</source>
+ <translation type="unfinished">认证</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="272"/>
+ <source>Exists</source>
+ <translation type="unfinished">存在</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="273"/>
+ <source>Not Exists</source>
+ <translation type="unfinished">不存在</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="276"/>
+ <source>Yes</source>
+ <translation type="unfinished">是</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="276"/>
+ <source>No</source>
+ <translation type="unfinished">否</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp" line="305"/>
+ <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">新 UID</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">UID</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="75"/>
+ <source>TOFU</source>
+ <translation type="unfinished">TOFU</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="87"/>
+ <source>Signature of Selected UID</source>
+ <translation type="unfinished">所选 UID 的签名</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">TOFU %1</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="486"/>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="500"/>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="543"/>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="552"/>
+ <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">请在执行此操作前选择一个或多个 UID。</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="328"/>
+ <source>Sign Selected UID(s)</source>
+ <translation type="unfinished">签署选定的 UID</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="331"/>
+ <source>Delete Selected UID(s)</source>
+ <translation type="unfinished">删除选定的 UID</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">成功添加了新的 UID。</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="425"/>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="521"/>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="574"/>
+ <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="426"/>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="522"/>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="575"/>
+ <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">删除 UID</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">您确定要删除以下 UID 吗?</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="381"/>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="419"/>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="516"/>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="569"/>
+ <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">删除 %1 操作期间出错。</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="415"/>
+ <source>Set Primary UID</source>
+ <translation type="unfinished">设置主 UID</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="417"/>
+ <source>Are you sure that you want to set the Primary UID to?</source>
+ <translation type="unfinished">您确定要将主 UID 设置为吗?</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="457"/>
+ <source>Set As Primary</source>
+ <translation type="unfinished">设为主要</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="460"/>
+ <source>Sign UID</source>
+ <translation type="unfinished">签署 UID</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="463"/>
+ <source>Delete UID</source>
+ <translation type="unfinished">删除 UID</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="487"/>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="501"/>
+ <source>Please select one UID before doing this operation.</source>
+ <translation type="unfinished">请在执行此操作前选择一个 UID。</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="511"/>
+ <source>Deleting UID</source>
+ <translation type="unfinished">删除 UID</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="514"/>
+ <source>Are you sure that you want to delete the following uid?</source>
+ <translation type="unfinished">您确定要删除以下 UID 吗?</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="532"/>
+ <source>Delete(Revoke) Key Signature</source>
+ <translation type="unfinished">删除(撤销)密钥签名</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="544"/>
+ <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="553"/>
+ <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="564"/>
+ <source>Deleting Key Signature</source>
+ <translation type="unfinished">删除密钥签名</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyPairUIDTab.cpp" line="566"/>
+ <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="58"/>
+ <source>Close</source>
+ <translation type="unfinished">关闭</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="61"/>
+ <source>Import ALL</source>
+ <translation type="unfinished">全部导入</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="65"/>
+ <source>Search</source>
+ <translation type="unfinished">搜索</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="70"/>
+ <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"/>
+ <source>: </source>
+ <translation type="unfinished">:</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="74"/>
+ <source>Key Server</source>
+ <translation type="unfinished">密钥服务器</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="115"/>
+ <source>Import Keys from Keyserver</source>
+ <translation type="unfinished">从密钥服务器导入密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="155"/>
+ <source>UID</source>
+ <translation type="unfinished">UID</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="155"/>
+ <source>Creation date</source>
+ <translation type="unfinished">创建日期</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="155"/>
+ <source>KeyID</source>
+ <translation type="unfinished">密钥 ID</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="155"/>
+ <source>Tag</source>
+ <translation type="unfinished">标签</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="178"/>
+ <source>Text is empty.</source>
+ <translation type="unfinished">文字为空。</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="225"/>
+ <source>Not Key Found</source>
+ <translation type="unfinished">未找到密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="228"/>
+ <source>Timeout</source>
+ <translation type="unfinished">超时</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="231"/>
+ <source>Key Server Not Found</source>
+ <translation type="unfinished">未找到密钥服务器</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="234"/>
+ <source>Connection Error</source>
+ <translation type="unfinished">连接错误</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="244"/>
+ <source>Too many responses from keyserver!</source>
+ <translation type="unfinished">来自密钥服务器的响应太多!</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="254"/>
+ <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="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="306"/>
+ <source>revoked</source>
+ <translation type="unfinished">撤销</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="310"/>
+ <source>disabled</source>
+ <translation type="unfinished">被禁用</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/import_export/KeyServerImportDialog.cpp" line="355"/>
+ <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="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="74"/>
+ <source>Key not found in the Keyserver.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="77"/>
+ <source>Network connection timeout.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="81"/>
+ <source>Cannot resolve the address of target key server.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="84"/>
+ <source>General connection error occurred.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/thread/KeyServerImportTask.cpp" line="90"/>
+ <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="129"/>
+ <source>Modified Expiration Date (Local Time)</source>
+ <translation type="unfinished">修改到期日期(本地时间)</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeySetExpireDateDialog.cpp" line="130"/>
+ <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="134"/>
+ <source>No Expiration</source>
+ <translation type="unfinished">无有效期</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeySetExpireDateDialog.cpp" line="135"/>
+ <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="86"/>
+ <source>Expire Date</source>
+ <translation type="unfinished">到期日期</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyUIDSignDialog.cpp" line="96"/>
+ <source>Sign For Key&apos;s UID(s)</source>
+ <translation type="unfinished">为密钥的 UID 签名</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyUIDSignDialog.cpp" line="120"/>
+ <source>Unsuccessful Operation</source>
+ <translation type="unfinished">不成功的操作</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyUIDSignDialog.cpp" line="121"/>
+ <source>Signature operation failed for UID %1</source>
+ <translation type="unfinished">UID %1 的签名操作失败</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyUIDSignDialog.cpp" line="126"/>
+ <source>Operation Complete</source>
+ <translation type="unfinished">操作完成</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/keypair_details/KeyUIDSignDialog.cpp" line="127"/>
+ <source>The signature operation of the UID is complete</source>
+ <translation type="unfinished">UID的签名操作完成</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="139"/>
+ <source>Key Not Found</source>
+ <translation type="unfinished">未找到密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="142"/>
+ <source>Timeout</source>
+ <translation type="unfinished">超时</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="145"/>
+ <source>Key Server Not Found</source>
+ <translation type="unfinished">未找到密钥服务器</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="148"/>
+ <source>Connection Error</source>
+ <translation type="unfinished">连接错误</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="153"/>
+ <source>Upload Success</source>
+ <translation type="unfinished">上传成功</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/import_export/KeyUploadDialog.cpp" line="154"/>
+ <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">出于安全原因,不建议使用 HTTP 作为与密钥服务器的通信协议。建议使用HTTPS。</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">通常不会使用HTTPS或HTTP作为与密钥服务器通信的协议。当然,您可能需要这么做。但是,烦请您再次检查您输入的地址。您确定要将其添加到密钥服务器列表中吗?</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">设置 TCP 超时</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="165"/>
+ <location filename="../../../../src/ui/main_window/MainWindow.cpp" line="168"/>
+ <source>Critical error occur while loading GpgFrontend.</source>
+ <translation type="unfinished">加载 GpgFrontend 时发生严重错误。</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindow.cpp" line="167"/>
+ <source>Loading Failed</source>
+ <translation type="unfinished">加载失败</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="47"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="74"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="156"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="183"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="266"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="285"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="314"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="332"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="361"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="433"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="469"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="510"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="551"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="612"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="653"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="715"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="725"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="781"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="792"/>
+ <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="96"/>
+ <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="116"/>
+ <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="132"/>
+ <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="148"/>
+ <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="161"/>
+ <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="174"/>
+ <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="189"/>
+ <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="242"/>
+ <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="250"/>
+ <source>Error</source>
+ <translation type="unfinished">错误</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="48"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="157"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="267"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="315"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="362"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="434"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="511"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="613"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="716"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="782"/>
+ <source>Cannot read from file: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="62"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="171"/>
+ <source>The target 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="65"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="174"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="275"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="322"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="399"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="558"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="660"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="732"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="799"/>
+ <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="184"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="286"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="333"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="552"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="654"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="726"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="793"/>
+ <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="193"/>
+ <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="53"/>
+ <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="194"/>
+ <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="62"/>
+ <source>Symmetrically Encrypting</source>
+ <translation type="unfinished">对称加密</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="123"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="233"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="532"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="634"/>
+ <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="268"/>
+ <source>Invalid KeyPair</source>
+ <translation type="unfinished">无效的密钥对</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="124"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="234"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="533"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="635"/>
+ <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="269"/>
+ <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="125"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="235"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="534"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="636"/>
+ <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="100"/>
+ <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="155"/>
+ <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="270"/>
+ <source>For example the Following Key:</source>
+ <translation type="unfinished">例如以下密钥:</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="132"/>
+ <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="108"/>
+ <source>Encrypting</source>
+ <translation type="unfinished">加密</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="200"/>
+ <source>Archiving &amp; Symmetrically Encrypting</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="242"/>
+ <source>Archiving &amp; Encrypting</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="276"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="323"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="559"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="661"/>
+ <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="291"/>
+ <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="196"/>
+ <source>Decrypting</source>
+ <translation type="unfinished">解密</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="338"/>
+ <source>Decrypting &amp; Extrating</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="372"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="521"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="623"/>
+ <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="142"/>
+ <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="256"/>
+ <source>No Key Checked</source>
+ <translation type="unfinished">未检查密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="373"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="522"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="624"/>
+ <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="143"/>
+ <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="380"/>
+ <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="96"/>
+ <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="151"/>
+ <source>Invalid Operation</source>
+ <translation type="unfinished">无效操作</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="381"/>
+ <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="383"/>
+ <source>for example the Following Key:</source>
+ <translation type="unfinished">例如以下密钥:</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="400"/>
+ <source>The signature file &quot;%1&quot; exists, do you need to overwrite it?</source>
+ <translation type="unfinished">签名文件“%1”存在,是否需要覆盖?</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="409"/>
+ <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="164"/>
+ <source>Signing</source>
+ <translation type="unfinished">签名</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="455"/>
+ <source>File to be Verified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="456"/>
+ <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="470"/>
+ <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="479"/>
+ <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="229"/>
+ <source>Verifying</source>
+ <translation type="unfinished">验证</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="577"/>
+ <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="299"/>
+ <source>Encrypting and Signing</source>
+ <translation type="unfinished">加密和签名</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="679"/>
+ <source>Archiving &amp; Encrypting &amp; Signing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="733"/>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="800"/>
+ <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="742"/>
+ <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="345"/>
+ <source>Decrypting and Verifying</source>
+ <translation type="unfinished">解密和验证</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowFileSlotFunction.cpp" line="809"/>
+ <source>Decrypting &amp; Verifying &amp; Extracting</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowGpgOperaFunction.cpp" line="54"/>
+ <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="97"/>
+ <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="152"/>
+ <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="257"/>
+ <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="96"/>
+ <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="116"/>
+ <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="132"/>
+ <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="148"/>
+ <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="161"/>
+ <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="174"/>
+ <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="189"/>
+ <source>Key Not Found.</source>
+ <translation type="unfinished">未找到密钥。</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="101"/>
+ <source> (Local Time) </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="243"/>
+ <source>Cannot open this file. Please make sure that this is a regular file and it&apos;s readable.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="251"/>
+ <source>Cannot open this file. The file is TOO LARGE (&gt;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">GpgFrontend 可升级(新版本:%1)。</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="309"/>
+ <source>Withdrawn Version</source>
+ <translation type="unfinished">被召回的版本</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="311"/>
+ <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="316"/>
+ <source>You can download the latest stable version(%1) on Github Releases Page.&lt;br/&gt;</source>
+ <translation type="unfinished">您可以在 Github Releases Page 上下载最新的稳定版 (%1)。&lt;br/&gt;</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowSlotFunction.cpp" line="322"/>
+ <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="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="87"/>
+ <source>Close file</source>
+ <translation type="unfinished">关闭文件</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="90"/>
+ <source>Quit</source>
+ <translation type="unfinished">退出</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="93"/>
+ <source>Quit Program</source>
+ <translation type="unfinished">退出程序</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="98"/>
+ <source>Undo</source>
+ <translation type="unfinished">撤消</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="100"/>
+ <source>Undo Last Edit Action</source>
+ <translation type="unfinished">撤消上次编辑操作</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="103"/>
+ <source>Redo</source>
+ <translation type="unfinished">重做</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="105"/>
+ <source>Redo Last Edit Action</source>
+ <translation type="unfinished">重做上次编辑操作</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="108"/>
+ <source>Zoom In</source>
+ <translation type="unfinished">放大</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="112"/>
+ <source>Zoom Out</source>
+ <translation type="unfinished">缩小</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="116"/>
+ <source>Paste</source>
+ <translation type="unfinished">粘贴</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="119"/>
+ <source>Paste Text From Clipboard</source>
+ <translation type="unfinished">从剪贴板粘贴文本</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="122"/>
+ <source>Cut</source>
+ <translation type="unfinished">剪切</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="126"/>
+ <source>Cut the current selection&apos;s contents to the clipboard</source>
+ <translation type="unfinished">将当前选择的内容剪切到剪贴板</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="130"/>
+ <source>Copy</source>
+ <translation type="unfinished">复制</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="134"/>
+ <source>Copy the current selection&apos;s contents to the clipboard</source>
+ <translation type="unfinished">将当前选择的内容复制到剪贴板</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="138"/>
+ <source>Quote</source>
+ <translation type="unfinished">引用</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="140"/>
+ <source>Quote whole text</source>
+ <translation type="unfinished">引用全文</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="143"/>
+ <source>Select All</source>
+ <translation type="unfinished">全选</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="146"/>
+ <source>Select the whole text</source>
+ <translation type="unfinished">选择整个文本</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="150"/>
+ <source>Find</source>
+ <translation type="unfinished">查找</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="152"/>
+ <source>Find a word</source>
+ <translation type="unfinished">找一个词</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="155"/>
+ <source>Remove spacing</source>
+ <translation type="unfinished">删除间距</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="160"/>
+ <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"/>
+ <source>Settings</source>
+ <translation type="unfinished">设置</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="165"/>
+ <source>Open settings dialog</source>
+ <translation type="unfinished">打开设置对话框</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="173"/>
+ <source>Encrypt</source>
+ <translation type="unfinished">加密</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="177"/>
+ <source>Encrypt Message</source>
+ <translation type="unfinished">加密消息</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="195"/>
+ <source>Encrypt Sign</source>
+ <translation type="unfinished">加密签名</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="200"/>
+ <source>Encrypt and Sign Message</source>
+ <translation type="unfinished">加密和签名消息</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="218"/>
+ <source>Decrypt</source>
+ <translation type="unfinished">解密</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="221"/>
+ <source>Decrypt Message</source>
+ <translation type="unfinished">解密消息</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="243"/>
+ <source>Decrypt Verify</source>
+ <translation type="unfinished">解密验证</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="247"/>
+ <source>Decrypt and Verify Message</source>
+ <translation type="unfinished">解密和验证消息</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="269"/>
+ <source>Sign</source>
+ <translation type="unfinished">签名</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="272"/>
+ <source>Sign Message</source>
+ <translation type="unfinished">签名留言</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="284"/>
+ <source>Verify</source>
+ <translation type="unfinished">验证</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="287"/>
+ <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="534"/>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="608"/>
+ <source>File</source>
+ <translation type="unfinished">文件</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="304"/>
+ <source>Import New Key From File</source>
+ <translation type="unfinished">从文件导入新密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="308"/>
+ <source>Clipboard</source>
+ <translation type="unfinished">剪贴板</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="312"/>
+ <source>Import New Key From Clipboard</source>
+ <translation type="unfinished">从剪贴板导入新密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="323"/>
+ <source>Keyserver</source>
+ <translation type="unfinished">密钥服务器</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="327"/>
+ <source>Import New Key From Keyserver</source>
+ <translation type="unfinished">从密钥服务器导入新密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="333"/>
+ <source>Editor</source>
+ <translation type="unfinished">编辑</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="335"/>
+ <source>Import New Key From Editor</source>
+ <translation type="unfinished">从编辑器导入新密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="339"/>
+ <source>Manage Keys</source>
+ <translation type="unfinished">管理密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="341"/>
+ <source>Open Key Management</source>
+ <translation type="unfinished">打开密钥管理器</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="345"/>
+ <source>Clear Password Cache</source>
+ <translation type="unfinished">清除密码缓存</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="348"/>
+ <source>Clear Password Cache of GnuPG</source>
+ <translation type="unfinished">清除 GnuPG 的密码缓存</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="351"/>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="365"/>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="385"/>
+ <source>Successful Operation</source>
+ <translation type="unfinished">操作成功</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="352"/>
+ <source>Clear password cache successfully</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="369"/>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="389"/>
+ <source>Failed Operation</source>
+ <translation type="unfinished">操作失败</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="355"/>
+ <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="359"/>
+ <source>Reload All Components</source>
+ <translation type="unfinished">重新加载所有组件</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="361"/>
+ <source>Reload All GnuPG&apos;s Components</source>
+ <translation type="unfinished">重新加载所有 GnuPG 的组件</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="366"/>
+ <source>Reload all the GnuPG&apos;s components successfully</source>
+ <translation type="unfinished">成功重新加载所有 GnuPG 组件</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="370"/>
+ <source>Failed to reload all or one of the GnuPG&apos;s component(s)</source>
+ <translation type="unfinished">未能重新加载所有或其中一个 GnuPG 组件</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="374"/>
+ <source>Restart All Components</source>
+ <translation type="unfinished">重新启动所有组件</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="376"/>
+ <source>Restart All GnuPG&apos;s Components</source>
+ <translation type="unfinished">重新启动所有 GnuPG 的组件</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="386"/>
+ <source>Restart all the GnuPG&apos;s components successfully</source>
+ <translation type="unfinished">成功重启所有 GnuPG 组件</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="390"/>
+ <source>Failed to restart all or one of the GnuPG&apos;s component(s)</source>
+ <translation type="unfinished">无法重新启动所有或其中一个 GnuPG 组件</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="395"/>
+ <source>Open GnuPG Controller</source>
+ <translation type="unfinished">打开 GnuPG 控制器</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="397"/>
+ <source>Open GnuPG Controller Dialog</source>
+ <translation type="unfinished">打开 GnuPG 控制器对话框</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="404"/>
+ <source>About</source>
+ <translation type="unfinished">关于</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="406"/>
+ <source>Show the application&apos;s About box</source>
+ <translation type="unfinished">显示应用程序的关于界面</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="411"/>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="584"/>
+ <source>GnuPG</source>
+ <translation type="unfinished">GnuPG</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="413"/>
+ <source>Information about Gnupg</source>
+ <translation type="unfinished">关于 Gnupg</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="417"/>
+ <source>Translate</source>
+ <translation type="unfinished">翻译</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="419"/>
+ <source>Information about translation</source>
+ <translation type="unfinished">翻译信息</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="426"/>
+ <source>Check for Updates</source>
+ <translation type="unfinished">检查更新</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="428"/>
+ <source>Check for updates</source>
+ <translation type="unfinished">检查更新</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="432"/>
+ <source>Open Wizard</source>
+ <translation type="unfinished">打开向导</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="433"/>
+ <source>Open the wizard</source>
+ <translation type="unfinished">打开向导</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="438"/>
+ <source>Append Public Key to Editor</source>
+ <translation type="unfinished">将公钥附加到编辑器</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="440"/>
+ <source>Append selected Keypair&apos;s Public Key to Editor</source>
+ <translation type="unfinished">将选定的密钥对的公钥附加到编辑器</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="445"/>
+ <source>Append Create DateTime to Editor</source>
+ <translation type="unfinished">将创建日期时间附加到编辑器</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="447"/>
+ <source>Append selected Key&apos;s creation date and time to Editor</source>
+ <translation type="unfinished">将所选密钥的创建日期和时间附加到编辑器</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="452"/>
+ <source>Append Expire DateTime to Editor</source>
+ <translation type="unfinished">将过期日期时间附加到编辑器</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="454"/>
+ <source>Append selected Key&apos;s expiration date and time to Editor</source>
+ <translation type="unfinished">将所选密钥的到期日期和时间附加到编辑器</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="459"/>
+ <source>Append Fingerprint to Editor</source>
+ <translation type="unfinished">将指纹附加到编辑器</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="461"/>
+ <source>Append selected Key&apos;s Fingerprint to Editor</source>
+ <translation type="unfinished">将所选密钥的指纹附加到编辑器</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="465"/>
+ <source>Copy Email</source>
+ <translation type="unfinished">复制电子邮件</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="467"/>
+ <source>Copy selected Keypair&apos;s to clipboard</source>
+ <translation type="unfinished">将选定的密钥对复制到剪贴板</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="472"/>
+ <source>Copy Default UID</source>
+ <translation type="unfinished">复制默认 UID</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="474"/>
+ <source>Copy selected Keypair&apos;s default UID to clipboard</source>
+ <translation type="unfinished">将所选密钥对的默认 UID 复制到剪贴板</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="478"/>
+ <source>Copy Key ID</source>
+ <translation type="unfinished">复制密钥 ID</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="480"/>
+ <source>Copy selected Keypair&apos;s ID to clipboard</source>
+ <translation type="unfinished">将所选密钥对的 ID 复制到剪贴板</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="484"/>
+ <source>Show Key Details</source>
+ <translation type="unfinished">显示密钥细节</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="485"/>
+ <source>Show Details for this Key</source>
+ <translation type="unfinished">显示此密钥的详细信息</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="489"/>
+ <source>Add To Favourite</source>
+ <translation type="unfinished">添加到收藏夹</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="490"/>
+ <source>Add this key to Favourite Table</source>
+ <translation type="unfinished">将此键添加到收藏夹表</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="496"/>
+ <source>Remove From Favourite</source>
+ <translation type="unfinished">从收藏夹中删除</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="498"/>
+ <source>Remove this key from Favourite Table</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="505"/>
+ <source>Set Owner Trust Level</source>
+ <translation type="unfinished">设置所有者信任级别</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="524"/>
+ <source>Remove PGP Header</source>
+ <translation type="unfinished">删除 PGP 标头</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="528"/>
+ <source>Add PGP Header</source>
+ <translation type="unfinished">添加 PGP 标头</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="547"/>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="630"/>
+ <source>Edit</source>
+ <translation type="unfinished">编辑</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="565"/>
+ <source>Crypt</source>
+ <translation type="unfinished">加密</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="575"/>
+ <source>Keys</source>
+ <translation type="unfinished">密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="576"/>
+ <source>Import Key</source>
+ <translation type="unfinished">导入密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="592"/>
+ <source>Steganography</source>
+ <translation type="unfinished">隐写术</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="596"/>
+ <source>View</source>
+ <translation type="unfinished">查看</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="598"/>
+ <source>Help</source>
+ <translation type="unfinished">帮助</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="615"/>
+ <source>Operations</source>
+ <translation type="unfinished">操作</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="625"/>
+ <source>Key</source>
+ <translation type="unfinished">密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="638"/>
+ <source>Special Edit</source>
+ <translation type="unfinished">特殊编辑操作</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="650"/>
+ <source>Import key from...</source>
+ <translation type="unfinished">从...导入密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="651"/>
+ <source>Import key</source>
+ <translation type="unfinished">导入密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="667"/>
+ <source>Ready</source>
+ <translation type="unfinished">准备好</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="674"/>
+ <source>Key ToolBox</source>
+ <translation type="unfinished">密钥工具箱</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="682"/>
+ <source>Default</source>
+ <translation type="unfinished">默认</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="690"/>
+ <source>Favourite</source>
+ <translation type="unfinished">最喜欢的</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="698"/>
+ <source>Only Public Key</source>
+ <translation type="unfinished">只有公钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="708"/>
+ <source>Has Private Key</source>
+ <translation type="unfinished">有私钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/main_window/MainWindowUI.cpp" line="722"/>
+ <source>Information Board</source>
+ <translation type="unfinished">信息面板</translation>
+ </message>
+</context>
+<context>
+ <name>GpgFrontend::UI::NetworkTab</name>
+ <message>
+ <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="71"/>
+ <source>Proxy</source>
+ <translation type="unfinished">代理</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="72"/>
+ <source>Network Ability</source>
+ <translation type="unfinished">网络能力</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="73"/>
+ <source>Operations</source>
+ <translation type="unfinished">操作</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="75"/>
+ <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"/>
+ <source>Port</source>
+ <translation type="unfinished">端口</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="78"/>
+ <source>Host Address</source>
+ <translation type="unfinished">地址</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="80"/>
+ <source>Proxy Type</source>
+ <translation type="unfinished">代理类型</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="81"/>
+ <source>Username</source>
+ <translation type="unfinished">用户名</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="82"/>
+ <source>Password</source>
+ <translation type="unfinished">密码</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="85"/>
+ <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"/>
+ <source>Forbid all GnuPG network connection.</source>
+ <translation type="unfinished">禁止所有 GnuPG 网络连接。</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="90"/>
+ <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"/>
+ <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"/>
+ <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"/>
+ <source>Test Server Url Accessibility</source>
+ <translation type="unfinished">测试服务器 URL 连通性</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="171"/>
+ <source>Server Url</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="181"/>
+ <source>Success</source>
+ <translation type="unfinished">成功</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="182"/>
+ <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"/>
+ <source>Failed</source>
+ <translation type="unfinished">失败</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="187"/>
+ <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"/>
+ <source>Test Proxy Server Connection...</source>
+ <translation type="unfinished">测试代理服务器连接...</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/settings/SettingsNetwork.cpp" line="198"/>
+ <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>
+</context>
+<context>
+ <name>GpgFrontend::UI::PlainTextEditorPage</name>
+ <message>
+ <location filename="../../../../src/ui/widgets/PlainTextEditorPage.cpp" line="54"/>
+ <source>0 character</source>
+ <translation type="unfinished">0 个字符</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/PlainTextEditorPage.cpp" line="63"/>
+ <location filename="../../../../src/ui/widgets/PlainTextEditorPage.cpp" line="198"/>
+ <source>%1 character(s)</source>
+ <translation type="unfinished">%1 个字符</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">UTF-8</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.&lt;br/&gt;Save the changes before closing?</source>
+ <translation type="unfinished">%1 个文件包含未保存的信息。&lt;br/&gt;要在关闭前保存更改吗?</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&apos;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="65"/>
+ <source>Repeat PIN:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/function/RaisePinentry.cpp" line="66"/>
+ <source>Show passphrase</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/function/RaisePinentry.cpp" line="66"/>
+ <source>Hide passphrase</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/function/RaisePinentry.cpp" line="69"/>
+ <source>Given PIN was wrong. Please retry.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/function/RaisePinentry.cpp" line="72"/>
+ <source>PIN:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/function/RaisePinentry.cpp" line="82"/>
+ <source>Passphrases do not match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/function/RaisePinentry.cpp" line="85"/>
+ <source>Caps Lock is on</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/function/RaisePinentry.cpp" line="89"/>
+ <source>Buddled Pinentry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/function/RaisePinentry.cpp" line="93"/>
+ <source>Confirm</source>
+ <translation type="unfinished">确认</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/function/RaisePinentry.cpp" line="94"/>
+ <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="54"/>
+ <source>General</source>
+ <translation type="unfinished">通用</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="55"/>
+ <source>Appearance</source>
+ <translation type="unfinished">显示</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="56"/>
+ <source>Key Server</source>
+ <translation type="unfinished">密钥服务器</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="57"/>
+ <source>Network</source>
+ <translation type="unfinished">网络</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="68"/>
+ <source>Settings</source>
+ <translation type="unfinished">设置</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="72"/>
+ <source>Preference</source>
+ <translation type="unfinished">偏好</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/settings/SettingsDialog.cpp" line="128"/>
+ <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="66"/>
+ <source>Tipps: if the key pair has a passphrase, the subkey&apos;s passphrase must be equal to it.</source>
+ <translation type="unfinished">提示:如果密钥对有密码,则子密钥的密码必须与其相等。</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/key_generate/SubkeyGenerateDialog.cpp" line="79"/>
+ <source>Generate New Subkey</source>
+ <translation type="unfinished">生成新子密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/key_generate/SubkeyGenerateDialog.cpp" line="92"/>
+ <source>Key Usage</source>
+ <translation type="unfinished">密钥使用</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/key_generate/SubkeyGenerateDialog.cpp" line="94"/>
+ <source>Encryption</source>
+ <translation type="unfinished">加密</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/key_generate/SubkeyGenerateDialog.cpp" line="97"/>
+ <source>Signing</source>
+ <translation type="unfinished">签名</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/key_generate/SubkeyGenerateDialog.cpp" line="100"/>
+ <source>Certification</source>
+ <translation type="unfinished">认证</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/key_generate/SubkeyGenerateDialog.cpp" line="103"/>
+ <source>Authentication</source>
+ <translation type="unfinished">验证</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/key_generate/SubkeyGenerateDialog.cpp" line="147"/>
+ <source>Key Type</source>
+ <translation type="unfinished">密钥类型</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/key_generate/SubkeyGenerateDialog.cpp" line="148"/>
+ <source>KeySize (in Bit)</source>
+ <translation type="unfinished">密钥大小(以位为单位)</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/key_generate/SubkeyGenerateDialog.cpp" line="149"/>
+ <source>Expiration Date</source>
+ <translation type="unfinished">截止日期</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/key_generate/SubkeyGenerateDialog.cpp" line="150"/>
+ <source>Never Expire</source>
+ <translation type="unfinished">永不过期</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/key_generate/SubkeyGenerateDialog.cpp" line="151"/>
+ <source>Non Pass Phrase</source>
+ <translation type="unfinished">不设置密码</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/key_generate/SubkeyGenerateDialog.cpp" line="161"/>
+ <source>Basic Information</source>
+ <translation type="unfinished">基本信息</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/key_generate/SubkeyGenerateDialog.cpp" line="274"/>
+ <source>Expiration time no more than 2 years.</source>
+ <translation type="unfinished">有效期不超过2年。</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/key_generate/SubkeyGenerateDialog.cpp" line="289"/>
+ <source>Generating</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="144"/>
+ <location filename="../../../../src/ui/widgets/TextEdit.cpp" line="203"/>
+ <location filename="../../../../src/ui/widgets/TextEdit.cpp" line="423"/>
+ <location filename="../../../../src/ui/widgets/TextEdit.cpp" line="462"/>
+ <source>Warning</source>
+ <translation type="unfinished">警告</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/TextEdit.cpp" line="145"/>
+ <location filename="../../../../src/ui/widgets/TextEdit.cpp" line="204"/>
+ <location filename="../../../../src/ui/widgets/TextEdit.cpp" line="424"/>
+ <source>Cannot read file %1:
+%2.</source>
+ <translation type="unfinished">无法读取文件 %1:
+%2。</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/TextEdit.cpp" line="153"/>
+ <source>Open file</source>
+ <translation type="unfinished">打开文件</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/TextEdit.cpp" line="223"/>
+ <source>Save file</source>
+ <translation type="unfinished">保存存档</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/TextEdit.cpp" line="284"/>
+ <source>Unsaved document</source>
+ <translation type="unfinished">未保存的文件</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/TextEdit.cpp" line="285"/>
+ <source>The document &quot;%1&quot; has been modified. Do you want to save your changes?</source>
+ <translation type="unfinished">文档“%1”已被修改。是否要保存更改?</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/TextEdit.cpp" line="288"/>
+ <source>Note:</source>
+ <translation type="unfinished">笔记:</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/TextEdit.cpp" line="289"/>
+ <source>If you don&apos;t save these files, all changes are lost.</source>
+ <translation type="unfinished">如果您不保存这些文件,所有更改都将丢失。</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/TextEdit.cpp" line="462"/>
+ <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="142"/>
+ <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="165"/>
+ <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="168"/>
+ <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="174"/>
+ <source>Current Version</source>
+ <translation type="unfinished">当前版本</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="175"/>
+ <source>: </source>
+ <translation type="unfinished">:</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="257"/>
+ <source>Latest Version From Github</source>
+ <translation type="unfinished">来自 Github 的最新版本</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="263"/>
+ <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="265"/>
+ <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="276"/>
+ <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="288"/>
+ <source>Please click</source>
+ <translation type="unfinished">请点击</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="268"/>
+ <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="279"/>
+ <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="291"/>
+ <source>Here</source>
+ <translation type="unfinished">这里</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="268"/>
+ <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="279"/>
+ <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="291"/>
+ <source>to download the latest stable version.</source>
+ <translation type="unfinished">来下载最新的稳定版本。</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/help/AboutDialog.cpp" line="274"/>
+ <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="285"/>
+ <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="38"/>
+ <source>Signatures Details</source>
+ <translation type="unfinished">签名详情</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/details/VerifyDetailsDialog.cpp" line="61"/>
+ <source>No valid input found</source>
+ <translation type="unfinished">找不到有效的输入</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/details/VerifyDetailsDialog.cpp" line="71"/>
+ <source>Error Validating signature</source>
+ <translation type="unfinished">验证签名时出错</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/details/VerifyDetailsDialog.cpp" line="73"/>
+ <source>File was signed on %1</source>
+ <translation type="unfinished">文件已在 %1 上签名</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/dialog/details/VerifyDetailsDialog.cpp" line="75"/>
+ <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">已在 %1 上签名</translation>
+ </message>
+</context>
+<context>
+ <name>GpgFrontend::UI::VerifyKeyDetailBox</name>
+ <message>
+ <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="53"/>
+ <source>Import from keyserver</source>
+ <translation type="unfinished">从密钥服务器导入</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="58"/>
+ <source>Key not present with id 0x</source>
+ <translation type="unfinished">不存在 ID 为 0x 的密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="62"/>
+ <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="88"/>
+ <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="104"/>
+ <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="120"/>
+ <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="122"/>
+ <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="138"/>
+ <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="153"/>
+ <source>Status</source>
+ <translation type="unfinished">状态</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="62"/>
+ <source>:</source>
+ <translation type="unfinished">:</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="64"/>
+ <source>Key not present in key list</source>
+ <translation type="unfinished">密钥不在密钥列表中</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="72"/>
+ <source>A Signature</source>
+ <translation type="unfinished">一个签名</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="77"/>
+ <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="93"/>
+ <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="109"/>
+ <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="127"/>
+ <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="143"/>
+ <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="158"/>
+ <source>Key Information is NOT Available</source>
+ <translation type="unfinished">密钥信息不可用</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="79"/>
+ <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="95"/>
+ <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="111"/>
+ <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="129"/>
+ <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="145"/>
+ <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="160"/>
+ <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="104"/>
+ <source>Signature Expired</source>
+ <translation type="unfinished">签名过期</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="120"/>
+ <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="122"/>
+ <source>Key Expired</source>
+ <translation type="unfinished">密钥过期</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="138"/>
+ <source>General Error</source>
+ <translation type="unfinished">一般错误</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="153"/>
+ <source>Unknown Error </source>
+ <translation type="unfinished">未知错误</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="183"/>
+ <source>Signer Name</source>
+ <translation type="unfinished">签名者姓名</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="184"/>
+ <source>Signer Email</source>
+ <translation type="unfinished">签名者电子邮件</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="185"/>
+ <source>Key&apos;s Fingerprint</source>
+ <translation type="unfinished">密钥的指纹</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="186"/>
+ <source>Valid</source>
+ <translation type="unfinished">有效的</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="187"/>
+ <source>Flags</source>
+ <translation type="unfinished">标志</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="194"/>
+ <source>Fully Valid</source>
+ <translation type="unfinished">完全有效</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="196"/>
+ <source>NOT Fully Valid</source>
+ <translation type="unfinished">不完全有效</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="203"/>
+ <source>Good</source>
+ <translation type="unfinished">正常</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="206"/>
+ <source>Bad</source>
+ <translation type="unfinished">异常</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="209"/>
+ <source>Expired</source>
+ <translation type="unfinished">已到期</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="212"/>
+ <source>Missing Key</source>
+ <translation type="unfinished">缺少密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="215"/>
+ <source>Revoked Key</source>
+ <translation type="unfinished">撤销密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="218"/>
+ <source>Expired Key</source>
+ <translation type="unfinished">过期密钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/widgets/VerifyKeyDetailBox.cpp" line="221"/>
+ <source>Missing CRL</source>
+ <translation type="unfinished">缺少 CRL</translation>
+ </message>
+</context>
+<context>
+ <name>GpgFrontend::UI::Wizard</name>
+ <message>
+ <location filename="../../../../src/ui/dialog/Wizard.cpp" line="44"/>
+ <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>QObject</name>
+ <message>
+ <location filename="../../../../src/cmd.cpp" line="49"/>
+ <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"/>
+ <source>Build Timestamp: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../src/cmd.cpp" line="55"/>
+ <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="196"/>
+ <source>GpgME inilization failed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../src/core/GpgCoreInit.cpp" line="320"/>
+ <source>GpgME Context inilization failed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../src/core/GpgCoreInit.cpp" line="329"/>
+ <source>Gpg Key Detabase inilization failed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../src/core/utils/IOUtils.cpp" line="75"/>
+ <source>File Hash Information</source>
+ <translation type="unfinished">文件哈希信息</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/core/utils/IOUtils.cpp" line="76"/>
+ <source>filename</source>
+ <translation type="unfinished">文档名称</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/core/utils/IOUtils.cpp" line="76"/>
+ <location filename="../../../../src/core/utils/IOUtils.cpp" line="83"/>
+ <location filename="../../../../src/core/utils/IOUtils.cpp" line="92"/>
+ <location filename="../../../../src/core/utils/IOUtils.cpp" line="100"/>
+ <location filename="../../../../src/core/utils/IOUtils.cpp" line="108"/>
+ <source>: </source>
+ <translation type="unfinished">:</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/core/utils/IOUtils.cpp" line="83"/>
+ <source>file size(bytes)</source>
+ <translation type="unfinished">文件大小(字节)</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/core/utils/IOUtils.cpp" line="113"/>
+ <source>Error in Calculating File Hash </source>
+ <translation type="unfinished">计算文件哈希时出错</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/core/utils/IOUtils.cpp" line="137"/>
+ <source>target path doesn&apos;t exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../src/core/utils/IOUtils.cpp" line="142"/>
+ <source>do NOT have permission to write path</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../src/core/utils/IOUtils.cpp" line="147"/>
+ <source>do NOT have permission to read/write file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../../src/core/utils/IOUtils.cpp" line="150"/>
+ <source>Success</source>
+ <translation type="unfinished">成功</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/GpgFrontendUIInit.cpp" line="53"/>
+ <source>Loading Gnupg Info...</source>
+ <translation type="unfinished">正在加载 Gnupg 信息...</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/GpgFrontendUIInit.cpp" line="54"/>
+ <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="66"/>
+ <source>Show Verify Details</source>
+ <translation type="unfinished">显示验证详细信息</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="75"/>
+ <source>Public key not found locally</source>
+ <translation type="unfinished">本地未找到公钥</translation>
+ </message>
+ <message>
+ <location filename="../../../../src/ui/UserInterfaceUtils.cpp" line="76"/>
+ <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>
+</context>
+</TS>
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index cedb2dae..1b06ec33 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -58,7 +58,7 @@ find_package(OpenSSL REQUIRED)
# Introduce Qt
# Support Qt version: 6.x
-find_package(Qt6 6 COMPONENTS Core Test Widgets PrintSupport Network Core5Compat Concurrent REQUIRED)
+find_package(Qt6 6 COMPONENTS Core Test Widgets PrintSupport Network Core5Compat LinguistTools REQUIRED)
# Qt configuration
set(CMAKE_AUTOMOC ON)
@@ -128,50 +128,6 @@ if (BUILD_APPLICATION)
endif ()
endif ()
-# Get ALL SOURCE FILES
-file(GLOB_RECURSE ALL_SOURCE_FILES RELACTIVE ${CMAKE_SOURCE_DIR}/src/*.cpp)
-
-# i18n
-message(STATUS "Build Multiply Languages Support")
-# Set Translation Files
-find_package(Gettext REQUIRED)
-FIND_PROGRAM(GETTEXT_MSGFMT_EXECUTABLE msgfmt)
-FIND_PROGRAM(GETTEXT_XGETTEXT_EXECUTABLE xgettext)
-
-set(LOCALE_OUTPUT_PATH ${RESOURCE_OUTPUT_DIRECTORY}/locales)
-
-if (NOT GETTEXT_MSGFMT_EXECUTABLE OR NOT GETTEXT_XGETTEXT_EXECUTABLE)
- message(ERROR "msgfmt or xgettext not found. Translations will *not* be installed")
-else()
- message(STATUS "Setting target translations")
- add_custom_target(translations)
- set(OUTPUT_POT_PATH ${CMAKE_SOURCE_DIR}/resource/lfs/locale/template/${PROJECT_NAME}.pot)
- add_custom_command(
- TARGET translations
- COMMAND find ${CMAKE_SOURCE_DIR}/src -iname \"*.cpp\" | xargs xgettext --package-name=${PROJECT_NAME} --copyright-holder=Saturneric --package-version=${PROJECT_VERSION} [email protected] --add-comments="/*" --c++ -k_ -o ${OUTPUT_POT_PATH}
- )
-
- file(GLOB ALL_PO_FILES ${CMAKE_SOURCE_DIR}/resource/lfs/locale/po/*.po)
- SET(GMO_FILES)
-
- foreach (_poFile ${ALL_PO_FILES})
- GET_FILENAME_COMPONENT(_poFileName ${_poFile} NAME)
- string(REGEX REPLACE "\\.[^.]*$" "" _langName ${_poFileName})
- message(STATUS "GNU gettext po file ${_langName}")
- make_directory(${RESOURCE_OUTPUT_DIRECTORY}/locales)
- make_directory(${RESOURCE_OUTPUT_DIRECTORY}/locales/${_langName}/LC_MESSAGES)
- add_custom_command(
- TARGET translations
- COMMAND echo Processing po LANG ${_langName}
- )
- add_custom_command(
- TARGET translations
- COMMAND msgfmt --check --verbose --output-file ${LOCALE_OUTPUT_PATH}/${_langName}/LC_MESSAGES/GpgFrontend.mo ${_poFile}
- )
- endforeach ()
-endif ()
-
-
if (BASIC_ENV_CONFIG)
# Set Build Information
configure_file(${CMAKE_SOURCE_DIR}/src/GpgFrontend.h.in ${CMAKE_SOURCE_DIR}/src/GpgFrontend.h @ONLY)
@@ -187,9 +143,6 @@ if (BUILD_APPLICATION)
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)
- if (GPG_STANDALONE_MODE)
- file(COPY ${CMAKE_SOURCE_DIR}/resource/gpg1.4 DESTINATION ${RESOURCE_OUTPUT_DIRECTORY}/ FOLLOW_SYMLINK_CHAIN)
- endif ()
endif ()
if (BUILD_APPLICATION)
@@ -352,7 +305,6 @@ endif ()
if (BUILD_APPLICATION)
set(RESOURCE_FILES ${CMAKE_SOURCE_DIR}/gpgfrontend.qrc ${APP_ICON_RESOURCE_WINDOWS} ${QON_QM_FILES})
add_custom_target(resources ALL DEPENDS ${RESOURCE_FILES})
- add_dependencies(resources translations)
endif ()
if (BUILD_APPLICATION)
@@ -480,14 +432,9 @@ if (BUILD_APPLICATION)
target_link_libraries(${AppName} crypto)
elseif (APPLE)
message(STATUS "Link Application Library For macOS")
- target_link_libraries(${AppName} intl)
else ()
message(STATUS "Link Application Library For Linux")
target_link_libraries(${AppName} crypto pthread)
- # link for freebsd
- if(FREEBSD)
- target_link_libraries(${AppName} intl)
- endif()
# issue on filesystem support of gcc
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" AND ${CMAKE_CXX_COMPILER_VERSION} VERSION_LESS 9.0)
target_link_libraries(${AppName} stdc++fs)
@@ -498,6 +445,21 @@ endif ()
# using c++ standard 17
target_compile_features(${AppName} PUBLIC cxx_std_17)
+# build i18n support
+set(LOCALE_TS_PATH ${CMAKE_SOURCE_DIR}/resource/lfs/locale/ts)
+set(LOCALE_OUTPUT_PATH ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/locales)
+set(TS_FILES "${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"
+ "${LOCALE_TS_PATH}/GpgFrontend.it_IT.ts")
+file(GLOB_RECURSE ALL_SOURCE_FILES RELACTIVE ${CMAKE_SOURCE_DIR}/src/*.cpp)
+qt_add_translations(${AppName}
+ RESOURCE_PREFIX "/i18n"
+ TS_FILES ${TS_FILES}
+ SOURCES ${ALL_SOURCE_FILES}
+ INCLUDE_DIRECTORIES ${CMAKE_SOURCE_DIR}/src)
+
# if building linux package
if (LINUX AND LINUX_INSTALL_SOFTWARE)
include(GNUInstallDirs)
diff --git a/src/GpgFrontend.h.in b/src/GpgFrontend.h.in
index 29f2ab1c..56173bbd 100644
--- a/src/GpgFrontend.h.in
+++ b/src/GpgFrontend.h.in
@@ -33,20 +33,6 @@
#include <winsock2.h>
#endif
-// i18n support
-#include <libintl.h>
-#define _(String) gettext(String)
-#define gettext_noop(String) String
-#define N_(String) gettext_noop(String)
-
-// fix macro bugs in mingw
-#ifdef WINDOWS
-#include <clocale>
-#undef vsnprintf
-#undef sprintf
-#undef snprintf
-#endif
-
// build info
#define PROJECT_NAME "@CMAKE_PROJECT_NAME@"
#define OS_PLATFORM "@OS_PLATFORM@"
diff --git a/src/cmd.cpp b/src/cmd.cpp
index a8a5b9d9..e19ad218 100644
--- a/src/cmd.cpp
+++ b/src/cmd.cpp
@@ -41,18 +41,21 @@
namespace GpgFrontend {
auto PrintVersion() -> int {
- std::cout << PROJECT_NAME << " "
- << "v" << VERSION_MAJOR << "." << VERSION_MINOR << "."
- << VERSION_PATCH << '\n';
- std::cout
- << "Copyright (C) 2021 Saturneric <[email protected]>" << '\n'
- << _("This is free software; see the source for copying conditions.")
- << '\n'
- << '\n';
+ QTextStream stream(stdin);
+ stream << PROJECT_NAME << " "
+ << "v" << VERSION_MAJOR << "." << VERSION_MINOR << "." << VERSION_PATCH
+ << '\n';
+ stream << "Copyright (C) 2021 Saturneric <[email protected]>" << '\n'
+ << QObject::tr(
+ "This is free software; see the source for copying conditions.")
+ << '\n'
+ << '\n';
- std::cout << _("Build Timestamp: ") << BUILD_TIMESTAMP << '\n'
- << _("Build Version: ") << BUILD_VERSION << '\n'
- << _("Source Code Version: ") << GIT_VERSION << '\n';
+ stream << QObject::tr("Build Timestamp: ") << BUILD_TIMESTAMP << '\n'
+ << QObject::tr("Build Version: ") << BUILD_VERSION << '\n'
+ << QObject::tr("Source Code Version: ") << GIT_VERSION << '\n';
+
+ stream << Qt::endl;
return 0;
}
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt
index 22b2c01b..d51ec6d1 100644
--- a/src/core/CMakeLists.txt
+++ b/src/core/CMakeLists.txt
@@ -48,11 +48,6 @@ if(NOT APPLE)
target_link_libraries(gpgfrontend_core PUBLIC mimalloc)
endif()
-# link third-party libraries
-if (NOT LINUX)
- target_link_libraries(gpgfrontend_core PUBLIC intl)
-endif ()
-
# qt-aes
target_sources(gpgfrontend_core PRIVATE
${CMAKE_SOURCE_DIR}/third_party/qt-aes/qaesencryption.cpp)
@@ -82,7 +77,7 @@ target_include_directories(gpgfrontend_core PRIVATE ${LibArchive_INCLUDE_DIR})
target_link_libraries(gpgfrontend_core PRIVATE archive)
# link Qt core
-target_link_libraries(gpgfrontend_core PUBLIC Qt6::Core Qt6::Concurrent)
+target_link_libraries(gpgfrontend_core PUBLIC Qt6::Core)
# set up pch
target_precompile_headers(gpgfrontend_core
diff --git a/src/core/GpgCoreInit.cpp b/src/core/GpgCoreInit.cpp
index 806e1fe2..74e944f8 100644
--- a/src/core/GpgCoreInit.cpp
+++ b/src/core/GpgCoreInit.cpp
@@ -193,7 +193,7 @@ void InitGpgFrontendCore(CoreInitArgs args) {
// initialize library gpgme
if (!InitGpgME()) {
CoreSignalStation::GetInstance()->SignalBadGnupgEnv(
- _("GpgME inilization failed"));
+ QObject::tr("GpgME inilization failed"));
return;
}
@@ -317,7 +317,7 @@ void InitGpgFrontendCore(CoreInitArgs args) {
if (!ctx.Good()) {
GF_CORE_LOG_ERROR("default gnupg context init error, abort");
CoreSignalStation::GetInstance()->SignalBadGnupgEnv(
- _("GpgME Context inilization failed"));
+ QObject::tr("GpgME Context inilization failed"));
return -1;
}
Module::UpsertRTValue("core", "env.state.ctx", 1);
@@ -326,7 +326,7 @@ void InitGpgFrontendCore(CoreInitArgs args) {
if (args.load_default_gpg_context) {
if (!GpgKeyGetter::GetInstance().FlushKeyCache()) {
CoreSignalStation::GetInstance()->SignalBadGnupgEnv(
- _("Gpg Key Detabase inilization failed"));
+ QObject::tr("Gpg Key Detabase inilization failed"));
};
}
GF_CORE_LOG_INFO(
@@ -380,7 +380,7 @@ void InitGpgFrontendCore(CoreInitArgs args) {
"core_init_task");
QObject::connect(task, &Thread::Task::SignalTaskEnd, []() {
-
+
});
// start the thread to check ctx and gnupg state
diff --git a/src/core/GpgFrontendCore.h b/src/core/GpgFrontendCore.h
index 3aaa8ab4..14b1f878 100644
--- a/src/core/GpgFrontendCore.h
+++ b/src/core/GpgFrontendCore.h
@@ -33,8 +33,6 @@
// std
#include <cstdint>
-#include <filesystem>
-#include <string>
#include <vector>
// spdlog library configuration
diff --git a/src/core/function/GlobalSettingStation.cpp b/src/core/function/GlobalSettingStation.cpp
index d24e2894..a25bb52c 100644
--- a/src/core/function/GlobalSettingStation.cpp
+++ b/src/core/function/GlobalSettingStation.cpp
@@ -182,7 +182,7 @@ class GlobalSettingStation::Impl {
app_resource_path_ + "/locales"; ///< Program Data Location
#endif
- bool portable_mode_ = true; ///<
+ bool portable_mode_ = false; ///<
QString app_portable_config_path_ =
working_path_ + "/config.ini"; ///< take effect only in portable mode
diff --git a/src/core/function/result_analyse/GpgDecryptResultAnalyse.cpp b/src/core/function/result_analyse/GpgDecryptResultAnalyse.cpp
index e52394b3..5d0ce920 100644
--- a/src/core/function/result_analyse/GpgDecryptResultAnalyse.cpp
+++ b/src/core/function/result_analyse/GpgDecryptResultAnalyse.cpp
@@ -38,17 +38,17 @@ GpgFrontend::GpgDecryptResultAnalyse::GpgDecryptResultAnalyse(
void GpgFrontend::GpgDecryptResultAnalyse::doAnalyse() {
auto *result = result_.GetRaw();
- stream_ << "# " << _("Decrypt Operation") << " ";
+ stream_ << "# " << tr("Decrypt Operation") << " ";
if (gpgme_err_code(error_) == GPG_ERR_NO_ERROR) {
- stream_ << "- " << _("Success") << " " << Qt::endl;
+ stream_ << "- " << tr("Success") << " " << Qt::endl;
} else {
- stream_ << "- " << _("Failed") << ": " << gpgme_strerror(error_)
+ stream_ << "- " << tr("Failed") << ": " << gpgme_strerror(error_)
<< Qt::endl;
setStatus(-1);
if (result != nullptr && result->unsupported_algorithm != nullptr) {
stream_ << Qt::endl;
- stream_ << "## " << _("Unsupported Algo") << ": "
+ stream_ << "## " << tr("Unsupported Algo") << ": "
<< result->unsupported_algorithm << Qt::endl;
}
}
@@ -56,45 +56,45 @@ void GpgFrontend::GpgDecryptResultAnalyse::doAnalyse() {
if (result != nullptr && result->recipients != nullptr) {
stream_ << Qt::endl;
- stream_ << "## " << _("Gernal State") << ": " << Qt::endl;
+ stream_ << "## " << tr("Gernal State") << ": " << Qt::endl;
if (result->file_name != nullptr) {
- stream_ << "- " << _("File Name") << ": " << result->file_name
+ stream_ << "- " << tr("File Name") << ": " << result->file_name
<< Qt::endl;
}
- stream_ << "- " << _("MIME") << ": "
- << (result->is_mime == 0 ? _("false") : _("true")) << Qt::endl;
+ stream_ << "- " << tr("MIME") << ": "
+ << (result->is_mime == 0 ? tr("false") : tr("true")) << Qt::endl;
- stream_ << "- " << _("Message Integrity Protection") << ": "
- << (result->legacy_cipher_nomdc == 0 ? _("true") : _("false"))
+ stream_ << "- " << tr("Message Integrity Protection") << ": "
+ << (result->legacy_cipher_nomdc == 0 ? tr("true") : tr("false"))
<< Qt::endl;
if (result->legacy_cipher_nomdc == 1) setStatus(0); /// < unsafe situation
if (result->symkey_algo != nullptr) {
- stream_ << "- " << _("Symmetric Encryption Algorithm") << ": "
+ stream_ << "- " << tr("Symmetric Encryption Algorithm") << ": "
<< result->symkey_algo << Qt::endl;
}
if (result->session_key != nullptr) {
- stream_ << "- " << _("Session Key") << ": " << result->session_key
+ stream_ << "- " << tr("Session Key") << ": " << result->session_key
<< Qt::endl;
}
- stream_ << "- " << _("German Encryption Standards") << ": "
- << (result->is_de_vs == 0 ? _("false") : _("true")) << Qt::endl;
+ stream_ << "- " << tr("German Encryption Standards") << ": "
+ << (result->is_de_vs == 0 ? tr("false") : tr("true")) << Qt::endl;
stream_ << Qt::endl << Qt::endl;
auto *recipient = result->recipients;
auto index = 0;
if (recipient != nullptr) {
- stream_ << "## " << _("Recipient(s)") << ": " << Qt::endl << Qt::endl;
+ stream_ << "## " << tr("Recipient(s)") << ": " << Qt::endl << Qt::endl;
}
while (recipient != nullptr) {
// check
if (recipient->keyid == nullptr) return;
- stream_ << "### " << _("Recipient") << " [" << ++index << "]: ";
+ stream_ << "### " << tr("Recipient") << " [" << ++index << "]: ";
print_recipient(stream_, recipient);
stream_ << Qt::endl
<< "---------------------------------------" << Qt::endl
@@ -116,15 +116,15 @@ void GpgFrontend::GpgDecryptResultAnalyse::print_recipient(
if (!key.GetComment().isEmpty()) stream << "(" << key.GetComment() << ")";
if (!key.GetEmail().isEmpty()) stream << "<" << key.GetEmail() << ">";
} else {
- stream << "<" << _("unknown") << ">";
+ stream << "<" << tr("unknown") << ">";
setStatus(0);
}
stream << Qt::endl;
- stream << "- " << _("Key ID") << ": " << recipient->keyid << Qt::endl;
- stream << "- " << _("Public Key Algo") << ": "
+ stream << "- " << tr("Key ID") << ": " << recipient->keyid << Qt::endl;
+ stream << "- " << tr("Public Key Algo") << ": "
<< gpgme_pubkey_algo_name(recipient->pubkey_algo) << Qt::endl;
- stream << "- " << _("Status") << ": " << gpgme_strerror(recipient->status)
+ stream << "- " << tr("Status") << ": " << gpgme_strerror(recipient->status)
<< Qt::endl;
}
diff --git a/src/core/function/result_analyse/GpgDecryptResultAnalyse.h b/src/core/function/result_analyse/GpgDecryptResultAnalyse.h
index 7ff9859f..c795e025 100644
--- a/src/core/function/result_analyse/GpgDecryptResultAnalyse.h
+++ b/src/core/function/result_analyse/GpgDecryptResultAnalyse.h
@@ -39,6 +39,7 @@ namespace GpgFrontend {
*/
class GPGFRONTEND_CORE_EXPORT GpgDecryptResultAnalyse
: public GpgResultAnalyse {
+ Q_OBJECT
public:
/**
* @brief Construct a new Decrypt Result Analyse object
diff --git a/src/core/function/result_analyse/GpgEncryptResultAnalyse.cpp b/src/core/function/result_analyse/GpgEncryptResultAnalyse.cpp
index 358e0787..a6b18b0a 100644
--- a/src/core/function/result_analyse/GpgEncryptResultAnalyse.cpp
+++ b/src/core/function/result_analyse/GpgEncryptResultAnalyse.cpp
@@ -32,17 +32,17 @@
namespace GpgFrontend {
-GpgFrontend::GpgEncryptResultAnalyse::GpgEncryptResultAnalyse(
- GpgError error, GpgEncryptResult result)
+GpgEncryptResultAnalyse::GpgEncryptResultAnalyse(GpgError error,
+ GpgEncryptResult result)
: error_(error), result_(result) {}
-void GpgFrontend::GpgEncryptResultAnalyse::doAnalyse() {
- stream_ << "# " << _("Encrypt Operation") << " ";
+void GpgEncryptResultAnalyse::doAnalyse() {
+ stream_ << "# " << tr("Encrypt Operation") << " ";
if (gpgme_err_code(error_) == GPG_ERR_NO_ERROR) {
- stream_ << "- " << _("Success") << " " << Qt::endl;
+ stream_ << "- " << tr("Success") << " " << Qt::endl;
} else {
- stream_ << "- " << _("Failed") << ": " << gpgme_strerror(error_)
+ stream_ << "- " << tr("Failed") << ": " << gpgme_strerror(error_)
<< Qt::endl;
setStatus(-1);
}
@@ -53,18 +53,18 @@ void GpgFrontend::GpgEncryptResultAnalyse::doAnalyse() {
const auto *result = result_.GetRaw();
if (result != nullptr) {
- stream_ << "## " << _("Invalid Recipients") << ": " << Qt::endl
+ stream_ << "## " << tr("Invalid Recipients") << ": " << Qt::endl
<< Qt::endl;
auto *inv_reci = result->invalid_recipients;
auto index = 0;
while (inv_reci != nullptr) {
- stream_ << "### " << _("Recipients") << " " << ++index << ": "
+ stream_ << "### " << tr("Recipients") << " " << ++index << ": "
<< Qt::endl;
- stream_ << "- " << _("Fingerprint") << ": " << inv_reci->fpr
+ stream_ << "- " << tr("Fingerprint") << ": " << inv_reci->fpr
<< Qt::endl;
- stream_ << "- " << _("Reason") << ": "
+ stream_ << "- " << tr("Reason") << ": "
<< gpgme_strerror(inv_reci->reason) << Qt::endl;
stream_ << Qt::endl << Qt::endl;
diff --git a/src/core/function/result_analyse/GpgEncryptResultAnalyse.h b/src/core/function/result_analyse/GpgEncryptResultAnalyse.h
index 221a4c22..e9594628 100644
--- a/src/core/function/result_analyse/GpgEncryptResultAnalyse.h
+++ b/src/core/function/result_analyse/GpgEncryptResultAnalyse.h
@@ -38,6 +38,7 @@ namespace GpgFrontend {
*/
class GPGFRONTEND_CORE_EXPORT GpgEncryptResultAnalyse
: public GpgResultAnalyse {
+ Q_OBJECT
public:
/**
* @brief Construct a new Encrypt Result Analyse object
diff --git a/src/core/function/result_analyse/GpgResultAnalyse.h b/src/core/function/result_analyse/GpgResultAnalyse.h
index d93a824f..9958b6a2 100644
--- a/src/core/function/result_analyse/GpgResultAnalyse.h
+++ b/src/core/function/result_analyse/GpgResultAnalyse.h
@@ -33,7 +33,8 @@
namespace GpgFrontend {
-class GPGFRONTEND_CORE_EXPORT GpgResultAnalyse {
+class GPGFRONTEND_CORE_EXPORT GpgResultAnalyse : public QObject {
+ Q_OBJECT
public:
/**
* @brief Construct a new Result Analyse object
diff --git a/src/core/function/result_analyse/GpgSignResultAnalyse.cpp b/src/core/function/result_analyse/GpgSignResultAnalyse.cpp
index a7251923..bf429f38 100644
--- a/src/core/function/result_analyse/GpgSignResultAnalyse.cpp
+++ b/src/core/function/result_analyse/GpgSignResultAnalyse.cpp
@@ -40,12 +40,13 @@ GpgSignResultAnalyse::GpgSignResultAnalyse(GpgError error, GpgSignResult result)
void GpgSignResultAnalyse::doAnalyse() {
auto *result = this->result_.GetRaw();
- stream_ << "# " << _("Sign Operation") << " ";
+ stream_ << "# " << tr("Sign Operation") << " ";
if (gpgme_err_code(error_) == GPG_ERR_NO_ERROR) {
- stream_ << "- " << _("Success") << " " << Qt::endl;
+ stream_ << "- " << tr("Success") << " " << Qt::endl;
} else {
- stream_ << "- " << _("Failed") << " " << gpgme_strerror(error_) << Qt::endl;
+ stream_ << "- " << tr("Failed") << " " << gpgme_strerror(error_)
+ << Qt::endl;
setStatus(-1);
}
@@ -56,37 +57,37 @@ void GpgSignResultAnalyse::doAnalyse() {
auto index = 0;
while (new_sign != nullptr) {
- stream_ << "## " << _("New Signature") << " [" << ++index
+ stream_ << "## " << tr("New Signature") << " [" << ++index
<< "]: " << Qt::endl;
- stream_ << "- " << _("Sign Mode") << ": ";
+ stream_ << "- " << tr("Sign Mode") << ": ";
if (new_sign->type == GPGME_SIG_MODE_NORMAL) {
- stream_ << _("Normal");
+ stream_ << tr("Normal");
} else if (new_sign->type == GPGME_SIG_MODE_CLEAR) {
- stream_ << _("Clear");
+ stream_ << tr("Clear");
} else if (new_sign->type == GPGME_SIG_MODE_DETACH) {
- stream_ << _("Detach");
+ stream_ << tr("Detach");
}
stream_ << Qt::endl;
auto singer_key = GpgKeyGetter::GetInstance().GetKey(new_sign->fpr);
if (singer_key.IsGood()) {
- stream_ << "- " << _("Signer") << ": "
+ stream_ << "- " << tr("Signer") << ": "
<< singer_key.GetUIDs()->front().GetUID() << Qt::endl;
} else {
- stream_ << "- " << _("Signer") << ": "
+ stream_ << "- " << tr("Signer") << ": "
<< "<unknown>" << Qt::endl;
}
- stream_ << "- " << _("Public Key Algo") << ": "
+ stream_ << "- " << tr("Public Key Algo") << ": "
<< gpgme_pubkey_algo_name(new_sign->pubkey_algo) << Qt::endl;
- stream_ << "- " << _("Hash Algo") << ": "
+ stream_ << "- " << tr("Hash Algo") << ": "
<< gpgme_hash_algo_name(new_sign->hash_algo) << Qt::endl;
- stream_ << "- " << _("Date") << "(" << _("UTC") << ")"
+ stream_ << "- " << tr("Date") << "(" << tr("UTC") << ")"
<< ": "
<< QDateTime::fromSecsSinceEpoch(new_sign->timestamp).toString()
<< Qt::endl;
- stream_ << "- " << _("Date") << "(" << _("Localized") << ")"
+ stream_ << "- " << tr("Date") << "(" << tr("Localized") << ")"
<< ": " << GetFormatedDateByTimestamp(new_sign->timestamp)
<< Qt::endl;
@@ -101,17 +102,17 @@ void GpgSignResultAnalyse::doAnalyse() {
stream_ << Qt::endl;
if (invalid_signer != nullptr) {
- stream_ << "## " << _("Invalid Signers") << ": " << Qt::endl;
+ stream_ << "## " << tr("Invalid Signers") << ": " << Qt::endl;
}
index = 0;
while (invalid_signer != nullptr) {
setStatus(0);
- stream_ << "### " << _("Signer") << " [" << ++index << "]: " << Qt::endl
+ stream_ << "### " << tr("Signer") << " [" << ++index << "]: " << Qt::endl
<< Qt::endl;
- stream_ << "- " << _("Fingerprint") << ": " << invalid_signer->fpr
+ stream_ << "- " << tr("Fingerprint") << ": " << invalid_signer->fpr
<< Qt::endl;
- stream_ << "- " << _("Reason") << ": "
+ stream_ << "- " << tr("Reason") << ": "
<< gpgme_strerror(invalid_signer->reason) << Qt::endl;
stream_ << "---------------------------------------" << Qt::endl;
diff --git a/src/core/function/result_analyse/GpgSignResultAnalyse.h b/src/core/function/result_analyse/GpgSignResultAnalyse.h
index 97544e8e..58a20417 100644
--- a/src/core/function/result_analyse/GpgSignResultAnalyse.h
+++ b/src/core/function/result_analyse/GpgSignResultAnalyse.h
@@ -38,6 +38,7 @@ namespace GpgFrontend {
*
*/
class GPGFRONTEND_CORE_EXPORT GpgSignResultAnalyse : public GpgResultAnalyse {
+ Q_OBJECT
public:
/**
* @brief Construct a new Sign Result Analyse object
diff --git a/src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp b/src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp
index 38d751dd..224aa06b 100644
--- a/src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp
+++ b/src/core/function/result_analyse/GpgVerifyResultAnalyse.cpp
@@ -41,12 +41,12 @@ GpgFrontend::GpgVerifyResultAnalyse::GpgVerifyResultAnalyse(
void GpgFrontend::GpgVerifyResultAnalyse::doAnalyse() {
auto *result = this->result_.GetRaw();
- stream_ << "# " << _("Verify Operation") << " ";
+ stream_ << "# " << tr("Verify Operation") << " ";
if (gpgme_err_code(error_) == GPG_ERR_NO_ERROR) {
- stream_ << " - " << _("Success") << " " << Qt::endl;
+ stream_ << " - " << tr("Success") << " " << Qt::endl;
} else {
- stream_ << " - " << _("Failed") << ": " << gpgme_strerror(error_)
+ stream_ << " - " << tr("Failed") << ": " << gpgme_strerror(error_)
<< Qt::endl;
setStatus(-1);
}
@@ -55,67 +55,66 @@ void GpgFrontend::GpgVerifyResultAnalyse::doAnalyse() {
stream_ << Qt::endl;
auto *sign = result->signatures;
- stream_ << "-> " << _("Signed On") << "(" << _("UTC") << ")"
+ stream_ << "-> " << tr("Signed On") << "(" << tr("UTC") << ")"
<< " " << QDateTime::fromSecsSinceEpoch(sign->timestamp).toString()
<< Qt::endl;
- stream_ << "-> " << _("Signed On") << "(" << _("Localized") << ")"
+ stream_ << "-> " << tr("Signed On") << "(" << tr("Localized") << ")"
<< " " << GetFormatedDateByTimestamp(sign->timestamp) << Qt::endl;
- stream_ << Qt::endl << "## " << _("Signatures List") << ":" << Qt::endl;
+ stream_ << Qt::endl << "## " << tr("Signatures List") << ":" << Qt::endl;
stream_ << Qt::endl;
bool can_continue = true;
int count = 1;
while ((sign != nullptr) && can_continue) {
- stream_ << "### " << QString(_("Signature [%1]:")).arg(count++)
- << Qt::endl;
- stream_ << "- " << _("Status") << ": ";
+ stream_ << "### " << tr("Signature [%1]:").arg(count++) << Qt::endl;
+ stream_ << "- " << tr("Status") << ": ";
switch (gpg_err_code(sign->status)) {
case GPG_ERR_BAD_SIGNATURE:
- stream_ << _("A Bad Signature.") << Qt::endl;
+ stream_ << tr("A Bad Signature.") << Qt::endl;
print_signer(stream_, sign);
- stream_ << _("This Signature is invalid.") << Qt::endl;
+ stream_ << tr("This Signature is invalid.") << Qt::endl;
can_continue = false;
setStatus(-1);
break;
case GPG_ERR_NO_ERROR:
- stream_ << _("A") << " ";
+ stream_ << tr("A") << " ";
if ((sign->summary & GPGME_SIGSUM_GREEN) != 0) {
- stream_ << _("Good") << " ";
+ stream_ << tr("Good") << " ";
}
if ((sign->summary & GPGME_SIGSUM_RED) != 0) {
- stream_ << _("Bad") << " ";
+ stream_ << tr("Bad") << " ";
}
if ((sign->summary & GPGME_SIGSUM_SIG_EXPIRED) != 0) {
- stream_ << _("Expired") << " ";
+ stream_ << tr("Expired") << " ";
}
if ((sign->summary & GPGME_SIGSUM_KEY_MISSING) != 0) {
- stream_ << _("Missing Key's") << " ";
+ stream_ << tr("Missing Key's") << " ";
}
if ((sign->summary & GPGME_SIGSUM_KEY_REVOKED) != 0) {
- stream_ << _("Revoked Key's") << " ";
+ stream_ << tr("Revoked Key's") << " ";
}
if ((sign->summary & GPGME_SIGSUM_KEY_EXPIRED) != 0) {
- stream_ << _("Expired Key's") << " ";
+ stream_ << tr("Expired Key's") << " ";
}
if ((sign->summary & GPGME_SIGSUM_CRL_MISSING) != 0) {
- stream_ << _("Missing CRL's") << " ";
+ stream_ << tr("Missing CRL's") << " ";
}
if ((sign->summary & GPGME_SIGSUM_VALID) != 0) {
- stream_ << _("Signature Fully Valid.") << Qt::endl;
+ stream_ << tr("Signature Fully Valid.") << Qt::endl;
} else {
- stream_ << _("Signature Not Fully Valid.") << Qt::endl;
- stream_ << _("(Adjust Trust Level to make it Fully Vaild)")
+ stream_ << tr("Signature Not Fully Valid.") << Qt::endl;
+ stream_ << tr("(Adjust Trust Level to make it Fully Vaild)")
<< Qt::endl;
}
if ((sign->status & GPGME_SIGSUM_KEY_MISSING) == 0U) {
if (!print_signer(stream_, sign)) setStatus(0);
} else {
- stream_ << _("Key is NOT present with ID 0x") << sign->fpr
+ stream_ << tr("Key is NOT present with ID 0x") << sign->fpr
<< Qt::endl;
}
@@ -123,13 +122,14 @@ void GpgFrontend::GpgVerifyResultAnalyse::doAnalyse() {
break;
case GPG_ERR_NO_PUBKEY:
- stream_ << _("A signature could NOT be verified due to a Missing Key")
- << Qt::endl;
+ stream_
+ << tr("A signature could NOT be verified due to a Missing Key")
+ << Qt::endl;
setStatus(-2);
break;
case GPG_ERR_CERT_REVOKED:
- stream_ << _("A signature is valid but the key used to verify the "
- "signature has been revoked")
+ stream_ << tr("A signature is valid but the key used to verify the "
+ "signature has been revoked")
<< Qt::endl;
if (!print_signer(stream_, sign)) {
setStatus(0);
@@ -137,30 +137,30 @@ void GpgFrontend::GpgVerifyResultAnalyse::doAnalyse() {
setStatus(-1);
break;
case GPG_ERR_SIG_EXPIRED:
- stream_ << _("A signature is valid but expired") << Qt::endl;
+ stream_ << tr("A signature is valid but expired") << Qt::endl;
if (!print_signer(stream_, sign)) {
setStatus(0);
}
setStatus(-1);
break;
case GPG_ERR_KEY_EXPIRED:
- stream_ << _("A signature is valid but the key used to "
- "verify the signature has expired.")
+ stream_ << tr("A signature is valid but the key used to "
+ "verify the signature has expired.")
<< Qt::endl;
if (!print_signer(stream_, sign)) {
setStatus(0);
}
break;
case GPG_ERR_GENERAL:
- stream_ << _("There was some other error which prevented "
- "the signature verification.")
+ stream_ << tr("There was some other error which prevented "
+ "the signature verification.")
<< Qt::endl;
status_ = -1;
can_continue = false;
break;
default:
auto fpr = QString(sign->fpr);
- stream_ << _("Error for key with fingerprint") << " "
+ stream_ << tr("Error for key with fingerprint") << " "
<< GpgFrontend::BeautifyFingerprint(fpr);
setStatus(-1);
}
@@ -171,7 +171,7 @@ void GpgFrontend::GpgVerifyResultAnalyse::doAnalyse() {
} else {
stream_
<< "-> "
- << _("Could not find information that can be used for verification.")
+ << tr("Could not find information that can be used for verification.")
<< Qt::endl;
setStatus(0);
return;
@@ -185,28 +185,28 @@ auto GpgFrontend::GpgVerifyResultAnalyse::print_signer(QTextStream &stream,
auto key = GpgFrontend::GpgKeyGetter::GetInstance().GetKey(sign->fpr);
if (!key.IsGood()) {
- stream << "- " << _("Signed By") << ": "
- << "<" << _("Unknown") << ">" << Qt::endl;
+ stream << "- " << tr("Signed By") << ": "
+ << "<" << tr("Unknown") << ">" << Qt::endl;
setStatus(0);
key_found = false;
} else {
- stream << "- " << _("Signed By") << ": " << key.GetUIDs()->front().GetUID()
+ stream << "- " << tr("Signed By") << ": " << key.GetUIDs()->front().GetUID()
<< Qt::endl;
}
if (sign->pubkey_algo != 0U) {
- stream << "- " << _("Public Key Algo") << ": "
+ stream << "- " << tr("Public Key Algo") << ": "
<< gpgme_pubkey_algo_name(sign->pubkey_algo) << Qt::endl;
}
if (sign->hash_algo != 0U) {
- stream << "- " << _("Hash Algo") << ": "
+ stream << "- " << tr("Hash Algo") << ": "
<< gpgme_hash_algo_name(sign->hash_algo) << Qt::endl;
}
if (sign->timestamp != 0U) {
- stream << "- " << _("Date") << "(" << _("UTC") << ")"
+ stream << "- " << tr("Date") << "(" << tr("UTC") << ")"
<< ": " << QDateTime::fromSecsSinceEpoch(sign->timestamp).toString()
<< Qt::endl;
- stream << "- " << _("Date") << "(" << _("Localized") << ")"
+ stream << "- " << tr("Date") << "(" << tr("Localized") << ")"
<< ": " << GetFormatedDateByTimestamp(sign->timestamp) << Qt::endl;
}
stream << Qt::endl;
diff --git a/src/core/function/result_analyse/GpgVerifyResultAnalyse.h b/src/core/function/result_analyse/GpgVerifyResultAnalyse.h
index 054083a1..8aa2e41f 100644
--- a/src/core/function/result_analyse/GpgVerifyResultAnalyse.h
+++ b/src/core/function/result_analyse/GpgVerifyResultAnalyse.h
@@ -37,6 +37,7 @@ namespace GpgFrontend {
*
*/
class GPGFRONTEND_CORE_EXPORT GpgVerifyResultAnalyse : public GpgResultAnalyse {
+ Q_OBJECT
public:
/**
* @brief Construct a new Verify Result Analyse object
diff --git a/src/core/model/GpgKey.cpp b/src/core/model/GpgKey.cpp
index a53aac5f..ab962b5d 100644
--- a/src/core/model/GpgKey.cpp
+++ b/src/core/model/GpgKey.cpp
@@ -88,17 +88,17 @@ auto GpgKey::GetProtocol() const -> QString {
auto GpgKey::GetOwnerTrust() const -> QString {
switch (key_ref_->owner_trust) {
case GPGME_VALIDITY_UNKNOWN:
- return _("Unknown");
+ return tr("Unknown");
case GPGME_VALIDITY_UNDEFINED:
- return _("Undefined");
+ return tr("Undefined");
case GPGME_VALIDITY_NEVER:
- return _("Never");
+ return tr("Never");
case GPGME_VALIDITY_MARGINAL:
- return _("Marginal");
+ return tr("Marginal");
case GPGME_VALIDITY_FULL:
- return _("Full");
+ return tr("Full");
case GPGME_VALIDITY_ULTIMATE:
- return _("Ultimate");
+ return tr("Ultimate");
}
return "Invalid";
}
diff --git a/src/core/model/GpgKey.h b/src/core/model/GpgKey.h
index 2e540410..a9b76f7c 100644
--- a/src/core/model/GpgKey.h
+++ b/src/core/model/GpgKey.h
@@ -40,6 +40,7 @@ namespace GpgFrontend {
*
*/
class GPGFRONTEND_CORE_EXPORT GpgKey {
+ Q_DECLARE_TR_FUNCTIONS(GpgKey)
public:
/**
* @brief
diff --git a/src/core/utils/IOUtils.cpp b/src/core/utils/IOUtils.cpp
index 0eefe894..5ca765d9 100644
--- a/src/core/utils/IOUtils.cpp
+++ b/src/core/utils/IOUtils.cpp
@@ -72,15 +72,16 @@ auto CalculateHash(const QString& file_path) -> QString {
QTextStream ss(&buffer);
if (info.isFile() && info.isReadable()) {
- ss << "[#] " << _("File Hash Information") << Qt::endl;
- ss << " " << _("filename") << _(": ") << info.fileName() << Qt::endl;
+ ss << "[#] " << QObject::tr("File Hash Information") << Qt::endl;
+ ss << " " << QObject::tr("filename") << QObject::tr(": ")
+ << info.fileName() << Qt::endl;
QFile f(info.filePath());
if (f.open(QFile::ReadOnly)) {
// read all data
auto buffer = f.readAll();
- ss << " " << _("file size(bytes)") << _(": ") << buffer.size()
- << Qt::endl;
+ ss << " " << QObject::tr("file size(bytes)") << QObject::tr(": ")
+ << buffer.size() << Qt::endl;
// md5
auto hash_md5 = QCryptographicHash(QCryptographicHash::Md5);
@@ -88,7 +89,7 @@ auto CalculateHash(const QString& file_path) -> QString {
auto md5 = hash_md5.result().toHex();
GF_CORE_LOG_DEBUG("md5 {}", md5);
ss << " "
- << "md5" << _(": ") << md5 << Qt::endl;
+ << "md5" << QObject::tr(": ") << md5 << Qt::endl;
// sha1
auto hash_sha1 = QCryptographicHash(QCryptographicHash::Sha1);
@@ -96,7 +97,7 @@ auto CalculateHash(const QString& file_path) -> QString {
auto sha1 = hash_sha1.result().toHex();
GF_CORE_LOG_DEBUG("sha1 {}", sha1);
ss << " "
- << "sha1" << _(": ") << sha1 << Qt::endl;
+ << "sha1" << QObject::tr(": ") << sha1 << Qt::endl;
// sha1
auto hash_sha256 = QCryptographicHash(QCryptographicHash::Sha256);
@@ -104,12 +105,12 @@ auto CalculateHash(const QString& file_path) -> QString {
auto sha256 = hash_sha256.result().toHex();
GF_CORE_LOG_DEBUG("sha256 {}", sha256);
ss << " "
- << "sha256" << _(": ") << sha256 << Qt::endl;
+ << "sha256" << QObject::tr(": ") << sha256 << Qt::endl;
ss << Qt::endl;
}
} else {
- ss << "[#] " << _("Error in Calculating File Hash ") << Qt::endl;
+ ss << "[#] " << QObject::tr("Error in Calculating File Hash ") << Qt::endl;
}
return ss.readAll();
@@ -133,20 +134,20 @@ auto TargetFilePreCheck(const QString& path, bool read)
if (read) {
if (!file_info.exists()) {
- return {false, _("target path doesn't exists")};
+ return {false, QObject::tr("target path doesn't exists")};
}
} else {
QFileInfo const path_info(file_info.absolutePath());
if (!path_info.isWritable()) {
- return {false, _("do NOT have permission to write path")};
+ return {false, QObject::tr("do NOT have permission to write path")};
}
}
if (read ? !file_info.isReadable() : false) {
- return {false, _("do NOT have permission to read/write file")};
+ return {false, QObject::tr("do NOT have permission to read/write file")};
}
- return {true, _("Success")};
+ return {true, QObject::tr("Success")};
}
auto GetFullExtension(const QString& path) -> QString {
diff --git a/src/module/integrated/gnupg_info_gathering_module/GnuPGInfoGatheringModule.cpp b/src/module/integrated/gnupg_info_gathering_module/GnuPGInfoGatheringModule.cpp
index 0db639f8..8a0c9ca6 100644
--- a/src/module/integrated/gnupg_info_gathering_module/GnuPGInfoGatheringModule.cpp
+++ b/src/module/integrated/gnupg_info_gathering_module/GnuPGInfoGatheringModule.cpp
@@ -121,7 +121,7 @@ auto GnuPGInfoGatheringModule::Exec(EventRefrernce event) -> int {
c_i_gpgme.name = "gpgme";
c_i_gpgme.desc = "GPG Made Easy";
c_i_gpgme.version = gpgme_version;
- c_i_gpgme.path = _("Embedded In");
+ c_i_gpgme.path = tr("Embedded In");
c_i_gpgme.binary_checksum = "/";
GpgComponentInfo c_i_gpgconf;
diff --git a/src/test/CMakeLists.txt b/src/test/CMakeLists.txt
index 2c99c5d3..ea4ca076 100644
--- a/src/test/CMakeLists.txt
+++ b/src/test/CMakeLists.txt
@@ -39,8 +39,4 @@ target_link_libraries(gpgfrontend_test PRIVATE gtest)
target_link_libraries(gpgfrontend_test PRIVATE gpgfrontend_core)
target_link_libraries(gpgfrontend_test PRIVATE spdlog)
-if (APPLE)
- target_link_libraries(gpgfrontend_test PRIVATE intl)
-endif ()
-
add_test(AllTestsInGpgFrontend gpgfrontend_test)
diff --git a/src/ui/GpgFrontendApplication.cpp b/src/ui/GpgFrontendApplication.cpp
index f7fc5635..1304aad5 100644
--- a/src/ui/GpgFrontendApplication.cpp
+++ b/src/ui/GpgFrontendApplication.cpp
@@ -37,7 +37,7 @@ namespace GpgFrontend::UI {
GpgFrontendApplication::GpgFrontendApplication(int &argc, char *argv[])
: QApplication(argc, argv) {
#ifndef MACOS
- this->setWindowIcon(QIcon(":gpgfrontend.png"));
+ this->setWindowIcon(QIcon(":/icons/gpgfrontend.png"));
#endif
// set the extra information of the build
@@ -60,20 +60,21 @@ bool GpgFrontendApplication::notify(QObject *receiver, QEvent *event) {
return QApplication::notify(receiver, event);
} catch (const std::exception &ex) {
GF_UI_LOG_ERROR("exception was caught in notify: {}", ex.what());
- QMessageBox::information(nullptr, _("Standard Exception Thrown"),
- _("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."));
+ QMessageBox::information(
+ nullptr, tr("Standard Exception Thrown"),
+ tr("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."));
} catch (...) {
GF_UI_LOG_ERROR("unknown exception was caught in notify");
QMessageBox::information(
- nullptr, _("Unhandled Exception Thrown"),
- _("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."));
+ nullptr, tr("Unhandled Exception Thrown"),
+ tr("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."));
}
return -1;
#else
diff --git a/src/ui/GpgFrontendUIInit.cpp b/src/ui/GpgFrontendUIInit.cpp
index cf48e14d..64c316b9 100644
--- a/src/ui/GpgFrontendUIInit.cpp
+++ b/src/ui/GpgFrontendUIInit.cpp
@@ -49,12 +49,12 @@ void WaitEnvCheckingProcess() {
auto* waiting_dialog = new QProgressDialog();
waiting_dialog->setMaximum(0);
waiting_dialog->setMinimum(0);
- auto* waiting_dialog_label =
- new QLabel(QString(_("Loading Gnupg Info...")) + "<br /><br />" +
- _("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)."));
+ auto* waiting_dialog_label = new QLabel(
+ QObject::tr("Loading Gnupg Info...") + "<br /><br />" +
+ QObject::tr("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)."));
waiting_dialog_label->setWordWrap(true);
waiting_dialog->setLabel(waiting_dialog_label);
waiting_dialog->resize(420, 120);
@@ -221,56 +221,23 @@ void InitLocale() {
auto settings =
GpgFrontend::GlobalSettingStation::GetInstance().GetSettings();
- GF_UI_LOG_INFO("current system locale: {}", setlocale(LC_ALL, nullptr));
+ GF_UI_LOG_INFO("current system locale: {}", QLocale().name());
// read from settings file
auto lang = settings.value("basic/lang").toString();
- GF_UI_LOG_INFO("current language settings: {}", lang);
+ GF_UI_LOG_INFO("current custom locale settings: {}", lang);
GF_UI_LOG_INFO(
"current locales path: {}",
GpgFrontend::GlobalSettingStation::GetInstance().GetLocaleDir());
-#ifndef WINDOWS
- if (!lang.isEmpty()) {
- auto lc = (lang + ".UTF-8").toUtf8();
-
- // set LC_ALL
- auto* locale_name = std::setlocale(LC_ALL, lc.constData());
- if (locale_name == nullptr) GF_UI_LOG_WARN("set LC_ALL failed, lc: {}", lc);
- auto* language = getenv("LANGUAGE");
- // set LANGUAGE
- QString language_env = language == nullptr ? "en" : language;
- language_env.insert(0, lang + ":");
- GF_UI_LOG_DEBUG("language env: {}", language_env);
- if (setenv("LANGUAGE", language_env.toUtf8(), 1) != 0) {
- GF_UI_LOG_WARN("set LANGUAGE {} failed", language_env);
- };
+ auto target_locale = lang.isEmpty() ? QLocale() : QLocale(lang);
+ auto* translator = new QTranslator(QCoreApplication::instance());
+ if (translator->load(target_locale, QLatin1String(PROJECT_NAME),
+ QLatin1String("."), QLatin1String(":/i18n"),
+ QLatin1String(".qm"))) {
+ GF_UI_LOG_INFO("load target translation file done");
+ QCoreApplication::installTranslator(translator);
}
-#else
- if (!lang.empty()) {
- auto lc = lang.toUtf8();
-
- // set LC_ALL
- auto* locale_name = setlocale(LC_ALL, lc);
- if (locale_name == nullptr) GF_UI_LOG_WARN("set LC_ALL failed, lc: {}", lc);
-
- auto language = getenv("LANGUAGE");
- // set LANGUAGE
- QString language_env = language == nullptr ? "en" : language;
- language_env.insert(0, lang + ":");
- language_env.insert(0, "LANGUAGE=");
- GF_UI_LOG_DEBUG("language env: {}", language_env);
- if (putenv(language_env.toUtf8())) {
- GF_UI_LOG_WARN("set LANGUAGE {} failed", language_env);
- };
- }
-#endif
-
- bindtextdomain(
- PROJECT_NAME,
- GpgFrontend::GlobalSettingStation::GetInstance().GetLocaleDir().toUtf8());
- bind_textdomain_codeset(PROJECT_NAME, "utf-8");
- textdomain(PROJECT_NAME);
}
} // namespace GpgFrontend::UI
diff --git a/src/ui/UserInterfaceUtils.cpp b/src/ui/UserInterfaceUtils.cpp
index 69534ca6..8f7b07b4 100644
--- a/src/ui/UserInterfaceUtils.cpp
+++ b/src/ui/UserInterfaceUtils.cpp
@@ -63,7 +63,7 @@ void show_verify_details(QWidget *parent, InfoBoardWidget *info_board,
GpgError error, const GpgVerifyResult &verify_result) {
// take out result
info_board->ResetOptionActionsMenu();
- info_board->AddOptionalAction(_("Show Verify Details"), [=]() {
+ info_board->AddOptionalAction(QObject::tr("Show Verify Details"), [=]() {
VerifyDetailsDialog(parent, error, verify_result);
});
}
@@ -72,10 +72,11 @@ void import_unknown_key_from_keyserver(
QWidget *parent, const GpgVerifyResultAnalyse &verify_res) {
QMessageBox::StandardButton reply;
reply = QMessageBox::question(
- parent, _("Public key not found locally"),
- _("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?"),
+ parent, QObject::tr("Public key not found locally"),
+ QObject::tr(
+ "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?"),
QMessageBox::Yes | QMessageBox::No);
if (reply == QMessageBox::Yes) {
auto dialog = KeyServerImportDialog(parent);
@@ -181,43 +182,43 @@ CommonUtils::CommonUtils() : QWidget(nullptr) {
&UISignalStation::SignalRestartApplication, this,
&CommonUtils::SlotRestartApplication);
- connect(
- this, &CommonUtils::SignalBadGnupgEnv, this, [=](const QString &reason) {
- QMessageBox msg_box;
- msg_box.setText(_("GnuPG Context Loading Failed"));
- msg_box.setInformativeText(
- QString(_("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"))
- .arg(reason));
- msg_box.setStandardButtons(QMessageBox::Open | QMessageBox::Cancel);
- msg_box.setDefaultButton(QMessageBox::Save);
- int ret = msg_box.exec();
-
- switch (ret) {
- case QMessageBox::Open:
- (new GnuPGControllerDialog(this))->exec();
- // restart application when loop start
- application_need_to_restart_at_once_ = true;
- // restart application, core and ui
- emit SignalRestartApplication(kDeepRestartCode);
- break;
- case QMessageBox::Cancel:
- // close application
- emit SignalRestartApplication(0);
- break;
- default:
- // close application
- emit SignalRestartApplication(0);
- break;
- }
- });
+ connect(this, &CommonUtils::SignalBadGnupgEnv, this,
+ [=](const QString &reason) {
+ QMessageBox msg_box;
+ msg_box.setText(tr("GnuPG Context Loading Failed"));
+ msg_box.setInformativeText(
+ tr("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")
+ .arg(reason));
+ msg_box.setStandardButtons(QMessageBox::Open | QMessageBox::Cancel);
+ msg_box.setDefaultButton(QMessageBox::Save);
+ int ret = msg_box.exec();
+
+ switch (ret) {
+ case QMessageBox::Open:
+ (new GnuPGControllerDialog(this))->exec();
+ // restart application when loop start
+ application_need_to_restart_at_once_ = true;
+ // restart application, core and ui
+ emit SignalRestartApplication(kDeepRestartCode);
+ break;
+ case QMessageBox::Cancel:
+ // close application
+ emit SignalRestartApplication(0);
+ break;
+ default:
+ // close application
+ emit SignalRestartApplication(0);
+ break;
+ }
+ });
}
void CommonUtils::WaitForOpera(QWidget *parent,
@@ -247,8 +248,8 @@ void CommonUtils::WaitForOpera(QWidget *parent,
dialog->close();
dialog->reject();
- QMessageBox::critical(parent, _("Timeout"),
- _("Operation has timeout, aborted..."));
+ QMessageBox::critical(parent, tr("Timeout"),
+ tr("Operation has timeout, aborted..."));
}
});
@@ -260,9 +261,8 @@ void CommonUtils::RaiseMessageBox(QWidget *parent, GpgError err) {
GpgErrorCode err_code = CheckGpgError2ErrCode(err);
if (err_code == GPG_ERR_NO_ERROR) {
- QMessageBox::information(
- parent, _("Success"),
- QString::fromStdString(_("Gpg Operation succeed.")));
+ QMessageBox::information(parent, tr("Success"),
+ tr("Gpg Operation succeed."));
} else {
RaiseFailureMessageBox(parent, err);
}
@@ -272,13 +272,12 @@ void CommonUtils::RaiseFailureMessageBox(QWidget *parent, GpgError err) {
GpgErrorDesc desc = DescribeGpgErrCode(err);
GpgErrorCode err_code = CheckGpgError2ErrCode(err);
- QMessageBox::critical(
- parent, _("Failure"),
- QString(_("Gpg Operation failed.\n\nError code: %1\nSource: "
- " %2\nDescription: %3"))
- .arg(err_code)
- .arg(desc.first)
- .arg(desc.second));
+ QMessageBox::critical(parent, tr("Failure"),
+ tr("Gpg Operation failed.\n\nError code: %1\nSource: "
+ " %2\nDescription: %3")
+ .arg(err_code)
+ .arg(desc.first)
+ .arg(desc.second));
}
void CommonUtils::SlotImportKeys(QWidget *parent, const QString &in_buffer) {
@@ -290,15 +289,15 @@ void CommonUtils::SlotImportKeys(QWidget *parent, const QString &in_buffer) {
}
void CommonUtils::SlotImportKeyFromFile(QWidget *parent) {
- auto file_name = QFileDialog::getOpenFileName(
- this, _("Open Key"), QString(),
- QString(_("Key Files")) + " (*.asc *.txt);;" + _("Keyring files") +
- " (*.gpg);;All Files (*)");
+ auto file_name = QFileDialog::getOpenFileName(this, tr("Open Key"), QString(),
+ tr("Key Files")) +
+ " (*.asc *.txt);;" + tr("Keyring files") +
+ " (*.gpg);;All Files (*)";
if (!file_name.isNull()) {
QByteArray key_buffer;
if (!ReadFile(file_name, key_buffer)) {
- QMessageBox::critical(nullptr, _("File Open Failed"),
- _("Failed to open file: ") + file_name);
+ QMessageBox::critical(nullptr, tr("File Open Failed"),
+ tr("Failed to open file: ") + file_name);
return;
}
SlotImportKeys(parent, key_buffer);
@@ -351,7 +350,7 @@ void CommonUtils::SlotExecuteGpgCommand(
const QStringList &arguments,
const std::function<void(QProcess *)> &interact_func) {
QEventLoop looper;
- auto dialog = new WaitingDialog(_("Processing"), nullptr);
+ auto dialog = new WaitingDialog(tr("Processing"), nullptr);
dialog->show();
auto *gpg_process = new QProcess(&looper);
gpg_process->setProcessChannelMode(QProcess::MergedChannels);
@@ -370,19 +369,19 @@ void CommonUtils::SlotExecuteGpgCommand(
connect(gpg_process, &QProcess::errorOccurred, this, [=]() -> void {
GF_UI_LOG_ERROR("Error in Process");
dialog->close();
- QMessageBox::critical(nullptr, _("Failure"),
- _("Failed to execute command."));
+ QMessageBox::critical(nullptr, tr("Failure"),
+ tr("Failed to execute command."));
});
connect(gpg_process,
qOverload<int, QProcess::ExitStatus>(&QProcess::finished), this,
[=](int, QProcess::ExitStatus status) {
dialog->close();
if (status == QProcess::NormalExit)
- QMessageBox::information(nullptr, _("Success"),
- _("Succeed in executing command."));
+ QMessageBox::information(nullptr, tr("Success"),
+ tr("Succeed in executing command."));
else
- QMessageBox::information(nullptr, _("Warning"),
- _("Finished executing command."));
+ QMessageBox::information(nullptr, tr("Warning"),
+ tr("Finished executing command."));
});
const auto app_path = Module::RetrieveRTValueTypedOrDefault<>(
@@ -402,9 +401,10 @@ void CommonUtils::SlotImportKeyFromKeyServer(
auto target_keyserver =
KeyServerSO(SettingsObject("key_server")).GetTargetServer();
if (target_keyserver.isEmpty()) {
- QMessageBox::critical(nullptr, _("Default Keyserver Not Found"),
- _("Cannot read default keyserver from your settings, "
- "please set a default keyserver first"));
+ QMessageBox::critical(
+ nullptr, tr("Default Keyserver Not Found"),
+ tr("Cannot read default keyserver from your settings, "
+ "please set a default keyserver first"));
return;
}
GF_UI_LOG_DEBUG("set target key server to default Key Server: {}",
@@ -438,16 +438,16 @@ void CommonUtils::SlotImportKeyFromKeyServer(
if (error != QNetworkReply::NoError) {
switch (error) {
case QNetworkReply::ContentNotFoundError:
- status = _("Key Not Found");
+ status = tr("Key Not Found");
break;
case QNetworkReply::TimeoutError:
- status = _("Timeout");
+ status = tr("Timeout");
break;
case QNetworkReply::HostNotFoundError:
- status = _("Key Server Not Found");
+ status = tr("Key Server Not Found");
break;
default:
- status = _("Connection Error");
+ status = tr("Connection Error");
}
}
@@ -458,9 +458,9 @@ void CommonUtils::SlotImportKeyFromKeyServer(
GFBuffer(reply->readAll()));
if (result->imported == 1) {
- status = _("The key has been updated");
+ status = tr("The key has been updated");
} else {
- status = _("No need to update the key");
+ status = tr("No need to update the key");
}
callback(key_id, status, current_index, all_index);
current_index++;
@@ -491,10 +491,10 @@ void CommonUtils::slot_update_key_status() {
void CommonUtils::slot_popup_passphrase_input_dialog() {
auto *dialog = new QInputDialog(QApplication::activeWindow(), Qt::Dialog);
dialog->setModal(true);
- dialog->setWindowTitle(_("Password Input Dialog"));
+ dialog->setWindowTitle(tr("Password Input Dialog"));
dialog->setInputMode(QInputDialog::TextInput);
dialog->setTextEchoMode(QLineEdit::Password);
- dialog->setLabelText(_("Please Input The Password"));
+ dialog->setLabelText(tr("Please Input The Password"));
dialog->resize(500, 80);
dialog->exec();
diff --git a/src/ui/dialog/QuitDialog.cpp b/src/ui/dialog/QuitDialog.cpp
index c02f5898..6dd5674e 100755
--- a/src/ui/dialog/QuitDialog.cpp
+++ b/src/ui/dialog/QuitDialog.cpp
@@ -32,7 +32,7 @@ namespace GpgFrontend::UI {
QuitDialog::QuitDialog(QWidget* parent, const QHash<int, QString>& unsavedDocs)
: GeneralDialog("quit_dialog", parent) {
- setWindowTitle(_("Unsaved Files"));
+ setWindowTitle(tr("Unsaved Files"));
setModal(true);
discarded_ = false;
@@ -75,15 +75,14 @@ QuitDialog::QuitDialog(QWidget* parent, const QHash<int, QString>& unsavedDocs)
/*
* Warnbox with icon and text
*/
- auto pixmap = QPixmap(":error.png");
+ auto pixmap = QPixmap(":/icons/error.png");
pixmap = pixmap.scaled(50, 50, Qt::KeepAspectRatio, Qt::SmoothTransformation);
auto* warn_icon = new QLabel();
warn_icon->setPixmap(pixmap);
- const auto info =
- QString(_("%1 files contain unsaved information.<br/>Save the "
- "changes before closing?"))
- .arg(row);
+ const auto info = tr("%1 files contain unsaved information.<br/>Save the "
+ "changes before closing?")
+ .arg(row);
auto* warn_label = new QLabel(info);
auto* warn_box_layout = new QHBoxLayout();
warn_box_layout->addWidget(warn_icon);
@@ -95,10 +94,10 @@ QuitDialog::QuitDialog(QWidget* parent, const QHash<int, QString>& unsavedDocs)
/*
* Two labels on top and under the filelist
*/
- auto* check_label = new QLabel(_("Check the files you want to save:"));
+ auto* check_label = new QLabel(tr("Check the files you want to save:"));
auto* note_label = new QLabel(
- "<b>" + QString(_("Note")) + ":</b>" +
- _("If you don't save these files, all changes are lost.") + "<br/>");
+ "<b>" + tr("Note") + ":</b>" +
+ tr("If you don't save these files, all changes are lost.") + "<br/>");
/*
* Buttonbox
diff --git a/src/ui/dialog/SignersPicker.cpp b/src/ui/dialog/SignersPicker.cpp
index 3edde0be..378a58c7 100644
--- a/src/ui/dialog/SignersPicker.cpp
+++ b/src/ui/dialog/SignersPicker.cpp
@@ -35,8 +35,8 @@ namespace GpgFrontend::UI {
SignersPicker::SignersPicker(QWidget* parent)
: GeneralDialog(typeid(SignersPicker).name(), parent) {
- auto* confirm_button = new QPushButton(_("Confirm"));
- auto* cancel_button = new QPushButton(_("Cancel"));
+ auto* confirm_button = new QPushButton(tr("Confirm"));
+ auto* cancel_button = new QPushButton(tr("Cancel"));
connect(confirm_button, &QPushButton::clicked,
[=]() { this->accepted_ = true; });
@@ -46,7 +46,7 @@ SignersPicker::SignersPicker(QWidget* parent)
/*Setup KeyList*/
key_list_ = new KeyList(0U, this);
key_list_->AddListGroupTab(
- _("Signers"), "signers", KeyListRow::ONLY_SECRET_KEY,
+ tr("Signers"), "signers", KeyListRow::ONLY_SECRET_KEY,
KeyListColumn::NAME | KeyListColumn::EmailAddress | KeyListColumn::Usage,
[](const GpgKey& key, const KeyTable&) -> bool {
return key.IsHasActualSigningCapability();
@@ -54,13 +54,13 @@ SignersPicker::SignersPicker(QWidget* parent)
key_list_->SlotRefresh();
auto* vbox2 = new QVBoxLayout();
- vbox2->addWidget(new QLabel(QString(_("Select Signer(s)")) + ": "));
+ vbox2->addWidget(new QLabel(tr("Select Signer(s)") + ": "));
vbox2->addWidget(key_list_);
vbox2->addWidget(new QLabel(
QString(
- _("Please select one or more private keys you use for signing.")) +
+ tr("Please select one or more private keys you use for signing.")) +
"\n" +
- _("If no key is selected, the default key will be used for signing.")));
+ tr("If no key is selected, the default key will be used for signing.")));
vbox2->addWidget(confirm_button);
vbox2->addWidget(cancel_button);
vbox2->addStretch(0);
@@ -70,7 +70,7 @@ SignersPicker::SignersPicker(QWidget* parent)
Qt::CustomizeWindowHint);
this->setModal(true);
- this->setWindowTitle(_("Signers Picker"));
+ this->setWindowTitle(tr("Signers Picker"));
this->setMinimumWidth(480);
movePosition2CenterOfParent();
diff --git a/src/ui/dialog/Wizard.cpp b/src/ui/dialog/Wizard.cpp
index dd23fcc0..89ebee27 100644
--- a/src/ui/dialog/Wizard.cpp
+++ b/src/ui/dialog/Wizard.cpp
@@ -41,12 +41,12 @@ Wizard::Wizard(QWidget* parent) : QWizard(parent) {
#ifndef Q_WS_MAC
setWizardStyle(ModernStyle);
#endif
- setWindowTitle(_("First Start Wizard"));
+ setWindowTitle(tr("First Start Wizard"));
// http://www.flickr.com/photos/laureenp/6141822934/
- setPixmap(QWizard::WatermarkPixmap, QPixmap(":/keys2.jpg"));
- setPixmap(QWizard::LogoPixmap, QPixmap(":/logo_small.png"));
- setPixmap(QWizard::BannerPixmap, QPixmap(":/banner.png"));
+ setPixmap(QWizard::WatermarkPixmap, QPixmap(":/icons/keys2.jpg"));
+ setPixmap(QWizard::LogoPixmap, QPixmap(":/icons/logo_small.png"));
+ setPixmap(QWizard::BannerPixmap, QPixmap(":/icons/banner.png"));
int next_page_id = GlobalSettingStation::GetInstance()
.GetSettings()
@@ -71,19 +71,20 @@ void Wizard::slot_wizard_accepted() {
}
IntroPage::IntroPage(QWidget* parent) : QWizardPage(parent) {
- setTitle(_("Getting Started..."));
- setSubTitle(_("... with GpgFrontend"));
+ setTitle(tr("Getting Started..."));
+ setSubTitle(tr("... with GpgFrontend"));
auto* topLabel = new QLabel(
- QString(_("Welcome to use GpgFrontend for decrypting and signing text or "
- "file!")) +
+ QString(
+ tr("Welcome to use GpgFrontend for decrypting and signing text or "
+ "file!")) +
" <br><br><a href='https://gpgfrontend.bktus.com'>GpgFrontend</a> " +
- _("is a Powerful, Easy-to-Use, Compact, Cross-Platform, and "
- "Installation-Free OpenPGP Crypto Tool.") +
- _("For brief information have a look at the") +
+ tr("is a Powerful, Easy-to-Use, Compact, Cross-Platform, and "
+ "Installation-Free OpenPGP Crypto Tool.") +
+ tr("For brief information have a look at the") +
" <a href='https://gpgfrontend.bktus.com/index.html#/overview'>" +
- _("Overview") + "</a> (" +
- _("by clicking the link, the page will open in the web browser") +
+ tr("Overview") + "</a> (" +
+ tr("by clicking the link, the page will open in the web browser") +
"). <br>");
topLabel->setTextFormat(Qt::RichText);
topLabel->setTextInteractionFlags(Qt::TextBrowserInteraction);
@@ -92,8 +93,8 @@ IntroPage::IntroPage(QWidget* parent) : QWizardPage(parent) {
// QComboBox for language selection
auto* lang_label =
- new QLabel(_("If it supports the language currently being used in your "
- "system, GpgFrontend will automatically set it."));
+ new QLabel(tr("If it supports the language currently being used in your "
+ "system, GpgFrontend will automatically set it."));
lang_label->setWordWrap(true);
// set layout and add widgets
@@ -108,60 +109,56 @@ IntroPage::IntroPage(QWidget* parent) : QWizardPage(parent) {
int IntroPage::nextId() const { return Wizard::Page_Choose; }
ChoosePage::ChoosePage(QWidget* parent) : QWizardPage(parent) {
- setTitle(_("Choose your action..."));
- setSubTitle(_("...by clicking on the appropriate link."));
-
- auto* keygenLabel = new QLabel(
- QString(_(
- "If you have never used GpgFrontend before and also don't own a gpg "
- "key yet you "
- "may possibly want to read how to")) +
- " <a "
- "href=\"https://gpgfrontend.bktus.com/index.html#/manual/"
+ setTitle(tr("Choose your action..."));
+ setSubTitle(tr("...by clicking on the appropriate link."));
+
+ auto* keygen_label = new QLabel(
+ tr("If you have never used GpgFrontend before and also don't own a gpg "
+ "key yet you may possibly want to read how to") +
+ " <a href=\"https://gpgfrontend.bktus.com/index.html#/manual/"
"generate-key\">" +
- _("Generate Key") + "</a><hr>");
- keygenLabel->setTextFormat(Qt::RichText);
- keygenLabel->setTextInteractionFlags(Qt::TextBrowserInteraction);
- keygenLabel->setOpenExternalLinks(true);
- keygenLabel->setWordWrap(true);
-
- auto* encrDecyTextLabel = new QLabel(
- QString(_(
- "If you want to learn how to encrypt, decrypt, sign and verify text, "
- "you can read ")) +
+ tr("Generate Key") + "</a><hr>");
+ keygen_label->setTextFormat(Qt::RichText);
+ keygen_label->setTextInteractionFlags(Qt::TextBrowserInteraction);
+ keygen_label->setOpenExternalLinks(true);
+ keygen_label->setWordWrap(true);
+
+ 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/index.html#/manual/"
"encrypt-decrypt-text\">" +
- _("Encrypt & Decrypt Text") + "</a> " + _("or") +
+ tr("Encrypt & Decrypt Text") + "</a> " + tr("or") +
" <a "
"href=\"https://gpgfrontend.bktus.com/index.html#/manual/"
"sign-verify-text\">" +
- _("Sign & Verify Text") + "</a><hr>");
+ tr("Sign & Verify Text") + "</a><hr>");
- encrDecyTextLabel->setTextFormat(Qt::RichText);
- encrDecyTextLabel->setTextInteractionFlags(Qt::TextBrowserInteraction);
- encrDecyTextLabel->setOpenExternalLinks(true);
- encrDecyTextLabel->setWordWrap(true);
+ encr_decy_text_label->setTextFormat(Qt::RichText);
+ encr_decy_text_label->setTextInteractionFlags(Qt::TextBrowserInteraction);
+ encr_decy_text_label->setOpenExternalLinks(true);
+ encr_decy_text_label->setWordWrap(true);
- auto* signVerifyTextLabel =
- new QLabel(QString(_("If you want to operate file, you can read ")) +
+ auto* sign_verify_text_label =
+ new QLabel(tr("If you want to operate file, you can read ") +
"<a "
"href=\"https://gpgfrontend.bktus.com/index.html#/manual/"
"encrypt-decrypt-file\">" +
- _("Encrypt & Sign File") + "</a> " + _("or") +
+ tr("Encrypt & Sign File") + "</a> " + tr("or") +
" <a "
"href=\"https://gpgfrontend.bktus.com/index.html#/manual/"
"sign-verify-file\">" +
- _("Sign & Verify File") + "</a><hr>");
- signVerifyTextLabel->setTextFormat(Qt::RichText);
- signVerifyTextLabel->setTextInteractionFlags(Qt::TextBrowserInteraction);
- signVerifyTextLabel->setOpenExternalLinks(true);
- signVerifyTextLabel->setWordWrap(true);
+ 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);
+ sign_verify_text_label->setWordWrap(true);
auto* layout = new QVBoxLayout();
- layout->addWidget(keygenLabel);
- layout->addWidget(encrDecyTextLabel);
- layout->addWidget(signVerifyTextLabel);
+ layout->addWidget(keygen_label);
+ layout->addWidget(encr_decy_text_label);
+ layout->addWidget(sign_verify_text_label);
setLayout(layout);
next_page_ = Wizard::Page_Conclusion;
}
@@ -178,33 +175,33 @@ void ChoosePage::slot_jump_page(const QString& page) {
}
KeyGenPage::KeyGenPage(QWidget* parent) : QWizardPage(parent) {
- setTitle(_("Create a keypair..."));
- setSubTitle(_("...for decrypting and signing messages"));
- auto* topLabel = new QLabel(
- _("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):"));
- topLabel->setWordWrap(true);
- auto* linkLabel = new QLabel(
+ setTitle(tr("Create a keypair..."));
+ setSubTitle(tr("...for decrypting and signing messages"));
+ auto* top_label = new QLabel(
+ tr("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):"));
+ top_label->setWordWrap(true);
+ auto* link_label = new QLabel(
"<a href="
"docu_keygen.html#content"
">" +
- QString(_("Offline tutorial")) + "</a>");
+ tr("Offline tutorial") + "</a>");
- auto* createKeyButtonBox = new QWidget(this);
- auto* createKeyButtonBoxLayout = new QHBoxLayout(createKeyButtonBox);
- auto* createKeyButton = new QPushButton(_("Create New Key"));
- createKeyButtonBoxLayout->addWidget(createKeyButton);
- createKeyButtonBoxLayout->addStretch(1);
+ auto* create_key_button_box = new QWidget(this);
+ auto* create_key_button_box_layout = new QHBoxLayout(create_key_button_box);
+ auto* create_key_button = new QPushButton(tr("Create New Key"));
+ create_key_button_box_layout->addWidget(create_key_button);
+ create_key_button_box_layout->addStretch(1);
auto* layout = new QVBoxLayout();
- layout->addWidget(topLabel);
- layout->addWidget(linkLabel);
- layout->addWidget(createKeyButtonBox);
- connect(createKeyButton, &QPushButton::clicked, this,
+ layout->addWidget(top_label);
+ layout->addWidget(link_label);
+ layout->addWidget(create_key_button_box);
+ connect(create_key_button, &QPushButton::clicked, this,
&KeyGenPage::slot_generate_key_dialog);
setLayout(layout);
@@ -218,17 +215,17 @@ void KeyGenPage::slot_generate_key_dialog() {
}
ConclusionPage::ConclusionPage(QWidget* parent) : QWizardPage(parent) {
- setTitle(_("Ready."));
- setSubTitle(_("Have fun with GpgFrontend!"));
+ setTitle(tr("Ready."));
+ setSubTitle(tr("Have fun with GpgFrontend!"));
auto* bottomLabel = new QLabel(
- QString(_("You are ready to use GpgFrontend now.<br><br>")) +
+ tr("You are ready to use GpgFrontend now.<br><br>") +
"<a "
"href=\"https://saturneric.github.io/GpgFrontend/index.html#/"
"overview\">" +
- _("The Online Document") + "</a>" +
- _(" will get you started with GpgFrontend. Anytime you encounter "
- "problems, please try to find help from the documentation") +
+ tr("The Online Document") + "</a>" +
+ tr(" will get you started with GpgFrontend. Anytime you encounter "
+ "problems, please try to find help from the documentation") +
"<br>");
bottomLabel->setTextFormat(Qt::RichText);
@@ -236,10 +233,10 @@ ConclusionPage::ConclusionPage(QWidget* parent) : QWizardPage(parent) {
bottomLabel->setOpenExternalLinks(true);
bottomLabel->setWordWrap(true);
- open_help_check_box_ = new QCheckBox(_("Open offline help."));
+ open_help_check_box_ = new QCheckBox(tr("Open offline help."));
open_help_check_box_->setChecked(true);
- dont_show_wizard_checkbox_ = new QCheckBox(_("Dont show the wizard again."));
+ dont_show_wizard_checkbox_ = new QCheckBox(tr("Dont show the wizard again."));
dont_show_wizard_checkbox_->setChecked(true);
registerField("showWizard", dont_show_wizard_checkbox_);
diff --git a/src/ui/dialog/details/VerifyDetailsDialog.cpp b/src/ui/dialog/details/VerifyDetailsDialog.cpp
index ba23b2c6..cea34607 100644
--- a/src/ui/dialog/details/VerifyDetailsDialog.cpp
+++ b/src/ui/dialog/details/VerifyDetailsDialog.cpp
@@ -35,7 +35,7 @@ namespace GpgFrontend::UI {
VerifyDetailsDialog::VerifyDetailsDialog(QWidget* parent, GpgError error,
GpgVerifyResult result)
: QDialog(parent), m_result_(result), error_(error) {
- this->setWindowTitle(_("Signatures Details"));
+ this->setWindowTitle(tr("Signatures Details"));
main_layout_ = new QHBoxLayout();
this->setLayout(main_layout_);
@@ -58,7 +58,7 @@ void VerifyDetailsDialog::slot_refresh() {
auto signatures = m_result_.GetSignature();
if (signatures.empty()) {
- m_vbox_layout->addWidget(new QLabel(_("No valid input found")));
+ m_vbox_layout->addWidget(new QLabel(tr("No valid input found")));
m_vbox_layout->addWidget(button_box_);
return;
}
@@ -68,16 +68,16 @@ void VerifyDetailsDialog::slot_refresh() {
// Set the title widget depending on sign status
if (gpg_err_code(signatures[0].GetStatus()) == GPG_ERR_BAD_SIGNATURE) {
- m_vbox_layout->addWidget(new QLabel(_("Error Validating signature")));
+ m_vbox_layout->addWidget(new QLabel(tr("Error Validating signature")));
} else if (input_signature_ != nullptr) {
- const auto info = QString(_("File was signed on %1"))
- .arg(QLocale::system().toString(timestamp)) +
- "<br/>" + _("It Contains") + ": " + "<br/><br/>";
+ const auto info =
+ tr("File was signed on %1").arg(QLocale::system().toString(timestamp)) +
+ "<br/>" + tr("It Contains") + ": " + "<br/><br/>";
m_vbox_layout->addWidget(new QLabel(info));
} else {
const auto info =
- QString(_("Signed on %1")).arg(QLocale::system().toString(timestamp)) +
- "<br/>" + _("It Contains") + ": " + "<br/><br/>";
+ tr("Signed on %1").arg(QLocale::system().toString(timestamp)) +
+ "<br/>" + tr("It Contains") + ": " + "<br/><br/>";
m_vbox_layout->addWidget(new QLabel(info));
}
// Add information box for every single key
diff --git a/src/ui/dialog/gnupg/GnuPGControllerDialog.cpp b/src/ui/dialog/gnupg/GnuPGControllerDialog.cpp
index 43dbcf1e..fbf018ca 100644
--- a/src/ui/dialog/gnupg/GnuPGControllerDialog.cpp
+++ b/src/ui/dialog/gnupg/GnuPGControllerDialog.cpp
@@ -42,26 +42,26 @@ GnuPGControllerDialog::GnuPGControllerDialog(QWidget* parent)
ui_(GpgFrontend::SecureCreateSharedObject<Ui_GnuPGControllerDialog>()) {
ui_->setupUi(this);
- ui_->generalBox->setTitle(_("General"));
- ui_->keyDatabaseGroupBox->setTitle(_("Key Database"));
- ui_->advanceGroupBox->setTitle(_("Advanced"));
+ ui_->generalBox->setTitle(tr("General"));
+ ui_->keyDatabaseGroupBox->setTitle(tr("Key Database"));
+ ui_->advanceGroupBox->setTitle(tr("Advanced"));
- ui_->asciiModeCheckBox->setText(_("No ASCII Mode"));
+ ui_->asciiModeCheckBox->setText(tr("No ASCII Mode"));
ui_->usePinentryAsPasswordInputDialogCheckBox->setText(
- _("Use Pinentry as Password Input Dialog"));
- ui_->useCustomGnuPGInstallPathCheckBox->setText(_("Use Custom GnuPG"));
- ui_->useCustomGnuPGInstallPathButton->setText(_("Select GnuPG Path"));
+ tr("Use Pinentry as Password Input Dialog"));
+ ui_->useCustomGnuPGInstallPathCheckBox->setText(tr("Use Custom GnuPG"));
+ ui_->useCustomGnuPGInstallPathButton->setText(tr("Select GnuPG Path"));
ui_->keyDatabseUseCustomCheckBox->setText(
- _("Use Custom GnuPG Key Database Path"));
+ tr("Use Custom GnuPG Key Database Path"));
ui_->customKeyDatabasePathSelectButton->setText(
- _("Select Key Database Path"));
+ tr("Select Key Database Path"));
// tips
ui_->customGnuPGPathTipsLabel->setText(
- _("Tips: please select a directroy where \"gpgconf\" is located in."));
+ tr("Tips: please select a directroy where \"gpgconf\" is located in."));
ui_->restartTipsLabel->setText(
- _("Tips: notice that modify any of these settings will cause an "
- "Application restart."));
+ tr("Tips: notice that modify any of these settings will cause an "
+ "Application restart."));
// announce main window
connect(this, &GnuPGControllerDialog::SignalRestartNeeded,
@@ -92,7 +92,7 @@ GnuPGControllerDialog::GnuPGControllerDialog(QWidget* parent)
[=]() {
QString selected_custom_key_database_path =
QFileDialog::getExistingDirectory(
- this, _("Open Directory"), {},
+ this, tr("Open Directory"), {},
QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
GF_UI_LOG_DEBUG("key databse path selected: {}",
@@ -123,7 +123,7 @@ GnuPGControllerDialog::GnuPGControllerDialog(QWidget* parent)
ui_->useCustomGnuPGInstallPathButton, &QPushButton::clicked, this, [=]() {
QString selected_custom_gnupg_install_path =
QFileDialog::getExistingDirectory(
- this, _("Open Directory"), {},
+ this, tr("Open Directory"), {},
QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
GF_UI_LOG_DEBUG("gnupg install path selected: {}",
@@ -169,7 +169,7 @@ GnuPGControllerDialog::GnuPGControllerDialog(QWidget* parent)
connect(this, &QDialog::finished, this, &GnuPGControllerDialog::deleteLater);
#endif
- setWindowTitle(_("GnuPG Controller"));
+ setWindowTitle(tr("GnuPG Controller"));
set_settings();
}
@@ -328,23 +328,23 @@ void GnuPGControllerDialog::slot_set_restart_needed(int mode) {
bool GnuPGControllerDialog::check_custom_gnupg_path(QString path) {
if (path.isEmpty()) {
- QMessageBox::critical(this, _("Illegal GnuPG Path"),
- _("Target GnuPG Path is empty."));
+ QMessageBox::critical(this, tr("Illegal GnuPG Path"),
+ tr("Target GnuPG Path is empty."));
return false;
}
QFileInfo dir_info(path);
if (!dir_info.exists() || !dir_info.isReadable() || !dir_info.isDir()) {
QMessageBox::critical(
- this, _("Illegal GnuPG Path"),
- _("Target GnuPG Path is not an exists readable directory."));
+ this, tr("Illegal GnuPG Path"),
+ tr("Target GnuPG Path is not an exists readable directory."));
return false;
}
QDir dir(path);
if (!dir.isAbsolute()) {
- QMessageBox::critical(this, _("Illegal GnuPG Path"),
- _("Target GnuPG Path is not an absolute path."));
+ QMessageBox::critical(this, tr("Illegal GnuPG Path"),
+ tr("Target GnuPG Path is not an absolute path."));
}
#ifdef WINDOWS
QFileInfo gpgconf_info(path + "/gpgconf.exe");
@@ -355,8 +355,8 @@ bool GnuPGControllerDialog::check_custom_gnupg_path(QString path) {
if (!gpgconf_info.exists() || !gpgconf_info.isExecutable() ||
!gpgconf_info.isFile()) {
QMessageBox::critical(
- this, _("Illegal GnuPG Path"),
- _("Target GnuPG Path contains no \"gpgconf\" executable."));
+ this, tr("Illegal GnuPG Path"),
+ tr("Target GnuPG Path contains no \"gpgconf\" executable."));
return false;
}
@@ -366,16 +366,16 @@ bool GnuPGControllerDialog::check_custom_gnupg_path(QString path) {
auto GnuPGControllerDialog::check_custom_gnupg_key_database_path(QString path)
-> bool {
if (path.isEmpty()) {
- QMessageBox::critical(this, _("Illegal GnuPG Key Database Path"),
- _("Target GnuPG Key Database Path is empty."));
+ QMessageBox::critical(this, tr("Illegal GnuPG Key Database Path"),
+ tr("Target GnuPG Key Database Path is empty."));
return false;
}
QFileInfo dir_info(path);
if (!dir_info.exists() || !dir_info.isReadable() || !dir_info.isDir()) {
- QMessageBox::critical(this, _("Illegal GnuPG Key Database Path"),
- _("Target GnuPG Key Database Path is not an "
- "exists readable directory."));
+ QMessageBox::critical(this, tr("Illegal GnuPG Key Database Path"),
+ tr("Target GnuPG Key Database Path is not an "
+ "exists readable directory."));
return false;
}
diff --git a/src/ui/dialog/help/AboutDialog.cpp b/src/ui/dialog/help/AboutDialog.cpp
index 6f8dedc2..54deed22 100644
--- a/src/ui/dialog/help/AboutDialog.cpp
+++ b/src/ui/dialog/help/AboutDialog.cpp
@@ -31,11 +31,9 @@
#include <openssl/opensslv.h>
#include <any>
-#include <string>
#include "GpgFrontendBuildInfo.h"
#include "core/function/GlobalSettingStation.h"
-#include "core/module/Module.h"
#include "core/module/ModuleManager.h"
#include "ui/dialog/help/GnupgTab.h"
@@ -43,7 +41,7 @@ namespace GpgFrontend::UI {
AboutDialog::AboutDialog(int defaultIndex, QWidget* parent)
: GeneralDialog(typeid(AboutDialog).name(), parent) {
- this->setWindowTitle(QString(_("About")) + " " + qApp->applicationName());
+ this->setWindowTitle(tr("About") + " " + qApp->applicationName());
auto* tab_widget = new QTabWidget;
auto* info_tab = new InfoTab();
@@ -51,10 +49,10 @@ AboutDialog::AboutDialog(int defaultIndex, QWidget* parent)
auto* translators_tab = new TranslatorsTab();
update_tab_ = new UpdateTab();
- tab_widget->addTab(info_tab, _("About GpgFrontend"));
- tab_widget->addTab(gnupg_tab, _("GnuPG"));
- tab_widget->addTab(translators_tab, _("Translators"));
- tab_widget->addTab(update_tab_, _("Update"));
+ tab_widget->addTab(info_tab, tr("About GpgFrontend"));
+ tab_widget->addTab(gnupg_tab, tr("GnuPG"));
+ tab_widget->addTab(translators_tab, tr("Translators"));
+ tab_widget->addTab(update_tab_, tr("Update"));
connect(tab_widget, &QTabWidget::currentChanged, this,
[&](int index) { GF_UI_LOG_DEBUG("current index: {}", index); });
@@ -83,26 +81,26 @@ 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(":gpgfrontend-logo.png");
+ auto* pixmap = new QPixmap(":/icons/gpgfrontend-logo.png");
auto* text = new QString(
"<center><h2>" + qApp->applicationName() + "</h2></center>" +
"<center><b>" + qApp->applicationVersion() + "</b></center>" +
"<center>" + GIT_VERSION + "</center>" + "<br><center>" +
- _("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") +
+ tr("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") +
"<br><br>"
"<b>" +
- _("Developer:") + "</b><br>" + "Saturneric" + "<br><br>" +
- _("If you have any questions or suggestions, raise an issue at") +
+ tr("Developer:") + "</b><br>" + "Saturneric" + "<br><br>" +
+ tr("If you have any questions or suggestions, raise an issue at") +
"<br/>"
" <a href=\"https://github.com/saturneric/GpgFrontend\">GitHub</a> " +
- _("or send a mail to my mailing list at") + " <a " +
+ tr("or send a mail to my mailing list at") + " <a " +
"href=\"mailto:[email protected]\">[email protected]</a>." + "<br><br> " +
- _("Built with Qt") + " " + qVersion() + ", " + OPENSSL_VERSION_TEXT +
- " " + _("and") + " " + "GPGME" + " " + gpgme_version + "<br>" +
- _("Built at") + " " + BUILD_TIMESTAMP + "</center>");
+ tr("Built with Qt") + " " + qVersion() + ", " + OPENSSL_VERSION_TEXT +
+ " " + tr("and") + " " + "GPGME" + " " + gpgme_version + "<br>" +
+ tr("Built at") + " " + BUILD_TIMESTAMP + "</center>");
auto* layout = new QGridLayout();
auto* pixmap_label = new QLabel();
@@ -139,9 +137,9 @@ TranslatorsTab::TranslatorsTab(QWidget* parent) : QWidget(parent) {
main_layout->addStretch();
auto* notice_label = new QLabel(
- _("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."),
+ tr("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."),
this);
notice_label->setWordWrap(true);
main_layout->addWidget(notice_label);
@@ -150,7 +148,7 @@ TranslatorsTab::TranslatorsTab(QWidget* parent) : QWidget(parent) {
}
UpdateTab::UpdateTab(QWidget* parent) : QWidget(parent) {
- auto* pixmap = new QPixmap(":gpgfrontend-logo.png");
+ auto* pixmap = new QPixmap(":/icons/gpgfrontend-logo.png");
auto* layout = new QGridLayout();
auto* pixmap_label = new QLabel();
pixmap_label->setPixmap(*pixmap);
@@ -162,17 +160,17 @@ UpdateTab::UpdateTab(QWidget* parent) : QWidget(parent) {
auto* tips_label = new QLabel();
tips_label->setText(
"<center>" +
- QString(_("It is recommended that you always check the version "
- "of GpgFrontend and upgrade to the latest version.")) +
+ tr("It is recommended that you always check the version "
+ "of GpgFrontend and upgrade to the latest version.") +
"</center><center>" +
- _("New versions not only represent new features, but "
- "also often represent functional and security fixes.") +
+ tr("New versions not only represent new features, but "
+ "also often represent functional and security fixes.") +
"</center>");
tips_label->setWordWrap(true);
current_version_label_ = new QLabel();
- current_version_label_->setText("<center>" + QString(_("Current Version")) +
- _(": ") + "<b>" + current_version_ +
+ current_version_label_->setText("<center>" + tr("Current Version") +
+ tr(": ") + "<b>" + current_version_ +
"</b></center>");
current_version_label_->setWordWrap(true);
@@ -254,41 +252,41 @@ void UpdateTab::slot_show_version_status() {
"version.latest_version", QString{});
latest_version_label_->setText("<center><b>" +
- QString(_("Latest Version From Github")) +
- ": " + latest_version + "</b></center>");
+ tr("Latest Version From Github") + ": " +
+ latest_version + "</b></center>");
if (is_need_upgrade) {
upgrade_label_->setText(
"<center>" +
- QString(_("The current version is less than the latest version on "
- "github.")) +
- "</center><center>" + _("Please click") +
+ tr("The current version is less than the latest version on "
+ "github.") +
+ "</center><center>" + tr("Please click") +
" <a "
"href=\"https://www.gpgfrontend.bktus.com/#/downloads\">" +
- _("Here") + "</a> " + _("to download the latest stable version.") +
+ tr("Here") + "</a> " + tr("to download the latest stable version.") +
"</center>");
upgrade_label_->show();
} else if (is_current_a_withdrawn_version) {
upgrade_label_->setText(
"<center>" +
- QString(_("This version has serious problems and has been withdrawn. "
- "Please stop using it immediately.")) +
- "</center><center>" + _("Please click") +
+ tr("This version has serious problems and has been withdrawn. "
+ "Please stop using it immediately.") +
+ "</center><center>" + tr("Please click") +
" <a "
"href=\"https://github.com/saturneric/GpgFrontend/releases\">" +
- _("Here") + "</a> " + _("to download the latest stable version.") +
+ tr("Here") + "</a> " + tr("to download the latest stable version.") +
"</center>");
upgrade_label_->show();
} else if (!is_current_version_released) {
upgrade_label_->setText(
"<center>" +
- QString(_("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.")) +
- "</center><center>" + _("Please click") +
+ tr("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.") +
+ "</center><center>" + tr("Please click") +
" <a "
"href=\"https://www.gpgfrontend.bktus.com/#/downloads\">" +
- _("Here") + "</a> " + _("to download the latest stable version.") +
+ tr("Here") + "</a> " + tr("to download the latest stable version.") +
"</center>");
upgrade_label_->show();
}
diff --git a/src/ui/dialog/help/GnupgTab.cpp b/src/ui/dialog/help/GnupgTab.cpp
index 660732ac..28f1acfe 100644
--- a/src/ui/dialog/help/GnupgTab.cpp
+++ b/src/ui/dialog/help/GnupgTab.cpp
@@ -41,11 +41,11 @@ GpgFrontend::UI::GnupgTab::GnupgTab(QWidget* parent)
ui_->setupUi(this);
QStringList components_column_titles;
- components_column_titles << _("Name") << _("Description") << _("Version")
- << _("Checksum") << _("Binary Path");
+ components_column_titles << tr("Name") << tr("Description") << tr("Version")
+ << tr("Checksum") << tr("Binary Path");
- ui_->tabWidget->setTabText(0, _("Components"));
- ui_->tabWidget->setTabText(1, _("Configurations"));
+ ui_->tabWidget->setTabText(0, tr("Components"));
+ ui_->tabWidget->setTabText(1, tr("Configurations"));
ui_->componentDetailsTable->setColumnCount(components_column_titles.length());
ui_->componentDetailsTable->setHorizontalHeaderLabels(
@@ -55,9 +55,9 @@ GpgFrontend::UI::GnupgTab::GnupgTab(QWidget* parent)
QAbstractItemView::SelectRows);
QStringList configurations_column_titles;
- configurations_column_titles << _("Component") << _("Group") << _("Key")
- << _("Description") << _("Default Value")
- << _("Value");
+ configurations_column_titles << tr("Component") << tr("Group") << tr("Key")
+ << tr("Description") << tr("Default Value")
+ << tr("Value");
ui_->configurationDetailsTable->setColumnCount(
configurations_column_titles.length());
diff --git a/src/ui/dialog/import_export/ExportKeyPackageDialog.cpp b/src/ui/dialog/import_export/ExportKeyPackageDialog.cpp
index 2883d486..7c740063 100644
--- a/src/ui/dialog/import_export/ExportKeyPackageDialog.cpp
+++ b/src/ui/dialog/import_export/ExportKeyPackageDialog.cpp
@@ -49,8 +49,9 @@ GpgFrontend::UI::ExportKeyPackageDialog::ExportKeyPackageDialog(
connect(ui_->setOutputPathButton, &QPushButton::clicked, this, [=]() {
auto file_name = QFileDialog::getSaveFileName(
- this, _("Export Key Package"), ui_->nameValueLabel->text() + ".gfepack",
- QString(_("Key Package")) + " (*.gfepack);;All Files (*)");
+ this, tr("Export Key Package"),
+ ui_->nameValueLabel->text() + ".gfepack",
+ tr("Key Package") + " (*.gfepack);;All Files (*)");
// check path
if (file_name.isEmpty()) return;
@@ -60,17 +61,17 @@ GpgFrontend::UI::ExportKeyPackageDialog::ExportKeyPackageDialog(
connect(ui_->generatePassphraseButton, &QPushButton::clicked, this, [=]() {
auto file_name = QFileDialog::getSaveFileName(
- this, _("Export Key Package Passphrase"),
+ this, tr("Export Key Package Passphrase"),
ui_->nameValueLabel->text() + ".key",
- QString(_("Key File")) + " (*.key);;All Files (*)");
+ tr("Key File") + " (*.key);;All Files (*)");
// check path
if (file_name.isEmpty()) return;
if (!KeyPackageOperator::GeneratePassphrase(file_name, passphrase_)) {
QMessageBox::critical(
- this, _("Error"),
- _("An error occurred while generating the passphrase file."));
+ this, tr("Error"),
+ tr("An error occurred while generating the passphrase file."));
return;
}
ui_->passphraseValueLabel->setText(file_name);
@@ -79,17 +80,17 @@ GpgFrontend::UI::ExportKeyPackageDialog::ExportKeyPackageDialog(
connect(ui_->button_box_, &QDialogButtonBox::accepted, this, [=]() {
if (ui_->outputPathLabel->text().isEmpty()) {
QMessageBox::critical(
- this, _("Forbidden"),
- _("Please select an output path before exporting."));
+ this, tr("Forbidden"),
+ tr("Please select an output path before exporting."));
return;
}
if (ui_->passphraseValueLabel->text().isEmpty()) {
QMessageBox::critical(
- this, _("Forbidden"),
- _("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."));
+ this, tr("Forbidden"),
+ tr("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."));
return;
}
@@ -102,13 +103,13 @@ GpgFrontend::UI::ExportKeyPackageDialog::ExportKeyPackageDialog(
keys->erase(keys_new_end, keys->end());
if (keys->empty()) {
- QMessageBox::critical(this, _("Error"),
- _("No key is suitable to export."));
+ QMessageBox::critical(this, tr("Error"),
+ tr("No key is suitable to export."));
return;
}
CommonUtils::WaitForOpera(
- this, _("Generating"), [this, keys](const OperaWaitingHd& op_hd) {
+ this, tr("Generating"), [this, keys](const OperaWaitingHd& op_hd) {
KeyPackageOperator::GenerateKeyPackage(
ui_->outputPathLabel->text(), ui_->nameValueLabel->text(), *keys,
passphrase_, ui_->includeSecretKeyCheckBox->isChecked(),
@@ -118,24 +119,25 @@ GpgFrontend::UI::ExportKeyPackageDialog::ExportKeyPackageDialog(
if (err >= 0) {
QMessageBox::information(
- this, _("Success"),
+ this, tr("Success"),
QString(
- _("The Key Package has been successfully generated "
- "and has been protected by encryption "
- "algorithms(AES-256-ECB). You can safely transfer "
- "your Key Package.")) +
+ tr("The Key Package has been successfully generated "
+ "and has been protected by encryption "
+ "algorithms(AES-256-ECB). You can safely transfer "
+ "your Key Package.")) +
"<br /><br />" + "<b>" +
- _("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.") +
+ tr("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.") +
"</b>");
accept();
} else {
QMessageBox::critical(
- this, _("Error"),
- _("An error occurred while exporting the key package."));
+ this, tr("Error"),
+ tr("An error occurred while exporting the key package."));
}
});
});
@@ -144,21 +146,21 @@ GpgFrontend::UI::ExportKeyPackageDialog::ExportKeyPackageDialog(
connect(ui_->button_box_, &QDialogButtonBox::rejected, this,
[=]() { this->close(); });
- ui_->nameLabel->setText(_("Key Package Name"));
- ui_->selectOutputPathLabel->setText(_("Output Path"));
- ui_->passphraseLabel->setText(_("Passphrase"));
+ ui_->nameLabel->setText(tr("Key Package Name"));
+ ui_->selectOutputPathLabel->setText(tr("Output Path"));
+ ui_->passphraseLabel->setText(tr("Passphrase"));
ui_->tipsLabel->setText(
- _("Tips: You can use Key Package to safely and conveniently transfer "
- "your public and private keys between devices."));
- ui_->generatePassphraseButton->setText(_("Generate and Save Passphrase"));
- ui_->gnerateNameButton->setText(_("Generate Key Package Name"));
- ui_->setOutputPathButton->setText(_("Select Output Path"));
+ tr("Tips: You can use Key Package to safely and conveniently transfer "
+ "your public and private keys between devices."));
+ ui_->generatePassphraseButton->setText(tr("Generate and Save Passphrase"));
+ ui_->gnerateNameButton->setText(tr("Generate Key Package Name"));
+ ui_->setOutputPathButton->setText(tr("Select Output Path"));
ui_->includeSecretKeyCheckBox->setText(
- _("Include secret key (Think twice before acting)"));
+ tr("Include secret key (Think twice before acting)"));
ui_->noPublicKeyCheckBox->setText(
- _("Exclude keys that do not have a private key"));
+ tr("Exclude keys that do not have a private key"));
setAttribute(Qt::WA_DeleteOnClose);
- setWindowTitle(_("Export As Key Package"));
+ setWindowTitle(tr("Export As Key Package"));
}
diff --git a/src/ui/dialog/import_export/KeyImportDetailDialog.cpp b/src/ui/dialog/import_export/KeyImportDetailDialog.cpp
index 7d1303ec..720fa883 100644
--- a/src/ui/dialog/import_export/KeyImportDetailDialog.cpp
+++ b/src/ui/dialog/import_export/KeyImportDetailDialog.cpp
@@ -39,8 +39,8 @@ KeyImportDetailDialog::KeyImportDetailDialog(
m_result_(std::move(result)) {
// If no key for import found, just show a message
if (m_result_->considered == 0) {
- QMessageBox::information(parent, _("Key Import Details"),
- _("No keys found to import"));
+ QMessageBox::information(parent, tr("Key Import Details"),
+ tr("No keys found to import"));
emit finished(0);
this->close();
this->deleteLater();
@@ -55,7 +55,7 @@ KeyImportDetailDialog::KeyImportDetailDialog(
mv_box->addWidget(button_box_);
this->setLayout(mv_box);
- this->setWindowTitle(_("Key Import Details"));
+ this->setWindowTitle(tr("Key Import Details"));
this->setMinimumSize(QSize(600, 300));
this->adjustSize();
@@ -69,52 +69,51 @@ KeyImportDetailDialog::KeyImportDetailDialog(
void KeyImportDetailDialog::create_general_info_box() {
// GridBox for general import information
- general_info_box_ = new QGroupBox(_("General key info"));
+ general_info_box_ = new QGroupBox(tr("General key info"));
auto* general_info_box_layout = new QGridLayout(general_info_box_);
- general_info_box_layout->addWidget(
- new QLabel(QString(_("Considered")) + ": "), 1, 0);
+ general_info_box_layout->addWidget(new QLabel(tr("Considered") + ": "), 1, 0);
general_info_box_layout->addWidget(
new QLabel(QString::number(m_result_->considered)), 1, 1);
int row = 2;
if (m_result_->unchanged != 0) {
general_info_box_layout->addWidget(
- new QLabel(QString(_("Public unchanged")) + ": "), row, 0);
+ new QLabel(tr("Public unchanged") + ": "), row, 0);
general_info_box_layout->addWidget(
new QLabel(QString::number(m_result_->unchanged)), row, 1);
row++;
}
if (m_result_->imported != 0) {
- general_info_box_layout->addWidget(
- new QLabel(QString(_("Imported")) + ": "), row, 0);
+ general_info_box_layout->addWidget(new QLabel(tr("Imported") + ": "), row,
+ 0);
general_info_box_layout->addWidget(
new QLabel(QString::number(m_result_->imported)), row, 1);
row++;
}
if (m_result_->not_imported != 0) {
- general_info_box_layout->addWidget(
- new QLabel(QString(_("Not Imported")) + ": "), row, 0);
+ general_info_box_layout->addWidget(new QLabel(tr("Not Imported") + ": "),
+ row, 0);
general_info_box_layout->addWidget(
new QLabel(QString::number(m_result_->not_imported)), row, 1);
row++;
}
if (m_result_->secret_read != 0) {
- general_info_box_layout->addWidget(
- new QLabel(QString(_("Private Read")) + ": "), row, 0);
+ general_info_box_layout->addWidget(new QLabel(tr("Private Read") + ": "),
+ row, 0);
general_info_box_layout->addWidget(
new QLabel(QString::number(m_result_->secret_read)), row, 1);
row++;
}
if (m_result_->secret_imported != 0) {
general_info_box_layout->addWidget(
- new QLabel(QString(_("Private Imported")) + ": "), row, 0);
+ new QLabel(tr("Private Imported") + ": "), row, 0);
general_info_box_layout->addWidget(
new QLabel(QString::number(m_result_->secret_imported)), row, 1);
row++;
}
if (m_result_->secret_unchanged != 0) {
general_info_box_layout->addWidget(
- new QLabel(QString(_("Private Unchanged")) + ": "), row, 0);
+ new QLabel(tr("Private Unchanged") + ": "), row, 0);
general_info_box_layout->addWidget(
new QLabel(QString::number(m_result_->secret_unchanged)), row, 1);
}
@@ -129,7 +128,8 @@ void KeyImportDetailDialog::create_keys_table() {
keys_table_->setSelectionMode(QAbstractItemView::NoSelection);
QStringList header_labels;
- header_labels << _("Name") << _("Email") << _("Status") << _("Fingerprint");
+ header_labels << tr("Name") << tr("Email") << tr("Status")
+ << tr("Fingerprint");
keys_table_->verticalHeader()->hide();
keys_table_->setHorizontalHeaderLabels(header_labels);
@@ -155,27 +155,27 @@ QString KeyImportDetailDialog::get_status_string(int key_status) {
QString status_string;
// keystatus is greater than 15, if key is private
if (key_status > 15) {
- status_string.append(_("Private"));
+ status_string.append(tr("Private"));
key_status = key_status - 16;
} else {
- status_string.append(_("Public"));
+ status_string.append(tr("Public"));
}
if (key_status == 0) {
- status_string.append(", " + QString(_("Unchanged")));
+ status_string.append(", " + tr("Unchanged"));
} else {
if (key_status == 1) {
- status_string.append(", " + QString(_("New Key")));
+ status_string.append(", " + tr("New Key"));
} else {
if (key_status > 7) {
- status_string.append(", " + QString(_("New Subkey")));
+ status_string.append(", " + tr("New Subkey"));
return status_string;
}
if (key_status > 3) {
- status_string.append(", " + QString(_("New Signature")));
+ status_string.append(", " + tr("New Signature"));
return status_string;
}
if (key_status > 1) {
- status_string.append(", " + QString(_("New UID")));
+ status_string.append(", " + tr("New UID"));
return status_string;
}
}
diff --git a/src/ui/dialog/import_export/KeyServerImportDialog.cpp b/src/ui/dialog/import_export/KeyServerImportDialog.cpp
index 7cafaaca..49438c44 100644
--- a/src/ui/dialog/import_export/KeyServerImportDialog.cpp
+++ b/src/ui/dialog/import_export/KeyServerImportDialog.cpp
@@ -55,23 +55,23 @@ KeyServerImportDialog::KeyServerImportDialog(QWidget* parent)
}
// Buttons
- close_button_ = new QPushButton(_("Close"));
+ close_button_ = new QPushButton(tr("Close"));
connect(close_button_, &QPushButton::clicked, this,
&KeyServerImportDialog::close);
- import_button_ = new QPushButton(_("Import ALL"));
+ import_button_ = new QPushButton(tr("Import ALL"));
connect(import_button_, &QPushButton::clicked, this,
&KeyServerImportDialog::slot_import);
import_button_->setDisabled(true);
- search_button_ = new QPushButton(_("Search"));
+ search_button_ = new QPushButton(tr("Search"));
connect(search_button_, &QPushButton::clicked, this,
&KeyServerImportDialog::slot_search);
// Line edits for search string
- search_label_ = new QLabel(QString(_("Search String")) + _(": "));
+ search_label_ = new QLabel(tr("Search String") + tr(": "));
search_line_edit_ = new QLineEdit();
// combobox for keyserver list
- key_server_label_ = new QLabel(QString(_("Key Server")) + _(": "));
+ key_server_label_ = new QLabel(tr("Key Server") + tr(": "));
key_server_combo_box_ = create_combo_box();
// table containing the keys found
@@ -112,7 +112,7 @@ KeyServerImportDialog::KeyServerImportDialog(QWidget* parent)
main_layout->addLayout(buttons_layout, 6, 0, 1, 3);
this->setLayout(main_layout);
- this->setWindowTitle(_("Import Keys from Keyserver"));
+ this->setWindowTitle(tr("Import Keys from Keyserver"));
this->setModal(true);
movePosition2CenterOfParent();
@@ -152,7 +152,7 @@ void KeyServerImportDialog::create_keys_table() {
keys_table_->setSelectionMode(QAbstractItemView::SingleSelection);
QStringList labels;
- labels << _("UID") << _("Creation date") << _("KeyID") << _("Tag");
+ labels << tr("UID") << tr("Creation date") << tr("KeyID") << tr("Tag");
keys_table_->horizontalHeader()->setSectionResizeMode(
0, QHeaderView::ResizeToContents);
keys_table_->setHorizontalHeaderLabels(labels);
@@ -165,17 +165,17 @@ void KeyServerImportDialog::create_keys_table() {
void KeyServerImportDialog::set_message(const QString& text, bool error) {
message_->setText(text);
if (error) {
- icon_->setPixmap(
- QPixmap(":error.png").scaled(QSize(24, 24), Qt::KeepAspectRatio));
+ icon_->setPixmap(QPixmap(":/icons/error.png")
+ .scaled(QSize(24, 24), Qt::KeepAspectRatio));
} else {
icon_->setPixmap(
- QPixmap(":info.png").scaled(QSize(24, 24), Qt::KeepAspectRatio));
+ QPixmap(":/icons/info.png").scaled(QSize(24, 24), Qt::KeepAspectRatio));
}
}
void KeyServerImportDialog::slot_search() {
if (search_line_edit_->text().isEmpty()) {
- set_message("<h4>" + QString(_("Text is empty.")) + "</h4>", false);
+ set_message("<h4>" + tr("Text is empty.") + "</h4>", false);
return;
}
@@ -222,16 +222,16 @@ void KeyServerImportDialog::slot_search_finished(
switch (error) {
case QNetworkReply::ContentNotFoundError:
- set_message(_("Not Key Found"), true);
+ set_message(tr("Not Key Found"), true);
break;
case QNetworkReply::TimeoutError:
- set_message(_("Timeout"), true);
+ set_message(tr("Timeout"), true);
break;
case QNetworkReply::HostNotFoundError:
- set_message(_("Key Server Not Found"), true);
+ set_message(tr("Key Server Not Found"), true);
break;
default:
- set_message(_("Connection Error"), true);
+ set_message(tr("Connection Error"), true);
}
return;
}
@@ -240,36 +240,32 @@ void KeyServerImportDialog::slot_search_finished(
auto text = stream.readLine(1024);
if (text.contains("Too many responses")) {
- set_message(
- "<h4>" + QString(_("Too many responses from keyserver!")) + "</h4>",
- true);
+ set_message("<h4>" + tr("Too many responses from keyserver!") + "</h4>",
+ true);
return;
} else if (text.contains("No keys found")) {
// 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)) {
- set_message(
- "<h4>" +
- QString(_("No keys found, input may be kexId, retrying search "
- "with 0x.")) +
- "</h4>",
- true);
+ set_message("<h4>" +
+ tr("No keys found, input may be kexId, retrying search "
+ "with 0x.") +
+ "</h4>",
+ true);
search_line_edit_->setText(query.prepend("0x"));
this->slot_search();
return;
}
set_message(
- "<h4>" + QString(_("No keys found containing the search string!")) +
- "</h4>",
+ "<h4>" + tr("No keys found containing the search string!") + "</h4>",
true);
return;
} else if (text.contains("Insufficiently specific words")) {
- set_message("<h4>" +
- QString(_("Insufficiently specific search string!")) +
- "</h4>",
- true);
+ set_message(
+ "<h4>" + tr("Insufficiently specific search string!") + "</h4>",
+ true);
return;
} else {
set_message(text, true);
@@ -302,12 +298,10 @@ void KeyServerImportDialog::slot_search_finished(
new QTableWidgetItem(QString("expired")));
}
if (flags.contains("r")) {
- keys_table_->setItem(row, 3,
- new QTableWidgetItem(QString(_("revoked"))));
+ keys_table_->setItem(row, 3, new QTableWidgetItem(tr("revoked")));
}
if (flags.contains("d")) {
- keys_table_->setItem(row, 3,
- new QTableWidgetItem(QString(_("disabled"))));
+ keys_table_->setItem(row, 3, new QTableWidgetItem(tr("disabled")));
}
}
@@ -352,8 +346,7 @@ void KeyServerImportDialog::slot_search_finished(
}
set_message(
QString("<h4>") +
- QString(_("%1 keys found. Double click a key to import it."))
- .arg(row) +
+ tr("%1 keys found. Double click a key to import it.").arg(row) +
"</h4>",
false);
}
@@ -419,7 +412,7 @@ void KeyServerImportDialog::slot_import_finished(
return;
}
- set_message(_("Key Imported"), false);
+ set_message(tr("Key Imported"), false);
// refresh the key database
emit SignalKeyImported();
@@ -430,7 +423,7 @@ void KeyServerImportDialog::slot_import_finished(
void KeyServerImportDialog::set_loading(bool status) {
waiting_bar_->setVisible(status);
- if (status) set_message(_("Processing ..."), false);
+ if (status) set_message(tr("Processing ..."), false);
}
} // namespace GpgFrontend::UI
diff --git a/src/ui/dialog/import_export/KeyUploadDialog.cpp b/src/ui/dialog/import_export/KeyUploadDialog.cpp
index 3fdbc629..da0ea9f4 100644
--- a/src/ui/dialog/import_export/KeyUploadDialog.cpp
+++ b/src/ui/dialog/import_export/KeyUploadDialog.cpp
@@ -57,7 +57,7 @@ KeyUploadDialog::KeyUploadDialog(const KeyIdArgsListPtr& keys_ids,
this->setLayout(layout);
this->setModal(true);
- this->setWindowTitle(_("Uploading Public Key"));
+ this->setWindowTitle(tr("Uploading Public Key"));
this->setFixedSize(240, 42);
this->setPosCenterOfScreen();
}
@@ -136,22 +136,22 @@ void KeyUploadDialog::slot_upload_finished() {
QString message;
switch (error) {
case QNetworkReply::ContentNotFoundError:
- message = _("Key Not Found");
+ message = tr("Key Not Found");
break;
case QNetworkReply::TimeoutError:
- message = _("Timeout");
+ message = tr("Timeout");
break;
case QNetworkReply::HostNotFoundError:
- message = _("Key Server Not Found");
+ message = tr("Key Server Not Found");
break;
default:
- message = _("Connection Error");
+ message = tr("Connection Error");
}
QMessageBox::critical(this, "Upload Failed", message);
return;
}
- QMessageBox::information(this, _("Upload Success"),
- _("Upload Public Key Successfully"));
+ QMessageBox::information(this, tr("Upload Success"),
+ tr("Upload Public Key Successfully"));
GF_UI_LOG_DEBUG("success while contacting keyserver!");
reply->deleteLater();
diff --git a/src/ui/dialog/key_generate/KeygenDialog.cpp b/src/ui/dialog/key_generate/KeygenDialog.cpp
index 29ea74b6..ad9c7a54 100644
--- a/src/ui/dialog/key_generate/KeygenDialog.cpp
+++ b/src/ui/dialog/key_generate/KeygenDialog.cpp
@@ -64,7 +64,7 @@ KeyGenDialog::KeyGenDialog(QWidget* parent)
generate_key_dialog();
- this->setWindowTitle(_("Generate Key"));
+ this->setWindowTitle(tr("Generate Key"));
this->setAttribute(Qt::WA_DeleteOnClose);
this->setModal(true);
}
@@ -91,18 +91,19 @@ void KeyGenDialog::generate_key_dialog() {
}
void KeyGenDialog::slot_key_gen_accept() {
- std::stringstream error_stream;
+ QString buffer;
+ QTextStream error_stream(&buffer);
/**
* check for errors in keygen dialog input
*/
if ((name_edit_->text()).size() < 5) {
- error_stream << " " << _("Name must contain at least five characters.")
+ error_stream << " " << tr("Name must contain at least five characters.")
<< '\n';
}
if (email_edit_->text().isEmpty() ||
!check_email_address(email_edit_->text())) {
- error_stream << " " << _("Please give a email address.") << '\n';
+ error_stream << " " << tr("Please give a email address.") << '\n';
}
/**
@@ -110,12 +111,11 @@ void KeyGenDialog::slot_key_gen_accept() {
* in the future)
*/
if (date_edit_->dateTime() > max_date_time_) {
- error_stream << " " << _("Expiration time too long.") << '\n';
+ error_stream << " " << tr("Expiration time too long.") << '\n';
}
- auto err_string = error_stream.str();
-
- if (err_string.empty()) {
+ auto err_string = error_stream.readAll();
+ if (err_string.isEmpty()) {
/**
* create the string for key generation
*/
@@ -143,7 +143,7 @@ void KeyGenDialog::slot_key_gen_accept() {
}
CommonUtils::WaitForOpera(
- this, _("Generating"),
+ this, tr("Generating"),
[this, gen_key_info = this->gen_key_info_](const OperaWaitingHd& hd) {
GpgKeyOpera::GetInstance().GenerateKeyWithSubkey(
gen_key_info, gen_subkey_info_,
@@ -171,7 +171,7 @@ void KeyGenDialog::slot_key_gen_accept() {
QPalette error = error_label_->palette();
error.setColor(QPalette::Window, "#ff8080");
error_label_->setPalette(error);
- error_label_->setText(err_string.c_str());
+ error_label_->setText(err_string);
this->show();
}
@@ -183,18 +183,18 @@ QGroupBox* KeyGenDialog::create_key_usage_group_box() {
auto* group_box = new QGroupBox(this);
auto* grid = new QGridLayout(this);
- group_box->setTitle(_("Key Usage"));
+ group_box->setTitle(tr("Key Usage"));
- auto* encrypt = new QCheckBox(_("Encryption"), group_box);
+ auto* encrypt = new QCheckBox(tr("Encryption"), group_box);
encrypt->setTristate(false);
- auto* sign = new QCheckBox(_("Signing"), group_box);
+ auto* sign = new QCheckBox(tr("Signing"), group_box);
sign->setTristate(false);
- auto* cert = new QCheckBox(_("Certification"), group_box);
+ auto* cert = new QCheckBox(tr("Certification"), group_box);
cert->setTristate(false);
- auto* auth = new QCheckBox(_("Authentication"), group_box);
+ auto* auth = new QCheckBox(tr("Authentication"), group_box);
auth->setTristate(false);
key_usage_check_boxes_.push_back(encrypt);
@@ -406,14 +406,14 @@ QGroupBox* KeyGenDialog::create_basic_info_group_box() {
auto* vbox1 = new QGridLayout;
- vbox1->addWidget(new QLabel(QString(_("Name")) + ": "), 0, 0);
- vbox1->addWidget(new QLabel(QString(_("Email Address")) + ": "), 1, 0);
- vbox1->addWidget(new QLabel(QString(_("Comment")) + ": "), 2, 0);
- vbox1->addWidget(new QLabel(QString(_("Expiration Date")) + ": "), 3, 0);
- vbox1->addWidget(new QLabel(QString(_("Never Expire")) + ": "), 3, 3);
- vbox1->addWidget(new QLabel(QString(_("KeySize (in Bit)")) + ": "), 4, 0);
- vbox1->addWidget(new QLabel(QString(_("Key Type")) + ": "), 5, 0);
- vbox1->addWidget(new QLabel(QString(_("Non Pass Phrase"))), 6, 0);
+ vbox1->addWidget(new QLabel(tr("Name") + ": "), 0, 0);
+ vbox1->addWidget(new QLabel(tr("Email Address") + ": "), 1, 0);
+ vbox1->addWidget(new QLabel(tr("Comment") + ": "), 2, 0);
+ vbox1->addWidget(new QLabel(tr("Expiration Date") + ": "), 3, 0);
+ vbox1->addWidget(new QLabel(tr("Never Expire") + ": "), 3, 3);
+ vbox1->addWidget(new QLabel(tr("KeySize (in Bit)") + ": "), 4, 0);
+ vbox1->addWidget(new QLabel(tr("Key Type") + ": "), 5, 0);
+ vbox1->addWidget(new QLabel(tr("Non Pass Phrase")), 6, 0);
vbox1->addWidget(name_edit_, 0, 1, 1, 3);
vbox1->addWidget(email_edit_, 1, 1, 1, 3);
@@ -426,7 +426,7 @@ QGroupBox* KeyGenDialog::create_basic_info_group_box() {
auto* basic_info_group_box = new QGroupBox();
basic_info_group_box->setLayout(vbox1);
- basic_info_group_box->setTitle(_("Basic Information"));
+ basic_info_group_box->setTitle(tr("Basic Information"));
return basic_info_group_box;
}
diff --git a/src/ui/dialog/key_generate/SubkeyGenerateDialog.cpp b/src/ui/dialog/key_generate/SubkeyGenerateDialog.cpp
index 1036f9fa..0867354b 100644
--- a/src/ui/dialog/key_generate/SubkeyGenerateDialog.cpp
+++ b/src/ui/dialog/key_generate/SubkeyGenerateDialog.cpp
@@ -62,9 +62,9 @@ SubkeyGenerateDialog::SubkeyGenerateDialog(const KeyId& key_id, QWidget* parent)
group_grid->addWidget(create_basic_info_group_box(), 0, 0);
group_grid->addWidget(key_usage_group_box_, 1, 0);
- auto* tipps_label = new QLabel(
- QString(_("Tipps: if the key pair has a passphrase, the subkey's "
- "passphrase must be equal to it.")));
+ auto* tipps_label =
+ new QLabel(tr("Tipps: if the key pair has a passphrase, the subkey's "
+ "passphrase must be equal to it."));
tipps_label->setWordWrap(true);
group_grid->addWidget(tipps_label);
@@ -76,7 +76,7 @@ SubkeyGenerateDialog::SubkeyGenerateDialog(const KeyId& key_id, QWidget* parent)
vbox2->addWidget(error_label_);
vbox2->addWidget(button_box_);
- this->setWindowTitle(_("Generate New Subkey"));
+ this->setWindowTitle(tr("Generate New Subkey"));
this->setLayout(vbox2);
this->setAttribute(Qt::WA_DeleteOnClose);
this->setModal(true);
@@ -89,18 +89,18 @@ QGroupBox* SubkeyGenerateDialog::create_key_usage_group_box() {
auto* group_box = new QGroupBox(this);
auto* grid = new QGridLayout(this);
- group_box->setTitle(_("Key Usage"));
+ group_box->setTitle(tr("Key Usage"));
- auto* encrypt = new QCheckBox(_("Encryption"), group_box);
+ auto* encrypt = new QCheckBox(tr("Encryption"), group_box);
encrypt->setTristate(false);
- auto* sign = new QCheckBox(_("Signing"), group_box);
+ auto* sign = new QCheckBox(tr("Signing"), group_box);
sign->setTristate(false);
- auto* cert = new QCheckBox(_("Certification"), group_box);
+ auto* cert = new QCheckBox(tr("Certification"), group_box);
cert->setTristate(false);
- auto* auth = new QCheckBox(_("Authentication"), group_box);
+ auto* auth = new QCheckBox(tr("Authentication"), group_box);
auth->setTristate(false);
key_usage_check_boxes_.push_back(encrypt);
@@ -144,11 +144,11 @@ QGroupBox* SubkeyGenerateDialog::create_basic_info_group_box() {
auto* vbox1 = new QGridLayout;
- vbox1->addWidget(new QLabel(QString(_("Key Type")) + ": "), 0, 0);
- vbox1->addWidget(new QLabel(QString(_("KeySize (in Bit)")) + ": "), 1, 0);
- vbox1->addWidget(new QLabel(QString(_("Expiration Date")) + ": "), 2, 0);
- vbox1->addWidget(new QLabel(QString(_("Never Expire"))), 2, 3);
- vbox1->addWidget(new QLabel(QString(_("Non Pass Phrase"))), 3, 0);
+ vbox1->addWidget(new QLabel(tr("Key Type") + ": "), 0, 0);
+ vbox1->addWidget(new QLabel(tr("KeySize (in Bit)") + ": "), 1, 0);
+ vbox1->addWidget(new QLabel(tr("Expiration Date") + ": "), 2, 0);
+ vbox1->addWidget(new QLabel(tr("Never Expire")), 2, 3);
+ vbox1->addWidget(new QLabel(tr("Non Pass Phrase")), 3, 0);
vbox1->addWidget(key_type_combo_box_, 0, 1);
vbox1->addWidget(key_size_spin_box_, 1, 1);
@@ -158,7 +158,7 @@ QGroupBox* SubkeyGenerateDialog::create_basic_info_group_box() {
auto* basic_info_group_box = new QGroupBox();
basic_info_group_box->setLayout(vbox1);
- basic_info_group_box->setTitle(_("Basic Information"));
+ basic_info_group_box->setTitle(tr("Basic Information"));
return basic_info_group_box;
}
@@ -263,19 +263,20 @@ void SubkeyGenerateDialog::refresh_widgets_state() {
}
void SubkeyGenerateDialog::slot_key_gen_accept() {
- std::stringstream err_stream;
+ QString buffer;
+ QTextStream err_stream(&buffer);
/**
* primary keys should have a reasonable expiration date (no more than 2 years
* in the future)
*/
if (date_edit_->dateTime() > QDateTime::currentDateTime().addYears(2)) {
- err_stream << " " << _("Expiration time no more than 2 years.") << " ";
+ err_stream << " " << tr("Expiration time no more than 2 years.") << " ";
}
- auto err_string = err_stream.str();
+ auto err_string = err_stream.readAll();
- if (err_string.empty()) {
+ if (err_string.isEmpty()) {
gen_key_info_->SetKeyLength(key_size_spin_box_->value());
if (expire_check_box_->checkState() != 0U) {
@@ -285,7 +286,7 @@ void SubkeyGenerateDialog::slot_key_gen_accept() {
}
CommonUtils::WaitForOpera(
- this, _("Generating"),
+ this, tr("Generating"),
[this, key = this->key_,
gen_key_info = this->gen_key_info_](const OperaWaitingHd& hd) {
GpgKeyOpera::GetInstance().GenerateSubkey(
@@ -311,7 +312,7 @@ void SubkeyGenerateDialog::slot_key_gen_accept() {
QPalette error = error_label_->palette();
error.setColor(QPalette::Window, "#ff8080");
error_label_->setPalette(error);
- error_label_->setText(err_string.c_str());
+ error_label_->setText(err_string);
this->show();
}
diff --git a/src/ui/dialog/keypair_details/KeyDetailsDialog.cpp b/src/ui/dialog/keypair_details/KeyDetailsDialog.cpp
index 012d2a24..6908592b 100644
--- a/src/ui/dialog/keypair_details/KeyDetailsDialog.cpp
+++ b/src/ui/dialog/keypair_details/KeyDetailsDialog.cpp
@@ -39,12 +39,12 @@ KeyDetailsDialog::KeyDetailsDialog(const GpgKey& key, QWidget* parent)
: GeneralDialog(typeid(KeyDetailsDialog).name(), parent) {
tab_widget_ = new QTabWidget();
tab_widget_->addTab(new KeyPairDetailTab(key.GetId(), tab_widget_),
- _("KeyPair"));
- tab_widget_->addTab(new KeyPairUIDTab(key.GetId(), tab_widget_), _("UIDs"));
+ tr("KeyPair"));
+ tab_widget_->addTab(new KeyPairUIDTab(key.GetId(), tab_widget_), tr("UIDs"));
tab_widget_->addTab(new KeyPairSubkeyTab(key.GetId(), tab_widget_),
- _("Subkeys"));
+ tr("Subkeys"));
tab_widget_->addTab(new KeyPairOperaTab(key.GetId(), tab_widget_),
- _("Operations"));
+ tr("Operations"));
auto* main_layout = new QVBoxLayout;
main_layout->addWidget(tab_widget_);
@@ -54,7 +54,7 @@ KeyDetailsDialog::KeyDetailsDialog(const GpgKey& key, QWidget* parent)
#endif
this->setAttribute(Qt::WA_DeleteOnClose, true);
this->setLayout(main_layout);
- this->setWindowTitle(_("Key Details"));
+ this->setWindowTitle(tr("Key Details"));
this->setModal(true);
this->show();
diff --git a/src/ui/dialog/keypair_details/KeyNewUIDDialog.cpp b/src/ui/dialog/keypair_details/KeyNewUIDDialog.cpp
index a548c18d..cd3c0f29 100644
--- a/src/ui/dialog/keypair_details/KeyNewUIDDialog.cpp
+++ b/src/ui/dialog/keypair_details/KeyNewUIDDialog.cpp
@@ -47,9 +47,9 @@ KeyNewUIDDialog::KeyNewUIDDialog(const KeyId& key_id, QWidget* parent)
error_label_ = new QLabel();
auto gridLayout = new QGridLayout();
- gridLayout->addWidget(new QLabel(_("Name")), 0, 0);
- gridLayout->addWidget(new QLabel(_("Email")), 1, 0);
- gridLayout->addWidget(new QLabel(_("Comment")), 2, 0);
+ gridLayout->addWidget(new QLabel(tr("Name")), 0, 0);
+ gridLayout->addWidget(new QLabel(tr("Email")), 1, 0);
+ gridLayout->addWidget(new QLabel(tr("Comment")), 2, 0);
gridLayout->addWidget(name_, 0, 1);
gridLayout->addWidget(email_, 1, 1);
@@ -57,7 +57,7 @@ KeyNewUIDDialog::KeyNewUIDDialog(const KeyId& key_id, QWidget* parent)
gridLayout->addWidget(create_button_, 3, 0, 1, 2);
gridLayout->addWidget(
- new QLabel(_("Notice: The New UID Created will be set as Primary.")), 4,
+ new QLabel(tr("Notice: The New UID Created will be set as Primary.")), 4,
0, 1, 2);
gridLayout->addWidget(error_label_, 5, 0, 1, 2);
@@ -65,7 +65,7 @@ KeyNewUIDDialog::KeyNewUIDDialog(const KeyId& key_id, QWidget* parent)
&KeyNewUIDDialog::slot_create_new_uid);
this->setLayout(gridLayout);
- this->setWindowTitle(_("Create New UID"));
+ this->setWindowTitle(tr("Create New UID"));
this->setAttribute(Qt::WA_DeleteOnClose, true);
this->setModal(true);
@@ -75,20 +75,21 @@ KeyNewUIDDialog::KeyNewUIDDialog(const KeyId& key_id, QWidget* parent)
}
void KeyNewUIDDialog::slot_create_new_uid() {
- std::stringstream error_stream;
+ QString buffer;
+ QTextStream error_stream(&buffer);
/**
* check for errors in keygen dialog input
*/
if ((name_->text()).size() < 5) {
- error_stream << " " << _("Name must contain at least five characters.")
- << std::endl;
+ error_stream << " " << tr("Name must contain at least five characters.")
+ << Qt::endl;
}
if (email_->text().isEmpty() || !check_email_address(email_->text())) {
- error_stream << " " << _("Please give a email address.") << std::endl;
+ error_stream << " " << tr("Please give a email address.") << Qt::endl;
}
- auto error_string = error_stream.str();
- if (error_string.empty()) {
+ auto error_string = error_stream.readAll();
+ if (error_string.isEmpty()) {
if (GpgUIDOperator::GetInstance().AddUID(
m_key_, name_->text(), comment_->text(), email_->text())) {
emit finished(1);
@@ -105,7 +106,7 @@ void KeyNewUIDDialog::slot_create_new_uid() {
QPalette error = error_label_->palette();
error.setColor(QPalette::Window, "#ff8080");
error_label_->setPalette(error);
- error_label_->setText(error_string.c_str());
+ error_label_->setText(error_string);
this->show();
}
diff --git a/src/ui/dialog/keypair_details/KeyPairDetailTab.cpp b/src/ui/dialog/keypair_details/KeyPairDetailTab.cpp
index 5863dfe9..a91b5fd4 100644
--- a/src/ui/dialog/keypair_details/KeyPairDetailTab.cpp
+++ b/src/ui/dialog/keypair_details/KeyPairDetailTab.cpp
@@ -37,10 +37,10 @@
namespace GpgFrontend::UI {
KeyPairDetailTab::KeyPairDetailTab(const QString& key_id, QWidget* parent)
: QWidget(parent), key_(GpgKeyGetter::GetInstance().GetKey(key_id)) {
- owner_box_ = new QGroupBox(_("Owner"));
- key_box_ = new QGroupBox(_("Primary Key"));
- fingerprint_box_ = new QGroupBox(_("Fingerprint"));
- additional_uid_box_ = new QGroupBox(_("Additional UIDs"));
+ owner_box_ = new QGroupBox(tr("Owner"));
+ key_box_ = new QGroupBox(tr("Primary Key"));
+ fingerprint_box_ = new QGroupBox(tr("Fingerprint"));
+ additional_uid_box_ = new QGroupBox(tr("Additional UIDs"));
name_var_label_ = new QLabel();
name_var_label_->setTextInteractionFlags(Qt::TextSelectableByMouse);
@@ -67,27 +67,23 @@ KeyPairDetailTab::KeyPairDetailTab(const QString& key_id, QWidget* parent)
auto* vbox_kd = new QGridLayout();
auto* vbox_od = new QGridLayout();
- vbox_od->addWidget(new QLabel(QString(_("Name")) + ": "), 0, 0);
- vbox_od->addWidget(new QLabel(QString(_("Email Address")) + ": "), 1, 0);
- vbox_od->addWidget(new QLabel(QString(_("Comment")) + ": "), 2, 0);
+ vbox_od->addWidget(new QLabel(tr("Name") + ": "), 0, 0);
+ vbox_od->addWidget(new QLabel(tr("Email Address") + ": "), 1, 0);
+ vbox_od->addWidget(new QLabel(tr("Comment") + ": "), 2, 0);
vbox_od->addWidget(name_var_label_, 0, 1);
vbox_od->addWidget(email_var_label_, 1, 1);
vbox_od->addWidget(comment_var_label_, 2, 1);
- vbox_kd->addWidget(new QLabel(QString(_("Key ID")) + ": "), 0, 0);
- vbox_kd->addWidget(new QLabel(QString(_("Algorithm")) + ": "), 1, 0);
- vbox_kd->addWidget(new QLabel(QString(_("Key Size")) + ": "), 2, 0);
- vbox_kd->addWidget(new QLabel(QString(_("Nominal Usage")) + ": "), 3, 0);
- vbox_kd->addWidget(new QLabel(QString(_("Actual Usage")) + ": "), 4, 0);
- vbox_kd->addWidget(new QLabel(QString(_("Owner Trust Level")) + ": "), 5, 0);
- vbox_kd->addWidget(new QLabel(QString(_("Create Date (Local Time)")) + ": "),
- 6, 0);
- vbox_kd->addWidget(new QLabel(QString(_("Expires on (Local Time)")) + ": "),
- 7, 0);
- vbox_kd->addWidget(new QLabel(QString(_("Last Update (Local Time)")) + ": "),
- 8, 0);
- vbox_kd->addWidget(new QLabel(QString(_("Primary Key Existence")) + ": "), 9,
- 0);
+ vbox_kd->addWidget(new QLabel(tr("Key ID") + ": "), 0, 0);
+ vbox_kd->addWidget(new QLabel(tr("Algorithm") + ": "), 1, 0);
+ vbox_kd->addWidget(new QLabel(tr("Key Size") + ": "), 2, 0);
+ vbox_kd->addWidget(new QLabel(tr("Nominal Usage") + ": "), 3, 0);
+ vbox_kd->addWidget(new QLabel(tr("Actual Usage") + ": "), 4, 0);
+ vbox_kd->addWidget(new QLabel(tr("Owner Trust Level") + ": "), 5, 0);
+ vbox_kd->addWidget(new QLabel(tr("Create Date (Local Time)") + ": "), 6, 0);
+ vbox_kd->addWidget(new QLabel(tr("Expires on (Local Time)") + ": "), 7, 0);
+ vbox_kd->addWidget(new QLabel(tr("Last Update (Local Time)") + ": "), 8, 0);
+ vbox_kd->addWidget(new QLabel(tr("Primary Key Existence") + ": "), 9, 0);
key_id_var_label->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
vbox_kd->addWidget(key_id_var_label, 0, 1, 1, 1);
@@ -101,7 +97,7 @@ KeyPairDetailTab::KeyPairDetailTab(const QString& key_id, QWidget* parent)
vbox_kd->addWidget(last_update_var_label_, 8, 1, 1, 2);
vbox_kd->addWidget(primary_key_exist_var_label_, 9, 1, 1, 2);
- auto* copy_key_id_button = new QPushButton(_("Copy"));
+ auto* copy_key_id_button = new QPushButton(tr("Copy"));
copy_key_id_button->setFlat(true);
copy_key_id_button->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
vbox_kd->addWidget(copy_key_id_button, 0, 2);
@@ -126,9 +122,9 @@ KeyPairDetailTab::KeyPairDetailTab(const QString& key_id, QWidget* parent)
hbox_fp->addStretch();
hbox_fp->addWidget(fingerprint_var_label_);
- auto* copy_fingerprint_button = new QPushButton(_("Copy"));
+ auto* copy_fingerprint_button = new QPushButton(tr("Copy"));
copy_fingerprint_button->setFlat(true);
- copy_fingerprint_button->setToolTip(_("copy fingerprint to clipboard"));
+ copy_fingerprint_button->setToolTip(tr("copy fingerprint to clipboard"));
connect(copy_fingerprint_button, &QPushButton::clicked, this,
&KeyPairDetailTab::slot_copy_fingerprint);
@@ -140,7 +136,7 @@ KeyPairDetailTab::KeyPairDetailTab(const QString& key_id, QWidget* parent)
mvbox->addStretch();
auto* expBox = new QHBoxLayout();
- QPixmap pixmap(":warning.png");
+ QPixmap pixmap(":/icons/warning.png");
exp_label_ = new QLabel();
icon_label_ = new QLabel();
@@ -174,7 +170,7 @@ void KeyPairDetailTab::slot_copy_fingerprint() {
void KeyPairDetailTab::slot_refresh_key_info() {
// Show the situation that primary key not exists.
primary_key_exist_var_label_->setText(
- key_.IsHasMasterKey() ? _("Exists") : _("Not Exists"));
+ key_.IsHasMasterKey() ? tr("Exists") : tr("Not Exists"));
if (!key_.IsHasMasterKey()) {
auto palette_expired = primary_key_exist_var_label_->palette();
palette_expired.setColor(primary_key_exist_var_label_->foregroundRole(),
@@ -207,11 +203,11 @@ void KeyPairDetailTab::slot_refresh_key_info() {
QTextStream usage_steam(&buffer);
if (key_.IsHasCertificationCapability()) {
- usage_steam << _("Certificate") << " ";
+ usage_steam << tr("Certificate") << " ";
}
- if (key_.IsHasEncryptionCapability()) usage_steam << _("Encrypt") << " ";
- if (key_.IsHasSigningCapability()) usage_steam << _("Sign") << " ";
- if (key_.IsHasAuthenticationCapability()) usage_steam << _("Auth") << " ";
+ if (key_.IsHasEncryptionCapability()) usage_steam << tr("Encrypt") << " ";
+ if (key_.IsHasSigningCapability()) usage_steam << tr("Sign") << " ";
+ if (key_.IsHasAuthenticationCapability()) usage_steam << tr("Auth") << " ";
usage_var_label_->setText(usage_steam.readAll());
@@ -219,16 +215,16 @@ void KeyPairDetailTab::slot_refresh_key_info() {
QTextStream actual_usage_steam(&buffer_2);
if (key_.IsHasActualCertificationCapability()) {
- actual_usage_steam << _("Certificate") << " ";
+ actual_usage_steam << tr("Certificate") << " ";
}
if (key_.IsHasActualEncryptionCapability()) {
- actual_usage_steam << _("Encrypt") << " ";
+ actual_usage_steam << tr("Encrypt") << " ";
}
if (key_.IsHasActualSigningCapability()) {
- actual_usage_steam << _("Sign") << " ";
+ actual_usage_steam << tr("Sign") << " ";
}
if (key_.IsHasActualAuthenticationCapability()) {
- actual_usage_steam << _("Auth") << " ";
+ actual_usage_steam << tr("Auth") << " ";
}
actual_usage_var_label_->setText(actual_usage_steam.readAll());
@@ -243,7 +239,7 @@ void KeyPairDetailTab::slot_refresh_key_info() {
key_size_val = QString::number(key_.GetPrimaryKeyLength());
if (key_.GetExpireTime().toSecsSinceEpoch() == 0) {
- expire_var_label_->setText(_("Never Expire"));
+ expire_var_label_->setText(tr("Never Expire"));
} else {
expire_var_label_->setText(
QLocale::system().toString((key_.GetExpireTime())));
@@ -254,7 +250,7 @@ void KeyPairDetailTab::slot_refresh_key_info() {
created_var_label_->setText(QLocale::system().toString(key_.GetCreateTime()));
if (key_.GetLastUpdateTime().toSecsSinceEpoch() == 0) {
- last_update_var_label_->setText(_("No Data"));
+ last_update_var_label_->setText(tr("No Data"));
} else {
last_update_var_label_->setText(
QLocale::system().toString(key_.GetLastUpdateTime()));
@@ -270,12 +266,12 @@ void KeyPairDetailTab::slot_refresh_key_info() {
if (key_.IsExpired()) {
icon_label_->show();
exp_label_->show();
- exp_label_->setText(_("Warning: The primary key has expired."));
+ exp_label_->setText(tr("Warning: The primary key has expired."));
}
if (key_.IsRevoked()) {
icon_label_->show();
exp_label_->show();
- exp_label_->setText(_("Warning: The primary key has been revoked."));
+ exp_label_->setText(tr("Warning: The primary key has been revoked."));
}
}
diff --git a/src/ui/dialog/keypair_details/KeyPairOperaTab.cpp b/src/ui/dialog/keypair_details/KeyPairOperaTab.cpp
index e024b8f0..5b0f4642 100644
--- a/src/ui/dialog/keypair_details/KeyPairOperaTab.cpp
+++ b/src/ui/dialog/keypair_details/KeyPairOperaTab.cpp
@@ -48,29 +48,29 @@ KeyPairOperaTab::KeyPairOperaTab(const QString& key_id, QWidget* parent)
CreateOperaMenu();
auto* m_vbox = new QVBoxLayout(this);
- auto* opera_key_box = new QGroupBox(_("General Operations"));
+ auto* opera_key_box = new QGroupBox(tr("General Operations"));
auto* vbox_p_k = new QVBoxLayout();
auto* export_h_box_layout = new QHBoxLayout();
vbox_p_k->addLayout(export_h_box_layout);
- auto* export_public_button = new QPushButton(_("Export Public Key"));
+ auto* export_public_button = new QPushButton(tr("Export Public Key"));
export_h_box_layout->addWidget(export_public_button);
connect(export_public_button, &QPushButton::clicked, this,
&KeyPairOperaTab::slot_export_public_key);
if (m_key_.IsPrivateKey()) {
- auto* export_private_button = new QPushButton(_("Export Private Key"));
+ auto* export_private_button = new QPushButton(tr("Export Private Key"));
export_private_button->setStyleSheet("text-align:center;");
export_private_button->setMenu(secret_key_export_opera_menu_);
export_h_box_layout->addWidget(export_private_button);
if (m_key_.IsHasMasterKey()) {
auto* edit_expires_button =
- new QPushButton(_("Modify Expiration Datetime (Primary Key)"));
+ new QPushButton(tr("Modify Expiration Datetime (Primary Key)"));
connect(edit_expires_button, &QPushButton::clicked, this,
&KeyPairOperaTab::slot_modify_edit_datetime);
- auto* edit_password_button = new QPushButton(_("Modify Password"));
+ auto* edit_password_button = new QPushButton(tr("Modify Password"));
connect(edit_password_button, &QPushButton::clicked, this,
&KeyPairOperaTab::slot_modify_password);
@@ -89,7 +89,7 @@ KeyPairOperaTab::KeyPairOperaTab(const QString& key_id, QWidget* parent)
settings.value("network/forbid_all_gnupg_connection").toBool();
auto* key_server_opera_button =
- new QPushButton(_("Key Server Operation (Pubkey)"));
+ new QPushButton(tr("Key Server Operation (Pubkey)"));
key_server_opera_button->setStyleSheet("text-align:center;");
key_server_opera_button->setMenu(key_server_opera_menu_);
key_server_opera_button->setDisabled(forbid_all_gnupg_connection);
@@ -97,18 +97,18 @@ KeyPairOperaTab::KeyPairOperaTab(const QString& key_id, QWidget* parent)
if (m_key_.IsPrivateKey() && m_key_.IsHasMasterKey()) {
auto* revoke_cert_gen_button =
- new QPushButton(_("Generate Revoke Certificate"));
+ new QPushButton(tr("Generate Revoke Certificate"));
connect(revoke_cert_gen_button, &QPushButton::clicked, this,
&KeyPairOperaTab::slot_gen_revoke_cert);
advance_h_box_layout->addWidget(revoke_cert_gen_button);
}
- auto* modify_tofu_button = new QPushButton(_("Modify TOFU Policy"));
+ auto* modify_tofu_button = new QPushButton(tr("Modify TOFU Policy"));
connect(modify_tofu_button, &QPushButton::clicked, this,
&KeyPairOperaTab::slot_modify_tofu_policy);
auto* set_owner_trust_level_button =
- new QPushButton(_("Set Owner Trust Level"));
+ new QPushButton(tr("Set Owner Trust Level"));
connect(set_owner_trust_level_button, &QPushButton::clicked, this,
&KeyPairOperaTab::slot_set_owner_trust_level);
@@ -131,14 +131,16 @@ KeyPairOperaTab::KeyPairOperaTab(const QString& key_id, QWidget* parent)
void KeyPairOperaTab::CreateOperaMenu() {
key_server_opera_menu_ = new QMenu(this);
- auto* upload_key_pair = new QAction(_("Upload Key Pair to Key Server"), this);
+ auto* upload_key_pair =
+ new QAction(tr("Upload Key Pair to Key Server"), this);
connect(upload_key_pair, &QAction::triggered, this,
&KeyPairOperaTab::slot_upload_key_to_server);
if (!(m_key_.IsPrivateKey() && m_key_.IsHasMasterKey())) {
upload_key_pair->setDisabled(true);
}
- auto* update_key_pair = new QAction(_("Sync Key Pair From Key Server"), this);
+ auto* update_key_pair =
+ new QAction(tr("Sync Key Pair From Key Server"), this);
connect(update_key_pair, &QAction::triggered, this,
&KeyPairOperaTab::slot_update_key_from_server);
@@ -152,13 +154,14 @@ void KeyPairOperaTab::CreateOperaMenu() {
secret_key_export_opera_menu_ = new QMenu(this);
- auto* export_full_secret_key = new QAction(_("Export Full Secret Key"), this);
+ auto* export_full_secret_key =
+ new QAction(tr("Export Full Secret Key"), this);
connect(export_full_secret_key, &QAction::triggered, this,
&KeyPairOperaTab::slot_export_private_key);
if (!m_key_.IsPrivateKey()) export_full_secret_key->setDisabled(true);
auto* export_shortest_secret_key =
- new QAction(_("Export Shortest Secret Key"), this);
+ new QAction(tr("Export Shortest Secret Key"), this);
connect(export_shortest_secret_key, &QAction::triggered, this,
&KeyPairOperaTab::slot_export_short_private_key);
@@ -185,15 +188,14 @@ void KeyPairOperaTab::slot_export_public_key() {
std::replace(file_string.begin(), file_string.end(), ' ', '_');
auto file_name = QFileDialog::getSaveFileName(
- this, _("Export Key To File"), file_string,
- QString(_("Key Files")) + " (*.asc *.txt);;All Files (*)");
+ this, tr("Export Key To File"), file_string,
+ tr("Key Files") + " (*.asc *.txt);;All Files (*)");
if (file_name.isEmpty()) return;
if (!WriteFileGFBuffer(file_name, gf_buffer)) {
- QMessageBox::critical(
- this, _("Export Error"),
- QString(_("Couldn't open %1 for writing")).arg(file_name));
+ QMessageBox::critical(this, tr("Export Error"),
+ tr("Couldn't open %1 for writing").arg(file_name));
return;
}
}
@@ -201,15 +203,15 @@ void KeyPairOperaTab::slot_export_public_key() {
void KeyPairOperaTab::slot_export_short_private_key() {
// Show a information box with explanation about private key
int ret = QMessageBox::information(
- this, _("Exporting short private Key"),
- "<h3>" + QString(_("You are about to export your")) +
- "<font color=\"red\">" + _(" PRIVATE KEY ") + "</font>!</h3>\n" +
- _("This is NOT your Public Key, so DON'T give it away.") + "<br />" +
- _("Do you REALLY want to export your PRIVATE KEY in a Minimum "
- "Size?") +
+ this, tr("Exporting short private Key"),
+ "<h3>" + tr("You are about to export your") + "<font color=\"red\">" +
+ tr(" PRIVATE KEY ") + "</font>!</h3>\n" +
+ tr("This is NOT your Public Key, so DON'T give it away.") + "<br />" +
+ tr("Do you REALLY want to export your PRIVATE KEY in a Minimum "
+ "Size?") +
"<br />" +
- _("For OpenPGP keys it removes all signatures except for the latest "
- "self-signatures."),
+ tr("For OpenPGP keys it removes all signatures except for the latest "
+ "self-signatures."),
QMessageBox::Cancel | QMessageBox::Ok);
// export key, if ok was clicked
@@ -232,15 +234,14 @@ void KeyPairOperaTab::slot_export_short_private_key() {
std::replace(file_string.begin(), file_string.end(), ' ', '_');
auto file_name = QFileDialog::getSaveFileName(
- this, _("Export Key To File"), file_string,
- QString(_("Key Files")) + " (*.asc *.txt);;All Files (*)");
+ this, tr("Export Key To File"), file_string,
+ tr("Key Files") + " (*.asc *.txt);;All Files (*)");
if (file_name.isEmpty()) return;
if (!WriteFileGFBuffer(file_name, gf_buffer)) {
- QMessageBox::critical(
- this, _("Export Error"),
- QString(_("Couldn't open %1 for writing")).arg(file_name));
+ QMessageBox::critical(this, tr("Export Error"),
+ tr("Couldn't open %1 for writing").arg(file_name));
return;
}
}
@@ -249,11 +250,11 @@ void KeyPairOperaTab::slot_export_short_private_key() {
void KeyPairOperaTab::slot_export_private_key() {
// Show a information box with explanation about private key
int ret = QMessageBox::information(
- this, _("Exporting private Key"),
- "<h3>" + QString(_("You are about to export your")) +
- "<font color=\"red\">" + _(" PRIVATE KEY ") + "</font>!</h3>\n" +
- _("This is NOT your Public Key, so DON'T give it away.") + "<br />" +
- _("Do you REALLY want to export your PRIVATE KEY?"),
+ this, tr("Exporting private Key"),
+ "<h3>" + tr("You are about to export your") + "<font color=\"red\">" +
+ tr(" PRIVATE KEY ") + "</font>!</h3>\n" +
+ tr("This is NOT your Public Key, so DON'T give it away.") + "<br />" +
+ tr("Do you REALLY want to export your PRIVATE KEY?"),
QMessageBox::Cancel | QMessageBox::Ok);
// export key, if ok was clicked
@@ -276,15 +277,14 @@ void KeyPairOperaTab::slot_export_private_key() {
std::replace(file_string.begin(), file_string.end(), ' ', '_');
auto file_name = QFileDialog::getSaveFileName(
- this, _("Export Key To File"), file_string,
- QString(_("Key Files")) + " (*.asc *.txt);;All Files (*)");
+ this, tr("Export Key To File"), file_string,
+ tr("Key Files") + " (*.asc *.txt);;All Files (*)");
if (file_name.isEmpty()) return;
if (!WriteFileGFBuffer(file_name, gf_buffer)) {
- QMessageBox::critical(
- this, _("Export Error"),
- QString(_("Couldn't open %1 for writing")).arg(file_name));
+ QMessageBox::critical(this, tr("Export Error"),
+ tr("Couldn't open %1 for writing").arg(file_name));
return;
}
}
@@ -312,7 +312,7 @@ void KeyPairOperaTab::slot_update_key_from_server() {
}
void KeyPairOperaTab::slot_gen_revoke_cert() {
- auto literal = QString("%1 (*.rev)").arg(_("Revocation Certificates"));
+ auto literal = QString("%1 (*.rev)").arg(tr("Revocation Certificates"));
QString m_output_file_name;
#ifndef WINDOWS
@@ -323,7 +323,7 @@ void KeyPairOperaTab::slot_gen_revoke_cert() {
m_key_.GetId() + ").rev";
#endif
- QFileDialog dialog(this, _("Generate revocation certificate"), file_string,
+ QFileDialog dialog(this, tr("Generate revocation certificate"), file_string,
literal);
dialog.setDefaultSuffix(".rev");
dialog.setAcceptMode(QFileDialog::AcceptSave);
@@ -344,31 +344,31 @@ void KeyPairOperaTab::slot_modify_password() {
void KeyPairOperaTab::slot_modify_tofu_policy() {
QStringList items;
- items << _("Policy Auto") << _("Policy Good") << _("Policy Bad")
- << _("Policy Ask") << _("Policy Unknown");
+ items << tr("Policy Auto") << tr("Policy Good") << tr("Policy Bad")
+ << tr("Policy Ask") << tr("Policy Unknown");
bool ok;
QString item = QInputDialog::getItem(
- this, _("Modify TOFU Policy(Default is Auto)"),
- _("Policy for the Key Pair:"), items, 0, false, &ok);
+ this, tr("Modify TOFU Policy(Default is Auto)"),
+ tr("Policy for the Key Pair:"), items, 0, false, &ok);
if (ok && !item.isEmpty()) {
GF_UI_LOG_DEBUG("selected policy: {}", item.toStdString());
gpgme_tofu_policy_t tofu_policy = GPGME_TOFU_POLICY_AUTO;
- if (item == _("Policy Auto")) {
+ if (item == tr("Policy Auto")) {
tofu_policy = GPGME_TOFU_POLICY_AUTO;
- } else if (item == _("Policy Good")) {
+ } else if (item == tr("Policy Good")) {
tofu_policy = GPGME_TOFU_POLICY_GOOD;
- } else if (item == _("Policy Bad")) {
+ } else if (item == tr("Policy Bad")) {
tofu_policy = GPGME_TOFU_POLICY_BAD;
- } else if (item == _("Policy Ask")) {
+ } else if (item == tr("Policy Ask")) {
tofu_policy = GPGME_TOFU_POLICY_ASK;
- } else if (item == _("Policy Unknown")) {
+ } else if (item == tr("Policy Unknown")) {
tofu_policy = GPGME_TOFU_POLICY_UNKNOWN;
}
auto err = GpgKeyOpera::GetInstance().ModifyTOFUPolicy(m_key_, tofu_policy);
if (CheckGpgError(err) != GPG_ERR_NO_ERROR) {
- QMessageBox::critical(this, _("Not Successful"),
- QString(_("Modify TOFU policy not successfully.")));
+ QMessageBox::critical(this, tr("Not Successful"),
+ tr("Modify TOFU policy not successfully."));
}
}
}
diff --git a/src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp b/src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp
index 71d2d9fe..3f973fae 100644
--- a/src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp
+++ b/src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp
@@ -40,12 +40,12 @@ KeyPairSubkeyTab::KeyPairSubkeyTab(const QString& key_id, QWidget* parent)
create_subkey_list();
create_subkey_opera_menu();
- list_box_ = new QGroupBox(_("Subkey List"));
- detail_box_ = new QGroupBox(_("Detail of Selected Subkey"));
+ list_box_ = new QGroupBox(tr("Subkey List"));
+ detail_box_ = new QGroupBox(tr("Detail of Selected Subkey"));
auto* uid_buttons_layout = new QGridLayout();
- auto* add_subkey_button = new QPushButton(_("Generate A New Subkey"));
+ auto* add_subkey_button = new QPushButton(tr("Generate A New Subkey"));
if (!key_.IsPrivateKey() || !key_.IsHasMasterKey()) {
add_subkey_button->setDisabled(true);
setHidden(add_subkey_button);
@@ -62,23 +62,18 @@ KeyPairSubkeyTab::KeyPairSubkeyTab(const QString& key_id, QWidget* parent)
auto* subkey_detail_layout = new QGridLayout();
- subkey_detail_layout->addWidget(new QLabel(QString(_("Key ID")) + ": "), 0,
- 0);
- subkey_detail_layout->addWidget(new QLabel(QString(_("Algorithm")) + ": "), 1,
- 0);
- subkey_detail_layout->addWidget(new QLabel(QString(_("Key Size")) + ": "), 2,
- 0);
- subkey_detail_layout->addWidget(new QLabel(QString(_("Usage")) + ": "), 3, 0);
+ subkey_detail_layout->addWidget(new QLabel(tr("Key ID") + ": "), 0, 0);
+ subkey_detail_layout->addWidget(new QLabel(tr("Algorithm") + ": "), 1, 0);
+ subkey_detail_layout->addWidget(new QLabel(tr("Key Size") + ": "), 2, 0);
+ subkey_detail_layout->addWidget(new QLabel(tr("Usage") + ": "), 3, 0);
subkey_detail_layout->addWidget(
- new QLabel(QString(_("Expires On (Local Time)")) + ": "), 4, 0);
+ new QLabel(tr("Expires On (Local Time)") + ": "), 4, 0);
subkey_detail_layout->addWidget(
- new QLabel(QString(_("Create Date (Local Time)")) + ": "), 5, 0);
- subkey_detail_layout->addWidget(new QLabel(QString(_("Existence")) + ": "), 6,
+ new QLabel(tr("Create Date (Local Time)") + ": "), 5, 0);
+ subkey_detail_layout->addWidget(new QLabel(tr("Existence") + ": "), 6, 0);
+ subkey_detail_layout->addWidget(new QLabel(tr("Key in Smart Card") + ": "), 7,
0);
- subkey_detail_layout->addWidget(
- new QLabel(QString(_("Key in Smart Card")) + ": "), 7, 0);
- subkey_detail_layout->addWidget(new QLabel(QString(_("Fingerprint")) + ": "),
- 8, 0);
+ subkey_detail_layout->addWidget(new QLabel(tr("Fingerprint") + ": "), 8, 0);
key_id_var_label_ = new QLabel(this);
key_size_var_label_ = new QLabel(this);
@@ -100,7 +95,7 @@ KeyPairSubkeyTab::KeyPairSubkeyTab(const QString& key_id, QWidget* parent)
subkey_detail_layout->addWidget(card_key_label_, 7, 1, 1, 2);
subkey_detail_layout->addWidget(fingerprint_var_label_, 8, 1, 1, 2);
- auto* copy_key_id_button = new QPushButton(_("Copy"));
+ auto* copy_key_id_button = new QPushButton(tr("Copy"));
copy_key_id_button->setFlat(true);
subkey_detail_layout->addWidget(copy_key_id_button, 0, 2);
connect(copy_key_id_button, &QPushButton::clicked, this, [=]() {
@@ -157,8 +152,8 @@ void KeyPairSubkeyTab::create_subkey_list() {
subkey_list_->setAlternatingRowColors(true);
QStringList labels;
- labels << _("Subkey ID") << _("Key Size") << _("Algo") << _("Create Date")
- << _("Expire Date");
+ labels << tr("Subkey ID") << tr("Key Size") << tr("Algo") << tr("Create Date")
+ << tr("Expire Date");
subkey_list_->setHorizontalHeaderLabels(labels);
subkey_list_->horizontalHeader()->setStretchLastSection(false);
@@ -200,7 +195,7 @@ void KeyPairSubkeyTab::slot_refresh_subkey_list() {
auto* tmp4 =
new QTableWidgetItem(subkeys.GetExpireTime().toSecsSinceEpoch() == 0
- ? _("Never Expire")
+ ? tr("Never Expire")
: subkeys.GetExpireTime().toString());
tmp4->setTextAlignment(Qt::AlignCenter);
subkey_list_->setItem(row, 4, tmp4);
@@ -229,7 +224,7 @@ void KeyPairSubkeyTab::slot_add_subkey() {
}
void KeyPairSubkeyTab::slot_refresh_subkey_detail() {
- auto& subkey = get_selected_subkey();
+ const auto& subkey = get_selected_subkey();
key_id_var_label_->setText(subkey.GetID());
key_size_var_label_->setText(QString::number(subkey.GetKeyLength()));
@@ -237,7 +232,7 @@ void KeyPairSubkeyTab::slot_refresh_subkey_detail() {
time_t subkey_time_t = subkey.GetExpireTime().toSecsSinceEpoch();
expire_var_label_->setText(
- subkey_time_t == 0 ? _("Never Expires")
+ subkey_time_t == 0 ? tr("Never Expires")
: QLocale::system().toString(subkey.GetExpireTime()));
if (subkey_time_t != 0 &&
@@ -255,23 +250,24 @@ void KeyPairSubkeyTab::slot_refresh_subkey_detail() {
created_var_label_->setText(
QLocale::system().toString(subkey.GetCreateTime()));
- std::stringstream usage_steam;
+ QString buffer;
+ QTextStream usage_steam(&buffer);
if (subkey.IsHasCertificationCapability()) {
- usage_steam << _("Certificate") << " ";
+ usage_steam << tr("Certificate") << " ";
}
- if (subkey.IsHasEncryptionCapability()) usage_steam << _("Encrypt") << " ";
- if (subkey.IsHasSigningCapability()) usage_steam << _("Sign") << " ";
- if (subkey.IsHasAuthenticationCapability()) usage_steam << _("Auth") << " ";
+ if (subkey.IsHasEncryptionCapability()) usage_steam << tr("Encrypt") << " ";
+ if (subkey.IsHasSigningCapability()) usage_steam << tr("Sign") << " ";
+ if (subkey.IsHasAuthenticationCapability()) usage_steam << tr("Auth") << " ";
- usage_var_label_->setText(usage_steam.str().c_str());
+ usage_var_label_->setText(usage_steam.readAll());
// Show the situation that secret key not exists.
- master_key_exist_var_label_->setText(subkey.IsSecretKey() ? _("Exists")
- : _("Not Exists"));
+ master_key_exist_var_label_->setText(subkey.IsSecretKey() ? tr("Exists")
+ : tr("Not Exists"));
// Show the situation if key in a smart card.
- card_key_label_->setText(subkey.IsCardKey() ? _("Yes") : _("No"));
+ card_key_label_->setText(subkey.IsCardKey() ? tr("Yes") : tr("No"));
if (!subkey.IsSecretKey()) {
auto palette_expired = master_key_exist_var_label_->palette();
@@ -300,7 +296,7 @@ void KeyPairSubkeyTab::slot_refresh_subkey_detail() {
void KeyPairSubkeyTab::create_subkey_opera_menu() {
subkey_opera_menu_ = new QMenu(this);
- auto* edit_subkey_act = new QAction(_("Edit Expire Date"));
+ auto* edit_subkey_act = new QAction(tr("Edit Expire Date"));
connect(edit_subkey_act, &QAction::triggered, this,
&KeyPairSubkeyTab::slot_edit_subkey);
diff --git a/src/ui/dialog/keypair_details/KeyPairUIDTab.cpp b/src/ui/dialog/keypair_details/KeyPairUIDTab.cpp
index 00310c34..fe2f5f02 100644
--- a/src/ui/dialog/keypair_details/KeyPairUIDTab.cpp
+++ b/src/ui/dialog/keypair_details/KeyPairUIDTab.cpp
@@ -47,8 +47,8 @@ KeyPairUIDTab::KeyPairUIDTab(const QString& key_id, QWidget* parent)
auto* uid_buttons_layout = new QGridLayout();
- auto* add_uid_button = new QPushButton(_("New UID"));
- auto* manage_uid_button = new QPushButton(_("UID Management"));
+ auto* add_uid_button = new QPushButton(tr("New UID"));
+ auto* manage_uid_button = new QPushButton(tr("UID Management"));
if (m_key_.IsHasMasterKey()) {
manage_uid_button->setMenu(manage_selected_uid_menu_);
@@ -67,12 +67,12 @@ KeyPairUIDTab::KeyPairUIDTab(const QString& key_id, QWidget* parent)
auto* uid_group_box = new QGroupBox();
uid_group_box->setLayout(grid_layout);
- uid_group_box->setTitle(_("UIDs"));
+ uid_group_box->setTitle(tr("UIDs"));
auto* tofu_group_box = new QGroupBox();
auto* tofu_vbox_layout = new QVBoxLayout();
tofu_group_box->setLayout(tofu_vbox_layout);
- tofu_group_box->setTitle(_("TOFU"));
+ tofu_group_box->setTitle(tr("TOFU"));
#if !defined(RELEASE)
tofu_tabs_ = new QTabWidget(this);
tofu_vbox_layout->addWidget(tofu_tabs_);
@@ -84,7 +84,7 @@ KeyPairUIDTab::KeyPairUIDTab(const QString& key_id, QWidget* parent)
auto* sign_group_box = new QGroupBox();
sign_group_box->setLayout(sign_grid_layout);
- sign_group_box->setTitle(_("Signature of Selected UID"));
+ sign_group_box->setTitle(tr("Signature of Selected UID"));
auto* vbox_layout = new QVBoxLayout();
vbox_layout->addWidget(uid_group_box);
@@ -137,7 +137,7 @@ void KeyPairUIDTab::create_uid_list() {
uid_list_->setAlternatingRowColors(true);
QStringList labels;
- labels << _("Select") << _("Name") << _("Email") << _("Comment");
+ labels << tr("Select") << tr("Name") << tr("Email") << tr("Comment");
uid_list_->setHorizontalHeaderLabels(labels);
uid_list_->horizontalHeader()->setStretchLastSection(true);
}
@@ -160,8 +160,8 @@ void KeyPairUIDTab::create_sign_list() {
sig_list_->setAlternatingRowColors(true);
QStringList labels;
- labels << _("Key ID") << _("Name") << _("Email") << _("Create Date")
- << _("Expired Date");
+ labels << tr("Key ID") << tr("Name") << tr("Email") << tr("Create Date")
+ << tr("Expired Date");
sig_list_->setHorizontalHeaderLabels(labels);
sig_list_->horizontalHeader()->setStretchLastSection(false);
}
@@ -237,7 +237,7 @@ void KeyPairUIDTab::slot_refresh_tofu_info() {
int index = 1;
for (const auto& tofu_info : *tofu_infos) {
tofu_tabs_->addTab(new TOFUInfoPage(tofu_info, this),
- QString(_("TOFU %1")).arg(index++));
+ tr("TOFU %1").arg(index++));
}
}
}
@@ -285,7 +285,7 @@ void KeyPairUIDTab::slot_refresh_sig_list() {
auto* tmp5 = new QTableWidgetItem(
sig.GetExpireTime().toSecsSinceEpoch() == 0
- ? _("Never Expires")
+ ? tr("Never Expires")
: QLocale::system().toString(sig.GetExpireTime()));
tmp5->setTextAlignment(Qt::AlignCenter);
sig_list_->setItem(sig_row, 4, tmp5);
@@ -302,8 +302,8 @@ void KeyPairUIDTab::slot_add_sign() {
if (selected_uids->empty()) {
QMessageBox::information(
- nullptr, _("Invalid Operation"),
- _("Please select one or more UIDs before doing this operation."));
+ nullptr, tr("Invalid Operation"),
+ tr("Please select one or more UIDs before doing this operation."));
return;
}
@@ -325,10 +325,10 @@ auto KeyPairUIDTab::get_uid_checked() -> UIDArgsListPtr {
void KeyPairUIDTab::create_manage_uid_menu() {
manage_selected_uid_menu_ = new QMenu(this);
- auto* sign_uid_act = new QAction(_("Sign Selected UID(s)"), this);
+ auto* sign_uid_act = new QAction(tr("Sign Selected UID(s)"), this);
connect(sign_uid_act, &QAction::triggered, this,
&KeyPairUIDTab::slot_add_sign);
- auto* del_uid_act = new QAction(_("Delete Selected UID(s)"), this);
+ auto* del_uid_act = new QAction(tr("Delete Selected UID(s)"), this);
connect(del_uid_act, &QAction::triggered, this, &KeyPairUIDTab::slot_del_uid);
if (m_key_.IsHasMasterKey()) {
@@ -348,11 +348,11 @@ void KeyPairUIDTab::slot_add_uid() {
void KeyPairUIDTab::slot_add_uid_result(int result) {
if (result == 1) {
- QMessageBox::information(nullptr, _("Successful Operation"),
- _("Successfully added a new UID."));
+ QMessageBox::information(nullptr, tr("Successful Operation"),
+ tr("Successfully added a new UID."));
} else if (result == -1) {
- QMessageBox::critical(nullptr, _("Operation Failed"),
- _("An error occurred during the operation."));
+ QMessageBox::critical(nullptr, tr("Operation Failed"),
+ tr("An error occurred during the operation."));
}
}
@@ -361,8 +361,8 @@ void KeyPairUIDTab::slot_del_uid() {
if (selected_uids->empty()) {
QMessageBox::information(
- nullptr, _("Invalid Operation"),
- _("Please select one or more UIDs before doing this operation."));
+ nullptr, tr("Invalid Operation"),
+ tr("Please select one or more UIDs before doing this operation."));
return;
}
@@ -373,12 +373,12 @@ void KeyPairUIDTab::slot_del_uid() {
}
int ret = QMessageBox::warning(
- this, _("Deleting UIDs"),
+ this, tr("Deleting UIDs"),
"<b>" +
QString(
- _("Are you sure that you want to delete the following UIDs?")) +
+ tr("Are you sure that you want to delete the following UIDs?")) +
"</b><br/><br/>" + keynames + +"<br/>" +
- _("The action can not be undone."),
+ tr("The action can not be undone."),
QMessageBox::No | QMessageBox::Yes);
if (ret == QMessageBox::Yes) {
@@ -386,9 +386,8 @@ void KeyPairUIDTab::slot_del_uid() {
GF_UI_LOG_DEBUG("uid: {}", uid);
if (!GpgUIDOperator::GetInstance().RevUID(m_key_, uid)) {
QMessageBox::critical(
- nullptr, _("Operation Failed"),
- QString(_("An error occurred during the delete %1 operation."))
- .arg(uid));
+ nullptr, tr("Operation Failed"),
+ tr("An error occurred during the delete %1 operation.").arg(uid));
}
}
emit SignalUpdateUIDInfo();
@@ -412,18 +411,17 @@ void KeyPairUIDTab::slot_set_primary_uid() {
keynames.append("<br/>");
int ret = QMessageBox::warning(
- this, _("Set Primary UID"),
- "<b>" +
- QString(_("Are you sure that you want to set the Primary UID to?")) +
+ this, tr("Set Primary UID"),
+ "<b>" + tr("Are you sure that you want to set the Primary UID to?") +
"</b><br/><br/>" + keynames + +"<br/>" +
- _("The action can not be undone."),
+ tr("The action can not be undone."),
QMessageBox::No | QMessageBox::Yes);
if (ret == QMessageBox::Yes) {
if (!GpgUIDOperator::GetInstance().SetPrimaryUID(m_key_,
selected_uids->front())) {
- QMessageBox::critical(nullptr, _("Operation Failed"),
- _("An error occurred during the operation."));
+ QMessageBox::critical(nullptr, tr("Operation Failed"),
+ tr("An error occurred during the operation."));
} else {
emit SignalUpdateUIDInfo();
}
@@ -454,13 +452,13 @@ auto KeyPairUIDTab::get_sign_selected() -> SignIdArgsListPtr {
void KeyPairUIDTab::create_uid_popup_menu() {
uid_popup_menu_ = new QMenu(this);
- auto* ser_primary_uid_act = new QAction(_("Set As Primary"), this);
+ auto* ser_primary_uid_act = new QAction(tr("Set As Primary"), this);
connect(ser_primary_uid_act, &QAction::triggered, this,
&KeyPairUIDTab::slot_set_primary_uid);
- auto* sign_uid_act = new QAction(_("Sign UID"), this);
+ auto* sign_uid_act = new QAction(tr("Sign UID"), this);
connect(sign_uid_act, &QAction::triggered, this,
&KeyPairUIDTab::slot_add_sign_single);
- auto* del_uid_act = new QAction(_("Delete UID"), this);
+ auto* del_uid_act = new QAction(tr("Delete UID"), this);
connect(del_uid_act, &QAction::triggered, this,
&KeyPairUIDTab::slot_del_uid_single);
@@ -483,8 +481,8 @@ void KeyPairUIDTab::slot_add_sign_single() {
if (selected_uids->empty()) {
QMessageBox::information(
- nullptr, _("Invalid Operation"),
- _("Please select one UID before doing this operation."));
+ nullptr, tr("Invalid Operation"),
+ tr("Please select one UID before doing this operation."));
return;
}
@@ -497,8 +495,8 @@ void KeyPairUIDTab::slot_del_uid_single() {
auto selected_uids = get_uid_selected();
if (selected_uids->empty()) {
QMessageBox::information(
- nullptr, _("Invalid Operation"),
- _("Please select one UID before doing this operation."));
+ nullptr, tr("Invalid Operation"),
+ tr("Please select one UID before doing this operation."));
return;
}
@@ -508,18 +506,18 @@ void KeyPairUIDTab::slot_del_uid_single() {
keynames.append("<br/>");
int ret = QMessageBox::warning(
- this, _("Deleting UID"),
+ this, tr("Deleting UID"),
"<b>" +
QString(
- _("Are you sure that you want to delete the following uid?")) +
+ tr("Are you sure that you want to delete the following uid?")) +
"</b><br/><br/>" + keynames + +"<br/>" +
- _("The action can not be undone."),
+ tr("The action can not be undone."),
QMessageBox::No | QMessageBox::Yes);
if (ret == QMessageBox::Yes) {
if (!GpgUIDOperator::GetInstance().RevUID(m_key_, selected_uids->front())) {
- QMessageBox::critical(nullptr, _("Operation Failed"),
- _("An error occurred during the operation."));
+ QMessageBox::critical(nullptr, tr("Operation Failed"),
+ tr("An error occurred during the operation."));
} else {
emit SignalUpdateUIDInfo();
}
@@ -529,7 +527,7 @@ void KeyPairUIDTab::slot_del_uid_single() {
void KeyPairUIDTab::create_sign_popup_menu() {
sign_popup_menu_ = new QMenu(this);
- auto* del_sign_act = new QAction(_("Delete(Revoke) Key Signature"), this);
+ auto* del_sign_act = new QAction(tr("Delete(Revoke) Key Signature"), this);
connect(del_sign_act, &QAction::triggered, this,
&KeyPairUIDTab::slot_del_sign);
@@ -540,8 +538,8 @@ void KeyPairUIDTab::slot_del_sign() {
auto selected_signs = get_sign_selected();
if (selected_signs->empty()) {
QMessageBox::information(
- nullptr, _("Invalid Operation"),
- _("Please select one Key Signature before doing this operation."));
+ nullptr, tr("Invalid Operation"),
+ tr("Please select one Key Signature before doing this operation."));
return;
}
@@ -549,9 +547,9 @@ void KeyPairUIDTab::slot_del_sign() {
.GetKey(selected_signs->front().first)
.IsGood()) {
QMessageBox::critical(
- nullptr, _("Invalid Operation"),
- _("To delete the signature, you need to have its corresponding public "
- "key in the local database."));
+ nullptr, tr("Invalid Operation"),
+ tr("To delete the signature, you need to have its corresponding public "
+ "key in the local database."));
return;
}
@@ -560,19 +558,18 @@ void KeyPairUIDTab::slot_del_sign() {
keynames.append(selected_signs->front().second);
keynames.append("<br/>");
- int ret =
- QMessageBox::warning(this, _("Deleting Key Signature"),
- "<b>" +
- QString(_("Are you sure that you want to delete "
- "the following signature?")) +
- "</b><br/><br/>" + keynames + +"<br/>" +
- _("The action can not be undone."),
- QMessageBox::No | QMessageBox::Yes);
+ int ret = QMessageBox::warning(this, tr("Deleting Key Signature"),
+ "<b>" +
+ tr("Are you sure that you want to delete "
+ "the following signature?") +
+ "</b><br/><br/>" + keynames + +"<br/>" +
+ tr("The action can not be undone."),
+ QMessageBox::No | QMessageBox::Yes);
if (ret == QMessageBox::Yes) {
if (!GpgKeyManager::GetInstance().RevSign(m_key_, selected_signs)) {
- QMessageBox::critical(nullptr, _("Operation Failed"),
- _("An error occurred during the operation."));
+ QMessageBox::critical(nullptr, tr("Operation Failed"),
+ tr("An error occurred during the operation."));
}
}
}
diff --git a/src/ui/dialog/keypair_details/KeySetExpireDateDialog.cpp b/src/ui/dialog/keypair_details/KeySetExpireDateDialog.cpp
index 8ccc8045..a2870965 100644
--- a/src/ui/dialog/keypair_details/KeySetExpireDateDialog.cpp
+++ b/src/ui/dialog/keypair_details/KeySetExpireDateDialog.cpp
@@ -78,8 +78,8 @@ void KeySetExpireDateDialog::slot_confirm() {
auto* msg_box = new QMessageBox(qobject_cast<QWidget*>(this->parent()));
msg_box->setAttribute(Qt::WA_DeleteOnClose);
msg_box->setStandardButtons(QMessageBox::Ok);
- msg_box->setWindowTitle(_("Success"));
- msg_box->setText(_("The expire date of the key pair has been updated."));
+ msg_box->setWindowTitle(tr("Success"));
+ msg_box->setText(tr("The expire date of the key pair has been updated."));
msg_box->setModal(true);
msg_box->open();
@@ -88,8 +88,8 @@ void KeySetExpireDateDialog::slot_confirm() {
this->close();
} else {
QMessageBox::critical(
- this, _("Failure"),
- _("Failed to update the expire date of the key pair."));
+ this, tr("Failure"),
+ tr("Failed to update the expire date of the key pair."));
}
}
@@ -126,13 +126,13 @@ void KeySetExpireDateDialog::init() {
UISignalStation::GetInstance(),
&UISignalStation::SignalKeyDatabaseRefresh);
- ui_->titleLabel->setText(_("Modified Expiration Date (Local Time)"));
- ui_->label->setText(
- _("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."));
- ui_->noExpirationCheckBox->setText(_("No Expiration"));
- this->setWindowTitle(_("Modified Expiration Date"));
+ ui_->titleLabel->setText(tr("Modified Expiration Date (Local Time)"));
+ ui_->label->setText(tr(
+ "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."));
+ ui_->noExpirationCheckBox->setText(tr("No Expiration"));
+ this->setWindowTitle(tr("Modified Expiration Date"));
}
void KeySetExpireDateDialog::slot_non_expired_checked(int state) {
diff --git a/src/ui/dialog/keypair_details/KeyUIDSignDialog.cpp b/src/ui/dialog/keypair_details/KeyUIDSignDialog.cpp
index 55cafe55..ba12f232 100644
--- a/src/ui/dialog/keypair_details/KeyUIDSignDialog.cpp
+++ b/src/ui/dialog/keypair_details/KeyUIDSignDialog.cpp
@@ -43,7 +43,7 @@ KeyUIDSignDialog::KeyUIDSignDialog(const GpgKey& key, UIDArgsListPtr uid,
const auto key_id = m_key_.GetId();
m_key_list_ = new KeyList(KeyMenuAbility::NONE, this);
m_key_list_->AddListGroupTab(
- _("Signers"), "signers", KeyListRow::ONLY_SECRET_KEY,
+ tr("Signers"), "signers", KeyListRow::ONLY_SECRET_KEY,
KeyListColumn::NAME | KeyListColumn::EmailAddress,
[key_id](const GpgKey& key, const KeyTable&) -> bool {
return !(key.IsDisabled() || !key.IsHasCertificationCapability() ||
@@ -83,7 +83,7 @@ KeyUIDSignDialog::KeyUIDSignDialog(const GpgKey& key, UIDArgsListPtr uid,
layout->addWidget(m_key_list_, 0, 0);
layout->addWidget(sign_key_button_, 2, 0, Qt::AlignRight);
- timeLayout->addWidget(new QLabel(_("Expire Date")), 0, 0);
+ timeLayout->addWidget(new QLabel(tr("Expire Date")), 0, 0);
timeLayout->addWidget(expires_edit_, 0, 1);
timeLayout->addWidget(non_expire_check_, 0, 2);
layout->addLayout(timeLayout, 1, 0);
@@ -93,7 +93,7 @@ KeyUIDSignDialog::KeyUIDSignDialog(const GpgKey& key, UIDArgsListPtr uid,
this->setLayout(layout);
this->setModal(true);
- this->setWindowTitle(_("Sign For Key's UID(s)"));
+ this->setWindowTitle(tr("Sign For Key's UID(s)"));
this->adjustSize();
setAttribute(Qt::WA_DeleteOnClose, true);
@@ -117,13 +117,14 @@ void KeyUIDSignDialog::slot_sign_key(bool clicked) {
// Sign For mKey
if (!GpgKeyManager::GetInstance().SignKey(m_key_, *keys, uid, expires)) {
QMessageBox::critical(
- nullptr, _("Unsuccessful Operation"),
- QString(_("Signature operation failed for UID %1")).arg(uid));
+ nullptr, tr("Unsuccessful Operation"),
+ tr("Signature operation failed for UID %1").arg(uid));
}
}
- QMessageBox::information(nullptr, _("Operation Complete"),
- _("The signature operation of the UID is complete"));
+ QMessageBox::information(
+ nullptr, tr("Operation Complete"),
+ tr("The signature operation of the UID is complete"));
this->close();
emit SignalKeyUIDSignUpdate();
}
diff --git a/src/ui/dialog/settings/SettingsAppearance.cpp b/src/ui/dialog/settings/SettingsAppearance.cpp
index b1843388..d4f97c4c 100644
--- a/src/ui/dialog/settings/SettingsAppearance.cpp
+++ b/src/ui/dialog/settings/SettingsAppearance.cpp
@@ -39,26 +39,26 @@ AppearanceTab::AppearanceTab(QWidget* parent)
: QWidget(parent), ui_(SecureCreateSharedObject<Ui_AppearanceSettings>()) {
ui_->setupUi(this);
- ui_->iconSizeBox->setTitle(_("Icon Size"));
- ui_->smallRadioButton->setText(_("small"));
- ui_->mediumRadioButton->setText(_("medium"));
- ui_->largeRadioButton->setText(_("large"));
+ ui_->iconSizeBox->setTitle(tr("Icon Size"));
+ ui_->smallRadioButton->setText(tr("small"));
+ ui_->mediumRadioButton->setText(tr("medium"));
+ ui_->largeRadioButton->setText(tr("large"));
- ui_->iconStyleBox->setTitle(_("Icon Style"));
- ui_->justTextRadioButton->setText(_("just text"));
- ui_->justIconRadioButton->setText(_("just icons"));
- ui_->textAndIconsRadioButton->setText(_("text and icons"));
+ ui_->iconStyleBox->setTitle(tr("Icon Style"));
+ ui_->justTextRadioButton->setText(tr("just text"));
+ ui_->justIconRadioButton->setText(tr("just icons"));
+ ui_->textAndIconsRadioButton->setText(tr("text and icons"));
- ui_->windowStateBox->setTitle(_("Window State"));
+ ui_->windowStateBox->setTitle(tr("Window State"));
ui_->windowStateCheckBox->setText(
- _("Save window size and position on exit."));
+ tr("Save window size and position on exit."));
- ui_->textEditorBox->setTitle(_("Text Editor"));
- ui_->fontSizeTextEditorLabel->setText(_("Font Size in Text Editor"));
+ ui_->textEditorBox->setTitle(tr("Text Editor"));
+ ui_->fontSizeTextEditorLabel->setText(tr("Font Size in Text Editor"));
- ui_->informationBoardBox->setTitle(_("Information Board"));
+ ui_->informationBoardBox->setTitle(tr("Information Board"));
ui_->fontSizeInformationBoardLabel->setText(
- _("Font Size in Information Board"));
+ tr("Font Size in Information Board"));
icon_size_group_ = new QButtonGroup(this);
icon_size_group_->addButton(ui_->smallRadioButton, 1);
diff --git a/src/ui/dialog/settings/SettingsDialog.cpp b/src/ui/dialog/settings/SettingsDialog.cpp
index 834f1096..a1ac1885 100644
--- a/src/ui/dialog/settings/SettingsDialog.cpp
+++ b/src/ui/dialog/settings/SettingsDialog.cpp
@@ -51,10 +51,10 @@ SettingsDialog::SettingsDialog(QWidget* parent)
main_layout->addWidget(tab_widget_);
main_layout->stretch(0);
- tab_widget_->addTab(general_tab_, _("General"));
- tab_widget_->addTab(appearance_tab_, _("Appearance"));
- tab_widget_->addTab(key_server_tab_, _("Key Server"));
- tab_widget_->addTab(network_tab_, _("Network"));
+ tab_widget_->addTab(general_tab_, tr("General"));
+ tab_widget_->addTab(appearance_tab_, tr("Appearance"));
+ tab_widget_->addTab(key_server_tab_, tr("Key Server"));
+ tab_widget_->addTab(network_tab_, tr("Network"));
#ifndef MACOS
button_box_ =
@@ -65,11 +65,11 @@ SettingsDialog::SettingsDialog(QWidget* parent)
&SettingsDialog::reject);
mainLayout->addWidget(button_box_);
mainLayout->stretch(0);
- setWindowTitle(_("Settings"));
+ setWindowTitle(tr("Settings"));
#else
connect(this, &QDialog::finished, this, &SettingsDialog::SlotAccept);
connect(this, &QDialog::finished, this, &SettingsDialog::deleteLater);
- setWindowTitle(_("Preference"));
+ setWindowTitle(tr("Preference"));
#endif
setLayout(main_layout);
@@ -125,23 +125,22 @@ void SettingsDialog::SlotAccept() {
auto SettingsDialog::ListLanguages() -> QHash<QString, QString> {
QHash<QString, QString> languages;
- languages.insert(QString(), _("System Default"));
+ languages.insert(QString(), tr("System Default"));
- auto locale_path = GlobalSettingStation::GetInstance().GetLocaleDir();
+ QStringList filenames = QDir(QLatin1String(":/i18n")).entryList();
+ for (const auto& file : filenames) {
+ GF_UI_LOG_DEBUG("get locale from locale directory: {}", file.toStdString());
- auto locale_dir = QDir(locale_path);
- QStringList file_names = locale_dir.entryList(QStringList("*"));
-
- for (const auto& locale : file_names) {
- GF_UI_LOG_DEBUG("get locale from locale directory: {}",
- locale.toStdString());
- if (locale == "." || locale == "..") continue;
+ auto start = file.indexOf('.') + 1;
+ auto end = file.lastIndexOf('.');
+ if (start < 0 || end < 0 || start >= end) continue;
+ auto locale = file.mid(start, end - start);
QLocale const q_locale(locale);
if (q_locale.nativeTerritoryName().isEmpty()) continue;
auto language = q_locale.nativeLanguageName() + " (" + locale + ")";
- languages.insert(locale, language);
+ languages.insert(q_locale.name(), language);
}
return languages;
}
diff --git a/src/ui/dialog/settings/SettingsGeneral.cpp b/src/ui/dialog/settings/SettingsGeneral.cpp
index 4c9c0368..44c66e10 100644
--- a/src/ui/dialog/settings/SettingsGeneral.cpp
+++ b/src/ui/dialog/settings/SettingsGeneral.cpp
@@ -40,30 +40,30 @@ GeneralTab::GeneralTab(QWidget* parent)
ui_(GpgFrontend::SecureCreateSharedObject<Ui_GeneralSettings>()) {
ui_->setupUi(this);
- ui_->cacheBox->setTitle(_("Cache"));
+ ui_->cacheBox->setTitle(tr("Cache"));
ui_->clearGpgPasswordCacheCheckBox->setText(
- _("Clear gpg password cache when closing GpgFrontend."));
+ tr("Clear gpg password cache when closing GpgFrontend."));
ui_->restoreTextEditorPageCheckBox->setText(
- _("Automatically restore unsaved Text Editor pages after an application "
- "crash."));
+ tr("Automatically restore unsaved Text Editor pages after an application "
+ "crash."));
- ui_->importConfirmationBox->setTitle(_("Operation"));
+ ui_->importConfirmationBox->setTitle(tr("Operation"));
ui_->longerKeyExpirationDateCheckBox->setText(
- _("Enable to use longer key expiration date."));
+ tr("Enable to use longer key expiration date."));
ui_->importConfirmationCheckBox->setText(
- _("Import files dropped on the Key List without confirmation."));
+ tr("Import files dropped on the Key List without confirmation."));
- ui_->langBox->setTitle(_("Language"));
+ ui_->langBox->setTitle(tr("Language"));
ui_->langNoteLabel->setText(
- "<b>" + QString(_("NOTE")) + _(": ") + "</b>" +
- _("GpgFrontend will restart automatically if you change the language!"));
+ "<b>" + tr("NOTE") + tr(": ") + "</b>" +
+ tr("GpgFrontend will restart automatically if you change the language!"));
- ui_->dataBox->setTitle(_("Data"));
+ ui_->dataBox->setTitle(tr("Data"));
ui_->clearAllLogFilesButton->setText(
- QString(_("Clear All Log (Total Size: %1)")) %
- GlobalSettingStation::GetInstance().GetLogFilesSize());
+ tr("Clear All Log (Total Size: %1)")
+ .arg(GlobalSettingStation::GetInstance().GetLogFilesSize()));
ui_->clearAllDataObjectsButton->setText(
- QString(_("Clear All Data Objects (Total Size: %1)"))
+ tr("Clear All Data Objects (Total Size: %1)")
.arg(GlobalSettingStation::GetInstance().GetDataObjectsFilesSize()));
lang_ = SettingsDialog::ListLanguages();
@@ -76,22 +76,21 @@ GeneralTab::GeneralTab(QWidget* parent)
connect(ui_->clearAllLogFilesButton, &QPushButton::clicked, this, [=]() {
GlobalSettingStation::GetInstance().ClearAllLogFiles();
ui_->clearAllLogFilesButton->setText(
- QString(_("Clear All Log (Total Size: %1)"))
+ tr("Clear All Log (Total Size: %1)")
.arg(GlobalSettingStation::GetInstance().GetLogFilesSize()));
});
connect(ui_->clearAllDataObjectsButton, &QPushButton::clicked, this, [=]() {
QMessageBox::StandardButton reply;
reply = QMessageBox::question(
- this, _("Confirm"),
- _("Are you sure you want to clear all data objects?\nThis will result "
- "in "
- "loss of all cached form positions, statuses, key servers, etc."),
+ this, tr("Confirm"),
+ tr("Are you sure you want to clear all data objects?\nThis will result "
+ "in loss of all cached form positions, statuses, key servers, etc."),
QMessageBox::Yes | QMessageBox::No);
if (reply == QMessageBox::Yes) {
GlobalSettingStation::GetInstance().ClearAllDataObjects();
ui_->clearAllDataObjectsButton->setText(
- QString(_("Clear All Data Objects (Total Size: %1)"))
+ tr("Clear All Data Objects (Total Size: %1)")
.arg(GlobalSettingStation::GetInstance()
.GetDataObjectsFilesSize()));
}
diff --git a/src/ui/dialog/settings/SettingsKeyServer.cpp b/src/ui/dialog/settings/SettingsKeyServer.cpp
index d51ba1af..5613ed45 100644
--- a/src/ui/dialog/settings/SettingsKeyServer.cpp
+++ b/src/ui/dialog/settings/SettingsKeyServer.cpp
@@ -52,25 +52,25 @@ KeyserverTab::KeyserverTab(QWidget* parent)
connect(ui_->testKeyServerButton, &QPushButton::clicked, this,
&KeyserverTab::slot_test_listed_key_server);
- ui_->keyServerListGroupBox->setTitle(_("Keyserver List"));
- ui_->operationsGroupBox->setTitle(_("Operations"));
+ ui_->keyServerListGroupBox->setTitle(tr("Keyserver List"));
+ ui_->operationsGroupBox->setTitle(tr("Operations"));
- ui_->keyServerListTable->horizontalHeaderItem(0)->setText(_("Default"));
+ ui_->keyServerListTable->horizontalHeaderItem(0)->setText(tr("Default"));
ui_->keyServerListTable->horizontalHeaderItem(1)->setText(
- _("Keyserver Address"));
- ui_->keyServerListTable->horizontalHeaderItem(2)->setText(_("Security"));
- ui_->keyServerListTable->horizontalHeaderItem(3)->setText(_("Available"));
+ tr("Keyserver Address"));
+ ui_->keyServerListTable->horizontalHeaderItem(2)->setText(tr("Security"));
+ ui_->keyServerListTable->horizontalHeaderItem(3)->setText(tr("Available"));
- ui_->addKeyServerPushButton->setText(_("Add"));
- ui_->testKeyServerButton->setText(_("Test Listed Keyserver"));
+ ui_->addKeyServerPushButton->setText(tr("Add"));
+ ui_->testKeyServerButton->setText(tr("Test Listed Keyserver"));
ui_->tipsLabel->setText(
- _("Tips: Please Double-click table item to edit it."));
- ui_->actionDelete_Selected_Key_Server->setText(_("Delete Selected"));
+ tr("Tips: Please Double-click table item to edit it."));
+ ui_->actionDelete_Selected_Key_Server->setText(tr("Delete Selected"));
ui_->actionDelete_Selected_Key_Server->setToolTip(
- _("Delete Selected Key Server"));
- ui_->actionSet_As_Default->setText(_("Set As Default"));
- ui_->actionSet_As_Default->setToolTip(_("Set As Default"));
+ tr("Delete Selected Key Server"));
+ ui_->actionSet_As_Default->setText(tr("Set As Default"));
+ ui_->actionSet_As_Default->setToolTip(tr("Set As Default"));
popup_menu_ = new QMenu(this);
popup_menu_->addAction(ui_->actionSet_As_Default);
@@ -140,21 +140,21 @@ void KeyserverTab::slot_add_key_server() {
;
} else if (target_url.startsWith("http://")) {
QMessageBox::warning(
- this, _("Insecure keyserver address"),
- _("For security reasons, using HTTP as the communication protocol "
- "with "
- "the key server is not recommended. It is recommended to use "
- "HTTPS."));
+ this, tr("Insecure keyserver address"),
+ tr("For security reasons, using HTTP as the communication protocol "
+ "with "
+ "the key server is not recommended. It is recommended to use "
+ "HTTPS."));
}
key_server_str_list_.append(ui_->addKeyServerEdit->text());
} else {
auto ret = QMessageBox::warning(
- this, _("Warning"),
- _("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?"),
+ this, tr("Warning"),
+ tr("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?"),
QMessageBox::Ok | QMessageBox::Cancel);
if (ret == QMessageBox::Cancel) return;
@@ -197,13 +197,13 @@ void KeyserverTab::slot_refresh_table() {
tmp2->setTextAlignment(Qt::AlignCenter);
ui_->keyServerListTable->setItem(index, 1, tmp2);
- auto* tmp3 = new QTableWidgetItem(server.startsWith("https") ? _("true")
- : _("false"));
+ auto* tmp3 = new QTableWidgetItem(server.startsWith("https") ? tr("true")
+ : tr("false"));
tmp3->setTextAlignment(Qt::AlignCenter);
ui_->keyServerListTable->setItem(index, 2, tmp3);
tmp3->setFlags(tmp3->flags() ^ Qt::ItemIsEditable);
- auto* tmp4 = new QTableWidgetItem(_("unknown"));
+ auto* tmp4 = new QTableWidgetItem(tr("unknown"));
tmp4->setTextAlignment(Qt::AlignCenter);
ui_->keyServerListTable->setItem(index, 3, tmp4);
tmp4->setFlags(tmp3->flags() ^ Qt::ItemIsEditable);
@@ -217,7 +217,7 @@ void KeyserverTab::slot_refresh_table() {
}
void KeyserverTab::slot_test_listed_key_server() {
- auto timeout = QInputDialog::getInt(this, _("Set TCP Timeout"),
+ auto timeout = QInputDialog::getInt(this, tr("Set TCP Timeout"),
tr("timeout(ms): "), 2500, 200, 16000);
QStringList urls;
@@ -242,10 +242,10 @@ void KeyserverTab::slot_test_listed_key_server() {
const auto status = result[i];
auto* status_iem = ui_->keyServerListTable->item(i, 3);
if (status == ListedKeyServerTestTask::kTEST_RESULT_TYPE_SUCCESS) {
- status_iem->setText(_("Reachable"));
+ status_iem->setText(tr("Reachable"));
status_iem->setForeground(QBrush(QColor::fromRgb(0, 255, 0)));
} else {
- status_iem->setText(_("Not Reachable"));
+ status_iem->setText(tr("Not Reachable"));
status_iem->setForeground(QBrush(QColor::fromRgb(255, 0, 0)));
}
}
@@ -256,11 +256,11 @@ void KeyserverTab::slot_test_listed_key_server() {
auto* waiting_dialog = new QProgressDialog(this);
waiting_dialog->setMaximum(0);
waiting_dialog->setMinimum(0);
- auto* waiting_dialog_label =
- new QLabel(QString(_("Test Key Server Connection...")) + "<br /><br />" +
- _("This test only tests the network connectivity of the key "
- "server. Passing the test does not mean that the key server "
- "is functionally available."));
+ auto* waiting_dialog_label = new QLabel(
+ tr("Test Key Server Connection...") + "<br /><br />" +
+ tr("This test only tests the network connectivity of the key "
+ "server. Passing the test does not mean that the key server "
+ "is functionally available."));
waiting_dialog_label->setWordWrap(true);
waiting_dialog->setLabel(waiting_dialog_label);
waiting_dialog->resize(420, 120);
diff --git a/src/ui/dialog/settings/SettingsNetwork.cpp b/src/ui/dialog/settings/SettingsNetwork.cpp
index ac6160e8..c7e1e9f6 100644
--- a/src/ui/dialog/settings/SettingsNetwork.cpp
+++ b/src/ui/dialog/settings/SettingsNetwork.cpp
@@ -68,31 +68,31 @@ GpgFrontend::UI::NetworkTab::NetworkTab(QWidget *parent)
connect(ui_->checkProxyConnectionButton, &QPushButton::clicked, this,
&NetworkTab::slot_test_proxy_connection_result);
- ui_->proxyGroupBox->setTitle(_("Proxy"));
- ui_->capabilityGroupBox->setTitle(_("Network Ability"));
- ui_->operationsGroupBox->setTitle(_("Operations"));
+ ui_->proxyGroupBox->setTitle(tr("Proxy"));
+ ui_->capabilityGroupBox->setTitle(tr("Network Ability"));
+ ui_->operationsGroupBox->setTitle(tr("Operations"));
- ui_->enableProxyCheckBox->setText(_("Enable Proxy"));
- ui_->proxyServerPortLabel->setText(_("Port"));
+ ui_->enableProxyCheckBox->setText(tr("Enable Proxy"));
+ ui_->proxyServerPortLabel->setText(tr("Port"));
- ui_->proxyServerAddressLabel->setText(_("Host Address"));
- ui_->proxyServerPortLabel->setText(_("Port"));
- ui_->proxyTypeLabel->setText(_("Proxy Type"));
- ui_->usernameLabel->setText(_("Username"));
- ui_->passwordLabel->setText(_("Password"));
+ ui_->proxyServerAddressLabel->setText(tr("Host Address"));
+ ui_->proxyServerPortLabel->setText(tr("Port"));
+ ui_->proxyTypeLabel->setText(tr("Proxy Type"));
+ ui_->usernameLabel->setText(tr("Username"));
+ ui_->passwordLabel->setText(tr("Password"));
ui_->checkProxyConnectionButton->setText(
- _("Apply Proxy Settings and Check Proxy Connection"));
+ tr("Apply Proxy Settings and Check Proxy Connection"));
ui_->forbidALLGnuPGNetworkConnectionCheckBox->setText(
- _("Forbid all GnuPG network connection."));
+ tr("Forbid all GnuPG network connection."));
ui_->prohibitUpdateCheck->setText(
- _("Prohibit checking for version updates when the program starts."));
+ tr("Prohibit checking for version updates when the program starts."));
ui_->autoImportMissingKeyCheckBox->setText(
- _("Automatically import a missing key for signature verification."));
+ tr("Automatically import a missing key for signature verification."));
ui_->networkAbilityTipsLabel->setText(
- _("Tips: These Option Changes take effect only after the "
- "application restart."));
+ tr("Tips: These Option Changes take effect only after the "
+ "application restart."));
SetSettings();
}
@@ -167,7 +167,7 @@ void GpgFrontend::UI::NetworkTab::slot_test_proxy_connection_result() {
apply_proxy_settings();
bool ok;
- auto url = QInputDialog::getText(this, _("Test Server Url Accessibility"),
+ auto url = QInputDialog::getText(this, tr("Test Server Url Accessibility"),
tr("Server Url"), QLineEdit::Normal,
"https://", &ok);
if (ok && !url.isEmpty()) {
@@ -177,14 +177,15 @@ void GpgFrontend::UI::NetworkTab::slot_test_proxy_connection_result() {
SignalProxyConnectionTestResult,
this, [=](const QString &result) {
if (result == "Reachable") {
- QMessageBox::information(this, _("Success"),
- _("Successfully connect to the target "
- "server through the proxy server."));
+ QMessageBox::information(
+ this, tr("Success"),
+ tr("Successfully connect to the target "
+ "server through the proxy server."));
} else {
QMessageBox::critical(
- this, _("Failed"),
- _("Unable to connect to the target server through the "
- "proxy server. Proxy settings may be invalid."));
+ this, tr("Failed"),
+ tr("Unable to connect to the target server through the "
+ "proxy server. Proxy settings may be invalid."));
}
});
@@ -193,9 +194,10 @@ void GpgFrontend::UI::NetworkTab::slot_test_proxy_connection_result() {
waiting_dialog->setMaximum(0);
waiting_dialog->setMinimum(0);
auto waiting_dialog_label = new QLabel(
- QString(_("Test Proxy Server Connection...")) + "<br /><br />" +
- _("Is using your proxy settings to access the url. Note that this test "
- "operation will apply your proxy settings to the entire software."));
+ tr("Test Proxy Server Connection...") + "<br /><br />" +
+ tr("Is using your proxy settings to access the url. Note that this "
+ "test "
+ "operation will apply your proxy settings to the entire software."));
waiting_dialog_label->setWordWrap(true);
waiting_dialog->setLabel(waiting_dialog_label);
waiting_dialog->resize(420, 120);
diff --git a/src/ui/function/ArchiveDirectory.cpp b/src/ui/function/ArchiveDirectory.cpp
deleted file mode 100644
index f0151705..00000000
--- a/src/ui/function/ArchiveDirectory.cpp
+++ /dev/null
@@ -1,86 +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 "ArchiveDirectory.h"
-
-#include "core/function/ArchiveFileOperator.h"
-
-namespace GpgFrontend::UI {
-
-auto PathPreCheck(QWidget* parent, const std::filesystem::path& path) -> bool {
- QFileInfo const file_info(path);
- QFileInfo const path_info(file_info.absolutePath());
-
- if (!path_info.exists()) {
- QMessageBox::critical(
- parent, _("Error"),
- QString(_("The path %1 does not exist.")).arg(path.c_str()));
- return false;
- }
-
- if (!path_info.isDir()) {
- QMessageBox::critical(
- parent, _("Error"),
- QString(_("The path %1 is not a directory.")).arg(path.c_str()));
- return false;
- }
-
- if (!file_info.isReadable()) {
- QMessageBox::critical(parent, _("Error"),
- _("No permission to read this file."));
- return false;
- }
- return true;
-}
-
-ArchiveDirectory::ArchiveDirectory(QWidget* parent) : QWidget(parent) {}
-
-auto ArchiveDirectory::Exec(const std::filesystem::path& target_directory)
- -> std::tuple<bool, GFBuffer> {
- if (!PathPreCheck(this, target_directory)) {
- return {false, {}};
- }
-
- try {
- auto base_path = target_directory.parent_path();
- auto target_path = target_directory;
- target_path = target_path.replace_extension("");
-
- GF_UI_LOG_DEBUG("archive directory, base path: {}, target path: {}",
- base_path.string(), target_path.string());
-
- // ArchiveFileOperator::CreateArchive(base_path, target_path, 0, );
-
- } catch (...) {
- GF_UI_LOG_ERROR("archive caught exception error");
- return {false, {}};
- }
- return {true, {}};
-}
-
-} // namespace GpgFrontend::UI \ No newline at end of file
diff --git a/src/ui/function/ArchiveDirectory.h b/src/ui/function/ArchiveDirectory.h
deleted file mode 100644
index 8b21c7e1..00000000
--- a/src/ui/function/ArchiveDirectory.h
+++ /dev/null
@@ -1,53 +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
- *
- */
-
-#pragma once
-
-#include "core/model/GFBuffer.h"
-#include "ui/GpgFrontendUI.h"
-
-namespace GpgFrontend::UI {
-class ArchiveDirectory : public QWidget {
- Q_OBJECT
- public:
- /**
- * @brief Construct a new Raise Pinentry object
- *
- * @param parent
- */
- explicit ArchiveDirectory(QWidget* parent);
-
- /**
- * @brief
- *
- * @return int
- */
- auto Exec(const std::filesystem::path& target_directory)
- -> std::tuple<bool, GFBuffer>;
-};
-} // namespace GpgFrontend::UI \ No newline at end of file
diff --git a/src/ui/function/RaisePinentry.cpp b/src/ui/function/RaisePinentry.cpp
index 8d4c51c4..762977b7 100644
--- a/src/ui/function/RaisePinentry.cpp
+++ b/src/ui/function/RaisePinentry.cpp
@@ -60,16 +60,16 @@ auto RaisePinentry::Exec() -> int {
bool ask_for_new = context_->GetPassphraseInfo().isEmpty() &&
context_->GetUidsInfo().isEmpty();
- auto* pinentry = new PinEntryDialog(
- FindTopMostWindow(this), 0, 15, true, ask_for_new,
- ask_for_new ? QString(_("Repeat PIN:")) : QString(),
- QString(_("Show passphrase")), QString(_("Hide passphrase")));
+ auto* pinentry =
+ new PinEntryDialog(FindTopMostWindow(this), 0, 15, true, ask_for_new,
+ ask_for_new ? tr("Repeat PIN:") : QString(),
+ tr("Show passphrase"), tr("Hide passphrase"));
if (context_->IsPreWasBad()) {
- pinentry->setError(QString(_("Given PIN was wrong. Please retry.")));
+ pinentry->setError(tr("Given PIN was wrong. Please retry."));
}
- pinentry->setPrompt(QString(_("PIN:")));
+ pinentry->setPrompt(tr("PIN:"));
if (!context_->GetUidsInfo().isEmpty()) {
pinentry->setDescription(QString("Please provide PIN of Key:\n%1\n")
@@ -79,20 +79,19 @@ auto RaisePinentry::Exec() -> int {
struct pinentry pinentry_info;
pinentry->setPinentryInfo(pinentry_info);
- pinentry->setRepeatErrorText(
- QString::fromStdString(_("Passphrases do not match")));
+ pinentry->setRepeatErrorText(tr("Passphrases do not match"));
pinentry->setGenpinLabel(QString("BBBBBBBBB"));
pinentry->setGenpinTT(QString("AAAAAAAA"));
- pinentry->setCapsLockHint(QString(_("Caps Lock is on")));
+ pinentry->setCapsLockHint(tr("Caps Lock is on"));
pinentry->setFormattedPassphrase({false, QString()});
pinentry->setConstraintsOptions({false, QString(), QString(), QString()});
- pinentry->setWindowTitle(_("Buddled Pinentry"));
+ pinentry->setWindowTitle(tr("Buddled Pinentry"));
/* If we reuse the same dialog window. */
pinentry->setPin(QString());
- pinentry->setOkText(_("Confirm"));
- pinentry->setCancelText(_("Cancel"));
+ pinentry->setOkText(tr("Confirm"));
+ pinentry->setCancelText(tr("Cancel"));
GF_UI_LOG_DEBUG("buddled pinentry is ready to start...");
connect(pinentry, &PinEntryDialog::finished, this,
diff --git a/src/ui/function/SetOwnerTrustLevel.cpp b/src/ui/function/SetOwnerTrustLevel.cpp
index 91917961..360abfce 100644
--- a/src/ui/function/SetOwnerTrustLevel.cpp
+++ b/src/ui/function/SetOwnerTrustLevel.cpp
@@ -46,41 +46,42 @@ auto SetOwnerTrustLevel::Exec(const QString& key_id) -> bool {
QStringList items;
- items << _("Unknown") << _("Undefined") << _("Never") << _("Marginal")
- << _("Full") << _("Ultimate");
+ items << tr("Unknown") << tr("Undefined") << tr("Never") << tr("Marginal")
+ << tr("Full") << tr("Ultimate");
bool ok;
- QString item = QInputDialog::getItem(this, _("Modify Owner Trust Level"),
- _("Trust for the Key Pair:"), items,
+ QString item = QInputDialog::getItem(this, tr("Modify Owner Trust Level"),
+ tr("Trust for the Key Pair:"), items,
key.GetOwnerTrustLevel(), false, &ok);
if (ok && !item.isEmpty()) {
GF_UI_LOG_DEBUG("selected owner trust policy: {}", item.toStdString());
int trust_level = 0; // Unknown Level
- if (item == _("Ultimate")) {
+ if (item == tr("Ultimate")) {
trust_level = 5;
- } else if (item == _("Full")) {
+ } else if (item == tr("Full")) {
trust_level = 4;
- } else if (item == _("Marginal")) {
+ } else if (item == tr("Marginal")) {
trust_level = 3;
- } else if (item == _("Never")) {
+ } else if (item == tr("Never")) {
trust_level = 2;
- } else if (item == _("Undefined")) {
+ } else if (item == tr("Undefined")) {
trust_level = 1;
}
if (trust_level == 0) {
QMessageBox::warning(
- this, _("Warning"),
- QString(_("Owner Trust Level cannot set to Unknown level, automately "
- "changing it into Undefined level.")));
+ this, tr("Warning"),
+ QString(
+ tr("Owner Trust Level cannot set to Unknown level, automately "
+ "changing it into Undefined level.")));
trust_level = 1;
}
bool status =
GpgKeyManager::GetInstance().SetOwnerTrustLevel(key, trust_level);
if (!status) {
- QMessageBox::critical(this, _("Failed"),
- QString(_("Modify Owner Trust Level failed.")));
+ QMessageBox::critical(this, tr("Failed"),
+ tr("Modify Owner Trust Level failed."));
return false;
}
diff --git a/src/ui/main_window/KeyMgmt.cpp b/src/ui/main_window/KeyMgmt.cpp
index dacf996e..0ff9ced6 100644
--- a/src/ui/main_window/KeyMgmt.cpp
+++ b/src/ui/main_window/KeyMgmt.cpp
@@ -50,10 +50,12 @@ KeyMgmt::KeyMgmt(QWidget* parent)
/* the list of Keys available*/
key_list_ = new KeyList(KeyMenuAbility::ALL, this);
- key_list_->AddListGroupTab(_("All"), "all", KeyListRow::SECRET_OR_PUBLIC_KEY);
+ key_list_->AddListGroupTab(tr("All"), "all",
+ KeyListRow::SECRET_OR_PUBLIC_KEY);
key_list_->AddListGroupTab(
- _("Only Public Key"), "only_public_key", KeyListRow::SECRET_OR_PUBLIC_KEY,
+ tr("Only Public Key"), "only_public_key",
+ KeyListRow::SECRET_OR_PUBLIC_KEY,
KeyListColumn::TYPE | KeyListColumn::NAME | KeyListColumn::EmailAddress |
KeyListColumn::Usage | KeyListColumn::Validity,
[](const GpgKey& key, const KeyTable&) -> bool {
@@ -62,7 +64,8 @@ KeyMgmt::KeyMgmt(QWidget* parent)
});
key_list_->AddListGroupTab(
- _("Has Private Key"), "has_private_key", KeyListRow::SECRET_OR_PUBLIC_KEY,
+ tr("Has Private Key"), "has_private_key",
+ KeyListRow::SECRET_OR_PUBLIC_KEY,
KeyListColumn::TYPE | KeyListColumn::NAME | KeyListColumn::EmailAddress |
KeyListColumn::Usage | KeyListColumn::Validity,
[](const GpgKey& key, const KeyTable&) -> bool {
@@ -71,7 +74,7 @@ KeyMgmt::KeyMgmt(QWidget* parent)
});
key_list_->AddListGroupTab(
- _("No Primary Key"), "no_primary_key", KeyListRow::SECRET_OR_PUBLIC_KEY,
+ tr("No Primary Key"), "no_primary_key", KeyListRow::SECRET_OR_PUBLIC_KEY,
KeyListColumn::TYPE | KeyListColumn::NAME | KeyListColumn::EmailAddress |
KeyListColumn::Usage | KeyListColumn::Validity,
[](const GpgKey& key, const KeyTable&) -> bool {
@@ -80,7 +83,7 @@ KeyMgmt::KeyMgmt(QWidget* parent)
});
key_list_->AddListGroupTab(
- _("Revoked"), "revoked", KeyListRow::SECRET_OR_PUBLIC_KEY,
+ tr("Revoked"), "revoked", KeyListRow::SECRET_OR_PUBLIC_KEY,
KeyListColumn::TYPE | KeyListColumn::NAME | KeyListColumn::EmailAddress |
KeyListColumn::Usage | KeyListColumn::Validity,
[](const GpgKey& key, const KeyTable&) -> bool {
@@ -88,7 +91,7 @@ KeyMgmt::KeyMgmt(QWidget* parent)
});
key_list_->AddListGroupTab(
- _("Expired"), "expired", KeyListRow::SECRET_OR_PUBLIC_KEY,
+ tr("Expired"), "expired", KeyListRow::SECRET_OR_PUBLIC_KEY,
KeyListColumn::TYPE | KeyListColumn::NAME | KeyListColumn::EmailAddress |
KeyListColumn::Usage | KeyListColumn::Validity,
[](const GpgKey& key, const KeyTable&) -> bool {
@@ -113,7 +116,7 @@ KeyMgmt::KeyMgmt(QWidget* parent)
this->statusBar()->show();
- setWindowTitle(_("KeyPair Management"));
+ setWindowTitle(tr("KeyPair Management"));
key_list_->AddMenuAction(generate_subkey_act_);
key_list_->AddMenuAction(delete_selected_keys_act_);
@@ -133,43 +136,44 @@ KeyMgmt::KeyMgmt(QWidget* parent)
}
void KeyMgmt::create_actions() {
- open_key_file_act_ = new QAction(_("Open"), this);
- open_key_file_act_->setShortcut(QKeySequence(_("Ctrl+O")));
- open_key_file_act_->setToolTip(_("Open Key File"));
+ open_key_file_act_ = new QAction(tr("Open"), this);
+ open_key_file_act_->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_O));
+ open_key_file_act_->setToolTip(tr("Open Key File"));
connect(open_key_file_act_, &QAction::triggered, this,
[&]() { CommonUtils::GetInstance()->SlotImportKeyFromFile(this); });
- close_act_ = new QAction(_("Close"), this);
- close_act_->setShortcut(QKeySequence(_("Ctrl+Q")));
- close_act_->setIcon(QIcon(":exit.png"));
- close_act_->setToolTip(_("Close"));
+ close_act_ = new QAction(tr("Close"), this);
+ close_act_->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_Q));
+ close_act_->setIcon(QIcon(":/icons/exit.png"));
+ close_act_->setToolTip(tr("Close"));
connect(close_act_, &QAction::triggered, this, &KeyMgmt::close);
- generate_key_pair_act_ = new QAction(_("New Keypair"), this);
- generate_key_pair_act_->setShortcut(QKeySequence(_("Ctrl+N")));
- generate_key_pair_act_->setIcon(QIcon(":key_generate.png"));
- generate_key_pair_act_->setToolTip(_("Generate KeyPair"));
+ generate_key_pair_act_ = new QAction(tr("New Keypair"), this);
+ generate_key_pair_act_->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_N));
+ generate_key_pair_act_->setIcon(QIcon(":/icons/key_generate.png"));
+ generate_key_pair_act_->setToolTip(tr("Generate KeyPair"));
connect(generate_key_pair_act_, &QAction::triggered, this,
&KeyMgmt::SlotGenerateKeyDialog);
- generate_subkey_act_ = new QAction(_("New Subkey"), this);
- generate_subkey_act_->setShortcut(QKeySequence(_("Ctrl+Shift+N")));
- generate_subkey_act_->setIcon(QIcon(":key_generate.png"));
- generate_subkey_act_->setToolTip(_("Generate Subkey For Selected KeyPair"));
+ generate_subkey_act_ = new QAction(tr("New Subkey"), this);
+ generate_subkey_act_->setShortcut(
+ QKeySequence(Qt::CTRL | Qt::SHIFT | Qt::Key_N));
+ generate_subkey_act_->setIcon(QIcon(":/icons/key_generate.png"));
+ generate_subkey_act_->setToolTip(tr("Generate Subkey For Selected KeyPair"));
connect(generate_subkey_act_, &QAction::triggered, this,
&KeyMgmt::SlotGenerateSubKey);
- import_key_from_file_act_ = new QAction(_("File"), this);
- import_key_from_file_act_->setIcon(QIcon(":import_key_from_file.png"));
- import_key_from_file_act_->setToolTip(_("Import New Key From File"));
+ import_key_from_file_act_ = new QAction(tr("File"), this);
+ import_key_from_file_act_->setIcon(QIcon(":/icons/import_key_from_file.png"));
+ import_key_from_file_act_->setToolTip(tr("Import New Key From File"));
connect(import_key_from_file_act_, &QAction::triggered, this,
[&]() { CommonUtils::GetInstance()->SlotImportKeyFromFile(this); });
- import_key_from_clipboard_act_ = new QAction(_("Clipboard"), this);
+ import_key_from_clipboard_act_ = new QAction(tr("Clipboard"), this);
import_key_from_clipboard_act_->setIcon(
- QIcon(":import_key_from_clipboard.png"));
+ QIcon(":/icons/import_key_from_clipboard.png"));
import_key_from_clipboard_act_->setToolTip(
- _("Import New Key From Clipboard"));
+ tr("Import New Key From Clipboard"));
connect(import_key_from_clipboard_act_, &QAction::triggered, this, [&]() {
CommonUtils::GetInstance()->SlotImportKeyFromClipboard(this);
});
@@ -180,62 +184,63 @@ void KeyMgmt::create_actions() {
.value("network/forbid_all_gnupg_connection", false)
.toBool();
- import_key_from_key_server_act_ = new QAction(_("Keyserver"), this);
+ import_key_from_key_server_act_ = new QAction(tr("Keyserver"), this);
import_key_from_key_server_act_->setIcon(
- QIcon(":import_key_from_server.png"));
+ QIcon(":/icons/import_key_from_server.png"));
import_key_from_key_server_act_->setToolTip(
- _("Import New Key From Keyserver"));
+ tr("Import New Key From Keyserver"));
import_key_from_key_server_act_->setDisabled(forbid_all_gnupg_connection);
connect(import_key_from_key_server_act_, &QAction::triggered, this, [this]() {
CommonUtils::GetInstance()->SlotImportKeyFromKeyServer(this);
});
- import_keys_from_key_package_act_ = new QAction(_("Key Package"), this);
- import_keys_from_key_package_act_->setIcon(QIcon(":key_package.png"));
+ import_keys_from_key_package_act_ = new QAction(tr("Key Package"), this);
+ import_keys_from_key_package_act_->setIcon(QIcon(":/icons/key_package.png"));
import_keys_from_key_package_act_->setToolTip(
- _("Import Key(s) From a Key Package"));
+ tr("Import Key(s) From a Key Package"));
connect(import_keys_from_key_package_act_, &QAction::triggered, this,
&KeyMgmt::SlotImportKeyPackage);
- export_key_to_clipboard_act_ = new QAction(_("Export To Clipboard"), this);
- export_key_to_clipboard_act_->setIcon(QIcon(":export_key_to_clipboard.png"));
+ export_key_to_clipboard_act_ = new QAction(tr("Export To Clipboard"), this);
+ export_key_to_clipboard_act_->setIcon(
+ QIcon(":/icons/export_key_to_clipboard.png"));
export_key_to_clipboard_act_->setToolTip(
- _("Export Checked Key(s) To Clipboard"));
+ tr("Export Checked Key(s) To Clipboard"));
connect(export_key_to_clipboard_act_, &QAction::triggered, this,
&KeyMgmt::SlotExportKeyToClipboard);
- export_key_to_file_act_ = new QAction(_("Export As Key Package"), this);
- export_key_to_file_act_->setIcon(QIcon(":key_package.png"));
+ export_key_to_file_act_ = new QAction(tr("Export As Key Package"), this);
+ export_key_to_file_act_->setIcon(QIcon(":/icons/key_package.png"));
export_key_to_file_act_->setToolTip(
- _("Export Checked Key(s) To a Key Package"));
+ tr("Export Checked Key(s) To a Key Package"));
connect(export_key_to_file_act_, &QAction::triggered, this,
&KeyMgmt::SlotExportKeyToKeyPackage);
- export_key_as_open_ssh_format_ = new QAction(_("Export As OpenSSH"), this);
- export_key_as_open_ssh_format_->setIcon(QIcon(":ssh-key.png"));
+ export_key_as_open_ssh_format_ = new QAction(tr("Export As OpenSSH"), this);
+ export_key_as_open_ssh_format_->setIcon(QIcon(":/icons/ssh-key.png"));
export_key_as_open_ssh_format_->setToolTip(
- _("Export Checked Key As OpenSSH Format to File"));
+ tr("Export Checked Key As OpenSSH Format to File"));
connect(export_key_as_open_ssh_format_, &QAction::triggered, this,
&KeyMgmt::SlotExportAsOpenSSHFormat);
- delete_selected_keys_act_ = new QAction(_("Delete Selected Key(s)"), this);
- delete_selected_keys_act_->setToolTip(_("Delete the Selected keys"));
+ delete_selected_keys_act_ = new QAction(tr("Delete Selected Key(s)"), this);
+ 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(_("Delete Checked Key(s)"), this);
- delete_checked_keys_act_->setToolTip(_("Delete the Checked keys"));
- delete_checked_keys_act_->setIcon(QIcon(":button_delete.png"));
+ 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"));
connect(delete_checked_keys_act_, &QAction::triggered, this,
&KeyMgmt::SlotDeleteCheckedKeys);
- show_key_details_act_ = new QAction(_("Show Key Details"), this);
- show_key_details_act_->setToolTip(_("Show Details for this Key"));
+ show_key_details_act_ = new QAction(tr("Show Key Details"), this);
+ 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(_("Set Owner Trust Level"), this);
- set_owner_trust_of_key_act_->setToolTip(_("Set Owner Trust Level"));
+ set_owner_trust_of_key_act_ = new QAction(tr("Set Owner Trust Level"), this);
+ 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]() {
auto keys_selected = key_list_->GetSelected();
@@ -248,22 +253,22 @@ void KeyMgmt::create_actions() {
}
void KeyMgmt::create_menus() {
- file_menu_ = menuBar()->addMenu(_("File"));
+ file_menu_ = menuBar()->addMenu(tr("File"));
file_menu_->addAction(open_key_file_act_);
file_menu_->addAction(close_act_);
- key_menu_ = menuBar()->addMenu(_("Key"));
- generate_key_menu_ = key_menu_->addMenu(_("Generate Key"));
+ key_menu_ = menuBar()->addMenu(tr("Key"));
+ generate_key_menu_ = key_menu_->addMenu(tr("Generate Key"));
generate_key_menu_->addAction(generate_key_pair_act_);
generate_key_menu_->addAction(generate_subkey_act_);
- import_key_menu_ = key_menu_->addMenu(_("Import Key"));
+ import_key_menu_ = key_menu_->addMenu(tr("Import Key"));
import_key_menu_->addAction(import_key_from_file_act_);
import_key_menu_->addAction(import_key_from_clipboard_act_);
import_key_menu_->addAction(import_key_from_key_server_act_);
import_key_menu_->addAction(import_keys_from_key_package_act_);
- export_key_menu_ = key_menu_->addMenu(_("Export Key"));
+ export_key_menu_ = key_menu_->addMenu(tr("Export Key"));
export_key_menu_->addAction(export_key_to_file_act_);
export_key_menu_->addAction(export_key_to_clipboard_act_);
export_key_menu_->addAction(export_key_as_open_ssh_format_);
@@ -272,7 +277,7 @@ void KeyMgmt::create_menus() {
}
void KeyMgmt::create_tool_bars() {
- QToolBar* key_tool_bar = addToolBar(_("Key"));
+ QToolBar* key_tool_bar = addToolBar(tr("Key"));
key_tool_bar->setObjectName("keytoolbar");
// genrate key pair
@@ -283,18 +288,18 @@ void KeyMgmt::create_tool_bars() {
auto* import_tool_button = new QToolButton(this);
import_tool_button->setMenu(import_key_menu_);
import_tool_button->setPopupMode(QToolButton::InstantPopup);
- import_tool_button->setIcon(QIcon(":key_import.png"));
- import_tool_button->setToolTip(_("Import key"));
- import_tool_button->setText(_("Import Key"));
+ import_tool_button->setIcon(QIcon(":/icons/key_import.png"));
+ import_tool_button->setToolTip(tr("Import key"));
+ import_tool_button->setText(tr("Import Key"));
import_tool_button->setToolButtonStyle(icon_style_);
key_tool_bar->addWidget(import_tool_button);
auto* export_tool_button = new QToolButton(this);
export_tool_button->setMenu(export_key_menu_);
export_tool_button->setPopupMode(QToolButton::InstantPopup);
- export_tool_button->setIcon(QIcon(":key_export.png"));
- export_tool_button->setToolTip(_("Export key"));
- export_tool_button->setText(_("Export Key"));
+ export_tool_button->setIcon(QIcon(":/icons/key_export.png"));
+ export_tool_button->setToolTip(tr("Export key"));
+ export_tool_button->setText(tr("Export Key"));
export_tool_button->setToolButtonStyle(icon_style_);
key_tool_bar->addWidget(export_tool_button);
@@ -327,12 +332,12 @@ void KeyMgmt::delete_keys_with_warning(KeyIdArgsListPtr uidList) {
}
int const ret = QMessageBox::warning(
- this, _("Deleting Keys"),
+ this, tr("Deleting Keys"),
"<b>" +
QString(
- _("Are you sure that you want to delete the following keys?")) +
+ tr("Are you sure that you want to delete the following keys?")) +
"</b><br/><br/>" + keynames + +"<br/>" +
- _("The action can not be undone."),
+ tr("The action can not be undone."),
QMessageBox::No | QMessageBox::Yes);
if (ret == QMessageBox::Yes) {
@@ -348,7 +353,7 @@ void KeyMgmt::SlotShowKeyDetails() {
auto key = GpgKeyGetter::GetInstance().GetKey(keys_selected->front());
if (!key.IsGood()) {
- QMessageBox::critical(this, _("Error"), _("Key Not Found."));
+ QMessageBox::critical(this, tr("Error"), tr("Key Not Found."));
return;
}
@@ -359,21 +364,21 @@ void KeyMgmt::SlotExportKeyToKeyPackage() {
auto keys_checked = key_list_->GetChecked();
if (keys_checked->empty()) {
QMessageBox::critical(
- this, _("Forbidden"),
- _("Please check some keys before doing this operation."));
+ this, tr("Forbidden"),
+ tr("Please check some keys before doing this operation."));
return;
}
auto* dialog = new ExportKeyPackageDialog(std::move(keys_checked), this);
dialog->exec();
- emit SignalStatusBarChanged(QString(_("key(s) exported")));
+ emit SignalStatusBarChanged(tr("key(s) exported"));
}
void KeyMgmt::SlotExportKeyToClipboard() {
auto keys_checked = key_list_->GetChecked();
if (keys_checked->empty()) {
QMessageBox::critical(
- this, _("Forbidden"),
- _("Please check some keys before doing this operation."));
+ this, tr("Forbidden"),
+ tr("Please check some keys before doing this operation."));
return;
}
@@ -389,7 +394,7 @@ void KeyMgmt::SlotExportKeyToClipboard() {
} else {
auto keys = GpgKeyGetter::GetInstance().GetKeys(keys_checked);
CommonUtils::WaitForOpera(
- this, _("Exporting"), [=](const OperaWaitingHd& op_hd) {
+ this, tr("Exporting"), [=](const OperaWaitingHd& op_hd) {
GpgKeyImportExporter::GetInstance().ExportKeys(
*keys, false, true, false, false,
[=](GpgError err, const DataObjectPtr& data_obj) {
@@ -422,19 +427,19 @@ void KeyMgmt::SlotGenerateSubKey() {
auto keys_selected = key_list_->GetSelected();
if (keys_selected->empty()) {
QMessageBox::information(
- this, _("Invalid Operation"),
- _("Please select one KeyPair before doing this operation."));
+ this, tr("Invalid Operation"),
+ tr("Please select one KeyPair before doing this operation."));
return;
}
const auto key = GpgKeyGetter::GetInstance().GetKey(keys_selected->front());
if (!key.IsGood()) {
- QMessageBox::critical(this, _("Error"), _("Key Not Found."));
+ QMessageBox::critical(this, tr("Error"), tr("Key Not Found."));
return;
}
if (!key.IsPrivateKey()) {
- QMessageBox::critical(this, _("Invalid Operation"),
- _("If a key pair does not have a private key then "
- "it will not be able to generate sub-keys."));
+ QMessageBox::critical(this, tr("Invalid Operation"),
+ tr("If a key pair does not have a private key then "
+ "it will not be able to generate sub-keys."));
return;
}
@@ -446,20 +451,20 @@ void KeyMgmt::SlotExportAsOpenSSHFormat() {
auto keys_checked = key_list_->GetChecked();
if (keys_checked->empty()) {
QMessageBox::critical(
- this, _("Forbidden"),
- _("Please check a key before performing this operation."));
+ this, tr("Forbidden"),
+ tr("Please check a key before performing this operation."));
return;
}
if (keys_checked->size() > 1) {
- QMessageBox::critical(this, _("Forbidden"),
- _("This operation accepts just a single key."));
+ QMessageBox::critical(this, tr("Forbidden"),
+ tr("This operation accepts just a single key."));
return;
}
auto keys = GpgKeyGetter::GetInstance().GetKeys(keys_checked);
CommonUtils::WaitForOpera(
- this, _("Exporting"), [this, keys](const OperaWaitingHd& op_hd) {
+ this, tr("Exporting"), [this, keys](const OperaWaitingHd& op_hd) {
GpgKeyImportExporter::GetInstance().ExportKeys(
*keys, false, true, false, true,
[=](GpgError err, const DataObjectPtr& data_obj) {
@@ -483,20 +488,20 @@ void KeyMgmt::SlotExportAsOpenSSHFormat() {
if (gf_buffer.Empty()) {
QMessageBox::critical(
- this, _("Error"),
- _("This key may not be able to export as OpenSSH format. "
- "Please check the key-size of the subkey(s) used to "
- "sign."));
+ this, tr("Error"),
+ tr("This key may not be able to export as OpenSSH format. "
+ "Please check the key-size of the subkey(s) used to "
+ "sign."));
return;
}
QString const file_name = QFileDialog::getSaveFileName(
- this, _("Export OpenSSH Key To File"), "authorized_keys",
- QString(_("OpenSSH Public Key Files")) + "All Files (*)");
+ this, tr("Export OpenSSH Key To File"), "authorized_keys",
+ tr("OpenSSH Public Key Files") + "All Files (*)");
if (!file_name.isEmpty()) {
WriteFileGFBuffer(file_name, gf_buffer);
- emit SignalStatusBarChanged(QString(_("key(s) exported")));
+ emit SignalStatusBarChanged(tr("key(s) exported"));
}
});
});
@@ -506,12 +511,12 @@ void KeyMgmt::SlotImportKeyPackage() {
GF_UI_LOG_INFO("Importing key package...");
auto key_package_file_name = QFileDialog::getOpenFileName(
- this, _("Import Key Package"), {},
- QString(_("Key Package")) + " (*.gfepack);;All Files (*)");
+ this, tr("Import Key Package"), {},
+ tr("Key Package") + " (*.gfepack);;All Files (*)");
auto key_file_name = QFileDialog::getOpenFileName(
- this, _("Import Key Package Passphrase File"), {},
- QString(_("Key Package Passphrase File")) + " (*.key);;All Files (*)");
+ this, tr("Import Key Package Passphrase File"), {},
+ tr("Key Package Passphrase File") + " (*.key);;All Files (*)");
if (key_package_file_name.isEmpty() || key_file_name.isEmpty()) return;
@@ -521,14 +526,14 @@ void KeyMgmt::SlotImportKeyPackage() {
key_package_file_name, key_file_name);
if (success) {
- emit SignalStatusBarChanged(QString(_("key(s) imported")));
+ emit SignalStatusBarChanged(tr("key(s) imported"));
emit SignalKeyStatusUpdated();
auto* dialog = new KeyImportDetailDialog(info, this);
dialog->exec();
} else {
- QMessageBox::critical(this, _("Error"),
- _("An error occur in importing key package."));
+ QMessageBox::critical(this, tr("Error"),
+ tr("An error occur in importing key package."));
}
}
diff --git a/src/ui/main_window/MainWindow.cpp b/src/ui/main_window/MainWindow.cpp
index cdeb597a..31d53bd1 100644
--- a/src/ui/main_window/MainWindow.cpp
+++ b/src/ui/main_window/MainWindow.cpp
@@ -162,9 +162,10 @@ void MainWindow::Init() noexcept {
if (show_wizard) slot_start_wizard();
} catch (...) {
- GF_UI_LOG_ERROR(_("Critical error occur while loading GpgFrontend."));
- QMessageBox::critical(nullptr, _("Loading Failed"),
- _("Critical error occur while loading GpgFrontend."));
+ GF_UI_LOG_ERROR(tr("Critical error occur while loading GpgFrontend."));
+ QMessageBox::critical(
+ nullptr, tr("Loading Failed"),
+ tr("Critical error occur while loading GpgFrontend."));
QCoreApplication::quit();
exit(0);
}
diff --git a/src/ui/main_window/MainWindowFileSlotFunction.cpp b/src/ui/main_window/MainWindowFileSlotFunction.cpp
index 80390b13..3b28e41b 100644
--- a/src/ui/main_window/MainWindowFileSlotFunction.cpp
+++ b/src/ui/main_window/MainWindowFileSlotFunction.cpp
@@ -44,9 +44,9 @@ namespace GpgFrontend::UI {
void MainWindow::SlotFileEncrypt(const QString& path) {
auto check_result = TargetFilePreCheck(path, true);
if (!std::get<0>(check_result)) {
- QMessageBox::critical(this, _("Error"),
- QString(_("Cannot read from file: %1"))
- .arg(QFileInfo(path).fileName()));
+ QMessageBox::critical(
+ this, tr("Error"),
+ tr("Cannot read from file: %1").arg(QFileInfo(path).fileName()));
return;
}
@@ -59,10 +59,10 @@ void MainWindow::SlotFileEncrypt(const QString& path) {
SetExtensionOfOutputFile(path, kENCRYPT, !non_ascii_when_export);
if (QFile::exists(out_path)) {
- auto out_file_name = QString(_("The target file %1 already exists, "
- "do you need to overwrite it?"))
+ auto out_file_name = tr("The target file %1 already exists, "
+ "do you need to overwrite it?")
.arg(out_path);
- auto ret = QMessageBox::warning(this, _("Warning"), out_file_name,
+ auto ret = QMessageBox::warning(this, tr("Warning"), out_file_name,
QMessageBox::Ok | QMessageBox::Cancel);
if (ret == QMessageBox::Cancel) return;
@@ -70,8 +70,8 @@ void MainWindow::SlotFileEncrypt(const QString& path) {
check_result = TargetFilePreCheck(out_path, false);
if (!std::get<0>(check_result)) {
- QMessageBox::critical(this, _("Error"),
- QString(_("Cannot write to file: %1")).arg(out_path));
+ QMessageBox::critical(this, tr("Error"),
+ tr("Cannot write to file: %1").arg(out_path));
return;
}
@@ -80,14 +80,14 @@ void MainWindow::SlotFileEncrypt(const QString& path) {
if (key_ids->empty()) {
// Symmetric Encrypt
auto ret = QMessageBox::information(
- this, _("Symmetric Encryption"),
- _("No Key Selected. Do you want to encrypt with a "
- "symmetric cipher using a passphrase?"),
+ this, tr("Symmetric Encryption"),
+ tr("No Key Selected. Do you want to encrypt with a "
+ "symmetric cipher using a passphrase?"),
QMessageBox::Ok | QMessageBox::Cancel);
if (ret == QMessageBox::Cancel) return;
CommonUtils::WaitForOpera(
- this, _("Symmetrically Encrypting"), [=](const OperaWaitingHd& op_hd) {
+ this, tr("Symmetrically Encrypting"), [=](const OperaWaitingHd& op_hd) {
GpgFileOpera::GetInstance().EncryptFileSymmetric(
path, !non_ascii_when_export, out_path,
[=](GpgError err, const DataObjectPtr& data_obj) {
@@ -119,16 +119,16 @@ void MainWindow::SlotFileEncrypt(const QString& path) {
if (!key_can_encrypt) {
QMessageBox::critical(
- nullptr, _("Invalid KeyPair"),
- QString(_("The selected keypair cannot be used for encryption.")) +
- "<br/><br/>" + _("For example the Following Key:") + " <br/>" +
+ nullptr, tr("Invalid KeyPair"),
+ tr("The selected keypair cannot be used for encryption.") +
+ "<br/><br/>" + tr("For example the Following Key:") + " <br/>" +
key.GetUIDs()->front().GetUID());
return;
}
}
CommonUtils::WaitForOpera(
- this, _("Encrypting"), [=](const OperaWaitingHd& op_hd) {
+ this, tr("Encrypting"), [=](const OperaWaitingHd& op_hd) {
GpgFileOpera::GetInstance().EncryptFile(
{p_keys->begin(), p_keys->end()}, path, !non_ascii_when_export,
out_path, [=](GpgError err, const DataObjectPtr& data_obj) {
@@ -152,9 +152,9 @@ void MainWindow::SlotFileEncrypt(const QString& path) {
void MainWindow::SlotDirectoryEncrypt(const QString& path) {
auto check_result = TargetFilePreCheck(path, true);
if (!std::get<0>(check_result)) {
- QMessageBox::critical(this, _("Error"),
- QString(_("Cannot read from file: %1"))
- .arg(QFileInfo(path).fileName()));
+ QMessageBox::critical(
+ this, tr("Error"),
+ tr("Cannot read from file: %1").arg(QFileInfo(path).fileName()));
return;
}
@@ -167,10 +167,10 @@ void MainWindow::SlotDirectoryEncrypt(const QString& path) {
!non_ascii_when_export);
if (QFile::exists(out_path)) {
- auto out_file_name = QString(_("The target file %1 already exists, "
- "do you need to overwrite it?"))
+ auto out_file_name = tr("The target file %1 already exists, "
+ "do you need to overwrite it?")
.arg(out_path);
- auto ret = QMessageBox::warning(this, _("Warning"), out_file_name,
+ auto ret = QMessageBox::warning(this, tr("Warning"), out_file_name,
QMessageBox::Ok | QMessageBox::Cancel);
if (ret == QMessageBox::Cancel) return;
@@ -178,8 +178,8 @@ void MainWindow::SlotDirectoryEncrypt(const QString& path) {
check_result = TargetFilePreCheck(out_path, false);
if (!std::get<0>(check_result)) {
- QMessageBox::critical(this, _("Error"),
- QString(_("Cannot write to file: %1")).arg(out_path));
+ QMessageBox::critical(this, tr("Error"),
+ tr("Cannot write to file: %1").arg(out_path));
return;
}
@@ -188,14 +188,14 @@ void MainWindow::SlotDirectoryEncrypt(const QString& path) {
// symmetric encrypt
if (key_ids->empty()) {
auto ret = QMessageBox::information(
- this, _("Symmetric Encryption"),
- _("No Key Selected. Do you want to encrypt with a "
- "symmetric cipher using a passphrase?"),
+ this, tr("Symmetric Encryption"),
+ tr("No Key Selected. Do you want to encrypt with a "
+ "symmetric cipher using a passphrase?"),
QMessageBox::Ok | QMessageBox::Cancel);
if (ret == QMessageBox::Cancel) return;
CommonUtils::WaitForOpera(
- this, _("Archiving & Symmetrically Encrypting"),
+ this, tr("Archiving & Symmetrically Encrypting"),
[=](const OperaWaitingHd& op_hd) {
GpgFileOpera::GetInstance().EncryptDerectorySymmetric(
path, !non_ascii_when_export, out_path,
@@ -228,16 +228,16 @@ void MainWindow::SlotDirectoryEncrypt(const QString& path) {
if (!key_can_encrypt) {
QMessageBox::critical(
- nullptr, _("Invalid KeyPair"),
- QString(_("The selected keypair cannot be used for encryption.")) +
- "<br/><br/>" + _("For example the Following Key:") + " <br/>" +
+ nullptr, tr("Invalid KeyPair"),
+ tr("The selected keypair cannot be used for encryption.") +
+ "<br/><br/>" + tr("For example the Following Key:") + " <br/>" +
key.GetUIDs()->front().GetUID());
return;
}
}
CommonUtils::WaitForOpera(
- this, _("Archiving & Encrypting"), [=](const OperaWaitingHd& op_hd) {
+ this, tr("Archiving & Encrypting"), [=](const OperaWaitingHd& op_hd) {
GpgFileOpera::GetInstance().EncryptDirectory(
{p_keys->begin(), p_keys->end()}, path, !non_ascii_when_export,
out_path, [=](GpgError err, const DataObjectPtr& data_obj) {
@@ -261,17 +261,17 @@ void MainWindow::SlotDirectoryEncrypt(const QString& path) {
void MainWindow::SlotFileDecrypt(const QString& path) {
auto check_result = TargetFilePreCheck(path, true);
if (!std::get<0>(check_result)) {
- QMessageBox::critical(this, _("Error"),
- QString(_("Cannot read from file: %1"))
- .arg(QFileInfo(path).fileName()));
+ QMessageBox::critical(
+ this, tr("Error"),
+ tr("Cannot read from file: %1").arg(QFileInfo(path).fileName()));
return;
}
auto out_path = SetExtensionOfOutputFile(path, kDECRYPT, true);
if (QFileInfo(out_path).exists()) {
auto ret = QMessageBox::warning(
- this, _("Warning"),
- _("The target file already exists, do you need to overwrite it?"),
+ this, tr("Warning"),
+ tr("The target file already exists, do you need to overwrite it?"),
QMessageBox::Ok | QMessageBox::Cancel);
if (ret == QMessageBox::Cancel) return;
@@ -279,13 +279,13 @@ void MainWindow::SlotFileDecrypt(const QString& path) {
check_result = TargetFilePreCheck(out_path, false);
if (!std::get<0>(check_result)) {
- QMessageBox::critical(this, _("Error"),
- QString(_("Cannot write to file: %1")).arg(out_path));
+ QMessageBox::critical(this, tr("Error"),
+ tr("Cannot write to file: %1").arg(out_path));
return;
}
CommonUtils::WaitForOpera(
- this, _("Decrypting"), [=](const OperaWaitingHd& op_hd) {
+ this, tr("Decrypting"), [=](const OperaWaitingHd& op_hd) {
GpgFileOpera::GetInstance().DecryptFile(
path, out_path, [=](GpgError err, const DataObjectPtr& data_obj) {
// stop waiting
@@ -308,16 +308,16 @@ void MainWindow::SlotFileDecrypt(const QString& path) {
void MainWindow::SlotArchiveDecrypt(const QString& path) {
auto check_result = TargetFilePreCheck(path, true);
if (!std::get<0>(check_result)) {
- QMessageBox::critical(this, _("Error"),
- QString(_("Cannot read from file: %1")).arg(path));
+ QMessageBox::critical(this, tr("Error"),
+ tr("Cannot read from file: %1").arg(path));
return;
}
auto out_path = SetExtensionOfOutputFileForArchive(path, kDECRYPT, true);
if (QFileInfo(out_path).exists()) {
auto ret = QMessageBox::warning(
- this, _("Warning"),
- _("The target file already exists, do you need to overwrite it?"),
+ this, tr("Warning"),
+ tr("The target file already exists, do you need to overwrite it?"),
QMessageBox::Ok | QMessageBox::Cancel);
if (ret == QMessageBox::Cancel) return;
@@ -325,13 +325,13 @@ void MainWindow::SlotArchiveDecrypt(const QString& path) {
check_result = TargetFilePreCheck(out_path, false);
if (!std::get<0>(check_result)) {
- QMessageBox::critical(this, _("Error"),
- QString(_("Cannot write to file: %1")).arg(out_path));
+ QMessageBox::critical(this, tr("Error"),
+ tr("Cannot write to file: %1").arg(out_path));
return;
}
CommonUtils::WaitForOpera(
- this, _("Decrypting & Extrating"), [=](const OperaWaitingHd& op_hd) {
+ this, tr("Decrypting & Extrating"), [=](const OperaWaitingHd& op_hd) {
GpgFileOpera::GetInstance().DecryptArchive(
path, out_path, [=](GpgError err, const DataObjectPtr& data_obj) {
// stop waiting
@@ -354,9 +354,9 @@ void MainWindow::SlotArchiveDecrypt(const QString& path) {
void MainWindow::SlotFileSign(const QString& path) {
auto check_result = TargetFilePreCheck(path, true);
if (!std::get<0>(check_result)) {
- QMessageBox::critical(this, _("Error"),
- QString(_("Cannot read from file: %1"))
- .arg(QFileInfo(path).fileName()));
+ QMessageBox::critical(
+ this, tr("Error"),
+ tr("Cannot read from file: %1").arg(QFileInfo(path).fileName()));
return;
}
@@ -365,18 +365,18 @@ void MainWindow::SlotFileSign(const QString& path) {
if (keys->empty()) {
QMessageBox::critical(
- this, _("No Key Checked"),
- _("Please check the key in the key toolbox on the right."));
+ this, tr("No Key Checked"),
+ tr("Please check the key in the key toolbox on the right."));
return;
}
for (const auto& key : *keys) {
if (!key.IsHasActualSigningCapability()) {
QMessageBox::information(
- this, _("Invalid Operation"),
- QString(_("The selected key contains a key that does not actually "
- "have a sign usage.")) +
- "<br/><br/>" + _("for example the Following Key:") + " <br/>" +
+ this, tr("Invalid Operation"),
+ tr("The selected key contains a key that does not actually "
+ "have a sign usage.") +
+ "<br/><br/>" + tr("for example the Following Key:") + " <br/>" +
key.GetUIDs()->front().GetUID());
return;
}
@@ -391,18 +391,17 @@ void MainWindow::SlotFileSign(const QString& path) {
SetExtensionOfOutputFile(path, kSIGN, !non_ascii_when_export);
if (QFileInfo(sig_file_path).exists()) {
- auto ret =
- QMessageBox::warning(this, _("Warning"),
- QString(_("The signature file \"%1\" exists, "
- "do you need to overwrite it?"))
- .arg(sig_file_path),
- QMessageBox::Ok | QMessageBox::Cancel);
+ auto ret = QMessageBox::warning(this, tr("Warning"),
+ tr("The signature file \"%1\" exists, "
+ "do you need to overwrite it?")
+ .arg(sig_file_path),
+ QMessageBox::Ok | QMessageBox::Cancel);
if (ret == QMessageBox::Cancel) return;
}
CommonUtils::WaitForOpera(
- this, _("Signing"), [=](const OperaWaitingHd& op_hd) {
+ this, tr("Signing"), [=](const OperaWaitingHd& op_hd) {
GpgFileOpera::GetInstance().SignFile(
{keys->begin(), keys->end()}, path, !non_ascii_when_export,
sig_file_path, [=](GpgError err, const DataObjectPtr& data_obj) {
@@ -426,9 +425,9 @@ void MainWindow::SlotFileSign(const QString& path) {
void MainWindow::SlotFileVerify(const QString& path) {
auto check_result = TargetFilePreCheck(path, true);
if (!std::get<0>(check_result)) {
- QMessageBox::critical(this, _("Error"),
- QString(_("Cannot read from file: %1"))
- .arg(QFileInfo(path).fileName()));
+ QMessageBox::critical(
+ this, tr("Error"),
+ tr("Cannot read from file: %1").arg(QFileInfo(path).fileName()));
return;
}
@@ -448,10 +447,10 @@ void MainWindow::SlotFileVerify(const QString& path) {
if (!prossible_singleton_target && !data_file_info.exists()) {
bool ok;
QString const text = QInputDialog::getText(
- this, _("File to be Verified"),
- _("Please provide An ABSOLUTE Path \n"
- "If Data And Signature is COMBINED within a single file, "
- "KEEP THIS EMPTY: "),
+ this, tr("File to be Verified"),
+ tr("Please provide An ABSOLUTE Path \n"
+ "If Data And Signature is COMBINED within a single file, "
+ "KEEP THIS EMPTY: "),
QLineEdit::Normal, data_file_path, &ok);
if (!ok) return;
@@ -462,9 +461,9 @@ void MainWindow::SlotFileVerify(const QString& path) {
if (!data_file_info.isFile() ||
(!sign_file_path.isEmpty() && !QFileInfo(sign_file_path).isFile())) {
QMessageBox::critical(
- this, _("Error"),
- _("Please select the appropriate origin file or signature file. "
- "Ensure that both are in this directory."));
+ this, tr("Error"),
+ tr("Please select the appropriate origin file or signature file. "
+ "Ensure that both are in this directory."));
return;
}
@@ -472,7 +471,7 @@ void MainWindow::SlotFileVerify(const QString& path) {
GF_UI_LOG_DEBUG("verification signature file path: {}", sign_file_path);
CommonUtils::WaitForOpera(
- this, _("Verifying"), [=](const OperaWaitingHd& op_hd) {
+ this, tr("Verifying"), [=](const OperaWaitingHd& op_hd) {
GpgFileOpera::GetInstance().VerifyFile(
data_file_path, sign_file_path,
[=](GpgError err, const DataObjectPtr& data_obj) {
@@ -503,8 +502,8 @@ void MainWindow::SlotFileVerify(const QString& path) {
void MainWindow::SlotFileEncryptSign(const QString& path) {
auto check_result = TargetFilePreCheck(path, true);
if (!std::get<0>(check_result)) {
- QMessageBox::critical(this, _("Error"),
- QString(_("Cannot read from file: %1")).arg(path));
+ QMessageBox::critical(this, tr("Error"),
+ tr("Cannot read from file: %1").arg(path));
return;
}
@@ -514,8 +513,8 @@ void MainWindow::SlotFileEncryptSign(const QString& path) {
if (p_keys->empty()) {
QMessageBox::critical(
- this, _("No Key Checked"),
- _("Please check the key in the key toolbox on the right."));
+ this, tr("No Key Checked"),
+ tr("Please check the key in the key toolbox on the right."));
return;
}
@@ -525,9 +524,9 @@ void MainWindow::SlotFileEncryptSign(const QString& path) {
if (!key_can_encrypt) {
QMessageBox::critical(
- nullptr, _("Invalid KeyPair"),
- QString(_("The selected keypair cannot be used for encryption.")) +
- "<br/><br/>" + _("For example the Following Key:") + " <br/>" +
+ nullptr, tr("Invalid KeyPair"),
+ tr("The selected keypair cannot be used for encryption.") +
+ "<br/><br/>" + tr("For example the Following Key:") + " <br/>" +
key.GetUIDs()->front().GetUID());
return;
}
@@ -543,15 +542,15 @@ void MainWindow::SlotFileEncryptSign(const QString& path) {
check_result = TargetFilePreCheck(out_path, false);
if (!std::get<0>(check_result)) {
- QMessageBox::critical(this, _("Error"),
- QString(_("Cannot write to file: %1")).arg(out_path));
+ QMessageBox::critical(this, tr("Error"),
+ tr("Cannot write to file: %1").arg(out_path));
return;
}
if (QFile::exists(out_path)) {
auto ret = QMessageBox::warning(
- this, _("Warning"),
- _("The target file already exists, do you need to overwrite it?"),
+ this, tr("Warning"),
+ tr("The target file already exists, do you need to overwrite it?"),
QMessageBox::Ok | QMessageBox::Cancel);
if (ret == QMessageBox::Cancel) return;
@@ -569,7 +568,7 @@ void MainWindow::SlotFileEncryptSign(const QString& path) {
auto p_signer_keys = GpgKeyGetter::GetInstance().GetKeys(signer_key_ids);
CommonUtils::WaitForOpera(
- this, _("Encrypting and Signing"), [=](const OperaWaitingHd& op_hd) {
+ this, tr("Encrypting and Signing"), [=](const OperaWaitingHd& op_hd) {
GpgFileOpera::GetInstance().EncryptSignFile(
{p_keys->begin(), p_keys->end()},
{p_signer_keys->begin(), p_signer_keys->end()}, path,
@@ -604,8 +603,8 @@ void MainWindow::SlotFileEncryptSign(const QString& path) {
void MainWindow::SlotDirectoryEncryptSign(const QString& path) {
auto check_result = TargetFilePreCheck(path, true);
if (!std::get<0>(check_result)) {
- QMessageBox::critical(this, _("Error"),
- QString(_("Cannot read from file: %1")).arg(path));
+ QMessageBox::critical(this, tr("Error"),
+ tr("Cannot read from file: %1").arg(path));
return;
}
@@ -615,8 +614,8 @@ void MainWindow::SlotDirectoryEncryptSign(const QString& path) {
if (p_keys->empty()) {
QMessageBox::critical(
- this, _("No Key Checked"),
- _("Please check the key in the key toolbox on the right."));
+ this, tr("No Key Checked"),
+ tr("Please check the key in the key toolbox on the right."));
return;
}
@@ -626,9 +625,9 @@ void MainWindow::SlotDirectoryEncryptSign(const QString& path) {
if (!key_can_encrypt) {
QMessageBox::critical(
- nullptr, _("Invalid KeyPair"),
- QString(_("The selected keypair cannot be used for encryption.")) +
- "<br/><br/>" + _("For example the Following Key:") + " <br/>" +
+ nullptr, tr("Invalid KeyPair"),
+ tr("The selected keypair cannot be used for encryption.") +
+ "<br/><br/>" + tr("For example the Following Key:") + " <br/>" +
key.GetUIDs()->front().GetUID());
return;
}
@@ -644,15 +643,15 @@ void MainWindow::SlotDirectoryEncryptSign(const QString& path) {
check_result = TargetFilePreCheck(out_path, false);
if (!std::get<0>(check_result)) {
- QMessageBox::critical(this, _("Error"),
- QString(_("Cannot write to file: %1")).arg(out_path));
+ QMessageBox::critical(this, tr("Error"),
+ tr("Cannot write to file: %1").arg(out_path));
return;
}
if (QFile::exists(out_path)) {
auto ret = QMessageBox::warning(
- this, _("Warning"),
- _("The target file already exists, do you need to overwrite it?"),
+ this, tr("Warning"),
+ tr("The target file already exists, do you need to overwrite it?"),
QMessageBox::Ok | QMessageBox::Cancel);
if (ret == QMessageBox::Cancel) return;
@@ -670,7 +669,7 @@ void MainWindow::SlotDirectoryEncryptSign(const QString& path) {
auto p_signer_keys = GpgKeyGetter::GetInstance().GetKeys(signer_key_ids);
CommonUtils::WaitForOpera(
- this, _("Archiving & Encrypting & Signing"),
+ this, tr("Archiving & Encrypting & Signing"),
[=](const OperaWaitingHd& op_hd) {
GpgFileOpera::GetInstance().EncryptSignDirectory(
{p_keys->begin(), p_keys->end()},
@@ -706,8 +705,8 @@ void MainWindow::SlotDirectoryEncryptSign(const QString& path) {
void MainWindow::SlotFileDecryptVerify(const QString& path) {
auto check_result = TargetFilePreCheck(path, true);
if (!std::get<0>(check_result)) {
- QMessageBox::critical(this, _("Error"),
- QString(_("Cannot read from file: %1")).arg(path));
+ QMessageBox::critical(this, tr("Error"),
+ tr("Cannot read from file: %1").arg(path));
return;
}
@@ -715,24 +714,23 @@ void MainWindow::SlotFileDecryptVerify(const QString& path) {
check_result = TargetFilePreCheck(out_path, false);
if (!std::get<0>(check_result)) {
- QMessageBox::critical(this, _("Error"),
- QString(_("Cannot write to file: %1")).arg(out_path));
+ QMessageBox::critical(this, tr("Error"),
+ tr("Cannot write to file: %1").arg(out_path));
return;
}
if (QFile::exists(out_path)) {
- auto ret =
- QMessageBox::warning(this, _("Warning"),
- QString(_("The output file %1 already exists, do "
- "you need to overwrite it?"))
- .arg(out_path),
- QMessageBox::Ok | QMessageBox::Cancel);
+ auto ret = QMessageBox::warning(this, tr("Warning"),
+ tr("The output file %1 already exists, do "
+ "you need to overwrite it?")
+ .arg(out_path),
+ QMessageBox::Ok | QMessageBox::Cancel);
if (ret == QMessageBox::Cancel) return;
}
CommonUtils::WaitForOpera(
- this, _("Decrypting and Verifying"), [=](const OperaWaitingHd& op_hd) {
+ this, tr("Decrypting and Verifying"), [=](const OperaWaitingHd& op_hd) {
GpgFileOpera::GetInstance().DecryptVerifyFile(
path, out_path, [=](GpgError err, const DataObjectPtr& data_obj) {
// stop waiting
@@ -771,8 +769,8 @@ void MainWindow::SlotFileDecryptVerify(const QString& path) {
void MainWindow::SlotArchiveDecryptVerify(const QString& path) {
auto check_result = TargetFilePreCheck(path, true);
if (!std::get<0>(check_result)) {
- QMessageBox::critical(this, _("Error"),
- QString(_("Cannot read from file: %1")).arg(path));
+ QMessageBox::critical(this, tr("Error"),
+ tr("Cannot read from file: %1").arg(path));
return;
}
@@ -781,24 +779,23 @@ void MainWindow::SlotArchiveDecryptVerify(const QString& path) {
check_result = TargetFilePreCheck(out_path, false);
if (!std::get<0>(check_result)) {
- QMessageBox::critical(this, _("Error"),
- QString(_("Cannot write to file: %1")).arg(out_path));
+ QMessageBox::critical(this, tr("Error"),
+ tr("Cannot write to file: %1").arg(out_path));
return;
}
if (QFile::exists(out_path)) {
- auto ret =
- QMessageBox::warning(this, _("Warning"),
- QString(_("The output file %1 already exists, do "
- "you need to overwrite it?"))
- .arg(out_path),
- QMessageBox::Ok | QMessageBox::Cancel);
+ auto ret = QMessageBox::warning(this, tr("Warning"),
+ tr("The output file %1 already exists, do "
+ "you need to overwrite it?")
+ .arg(out_path),
+ QMessageBox::Ok | QMessageBox::Cancel);
if (ret == QMessageBox::Cancel) return;
}
CommonUtils::WaitForOpera(
- this, _("Decrypting & Verifying & Extracting"),
+ this, tr("Decrypting & Verifying & Extracting"),
[=](const OperaWaitingHd& op_hd) {
GpgFileOpera::GetInstance().DecryptVerifyArchive(
path, out_path, [=](GpgError err, const DataObjectPtr& data_obj) {
diff --git a/src/ui/main_window/MainWindowGpgOperaFunction.cpp b/src/ui/main_window/MainWindowGpgOperaFunction.cpp
index cf7e2d68..c9e09bf2 100644
--- a/src/ui/main_window/MainWindowGpgOperaFunction.cpp
+++ b/src/ui/main_window/MainWindowGpgOperaFunction.cpp
@@ -35,7 +35,6 @@
#include "core/function/result_analyse/GpgVerifyResultAnalyse.h"
#include "core/model/DataObject.h"
#include "core/model/GpgEncryptResult.h"
-#include "core/utils/CommonUtils.h"
#include "core/utils/GpgUtils.h"
#include "ui/UserInterfaceUtils.h"
#include "ui/dialog/SignersPicker.h"
@@ -50,16 +49,16 @@ void MainWindow::SlotEncrypt() {
if (key_ids->empty()) {
// Symmetric Encrypt
auto ret = QMessageBox::information(
- this, _("Symmetric Encryption"),
- _("No Key Checked. Do you want to encrypt with a "
- "symmetric cipher using a passphrase?"),
+ this, tr("Symmetric Encryption"),
+ tr("No Key Checked. Do you want to encrypt with a "
+ "symmetric cipher using a passphrase?"),
QMessageBox::Ok | QMessageBox::Cancel);
if (ret == QMessageBox::Cancel) return;
auto buffer = GFBuffer(edit_->CurTextPage()->GetTextPage()->toPlainText());
CommonUtils::WaitForOpera(
- this, _("Symmetrically Encrypting"),
+ this, tr("Symmetrically Encrypting"),
[this, buffer](const OperaWaitingHd& op_hd) {
GpgFrontend::GpgBasicOperator::GetInstance().EncryptSymmetric(
buffer, true,
@@ -93,11 +92,10 @@ void MainWindow::SlotEncrypt() {
for (const auto& key : *keys) {
if (!key.IsHasActualEncryptionCapability()) {
QMessageBox::information(
- this, _("Invalid Operation"),
- QString(
- _("The selected key contains a key that does not actually have a "
- "encrypt usage.")) +
- "<br/><br/>" + _("For example the Following Key:") + " <br/>" +
+ this, tr("Invalid Operation"),
+ tr("The selected key contains a key that does not actually have a "
+ "encrypt usage.") +
+ "<br/><br/>" + tr("For example the Following Key:") + " <br/>" +
key.GetUIDs()->front().GetUID());
return;
}
@@ -105,7 +103,8 @@ void MainWindow::SlotEncrypt() {
auto buffer = GFBuffer(edit_->CurTextPage()->GetTextPage()->toPlainText());
CommonUtils::WaitForOpera(
- this, _("Encrypting"), [this, keys, buffer](const OperaWaitingHd& op_hd) {
+ this, tr("Encrypting"),
+ [this, keys, buffer](const OperaWaitingHd& op_hd) {
GpgFrontend::GpgBasicOperator::GetInstance().Encrypt(
{keys->begin(), keys->end()}, buffer, true,
[this, op_hd](GpgError err, const DataObjectPtr& data_obj) {
@@ -138,8 +137,8 @@ void MainWindow::SlotSign() {
auto key_ids = m_key_list_->GetPrivateChecked();
if (key_ids->empty()) {
QMessageBox::critical(
- this, _("No Key Checked"),
- _("Please check the key in the key toolbox on the right."));
+ this, tr("No Key Checked"),
+ tr("Please check the key in the key toolbox on the right."));
return;
}
@@ -147,11 +146,10 @@ void MainWindow::SlotSign() {
for (const auto& key : *keys) {
if (!key.IsHasActualSigningCapability()) {
QMessageBox::information(
- this, _("Invalid Operation"),
- QString(
- _("The selected key contains a key that does not actually have a "
- "signature usage.")) +
- "<br/><br/>" + _("For example the Following Key:") + "<br/>" +
+ this, tr("Invalid Operation"),
+ tr("The selected key contains a key that does not actually have a "
+ "signature usage.") +
+ "<br/><br/>" + tr("For example the Following Key:") + "<br/>" +
key.GetUIDs()->front().GetUID());
return;
}
@@ -160,7 +158,7 @@ void MainWindow::SlotSign() {
// set input buffer
auto buffer = GFBuffer(edit_->CurTextPage()->GetTextPage()->toPlainText());
CommonUtils::WaitForOpera(
- this, _("Signing"), [this, keys, buffer](const OperaWaitingHd& hd) {
+ this, tr("Signing"), [this, keys, buffer](const OperaWaitingHd& hd) {
GpgFrontend::GpgBasicOperator::GetInstance().Sign(
{keys->begin(), keys->end()}, buffer, GPGME_SIG_MODE_CLEAR, true,
[this, hd](GpgError err, const DataObjectPtr& data_obj) {
@@ -192,7 +190,7 @@ void MainWindow::SlotDecrypt() {
auto buffer = GFBuffer(edit_->CurTextPage()->GetTextPage()->toPlainText());
CommonUtils::WaitForOpera(
- this, _("Decrypting"), [this, buffer](const OperaWaitingHd& hd) {
+ this, tr("Decrypting"), [this, buffer](const OperaWaitingHd& hd) {
GpgFrontend::GpgBasicOperator::GetInstance().Decrypt(
buffer, [this, hd](GpgError err, const DataObjectPtr& data_obj) {
// stop waiting
@@ -225,7 +223,7 @@ void MainWindow::SlotVerify() {
auto buffer = GFBuffer(edit_->CurTextPage()->GetTextPage()->toPlainText());
CommonUtils::WaitForOpera(
- this, _("Verifying"), [this, buffer](const OperaWaitingHd& hd) {
+ this, tr("Verifying"), [this, buffer](const OperaWaitingHd& hd) {
GpgFrontend::GpgBasicOperator::GetInstance().Verify(
buffer, GFBuffer(),
[this, hd](GpgError err, const DataObjectPtr& data_obj) {
@@ -252,8 +250,8 @@ void MainWindow::SlotEncryptSign() {
if (key_ids->empty()) {
QMessageBox::critical(
- this, _("No Key Checked"),
- _("Please check some key in the key toolbox on the right."));
+ this, tr("No Key Checked"),
+ tr("Please check some key in the key toolbox on the right."));
return;
}
@@ -264,9 +262,9 @@ void MainWindow::SlotEncryptSign() {
if (!key_can_encrypt) {
QMessageBox::critical(
- this, _("Invalid KeyPair"),
- QString(_("The selected keypair cannot be used for encryption.")) +
- "<br/><br/>" + _("For example the Following Key:") + " <br/>" +
+ this, tr("Invalid KeyPair"),
+ tr("The selected keypair cannot be used for encryption.") +
+ "<br/><br/>" + tr("For example the Following Key:") + " <br/>" +
key.GetUIDs()->front().GetUID());
return;
}
@@ -295,7 +293,7 @@ void MainWindow::SlotEncryptSign() {
auto buffer = GFBuffer(edit_->CurTextPage()->GetTextPage()->toPlainText());
CommonUtils::WaitForOpera(
- this, _("Encrypting and Signing"),
+ this, tr("Encrypting and Signing"),
[this, keys, signer_keys, buffer](const OperaWaitingHd& hd) {
GpgFrontend::GpgBasicOperator::GetInstance().EncryptSign(
{keys->begin(), keys->end()},
@@ -341,7 +339,7 @@ void MainWindow::SlotDecryptVerify() {
auto buffer = GFBuffer(edit_->CurTextPage()->GetTextPage()->toPlainText());
CommonUtils::WaitForOpera(
- this, _("Decrypting and Verifying"),
+ this, tr("Decrypting and Verifying"),
[this, buffer](const OperaWaitingHd& hd) {
GpgFrontend::GpgBasicOperator::GetInstance().DecryptVerify(
buffer, [this, hd](GpgError err, const DataObjectPtr& data_obj) {
diff --git a/src/ui/main_window/MainWindowSlotFunction.cpp b/src/ui/main_window/MainWindowSlotFunction.cpp
index 37f49b0d..fe9aa0df 100644
--- a/src/ui/main_window/MainWindowSlotFunction.cpp
+++ b/src/ui/main_window/MainWindowSlotFunction.cpp
@@ -93,12 +93,12 @@ void MainWindow::slot_append_keys_create_datetime() {
auto key = GpgKeyGetter::GetInstance().GetKey(key_ids->front());
if (!key.IsGood()) {
- QMessageBox::critical(this, _("Error"), _("Key Not Found."));
+ QMessageBox::critical(this, tr("Error"), tr("Key Not Found."));
return;
}
auto create_datetime_format_str_local =
- QLocale::system().toString(key.GetCreateTime()) + _(" (Local Time) ") +
+ QLocale::system().toString(key.GetCreateTime()) + tr(" (Local Time) ") +
"\n";
edit_->SlotAppendText2CurTextPage(create_datetime_format_str_local);
}
@@ -113,7 +113,7 @@ void MainWindow::slot_append_keys_expire_datetime() {
auto key = GpgKeyGetter::GetInstance().GetKey(key_ids->front());
if (!key.IsGood()) {
- QMessageBox::critical(this, _("Error"), _("Key Not Found."));
+ QMessageBox::critical(this, tr("Error"), tr("Key Not Found."));
return;
}
@@ -129,7 +129,7 @@ void MainWindow::slot_append_keys_fingerprint() {
auto key = GpgKeyGetter::GetInstance().GetKey(key_ids->front());
if (!key.IsGood()) {
- QMessageBox::critical(this, _("Error"), _("Key Not Found."));
+ QMessageBox::critical(this, tr("Error"), tr("Key Not Found."));
return;
}
@@ -145,7 +145,7 @@ void MainWindow::slot_copy_mail_address_to_clipboard() {
auto key = GpgKeyGetter::GetInstance().GetKey(key_ids->front());
if (!key.IsGood()) {
- QMessageBox::critical(this, _("Error"), _("Key Not Found."));
+ QMessageBox::critical(this, tr("Error"), tr("Key Not Found."));
return;
}
QClipboard* cb = QApplication::clipboard();
@@ -158,7 +158,7 @@ void MainWindow::slot_copy_default_uid_to_clipboard() {
auto key = GpgKeyGetter::GetInstance().GetKey(key_ids->front());
if (!key.IsGood()) {
- QMessageBox::critical(this, _("Error"), _("Key Not Found."));
+ QMessageBox::critical(this, tr("Error"), tr("Key Not Found."));
return;
}
QClipboard* cb = QApplication::clipboard();
@@ -171,7 +171,7 @@ void MainWindow::slot_copy_key_id_to_clipboard() {
auto key = GpgKeyGetter::GetInstance().GetKey(key_ids->front());
if (!key.IsGood()) {
- QMessageBox::critical(this, _("Error"), _("Key Not Found."));
+ QMessageBox::critical(this, tr("Error"), tr("Key Not Found."));
return;
}
QClipboard* cb = QApplication::clipboard();
@@ -186,7 +186,7 @@ void MainWindow::slot_show_key_details() {
if (key.IsGood()) {
new KeyDetailsDialog(key, this);
} else {
- QMessageBox::critical(this, _("Error"), _("Key Not Found."));
+ QMessageBox::critical(this, tr("Error"), tr("Key Not Found."));
}
}
@@ -238,17 +238,18 @@ void MainWindow::upload_key_to_server() {
void MainWindow::SlotOpenFile(const QString& path) {
QFileInfo const info(path);
if (!info.isFile() || !info.isReadable()) {
- QMessageBox::critical(this, _("Error"),
- _("Cannot open this file. Please make sure that this "
- "is a regular file and it's readable."));
+ QMessageBox::critical(
+ this, tr("Error"),
+ tr("Cannot open this file. Please make sure that this "
+ "is a regular file and it's readable."));
return;
}
if (info.size() > static_cast<qint64>(1024 * 1024)) {
QMessageBox::critical(
- this, _("Error"),
- _("Cannot open this file. The file is TOO LARGE (>1MB) for "
- "GpgFrontend Text Editor."));
+ this, tr("Error"),
+ tr("Cannot open this file. The file is TOO LARGE (>1MB) for "
+ "GpgFrontend Text Editor."));
return;
}
@@ -286,16 +287,14 @@ void MainWindow::slot_version_upgrade_nofity() {
"version.latest_version", QString{});
GF_UI_LOG_DEBUG(
- "got version info from rt, need upgrade: {}, with drawn: {}, current "
- "version "
- "released: {}",
+ "got version info from rt, need upgrade: {}, with drawn: {}, "
+ "current version released: {}",
is_need_upgrade, is_current_a_withdrawn_version,
is_current_version_released);
if (is_need_upgrade) {
statusBar()->showMessage(
- QString(_("GpgFrontend Upgradeable (New Version: %1)."))
- .arg(latest_version),
+ tr("GpgFrontend Upgradeable (New Version: %1).").arg(latest_version),
30000);
auto* update_button = new QPushButton("Update GpgFrontend", this);
connect(update_button, &QPushButton::clicked, [=]() {
@@ -305,20 +304,19 @@ void MainWindow::slot_version_upgrade_nofity() {
statusBar()->addPermanentWidget(update_button, 0);
} else if (is_current_a_withdrawn_version) {
QMessageBox::warning(
- this, _("Withdrawn Version"),
- QString(
- _("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."))
+ this, tr("Withdrawn Version"),
+
+ tr("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.")
.arg(latest_version) +
"<br/>" +
- QString(_("You can download the latest stable version(%1) on "
- "Github Releases "
- "Page.<br/>"))
+ tr("You can download the latest stable version(%1) on "
+ "Github Releases Page.<br/>")
.arg(latest_version));
} else if (!is_current_version_released) {
statusBar()->showMessage(
- QString(_("This maybe a BETA Version (Latest Stable Version: %1)."))
+ tr("This maybe a BETA Version (Latest Stable Version: %1).")
.arg(latest_version),
30000);
}
diff --git a/src/ui/main_window/MainWindowUI.cpp b/src/ui/main_window/MainWindowUI.cpp
index 3bc2ba23..f62f6d9f 100644
--- a/src/ui/main_window/MainWindowUI.cpp
+++ b/src/ui/main_window/MainWindowUI.cpp
@@ -42,127 +42,127 @@ namespace GpgFrontend::UI {
void MainWindow::create_actions() {
/* Main Menu
*/
- new_tab_act_ = new QAction(_("New"), this);
- new_tab_act_->setIcon(QIcon(":misc_doc.png"));
+ new_tab_act_ = new QAction(tr("New"), this);
+ new_tab_act_->setIcon(QIcon(":/icons/misc_doc.png"));
QList<QKeySequence> new_tab_act_shortcut_list;
new_tab_act_shortcut_list.append(QKeySequence(Qt::CTRL | Qt::Key_N));
new_tab_act_shortcut_list.append(QKeySequence(Qt::CTRL | Qt::Key_T));
new_tab_act_->setShortcuts(new_tab_act_shortcut_list);
- new_tab_act_->setToolTip(_("Open a new file"));
+ new_tab_act_->setToolTip(tr("Open a new file"));
connect(new_tab_act_, &QAction::triggered, edit_, &TextEdit::SlotNewTab);
- open_act_ = new QAction(_("Open..."), this);
- open_act_->setIcon(QIcon(":fileopen.png"));
+ open_act_ = new QAction(tr("Open..."), this);
+ open_act_->setIcon(QIcon(":/icons/fileopen.png"));
open_act_->setShortcut(QKeySequence::Open);
- open_act_->setToolTip(_("Open an existing file"));
+ open_act_->setToolTip(tr("Open an existing file"));
connect(open_act_, &QAction::triggered, edit_, &TextEdit::SlotOpen);
- browser_act_ = new QAction(_("File Browser"), this);
- browser_act_->setIcon(QIcon(":file-browser.png"));
+ browser_act_ = new QAction(tr("File Browser"), this);
+ browser_act_->setIcon(QIcon(":/icons/file-browser.png"));
browser_act_->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_B));
- browser_act_->setToolTip(_("Open a file browser"));
+ browser_act_->setToolTip(tr("Open a file browser"));
connect(browser_act_, &QAction::triggered, this,
&MainWindow::slot_open_file_tab);
- save_act_ = new QAction(_("Save File"), this);
- save_act_->setIcon(QIcon(":filesave.png"));
+ save_act_ = new QAction(tr("Save File"), this);
+ save_act_->setIcon(QIcon(":/icons/filesave.png"));
save_act_->setShortcut(QKeySequence::Save);
- save_act_->setToolTip(_("Save the current File"));
+ save_act_->setToolTip(tr("Save the current File"));
connect(save_act_, &QAction::triggered, edit_, &TextEdit::SlotSave);
- save_as_act_ = new QAction(QString(_("Save As")) + "...", this);
- save_as_act_->setIcon(QIcon(":filesaveas.png"));
+ save_as_act_ = new QAction(tr("Save As") + "...", this);
+ save_as_act_->setIcon(QIcon(":/icons/filesaveas.png"));
save_as_act_->setShortcut(QKeySequence::SaveAs);
- save_as_act_->setToolTip(_("Save the current File as..."));
+ save_as_act_->setToolTip(tr("Save the current File as..."));
connect(save_as_act_, &QAction::triggered, edit_, &TextEdit::SlotSaveAs);
- print_act_ = new QAction(_("Print"), this);
- print_act_->setIcon(QIcon(":fileprint.png"));
+ print_act_ = new QAction(tr("Print"), this);
+ print_act_->setIcon(QIcon(":/icons/fileprint.png"));
print_act_->setShortcut(QKeySequence::Print);
- print_act_->setToolTip(_("Print Document"));
+ print_act_->setToolTip(tr("Print Document"));
connect(print_act_, &QAction::triggered, edit_, &TextEdit::SlotPrint);
- close_tab_act_ = new QAction(_("Close"), this);
+ close_tab_act_ = new QAction(tr("Close"), this);
close_tab_act_->setShortcut(QKeySequence::Close);
- close_tab_act_->setToolTip(_("Close file"));
+ close_tab_act_->setToolTip(tr("Close file"));
connect(close_tab_act_, &QAction::triggered, edit_, &TextEdit::SlotCloseTab);
- quit_act_ = new QAction(_("Quit"), this);
+ quit_act_ = new QAction(tr("Quit"), this);
quit_act_->setShortcut(QKeySequence::Quit);
- quit_act_->setIcon(QIcon(":exit.png"));
- quit_act_->setToolTip(_("Quit Program"));
+ quit_act_->setIcon(QIcon(":/icons/exit.png"));
+ quit_act_->setToolTip(tr("Quit Program"));
connect(quit_act_, &QAction::triggered, this, &MainWindow::close);
/* Edit Menu
*/
- undo_act_ = new QAction(_("Undo"), this);
+ undo_act_ = new QAction(tr("Undo"), this);
undo_act_->setShortcut(QKeySequence::Undo);
- undo_act_->setToolTip(_("Undo Last Edit Action"));
+ undo_act_->setToolTip(tr("Undo Last Edit Action"));
connect(undo_act_, &QAction::triggered, edit_, &TextEdit::SlotUndo);
- redo_act_ = new QAction(_("Redo"), this);
+ redo_act_ = new QAction(tr("Redo"), this);
redo_act_->setShortcut(QKeySequence::Redo);
- redo_act_->setToolTip(_("Redo Last Edit Action"));
+ redo_act_->setToolTip(tr("Redo Last Edit Action"));
connect(redo_act_, &QAction::triggered, edit_, &TextEdit::SlotRedo);
- zoom_in_act_ = new QAction(_("Zoom In"), this);
+ zoom_in_act_ = new QAction(tr("Zoom In"), this);
zoom_in_act_->setShortcut(QKeySequence::ZoomIn);
connect(zoom_in_act_, &QAction::triggered, edit_, &TextEdit::SlotZoomIn);
- zoom_out_act_ = new QAction(_("Zoom Out"), this);
+ zoom_out_act_ = new QAction(tr("Zoom Out"), this);
zoom_out_act_->setShortcut(QKeySequence::ZoomOut);
connect(zoom_out_act_, &QAction::triggered, edit_, &TextEdit::SlotZoomOut);
- paste_act_ = new QAction(_("Paste"), this);
- paste_act_->setIcon(QIcon(":button_paste.png"));
+ paste_act_ = new QAction(tr("Paste"), this);
+ paste_act_->setIcon(QIcon(":/icons/button_paste.png"));
paste_act_->setShortcut(QKeySequence::Paste);
- paste_act_->setToolTip(_("Paste Text From Clipboard"));
+ paste_act_->setToolTip(tr("Paste Text From Clipboard"));
connect(paste_act_, &QAction::triggered, edit_, &TextEdit::SlotPaste);
- cut_act_ = new QAction(_("Cut"), this);
- cut_act_->setIcon(QIcon(":button_cut.png"));
+ cut_act_ = new QAction(tr("Cut"), this);
+ cut_act_->setIcon(QIcon(":/icons/button_cut.png"));
cut_act_->setShortcut(QKeySequence::Cut);
cut_act_->setToolTip(
- _("Cut the current selection's contents to the "
- "clipboard"));
+ tr("Cut the current selection's contents to the "
+ "clipboard"));
connect(cut_act_, &QAction::triggered, edit_, &TextEdit::SlotCut);
- copy_act_ = new QAction(_("Copy"), this);
- copy_act_->setIcon(QIcon(":button_copy.png"));
+ copy_act_ = new QAction(tr("Copy"), this);
+ copy_act_->setIcon(QIcon(":/icons/button_copy.png"));
copy_act_->setShortcut(QKeySequence::Copy);
copy_act_->setToolTip(
- _("Copy the current selection's contents to the "
- "clipboard"));
+ tr("Copy the current selection's contents to the "
+ "clipboard"));
connect(copy_act_, &QAction::triggered, edit_, &TextEdit::SlotCopy);
- quote_act_ = new QAction(_("Quote"), this);
- quote_act_->setIcon(QIcon(":quote.png"));
- quote_act_->setToolTip(_("Quote whole text"));
+ quote_act_ = new QAction(tr("Quote"), this);
+ quote_act_->setIcon(QIcon(":/icons/quote.png"));
+ quote_act_->setToolTip(tr("Quote whole text"));
connect(quote_act_, &QAction::triggered, edit_, &TextEdit::SlotQuote);
- select_all_act_ = new QAction(_("Select All"), this);
- select_all_act_->setIcon(QIcon(":edit.png"));
+ select_all_act_ = new QAction(tr("Select All"), this);
+ select_all_act_->setIcon(QIcon(":/icons/edit.png"));
select_all_act_->setShortcut(QKeySequence::SelectAll);
- select_all_act_->setToolTip(_("Select the whole text"));
+ select_all_act_->setToolTip(tr("Select the whole text"));
connect(select_all_act_, &QAction::triggered, edit_,
&TextEdit::SlotSelectAll);
- find_act_ = new QAction(_("Find"), this);
+ find_act_ = new QAction(tr("Find"), this);
find_act_->setShortcut(QKeySequence::Find);
- find_act_->setToolTip(_("Find a word"));
+ find_act_->setToolTip(tr("Find a word"));
connect(find_act_, &QAction::triggered, this, &MainWindow::slot_find);
- clean_double_line_breaks_act_ = new QAction(_("Remove spacing"), this);
+ clean_double_line_breaks_act_ = new QAction(tr("Remove spacing"), this);
clean_double_line_breaks_act_->setIcon(
- QIcon(":format-line-spacing-triple.png"));
+ QIcon(":/icons/format-line-spacing-triple.png"));
// cleanDoubleLineBreaksAct->setShortcut(QKeySequence::SelectAll);
clean_double_line_breaks_act_->setToolTip(
- _("Remove double linebreaks, e.g. in pasted text from Web Mailer"));
+ tr("Remove double linebreaks, e.g. in pasted text from Web Mailer"));
connect(clean_double_line_breaks_act_, &QAction::triggered, this,
&MainWindow::slot_clean_double_line_breaks);
- open_settings_act_ = new QAction(_("Settings"), this);
- open_settings_act_->setToolTip(_("Open settings dialog"));
+ open_settings_act_ = new QAction(tr("Settings"), this);
+ open_settings_act_->setToolTip(tr("Open settings dialog"));
open_settings_act_->setMenuRole(QAction::PreferencesRole);
open_settings_act_->setShortcut(QKeySequence::Preferences);
connect(open_settings_act_, &QAction::triggered, this,
@@ -170,11 +170,11 @@ void MainWindow::create_actions() {
/* Crypt Menu
*/
- encrypt_act_ = new QAction(_("Encrypt"), this);
- encrypt_act_->setIcon(QIcon(":encrypted.png"));
+ encrypt_act_ = new QAction(tr("Encrypt"), this);
+ encrypt_act_->setIcon(QIcon(":/icons/encrypted.png"));
encrypt_act_->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_E));
- encrypt_act_->setToolTip(_("Encrypt Message"));
+ encrypt_act_->setToolTip(tr("Encrypt Message"));
connect(encrypt_act_, &QAction::triggered, this, [this]() {
if (edit_->SlotCurPageFileTreeView() != nullptr) {
const auto* file_tree_view = edit_->SlotCurPageFileTreeView();
@@ -192,12 +192,12 @@ void MainWindow::create_actions() {
}
});
- encrypt_sign_act_ = new QAction(_("Encrypt Sign"), this);
- encrypt_sign_act_->setIcon(QIcon(":encrypted_signed.png"));
+ encrypt_sign_act_ = new QAction(tr("Encrypt Sign"), this);
+ encrypt_sign_act_->setIcon(QIcon(":/icons/encrypted_signed.png"));
encrypt_sign_act_->setShortcut(
QKeySequence(Qt::CTRL | Qt::SHIFT | Qt::Key_E));
- encrypt_sign_act_->setToolTip(_("Encrypt and Sign Message"));
+ encrypt_sign_act_->setToolTip(tr("Encrypt and Sign Message"));
connect(encrypt_sign_act_, &QAction::triggered, this, [this]() {
if (edit_->SlotCurPageFileTreeView() != nullptr) {
const auto* file_tree_view = edit_->SlotCurPageFileTreeView();
@@ -215,10 +215,10 @@ void MainWindow::create_actions() {
}
});
- decrypt_act_ = new QAction(_("Decrypt"), this);
- decrypt_act_->setIcon(QIcon(":decrypted.png"));
+ decrypt_act_ = new QAction(tr("Decrypt"), this);
+ decrypt_act_->setIcon(QIcon(":/icons/decrypted.png"));
decrypt_act_->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_D));
- decrypt_act_->setToolTip(_("Decrypt Message"));
+ decrypt_act_->setToolTip(tr("Decrypt Message"));
connect(decrypt_act_, &QAction::triggered, this, [this]() {
if (edit_->SlotCurPageFileTreeView() != nullptr) {
const auto* file_tree_view = edit_->SlotCurPageFileTreeView();
@@ -240,11 +240,11 @@ void MainWindow::create_actions() {
}
});
- decrypt_verify_act_ = new QAction(_("Decrypt Verify"), this);
- decrypt_verify_act_->setIcon(QIcon(":decrypted_verified.png"));
+ decrypt_verify_act_ = new QAction(tr("Decrypt Verify"), this);
+ decrypt_verify_act_->setIcon(QIcon(":/icons/decrypted_verified.png"));
decrypt_verify_act_->setShortcut(
QKeySequence(Qt::CTRL | Qt::SHIFT | Qt::Key_D));
- decrypt_verify_act_->setToolTip(_("Decrypt and Verify Message"));
+ decrypt_verify_act_->setToolTip(tr("Decrypt and Verify Message"));
connect(decrypt_verify_act_, &QAction::triggered, this, [this]() {
if (edit_->SlotCurPageFileTreeView() != nullptr) {
const auto* file_tree_view = edit_->SlotCurPageFileTreeView();
@@ -266,10 +266,10 @@ void MainWindow::create_actions() {
}
});
- sign_act_ = new QAction(_("Sign"), this);
- sign_act_->setIcon(QIcon(":signature.png"));
+ sign_act_ = new QAction(tr("Sign"), this);
+ sign_act_->setIcon(QIcon(":/icons/signature.png"));
sign_act_->setShortcut(QKeySequence(Qt::CTRL | Qt::SHIFT | Qt::Key_I));
- sign_act_->setToolTip(_("Sign Message"));
+ sign_act_->setToolTip(tr("Sign Message"));
connect(sign_act_, &QAction::triggered, this, [this]() {
if (edit_->SlotCurPageFileTreeView() != nullptr) {
const auto* file_tree_view = edit_->SlotCurPageFileTreeView();
@@ -281,10 +281,10 @@ void MainWindow::create_actions() {
if (edit_->SlotCurPageTextEdit() != nullptr) this->SlotSign();
});
- verify_act_ = new QAction(_("Verify"), this);
- verify_act_->setIcon(QIcon(":verify.png"));
+ verify_act_ = new QAction(tr("Verify"), this);
+ verify_act_->setIcon(QIcon(":/icons/verify.png"));
verify_act_->setShortcut(QKeySequence(Qt::CTRL | Qt::SHIFT | Qt::Key_V));
- verify_act_->setToolTip(_("Verify Message"));
+ verify_act_->setToolTip(tr("Verify Message"));
connect(verify_act_, &QAction::triggered, this, [this]() {
if (edit_->SlotCurPageFileTreeView() != nullptr) {
const auto* file_tree_view = edit_->SlotCurPageFileTreeView();
@@ -299,17 +299,17 @@ void MainWindow::create_actions() {
/* Key Menu
*/
- import_key_from_file_act_ = new QAction(_("File"), this);
- import_key_from_file_act_->setIcon(QIcon(":import_key_from_file.png"));
- import_key_from_file_act_->setToolTip(_("Import New Key From File"));
+ import_key_from_file_act_ = new QAction(tr("File"), this);
+ import_key_from_file_act_->setIcon(QIcon(":/icons/import_key_from_file.png"));
+ import_key_from_file_act_->setToolTip(tr("Import New Key From File"));
connect(import_key_from_file_act_, &QAction::triggered, this,
[&]() { CommonUtils::GetInstance()->SlotImportKeyFromFile(this); });
- import_key_from_clipboard_act_ = new QAction(_("Clipboard"), this);
+ import_key_from_clipboard_act_ = new QAction(tr("Clipboard"), this);
import_key_from_clipboard_act_->setIcon(
- QIcon(":import_key_from_clipboard.png"));
+ QIcon(":/icons/import_key_from_clipboard.png"));
import_key_from_clipboard_act_->setToolTip(
- _("Import New Key From Clipboard"));
+ tr("Import New Key From Clipboard"));
connect(import_key_from_clipboard_act_, &QAction::triggered, this, [&]() {
CommonUtils::GetInstance()->SlotImportKeyFromClipboard(this);
});
@@ -320,59 +320,60 @@ void MainWindow::create_actions() {
.value("network/forbid_all_gnupg_connection", false)
.toBool();
- import_key_from_key_server_act_ = new QAction(_("Keyserver"), this);
+ import_key_from_key_server_act_ = new QAction(tr("Keyserver"), this);
import_key_from_key_server_act_->setIcon(
- QIcon(":import_key_from_server.png"));
+ QIcon(":/icons/import_key_from_server.png"));
import_key_from_key_server_act_->setToolTip(
- _("Import New Key From Keyserver"));
+ tr("Import New Key From Keyserver"));
import_key_from_key_server_act_->setDisabled(forbid_all_gnupg_connection);
connect(import_key_from_key_server_act_, &QAction::triggered, this, [&]() {
CommonUtils::GetInstance()->SlotImportKeyFromKeyServer(this);
});
- import_key_from_edit_act_ = new QAction(_("Editor"), this);
- import_key_from_edit_act_->setIcon(QIcon(":txt.png"));
- import_key_from_edit_act_->setToolTip(_("Import New Key From Editor"));
+ import_key_from_edit_act_ = new QAction(tr("Editor"), this);
+ import_key_from_edit_act_->setIcon(QIcon(":/icons/txt.png"));
+ import_key_from_edit_act_->setToolTip(tr("Import New Key From Editor"));
connect(import_key_from_edit_act_, &QAction::triggered, this,
&MainWindow::slot_import_key_from_edit);
- open_key_management_act_ = new QAction(_("Manage Keys"), this);
- open_key_management_act_->setIcon(QIcon(":keymgmt.png"));
- open_key_management_act_->setToolTip(_("Open Key Management"));
+ open_key_management_act_ = new QAction(tr("Manage Keys"), this);
+ open_key_management_act_->setIcon(QIcon(":/icons/keymgmt.png"));
+ open_key_management_act_->setToolTip(tr("Open Key Management"));
connect(open_key_management_act_, &QAction::triggered, this,
&MainWindow::slot_open_key_management);
- clean_gpg_password_cache_act_ = new QAction(_("Clear Password Cache"), this);
- clean_gpg_password_cache_act_->setIcon(QIcon(":configure.png"));
- clean_gpg_password_cache_act_->setToolTip(_("Clear Password Cache of GnuPG"));
+ 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_->setToolTip(
+ tr("Clear Password Cache of GnuPG"));
connect(clean_gpg_password_cache_act_, &QAction::triggered, this, [=]() {
if (GpgFrontend::GpgAdvancedOperator::ClearGpgPasswordCache()) {
- QMessageBox::information(this, _("Successful Operation"),
- _("Clear password cache successfully"));
+ QMessageBox::information(this, tr("Successful Operation"),
+ tr("Clear password cache successfully"));
} else {
- QMessageBox::critical(this, _("Failed Operation"),
- _("Failed to clear password cache of GnuPG"));
+ QMessageBox::critical(this, tr("Failed Operation"),
+ tr("Failed to clear password cache of GnuPG"));
}
});
- reload_components_act_ = new QAction(_("Reload All Components"), this);
- reload_components_act_->setIcon(QIcon(":configure.png"));
- reload_components_act_->setToolTip(_("Reload All GnuPG's Components"));
+ reload_components_act_ = new QAction(tr("Reload All Components"), this);
+ reload_components_act_->setIcon(QIcon(":/icons/configure.png"));
+ reload_components_act_->setToolTip(tr("Reload All GnuPG's Components"));
connect(reload_components_act_, &QAction::triggered, this, [=]() {
if (GpgFrontend::GpgAdvancedOperator::ReloadGpgComponents()) {
QMessageBox::information(
- this, _("Successful Operation"),
- _("Reload all the GnuPG's components successfully"));
+ this, tr("Successful Operation"),
+ tr("Reload all the GnuPG's components successfully"));
} else {
QMessageBox::critical(
- this, _("Failed Operation"),
- _("Failed to reload all or one of the GnuPG's component(s)"));
+ this, tr("Failed Operation"),
+ tr("Failed to reload all or one of the GnuPG's component(s)"));
}
});
- restart_components_act_ = new QAction(_("Restart All Components"), this);
- restart_components_act_->setIcon(QIcon(":configure.png"));
- restart_components_act_->setToolTip(_("Restart All GnuPG's Components"));
+ restart_components_act_ = new QAction(tr("Restart All Components"), this);
+ restart_components_act_->setIcon(QIcon(":/icons/configure.png"));
+ restart_components_act_->setToolTip(tr("Restart All GnuPG's Components"));
connect(restart_components_act_, &QAction::triggered, this, [=]() {
GpgFrontend::GpgAdvancedOperator::RestartGpgComponents();
Module::ListenRTPublishEvent(
@@ -381,127 +382,127 @@ void MainWindow::create_actions() {
bool success_state = std::any_cast<bool>(value);
if (success_state) {
QMessageBox::information(
- this, _("Successful Operation"),
- _("Restart all the GnuPG's components successfully"));
+ this, tr("Successful Operation"),
+ tr("Restart all the GnuPG's components successfully"));
} else {
QMessageBox::critical(
- this, _("Failed Operation"),
- _("Failed to restart all or one of the GnuPG's component(s)"));
+ this, tr("Failed Operation"),
+ tr("Failed to restart all or one of the GnuPG's component(s)"));
}
});
});
- gnupg_controller_open_act_ = new QAction(_("Open GnuPG Controller"), this);
- gnupg_controller_open_act_->setIcon(QIcon(":configure.png"));
- gnupg_controller_open_act_->setToolTip(_("Open GnuPG Controller Dialog"));
+ gnupg_controller_open_act_ = new QAction(tr("Open GnuPG Controller"), this);
+ gnupg_controller_open_act_->setIcon(QIcon(":/icons/configure.png"));
+ gnupg_controller_open_act_->setToolTip(tr("Open GnuPG Controller Dialog"));
connect(gnupg_controller_open_act_, &QAction::triggered, this,
[this]() { (new GnuPGControllerDialog(this))->exec(); });
/*
* About Menu
*/
- about_act_ = new QAction(_("About"), this);
- about_act_->setIcon(QIcon(":help.png"));
- about_act_->setToolTip(_("Show the application's About box"));
+ about_act_ = new QAction(tr("About"), this);
+ about_act_->setIcon(QIcon(":/icons/help.png"));
+ about_act_->setToolTip(tr("Show the application's About box"));
about_act_->setMenuRole(QAction::AboutRole);
connect(about_act_, &QAction::triggered, this,
[=]() { new AboutDialog(0, this); });
- gnupg_act_ = new QAction(_("GnuPG"), this);
- gnupg_act_->setIcon(QIcon(":help.png"));
- gnupg_act_->setToolTip(_("Information about Gnupg"));
+ 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); });
- translate_act_ = new QAction(_("Translate"), this);
- translate_act_->setIcon(QIcon(":help.png"));
- translate_act_->setToolTip(_("Information about translation"));
+ translate_act_ = new QAction(tr("Translate"), this);
+ translate_act_->setIcon(QIcon(":/icons/help.png"));
+ translate_act_->setToolTip(tr("Information about translation"));
connect(translate_act_, &QAction::triggered, this,
[=]() { new AboutDialog(2, this); });
/*
* Check Update Menu
*/
- check_update_act_ = new QAction(_("Check for Updates"), this);
- check_update_act_->setIcon(QIcon(":help.png"));
- check_update_act_->setToolTip(_("Check for updates"));
+ 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); });
- start_wizard_act_ = new QAction(_("Open Wizard"), this);
- start_wizard_act_->setToolTip(_("Open the wizard"));
+ start_wizard_act_ = new QAction(tr("Open Wizard"), this);
+ start_wizard_act_->setToolTip(tr("Open the wizard"));
connect(start_wizard_act_, &QAction::triggered, this,
&MainWindow::slot_start_wizard);
append_selected_keys_act_ =
- new QAction(_("Append Public Key to Editor"), this);
+ new QAction(tr("Append Public Key to Editor"), this);
append_selected_keys_act_->setToolTip(
- _("Append selected Keypair's Public Key to Editor"));
+ tr("Append selected Keypair's Public Key to Editor"));
connect(append_selected_keys_act_, &QAction::triggered, this,
&MainWindow::slot_append_selected_keys);
append_key_create_date_to_editor_act_ =
- new QAction(_("Append Create DateTime to Editor"), this);
+ new QAction(tr("Append Create DateTime to Editor"), this);
append_key_create_date_to_editor_act_->setToolTip(
- _("Append selected Key's creation date and time to Editor"));
+ tr("Append selected Key's creation date and time to Editor"));
connect(append_key_create_date_to_editor_act_, &QAction::triggered, this,
&MainWindow::slot_append_keys_create_datetime);
append_key_expire_date_to_editor_act_ =
- new QAction(_("Append Expire DateTime to Editor"), this);
+ new QAction(tr("Append Expire DateTime to Editor"), this);
append_key_expire_date_to_editor_act_->setToolTip(
- _("Append selected Key's expiration date and time to Editor"));
+ tr("Append selected Key's expiration date and time to Editor"));
connect(append_key_expire_date_to_editor_act_, &QAction::triggered, this,
&MainWindow::slot_append_keys_expire_datetime);
append_key_fingerprint_to_editor_act_ =
- new QAction(_("Append Fingerprint to Editor"), this);
+ new QAction(tr("Append Fingerprint to Editor"), this);
append_key_expire_date_to_editor_act_->setToolTip(
- _("Append selected Key's Fingerprint to Editor"));
+ tr("Append selected Key's Fingerprint to Editor"));
connect(append_key_fingerprint_to_editor_act_, &QAction::triggered, this,
&MainWindow::slot_append_keys_fingerprint);
- copy_mail_address_to_clipboard_act_ = new QAction(_("Copy Email"), this);
+ copy_mail_address_to_clipboard_act_ = new QAction(tr("Copy Email"), this);
copy_mail_address_to_clipboard_act_->setToolTip(
- _("Copy selected Keypair's to clipboard"));
+ tr("Copy selected Keypair's to clipboard"));
connect(copy_mail_address_to_clipboard_act_, &QAction::triggered, this,
&MainWindow::slot_copy_mail_address_to_clipboard);
copy_key_default_uid_to_clipboard_act_ =
- new QAction(_("Copy Default UID"), this);
+ new QAction(tr("Copy Default UID"), this);
copy_key_default_uid_to_clipboard_act_->setToolTip(
- _("Copy selected Keypair's default UID to clipboard"));
+ tr("Copy selected Keypair's default UID to clipboard"));
connect(copy_key_default_uid_to_clipboard_act_, &QAction::triggered, this,
&MainWindow::slot_copy_default_uid_to_clipboard);
- copy_key_id_to_clipboard_act_ = new QAction(_("Copy Key ID"), this);
+ copy_key_id_to_clipboard_act_ = new QAction(tr("Copy Key ID"), this);
copy_key_id_to_clipboard_act_->setToolTip(
- _("Copy selected Keypair's ID to clipboard"));
+ tr("Copy selected Keypair's ID to clipboard"));
connect(copy_key_id_to_clipboard_act_, &QAction::triggered, this,
&MainWindow::slot_copy_key_id_to_clipboard);
- show_key_details_act_ = new QAction(_("Show Key Details"), this);
- show_key_details_act_->setToolTip(_("Show Details for this Key"));
+ show_key_details_act_ = new QAction(tr("Show Key Details"), this);
+ show_key_details_act_->setToolTip(tr("Show Details for this Key"));
connect(show_key_details_act_, &QAction::triggered, this,
&MainWindow::slot_show_key_details);
- add_key_2_favourtie_act_ = new QAction(_("Add To Favourite"), this);
- add_key_2_favourtie_act_->setToolTip(_("Add this key to Favourite Table"));
+ 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,
&MainWindow::slot_add_key_2_favourite);
remove_key_from_favourtie_act_ =
- new QAction(_("Remove From Favourite"), this);
+ new QAction(tr("Remove From Favourite"), this);
remove_key_from_favourtie_act_->setToolTip(
- _("Remove this key from Favourite Table"));
+ tr("Remove this key from Favourite Table"));
remove_key_from_favourtie_act_->setData(
QVariant("remove_key_from_favourtie_action"));
connect(remove_key_from_favourtie_act_, &QAction::triggered, this,
&MainWindow::slot_remove_key_from_favourite);
- set_owner_trust_of_key_act_ = new QAction(_("Set Owner Trust Level"), this);
- set_owner_trust_of_key_act_->setToolTip(_("Set Owner Trust Level"));
+ set_owner_trust_of_key_act_ = new QAction(tr("Set Owner Trust Level"), this);
+ 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,
&MainWindow::slot_set_owner_trust_level_of_key);
@@ -520,17 +521,17 @@ void MainWindow::create_actions() {
&TextEdit::SlotSwitchTabDown);
this->addAction(switch_tab_down_act_);
- cut_pgp_header_act_ = new QAction(_("Remove PGP Header"), this);
+ cut_pgp_header_act_ = new QAction(tr("Remove PGP Header"), this);
connect(cut_pgp_header_act_, &QAction::triggered, this,
&MainWindow::slot_cut_pgp_header);
- add_pgp_header_act_ = new QAction(_("Add PGP Header"), this);
+ add_pgp_header_act_ = new QAction(tr("Add PGP Header"), this);
connect(add_pgp_header_act_, &QAction::triggered, this,
&MainWindow::slot_add_pgp_header);
}
void MainWindow::create_menus() {
- file_menu_ = menuBar()->addMenu(_("File"));
+ file_menu_ = menuBar()->addMenu(tr("File"));
file_menu_->addAction(new_tab_act_);
file_menu_->addAction(browser_act_);
file_menu_->addAction(open_act_);
@@ -543,7 +544,7 @@ void MainWindow::create_menus() {
file_menu_->addAction(close_tab_act_);
file_menu_->addAction(quit_act_);
- edit_menu_ = menuBar()->addMenu(_("Edit"));
+ edit_menu_ = menuBar()->addMenu(tr("Edit"));
edit_menu_->addAction(undo_act_);
edit_menu_->addAction(redo_act_);
edit_menu_->addSeparator();
@@ -561,7 +562,7 @@ void MainWindow::create_menus() {
edit_menu_->addSeparator();
edit_menu_->addAction(open_settings_act_);
- crypt_menu_ = menuBar()->addMenu(_("Crypt"));
+ crypt_menu_ = menuBar()->addMenu(tr("Crypt"));
crypt_menu_->addAction(encrypt_act_);
crypt_menu_->addAction(encrypt_sign_act_);
crypt_menu_->addAction(decrypt_act_);
@@ -571,16 +572,16 @@ void MainWindow::create_menus() {
crypt_menu_->addAction(verify_act_);
crypt_menu_->addSeparator();
- key_menu_ = menuBar()->addMenu(_("Keys"));
- import_key_menu_ = key_menu_->addMenu(_("Import Key"));
- import_key_menu_->setIcon(QIcon(":key_import.png"));
+ key_menu_ = menuBar()->addMenu(tr("Keys"));
+ import_key_menu_ = key_menu_->addMenu(tr("Import Key"));
+ import_key_menu_->setIcon(QIcon(":/icons/key_import.png"));
import_key_menu_->addAction(import_key_from_file_act_);
import_key_menu_->addAction(import_key_from_edit_act_);
import_key_menu_->addAction(import_key_from_clipboard_act_);
import_key_menu_->addAction(import_key_from_key_server_act_);
key_menu_->addAction(open_key_management_act_);
- gpg_menu_ = menuBar()->addMenu(_("GnuPG"));
+ gpg_menu_ = menuBar()->addMenu(tr("GnuPG"));
gpg_menu_->addAction(clean_gpg_password_cache_act_);
gpg_menu_->addSeparator();
gpg_menu_->addAction(reload_components_act_);
@@ -588,13 +589,13 @@ void MainWindow::create_menus() {
gpg_menu_->addSeparator();
gpg_menu_->addAction(gnupg_controller_open_act_);
- steganography_menu_ = menuBar()->addMenu(_("Steganography"));
+ steganography_menu_ = menuBar()->addMenu(tr("Steganography"));
steganography_menu_->addAction(cut_pgp_header_act_);
steganography_menu_->addAction(add_pgp_header_act_);
- view_menu_ = menuBar()->addMenu(_("View"));
+ view_menu_ = menuBar()->addMenu(tr("View"));
- help_menu_ = menuBar()->addMenu(_("Help"));
+ help_menu_ = menuBar()->addMenu(tr("Help"));
help_menu_->addAction(start_wizard_act_);
help_menu_->addSeparator();
help_menu_->addAction(check_update_act_);
@@ -604,14 +605,14 @@ void MainWindow::create_menus() {
}
void MainWindow::create_tool_bars() {
- file_tool_bar_ = addToolBar(_("File"));
+ file_tool_bar_ = addToolBar(tr("File"));
file_tool_bar_->setObjectName("fileToolBar");
file_tool_bar_->addAction(new_tab_act_);
file_tool_bar_->addAction(open_act_);
file_tool_bar_->addAction(browser_act_);
view_menu_->addAction(file_tool_bar_->toggleViewAction());
- crypt_tool_bar_ = addToolBar(_("Operations"));
+ crypt_tool_bar_ = addToolBar(tr("Operations"));
crypt_tool_bar_->setObjectName("cryptToolBar");
crypt_tool_bar_->addAction(encrypt_act_);
crypt_tool_bar_->addAction(encrypt_sign_act_);
@@ -621,12 +622,12 @@ void MainWindow::create_tool_bars() {
crypt_tool_bar_->addAction(verify_act_);
view_menu_->addAction(crypt_tool_bar_->toggleViewAction());
- key_tool_bar_ = addToolBar(_("Key"));
+ key_tool_bar_ = addToolBar(tr("Key"));
key_tool_bar_->setObjectName("keyToolBar");
key_tool_bar_->addAction(open_key_management_act_);
view_menu_->addAction(key_tool_bar_->toggleViewAction());
- edit_tool_bar_ = addToolBar(_("Edit"));
+ edit_tool_bar_ = addToolBar(tr("Edit"));
edit_tool_bar_->setObjectName("editToolBar");
edit_tool_bar_->addAction(copy_act_);
edit_tool_bar_->addAction(paste_act_);
@@ -634,7 +635,7 @@ void MainWindow::create_tool_bars() {
edit_tool_bar_->hide();
view_menu_->addAction(edit_tool_bar_->toggleViewAction());
- special_edit_tool_bar_ = addToolBar(_("Special Edit"));
+ special_edit_tool_bar_ = addToolBar(tr("Special Edit"));
special_edit_tool_bar_->setObjectName("specialEditToolBar");
special_edit_tool_bar_->addAction(quote_act_);
special_edit_tool_bar_->addAction(clean_double_line_breaks_act_);
@@ -645,9 +646,9 @@ void MainWindow::create_tool_bars() {
import_button_ = new QToolButton();
import_button_->setMenu(import_key_menu_);
import_button_->setPopupMode(QToolButton::InstantPopup);
- import_button_->setIcon(QIcon(":key_import.png"));
- import_button_->setToolTip(_("Import key from..."));
- import_button_->setText(_("Import key"));
+ import_button_->setIcon(QIcon(":/icons/key_import.png"));
+ import_button_->setToolTip(tr("Import key from..."));
+ import_button_->setText(tr("Import key"));
key_tool_bar_->addWidget(import_button_);
}
@@ -657,20 +658,20 @@ void MainWindow::create_status_bar() {
// QPixmap* pixmap;
// icon which should be shown if there are files in attachments-folder
- // pixmap = new QPixmap(":statusbar_icon.png");
+ // pixmap = new QPixmap(":/icons/statusbar_icon.png");
// statusBarIcon = new QLabel();
// statusBar()->addWidget(statusBarIcon);
//
// statusBarIcon->setPixmap(*pixmap);
// statusBar()->insertPermanentWidget(0, statusBarIcon, 0);
- statusBar()->showMessage(_("Ready"), 2000);
+ statusBar()->showMessage(tr("Ready"), 2000);
status_bar_box->setLayout(status_bar_box_layout);
}
void MainWindow::create_dock_windows() {
/* KeyList-Dock window
*/
- key_list_dock_ = new QDockWidget(_("Key ToolBox"), this);
+ key_list_dock_ = new QDockWidget(tr("Key ToolBox"), this);
key_list_dock_->setObjectName("EncryptDock");
key_list_dock_->setAllowedAreas(Qt::LeftDockWidgetArea |
Qt::RightDockWidgetArea);
@@ -678,7 +679,7 @@ void MainWindow::create_dock_windows() {
addDockWidget(Qt::RightDockWidgetArea, key_list_dock_);
m_key_list_->AddListGroupTab(
- _("Default"), "default", KeyListRow::SECRET_OR_PUBLIC_KEY,
+ tr("Default"), "default", KeyListRow::SECRET_OR_PUBLIC_KEY,
KeyListColumn::TYPE | KeyListColumn::NAME | KeyListColumn::EmailAddress |
KeyListColumn::Usage | KeyListColumn::Validity,
[](const GpgKey& key, const KeyTable&) -> bool {
@@ -686,7 +687,7 @@ void MainWindow::create_dock_windows() {
});
m_key_list_->AddListGroupTab(
- _("Favourite"), "favourite", KeyListRow::SECRET_OR_PUBLIC_KEY,
+ tr("Favourite"), "favourite", KeyListRow::SECRET_OR_PUBLIC_KEY,
KeyListColumn::TYPE | KeyListColumn::NAME | KeyListColumn::EmailAddress |
KeyListColumn::Usage | KeyListColumn::Validity,
[](const GpgKey& key, const KeyTable&) -> bool {
@@ -694,7 +695,8 @@ void MainWindow::create_dock_windows() {
});
m_key_list_->AddListGroupTab(
- _("Only Public Key"), "only_public_key", KeyListRow::SECRET_OR_PUBLIC_KEY,
+ tr("Only Public Key"), "only_public_key",
+ KeyListRow::SECRET_OR_PUBLIC_KEY,
KeyListColumn::TYPE | KeyListColumn::NAME | KeyListColumn::EmailAddress |
KeyListColumn::Usage | KeyListColumn::Validity,
[](const GpgKey& key, const KeyTable&) -> bool {
@@ -703,7 +705,8 @@ void MainWindow::create_dock_windows() {
});
m_key_list_->AddListGroupTab(
- _("Has Private Key"), "has_private_key", KeyListRow::SECRET_OR_PUBLIC_KEY,
+ tr("Has Private Key"), "has_private_key",
+ KeyListRow::SECRET_OR_PUBLIC_KEY,
KeyListColumn::TYPE | KeyListColumn::NAME | KeyListColumn::EmailAddress |
KeyListColumn::Usage | KeyListColumn::Validity,
[](const GpgKey& key, const KeyTable&) -> bool {
@@ -716,7 +719,7 @@ void MainWindow::create_dock_windows() {
key_list_dock_->setWidget(m_key_list_);
view_menu_->addAction(key_list_dock_->toggleViewAction());
- info_board_dock_ = new QDockWidget(_("Information Board"), this);
+ info_board_dock_ = new QDockWidget(tr("Information Board"), this);
info_board_dock_->setObjectName("Information Board");
info_board_dock_->setAllowedAreas(Qt::BottomDockWidgetArea);
addDockWidget(Qt::BottomDockWidgetArea, info_board_dock_);
diff --git a/src/ui/thread/KeyServerImportTask.cpp b/src/ui/thread/KeyServerImportTask.cpp
index 89f0f45a..63cabbcd 100644
--- a/src/ui/thread/KeyServerImportTask.cpp
+++ b/src/ui/thread/KeyServerImportTask.cpp
@@ -71,23 +71,22 @@ void GpgFrontend::UI::KeyServerImportTask::dealing_reply_from_server() {
QString err_msg;
switch (network_reply) {
case QNetworkReply::ContentNotFoundError:
- err_msg = QString(_("Key not found in the Keyserver."));
+ err_msg = tr("Key not found in the Keyserver.");
break;
case QNetworkReply::TimeoutError:
- err_msg = QString(_("Network connection timeout."));
+ err_msg = tr("Network connection timeout.");
break;
case QNetworkReply::HostNotFoundError:
- err_msg =
- QString(_("Cannot resolve the address of target key server."));
+ err_msg = tr("Cannot resolve the address of target key server.");
break;
default:
- err_msg = QString(_("General connection error occurred."));
+ err_msg = tr("General connection error occurred.");
}
emit SignalKeyServerImportResult(false, err_msg, buffer, nullptr);
}
auto info = GpgKeyImportExporter::GetInstance().ImportKey(GFBuffer(buffer));
- emit SignalKeyServerImportResult(true, _("Success"), buffer, info);
+ emit SignalKeyServerImportResult(true, tr("Success"), buffer, info);
if (static_cast<size_t>(result_count_++) == keyids_.size() - 1) {
emit SignalTaskShouldEnd(0);
diff --git a/src/ui/widgets/FilePage.cpp b/src/ui/widgets/FilePage.cpp
index 08534dcb..b32cb175 100644
--- a/src/ui/widgets/FilePage.cpp
+++ b/src/ui/widgets/FilePage.cpp
@@ -65,13 +65,13 @@ FilePage::FilePage(QWidget* parent, const QString& target_path)
ui_->pathEdit->setCompleter(path_edit_completer_);
option_popup_menu_ = new QMenu(this);
- auto* show_hidden_act = new QAction(_("Show Hidden File"), this);
+ auto* show_hidden_act = new QAction(tr("Show Hidden File"), this);
show_hidden_act->setCheckable(true);
connect(show_hidden_act, &QAction::triggered, file_tree_view_,
&FileTreeView::SlotShowHiddenFile);
option_popup_menu_->addAction(show_hidden_act);
- auto* show_system_act = new QAction(_("Show System File"), this);
+ auto* show_system_act = new QAction(tr("Show System File"), this);
show_system_act->setCheckable(true);
connect(show_system_act, &QAction::triggered, file_tree_view_,
&FileTreeView::SlotShowSystemFile);
diff --git a/src/ui/widgets/FileTreeView.cpp b/src/ui/widgets/FileTreeView.cpp
index ef0fbf48..f3556dc9 100644
--- a/src/ui/widgets/FileTreeView.cpp
+++ b/src/ui/widgets/FileTreeView.cpp
@@ -81,8 +81,8 @@ void FileTreeView::SlotGoPath(const std::filesystem::path& target_path) {
}
} else {
QMessageBox::critical(
- this, _("Error"),
- _("The path is not exists, unprivileged or unreachable."));
+ this, tr("Error"),
+ tr("The path is not exists, unprivileged or unreachable."));
}
emit SignalPathChanged(QString::fromStdString(current_path_.u8string()));
}
@@ -94,8 +94,8 @@ void FileTreeView::slot_file_tree_view_item_double_clicked(
if (file_info.isReadable()) {
emit SignalOpenFile(file_info.absoluteFilePath());
} else {
- QMessageBox::critical(this, _("Error"),
- _("The file is unprivileged or unreachable."));
+ QMessageBox::critical(this, tr("Error"),
+ tr("The file is unprivileged or unreachable."));
}
} else {
SlotGoPath(file_info.filesystemAbsoluteFilePath());
@@ -155,8 +155,8 @@ auto FileTreeView::SlotDeleteSelectedItem() -> void {
QModelIndex const index = this->currentIndex();
QVariant const data = this->model()->data(index);
- auto ret = QMessageBox::warning(this, _("Warning"),
- _("Are you sure you want to delete it?"),
+ auto ret = QMessageBox::warning(this, tr("Warning"),
+ tr("Are you sure you want to delete it?"),
QMessageBox::Ok | QMessageBox::Cancel);
if (ret == QMessageBox::Cancel) return;
@@ -164,8 +164,8 @@ auto FileTreeView::SlotDeleteSelectedItem() -> void {
GF_UI_LOG_DEBUG("delete item: {}", data.toString().toStdString());
if (!dir_model_->remove(index)) {
- QMessageBox::critical(this, _("Error"),
- _("Unable to delete the file or folder."));
+ QMessageBox::critical(this, tr("Error"),
+ tr("Unable to delete the file or folder."));
}
}
@@ -174,9 +174,9 @@ void FileTreeView::SlotMkdir() {
QString new_dir_name;
bool ok;
- new_dir_name =
- QInputDialog::getText(this, _("Make New Directory"), _("Directory Name"),
- QLineEdit::Normal, new_dir_name, &ok);
+ new_dir_name = QInputDialog::getText(this, tr("Make New Directory"),
+ tr("Directory Name"), QLineEdit::Normal,
+ new_dir_name, &ok);
if (ok && !new_dir_name.isEmpty()) {
dir_model_->mkdir(index, new_dir_name);
}
@@ -187,9 +187,9 @@ void FileTreeView::SlotMkdirBelowAtSelectedItem() {
QString new_dir_name;
bool ok;
- new_dir_name =
- QInputDialog::getText(this, _("Make New Directory"), _("Directory Name"),
- QLineEdit::Normal, new_dir_name, &ok);
+ new_dir_name = QInputDialog::getText(this, tr("Make New Directory"),
+ tr("Directory Name"), QLineEdit::Normal,
+ new_dir_name, &ok);
if (ok && !new_dir_name.isEmpty()) {
dir_model_->mkdir(index, new_dir_name);
}
@@ -205,9 +205,9 @@ void FileTreeView::SlotTouch() {
QString new_file_name;
bool ok;
- new_file_name = QInputDialog::getText(this, _("Create Empty File"),
- _("Filename (you can given extension)"),
- QLineEdit::Normal, new_file_name, &ok);
+ new_file_name = QInputDialog::getText(
+ this, tr("Create Empty File"), tr("Filename (you can given extension)"),
+ QLineEdit::Normal, new_file_name, &ok);
if (ok && !new_file_name.isEmpty()) {
#ifdef WINDOWS
auto file_path = root_path / new_file_name.toStdU16String();
@@ -216,7 +216,8 @@ void FileTreeView::SlotTouch() {
#endif
QFile new_file(file_path.u8string().c_str());
if (!new_file.open(QIODevice::WriteOnly | QIODevice::NewOnly)) {
- QMessageBox::critical(this, _("Error"), _("Unable to create the file."));
+ QMessageBox::critical(this, tr("Error"),
+ tr("Unable to create the file."));
}
new_file.close();
}
@@ -227,9 +228,9 @@ void FileTreeView::SlotTouchBelowAtSelectedItem() {
QString new_file_name;
bool ok;
- new_file_name = QInputDialog::getText(this, _("Create Empty File"),
- _("Filename (you can given extension)"),
- QLineEdit::Normal, new_file_name, &ok);
+ new_file_name = QInputDialog::getText(
+ this, tr("Create Empty File"), tr("Filename (you can given extension)"),
+ QLineEdit::Normal, new_file_name, &ok);
if (ok && !new_file_name.isEmpty()) {
#ifdef WINDOWS
auto file_path = root_path / new_file_name.toStdU16String();
@@ -238,7 +239,8 @@ void FileTreeView::SlotTouchBelowAtSelectedItem() {
#endif
QFile new_file(file_path.u8string().c_str());
if (!new_file.open(QIODevice::WriteOnly | QIODevice::NewOnly)) {
- QMessageBox::critical(this, _("Error"), _("Unable to create the file."));
+ QMessageBox::critical(this, tr("Error"),
+ tr("Unable to create the file."));
}
new_file.close();
}
@@ -272,7 +274,7 @@ void FileTreeView::SlotOpenSelectedItemBySystemApplication() {
void FileTreeView::SlotRenameSelectedItem() {
bool ok;
auto text = QInputDialog::getText(
- this, _("Rename"), _("New Filename"), QLineEdit::Normal,
+ this, tr("Rename"), tr("New Filename"), QLineEdit::Normal,
QString::fromStdString(selected_path_.filename().u8string()), &ok);
if (ok && !text.isEmpty()) {
try {
@@ -289,8 +291,8 @@ void FileTreeView::SlotRenameSelectedItem() {
} catch (...) {
GF_UI_LOG_ERROR("file tree view rename error: {}",
selected_path_.u8string());
- QMessageBox::critical(this, _("Error"),
- _("Unable to rename the file or folder."));
+ QMessageBox::critical(this, tr("Error"),
+ tr("Unable to rename the file or folder."));
}
}
}
@@ -303,50 +305,50 @@ void FileTreeView::slot_create_popup_menu() {
popup_menu_ = new QMenu();
action_open_file_ = new QAction(this);
- action_open_file_->setText(_("Open"));
+ action_open_file_->setText(tr("Open"));
connect(action_open_file_, &QAction::triggered, this, [this](bool) {
emit SignalOpenFile(QString::fromStdString(GetSelectedPath()));
});
action_rename_file_ = new QAction(this);
- action_rename_file_->setText(_("Rename"));
+ action_rename_file_->setText(tr("Rename"));
connect(action_rename_file_, &QAction::triggered, this,
&FileTreeView::SlotRenameSelectedItem);
action_delete_file_ = new QAction(this);
- action_delete_file_->setText(_("Delete"));
+ action_delete_file_->setText(tr("Delete"));
connect(action_delete_file_, &QAction::triggered, this,
&FileTreeView::SlotDeleteSelectedItem);
action_calculate_hash_ = new QAction(this);
- action_calculate_hash_->setText(_("Calculate Hash"));
+ action_calculate_hash_->setText(tr("Calculate Hash"));
connect(action_calculate_hash_, &QAction::triggered, this,
&FileTreeView::slot_calculate_hash);
action_make_directory_ = new QAction(this);
- action_make_directory_->setText(_("Directory"));
+ action_make_directory_->setText(tr("Directory"));
connect(action_make_directory_, &QAction::triggered, this,
&FileTreeView::SlotMkdirBelowAtSelectedItem);
action_create_empty_file_ = new QAction(this);
- action_create_empty_file_->setText(_("File"));
+ action_create_empty_file_->setText(tr("File"));
connect(action_create_empty_file_, &QAction::triggered, this,
&FileTreeView::SlotTouchBelowAtSelectedItem);
action_compress_files_ = new QAction(this);
- action_compress_files_->setText(_("Compress..."));
+ action_compress_files_->setText(tr("Compress..."));
action_compress_files_->setVisible(false);
connect(action_compress_files_, &QAction::triggered, this,
&FileTreeView::slot_compress_files);
auto* action_open_with_system_default_application = new QAction(this);
action_open_with_system_default_application->setText(
- _("Open with Default System Application"));
+ tr("Open with Default System Application"));
connect(action_open_with_system_default_application, &QAction::triggered,
this, &FileTreeView::SlotOpenSelectedItemBySystemApplication);
auto* new_item_action_menu = new QMenu(this);
- new_item_action_menu->setTitle(_("New"));
+ new_item_action_menu->setTitle(tr("New"));
new_item_action_menu->addAction(action_create_empty_file_);
new_item_action_menu->addAction(action_make_directory_);
diff --git a/src/ui/widgets/FindWidget.cpp b/src/ui/widgets/FindWidget.cpp
index b8af254a..7cc569e4 100644
--- a/src/ui/widgets/FindWidget.cpp
+++ b/src/ui/widgets/FindWidget.cpp
@@ -33,28 +33,31 @@ namespace GpgFrontend::UI {
FindWidget::FindWidget(QWidget* parent, PlainTextEditorPage* edit)
: QWidget(parent), m_text_page_(edit) {
find_edit_ = new QLineEdit(this);
- auto* closeButton = new QPushButton(
+ auto* close_button = new QPushButton(
this->style()->standardIcon(QStyle::SP_TitleBarCloseButton), QString(),
this);
- auto* nextButton = new QPushButton(QIcon(":button_next.png"), QString());
- auto* previousButton = new QPushButton(QIcon(":button_previous.png"), "");
-
- auto* notificationWidgetLayout = new QHBoxLayout(this);
- notificationWidgetLayout->setContentsMargins(10, 0, 0, 0);
- notificationWidgetLayout->addWidget(new QLabel(QString(_("Find")) + ": "));
- notificationWidgetLayout->addWidget(find_edit_, 2);
- notificationWidgetLayout->addWidget(nextButton);
- notificationWidgetLayout->addWidget(previousButton);
- notificationWidgetLayout->addWidget(closeButton);
-
- this->setLayout(notificationWidgetLayout);
+ auto* next_button =
+ new QPushButton(QIcon(":/icons/button_next.png"), QString());
+ auto* previous_button =
+ new QPushButton(QIcon(":/icons/button_previous.png"), "");
+
+ auto* notification_widget_layout = new QHBoxLayout(this);
+ notification_widget_layout->setContentsMargins(10, 0, 0, 0);
+ notification_widget_layout->addWidget(new QLabel(tr("Find") + ": "));
+ notification_widget_layout->addWidget(find_edit_, 2);
+ notification_widget_layout->addWidget(next_button);
+ notification_widget_layout->addWidget(previous_button);
+ notification_widget_layout->addWidget(close_button);
+
+ this->setLayout(notification_widget_layout);
connect(find_edit_, &QLineEdit::textEdited, this, &FindWidget::slot_find);
connect(find_edit_, &QLineEdit::returnPressed, this,
&FindWidget::slot_find_next);
- connect(nextButton, &QPushButton::clicked, this, &FindWidget::slot_find_next);
- connect(previousButton, &QPushButton::clicked, this,
+ connect(next_button, &QPushButton::clicked, this,
+ &FindWidget::slot_find_next);
+ connect(previous_button, &QPushButton::clicked, this,
&FindWidget::slot_find_previous);
- connect(closeButton, &QPushButton::clicked, this, &FindWidget::slot_close);
+ connect(close_button, &QPushButton::clicked, this, &FindWidget::slot_close);
// The timer is necessary for setting the focus
QTimer::singleShot(0, find_edit_, SLOT(setFocus()));
@@ -63,17 +66,17 @@ FindWidget::FindWidget(QWidget* parent, PlainTextEditorPage* edit)
void FindWidget::set_background() {
// auto cursor = m_text_page_->GetTextPage()->textCursor();
// if match is found set background of QLineEdit to white, otherwise to red
- QPalette bgPalette(find_edit_->palette());
+ QPalette bg_palette(find_edit_->palette());
if (!find_edit_->text().isEmpty() && m_text_page_->GetTextPage()
->document()
->find(find_edit_->text())
.position() < 0) {
- bgPalette.setColor(QPalette::Base, "#ececba");
+ bg_palette.setColor(QPalette::Base, "#ececba");
} else {
- bgPalette.setColor(QPalette::Base, Qt::white);
+ bg_palette.setColor(QPalette::Base, Qt::white);
}
- find_edit_->setPalette(bgPalette);
+ find_edit_->setPalette(bg_palette);
}
void FindWidget::slot_find_next() {
diff --git a/src/ui/widgets/InfoBoardWidget.cpp b/src/ui/widgets/InfoBoardWidget.cpp
index bf3dba18..fdec1e50 100644
--- a/src/ui/widgets/InfoBoardWidget.cpp
+++ b/src/ui/widgets/InfoBoardWidget.cpp
@@ -42,9 +42,9 @@ InfoBoardWidget::InfoBoardWidget(QWidget* parent)
ui_->setupUi(this);
ui_->actionButtonLayout->addStretch();
- ui_->copyToolButton->setToolTip(_("Copy"));
- ui_->saveToolButton->setToolTip(_("Save File"));
- ui_->clearToolButton->setToolTip(_("Clear"));
+ ui_->copyToolButton->setToolTip(tr("Copy"));
+ ui_->saveToolButton->setToolTip(tr("Save File"));
+ ui_->clearToolButton->setToolTip(tr("Clear"));
connect(ui_->copyToolButton, &QToolButton::clicked, this,
&InfoBoardWidget::slot_copy);
@@ -164,7 +164,7 @@ void InfoBoardWidget::slot_copy() {
void InfoBoardWidget::slot_save() {
auto file_path = QFileDialog::getSaveFileName(
- this, _("Save Information Board's Content"), {}, tr("Text (*.txt)"));
+ this, tr("Save Information Board's Content"), {}, tr("Text (*.txt)"));
GF_UI_LOG_DEBUG("file path: {}", file_path.toStdString());
if (file_path.isEmpty()) return;
@@ -173,8 +173,8 @@ void InfoBoardWidget::slot_save() {
file.write(ui_->infoBoard->toPlainText().toUtf8());
} else {
QMessageBox::critical(
- this, _("Error"),
- _("The file path is not exists, unprivileged or unreachable."));
+ this, tr("Error"),
+ tr("The file path is not exists, unprivileged or unreachable."));
}
file.close();
}
diff --git a/src/ui/widgets/KeyList.cpp b/src/ui/widgets/KeyList.cpp
index 700772e4..a3eb85ea 100644
--- a/src/ui/widgets/KeyList.cpp
+++ b/src/ui/widgets/KeyList.cpp
@@ -96,19 +96,19 @@ void KeyList::init() {
setAcceptDrops(true);
- ui_->refreshKeyListButton->setText(_("Refresh"));
+ ui_->refreshKeyListButton->setText(tr("Refresh"));
ui_->refreshKeyListButton->setToolTip(
- _("Refresh the key list to synchronize changes."));
- ui_->syncButton->setText(_("Sync Public Key"));
+ tr("Refresh the key list to synchronize changes."));
+ ui_->syncButton->setText(tr("Sync Public Key"));
ui_->syncButton->setToolTip(
- _("Sync public key with your default keyserver."));
- ui_->uncheckButton->setText(_("Uncheck ALL"));
+ tr("Sync public key with your default keyserver."));
+ ui_->uncheckButton->setText(tr("Uncheck ALL"));
ui_->uncheckButton->setToolTip(
- _("Cancel all checked items in the current tab at once."));
- ui_->checkALLButton->setText(_("Check ALL"));
+ tr("Cancel all checked items in the current tab at once."));
+ ui_->checkALLButton->setText(tr("Check ALL"));
ui_->checkALLButton->setToolTip(
- _("Check all items in the current tab at once"));
- ui_->searchBarEdit->setPlaceholderText(_("Search for keys..."));
+ tr("Check all items in the current tab at once"));
+ ui_->searchBarEdit->setPlaceholderText(tr("Search for keys..."));
}
void KeyList::AddListGroupTab(const QString& name, const QString& id,
@@ -164,8 +164,8 @@ void KeyList::AddListGroupTab(const QString& name, const QString& id,
}
QStringList labels;
- labels << _("Select") << _("Type") << _("Name") << _("Email Address")
- << _("Usage") << _("Trust") << _("Finger Print");
+ labels << tr("Select") << tr("Type") << tr("Name") << tr("Email Address")
+ << tr("Usage") << tr("Trust") << tr("Finger Print");
key_list->setHorizontalHeaderLabels(labels);
key_list->horizontalHeader()->setStretchLastSection(false);
@@ -180,7 +180,7 @@ void KeyList::SlotRefresh() {
ui_->refreshKeyListButton->setDisabled(true);
ui_->syncButton->setDisabled(true);
- emit SignalRefreshStatusBar(_("Refreshing Key List..."), 3000);
+ emit SignalRefreshStatusBar(tr("Refreshing Key List..."), 3000);
this->buffered_keys_list_ = GpgKeyGetter::GetInstance().FetchKey();
this->slot_refresh_ui();
}
@@ -348,16 +348,13 @@ void KeyList::AddMenuAction(QAction* act) { popup_menu_->addAction(act); }
void KeyList::dropEvent(QDropEvent* event) {
auto* dialog = new QDialog();
- dialog->setWindowTitle(_("Import Keys"));
+ dialog->setWindowTitle(tr("Import Keys"));
QLabel* label;
- label =
- new QLabel(QString(_("You've dropped something on the table.")) + "\n " +
- _("GpgFrontend "
- "will now try to import key(s).") +
- "\n");
+ label = new QLabel(tr("You've dropped something on the table.") + "\n " +
+ tr("GpgFrontend will now try to import key(s).") + "\n");
// "always import keys"-CheckBox
- auto* check_box = new QCheckBox(_("Always import without bothering."));
+ auto* check_box = new QCheckBox(tr("Always import without bothering."));
bool confirm_import_keys = GlobalSettingStation::GetInstance()
.GetSettings()
@@ -452,7 +449,7 @@ void KeyList::slot_refresh_ui() {
GpgKeyGetter::GetInstance().GetKeysCopy(buffered_keys_list_));
}
}
- emit SignalRefreshStatusBar(_("Key List Refreshed."), 1000);
+ emit SignalRefreshStatusBar(tr("Key List Refreshed."), 1000);
ui_->refreshKeyListButton->setDisabled(false);
ui_->syncButton->setDisabled(false);
}
@@ -473,7 +470,7 @@ void KeyList::slot_sync_with_key_server() {
ui_->refreshKeyListButton->setDisabled(true);
ui_->syncButton->setDisabled(true);
- emit SignalRefreshStatusBar(_("Syncing Key List..."), 3000);
+ emit SignalRefreshStatusBar(tr("Syncing Key List..."), 3000);
CommonUtils::SlotImportKeyFromKeyServer(
key_ids, [=](const QString& key_id, const QString& status,
size_t current_index, size_t all_index) {
@@ -481,7 +478,7 @@ void KeyList::slot_sync_with_key_server() {
current_index, all_index);
auto key = GpgKeyGetter::GetInstance().GetKey(key_id);
- auto status_str = QString(_("Sync [%1/%2] %3 %4"))
+ auto status_str = tr("Sync [%1/%2] %3 %4")
.arg(current_index)
.arg(all_index)
.arg(key.GetUIDs()->front().GetUID())
@@ -491,7 +488,7 @@ void KeyList::slot_sync_with_key_server() {
if (current_index == all_index) {
ui_->syncButton->setDisabled(false);
ui_->refreshKeyListButton->setDisabled(false);
- emit SignalRefreshStatusBar(_("Key List Sync Done."), 3000);
+ emit SignalRefreshStatusBar(tr("Key List Sync Done."), 3000);
emit this->SignalRefreshDatabase();
}
});
diff --git a/src/ui/widgets/PlainTextEditorPage.cpp b/src/ui/widgets/PlainTextEditorPage.cpp
index 6bd5ba74..7d951006 100644
--- a/src/ui/widgets/PlainTextEditorPage.cpp
+++ b/src/ui/widgets/PlainTextEditorPage.cpp
@@ -51,7 +51,7 @@ PlainTextEditorPage::PlainTextEditorPage(QString file_path, QWidget *parent)
this->setAttribute(Qt::WA_DeleteOnClose);
- this->ui_->characterLabel->setText(_("0 character"));
+ this->ui_->characterLabel->setText(tr("0 character"));
this->ui_->lfLabel->setHidden(true);
this->ui_->encodingLabel->setText("Unicode");
@@ -60,7 +60,7 @@ PlainTextEditorPage::PlainTextEditorPage(QString file_path, QWidget *parent)
if (!read_done_) return;
auto text = ui_->textPage->document()->toPlainText();
- auto str = QString(_("%1 character(s)")).arg(text.size());
+ auto str = tr("%1 character(s)").arg(text.size());
this->ui_->characterLabel->setText(str);
});
@@ -69,7 +69,7 @@ PlainTextEditorPage::PlainTextEditorPage(QString file_path, QWidget *parent)
ui_->loadingLabel->setHidden(true);
} else {
read_done_ = false;
- ui_->loadingLabel->setText(_("Loading..."));
+ ui_->loadingLabel->setText(tr("Loading..."));
ui_->loadingLabel->setHidden(false);
}
}
@@ -83,8 +83,8 @@ QPlainTextEdit *PlainTextEditorPage::GetTextPage() { return ui_->textPage; }
void PlainTextEditorPage::NotifyFileSaved() {
this->is_crlf_ = false;
- this->ui_->lfLabel->setText(_("lf"));
- this->ui_->encodingLabel->setText(_("UTF-8"));
+ this->ui_->lfLabel->setText(tr("lf"));
+ this->ui_->encodingLabel->setText(tr("UTF-8"));
}
void PlainTextEditorPage::SetFilePath(const QString &filePath) {
@@ -195,7 +195,7 @@ void PlainTextEditorPage::slot_insert_text(QByteArray bytes_data) {
this->GetTextPage()->insertPlainText(bytes_data);
auto text = this->GetTextPage()->toPlainText();
- auto str = QString(_("%1 character(s)")).arg(text.size());
+ auto str = tr("%1 character(s)").arg(text.size());
this->ui_->characterLabel->setText(str);
QTimer::singleShot(25, this, &PlainTextEditorPage::SignalUIBytesDisplayed);
diff --git a/src/ui/widgets/TOFUInfoPage.cpp b/src/ui/widgets/TOFUInfoPage.cpp
index 502fed44..39cf8921 100644
--- a/src/ui/widgets/TOFUInfoPage.cpp
+++ b/src/ui/widgets/TOFUInfoPage.cpp
@@ -33,15 +33,14 @@ GpgFrontend::UI::TOFUInfoPage::TOFUInfoPage(
: QWidget(parent) {
auto grid_layout = new QGridLayout();
- grid_layout->addWidget(new QLabel(QString(_("Key ID")) + ": "), 0, 0);
- grid_layout->addWidget(new QLabel(QString(_("Algorithm")) + ": "), 1, 0);
- grid_layout->addWidget(new QLabel(QString(_("Key Size")) + ": "), 2, 0);
- grid_layout->addWidget(new QLabel(QString(_("Nominal Usage")) + ": "), 3, 0);
- grid_layout->addWidget(new QLabel(QString(_("Actual Usage")) + ": "), 4, 0);
- grid_layout->addWidget(new QLabel(QString(_("Expires on")) + ": "), 5, 0);
- grid_layout->addWidget(new QLabel(QString(_("Last Update")) + ": "), 6, 0);
- grid_layout->addWidget(new QLabel(QString(_("Secret Key Existence")) + ": "),
- 7, 0);
+ grid_layout->addWidget(new QLabel(tr("Key ID") + ": "), 0, 0);
+ grid_layout->addWidget(new QLabel(tr("Algorithm") + ": "), 1, 0);
+ grid_layout->addWidget(new QLabel(tr("Key Size") + ": "), 2, 0);
+ grid_layout->addWidget(new QLabel(tr("Nominal Usage") + ": "), 3, 0);
+ grid_layout->addWidget(new QLabel(tr("Actual Usage") + ": "), 4, 0);
+ grid_layout->addWidget(new QLabel(tr("Expires on") + ": "), 5, 0);
+ grid_layout->addWidget(new QLabel(tr("Last Update") + ": "), 6, 0);
+ grid_layout->addWidget(new QLabel(tr("Secret Key Existence") + ": "), 7, 0);
setLayout(grid_layout);
}
diff --git a/src/ui/widgets/TextEdit.cpp b/src/ui/widgets/TextEdit.cpp
index 1812dd23..59890465 100644
--- a/src/ui/widgets/TextEdit.cpp
+++ b/src/ui/widgets/TextEdit.cpp
@@ -59,11 +59,11 @@ TextEdit::TextEdit(QWidget* parent) : QWidget(parent) {
}
void TextEdit::SlotNewTab() {
- QString header = _("untitled") + QString::number(++count_page_) + ".txt";
+ QString header = tr("untitled") + QString::number(++count_page_) + ".txt";
auto* page = new PlainTextEditorPage();
auto index = tab_widget_->addTab(page, header);
- tab_widget_->setTabIcon(index, QIcon(":file.png"));
+ tab_widget_->setTabIcon(index, QIcon(":/icons/file.png"));
tab_widget_->setCurrentIndex(tab_widget_->count() - 1);
page->GetTextPage()->setFocus();
connect(page->GetTextPage()->document(), &QTextDocument::modificationChanged,
@@ -73,7 +73,7 @@ void TextEdit::SlotNewTab() {
}
void TextEdit::SlotNewTabWithContent(QString title, const QString& content) {
- QString header = _("untitled") + QString::number(++count_page_) + ".txt";
+ QString header = tr("untitled") + QString::number(++count_page_) + ".txt";
if (!title.isEmpty()) {
// modify title
if (!title.isEmpty() && title[0] == '*') {
@@ -85,7 +85,7 @@ void TextEdit::SlotNewTabWithContent(QString title, const QString& content) {
auto* page = new PlainTextEditorPage();
auto index = tab_widget_->addTab(page, header);
- tab_widget_->setTabIcon(index, QIcon(":file.png"));
+ tab_widget_->setTabIcon(index, QIcon(":/icons/file.png"));
tab_widget_->setCurrentIndex(tab_widget_->count() - 1);
page->GetTextPage()->setFocus();
connect(page->GetTextPage()->document(), &QTextDocument::modificationChanged,
@@ -105,13 +105,13 @@ void TextEdit::slotNewHelpTab(const QString& title, const QString& path) const {
void TextEdit::SlotNewFileTab() {
auto const target_dir = QFileDialog::getExistingDirectory(
- this, _("Open Directory"), QDir::home().path(),
+ this, tr("Open Directory"), QDir::home().path(),
QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
if (target_dir.isEmpty()) return;
auto* page = new FilePage(qobject_cast<QWidget*>(parent()), target_dir);
auto index = tab_widget_->addTab(page, QString());
- tab_widget_->setTabIcon(index, QIcon(":file-browser.png"));
+ tab_widget_->setTabIcon(index, QIcon(":/icons/file-browser.png"));
tab_widget_->setCurrentIndex(tab_widget_->count() - 1);
connect(page, &FilePage::SignalPathChanged, this,
&TextEdit::slot_file_page_path_changed);
@@ -134,16 +134,15 @@ void TextEdit::SlotOpenFile(const QString& path) {
QApplication::setOverrideCursor(Qt::WaitCursor);
auto index = tab_widget_->addTab(page, stripped_name(path));
- tab_widget_->setTabIcon(index, QIcon(":file.png"));
+ tab_widget_->setTabIcon(index, QIcon(":/icons/file.png"));
tab_widget_->setCurrentIndex(tab_widget_->count() - 1);
QApplication::restoreOverrideCursor();
page->GetTextPage()->setFocus();
page->ReadFile();
} else {
- QMessageBox::warning(this, _("Warning"),
- QString(_("Cannot read file %1:\n%2."))
- .arg(path)
- .arg(file.errorString()));
+ QMessageBox::warning(
+ this, tr("Warning"),
+ tr("Cannot read file %1:\n%2.").arg(path).arg(file.errorString()));
}
file.close();
@@ -151,7 +150,7 @@ void TextEdit::SlotOpenFile(const QString& path) {
void TextEdit::SlotOpen() {
QStringList file_names =
- QFileDialog::getOpenFileNames(this, _("Open file"), QDir::currentPath());
+ QFileDialog::getOpenFileNames(this, tr("Open file"), QDir::currentPath());
for (const auto& file_name : file_names) {
if (!file_name.isEmpty()) {
SlotOpenFile(file_name);
@@ -201,10 +200,9 @@ bool TextEdit::save_file(const QString& fileName) {
file.close();
return true;
}
- QMessageBox::warning(this, _("Warning"),
- QString(_("Cannot read file %1:\n%2."))
- .arg(fileName)
- .arg(file.errorString()));
+ QMessageBox::warning(
+ this, tr("Warning"),
+ tr("Cannot read file %1:\n%2.").arg(fileName).arg(file.errorString()));
return false;
}
@@ -221,7 +219,7 @@ auto TextEdit::SlotSaveAs() -> bool {
path = tab_widget_->tabText(tab_widget_->currentIndex()).remove(0, 2);
}
- return save_file(QFileDialog::getSaveFileName(this, _("Save file"), path));
+ return save_file(QFileDialog::getSaveFileName(this, tr("Save file"), path));
}
void TextEdit::SlotCloseTab() {
@@ -282,13 +280,13 @@ bool TextEdit::maybe_save_current_tab(bool askToSave) {
const QString& file_path = page->GetFilePath();
if (askToSave) {
result = QMessageBox::warning(
- this, _("Unsaved document"),
- QString(_("The document \"%1\" has been modified. Do you want to "
- "save your changes?"))
+ this, tr("Unsaved document"),
+ tr("The document \"%1\" has been modified. Do you want to "
+ "save your changes?")
.arg(doc_name) +
- "<br/><b>" + _("Note:") + "</b>" +
- _("If you don't save these files, all changes are "
- "lost.") +
+ "<br/><b>" + tr("Note:") + "</b>" +
+ tr("If you don't save these files, all changes are "
+ "lost.") +
"<br/>",
QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
}
@@ -421,10 +419,9 @@ void TextEdit::SlotFillTextEditWithText(const QString& text) const {
void TextEdit::LoadFile(const QString& fileName) {
QFile file(fileName);
if (!file.open(QFile::ReadOnly | QFile::Text)) {
- QMessageBox::warning(this, _("Warning"),
- QString(_("Cannot read file %1:\n%2."))
- .arg(fileName)
- .arg(file.errorString()));
+ QMessageBox::warning(
+ this, tr("Warning"),
+ tr("Cannot read file %1:\n%2.").arg(fileName).arg(file.errorString()));
return;
}
QTextStream in(&file);
@@ -434,7 +431,7 @@ void TextEdit::LoadFile(const QString& fileName) {
SlotCurPageTextEdit()->SetFilePath(fileName);
tab_widget_->setTabText(tab_widget_->currentIndex(), stripped_name(fileName));
file.close();
- // statusBar()->showMessage(_("File loaded"), 2000);
+ // statusBar()->showMessage(tr("File loaded"), 2000);
}
QString TextEdit::stripped_name(const QString& full_file_name) {
@@ -460,10 +457,10 @@ void TextEdit::SlotPrint() {
if (document != nullptr) {
document->print(&printer);
} else {
- QMessageBox::warning(this, _("Warning"), _("No document to print"));
+ QMessageBox::warning(this, tr("Warning"), tr("No document to print"));
}
- // statusBar()->showMessage(_("Ready"), 2000);
+ // statusBar()->showMessage(tr("Ready"), 2000);
#endif
}
diff --git a/src/ui/widgets/VerifyKeyDetailBox.cpp b/src/ui/widgets/VerifyKeyDetailBox.cpp
index db81ffa8..c2dd74d3 100644
--- a/src/ui/widgets/VerifyKeyDetailBox.cpp
+++ b/src/ui/widgets/VerifyKeyDetailBox.cpp
@@ -50,18 +50,18 @@ VerifyKeyDetailBox::VerifyKeyDetailBox(const GpgSignature& signature,
.value("network/forbid_all_gnupg_connection", false)
.toBool();
- auto* import_button = new QPushButton(_("Import from keyserver"));
+ auto* import_button = new QPushButton(tr("Import from keyserver"));
import_button->setDisabled(forbid_all_gnupg_connection);
connect(import_button, &QPushButton::clicked, this,
&VerifyKeyDetailBox::slot_import_form_key_server);
- this->setTitle(QString(_("Key not present with id 0x")) + fpr_);
+ this->setTitle(tr("Key not present with id 0x") + fpr_);
auto* grid = new QGridLayout();
- grid->addWidget(new QLabel(QString(_("Status")) + _(":")), 0, 0);
- // grid->addWidget(new QLabel(_("Fingerprint:")), 1, 0);
- grid->addWidget(new QLabel(_("Key not present in key list")), 0, 1);
+ grid->addWidget(new QLabel(tr("Status") + tr(":")), 0, 0);
+ // grid->addWidget(new QLabel(tr("Fingerprint:")), 1, 0);
+ grid->addWidget(new QLabel(tr("Key not present in key list")), 0, 1);
// grid->addWidget(new QLabel(signature->fpr), 1, 1);
grid->addWidget(import_button, 2, 0, 2, 1);
@@ -69,14 +69,14 @@ VerifyKeyDetailBox::VerifyKeyDetailBox(const GpgSignature& signature,
break;
}
case GPG_ERR_NO_ERROR: {
- this->setTitle(QString(_("A Signature")) + ":");
+ this->setTitle(tr("A Signature") + ":");
auto* gird = create_key_info_grid(signature);
if (gird != nullptr) {
vbox->addLayout(gird);
} else {
- vbox->addWidget(new QLabel(_("Key Information is NOT Available")));
+ vbox->addWidget(new QLabel(tr("Key Information is NOT Available")));
if (!signature.GetFingerprint().isEmpty()) {
- vbox->addWidget(new QLabel(QString(_("Fingerprint")) + ": " +
+ vbox->addWidget(new QLabel(tr("Fingerprint") + ": " +
signature.GetFingerprint()));
}
}
@@ -84,15 +84,14 @@ VerifyKeyDetailBox::VerifyKeyDetailBox(const GpgSignature& signature,
}
case GPG_ERR_CERT_REVOKED: {
this->setTitle("An Error Signature");
- vbox->addWidget(
- new QLabel(QString(_("Status")) + ":" + _("Cert Revoked")));
+ vbox->addWidget(new QLabel(tr("Status") + ":" + tr("Cert Revoked")));
auto* gird = create_key_info_grid(signature);
if (gird != nullptr) {
vbox->addLayout(gird);
} else {
- vbox->addWidget(new QLabel(_("Key Information is NOT Available")));
+ vbox->addWidget(new QLabel(tr("Key Information is NOT Available")));
if (!signature.GetFingerprint().isEmpty()) {
- vbox->addWidget(new QLabel(QString(_("Fingerprint")) + ": " +
+ vbox->addWidget(new QLabel(tr("Fingerprint") + ": " +
signature.GetFingerprint()));
}
}
@@ -100,15 +99,14 @@ VerifyKeyDetailBox::VerifyKeyDetailBox(const GpgSignature& signature,
}
case GPG_ERR_SIG_EXPIRED: {
this->setTitle("An Error Signature");
- vbox->addWidget(
- new QLabel(QString(_("Status")) + ":" + _("Signature Expired")));
+ vbox->addWidget(new QLabel(tr("Status") + ":" + tr("Signature Expired")));
auto* gird = create_key_info_grid(signature);
if (gird != nullptr) {
vbox->addLayout(gird);
} else {
- vbox->addWidget(new QLabel(_("Key Information is NOT Available")));
+ vbox->addWidget(new QLabel(tr("Key Information is NOT Available")));
if (!signature.GetFingerprint().isEmpty()) {
- vbox->addWidget(new QLabel(QString(_("Fingerprint")) + ": " +
+ vbox->addWidget(new QLabel(tr("Fingerprint") + ": " +
signature.GetFingerprint()));
}
}
@@ -116,17 +114,15 @@ VerifyKeyDetailBox::VerifyKeyDetailBox(const GpgSignature& signature,
}
case GPG_ERR_KEY_EXPIRED: {
this->setTitle("An Error Signature");
- vbox->addWidget(
- new QLabel(QString(_("Status")) + ":" + _("Key Expired")));
- vbox->addWidget(
- new QLabel(QString(_("Status")) + ":" + _("Key Expired")));
+ vbox->addWidget(new QLabel(tr("Status") + ":" + tr("Key Expired")));
+ vbox->addWidget(new QLabel(tr("Status") + ":" + tr("Key Expired")));
auto* gird = create_key_info_grid(signature);
if (gird != nullptr) {
vbox->addLayout(gird);
} else {
- vbox->addWidget(new QLabel(_("Key Information is NOT Available")));
+ vbox->addWidget(new QLabel(tr("Key Information is NOT Available")));
if (!signature.GetFingerprint().isEmpty()) {
- vbox->addWidget(new QLabel(QString(_("Fingerprint")) + ": " +
+ vbox->addWidget(new QLabel(tr("Fingerprint") + ": " +
signature.GetFingerprint()));
}
}
@@ -134,15 +130,14 @@ VerifyKeyDetailBox::VerifyKeyDetailBox(const GpgSignature& signature,
}
case GPG_ERR_GENERAL: {
this->setTitle("An Error Signature");
- vbox->addWidget(
- new QLabel(QString(_("Status")) + ":" + _("General Error")));
+ vbox->addWidget(new QLabel(tr("Status") + ":" + tr("General Error")));
auto* gird = create_key_info_grid(signature);
if (gird != nullptr) {
vbox->addLayout(gird);
} else {
- vbox->addWidget(new QLabel(_("Key Information is NOT Available")));
+ vbox->addWidget(new QLabel(tr("Key Information is NOT Available")));
if (!signature.GetFingerprint().isEmpty()) {
- vbox->addWidget(new QLabel(QString(_("Fingerprint")) + ": " +
+ vbox->addWidget(new QLabel(tr("Fingerprint") + ": " +
signature.GetFingerprint()));
}
}
@@ -150,14 +145,14 @@ VerifyKeyDetailBox::VerifyKeyDetailBox(const GpgSignature& signature,
}
default: {
this->setTitle("An Error Signature");
- this->setTitle(QString(_("Status")) + ":" + _("Unknown Error "));
+ this->setTitle(tr("Status") + ":" + tr("Unknown Error "));
auto* gird = create_key_info_grid(signature);
if (gird != nullptr) {
vbox->addLayout(gird);
} else {
- vbox->addWidget(new QLabel(_("Key Information is NOT Available")));
+ vbox->addWidget(new QLabel(tr("Key Information is NOT Available")));
if (!signature.GetFingerprint().isEmpty()) {
- vbox->addWidget(new QLabel(QString(_("Fingerprint")) + ": " +
+ vbox->addWidget(new QLabel(tr("Fingerprint") + ": " +
signature.GetFingerprint()));
}
}
@@ -180,45 +175,45 @@ auto VerifyKeyDetailBox::create_key_info_grid(const GpgSignature& signature)
auto key = GpgKeyGetter::GetInstance().GetKey(fpr_);
if (!key.IsGood()) return nullptr;
- grid->addWidget(new QLabel(QString(_("Signer Name")) + ":"), 0, 0);
- grid->addWidget(new QLabel(QString(_("Signer Email")) + ":"), 1, 0);
- grid->addWidget(new QLabel(QString(_("Key's Fingerprint")) + ":"), 2, 0);
- grid->addWidget(new QLabel(QString(_("Valid")) + ":"), 3, 0);
- grid->addWidget(new QLabel(QString(_("Flags")) + ":"), 4, 0);
+ grid->addWidget(new QLabel(tr("Signer Name") + ":"), 0, 0);
+ grid->addWidget(new QLabel(tr("Signer Email") + ":"), 1, 0);
+ grid->addWidget(new QLabel(tr("Key's Fingerprint") + ":"), 2, 0);
+ grid->addWidget(new QLabel(tr("Valid") + ":"), 3, 0);
+ grid->addWidget(new QLabel(tr("Flags") + ":"), 4, 0);
grid->addWidget(new QLabel(key.GetName()), 0, 1);
grid->addWidget(new QLabel(key.GetEmail()), 1, 1);
grid->addWidget(new QLabel(BeautifyFingerprint(fpr_)), 2, 1);
if ((signature.GetSummary() & GPGME_SIGSUM_VALID) != 0U) {
- grid->addWidget(new QLabel(_("Fully Valid")), 3, 1);
+ grid->addWidget(new QLabel(tr("Fully Valid")), 3, 1);
} else {
- grid->addWidget(new QLabel(_("NOT Fully Valid")), 3, 1);
+ grid->addWidget(new QLabel(tr("NOT Fully Valid")), 3, 1);
}
QString buffer;
QTextStream text_stream(&buffer);
if ((signature.GetSummary() & GPGME_SIGSUM_GREEN) != 0U) {
- text_stream << _("Good") << " ";
+ text_stream << tr("Good") << " ";
}
if ((signature.GetSummary() & GPGME_SIGSUM_RED) != 0U) {
- text_stream << _("Bad") << " ";
+ text_stream << tr("Bad") << " ";
}
if ((signature.GetSummary() & GPGME_SIGSUM_SIG_EXPIRED) != 0U) {
- text_stream << _("Expired") << " ";
+ text_stream << tr("Expired") << " ";
}
if ((signature.GetSummary() & GPGME_SIGSUM_KEY_MISSING) != 0U) {
- text_stream << _("Missing Key") << " ";
+ text_stream << tr("Missing Key") << " ";
}
if ((signature.GetSummary() & GPGME_SIGSUM_KEY_REVOKED) != 0U) {
- text_stream << _("Revoked Key") << " ";
+ text_stream << tr("Revoked Key") << " ";
}
if ((signature.GetSummary() & GPGME_SIGSUM_KEY_EXPIRED) != 0U) {
- text_stream << _("Expired Key") << " ";
+ text_stream << tr("Expired Key") << " ";
}
if ((signature.GetSummary() & GPGME_SIGSUM_CRL_MISSING) != 0U) {
- text_stream << _("Missing CRL") << " ";
+ text_stream << tr("Missing CRL") << " ";
}
grid->addWidget(new QLabel(text_stream.readAll()), 4, 1);
diff --git a/ui/FilePage.ui b/ui/FilePage.ui
index 279c5cf3..70028e16 100644
--- a/ui/FilePage.ui
+++ b/ui/FilePage.ui
@@ -78,7 +78,7 @@
</property>
<property name="icon">
<iconset resource="../gpgfrontend.qrc">
- <normaloff>:/new_directory.png</normaloff>:/new_directory.png</iconset>
+ <normaloff>:/icons/new_directory.png</normaloff>:/icons/new_directory.png</iconset>
</property>
</widget>
</item>
@@ -114,7 +114,7 @@
</property>
<property name="icon">
<iconset resource="../gpgfrontend.qrc">
- <normaloff>:/refresh.png</normaloff>:/refresh.png</iconset>
+ <normaloff>:/icons/refresh.png</normaloff>:/icons/refresh.png</iconset>
</property>
</widget>
</item>
@@ -131,7 +131,7 @@
</property>
<property name="icon">
<iconset resource="../gpgfrontend.qrc">
- <normaloff>:/up.png</normaloff>:/up.png</iconset>
+ <normaloff>:/icons/up.png</normaloff>:/icons/up.png</iconset>
</property>
</widget>
</item>
@@ -148,7 +148,7 @@
</property>
<property name="icon">
<iconset resource="../gpgfrontend.qrc">
- <normaloff>:/configure.png</normaloff>:/configure.png</iconset>
+ <normaloff>:/icons/configure.png</normaloff>:/icons/configure.png</iconset>
</property>
<property name="popupMode">
<enum>QToolButton::InstantPopup</enum>
diff --git a/ui/GnuPGInfo.ui b/ui/GnuPGInfo.ui
index efb895af..0ea5385f 100644
--- a/ui/GnuPGInfo.ui
+++ b/ui/GnuPGInfo.ui
@@ -43,7 +43,7 @@
<string/>
</property>
<property name="pixmap">
- <pixmap resource="../gpgfrontend.qrc">:/gnupg.png</pixmap>
+ <pixmap resource="../gpgfrontend.qrc">:/icons/gnupg.png</pixmap>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
diff --git a/ui/InfoBoard.ui b/ui/InfoBoard.ui
index 8f3bb1c8..9e50505d 100644
--- a/ui/InfoBoard.ui
+++ b/ui/InfoBoard.ui
@@ -78,7 +78,7 @@
</property>
<property name="icon">
<iconset resource="../gpgfrontend.qrc">
- <normaloff>:/copy.png</normaloff>:/copy.png</iconset>
+ <normaloff>:/icons/copy.png</normaloff>:/icons/copy.png</iconset>
</property>
<property name="autoRaise">
<bool>false</bool>
@@ -95,7 +95,7 @@
</property>
<property name="icon">
<iconset resource="../gpgfrontend.qrc">
- <normaloff>:/filesave.png</normaloff>:/filesave.png</iconset>
+ <normaloff>:/icons/filesave.png</normaloff>:/icons/filesave.png</iconset>
</property>
</widget>
</item>
@@ -109,7 +109,7 @@
</property>
<property name="icon">
<iconset resource="../gpgfrontend.qrc">
- <normaloff>:/clear.png</normaloff>:/clear.png</iconset>
+ <normaloff>:/icons/clear.png</normaloff>:/icons/clear.png</iconset>
</property>
</widget>
</item>
diff --git a/ui/KeyList.ui b/ui/KeyList.ui
index 7aff96a5..afccdcf6 100644
--- a/ui/KeyList.ui
+++ b/ui/KeyList.ui
@@ -46,7 +46,7 @@
</property>
<property name="icon">
<iconset resource="../gpgfrontend.qrc">
- <normaloff>:/refresh.png</normaloff>:/refresh.png</iconset>
+ <normaloff>:/icons/refresh.png</normaloff>:/icons/refresh.png</iconset>
</property>
</widget>
</item>
@@ -60,7 +60,7 @@
</property>
<property name="icon">
<iconset resource="../gpgfrontend.qrc">
- <normaloff>:/cloud_sync.png</normaloff>:/cloud_sync.png</iconset>
+ <normaloff>:/icons/cloud_sync.png</normaloff>:/icons/cloud_sync.png</iconset>
</property>
</widget>
</item>
@@ -74,7 +74,7 @@
</property>
<property name="icon">
<iconset resource="../gpgfrontend.qrc">
- <normaloff>:/total_selection.png</normaloff>:/total_selection.png</iconset>
+ <normaloff>:/icons/total_selection.png</normaloff>:/icons/total_selection.png</iconset>
</property>
</widget>
</item>
@@ -88,7 +88,7 @@
</property>
<property name="icon">
<iconset resource="../gpgfrontend.qrc">
- <normaloff>:/none.png</normaloff>:/none.png</iconset>
+ <normaloff>:/icons/none.png</normaloff>:/icons/none.png</iconset>
</property>
</widget>
</item>