ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

grepWin多语言支持从零看懂:一段界面文案变成中文的完整旅程

2026/8/22 5:59:21 拓冰建站 浏览量
grepWin多语言支持从零看懂:一段界面文案变成中文的完整旅程 grepWin多语言支持从零看懂一段界面文案变成中文的完整旅程【免费下载链接】grepWinA powerful and fast search tool using regular expressions项目地址: https://gitcode.com/gh_mirrors/gr/grepWingrepWin 是一款基于正则表达式的 Windows 文件搜索工具装好后在设置里切到简体中文、德语、日语整个界面会立刻跟着变。这种多语言支持是怎么做到的别急着翻类图我们跟着一段界面文案的旅程走一遍从你看到中文按钮开始倒推到它被翻译、被加载的全过程。先问一个问题为什么换个设置界面就全变了场景是这样的你在设置对话框里把语言从 English 改成 简体中文 Simplified点确定设置窗口关掉主界面上所有的 Search、Settings 都变成了搜索、设置。没有重启没有弹窗确认。这背后其实是三步接力启动时选定语言文件 → 打开对话框时按键查词典 → 把译文画到控件上。下面按这个顺序拆开看。译文都藏在哪儿translations/ 里的 28 本词典所有语言资源集中放在项目根目录的 translations/ 文件夹里一共 28 个.lang文件从 English.lang 到 Chinese Simplified.lang 再到 Japanese.lang。.lang不是自创格式而是 gettext 社区通用的PO 格式。打开 Chinese Simplified.lang 能看到典型的条目文件中的内容含义msgid Copy path to clipboard英文原文相当于词典里的原词也是查找用的键msgstr 复制路径到剪贴板该语言的译文即词典里的释义也是值#开头的注释行给维护者看的说明比如加速器键的书写格式所以你可以把每个语言文件理解成一本小词典键是英文原句值是译文。程序要找Copy path to clipboard的中文版就是拿这个键去翻词典。English.lang 是母版其他 27 个文件都是基于它翻译出来的副本。第一步启动时选定语言 —— LoadFile程序启动时会先决定用哪本词典。相关代码在 src/grepWin.cpp 第 443 行附近CLanguage::Instance().LoadFile(bPortable ? g_iniFile.GetValue(Lglobal, Llanguagefile, L) : std::wstring(CRegStdString(LSoftware\\grepWin\\languagefile))); // 启动时加载语言文件便携模式读 ini安装模式读注册表这里有个bPortable分支grepWin 支持绿色便携模式。便携版把用户选过的语言文件路径记在 ini 配置里安装版记在注册表Software\grepWin\languagefile下。两边取出来的都是一个文件路径交给LoadFile打开。如果两个地方都是空的用户从没选过语言LoadFile拿到空路径程序就退回内置的英文文案。第二步翻译引擎 CLanguage 与整窗翻译 TranslateWindow注意CLanguage::Instance()这个单例调用——CLanguage类本身并不在 grepWin 的源码目录里它来自共享库 sktoolslib/一个 git 子模块作者其他 Windows 工具复用的基础库。grepWin 只负责调用翻译引擎是现成拿来用的这正是本地化代码和业务代码解耦的体现。LoadFile做的事很简单把整个 PO 文件读进内存建好键 → 译文的映射。之后任何时刻要翻译一个字符串都是查这张内存表。主窗口和各对话框初始化时会调用CLanguage::Instance().TranslateWindow(*this); // 遍历本窗口所有子控件用词典查一遍并替换显示文本SearchDlg.cpp主界面、Settings.cpp设置页、AboutDlg.cpp关于页等每个对话框都照此办理。TranslateWindow会遍历窗口里所有子控件取当前文本拿它当键去词典里查查到就替换查不到就保持原样——这也是为什么漏翻一个词条时界面上会中英混排而不是显示乱码。第三步弹窗菜单和动态文本的另外两条路TranslateWindow只覆盖长在窗口里的控件。还有两类文本它管不着弹窗菜单。右键结果列表弹出的菜单、书签对话框的菜单是用InsertMenu临时创建的不属于任何窗口。这类菜单用TranslateMenu统一处理例如 BookmarksDlg.cpp 里对hPopup菜单的翻译调用。代码里动态生成的文本。比如右键菜单的每一项都是运行时插入的每条插入前先用TranslatedString取译文见 ShellContextMenu.cpp::InsertMenu(m_menu, 1, MF_BYPOSITION | MF_STRING, 1, TranslatedString(g_hInst, IDS_OPENCONTAININGFOLDER).c_str()); // 插入右键菜单项显示文本先经翻译函数取译文TranslatedString和前面两种方式略有不同它按资源 IDIDS_OPENCONTAININGFOLDER这类常量去查译文而不是拿整句原文当键。三种方式各管一段——窗口控件用TranslateWindow弹窗菜单用TranslateMenu零散字符串用TranslatedString。不重启切换语言设置对话框里的两行关键代码设置对话框里那个语言下拉框选定后点确定处理逻辑在 src/Settings.cpp 的DoCommandIDOK 分支中先把路径存进注册表或 ini决定下次启动用什么语言然后立刻执行两行CLanguage::Instance().LoadFile(langPath); CLanguage::Instance().TranslateWindow(::GetParent(*this)); // 重新加载词典并重刷设置对话框的父窗口主界面先换词典再拿新词典把主窗口整体重刷一遍。因为词典和界面刷新的成本都很低整个切换是即时的不需要重启进程。新增一种语言的三步做法想给 grepWin 贡献一门语言或者补全某个语言的漏翻不用碰任何 C 代码打开 translations/English.lang复制一份按LanguageName.lang的命名习惯重命名文件名里的空格和语言展示名对应。逐条翻译保持每个msgid原封不动只改它下面msgstr里的内容不确定的条目把msgstr留空即可程序会回退显示英文原文。保存后重启 grepWin在设置 → Language 下拉框里选中新语言逐一检查主界面、右键菜单、设置页是否全部生效。这套国际化设计值得记住的几点文案与代码彻底分离全部译文集中在.lang文件里加语言零代码改动翻译人员可以独立完成三级翻译接口TranslateWindow/TranslateMenu/TranslatedString分别对应整窗、菜单、单串调用方按场景取用最省力的那个运行时热切换语言文件路径只是注册表/ini 里一个普通设置项换语言即时生效引擎可复用CLanguage放在共享库 sktoolslib 中作者的多个工具共用同一套翻译机制看懂了这条选定词典 → 按键查表 → 画到界面的旅程你再去审视其他开源项目的多语言实现多半都能对号入座。【免费下载链接】grepWinA powerful and fast search tool using regular expressions项目地址: https://gitcode.com/gh_mirrors/gr/grepWin创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考