SystemInformer 本地化机制实战:从区域适配到多语言资源扩展
【免费下载链接】systeminformerA free, powerful, multi-purpose tool that helps you monitor system resources, debug software and detect malware. Brought to you by Winsider Seminars & Solutions, Inc. @ https://windows-internals.com项目地址: https://gitcode.com/GitHub_Trending/sy/systeminformer
当你把 SystemInformer(一款监控资源、调试进程并排查恶意软件的系统工具)交给习惯母语界面的同事,会发现它的菜单和对话框基本是固定的英文。拆开看:它现在能按地区显示数字,文字却只有单语,而你又能自己补一门语言。
本地化原理拆解:资源按 LCID 分组
SystemInformer 的界面文本走的是 Windows 标准的"资源卫星"路线。文本不写死在 C 代码里,而是抽到.rc资源脚本中,由rc.exe编译时给每段资源打上语言标记(LCID,语言+地区的编号)。运行时加载器按当前进程语言偏好,从资源段里挑出匹配的那份字符串。
读取区域设置的逻辑集中在 phlib/util.c 的 locale 系列函数。取不到系统 locale 时,它会直接退回美式英语:
LCID PhGetUserDefaultLCID(VOID) { LCID localeId = LOCALE_USER_DEFAULT; if (NT_SUCCESS(NtQueryDefaultLocale(TRUE, &localeId))) return localeId; return MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT); }这里有个双轨设计:定义了PHNT_NATIVE_LOCALE时直接调 Win32 API,否则用NtQueryDefaultLocale这类底层接口反推,保证在没有 Win32 环境(比如驱动侧)也能拿到 locale。
本地化现状速览:数字已适配,文字仍单语
先把"已支持什么、还缺什么"摆清楚:
| 能力 | 状态 | 证据 |
|---|---|---|
| 数字/小数按区域格式化 | 已支持 | CHANGELOG.txt 第 369 行 "Fixed Show CPU Below 0.01 not respecting locale" |
| 读取系统/用户 locale | 已支持 | phlib/util.cPhGetUserDefaultLCID等函数 |
| 多语言界面资源 | 未提供 | SystemInformer.rc 第 20 行仅LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US |
| 卫星 DLL(其他语言) | 未提供 | 仓库内无其他语言的.rc文件 |
翻译成人话:它能"按你的地区习惯显示数字",但"界面文字"目前只有英语一套。这是很多专业调试工具的现状——功能优先,文字本地化留给社区。
实操路径:三步搞清界面语言从哪来
第一步:分清"显示语言"与"区域格式"
界面行为由两个独立设置决定,先别混为一谈。
- 打开「设置 → 时间和语言 → 语言」,看显示语言。
- 再看「区域」里的格式(例如"中文(简体,中国)")。
- 完全退出并重启 SystemInformer。
你会看到:数字、日期随"格式"变化;菜单、按钮文字不变,因为后者只有英语资源。
第二步:看懂运行时如何选语言
为什么改了"格式"数字变了、菜单却没变?下面的时序图说清楚:
- locale 只影响格式,不影响文字。
- 想让菜单变中文,必须让 Windows 找到一套 LCID 为
0x0804的资源。
第三步:定位你要翻译的文本源
所有界面文本都在各模块的.rc里,按对话框(Dialog)组织。以进程通用信息框为例(摘自 SystemInformer/SystemInformer.rc):
IDD_PROCGENERAL DIALOGEX 0, 0, 260, 260 CAPTION "General" BEGIN PUSHBUTTON "Permissions",IDC_PERMISSIONS,143,218,50,14 PUSHBUTTON "Terminate",IDC_TERMINATE,197,218,50,14 GROUPBOX "File",IDC_FILE,7,7,246,103 END要翻译哪块,就去对应模块的.rc找匹配的DIALOGEX/MENU/STRINGTABLE。主程序在 SystemInformer/SystemInformer.rc;各插件各自独立,比如 plugins/ToolStatus/ToolStatus.rc。
进阶定制:手写一套卫星 DLL
有编译环境后,就能手动加一门语言。Windows 的标准做法是在同一段资源里再开一个语言分支,而不是另建新文件。改动点在 SystemInformer.rc 的语言分支结构上:
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US IDD_PROCGENERAL DIALOGEX ... CAPTION "General" ... #endif + +#if defined(AFX_TARG_ZHCN) +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_PRC +IDD_PROCGENERAL DIALOGEX ... +CAPTION "常规" +BEGIN + PUSHBUTTON "权限",IDC_PERMISSIONS,143,218,50,14 + PUSHBUTTON "结束",IDC_TERMINATE,197,218,50,14 +END +#endif这里0x0804是简体中文的 LCID,AFX_TARG_ZHCN是资源编译器识别的目标宏。把目标语言告诉rc.exe,再链成 DLL:
rc /l 0x0804 SystemInformer\SystemInformer.rc link /DLL /OUT:SystemInformer_zh-CN.dll SystemInformer.res产物SystemInformer_zh-CN.dll就是卫星 DLL(Satellite DLL)——只装语言资源、不含逻辑的独立动态库。把它和主程序放同一目录,Windows 会按进程 UI 语言自动加载。主工程看 SystemInformer/,插件看 plugins/ 各自目录。
避坑与排错:三类高频问题
问题一:改了区域,数字格式没变
- 现象:区域设为中文,但 CPU 百分比、内存数字仍按英文习惯。
- 根因:phlib/util.c 里
PhGetUserDefaultLCID()取不到时直接退回美式英语(源码MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT)),不读任何配置文件。 - 解法:确认「控制面板 → 区域 → 格式」已设成目标语言,且以当前登录用户身份运行(不是
SYSTEM服务账户);改完完全退出再启动,别只关窗口。
问题二:装了卫星 DLL,界面仍是英文
- 现象:把
SystemInformer_zh-CN.dll拷进目录,重启后菜单还是英文。 - 根因:Windows 按进程 UI 语言而非文件命名匹配资源;显示语言不是 zh-CN 时不会加载它。
- 解法:把「显示语言」设为简体中文,或在「应用语言首选项」里为 SystemInformer 指定 zh-CN,再重启程序。
问题三:编译报资源重复或目标宏未定义
- 现象:
rc编译报"同一 LCID 下对话框重复"或目标宏缺失。 - 根因:同一 LCID 分支里重复定义了
IDD_PROCGENERAL,或漏了AFX_TARG_*守卫。 - 解法:每个语言分支必须包在独立的
#if defined(AFX_TARG_XXX)块内,确保一个 LCID 只出现一次对话框 ID。
趋势前瞻:区域已稳,文字待补
从项目轨迹看,本地化大概率往三个方向走:
- 区域格式化已稳定,是社区扩展文字翻译的基础。
- 卫星 DLL 机制天然支持多语言并行,无需改主程序逻辑。
- 各插件独立
.rc,翻译可按模块分批推进。
SystemInformer 现在给的是"能按地区显示、文字暂单语"的务实方案,但底层已为多语言铺好路。想跟踪它的本地化进展,去项目仓库的更新日志和讨论区看看吧。
【免费下载链接】systeminformerA free, powerful, multi-purpose tool that helps you monitor system resources, debug software and detect malware. Brought to you by Winsider Seminars & Solutions, Inc. @ https://windows-internals.com项目地址: https://gitcode.com/GitHub_Trending/sy/systeminformer
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考