尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

grepWin 多语言支持全解:28 种语言背后发生了什么

grepWin 多语言支持全解:28 种语言背后发生了什么 grepWin 多语言支持全解28 种语言背后发生了什么【免费下载链接】grepWinA powerful and fast search tool using regular expressions项目地址: https://gitcode.com/gh_mirrors/gr/grepWin你在设置里把界面语言切成日语、点下确定的一瞬间窗口上的英文按钮没有闪一下再变化而是直接变成了日文——而且程序没有重启。grepWin 这个用正则表达式在海量文件里搜内容的 Windows 工具靠什么做到这一点答案藏在一个单例类、一堆.lang文件里。语言文件都住在哪里所有语言资源集中在 translations/ 目录一个语言一个文件English.lang、Japanese.lang、Chinese Simplified.lang……目前共 28 个。文件名就是语言显示名扩展名固定为.lang设置界面里的语言下拉框是直接扫描程序目录下这些文件生成的所以你往程序目录丢一个新文件它就会自动出现在列表里。文件格式沿用了 gettext 的msgid/msgstr约定msgid是英文原文键msgstr是翻译结果。集中管理带来的好处很直接——译员不用碰任何 C 代码新增一门语言就是往目录里加一个文件删掉一个文件这门语言就没了。资源与程序彻底解耦。一次语言切换的完整时间线负责翻译这件事的核心是一个单例类CLanguage来自项目依赖的 sktoolslib 库它提供四个能力加载文件LoadFile、翻译整个窗口控件TranslateWindow、翻译菜单TranslateMenu、翻译单个字符串TranslatedString。启动时程序先从注册表便携模式下从 ini 文件读取你上次选的语言文件路径交给CLanguage// src/grepWin.cpp 启动时加载语言 CLanguage::Instance().LoadFile(bPortable ? g_iniFile.GetValue(Lglobal, Llanguagefile, L) : std::wstring(CRegStdString(LSoftware\\grepWin\\languagefile)));每个对话框创建完成时会调用一次TranslateWindow(*this)把自己内部所有控件的文本按当前语言文件替换掉。那切换语言呢看 设置界面源码 里点确定后的动作序列四步// src/Settings.cpp 点确定后记路径、加载、翻一遍 CLanguage::Instance().LoadFile(langPath); CLanguage::Instance().TranslateWindow(::GetParent(*this));先把新路径写进注册表或 ini保证下次启动还在用这门语言然后LoadFile把新文件读进CLanguage的内存最后对主窗口调用一次TranslateWindow重刷所有控件。整个过程就是换字典 重查一遍所以不需要重启。界面上的翻译藏在哪些地方翻译其实发生在三个不同的粒度上看这三处就懂了。主搜索窗口——最粗的粒度。窗口初始化时对整窗调用TranslateWindow标签、按钮全部换语言。但工具提示鼠标悬停的小气泡是动态加的得单独逐个翻译AddToolTip旁边紧跟一个TranslatedString取文案。连输入框里的占位提示文字cue banner也有翻译。右键上下文菜单——菜单不走TranslateWindow而是构建菜单时逐项用TranslatedString取文案再插入比如打开所在文件夹这一项就是查字典查出来的见 ShellContextMenu.cpp。动态生成的提示语——搜索结果统计、错误气泡、替换确认框这类文字不在资源界面上是运行时拼出来的所以每一句都在拼之前先查一次字典缺的键自动回退英文原文。三个层次对应三种调用方式整窗用TranslateWindow菜单用TranslateMenu散落的字符串用TranslatedString。想自己加一门语言三步就够从translations/English.lang复制一份按语言名重命名如Latin.lang只改msgstr里的内容msgid一律不动把文件放进程序目录在设置里选它、验证界面全程不碰核心代码程序重启或设置刷新后它就会出现在语言列表里。这套思路能搬去哪些地方这套设计值得抄的点其实很朴素资源与逻辑分离让翻译变成改文件而不是改代码运行时可切换靠字典在内存里、界面随时重刷这两件事支撑接口分层从整窗到单字符串各给一把合适的扳手。你自己的工具想支持多语言照着这三个点搭一个单例翻译器成本比想象的低得多。【免费下载链接】grepWinA powerful and fast search tool using regular expressions项目地址: https://gitcode.com/gh_mirrors/gr/grepWin创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表