Skip to content

v1.2.1 — 修复「在线同步拉不到入门指南文件」

Choose a tag to compare

@DC1024 DC1024 released this 28 Sep 16:32
· 9 commits to main since this release

修复 / Fixed

v1.2.0 的「② 同步最新汉化」拉不到入门指南的 32 个文件。 请升级到本版。

原因

下载 URL 是直接拼 base + 相对路径,没有做百分号编码。而 zh/welcome/** 的路径里带空格:

.../welcome/Getting started/000 UI/000 Introduction.pxc       → 000(连接直接失败)
.../welcome/Getting%20started/000%20UI/000%20Introduction.pxc → 200,7982 字节 ✅

HTTP 客户端不会替你编码,所以三个源都取不到这些文件 —— 实测 41 个文件只有 8 个能同步下来。

改动

  • 新增 _url():URL 侧统一 urllib.parse.quote(rel, safe="/")。
    只编码 URL,本地文件路径(os.path.join / _local_copy)不编码,
    否则会把文件名里真实的 %20 当字符处理。

  • _download() 支持逐源回退:单个文件在某个源上取不到时自动换下一个源
    (GitHub Pages → jsDelivr CDN → GitHub Raw),不再因为一个文件丢弃整批。

  • 换源时在界面上打印一行提示 —— 首次同步要拉 11 MB 中文字体,
    慢的时候界面上几分钟没动静很像"卡死",现在能看出它在换源。

  • 大文件优先走 CDN:超过 2 MB 的文件把 GitHub Pages 排到最后。
    实测 Pages 对静态大文件限速明显(同一台机器 25 KB/s,jsDelivr 71 KB/s)。

  • 防降级闸门:fetch_manifest() 增加 floor 参数(传本地已装的最高版本)。
    起因是本轮实测发现 jsDelivr 对 @main 的缓存很久 —— v1.2.1 推送后它仍在返回
    v1.0.3 / 8 个文件 的旧清单,而 Pages 与 Raw 都已经是 v1.2.0 / 41 个文件:

    GitHub Pages   v1.2.0    files=41
    jsDelivr CDN   v1.0.3    files=8     ← 缓存里的旧清单
    GitHub Raw     v1.2.0    files=41
    

    正常情况 Pages 最先命中,不会出事;但 Pages 一旦临时不可达(本轮实测出现过直接
    返回 000),按原来的"取到第一个就返回"就会把用户已经装好的包降级成 8 个文件。
    现在低于本地版本的清单会被跳过并记一行日志;所有源都低于本地时返回"离线",
    走既有的随附包回退分支,不会把用户的包换旧。

顺带修掉的编码不一致

PyInstaller 打包出的窗口版 EXE 在输出被重定向到文件或管道时,
sys.stdout.encoding 会退化成系统 ANSI 代码页(简体中文 Windows 上是 GBK),
而同一个脚本用 python patch_tool.py 跑却是 UTF-8:

EXE  --version  →  汉化工具 = BA BA BB AF B9 A4 BE DF   (GBK)
源码 --version  →  汉化工具 = E6 B1 89 E5 8C 96 E5 B7 A5 (UTF-8)

抓日志或做校验的人很容易把前者当成乱码。新增 _setup_stdio():
只有输出不是终端时才把 stdout / stderr 统一成 UTF-8;
真控制台不做处理(Windows 下 Python 3.6+ 直接调 WriteConsoleW 写宽字符,
编码属性本来就只影响重定向后的字节,所以控制台显示一直是对的)。

验证

  • 清单里 41/41 个文件:线上字节与清单 sha256、仓库文件三者完全一致
  • 真跑一次整包同步到临时目录:41/41 与仓库 zh/ 逐字节一致
    (含 33 个带空格的 welcome/** 路径),实测耗时 317.8 s
  • 按区域同步 only=[words, junctions] → 恰好落盘 config.json / junctions.json / words.json / manifest.json,符合预期
  • 防降级闸门单独测过:正常路径仍一次命中 Pages(不多发请求,不增加延迟);
    把源限制成"只剩 jsDelivr"时旧清单被拒绝、返回离线 —— 对照组不传 floor 时确实会拿到 v1.0.3
  • version_key() 把 "1.10.0" 正确判为大于 "1.9.0"(按字符串比会反过来)
  • 新 EXE 的 --version 重定向到文件后按 UTF-8 解码正确

汉化包内容没有改动,zh/manifest.json 版本仍是 1.2.0;本版只修客户端工具。


v1.2.0 的内容(首次安装请看这里)

三条主线:入门指南示例汉化、按区域汉化、Linux 版。

入门指南示例汉化

欢迎页「入门指南」里的教程页与示例工程正文已换成中文:17 个教程页 + 15 个示例工程 + 1 个模板 = 33 个 .pxc、351 处文本。
文字在 .pxc 的文本节点里(不在 PNG 里),所以实现了 .pxc 容器编解码,只替换说明文字、不动工程结构。

游戏内效果

  • 按同名覆盖写入 <数据目录>/Welcome files/,文件名保持英文 → 不会出现中英两套重复卡片,也不破坏 Steam 自动更新
  • 原文件备份到 Welcome files.bak_cn/,③ 恢复英文一键还原
  • 备份取自官方 pack/welcome_files.zip(不是"当前文件")—— 否则第二次安装会把中文存进备份
  • 构建时对 <node …> / <bt …> / <spr …> 这类查找键标签做多重集自检,译文改动了标签就拒绝生成

已知限制:欢迎页的卡片标题取自 .pxc 文件名,程序不查语言表 → 标题保持英文,但点进去正文是中文。

按选中区域汉化(默认全部)

六个复选框:界面词条 / 面板与对话框 / 节点 / 连接点 / 中文字体 / 入门指南示例。
取消勾选 = 不安装该文件(游戏回退内置英文),而不是写一份英文副本 —— 后者会让已装包永远与线上清单哈希不符,每次同步都重下整包。
命令行等价写法:--modules words,ui / --list-modules。

Linux 版

纯 Python 标准库,解压即用:

tar -xzf PixelComposer-CN-Linux.tar.gz
cd PixelComposer-CN-Linux
./install.sh              # 有 tkinter 开图形界面,没有就自动进命令行(功能一致)
./install.sh install      # 或直接一键汉化

路径探测覆盖原生 Linux($XDG_DATA_HOME/PixelComposer)与 Proton 前缀;Steam 库来自 STEAM_ROOT / ~/.steam / ~/.local/share/Steam / flatpak / snap / /media|/run/media|/mnt,并解析 libraryfolders.vdf。

旧社区汉化包残留:只列出,不删除

⑧ 旧汉化包残留清点(--leftovers)给出完整清单(路径 / 大小 / 文件数),实测一台机器上是 10 项 / 32.67 MB。不会删除任何东西。


下载

  • PixelComposer-CN-Patcher.exe — Windows 免安装,双击即用
  • PixelComposer-CN-Linux.tar.gz — 解压后 ./install.sh