grepWin 多语言支持原理拆解:28 种语言是怎么做到的
grepWin 多语言支持原理拆解:28 种语言是怎么做到的
【免费下载链接】grepWinA powerful and fast search tool using regular expressions项目地址: https://gitcode.com/gh_mirrors/gr/grepWin
grepWin 是一款用正则表达式做全文搜索的桌面工具,它的国际化做得相当扎实:内置 28 种语言,启动时界面自动跟随你的习惯语言显示,随时可以在设置里切换。本文以"用户操作 → 系统行为"的方式,拆解 grepWin 国际化的实现思路,顺带看看新增一种语言要动几个文件。
为什么打开 grepWin,界面就是你的语言?
你会注意到一个细节:很多小工具装完打开就是英文,而 grepWin 如果你系统语言是中文,它第一次启动大概率已经是中文界面了。
这个效果并不神秘。启动流程里有一句关键代码(位于src/grepWin.cpp):
CLanguage::Instance().LoadFile(bPortable ? g_iniFile.GetValue(L"global", L"languagefile", L"") : std::wstring(CRegStdString(L"Software\\grepWin\\languagefile")));翻译一下:程序启动时读取"你上次选择的语言文件路径"(便携版从 ini 读,安装版从注册表读),交给CLanguage这个单例类加载。之后界面上所有文本都从这份语言文件里查表显示。语言文件全部集中在项目根目录的translations/文件夹下,一个.lang文件对应一种语言,共 28 个,从Chinese Simplified.lang到Vietnamese.lang一应俱全。
一次语言切换,系统里发生了什么?
换个角度,从"你在设置里换了个语言"这个动作开始跟踪。整个链路只有四步:
| 步骤 | 发生了什么 | 位置 |
|---|---|---|
| 1 | 用户在设置对话框选定语言,点确定 | src/Settings.cpp |
| 2 | 调用LoadFile(langPath)重新加载语言文件 | src/Settings.cpp |
| 3 | 调用TranslateWindow把主窗口所有控件文本重刷一遍 | 同上 |
| 4 | 新语言路径被记住,下次启动直接生效 | 注册表 / 便携版 ini |
注意第 3 步:不是重启程序,而是把已经创建好的控件文字逐一替换掉。这就是为什么 grepWin 换语言是"秒切"的——窗口结构没变,变的是文本内容。
CLanguage 单例到底做了什么
🔧 所有翻译动作最终都收敛到CLanguage这一个类上,它对外暴露的能力可以按"界面元素 → 接口"来记:
- 整窗翻译:
TranslateWindow。对话框初始化时调一次(如CLanguage::Instance().TranslateWindow(*this);),窗口里所有静态文本、按钮、标签批量换文。关于对话框、书签对话框等十几个窗口都是这么干的。 - 菜单翻译:
TranslateMenu。右键菜单是运行时动态插入的项,没法走控件翻译,所以单独提供菜单接口,传入菜单句柄即可整体换文。 - 单条字符串:
TranslatedString(hResource, IDS_XXX)。用于工具提示、动态拼接的提示语这类"散落在代码里"的文本,查表返回译文,例如给按钮挂 tooltip 时:
AddToolTip(IDC_PATTERN, TranslatedString(hResource, IDS_PATTERN_TT).c_str());三个接口的粒度正好覆盖了三种 UI 载体:控件、菜单、字符串,用哪个查表都由CLanguage内部那份"原文 → 译文"映射决定。
新增一种语言只需三步
语言文件的格式很简单,本质是msgid(英文原文)+msgstr(译文)的键值对,以translations/English.lang为例:
msgid "&About grepWin..." msgstr ""给 grepWin 加一门新语言的流程:
- 复制模板:把
translations/English.lang复制一份,命名为新语言名,如Nepali.lang; - 只改译文:文件头部注释写得很清楚——
ONLY change the msgstr field,只翻译msgstr后面的内容,msgid原样保留; - 生效验证:在设置里选中新语言,
LoadFile会自动加载它,检查界面、菜单、工具提示是否全部替换。
整个过程中没有改任何一行 C++ 代码,翻译资源和程序逻辑是完全解耦的。
小结
- 28 份
.lang文件集中在translations/目录,程序与文本互不依赖,加语言零代码改动; CLanguage单例提供LoadFile、TranslateWindow、TranslateMenu、TranslatedString四个入口,分别负责加载、整窗、菜单和单条文本;- 语言选择在设置里即时生效,无需重启,启动时则自动恢复上次的选择。
【免费下载链接】grepWinA powerful and fast search tool using regular expressions项目地址: https://gitcode.com/gh_mirrors/gr/grepWin
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
