ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

GTweak 14 种语言怎么维护?WPF 本地化一次讲清

GTweak 14 种语言怎么维护?WPF 本地化一次讲清

GTweak 14 种语言怎么维护?WPF 本地化一次讲清

【免费下载链接】GTweakPortable Tool for an Ideal Windows Setup项目地址: https://gitcode.com/GitHub_Trending/gt/GTweak

WPF 应用扛着 14 种非英语语言,每加一种要动一堆文件,很容易乱。GTweak 的本地化思路很直接:一语言一文件夹,靠同步脚本兜底。

资源加载链路:Localize.xaml 运行时怎么找到

所有文案集中在固定路径:.Source/GTweak/Languages/。目录里一共 15 个文件夹:14 种非英语语言加英文基准en,每个文件夹只放一个Localize.xaml(标准 WPF 资源字典)。运行时不是扫全目录,而是按四步定位:

  1. 启动时读取系统区域设置,拿到code-region组合,比如zh-CN;
  2. 拿它去语言清单里匹配,清单就是 LanguageCatalog.xaml 的 key 集合,key 里的_会转回-再比较;
  3. 命中后拼出资源地址Languages/zh-CN/Localize.xaml,合并进全局资源字典;
  4. 完整区域没命中但语言部分命中(比如pt-PT的pt),回退到对应语言文件夹;再没有就用英文。

这回答了常见疑问:为什么 pt-BR 和 zh-CN 必须各占一个文件夹?因为地址是按系统区域逐字符拼出来的,zh-CN 和 zh-TW 拼出的是两条不同的路径,合在一个文件夹里就是后者覆盖前者。这是运行时匹配逻辑决定的,不是人为规定。回退规则也写死在代码里(例如白俄罗斯语be会落到俄语),用户在 Windows 里选了巴西葡语,程序就自动加载 pt-BR,绝不会拿到中文。

新增语言四步走:以 ja-JP 为例

  1. 复制en文件夹,重命名为ja-JP。内部文件名 Localize.xaml 保持不动,它是资源地址的一部分。复制 en 最干净:键集完整、顺序就是基准;复制其他语言可能带上未翻译的残留。
  2. 把 Localize.xaml 里的值改成日语,键名一个字符都不要动。
  3. 在 LanguageCatalog.xaml 注册一行(key 全小写下划线,显示名用原生写法):
<v:String x:Key="ja_jp">日本語 (JP)</v:String>
  1. 跑一遍同步脚本验证,ja-JP 的差异报告为零就完成。注册顺序不影响界面展示,程序会按代码自动排序。

文件夹名和目录 key 的大小写坑

文件夹名跟随系统区域设置惯例(BCP-47 风格:语言小写、地区大写、连字符连接),目录 key 是另一套规则:全小写、下划线替代连字符。口诀是「路径带横线大写地区,key 用全小写下划线」。

出现位置错误写法正确写法
文件夹名PT_BRpt-BR
目录 keypt-BRpt_br

两处写错都会让该语言在运行时「消失」:文件夹名错是地址拼不出来,key 错是清单匹配不上。这也解释了为什么同步脚本能自动修目录 key——规范统一,脚本才敢按同一条规则改写。

翻译 Localize.xaml 的三条铁律

  • 不改x:Key。键是程序与界面之间的契约,改键即断链:
<v:String x:Key="btn_change">Change</v:String> <!-- 英文基准 --> <v:String x:Key="btn_change">変更</v:String> <!-- 只动值 -->
  • 保留#region分区注释。文件按窗口和页面切成 16 个区(Load Window、Main Window、Packages Page 等),翻译时按区对照原文最方便,同步脚本也是靠这些注释名做区域比对的。
  • 条数与基准对齐。英文基准 522 个键,pt-BR 和 zh-CN 也各是 522。条数对不上,说明漏翻或多了键,提交前必须查清。

翻译前必跑的同步脚本:LocalizeSync

Tools/LocalizeSync.cmd 是双击即用的批处理封装(内部是 PowerShell),以en/Localize.xaml为基准,自动定位 Languages 目录,无需手填路径。三个能力:

  • 键名规范化:把目录里pt-BR这类 key 自动改写成pt_br。
  • 差异报告:逐语言列出新增/删除的键和区域,[+]与[-]标注。
  • 安全参数:-DryRun只报告不写盘,-Backup写前留.bak,-Placeholder给缺失键自动填空占位。

推荐工作流三步:DryRun 确认 → 正式执行 → Backup 兜底。

Tools\LocalizeSync.cmd -DryRun # 先看差异清单 Tools\LocalizeSync.cmd -Backup # 正式执行并留底

正式执行会把每个语言文件按 en 的结构重排,只保留各语言自己的值;翻译错乱了用 .bak 恢复即可。

文档层:README 按语言分拆

本地化延伸到了文档:仓库根目录每种语言一份独立 README(README-zh-cn.md、README-pt-br.md 等,非英语共 13 份),主 README 顶部用国旗徽章链接到各自文档。其中「Localization & Translation」章节给出翻译贡献的两个入口:直接提交 PR,或先提 Issue 请求后由维护者协助处理。

提交前自检清单

  • ✅ 文件夹名 pt-BR 格式
  • ✅ 目录 key 小写下划线
  • ✅ 键与英文基准完全一致
  • ✅ 分区完整、条数对齐
  • ✅ 跑 LocalizeSync.ps1 -DryRun,确认零差异再提交

【免费下载链接】GTweakPortable Tool for an Ideal Windows Setup项目地址: https://gitcode.com/GitHub_Trending/gt/GTweak

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进