feat(hardening): 内嵌产品配置 + 系统级状态 + 全量 i18n + 依赖治理 + 资料清理

update-client-hardening 四工作流合入(构建/静态检查已过):

- 配置:不可变产品策略经 UpdateClientResources.cmake 归一化校验后
  内嵌 qrc(URL/相对路径/主程序必须落 install_root/版本/UUID 格式,
  CMake override 写入前复验);可变机器状态迁系统级原生存储;
  运行目录不再落可编辑 app_config.json。
- i18n:生产源全英文(no-Han 检查 41/41),中文进 translations/
  zh_CN 目录;翻译加载收敛 Common/TranslationHelper 唯一入口;
  Bootstrap 补资源文件。
- 依赖:Qt/OpenSSL/架构/Perl 机器路径改 imported targets +
  UpdateClientDependencies.cmake,3rdparty 由父工程契约供给。
- 清理:旧 README/SDK README/3 个重复 PowerShell 打包脚本/PDF 提取
  文本删除,canonical README + 5 份结构化英文文档替代;Launcher
  requireAdministrator manifest;统一 MSVC /utf-8 删运行时编码设置。
This commit is contained in:
Comely
2026-07-10 00:38:23 -07:00
parent b06e003502
commit fe5aa5bbf0
45 changed files with 5033 additions and 4083 deletions
+814
View File
@@ -0,0 +1,814 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="zh_CN" sourcelanguage="en_US">
<context>
<name>Launcher</name>
<message>
<source>Checking for software updates...</source>
<translation>...</translation>
</message>
<message>
<source>Marsco Launcher</source>
<translation>Marsco </translation>
</message>
<message>
<source>application</source>
<translation></translation>
</message>
<message>
<source>Enter the license for %1:</source>
<translation>%1 License</translation>
</message>
<message>
<source>%1
Please re-enter the license for %2:</source>
<translation>%1
%2 License</translation>
</message>
<message>
<source>Enter License</source>
<translation> License</translation>
</message>
<message>
<source>License Required</source>
<translation> License</translation>
</message>
<message>
<source>A license provided by an administrator is required for the first launch.</source>
<translation> License</translation>
</message>
<message>
<source>License Cannot Be Empty</source>
<translation>License </translation>
</message>
<message>
<source>Paste the license created by an administrator.</source>
<translation> License</translation>
</message>
<message>
<source>Failed to Save License</source>
<translation> License </translation>
</message>
<message>
<source>Cannot save system state at %1:
%2</source>
<translation> %1
%2</translation>
</message>
<message>
<source>Verifying license...</source>
<translation> License...</translation>
</message>
<message>
<source>Device Authentication Failed</source>
<translation></translation>
</message>
<message>
<source>The current license cannot be used: %1</source>
<translation> License 使%1</translation>
</message>
<message>
<source>The device or license authorization is invalid.</source>
<translation> License </translation>
</message>
<message>
<source>The server rejected the current license: %1</source>
<translation> License %1</translation>
</message>
<message>
<source>License Saved</source>
<translation>License </translation>
</message>
<message>
<source>Restart Launcher to complete device authorization and check for updates.</source>
<translation> Launcher </translation>
</message>
<message>
<source>Authorization Denied</source>
<translation></translation>
</message>
<message>
<source>Select Offline Update Package</source>
<translation>线</translation>
</message>
<message>
<source>Marsco Offline Update Package (*.upd)</source>
<translation>Marsco 线 (*.upd)</translation>
</message>
<message>
<source>Offline Update</source>
<translation>线</translation>
</message>
<message>
<source>No offline update package was selected.</source>
<translation>线</translation>
</message>
<message>
<source>Validating the local run policy...</source>
<translation>...</translation>
</message>
<message>
<source>Unable to Start</source>
<translation></translation>
</message>
<message>
<source>The local version policy is invalid: %1</source>
<translation>%1</translation>
</message>
<message>
<source>The local version policy has expired. Connect to the network or contact an administrator.</source>
<translation></translation>
</message>
<message>
<source>Current Version Cannot Run</source>
<translation></translation>
</message>
<message>
<source>Version %1 has been disabled by an administrator.</source>
<translation> %1 </translation>
</message>
<message>
<source>Cannot read the local state: %1</source>
<translation>%1</translation>
</message>
<message>
<source>Security Check Failed</source>
<translation></translation>
</message>
<message>
<source>A version policy sequence rollback was detected, so startup was blocked.</source>
<translation>退</translation>
</message>
<message>
<source>A possible system clock rollback was detected, so startup was blocked.</source>
<translation></translation>
</message>
<message>
<source>Version Rollback</source>
<translation>退</translation>
</message>
<message>
<source>Update Required</source>
<translation></translation>
</message>
<message>
<source>New Version Available</source>
<translation></translation>
</message>
<message>
<source>An administrator selected version %1 as the rollback target. Downgrade now?</source>
<translation> %1 退</translation>
</message>
<message>
<source>Version %1 is available. Update now?</source>
<translation> %1</translation>
</message>
<message>
<source>
Target version: %1</source>
<translation>
%1</translation>
</message>
<message>
<source>Startup Failed</source>
<translation></translation>
</message>
<message>
<source>Cannot start the main application: %1</source>
<translation>%1</translation>
</message>
<message>
<source>Updater Startup Failed</source>
<translation></translation>
</message>
<message>
<source>Cannot start the updater: %1</source>
<translation>%1</translation>
</message>
<message>
<source>Server Unavailable</source>
<translation></translation>
</message>
<message>
<source>The update server is currently unreachable. Import an offline update package?</source>
<translation>线</translation>
</message>
<message>
<source>No offline update package was selected, or the updater could not be started.</source>
<translation>线</translation>
</message>
<message>
<source>Network Unavailable</source>
<translation></translation>
</message>
<message>
<source>The update server is unreachable and the current policy does not allow offline startup.</source>
<translation>线</translation>
</message>
<message>
<source>The current version is up to date. Starting...</source>
<translation>...</translation>
</message>
<message>
<source>Offline mode is active. Starting...</source>
<translation>线...</translation>
</message>
<message>
<source>Integrity Check Failed</source>
<translation></translation>
</message>
<message>
<source>Application files failed signed manifest verification:
%1</source>
<translation>
%1</translation>
</message>
</context>
<context>
<name>LauncherErrorMarker</name>
<message>
<source>authorization</source>
<translation></translation>
</message>
<message>
<source>expired</source>
<translation></translation>
</message>
<message>
<source>device limit reached</source>
<translation></translation>
</message>
<message>
<source>bound to another license</source>
<translation></translation>
</message>
</context>
<context>
<name>MainApp</name>
<message>
<source>Startup Restriction</source>
<translation></translation>
</message>
<message>
<source>Invalid or missing one-time launch ticket: %1
Please use %2.</source>
<translation>%1
%2 </translation>
</message>
<message>
<source>License Error</source>
<translation></translation>
</message>
<message>
<source>Local license invalid: %1</source>
<translation>%1</translation>
</message>
<message>
<source>Policy Error</source>
<translation></translation>
</message>
<message>
<source>Local policy invalid: %1</source>
<translation>%1</translation>
</message>
<message>
<source>Policy expired. The application cannot start.</source>
<translation></translation>
</message>
<message>
<source>State Error</source>
<translation></translation>
</message>
<message>
<source>Cannot load local state: %1</source>
<translation>%1</translation>
</message>
<message>
<source>A policy sequence rollback was detected, so startup was blocked.</source>
<translation>退</translation>
</message>
<message>
<source>The system clock appears to have moved backward, so startup was blocked.</source>
<translation></translation>
</message>
<message>
<source>Integrity Check Failed</source>
<translation></translation>
</message>
<message>
<source>Application files failed signed manifest verification:
%1</source>
<translation> Manifest
%1</translation>
</message>
<message>
<source>Cannot save local state: %1</source>
<translation>%1</translation>
</message>
<message>
<source>Startup Error</source>
<translation></translation>
</message>
<message>
<source>Cannot write the update health confirmation file.</source>
<translation></translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
<source>missing</source>
<translation></translation>
</message>
<message>
<source>unreadable</source>
<translation></translation>
</message>
<message>
<source>Marsco Demo MainApp</source>
<translation>Marsco </translation>
</message>
<message>
<source>unknown</source>
<translation></translation>
</message>
<message>
<source>policy missing</source>
<translation></translation>
</message>
<message>
<source>policy invalid</source>
<translation></translation>
</message>
<message>
<source>version disabled</source>
<translation></translation>
</message>
<message>
<source>policy expired</source>
<translation></translation>
</message>
<message>
<source>policy ok</source>
<translation></translation>
</message>
<message>
<source>Software Running Successfully
Version: %1
DLL Version: %2
Policy: %3</source>
<translation>
%1
DLL %2
%3</translation>
</message>
<message>
<source>The signed policy does not allow this installed version to run.</source>
<translation></translation>
</message>
</context>
<context>
<name>Updater</name>
<message>
<source>Invalid Offline Package</source>
<translation>线</translation>
</message>
<message>
<source>Invalid Updater Arguments</source>
<translation></translation>
</message>
<message>
<source>The updater requires online update arguments or an offline update package.</source>
<translation>线线</translation>
</message>
<message>
<source>Offline Package Not Applicable</source>
<translation>线</translation>
</message>
<message>
<source>The update package application or channel does not match this installation.</source>
<translation></translation>
</message>
<message>
<source>Offline Update Denied</source>
<translation>线</translation>
</message>
<message>
<source>The local signed policy has expired, prohibits offline updates, or does not allow the target version.</source>
<translation>线</translation>
</message>
<message>
<source>Downgrade Prohibited</source>
<translation></translation>
</message>
<message>
<source>The current signed policy does not allow installing an older offline package.</source>
<translation>线</translation>
</message>
<message>
<source>Update Recovery Failed</source>
<translation></translation>
</message>
<message>
<source>The previous update did not finish, and the old version could not be restored: %1
Do not continue running the software. Contact an administrator.</source>
<translation>%1
</translation>
</message>
<message>
<source>The old files were restored, but the version state could not be restored. Check access to the system state store.</source>
<translation>访</translation>
</message>
<message>
<source>Preparing the update...</source>
<translation>...</translation>
</message>
<message>
<source>Updating to %1</source>
<translation> %1</translation>
</message>
<message>
<source>Preparing the download...</source>
<translation>...</translation>
</message>
<message>
<source>Downloading: %1</source>
<translation>%1</translation>
</message>
<message>
<source>Handing rollback over to Bootstrap...</source>
<translation> Bootstrap...</translation>
</message>
<message>
<source>
Bootstrap could not be started to perform the rollback. Do not continue running the software. Contact an administrator.</source>
<translation>
Bootstrap </translation>
</message>
<message>
<source>Transaction Resume Failed</source>
<translation></translation>
</message>
<message>
<source>Cannot read the Bootstrap update transaction: %1</source>
<translation> Bootstrap %1</translation>
</message>
<message>
<source>Update Rolled Back</source>
<translation></translation>
</message>
<message>
<source>The new version could not be installed or started. The old version was restored and started automatically.</source>
<translation></translation>
</message>
<message>
<source>The old files were restored, but the old version number could not be written back. Check permissions on the system state store.</source>
<translation></translation>
</message>
<message>
<source>Automatic Rollback Failed</source>
<translation></translation>
</message>
<message>
<source>Bootstrap could not fully restore the old version. Do not continue running the software. Contact an administrator.</source>
<translation>Bootstrap </translation>
</message>
<message>
<source>Update Preparation Failed</source>
<translation></translation>
</message>
<message>
<source>Cannot create the update transaction directory or save its state.</source>
<translation></translation>
</message>
<message>
<source>Cannot save the offline transaction marker.</source>
<translation>线</translation>
</message>
<message>
<source>Fetching and validating the version manifest...</source>
<translation>...</translation>
</message>
<message>
<source>Validating the offline update package...</source>
<translation>线...</translation>
</message>
<message>
<source>Manifest Cache Failed</source>
<translation></translation>
</message>
<message>
<source>The signed manifest cache could not be read after Bootstrap installation.</source>
<translation>Bootstrap Manifest </translation>
</message>
<message>
<source>Security Validation Failed</source>
<translation></translation>
</message>
<message>
<source>The version manifest signature could not be revalidated after Bootstrap installation.</source>
<translation>Bootstrap </translation>
</message>
<message>
<source>The version manifest signature is invalid. The update has stopped. Contact an administrator.</source>
<translation></translation>
</message>
<message>
<source>Cannot save the new version manifest cache.</source>
<translation> Manifest </translation>
</message>
<message>
<source>Cannot save the new version manifest cache. The update has stopped.</source>
<translation> Manifest </translation>
</message>
<message>
<source>Fetching secure download URLs...</source>
<translation>...</translation>
</message>
<message>
<source>Preparing offline package files...</source>
<translation>线...</translation>
</message>
<message>
<source>No Update Files</source>
<translation></translation>
</message>
<message>
<source>The server returned no version files. The update has stopped.</source>
<translation></translation>
</message>
<message>
<source>Insufficient Disk Space</source>
<translation></translation>
</message>
<message>
<source>The update requires at least %1 of free space, but the installation drive has only %2 available.
The required space includes downloaded files, the old-version backup, and a safety margin.</source>
<translation> %1 %2
</translation>
</message>
<message>
<source>Downloading and validating %1 version files...</source>
<translation> %1 ...</translation>
</message>
<message>
<source>Extracting and validating %1 offline files...</source>
<translation> %1 线...</translation>
</message>
<message>
<source>Offline Package Extraction Failed</source>
<translation>线</translation>
</message>
<message>
<source>Download Failed</source>
<translation></translation>
</message>
<message>
<source>Some files could not be downloaded or failed SHA-256 validation. Check the network and try again.</source>
<translation> SHA-256 </translation>
</message>
<message>
<source>Validating the complete version files...</source>
<translation>...</translation>
</message>
<message>
<source>File Validation Failed</source>
<translation></translation>
</message>
<message>
<source>The staged files do not match the version manifest. The update has stopped.</source>
<translation></translation>
</message>
<message>
<source>Bootstrap Cannot Update Itself</source>
<translation>Bootstrap </translation>
</message>
<message>
<source>This version contains a new %1. Upgrade this component with the installer, then republish the application version.</source>
<translation> %1使</translation>
</message>
<message>
<source>Transaction Recording Failed</source>
<translation></translation>
</message>
<message>
<source>Cannot save the validated-file or pending-deletion lists. The update has stopped.</source>
<translation></translation>
</message>
<message>
<source>Closing the main application...</source>
<translation>...</translation>
</message>
<message>
<source>Cannot Close Main Application</source>
<translation></translation>
</message>
<message>
<source>%1 is still running. Close it manually and try again.</source>
<translation>%1 </translation>
</message>
<message>
<source>Backing up %1 files to be changed, including %2 deletions...</source>
<translation> %1 %2 ...</translation>
</message>
<message>
<source>Backup Failed</source>
<translation></translation>
</message>
<message>
<source>Cannot back up the current version files. The new version has not been installed. Check disk space and directory permissions.</source>
<translation></translation>
</message>
<message>
<source>Handoff Preparation Failed</source>
<translation></translation>
</message>
<message>
<source>Cannot create the Bootstrap file plan.</source>
<translation> Bootstrap </translation>
</message>
<message>
<source>Cannot write the Bootstrap copy plan.</source>
<translation> Bootstrap </translation>
</message>
<message>
<source>Cannot write the Bootstrap deletion plan.</source>
<translation> Bootstrap </translation>
</message>
<message>
<source>Cannot commit the Bootstrap file plan or transaction state.</source>
<translation> Bootstrap </translation>
</message>
<message>
<source>Handing installation over to Bootstrap...</source>
<translation> Bootstrap...</translation>
</message>
<message>
<source>Bootstrap Startup Failed</source>
<translation>Bootstrap </translation>
</message>
<message>
<source>Cannot start the independent update handoff program: %1</source>
<translation>%1</translation>
</message>
<message>
<source>Validating the Bootstrap installation result...</source>
<translation> Bootstrap ...</translation>
</message>
<message>
<source>Installation Validation Failed</source>
<translation></translation>
</message>
<message>
<source>The new version files failed validation after installation.</source>
<translation></translation>
</message>
<message>
<source>Obsolete File Cleanup Failed</source>
<translation></translation>
</message>
<message>
<source>An obsolete file still exists: %1</source>
<translation>%1</translation>
</message>
<message>
<source>Saving the new version state...</source>
<translation>...</translation>
</message>
<message>
<source>State Save Failed</source>
<translation></translation>
</message>
<message>
<source>Cannot save the current version number.</source>
<translation></translation>
</message>
<message>
<source>Starting the new version and waiting for a health confirmation...</source>
<translation>...</translation>
</message>
<message>
<source>Startup Failed</source>
<translation></translation>
</message>
<message>
<source>%1 could not be started.</source>
<translation>%1 </translation>
</message>
<message>
<source>Startup Confirmation Failed</source>
<translation></translation>
</message>
<message>
<source>The new version did not complete its startup health confirmation within %1 milliseconds.</source>
<translation> %1 </translation>
</message>
<message>
<source>Committing the update transaction...</source>
<translation>...</translation>
</message>
<message>
<source>Transaction Commit Failed</source>
<translation></translation>
</message>
<message>
<source>The new version started, but the update transaction could not be committed.</source>
<translation></translation>
</message>
<message>
<source>Update Complete</source>
<translation></translation>
</message>
<message>
<source>The software was updated successfully to %1 and passed the startup health check.</source>
<translation> %1</translation>
</message>
<message>
<source>Update Denied</source>
<translation></translation>
</message>
<message>
<source>The local signed policy is invalid, expired, not applicable to this installation, or does not allow the requested update.</source>
<translation></translation>
</message>
<message>
<source>The current signed policy does not allow installing an older version.</source>
<translation></translation>
</message>
</context>
<context>
<name>UpdaterLogic</name>
<message>
<source>Cannot open the offline update package.</source>
<translation>线</translation>
</message>
<message>
<source>The offline package format identifier is invalid.</source>
<translation>线</translation>
</message>
<message>
<source>The offline package header is incomplete.</source>
<translation>线</translation>
</message>
<message>
<source>The offline package header length is invalid.</source>
<translation>线</translation>
</message>
<message>
<source>The offline package header contains invalid JSON.</source>
<translation>线 JSON </translation>
</message>
<message>
<source>The offline package RSA signature is invalid.</source>
<translation>线 RSA </translation>
</message>
<message>
<source>The signed offline package metadata is invalid.</source>
<translation>线</translation>
</message>
<message>
<source>The manifest digest does not match the package signature.</source>
<translation>Manifest </translation>
</message>
<message>
<source>The offline manifest is invalid.</source>
<translation>线 Manifest </translation>
</message>
<message>
<source>The package metadata and manifest identity do not match.</source>
<translation> Manifest </translation>
</message>
<message>
<source>The offline manifest RSA signature is invalid.</source>
<translation>线 Manifest RSA </translation>
</message>
<message>
<source>The offline package contains an unsafe path or out-of-bounds data: %1</source>
<translation>线%1</translation>
</message>
<message>
<source>Cannot prepare the offline file: %1</source>
<translation>线%1</translation>
</message>
<message>
<source>Cannot create the staged file: %1</source>
<translation>%1</translation>
</message>
<message>
<source>Failed to read the offline file: %1</source>
<translation>线%1</translation>
</message>
<message>
<source>Offline file hash validation or writing failed: %1</source>
<translation>线 Hash %1</translation>
</message>
<message>
<source>The number of files in the offline package does not match the manifest.</source>
<translation>线 Manifest </translation>
</message>
</context>
</TS>