Skip to content

feat(nsis): 安装器自定义文案随系统语言(简中/繁中/英文)#317

Merged
Sway-Chan merged 2 commits into
dododook:mainfrom
Sway-Chan:feat/nsis-installer-i18n
Jul 17, 2026
Merged

feat(nsis): 安装器自定义文案随系统语言(简中/繁中/英文)#317
Sway-Chan merged 2 commits into
dododook:mainfrom
Sway-Chan:feat/nsis-installer-i18n

Conversation

@Sway-Chan

Copy link
Copy Markdown
Collaborator

问题

NSIS 安装器的两处自定义文案此前硬编码、不随系统语言:

electron-builder 自带的 MUI 主体页面(欢迎/目录/进度/完成)本就随系统语言,问题只在这两处自定义注入的文案。

修复

改为运行时按 $LANGUAGE 的 LCID 选简中(2052)/繁中(1028)/英文,覆盖 maintenance 页 5 处 + customUnInstall 3 处。

为什么不用 electron-builder 的 messages.yml

试过 build/messages.yml + $(id) LangString(electron-builder 官方机制),但反复因 makensis warning 6040「LangString not set in language table」-WX 当 error 打包失败。根因:electron-builder 把 messages.yml 生成的 LangString 放在 sharedHeader(脚本最前),早于 installer.nsiaddLangs(MUI_LANGUAGE 加载)——LangString 定义先于语言加载,末尾语言表 cross-check 缺失。缩减 installerLanguages 或补全 fallback 均未绕过(还连带撞上 fa 无 Persian.nlf)。

改用运行时判断:SelectLang 宏在函数体内 insert,届时 MUI_LANGUAGE 已加载、$LANGUAGE 为当前 LCID,纯数字比较不依赖任何编译期语言常量,彻底绕过顺序问题。运行时变量($flowzExistingVer/$flowzExistingDir)拼在选出字符串外,译文内只留编译期 ${VERSION}

覆盖范围

  • 简中 / 繁中 / 英文三种自定义文案。
  • app 的 ru/fa 无对应 NSIS .nlf(bundledLanguages 本就不含 fa),自定义文案 fallback 英文;MUI 主体页面仍随系统语言(全套 bundledLanguages 不变)

验证

  • 本地 electron-builder --win nsis 真实编译(makensis 3.0.4.1,与 CI 同版本)通过FlowZ-4.2.8-win-x64-setup.exe 产出、无 warning、exit 0。
  • 运行时语言选择需 Windows 真机确认(本地编译只验语法+产出,$LANGUAGE 实际取哪条译文要真机跑):中文系统装 → maintenance 页中文;英文系统卸载 → 进度英文。

依赖

本 PR 基于 #315(NSIS uninstaller Var 打包修复),含其 commit——installer.nsh 若无 #315!ifndef BUILD_UNINSTALLER 包裹,打包同样会因 warning 6001 失败。建议 #315 先合,或本 PR 一并带入。

Refs #312 #314

dododook#314 打包在 main 上失败:makensis warning 6001「Variable flowzExistingDir
not referenced or never set」被 electron-builder 当作 error。

根因:electron-builder 把 build/installer.nsh 同时 include 进 installer 与
uninstaller 两个编译单元。flowzExistingDir 等 4 个 Var 只被 customInit/
customWelcomePage 引用,而这两个宏仅在 !ifndef BUILD_UNINSTALLER 分支插入,
故 uninstaller 单元里这些 Var 声明却无处引用,触发 warning-as-error。

用 !ifndef BUILD_UNINSTALLER 包住这 4 个 Var 声明(与模板对 installer-only
变量的处置一致)。preInit 用 $R0-$R2 通用寄存器、不碰这些 Var,两单元插入无碍。

PR CI 的 package job 不编译 NSIS installer,仅 main push 的 full package 才
编译,故此问题 PR 阶段的 CI 未覆盖。
maintenance 页(升级/卸载选择)与 customUnInstall 卸载进度文案此前硬编码
(maintenance 英文、customUnInstall 中文),不随系统语言——中文用户看到英文
升级页、英文用户卸载时看到中文进度。改为运行时按 $LANGUAGE 的 LCID 选简中
(2052)/繁中(1028)/英文。

未用 electron-builder 的 messages.yml/LangString:其 LangString 在 sharedHeader
生成、早于 installer.nsi 的 addLangs(MUI_LANGUAGE 加载),makensis 报 warning
6040「language table 缺该 string」被 -WX 当 error → 打包失败。改运行时判断,宏在
函数体内 insert 时 MUI_LANGUAGE 已加载、$LANGUAGE 有当前 LCID,纯数字比较不依赖
编译期语言常量。

electron-builder 自带的 MUI 主体页面仍随系统语言(全套 bundledLanguages 不变)。
app 的 ru/fa 无对应 NSIS .nlf,自定义文案 fallback 英文。

本地 electron-builder --win nsis 真实编译验证通过(setup.exe 产出、无 warning)。
@Sway-Chan
Sway-Chan merged commit 5bf993e into dododook:main Jul 17, 2026
4 checks passed
@Sway-Chan
Sway-Chan deleted the feat/nsis-installer-i18n branch July 17, 2026 18:02
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