资讯动态

SystemInformer 本地化机制实战:从区域适配到多语言资源扩展

发布时间:2026/9/11 17:25:24 来源:尧图企业网站定制
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.rcIDD_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是简体中文的 LCIDAFX_TARG_ZHCN是资源编译器识别的目标宏。把目标语言告诉rc.exe再链成 DLLrc /l 0x0804 SystemInformer\SystemInformer.rc link /DLL /OUT:SystemInformer_zh-CN.dll SystemInformer.res产物SystemInformer_zh-CN.dll就是卫星 DLLSatellite 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),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价