Files

1654 lines
84 KiB
XML
Raw Permalink Normal View History

<?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>