Skip to content

fix(i18n/project): 语言设置覆盖 CLI 入口,修项目文件兼容与 CWD 绑定 - #5

Merged
Sam-Fic merged 4 commits into
mainfrom
fix/i18n-cli-and-project-compat
Nov 11, 2026
Merged

Sam-Fic merged 4 commits into
mainfrom
fix/i18n-cli-and-project-compat

Conversation

@Sam-Fic

@Sam-Fic Sam-Fic commented Nov 11, 2026 •

Copy link
Copy Markdown
Owner

背景

对 v4.10.0..HEAD(4.10.1 / 4.10.2 发布批次)做合并级审查后发现的阻断项已修复。当前 main 已是 v4.10.2,本 PR 是补丁分支,合并后另行发 4.10.3。

阻断项与改法

# 问题 定位 修复
B1 纯 CLI 入口完全绕过语言设置 src/main.vala command_line() 在 load_settings_language() 之前 return cli.run() 抽 apply_language_environment(),在 main() 的 app.run() 之前调用;GUI / 纯 CLI / 二次实例共用
B2 LC_ALL / LC_MESSAGES 优先级高于 LANG,残留 LC_ALL=C 会让显式选中文失效 src/main.vala 原 zh/en 分支 显式语言时清掉 LC_ALL / LC_MESSAGES;跟随系统按 LC_ALL → LC_MESSAGES → LANG 判断外部真实语言,且不恢复 C 类变量
B3 work_dir 缺失时,相对勾选路径被 g_canonicalize_filename(path, NULL) 绑到进程 CWD,可能勾错文件并被 CLI --save 写回 src/services/project_manager.vala canonicalize_checked_path() 无 work_dir 且路径相对时返回 null,由调用方丢弃
B4 字段兼容是 has_member 命中即停;checked_dirs / common_phrases / 快照仍会把 null 塞进集合;整批兼容性零单测 project_manager.vala / cli.vala / tests/ 新增 ProjectManager.read_string_array()(取到数组才算命中 + null/空串过滤),四处复用;新增 test_project_manager

其它改动

  • src/cli.vala:load_project 复用上述 helper 并补 query_exists() 过滤,与 GUI 加载结果一致,不再把不存在的路径写回项目文件。
  • src/main.vala:build_windows_lang() 处理 g_win32_getlocale() 可能返回的 @Latn / @Cyrl 修饰符,codeset 排在 modifier 之前;C locale 判定改为精确比较。
  • tools/build-windows-package.sh:i18n 冒烟不再靠外部注入 LANG=zh_CN.UTF-8 绕过应用逻辑,改为干净环境(env -u LANG/LC_ALL/...)+ 临时 XDG_CONFIG_HOME 里的 settings.json 驱动 5 个用例:偏好=zh、偏好=en、偏好=zh + LC_ALL=C、跟随系统尊重外部 LANG、跟随系统干净环境。加 timeout 30、保留 stderr、用 bash 字符串匹配取代 grep -q 管道(避免 pipefail 下 SIGPIPE 141 误报)。
  • tests/meson.build:注册第 13 个测试 test_project_manager,覆盖字段回退、非字符串元素、正斜杠、相对路径、work_dir 缺失。
  • docs/I18N.md:修正「Windows 下 LANGUAGE 会被 gettext 忽略」为「仅当前 locale 为 C 时忽略」,补充语言环境生效范围。
  • data/...metainfo.xml:修正 4.10.2 冒烟测试覆盖范围的夸大表述,收敛 4.10.1 的兼容性声明。

验证

  • 本机无 Vala / Meson 工具链,编译与单测只能靠 CI;已做:git diff --check、bash -n tools/build-windows-package.sh、metainfo XML 解析。
  • CI 结果(run 43082679622,全绿):vala-lint 通过;DEB / Flatpak / Windows / macOS 四个构建 job 全部通过;tools/build-deb.sh 的全量 meson test 13/13 OK,新增的 test_project_manager 已在其中通过(1/1 ... OK);Windows 便携包 5 个 i18n 冒烟用例全部 OK。
  • 迭代说明:首个 CI run 因 tests/test_project_manager.vala 里命名空间级 owned 字段带初始化器(Owned namespace fields can only be initialized in a function or method)四平台编译失败,已修;另曾误判「CI 不跑 meson test」而在 workflow 里加了冗余步骤,查明 tools/build-deb.sh 本就跑全量单测后已撤销,最终 PR 不改动 workflow。
  • 未做:未 bump 版本号、未加 4.10.3 release 条目、未打 tag / 发 Release;重启链路的单实例竞态(推测级)未改。
  • 未拿到 Flet 版真实项目文件样本,checked_entries 为对象数组的场景仍属未验证。

备注

github.com 在当前网络不可达,本分支通过 GitHub Git Data API 推送;远端 commit 与本地 62da661c SHA、tree、全部 blob 均一致。

- main.vala: 语言环境准备移到 main() 的 app.run() 之前, GUI/CLI/二次实例共用; 显式语言清掉 LC_ALL/LC_MESSAGES; 跟随系统按真实语言优先级判断, locale 拼接处理 @script 后缀

- project_manager/cli: 字段回退改为取到数组才算命中; work_dir 缺失时相对路径丢弃 (不再绑 CWD); null 防御覆盖 checked_dirs/common_phrases/快照; CLI 补存在性过滤与 GUI 对齐

- build-windows-package.sh: i18n 冒烟改为干净 env + 临时 settings.json 驱动 5 个用例, 加 timeout/保留 stderr/避免 SIGPIPE 误报

- tests: 新增 test_project_manager (字段回退/null/正斜杠/相对路径/work_dir 缺失)

- docs/metainfo: 修正 LANGUAGE 表述与冒烟覆盖范围说明
CI 此前只有 vala-lint 与各平台打包, tests/ 从未被编译或执行; 在依赖齐全的 deb 容器里跑新增单测, 用 --no-rebuild 限定单个目标避免外部命令依赖误报。
valac 报 'Owned namespace fields can only be initialized in a function or method' (tests/test_project_manager.vala:34-36), 四平台 CI 全部因此失败; 去掉初始化器, 改由 setup_fixture() 赋值。同时订正 workflow 注释: 各平台会编译 tests/ 目标, 缺的是 meson test 执行。
查明 tools/build-deb.sh 内含 'meson test -C BUILD --print-errorlogs --num-processes=1', CI 日志显示 Ok: 13, 新增单测已自动纳入; 前一次基于误判加的 workflow 步骤撤回, 最终 PR 不改动 workflow。
@Sam-Fic
Sam-Fic merged commit be38909 into main Nov 11, 2026
7 checks passed
Sam-Fic added a commit that referenced this pull request Nov 11, 2026
合并 PR #5 (语言设置覆盖 CLI 入口、项目文件兼容与 CWD 绑定修复) 后的版本发布:

- meson.build 版本号 4.10.2 -> 4.10.3
- metainfo 新增 4.10.3 release 条目 (2026-11-12), 覆盖语言环境统一入口、
  LC_ALL/LC_MESSAGES 优先级、5 用例 i18n 冒烟、字段回退与 null 防御、
  GUI/CLI 加载一致性与新增单测
@Sam-Fic
Sam-Fic deleted the fix/i18n-cli-and-project-compat branch November 12, 2026 08:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant