GTweak 本地化机制拆解:15 个语言目录如何做到 522 键全对齐
GTweak 本地化机制拆解15 个语言目录如何做到 522 键全对齐【免费下载链接】GTweakPortable Tool for an Ideal Windows Setup项目地址: https://gitcode.com/GitHub_Trending/gt/GTweakGTweak 的本地化机制全部收在Languages/一个目录里一份英文基准、一个语言目录、14 份语言文件再加一个同步脚本兜底。读完这篇你能带走一套 WPF 项目可直接复用的「资源字典热切换 区域变体命名 脚本对账」模式。一、这套设计在解什么问题多语言桌面应用最头疼的是两件事切语言时界面要整体刷新以及十几种语言在版本迭代中「掉队」。GTweak 没有引入 .resx、卫星程序集或任何第三方 i18n 库而是用了 WPF 最原生的手段——MergedDictionaries热替换。.Source/GTweak/Languages/ ├── en/Localize.xaml ← 英文基准所有翻译的对账标准 ├── pt-BR/Localize.xaml ← 区域变体语言小写 地区大写 ├── zh-CN/Localize.xaml ├── zh-TW/Localize.xaml └── LanguageCatalog.xaml ← 语言目录原生名 缩写组件路径核心约束基准文件en/Localize.xaml522 键按 16 个#region分区语言目录LanguageCatalog.xamlkey 全小写下划线值写原生语言名语言文件zh-CN/Localize.xaml键与基准完全一致只改值同步脚本Tools/LocalizeSync.cmd以基准重排结构、报告差异关键取舍它把「语言包」做成了普通资源文件而不是编译进程序集的卫星组件。代价是运行时按路径拼 URI 加载换来的是翻译者零门槛——会复制文件夹就能贡献无需理解 .resx 和构建流程。对社区驱动翻译的项目这个取舍是对的。二、核心规则逐条过规则一x:Key是契约只许改值✅ 正确写法v:String x:Keybtn_change更改/v:String❌ 典型错误v:String x:Key按钮_更改更改/v:String键名是界面与文案之间的绑定契约XAML 里大量{DynamicResource btn_change}直接按键取文案改键等于断链。规则二区域变体目录名遵循「语言小写-地区大写」✅ 正确写法Languages/ ├── pt-BR/ └── zh-CN/❌ 典型错误Languages/ ├── pt-br/ ← 地区小写 └── zh_cn/ ← 用了下划线运行时用HardwareProvider.GetCurrentSystemLang()读出zh-CN这类系统语言标识去拼路径大小写或分隔符错一位就加载不到文件静默回退到英文。规则三目录 key 与文件夹名是两套大小写体系✅ 正确写法v:String x:Keypt_brPortuguês (BR)/v:String v:String x:Keyzh_cn简体中文 (CN)/v:String❌ 典型错误v:String x:Keypt-BRPortuguês (BR)/v:StringGlobalOptions.AvailableLangs会把 key 里的下划线替换成连字符去匹配系统区域设置key 写成pt-BR就匹配不上这个语言在界面下拉框里直接消失。规则四#region分区注释必须保留✅ 正确写法!--#region Load Window -- v:String x:Keytitle_load加载中/v:String !--#endregion--❌ 典型错误翻译时顺手删掉或重命名分区注释。同步脚本用分区名做对齐检查分区名乱了差异报告就不可信。规则五新增语言要同时改三处执行顺序有依赖缺一步就失效建文件夹路径即语言标识如nl/复制基准文件并翻译键一个不能动在LanguageCatalog.xaml注册一行 key跑一次同步脚本确认 522 键全部对齐 新手最常踩的坑文件夹名用连字符pt-BR目录 key 用下划线pt_br。记住口诀——「路径带横线大写地区key 全小写下划线」。三、跟着做一遍新增一门荷兰语假设你要给 GTweak 加荷兰语nl完整路径如下复制基准目录→ 位置.Source/GTweak/Languages/→ 动作en整个拷成nl只翻译值→ 位置nl/Localize.xaml → 注意522 个键一个都不能删注册到目录→ 位置LanguageCatalog.xaml在末尾加一行v:String x:KeynlNederlands (NL)/v:String确认构建包含→ 位置GTweak.csproj → 已有Page IncludeLanguages\**\*.xaml通配新目录自动进包脚本对账→ 位置Tools/LocalizeSync.cmd → 先-DryRun确认报告里没有[-] Keys deleted真机切换验证→ 位置主界面语言下拉框 → 注意选择后立即整体换语言不重启切换的原理在 App.xaml.cs 的Language属性先把所有Languages/前缀的旧字典从MergedDictionaries里移除再加入新语言的字典然后触发LanguageChanged事件。界面绑定的都是{DynamicResource 键名}所以整窗文字一次性刷新无需重建窗口。四、让机器帮你兜底同步工具是一个 Polyglot 文件双击走 CMD 引导内容其实是 PowerShell支持这些参数参数类型用途-DryRunswitch只输出差异报告不写文件-Backupswitch写入前生成.bak备份-Placeholderswitch缺失键自动填空占位符v:String x:Keyx/v:String-RefFilestring指定基准文件默认en/Localize.xaml-BasePathstring指定语言根目录默认自动向上探测推荐工作流以 Windows 为例cd Tools powershell -ExecutionPolicy Bypass -File .\LocalizeSync.cmd -DryRun powershell -ExecutionPolicy Bypass -File .\LocalizeSync.cmd -Backup -Placeholder先-DryRun看清单哪些语言多了什么键、少了什么键处理翻译问题后带-Backup正式执行脚本按基准文件重排整个文件结构出问题时用.bak一键回滚脚本的修复逻辑值得抄它不逐行修补而是直接拿英文基准的全文当模板把每个v:String元素替换成目标语言里对应键的值。这样键的顺序、分区注释、换行风格永远和基准一致diff 干净到只有值在变。五、代码之外的延伸贡献流程README.md 的「Localization Translation」章节把提交通道写成了 PR 和 Issue 两条路不熟 Git 的翻译者可以走 Issue 直接附文件文档同步仓库根目录为每种语言放了一份完整 README如 README-zh-cn.md、README-pt-br.md程序内切了语言看文档的人也能对上默认语言App.xaml 在MergedDictionaries里预置了Languages/en/Localize.xaml保证任何加载失败的场景下界面至少有英文兜底六、提交前 Checklist文件夹名为 BCP-47 格式pt-BR、zh-CN目录 key 为全小写下划线pt_br键名与英文基准逐键一致条目数对齐基准522 键#region分区注释完整保留同步脚本-DryRun报告无差异对应语言根目录 README 已更新GTweak 用「资源字典热切换 双轨命名规范 脚本重排兜底」把 15 种语言的维护成本压到接近零。任何 WPF/桌面应用想做社区翻译这套Languages/三件套可以直接搬走。【免费下载链接】GTweakPortable Tool for an Ideal Windows Setup项目地址: https://gitcode.com/GitHub_Trending/gt/GTweak创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考