Files
update-client/i18n/update-client_zh_CN.ts

1654 lines
84 KiB
XML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="zh_CN">
<context>
<name>Bootstrap</name>
<message>
<location filename="../Bootstrap/main.cpp" line="22"/>
<source>Update Handoff Failed</source>
<translation>更新交接失败</translation>
</message>
<message>
<location filename="../Bootstrap/main.cpp" line="139"/>
<source>Bootstrap arguments are incomplete.</source>
<translation>Bootstrap 启动参数不完整。</translation>
</message>
<message>
<location filename="../Bootstrap/main.cpp" line="158"/>
<source>The update plan is missing or invalid.</source>
<translation>更新计划文件缺失或格式无效。</translation>
</message>
<message>
<location filename="../Bootstrap/main.cpp" line="195"/>
<source>Cannot restart Updater.</source>
<translation>无法重新启动 Updater。</translation>
</message>
<message>
<location filename="../Bootstrap/main.cpp" line="197"/>
<source>
Failed file: %1</source>
<translation>
失败文件:%1</translation>
</message>
</context>
<context>
<name>ConfigHelper</name>
<message>
<location filename="../Common/ConfigHelper.cpp" line="219"/>
<source>The user canceled the administrator permission confirmation.</source>
<translation>用户取消了管理员权限确认。</translation>
</message>
<message>
<location filename="../Common/ConfigHelper.cpp" line="220"/>
<source>Windows error %1</source>
<translation>Windows 错误 %1</translation>
</message>
<message>
<location filename="../Common/ConfigHelper.cpp" line="230"/>
<source>Administrator Permission Required</source>
<translation>需要管理员权限</translation>
</message>
<message>
<location filename="../Common/ConfigHelper.cpp" line="231"/>
<source>The current operation needs administrator permission to modify a protected file.
Target file: %1
Reason: %2
Click OK, then choose Yes in the Windows permission confirmation dialog.</source>
<translation>当前操作需要管理员权限来修改受保护文件。
目标文件:%1
原因:%2
点击“确定”,然后在 Windows 权限确认窗口中选择“是”。</translation>
</message>
<message>
<location filename="../Common/ConfigHelper.cpp" line="238"/>
<source>The user canceled the administrator permission request.</source>
<translation>用户取消了管理员权限请求。</translation>
</message>
</context>
<context>
<name>DeviceIdentityHelper</name>
<message>
<location filename="../Common/DeviceIdentityHelper.cpp" line="54"/>
<source>OpenSSL is unavailable, so device credential signature cannot be verified.</source>
<translation>当前程序未启用 OpenSSL,无法验证设备凭证签名。</translation>
</message>
<message>
<location filename="../Common/DeviceIdentityHelper.cpp" line="62"/>
<source>Device public key is missing: %1</source>
<translation>设备凭证公钥缺失:%1</translation>
</message>
<message>
<location filename="../Common/DeviceIdentityHelper.cpp" line="73"/>
<source>Device public key is invalid: %1</source>
<translation>设备凭证公钥无效:%1</translation>
</message>
<message>
<location filename="../Common/DeviceIdentityHelper.cpp" line="93"/>
<source>Device credential signature is invalid. The local identity file may not match this server.</source>
<translation>设备凭证签名无效。本机身份文件可能不是当前服务器签发的。</translation>
</message>
<message>
<location filename="../Common/DeviceIdentityHelper.cpp" line="118"/>
<source>Device credential file is not valid JSON: %1</source>
<translation>设备凭证文件不是合法 JSON%1</translation>
</message>
<message>
<location filename="../Common/DeviceIdentityHelper.cpp" line="142"/>
<source>Device credential does not match this application, channel, license, installation or device.</source>
<translation>设备凭证与当前应用、渠道、License、安装实例或设备不匹配。</translation>
</message>
<message>
<location filename="../Common/DeviceIdentityHelper.cpp" line="149"/>
<source>License has expired. Please ask the administrator to issue a new License.</source>
<translation>License 已过期。请联系管理员重新签发 License。</translation>
</message>
<message>
<location filename="../Common/DeviceIdentityHelper.cpp" line="182"/>
<source>app_id is empty in app_config.json.</source>
<translation>app_config.json 中的 app_id 为空。</translation>
</message>
<message>
<location filename="../Common/DeviceIdentityHelper.cpp" line="186"/>
<source>channel is empty in app_config.json.</source>
<translation>app_config.json 中的 channel 为空。</translation>
</message>
<message>
<location filename="../Common/DeviceIdentityHelper.cpp" line="190"/>
<source>Server address is not configured. Set config/server_config.json before building Launcher, for example: http://192.168.229.128:8000</source>
<translation>服务端地址未配置。请先设置 config/server_config.json,再重新编译 Launcher。例如:http://192.168.229.128:8000</translation>
</message>
<message>
<location filename="../Common/DeviceIdentityHelper.cpp" line="196"/>
<source>client_token is empty. Copy the client_token generated by the admin page into app_config.json.</source>
<translation>client_token 为空。请把管理后台生成的 client_token 复制到 app_config.json。</translation>
</message>
<message>
<location filename="../Common/DeviceIdentityHelper.cpp" line="202"/>
<source>License is empty. Create or select a License in the admin page, then copy the generated client configuration.</source>
<translation>License 为空。请先在管理后台创建或选择 License,然后复制生成的客户端配置。</translation>
</message>
<message>
<location filename="../Common/DeviceIdentityHelper.cpp" line="213"/>
<source>Cannot save installation id to %1: %2</source>
<translation>无法保存安装实例 ID 到 %1%2</translation>
</message>
<message>
<location filename="../Common/DeviceIdentityHelper.cpp" line="277"/>
<source>Cannot contact the update server to issue device identity.
Server: %1
App: %2
Channel: %3
Network error: %4
Timeout: %5 ms</source>
<translation>无法连接更新服务器来签发设备身份。
服务器:%1
App%2
渠道:%3
网络错误:%4
超时时间:%5 毫秒</translation>
</message>
<message>
<location filename="../Common/DeviceIdentityHelper.cpp" line="282"/>
<source>Device identity request was rejected by the update server.
Server: %1
HTTP status: %2
App: %3
Channel: %4
Server message: %5</source>
<translation>设备身份请求被更新服务器拒绝。
服务器:%1
HTTP 状态码:%2
App%3
渠道:%4
服务端消息:%5</translation>
</message>
<message>
<location filename="../Common/DeviceIdentityHelper.cpp" line="286"/>
<source>&lt;empty response&gt;</source>
<translation>&lt;空响应&gt;</translation>
</message>
<message>
<location filename="../Common/DeviceIdentityHelper.cpp" line="295"/>
<source>Server returned an invalid device identity response.</source>
<translation>服务端返回的设备身份响应格式无效。</translation>
</message>
<message>
<location filename="../Common/DeviceIdentityHelper.cpp" line="310"/>
<source>Cannot save device credential to %1: %2</source>
<translation>无法保存设备凭证到 %1%2</translation>
</message>
<message>
<location filename="../Common/DeviceIdentityHelper.cpp" line="318"/>
<source>Cannot save server device id to %1: %2</source>
<translation>无法保存服务端设备 ID 到 %1:%2</translation>
</message>
</context>
<context>
<name>IntegrityHelper</name>
<message>
<location filename="../Common/IntegrityHelper.cpp" line="64"/>
<source>Cannot verify signed manifest because OpenSSL support is unavailable. Stage: installed version verification.</source>
<translation>无法验证签名 Manifest,因为当前程序未启用 OpenSSL。阶段:已安装版本校验。</translation>
</message>
<message>
<location filename="../Common/IntegrityHelper.cpp" line="73"/>
<source>Cannot open manifest public key. Stage: installed version verification. Public key path: %1.</source>
<translation>无法打开 Manifest 公钥。阶段:已安装版本校验。公钥路径:%1。</translation>
</message>
<message>
<location filename="../Common/IntegrityHelper.cpp" line="83"/>
<source>Manifest public key is invalid. Stage: installed version verification. Public key path: %1.</source>
<translation>Manifest 公钥无效。阶段:已安装版本校验。公钥路径:%1。</translation>
</message>
<message>
<location filename="../Common/IntegrityHelper.cpp" line="96"/>
<source>Manifest RSA signature is invalid. Stage: installed version verification. This usually means the cached manifest was changed, the client public key does not match the server private key, or the wrong version cache is being used.</source>
<translation>Manifest RSA 签名无效。阶段:已安装版本校验。通常表示本地缓存的 Manifest 被改过、客户端公钥与服务端私钥不匹配,或正在使用错误版本的缓存。</translation>
</message>
<message>
<location filename="../Common/IntegrityHelper.cpp" line="117"/>
<source>Local signed manifest cache is missing. Stage: installed version verification. Version: %1. Expected cache file: %2. This cache is created after the same version is published or installed successfully.</source>
<translation>本地签名 Manifest 缓存缺失。阶段:已安装版本校验。版本:%1。期望缓存文件:%2。该缓存会在同版本发布或安装成功后生成。</translation>
</message>
<message>
<location filename="../Common/IntegrityHelper.cpp" line="125"/>
<source>Local signed manifest cache is not valid JSON. Stage: installed version verification. Version: %1. File: %2. JSON error: %3.</source>
<translation>本地签名 Manifest 缓存不是合法 JSON。阶段:已安装版本校验。版本:%1。文件:%2。JSON 错误:%3。</translation>
</message>
<message>
<location filename="../Common/IntegrityHelper.cpp" line="134"/>
<source>Local signed manifest cache is incomplete. Stage: installed version verification. Version: %1. File: %2.</source>
<translation>本地签名 Manifest 缓存不完整。阶段:已安装版本校验。版本:%1。文件:%2。</translation>
</message>
<message>
<location filename="../Common/IntegrityHelper.cpp" line="144"/>
<source>Signed manifest payload is not valid JSON. Stage: installed version verification. Version: %1. File: %2. JSON error: %3.</source>
<translation>签名 Manifest 内容不是合法 JSON。阶段:已安装版本校验。版本:%1。文件:%2。JSON 错误:%3。</translation>
</message>
<message>
<location filename="../Common/IntegrityHelper.cpp" line="153"/>
<source>Local signed manifest identity does not match this application. Stage: installed version verification. Expected app/channel/version: %1 / %2 / %3. Manifest app/channel/version: %4 / %5 / %6.</source>
<translation>本地签名 Manifest 身份与当前应用不匹配。阶段:已安装版本校验。期望 app/channel/version%1 / %2 / %3。Manifest 中的 app/channel/version%4 / %5 / %6。</translation>
</message>
<message>
<location filename="../Common/IntegrityHelper.cpp" line="167"/>
<source>Signed manifest contains an unsafe file path. Stage: installed version verification. Version: %1. Path: %2.</source>
<translation>签名 Manifest 包含不安全文件路径。阶段:已安装版本校验。版本:%1。路径:%2。</translation>
</message>
<message>
<location filename="../Common/IntegrityHelper.cpp" line="175"/>
<source>A required installed file is missing. Stage: installed version verification. Version: %1. Manifest path: %2. Checked path: %3. The local installation no longer matches the published version.</source>
<translation>缺少必需的已安装文件。阶段:已安装版本校验。版本:%1。Manifest 路径:%2。检查路径:%3。本地安装目录已不再匹配发布版本。</translation>
</message>
<message>
<location filename="../Common/IntegrityHelper.cpp" line="183"/>
<source>Installed file SHA-256 does not match the local signed manifest. Stage: installed version verification. Version: %1. Manifest path: %2. Local path: %3.
Expected SHA-256: %4
Actual SHA-256: %5
This means the installed file is different from the version that was published or installed. If this is a developer test machine, check whether the local Release directory was recompiled or overwritten after publishing.</source>
<translation>已安装文件的 SHA-256 与本地签名 Manifest 不一致。阶段:已安装版本校验。版本:%1。Manifest 路径:%2。本地路径:%3。
期望 SHA-256%4
实际 SHA-256%5
这表示当前安装目录里的文件和当初发布或安装成功的版本不同。如果这是开发测试机器,请检查发布后是否又重新编译或覆盖了本地 Release 目录。</translation>
</message>
<message>
<location filename="../Common/IntegrityHelper.cpp" line="186"/>
<source>&lt;cannot read file&gt;</source>
<translation>&lt;无法读取文件&gt;</translation>
</message>
<message>
<location filename="../Common/IntegrityHelper.cpp" line="209"/>
<source>An executable or DLL exists locally but is not declared in the signed manifest. Stage: installed version verification. Version: %1. Extra file: %2. Remove unexpected executable/plugin files or publish a new version that declares them.</source>
<translation>本地存在签名 Manifest 未声明的 EXE 或 DLL。阶段:已安装版本校验。版本:%1。额外文件:%2。请删除异常的可执行文件/插件,或发布一个声明这些文件的新版本。</translation>
</message>
</context>
<context>
<name>Launcher</name>
<message>
<location filename="../Launcher/main.cpp" line="32"/>
<source>Checking for software updates...</source>
<translation>正在检查软件更新...</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="33"/>
<source>Marsco Launcher</source>
<translation>Marsco 软件启动器</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="63"/>
<source>Please enter the License for %1:</source>
<translation>请输入 %1 的授权 License</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="64"/>
<location filename="../Launcher/main.cpp" line="66"/>
<source>the application</source>
<translation>软件</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="65"/>
<source>%1
Please enter a new License for %2:</source>
<translation>%1
请重新输入 %2 的授权 License:</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="69"/>
<source>Enter License</source>
<translation>输入 License</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="77"/>
<source>License Required</source>
<translation>需要 License</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="78"/>
<source>A License provided by the administrator is required for the first launch.</source>
<translation>首次启动需要输入管理员提供的 License。</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="83"/>
<source>License Cannot Be Empty</source>
<translation>License 不能为空</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="84"/>
<source>Please paste the License created in the admin page.</source>
<translation>请粘贴管理员在后台创建的 License。</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="90"/>
<source>Failed to Save License</source>
<translation>保存 License 失败</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="91"/>
<source>Cannot write the configuration file:
%1
%2</source>
<translation>无法写入配置文件:
%1
%2</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="95"/>
<source>Verifying License...</source>
<translation>正在验证 License...</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="120"/>
<source>Device Authentication Failed</source>
<translation>设备身份验证失败</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="125"/>
<source>The current License cannot be used: %1</source>
<translation>当前 License 无法使用:%1</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="147"/>
<source>The device or License authorization is invalid.</source>
<translation>设备或 License 授权无效。</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="151"/>
<source>The current authorization was rejected by the server: %1</source>
<translation>当前授权被服务端拒绝:%1</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="155"/>
<source>License Saved</source>
<translation>License 已保存</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="156"/>
<source>Please restart Launcher to complete device authorization and update checking.</source>
<translation>请重新启动 Launcher 完成设备授权和更新检查。</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="161"/>
<source>Authorization Rejected</source>
<translation>授权被拒绝</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="176"/>
<source>Select Offline Update Package</source>
<translation>选择离线更新包</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="178"/>
<source>Marsco offline update package (*.upd)</source>
<translation>Marsco 离线更新包 (*.upd)</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="184"/>
<source>Cannot import the offline update package because the updater executable does not exist.
Updater: %1
Offline package: %2</source>
<translation>无法导入离线更新包,因为 Updater 可执行文件不存在。
Updater%1
离线包:%2</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="193"/>
<source>Cannot start the updater for offline package import.
Updater: %1
Offline package: %2
Check file permissions and dependent DLLs/shared libraries.</source>
<translation>无法启动 Updater 导入离线更新包。
Updater%1
离线包:%2
请检查文件权限和依赖 DLL/共享库。</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="206"/>
<location filename="../Launcher/main.cpp" line="394"/>
<source>Offline Update</source>
<translation>离线更新</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="207"/>
<source>No offline update package was selected.</source>
<translation>未选择离线更新包。</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="217"/>
<source>Cannot start the main application because the executable file does not exist.
Executable: %1
Check main_executable and install_root in the generated client configuration.</source>
<translation>无法启动主程序,因为主程序文件不存在。
可执行文件:%1
请检查生成的客户端配置中的 main_executable 和 install_root。</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="228"/>
<source>Cannot start the main application because the one-time launch ticket could not be created.
Executable: %1
Details: %2</source>
<translation>无法启动主程序,因为一次性启动 ticket 创建失败。
可执行文件:%1
详细信息:%2</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="238"/>
<source>Cannot start the main application process.
Executable: %1
Ticket file: %2
Check file permissions, dependent DLLs/shared libraries, and whether the executable can run independently.</source>
<translation>无法启动主程序进程。
可执行文件:%1
Ticket 文件:%2
请检查文件权限、依赖 DLL/共享库,以及该可执行文件是否能独立运行。</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="246"/>
<source>Verifying local runtime policy...</source>
<translation>正在验证本地运行策略...</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="254"/>
<location filename="../Launcher/main.cpp" line="262"/>
<location filename="../Launcher/main.cpp" line="281"/>
<source>Cannot Start</source>
<translation>无法启动</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="255"/>
<source>The local version policy is invalid: %1</source>
<translation>本地版本策略无效:%1</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="263"/>
<source>The local version policy has expired. Please connect to the network or contact the administrator.</source>
<translation>本地版本策略已过期,请连接网络或联系管理员。</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="270"/>
<source>Current Version Cannot Run</source>
<translation>当前版本不可运行</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="271"/>
<source>The current version %1 has been disabled by the administrator.</source>
<translation>当前版本 %1 已被管理员停用。</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="282"/>
<source>Cannot read the local state: %1</source>
<translation>无法读取本地状态:%1</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="289"/>
<location filename="../Launcher/main.cpp" line="297"/>
<source>Security Check Failed</source>
<translation>安全检查失败</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="290"/>
<source>A version policy sequence rollback was detected. Startup has been blocked.</source>
<translation>检测到版本策略序列回退,已阻止启动。</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="298"/>
<source>A possible system time rollback was detected. Startup has been blocked.</source>
<translation>检测到系统时间可能被回拨,已阻止启动。</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="304"/>
<source>Generating Git tag list...</source>
<translation>正在生成 Git 标签清单...</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="311"/>
<source>Git Tag List Failed</source>
<translation>Git 标签清单生成失败</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="312"/>
<source>Cannot generate tags.txt, but startup will continue:
%1</source>
<translation>无法生成 tags.txt,但启动会继续:
%1</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="322"/>
<source>Version Rollback</source>
<translation>版本回退</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="323"/>
<source>Update Required</source>
<translation>必须更新</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="323"/>
<source>New Version Available</source>
<translation>发现新版本</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="326"/>
<source>The administrator provided version %1 as the rollback target. Downgrade now?</source>
<translation>管理员提供了版本 %1 作为回退目标,是否现在降级?</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="327"/>
<source>Version %1 is available. Update now?</source>
<translation>发现新版本 %1,是否现在更新?</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="328"/>
<source>
Target version: %1</source>
<translation>
目标版本:%1</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="339"/>
<location filename="../Launcher/main.cpp" line="418"/>
<source>Startup Failed</source>
<translation>启动失败</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="341"/>
<location filename="../Launcher/main.cpp" line="420"/>
<source>Cannot start the main application: %1</source>
<translation>无法启动主程序:%1</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="352"/>
<source>Cannot start the updater because the executable file does not exist.
Executable: %1
Check updater_executable and install_root in the generated client configuration.</source>
<translation>无法启动 Updater,因为 Updater 可执行文件不存在。
可执行文件:%1
请检查生成的客户端配置中的 updater_executable 和 install_root。</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="362"/>
<source>Cannot start the updater process.
Executable: %1
Arguments: %2
Check file permissions, dependent DLLs/shared libraries, and whether the updater can run independently.</source>
<translation>无法启动 Updater 进程。
可执行文件:%1
参数:%2
请检查文件权限、依赖 DLL/共享库,以及 Updater 是否能独立运行。</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="183"/>
<location filename="../Launcher/main.cpp" line="192"/>
<location filename="../Launcher/main.cpp" line="351"/>
<location filename="../Launcher/main.cpp" line="361"/>
<source>Updater Startup Failed</source>
<translation>更新器启动失败</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="373"/>
<source>Caching signed version manifest...</source>
<translation>正在缓存签名版本清单...</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="380"/>
<source>Manifest Cache Failed</source>
<translation>清单缓存失败</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="381"/>
<source>Cannot cache the signed manifest for the current version: %1</source>
<translation>无法缓存当前版本的签名清单:%1</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="389"/>
<source>Server Unavailable</source>
<translation>服务器不可用</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="390"/>
<source>Cannot connect to the update server. Import an offline update package?</source>
<translation>当前无法连接更新服务器。是否导入离线更新包?</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="395"/>
<source>No offline update package was selected, or the updater could not be started.</source>
<translation>未选择离线更新包或无法启动更新器。</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="405"/>
<source>Network Unavailable</source>
<translation>网络不可用</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="406"/>
<source>Cannot connect to the update server, and the current policy does not allow offline startup.</source>
<translation>无法连接更新服务器,且当前策略不允许离线启动。</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="411"/>
<source>The application is up to date. Starting...</source>
<translation>当前已是最新版本,正在启动...</translation>
</message>
<message>
<location filename="../Launcher/main.cpp" line="412"/>
<source>Offline mode is active. Starting...</source>
<translation>当前处于离线模式,正在启动...</translation>
</message>
</context>
<context>
<name>LocalStateHelper</name>
<message>
<location filename="../Common/LocalStateHelper.cpp" line="35"/>
<source>Cannot create local state file: %1. Error: %2.</source>
<translation>无法创建本地状态文件:%1。错误:%2。</translation>
</message>
<message>
<location filename="../Common/LocalStateHelper.cpp" line="46"/>
<source>Cannot open local state file: %1. Error: %2.</source>
<translation>无法打开本地状态文件:%1。错误:%2。</translation>
</message>
<message>
<location filename="../Common/LocalStateHelper.cpp" line="60"/>
<source>Local state file is not valid JSON. File: %1. JSON error: %2.</source>
<translation>本地状态文件不是合法 JSON。文件:%1。JSON 错误:%2。</translation>
</message>
<message>
<location filename="../Common/LocalStateHelper.cpp" line="76"/>
<source>Local state has not been loaded.</source>
<translation>本地状态尚未加载。</translation>
</message>
<message>
<location filename="../Common/LocalStateHelper.cpp" line="86"/>
<source>Cannot save local state file: %1. Error: %2.</source>
<translation>无法保存本地状态文件:%1。错误:%2。</translation>
</message>
</context>
<context>
<name>PolicyHelper</name>
<message>
<location filename="../Common/PolicyHelper.cpp" line="36"/>
<source>Cannot open signed version policy file: %1. Error: %2.</source>
<translation>无法打开签名版本策略文件:%1。错误:%2。</translation>
</message>
<message>
<location filename="../Common/PolicyHelper.cpp" line="45"/>
<source>Signed version policy is not valid JSON. File: %1. JSON error: %2.</source>
<translation>签名版本策略不是合法 JSON。文件:%1。JSON 错误:%2。</translation>
</message>
<message>
<location filename="../Common/PolicyHelper.cpp" line="66"/>
<source>Cannot save signed version policy file: %1. Error: %2.</source>
<translation>无法保存签名版本策略文件:%1。错误:%2。</translation>
</message>
<message>
<location filename="../Common/PolicyHelper.cpp" line="105"/>
<source>OpenSSL is unavailable, so the signed version policy cannot be verified.</source>
<translation>当前程序未启用 OpenSSL,无法验证签名版本策略。</translation>
</message>
<message>
<location filename="../Common/PolicyHelper.cpp" line="113"/>
<source>Cannot open version policy public key: %1. Error: %2.</source>
<translation>无法打开版本策略公钥:%1。错误:%2。</translation>
</message>
<message>
<location filename="../Common/PolicyHelper.cpp" line="124"/>
<source>Version policy public key is invalid: %1.</source>
<translation>版本策略公钥无效:%1。</translation>
</message>
<message>
<location filename="../Common/PolicyHelper.cpp" line="137"/>
<source>Version policy RSA signature is invalid. The policy file may have been changed, or the public key does not match the server private key.</source>
<translation>版本策略 RSA 签名无效。策略文件可能被修改,或客户端公钥与服务端私钥不匹配。</translation>
</message>
<message>
<location filename="../Common/PolicyHelper.cpp" line="148"/>
<source>Version policy has not been loaded.</source>
<translation>版本策略尚未加载。</translation>
</message>
<message>
<location filename="../Common/PolicyHelper.cpp" line="155"/>
<source>Version policy is missing required field: %1.</source>
<translation>版本策略缺少必填字段:%1。</translation>
</message>
<message>
<location filename="../Common/PolicyHelper.cpp" line="163"/>
<source>Version policy signature algorithm is unsupported: %1.</source>
<translation>版本策略签名算法不支持:%1。</translation>
</message>
</context>
<context>
<name>TicketHelper</name>
<message>
<location filename="../Common/TicketHelper.cpp" line="33"/>
<source>Cannot create launch ticket because required fields are empty: %1. Check app_config.json, registry-imported configuration and device authorization.</source>
<translation>无法创建启动 ticket,因为必填字段为空:%1。请检查 app_config.json、已导入注册表的配置和设备授权状态。</translation>
</message>
<message>
<location filename="../Common/TicketHelper.cpp" line="52"/>
<source>Cannot create launch ticket directory: %1.</source>
<translation>无法创建启动 ticket 目录:%1。</translation>
</message>
<message>
<location filename="../Common/TicketHelper.cpp" line="64"/>
<source>Cannot save launch ticket file: %1. Error: %2.</source>
<translation>无法保存启动 ticket 文件:%1。错误:%2。</translation>
</message>
<message>
<location filename="../Common/TicketHelper.cpp" line="86"/>
<source>Launch ticket is missing or has already been consumed. Ticket file: %1. Please start the application from Launcher.</source>
<translation>启动 ticket 缺失或已经被消费。Ticket 文件:%1。请从 Launcher 启动主程序。</translation>
</message>
<message>
<location filename="../Common/TicketHelper.cpp" line="97"/>
<source>Cannot read claimed launch ticket: %1. Error: %2.</source>
<translation>无法读取已声明占用的启动 ticket:%1。错误:%2。</translation>
</message>
<message>
<location filename="../Common/TicketHelper.cpp" line="110"/>
<source>Launch ticket is not valid JSON. JSON error: %1.</source>
<translation>启动 ticket 不是合法 JSON。JSON 错误:%1。</translation>
</message>
<message>
<location filename="../Common/TicketHelper.cpp" line="128"/>
<source>Launch ticket signature is invalid. The launch_token used by Launcher and the main application is inconsistent, or the ticket content was changed.</source>
<translation>启动 ticket 签名无效。Launcher 和主程序使用的 launch_token 不一致,或 ticket 内容被修改过。</translation>
</message>
<message>
<location filename="../Common/TicketHelper.cpp" line="136"/>
<source>Launch ticket app_id does not match. Ticket app_id: %1. Expected app_id: %2.</source>
<translation>启动 ticket 的 app_id 不匹配。Ticket app_id%1。期望 app_id%2。</translation>
</message>
<message>
<location filename="../Common/TicketHelper.cpp" line="145"/>
<source>Launch ticket device_id does not match. Ticket device_id: %1. Expected device_id: %2. Reauthorize the device from Launcher if the configuration was regenerated.</source>
<translation>启动 ticket 的 device_id 不匹配。Ticket device_id%1。期望 device_id:%2。如果刚重新生成过配置,请通过 Launcher 重新授权设备。</translation>
</message>
<message>
<location filename="../Common/TicketHelper.cpp" line="154"/>
<source>Launch ticket version does not match. Ticket version: %1. Expected version: %2.</source>
<translation>启动 ticket 的版本号不匹配。Ticket 版本:%1。期望版本:%2。</translation>
</message>
<message>
<location filename="../Common/TicketHelper.cpp" line="163"/>
<source>Launch ticket time is invalid or expired. Issued at: %1. Expires at: %2. Current UTC time: %3.</source>
<translation>启动 ticket 时间无效或已过期。签发时间:%1。过期时间:%2。当前 UTC 时间:%3。</translation>
</message>
<message>
<location filename="../Common/TicketHelper.cpp" line="174"/>
<source>Launch ticket nonce is missing. The ticket is incomplete.</source>
<translation>启动 ticket 缺少 nonce。Ticket 内容不完整。</translation>
</message>
</context>
<context>
<name>UpdateLogic</name>
<message>
<location filename="../Launcher/UpdateLogic.cpp" line="109"/>
<source>Current version manifest identity is incomplete. Stage: cache current version manifest. App: %1, channel: %2, version: %3, version id: %4.</source>
<translation>当前版本 Manifest 身份信息不完整。阶段:缓存当前版本 Manifest。App:%1,渠道:%2,版本:%3,版本 ID:%4。</translation>
</message>
<message>
<location filename="../Launcher/UpdateLogic.cpp" line="133"/>
<source>Cannot download signed manifest for the current local version. Stage: cache current version manifest. HTTP status: %1. App: %2, channel: %3, version: %4, version id: %5.%6</source>
<translation>无法下载当前本地版本的签名 Manifest。阶段:缓存当前版本 Manifest。HTTP 状态码:%1。App%2,渠道:%3,版本:%4,版本 ID:%5。%6</translation>
</message>
<message>
<location filename="../Launcher/UpdateLogic.cpp" line="136"/>
<source>
Server message: %1</source>
<translation>
服务端消息:%1</translation>
</message>
<message>
<location filename="../Launcher/UpdateLogic.cpp" line="143"/>
<source>The signed manifest response for the current local version is incomplete. Stage: cache current version manifest. App: %1, channel: %2, version: %3, version id: %4.</source>
<translation>当前本地版本的签名 Manifest 响应不完整。阶段:缓存当前版本 Manifest。App:%1,渠道:%2,版本:%3,版本 ID:%4。</translation>
</message>
<message>
<location filename="../Launcher/UpdateLogic.cpp" line="151"/>
<source>The signed manifest identity does not match the current local version. Stage: cache current version manifest. Expected app/channel/version: %1 / %2 / %3. Manifest app/channel/version: %4 / %5 / %6.</source>
<translation>签名 Manifest 身份与当前本地版本不匹配。阶段:缓存当前版本 Manifest。期望 app/channel/version%1 / %2 / %3。Manifest 中的 app/channel/version%4 / %5 / %6。</translation>
</message>
<message>
<location filename="../Launcher/UpdateLogic.cpp" line="162"/>
<source>Cannot create manifest cache directory. Stage: cache current version manifest. Directory: %1.</source>
<translation>无法创建 Manifest 缓存目录。阶段:缓存当前版本 Manifest。目录:%1。</translation>
</message>
<message>
<location filename="../Launcher/UpdateLogic.cpp" line="174"/>
<source>Cannot save signed manifest cache. Stage: cache current version manifest. File: %1. Error: %2.</source>
<translation>无法保存签名 Manifest 缓存。阶段:缓存当前版本 Manifest。文件:%1。错误:%2。</translation>
</message>
<message>
<location filename="../Launcher/UpdateLogic.cpp" line="187"/>
<source>Server address is empty.</source>
<translation>服务端地址为空。</translation>
</message>
<message>
<location filename="../Launcher/UpdateLogic.cpp" line="208"/>
<source>Git tags request failed (HTTP %1).</source>
<translation>Git 标签请求失败(HTTP %1)。</translation>
</message>
<message>
<location filename="../Launcher/UpdateLogic.cpp" line="215"/>
<source>Git tags response is empty.</source>
<translation>Git 标签响应为空。</translation>
</message>
<message>
<location filename="../Launcher/UpdateLogic.cpp" line="221"/>
<source>Cannot write Git tags file: %1</source>
<translation>无法写入 Git 标签文件:%1</translation>
</message>
</context>
<context>
<name>Updater</name>
<message>
<location filename="../Updater/main.cpp" line="46"/>
<source>Invalid Offline Package</source>
<translation>离线包无效</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="58"/>
<source>Updater Argument Error</source>
<translation>更新器参数错误</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="59"/>
<source>The updater is missing online update arguments or an offline update package.</source>
<translation>更新器缺少在线更新参数或离线更新包。</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="79"/>
<source>Offline Package Not Applicable</source>
<translation>离线包不适用</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="80"/>
<source>The update package application or channel does not match the local configuration.</source>
<translation>更新包的应用或渠道与本机配置不一致。</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="89"/>
<source>Offline Update Rejected</source>
<translation>离线更新被拒绝</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="90"/>
<source>The local signed policy has expired, forbids offline updates, or does not allow the target version.</source>
<translation>本地签名策略已过期、禁止离线更新或不允许目标版本。</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="97"/>
<source>Downgrade Forbidden</source>
<translation>禁止降级</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="98"/>
<source>The current signed policy does not allow installing an offline package with a lower version.</source>
<translation>当前签名策略不允许安装较低版本的离线包。</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="110"/>
<location filename="../Updater/main.cpp" line="118"/>
<source>Update Recovery Failed</source>
<translation>更新恢复失败</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="111"/>
<source>An unfinished update was detected, but the old version could not be restored: %1
Do not continue running the software. Please contact the administrator.</source>
<translation>检测到上次更新未完成,但无法恢复旧版本:%1
请不要继续运行软件,并联系管理员。</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="119"/>
<source>The old files were restored, but the version state could not be restored. Please check write permissions for the configuration directory.</source>
<translation>旧文件已经恢复,但无法恢复版本状态,请检查配置目录写入权限。</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="126"/>
<source>Preparing update...</source>
<translation>正在准备更新...</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="127"/>
<source>Updating to %1</source>
<translation>正在更新到 %1</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="156"/>
<source>Preparing download...</source>
<translation>正在准备下载...</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="157"/>
<source>Downloading: %1</source>
<translation>正在下载:%1</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="179"/>
<source>
Details:
%1</source>
<translation>
详细信息:
%1</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="199"/>
<source>Cannot start the main application because the executable file does not exist.
Executable: %1
Check main_executable and install_root in the generated client configuration.</source>
<translation>无法启动主程序,因为主程序文件不存在。
可执行文件:%1
请检查生成的客户端配置中的 main_executable 和 install_root。</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="211"/>
<source>Cannot start the main application because the one-time launch ticket could not be created.
Executable: %1
Details: %2</source>
<translation>无法启动主程序,因为一次性启动 ticket 创建失败。
可执行文件:%1
详细信息:%2</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="222"/>
<source>Cannot start the main application process.
Executable: %1
Ticket file: %2
Health file: %3
Check file permissions, dependent DLLs/shared libraries, and whether the executable can run independently.</source>
<translation>无法启动主程序进程。
可执行文件:%1
Ticket 文件:%2
健康检查文件:%3
请检查文件权限、依赖 DLL/共享库,以及该可执行文件是否能独立运行。</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="225"/>
<source>&lt;not used&gt;</source>
<translation>&lt;未使用&gt;</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="243"/>
<source>Delegating rollback to Bootstrap...</source>
<translation>正在将回滚工作移交给 Bootstrap...</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="252"/>
<source>
Cannot start Bootstrap to perform rollback. Do not continue running the software. Please contact the administrator.</source>
<translation>
无法启动 Bootstrap 执行回滚。请不要继续运行软件,并联系管理员。</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="262"/>
<source>Transaction Resume Failed</source>
<translation>事务续办失败</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="263"/>
<source>Cannot read the Bootstrap update transaction: %1</source>
<translation>无法读取 Bootstrap 更新事务:%1</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="276"/>
<source>Update Rolled Back</source>
<translation>更新已回滚</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="278"/>
<source>The new version failed to install or start. The old version has been restored and started automatically.</source>
<translation>新版本安装或启动失败,已自动恢复并启动旧版本。</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="279"/>
<source>The old files were restored, but the old version number could not be written back. Please check configuration directory permissions.</source>
<translation>旧文件已经恢复,但旧版本号写回失败,请检查配置目录权限。</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="286"/>
<source>Automatic Rollback Failed</source>
<translation>自动回滚失败</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="287"/>
<source>Bootstrap could not fully restore the old version. Do not continue running the software. Please contact the administrator.</source>
<translation>Bootstrap 无法完整恢复旧版本。请不要继续运行软件,并联系管理员。</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="291"/>
<location filename="../Updater/main.cpp" line="297"/>
<source>Update Preparation Failed</source>
<translation>更新准备失败</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="292"/>
<source>Cannot create the update transaction directory or save the transaction state.</source>
<translation>无法创建更新事务目录或保存事务状态。</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="298"/>
<source>Cannot save the offline transaction marker.</source>
<translation>无法保存离线事务标记。</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="304"/>
<source>Fetching and verifying version manifest...</source>
<translation>正在获取并验证版本清单...</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="305"/>
<source>Verifying offline update package...</source>
<translation>正在验证离线更新包...</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="309"/>
<location filename="../Updater/main.cpp" line="339"/>
<location filename="../Updater/main.cpp" line="342"/>
<source>Manifest Cache Failed</source>
<translation>清单缓存失败</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="310"/>
<source>Cannot read the signed manifest cache after Bootstrap installation.</source>
<translation>Bootstrap 安装后无法读取签名 Manifest 缓存。</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="317"/>
<location filename="../Updater/main.cpp" line="320"/>
<source>Security Verification Failed</source>
<translation>安全验证失败</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="318"/>
<source>Cannot reverify the manifest signature after Bootstrap installation.</source>
<translation>Bootstrap 安装后无法重新验证版本清单签名。</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="321"/>
<source>The version manifest signature is invalid. The update has stopped. Please contact the administrator.</source>
<translation>版本清单签名无效,更新已停止。请联系管理员。</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="340"/>
<source>Cannot save the new version manifest cache.</source>
<translation>无法保存新版本 Manifest 缓存。</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="343"/>
<source>Cannot save the new version manifest cache. The update has stopped.</source>
<translation>无法保存新版本 Manifest 缓存,更新已停止。</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="351"/>
<source>Fetching secure download URLs...</source>
<translation>正在获取安全下载地址...</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="352"/>
<source>Preparing offline package files...</source>
<translation>正在准备离线包文件...</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="356"/>
<source>No Files to Update</source>
<translation>没有可更新文件</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="357"/>
<source>The server did not return any version files. The update has stopped.</source>
<translation>服务器没有返回任何版本文件,更新已停止。</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="366"/>
<source>Insufficient Disk Space</source>
<translation>磁盘空间不足</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="367"/>
<source>The update requires at least %1 of free space, but the installation drive currently has only %2.
The required space includes downloaded files, old version backups, and a safety margin.</source>
<translation>更新至少需要 %1 可用空间,安装盘当前仅剩 %2。
所需空间已包含下载文件、旧版本备份和安全余量。</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="376"/>
<source>Downloading and verifying %1 version files...</source>
<translation>正在下载并校验 %1 个版本文件...</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="377"/>
<source>Extracting and verifying %1 offline files...</source>
<translation>正在提取并校验 %1 个离线文件...</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="380"/>
<source>Offline Package Extraction Failed</source>
<translation>离线包提取失败</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="386"/>
<source>Download Failed</source>
<translation>下载失败</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="387"/>
<source>Some files failed to download or failed SHA-256 verification. Please check the network, update cache, or server release files and try again.</source>
<translation>部分文件下载失败或 SHA-256 校验失败。请检查网络、更新缓存或服务端发布文件后重试。</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="397"/>
<source>The downloaded/staged files do not match the target version manifest. The update has stopped before replacing installed files.</source>
<translation>已下载/暂存的文件与目标版本 Manifest 不一致。更新已在替换已安装文件前停止。</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="477"/>
<source>New version files failed verification after installation. The updater will roll back to the previous version.</source>
<translation>新版本文件在安装后校验失败。更新器将回滚到上一版本。</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="394"/>
<source>Verifying complete version files...</source>
<translation>正在校验完整版本文件...</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="396"/>
<source>File Verification Failed</source>
<translation>文件校验失败</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="411"/>
<source>Bootstrap Cannot Self-Update</source>
<translation>Bootstrap 无法自更新</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="412"/>
<source>This version contains a new %1. Please upgrade this component with the installer, then publish the business version again.</source>
<translation>本次版本包含新的 %1。请使用安装包升级该组件,再重新发布业务版本。</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="417"/>
<source>Transaction Recording Failed</source>
<translation>事务记录失败</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="418"/>
<source>Cannot save the list of verified or pending deletion files. The update has stopped.</source>
<translation>无法保存已校验或待删除文件列表,更新已停止。</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="421"/>
<source>Closing the main application...</source>
<translation>正在关闭主程序...</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="423"/>
<source>Cannot Close Main Application</source>
<translation>无法关闭主程序</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="424"/>
<source>%1 is still running. Please close it manually and try again.</source>
<translation>%1 仍在运行,请手动关闭后重试。</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="427"/>
<source>Backing up %1 files to be changed, including %2 files to be deleted...</source>
<translation>正在备份 %1 个待变更文件(其中删除 %2 个)...</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="430"/>
<source>Backup Failed</source>
<translation>备份失败</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="431"/>
<source>Cannot back up current version files. The new version has not been installed. Please check disk space and directory permissions.</source>
<translation>无法备份当前版本文件,尚未安装新版本。请检查磁盘空间和目录权限。</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="437"/>
<location filename="../Updater/main.cpp" line="447"/>
<location filename="../Updater/main.cpp" line="455"/>
<location filename="../Updater/main.cpp" line="461"/>
<source>Bootstrap Handoff Preparation Failed</source>
<translation>接管准备失败</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="438"/>
<source>Cannot create the Bootstrap file plan.</source>
<translation>无法创建 Bootstrap 文件计划。</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="448"/>
<source>Cannot write the Bootstrap copy plan.</source>
<translation>无法写入 Bootstrap 复制计划。</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="456"/>
<source>Cannot write the Bootstrap deletion plan.</source>
<translation>无法写入 Bootstrap 删除计划。</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="462"/>
<source>Cannot commit the Bootstrap file plan or transaction state.</source>
<translation>无法提交 Bootstrap 文件计划或事务状态。</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="465"/>
<source>Delegating installation to Bootstrap...</source>
<translation>正在将安装工作移交给 Bootstrap...</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="467"/>
<source>Bootstrap Startup Failed</source>
<translation>Bootstrap 启动失败</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="468"/>
<source>Cannot start the standalone update handoff program: %1</source>
<translation>无法启动独立更新接管程序:%1</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="474"/>
<source>Verifying Bootstrap installation result...</source>
<translation>正在校验 Bootstrap 安装结果...</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="476"/>
<source>Installation Verification Failed</source>
<translation>安装校验失败</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="481"/>
<source>Obsolete File Cleanup Failed</source>
<translation>废弃文件清理失败</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="482"/>
<source>An obsolete file still exists: %1</source>
<translation>废弃文件仍然存在:%1</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="485"/>
<source>Saving new version state...</source>
<translation>正在保存新版本状态...</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="488"/>
<source>State Save Failed</source>
<translation>状态保存失败</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="489"/>
<source>Cannot save the current version number.</source>
<translation>无法保存当前版本号。</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="493"/>
<source>Starting the new version and waiting for health confirmation...</source>
<translation>正在启动新版本并等待健康确认...</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="495"/>
<source>Startup Failed</source>
<translation>启动失败</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="497"/>
<source>%1 cannot be started.</source>
<translation>%1 无法启动。</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="507"/>
<source>Startup Confirmation Failed</source>
<translation>启动确认失败</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="508"/>
<source>The new version did not complete startup health confirmation within %1 milliseconds.</source>
<translation>新版本在 %1 毫秒内没有完成启动健康确认。</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="511"/>
<source>Committing update transaction...</source>
<translation>正在提交更新事务...</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="513"/>
<source>Transaction Commit Failed</source>
<translation>事务提交失败</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="514"/>
<source>The new version has started, but the update transaction could not be committed.</source>
<translation>新版本已经启动,但无法提交更新事务。</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="522"/>
<source>Update Complete</source>
<translation>更新完成</translation>
</message>
<message>
<location filename="../Updater/main.cpp" line="523"/>
<source>The software has been successfully updated to %1 and passed the startup health check.</source>
<translation>软件已成功更新到 %1,并通过启动健康检查。</translation>
</message>
</context>
<context>
<name>UpdaterLogic</name>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="90"/>
<source>Target version manifest response is incomplete. Stage: download target manifest. App: %1, channel: %2, version: %3, version id: %4.</source>
<translation>目标版本 Manifest 响应不完整。阶段:下载目标版本 Manifest。App:%1,渠道:%2,版本:%3,版本 ID:%4。</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="99"/>
<source>Cannot download target version manifest. Stage: download target manifest. HTTP status: %1. App: %2, channel: %3, version: %4, version id: %5.%6</source>
<translation>无法下载目标版本 Manifest。阶段:下载目标版本 Manifest。HTTP 状态码:%1。App%2,渠道:%3,版本:%4,版本 ID:%5。%6</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="102"/>
<location filename="../Updater/UpdaterLogic.cpp" line="527"/>
<source>
Server message: %1</source>
<translation>
服务端消息:%1</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="115"/>
<source>Cannot verify manifest signature because OpenSSL support is unavailable. Stage: manifest signature verification.</source>
<translation>无法验证 Manifest 签名,因为当前程序未启用 OpenSSL。阶段:Manifest 签名校验。</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="123"/>
<source>Cannot open manifest public key. Stage: manifest signature verification. Public key path: %1.</source>
<translation>无法打开 Manifest 公钥。阶段:Manifest 签名校验。公钥路径:%1。</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="136"/>
<source>Cannot parse manifest public key buffer. Stage: manifest signature verification. Public key path: %1.</source>
<translation>无法解析 Manifest 公钥内容。阶段:Manifest 签名校验。公钥路径:%1。</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="147"/>
<source>Manifest public key is invalid. Stage: manifest signature verification. Public key path: %1.</source>
<translation>Manifest 公钥无效。阶段:Manifest 签名校验。公钥路径:%1。</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="159"/>
<source>Cannot create OpenSSL verification context. Stage: manifest signature verification.</source>
<translation>无法创建 OpenSSL 验签上下文。阶段:Manifest 签名校验。</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="182"/>
<source>Manifest RSA signature is invalid. Stage: manifest signature verification. This usually means the manifest was not signed by the matching server private key, the client public key is wrong, or the manifest content was changed.</source>
<translation>Manifest RSA 签名无效。阶段:Manifest 签名校验。通常表示 Manifest 不是由匹配的服务端私钥签名、客户端公钥不正确,或 Manifest 内容被修改过。</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="196"/>
<source>No manifest is available for signature verification. Stage: manifest signature verification. The target manifest may not have been downloaded successfully.</source>
<translation>没有可用于验签的 Manifest。阶段:Manifest 签名校验。目标版本 Manifest 可能没有下载成功。</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="204"/>
<source>The manifest does not contain a signature. Stage: manifest signature verification.</source>
<translation>Manifest 中没有签名字段。阶段:Manifest 签名校验。</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="222"/>
<source>Cannot save manifest cache because the target manifest is empty. Stage: save target manifest cache.</source>
<translation>无法保存 Manifest 缓存,因为目标版本 Manifest 为空。阶段:保存目标版本 Manifest 缓存。</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="229"/>
<source>Cannot create manifest cache directory. Stage: save target manifest cache. Directory: %1.</source>
<translation>无法创建 Manifest 缓存目录。阶段:保存目标版本 Manifest 缓存。目录:%1。</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="239"/>
<source>Cannot write manifest cache file. Stage: save target manifest cache. File: %1. Error: %2.</source>
<translation>无法写入 Manifest 缓存文件。阶段:保存目标版本 Manifest 缓存。文件:%1。错误:%2。</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="263"/>
<source>Cannot read cached signed manifest. Stage: read local manifest cache. Version: %1. File: %2. This cache is created after a version is installed successfully.</source>
<translation>无法读取本地签名 Manifest 缓存。阶段:读取本地 Manifest 缓存。版本:%1。文件:%2。该缓存会在版本安装成功后生成。</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="273"/>
<source>Cached signed manifest is not valid JSON. Stage: read local manifest cache. Version: %1. File: %2.</source>
<translation>本地签名 Manifest 缓存不是合法 JSON。阶段:读取本地 Manifest 缓存。版本:%1。文件:%2。</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="281"/>
<source>Cached signed manifest is incomplete. Stage: read local manifest cache. Version: %1. File: %2.</source>
<translation>本地签名 Manifest 缓存不完整。阶段:读取本地 Manifest 缓存。版本:%1。文件:%2。</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="387"/>
<source>installed version verification</source>
<translation>已安装版本校验</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="388"/>
<source>downloaded/staged file verification</source>
<translation>已下载/暂存文件校验</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="391"/>
<source>No manifest is available. Stage: %1. The updater cannot know which files and hashes should be verified.</source>
<translation>没有可用的 Manifest。阶段:%1。Updater 无法知道应该校验哪些文件和哈希。</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="404"/>
<source>Manifest contains an unsafe file path. Stage: %1. Version: %2. Path: %3.</source>
<translation>Manifest 包含不安全文件路径。阶段:%1。版本:%2。路径:%3。</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="421"/>
<source>A required file is missing. Stage: %1. Version: %2. Manifest path: %3. Checked path: %4. If this is a downloaded update, the file was not downloaded or staged correctly; if this is startup verification, the installed file may have been deleted.</source>
<translation>缺少必需文件。阶段:%1。版本:%2。Manifest 路径:%3。检查路径:%4。如果这是下载更新阶段,说明文件没有正确下载或暂存;如果这是启动校验阶段,说明已安装文件可能被删除。</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="430"/>
<source>File SHA-256 does not match the signed manifest. Stage: %1. Version: %2. Manifest path: %3. Local path: %4.
Expected SHA-256: %5
Actual SHA-256: %6
If this happens during download, clear the update cache and retry. If this happens during startup or after installation, the local file differs from the published version.</source>
<translation>文件 SHA-256 与签名 Manifest 不一致。阶段:%1。版本:%2。Manifest 路径:%3。本地路径:%4。
期望 SHA-256%5
实际 SHA-256%6
如果发生在下载阶段,请清理更新缓存后重试。如果发生在启动或安装后校验阶段,说明本地文件与发布版本不同。</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="432"/>
<location filename="../Updater/UpdaterLogic.cpp" line="675"/>
<source>&lt;cannot read file&gt;</source>
<translation>&lt;无法读取文件&gt;</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="445"/>
<source>Cannot open the offline update package</source>
<translation>无法打开离线更新包</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="446"/>
<source>The offline package format identifier is invalid</source>
<translation>离线包格式标识无效</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="448"/>
<source>The offline package header is incomplete</source>
<translation>离线包头不完整</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="451"/>
<source>The offline package header length is invalid</source>
<translation>离线包头长度无效</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="454"/>
<source>The offline package header JSON is invalid</source>
<translation>离线包头 JSON 无效</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="459"/>
<source>The offline package RSA signature is invalid</source>
<translation>离线包 RSA 签名无效</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="461"/>
<source>The offline package signature metadata is invalid</source>
<translation>离线包签名元数据无效</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="462"/>
<source>The manifest digest does not match the package signature</source>
<translation>Manifest 摘要与包签名不一致</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="464"/>
<source>The offline manifest is invalid</source>
<translation>离线 Manifest 无效</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="467"/>
<source>Package information does not match manifest identity</source>
<translation>包信息与 Manifest 身份不一致</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="468"/>
<source>The offline manifest RSA signature is invalid</source>
<translation>离线 Manifest RSA 签名无效</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="474"/>
<source>The offline package contains an unsafe path or out-of-range data: %1</source>
<translation>离线包包含不安全路径或越界数据:%1</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="477"/>
<source>Cannot prepare offline file: %1</source>
<translation>无法准备离线文件:%1</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="478"/>
<source>Cannot create staged file: %1</source>
<translation>无法创建暂存文件:%1</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="480"/>
<source>Failed to read offline file: %1</source>
<translation>离线文件读取失败:%1</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="481"/>
<source>Offline file hash verification or write failed: %1</source>
<translation>离线文件 Hash 或写入失败:%1</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="483"/>
<source>The offline package file count does not match the manifest</source>
<translation>离线包文件数量与 Manifest 不一致</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="524"/>
<source>Cannot get secure download URLs. Stage: request download URLs. HTTP status: %1. App: %2, channel: %3, version: %4, version id: %5.%6</source>
<translation>无法获取安全下载链接。阶段:请求下载链接。HTTP 状态码:%1。App:%2,渠道:%3,版本:%4,版本 ID:%5。%6</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="556"/>
<source>Cannot create partial download directory. Stage: download file. File: %1. Partial file: %2.</source>
<translation>无法创建断点续传目录。阶段:下载文件。文件:%1。临时分片文件:%2。</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="585"/>
<location filename="../Updater/UpdaterLogic.cpp" line="663"/>
<source>Downloaded file passed SHA-256 verification, but cannot move it into the staging directory. Stage: download file. File: %1. From: %2. To: %3.</source>
<translation>下载文件已通过 SHA-256 校验,但无法移动到暂存目录。阶段:下载文件。文件:%1。从:%2。到:%3。</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="591"/>
<source>Cached partial file has the expected size but wrong SHA-256. Stage: resume download. File: %1.
Expected SHA-256: %2
Actual SHA-256: %3
The partial cache will be deleted and downloaded again.</source>
<translation>缓存的断点续传文件大小正确,但 SHA-256 不一致。阶段:断点续传。文件:%1。
期望 SHA-256%2
实际 SHA-256%3
该临时缓存会被删除并重新下载。</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="604"/>
<source>Cannot open partial download file. Stage: download file. File: %1. Partial file: %2. Error: %3.</source>
<translation>无法打开断点续传临时文件。阶段:下载文件。文件:%1。临时分片文件:%2。错误:%3。</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="672"/>
<source>Downloaded file does not match the signed manifest. Stage: download file. File: %1. HTTP status: %2.
Expected size: %3 bytes
Actual size: %4 bytes
Expected SHA-256: %5
Actual SHA-256: %6
The partial cache will be deleted and downloaded again.</source>
<translation>下载文件与签名 Manifest 不一致。阶段:下载文件。文件:%1。HTTP 状态码:%2。
期望大小:%3 字节
实际大小:%4 字节
期望 SHA-256%5
实际 SHA-256%6
该临时缓存会被删除并重新下载。</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="679"/>
<source>Downloaded file is incomplete. Stage: download file. File: %1. HTTP status: %2. Expected size: %3 bytes, current size: %4 bytes.</source>
<translation>下载文件不完整。阶段:下载文件。文件:%1。HTTP 状态码:%2。期望大小:%3 字节,当前大小:%4 字节。</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="688"/>
<source>Download request failed. Stage: download file. File: %1. Attempt: %2/4. HTTP status: %3. Network error: %4. Partial file: %5.</source>
<translation>下载请求失败。阶段:下载文件。文件:%1。尝试次数:%2/4。HTTP 状态码:%3。网络错误:%4。临时分片文件:%5。</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="706"/>
<source>File download failed after retries. Stage: download file. File: %1.</source>
<translation>文件多次重试后仍下载失败。阶段:下载文件。文件:%1。</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="781"/>
<source>The target version manifest contains no downloadable files. Stage: prepare downloads.</source>
<translation>目标版本 Manifest 中没有可下载文件。阶段:准备下载。</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="788"/>
<source>Cannot create update staging directory. Stage: prepare downloads. Directory: %1.</source>
<translation>无法创建更新暂存目录。阶段:准备下载。目录:%1。</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="795"/>
<source>Cannot create download cache directory. Stage: prepare downloads. Directory: %1.</source>
<translation>无法创建下载缓存目录。阶段:准备下载。目录:%1。</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="829"/>
<source>Manifest contains an unsafe file path. Stage: prepare file download. Path: %1.</source>
<translation>Manifest 包含不安全文件路径。阶段:准备文件下载。路径:%1。</translation>
</message>
<message>
<location filename="../Updater/UpdaterLogic.cpp" line="854"/>
<source>Cannot create staging subdirectory. Stage: prepare file download. File: %1. Directory: %2.</source>
<translation>无法创建暂存子目录。阶段:准备文件下载。文件:%1。目录:%2。</translation>
</message>
</context>
</TS>