grepWin多语言机制一文读懂
【免费下载链接】grepWinA powerful and fast search tool using regular expressions项目地址: https://gitcode.com/gh_mirrors/gr/grepWin
grepWin 是 Windows 上的正则搜索工具,它的国际化把全部译文放进独立的 .lang 文件,切换语言后界面即时重绘、无需重启。看懂这套做法,你自己的 C++ 桌面应用也能照搬。
为什么一个搜索工具要支持多语言
桌面工具一旦分发给不同地区,界面语言就成了使用门槛:同事拿到安装包后看到满屏英文标签,连"搜索包含的文件名"在哪都找不到。
对维护者来说痛点同样明显:如果界面文字硬编码在 C++ 源文件里,每加一种语言都要改代码、重新编译,翻译人员也完全无法参与。
grepWin 的解法就是把 UI 文本从二进制里彻底剥离出来,换成可独立维护的语言资源。
架构速览:资源、引擎、切换三层分离
整套国际化分三层:语言资源层是 translations/ 目录下的一批.lang文件;翻译引擎层是CLanguage单例(由 sktoolslib 依赖库实现,负责把"英文原文 → 目标语言"的映射读入内存);应用层则是每个对话框在创建后自行调用翻译接口完成重绘。
三层之间只通过接口交互,所以"换语言"这件事被压缩成两步:加载新文件、重绘现有窗口。
关键机制拆解
语言文件如何组织:每种语言一个文件
translations/ 目录里每种语言对应一个.lang文件,当前共 28 种。文件格式采用 gettext 体系的 msgid/msgstr 键值对:msgid 是英文原文,msgstr 是译文。
这种格式带来两个好处:文件可直接被 gettext 生态的工具链处理;运行时扫描安装目录即可枚举全部可用语言,下拉列表因此能自动列出所有.lang文件,新增语言不需要改任何注册代码。
翻译如何生效:从单条字符串到整窗批量
翻译接口分三个粒度。最细的是TranslatedString,按资源 ID 取单条译文,适合右键菜单项、工具提示这类动态拼装的文本:
::InsertMenu(m_menu, 1, MF_BYPOSITION | MF_STRING, 1, TranslatedString(g_hInst, IDS_OPENCONTAININGFOLDER).c_str());其次是TranslateMenu,整条弹出菜单批量翻译;最粗的是TranslateWindow,遍历一个窗口的全部控件按 ID 匹配译文。每个对话框(搜索主窗、设置、书签、正则测试等)在构造完成后都只做一件事:
CLanguage::Instance().TranslateWindow(*this);运行时如何切换:加载、持久化、重绘
在设置对话框选择新语言并确定后,流程是这样的:所选.lang文件的路径先被写入持久化位置——便携模式存 ini 文件,安装模式写注册表;随后LoadFile解析新文件,替换CLanguage内存中的映射表;紧接着对主窗口调一次TranslateWindow,所有控件文字就地刷新。
启动时走的是同一条链路的逆查:程序从 ini 或注册表读出上次保存的语言文件路径,再执行同样的加载与翻译。整个过程不重启、不重建窗口,切换是"秒生效"的。
实操:三步给项目新增一种语言
- 复制
translations/English.lang为模板,重命名为目标语言(如Norwegian.lang),保持所有 msgid 原文不动。 - 逐条翻译 msgstr 字段,文件保持 UTF-8 编码保存。
- 放入 translations/ 目录后重启 grepWin,语言下拉列表会自动识别新文件;若要发布安装包,还需在 Setup.wxs 的打包清单中补上该文件。
设计启示
文本与代码走两条通道。界面文字只存在于 .lang 文件里,代码通过资源 ID 间接引用,译者不需要读一行 C++ 就能贡献新语言。
翻译接口按粒度分层。单条、菜单、整窗各有一个入口,调用点按场景取用最合适的粒度,避免每个界面手写遍历逻辑。
切换路径足够短。映射表常驻内存,重绘只需一次TranslateWindow调用,"免重启切换语言"不是设计目标,而是架构短带来的自然结果。
想验证这套机制,可以直接翻一翻 translations/ 目录里任意两个.lang文件对比 msgid 与 msgstr 的对应关系——你会发现 28 种语言共用的是同一份键集。
【免费下载链接】grepWinA powerful and fast search tool using regular expressions项目地址: https://gitcode.com/gh_mirrors/gr/grepWin
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考