
切换一次语言的瞬间发生了什么grepWin 多语言支持与国际化实现原理拆解【免费下载链接】grepWinA powerful and fast search tool using regular expressions项目地址: https://gitcode.com/gh_mirrors/gr/grepWingrepWin 是一个用正则表达式搜索 Windows 文件的工具自带 28 种语言。在设置里换个语言、点确定窗口立刻变成中文。本文带你弄清这个运行时语言切换背后grepWin 的国际化实现原理到底走了一条什么链路。从一个真实操作开始点下确定的那一秒打开 grepWin 的搜索窗口先记住此刻的样子图上是切换前的英文界面搜索框、正则选项、结果列表全部是原文。现在点 Settings把 Language 下拉框从 English 换成 Chinese Simplified点 OK。几秒钟内按钮、标签、工具提示全部变成中文——没有弹窗、没有请重启。grepWin 项目宣传图正则搜索工具本体保持英文翻译层则完全交给外置语言文件。你刚才完成的就是 grepWin 多语言切换机制里最有意思的一步。下面把这条链路拆成三问语言资源放在哪、翻译何时被触发、切换瞬间程序做了什么。拆开来看语言文件如何被加载、翻译何时被触发语言资源放在哪一个目录和 28 个 .lang 文件所有翻译都集中在仓库根目录的 translations/ 文件夹里每份文件对应一种语言比如Chinese Simplified.lang。打开看它是 gettext 格式的键值对msgid Search for: msgstr 搜索程序用英文原文当钥匙msgid在文件里查到对应的译文msgstr显示出来。设置面板打开时程序会把安装目录下所有.lang文件扫一遍自动填进语言下拉框while (fileEnumerator.NextFile(sPath, bIsDirectory, bRecurse)) { if (ext.compare(L.lang)) continue; m_langPaths.push_back(sPath);这段扫描逻辑意味着语言列表不是写死在代码里的目录里多了什么文件下拉框就多一项。翻译何时被触发启动一次、每个窗口各一次翻译发生在两个时刻。第一个是程序启动它先读回上次保存的语言文件路径CLanguage::Instance().LoadFile( bPortable ? g_iniFile.GetValue(Lglobal, Llanguagefile, L) : std::wstring(CRegStdString(LSoftware\\grepWin\\languagefile)));便携版从 INI 文件读、安装版从注册表读拿到路径后加载文件没存过路径就回落到内置英文。第二个时刻更隐蔽之后每创建一个对话框设置、书签、多行编辑……它都会主动把自己交给翻译器刷新一遍。窗口里的静态文本是编译进二进制的英文原文TranslateWindow相当于给它套一层翻译把能匹配的文本都换成当前语言。切换瞬间程序做了什么换文件 重绘不重启回到那个点下 OK的瞬间src/Settings.cpp 里只做两件事CLanguage::Instance().LoadFile(langPath); CLanguage::Instance().TranslateWindow(::GetParent(*this));先把新语言文件读进内存再把主窗口重新刷新一遍。由于每个对话框创建时都会自己翻译一次之后弹出的新窗口自然就是新语言——这就是 grepWin 支持运行时语言切换、无需重启的原因翻译被推迟到窗口创建时执行而不是启动时一次刷完。设计取舍单例、集中目录与内置英文回落上面讲清了谁来翻、何时翻再琢磨一下作者为什么这么设计。单例全局只保留一个实例的类翻译状态必须是全局唯一的十几个对话框共享同一份译文缓存单例让任何窗口一行代码就能拿到翻译器。项目里的深色主题模块 CTheme 也是同款写法风格统一。译文放外置文件而非资源里语言切换变成换个文件而不是换套资源改翻译不用重新编译.lang 加载失败时还能直接回落到二进制里的英文原文不会出现空白控件。自动扫描代替手动注册新增语言只需在程序目录放一个 .lang 文件扫描代码不动、代码不用改。代价是文件散落在安装目录但对这个场景来说完全划算。动手验证三步确认新语言生效想亲眼看看这条链路三步就够了把仓库克隆下来git clone https://gitcode.com/gh_mirrors/gr/grepWin进 translations/ 目录把English.lang复制一份改名为MyTest.lang随便挑一行把 msgstr 改错比如把 Search for: 的译文改成你好把 MyTest.lang 拷到 grepWin.exe 所在目录运行程序打开设置选 MyTest 确认观察界面哪条文本变了如果选错语言后某条文本退回英文恰好说明那条 msgid 没匹配上——你已经在用断点思维调试翻译层了。想正式加一门语言也是同样的动作以English.lang为模板完整翻译一遍保存进 translations/ 提交即可。那次设置面板前的点击其实只换了一个文件、刷了一层窗口但翻译资源、触发时机、全局状态三件事被安排得井井有条界面才能在毫秒间整体变色。下次你右键语言列表时这条链路已经在内存里跑完了。【免费下载链接】grepWinA powerful and fast search tool using regular expressions项目地址: https://gitcode.com/gh_mirrors/gr/grepWin创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考