一行界面文字如何变成 28 种语言?grepWin 国际化与多语言支持机制拆解
【免费下载链接】grepWinA powerful and fast search tool using regular expressions项目地址: https://gitcode.com/gh_mirrors/gr/grepWin
当你在搜索结果右键菜单里看到"打开所在文件夹"五个字时,它经历了什么?grepWin 国际化的核心是CLanguage类,正是它让工具开箱支持 28 种语言。把这一行字从屏幕倒回.lang文件,再正向走回屏幕,全程只有四步。
一行翻译文本的旅程
先说答案:一行界面文字的完整旅程是 文件 → 读入 → 翻译 → 绘制。
翻译文本先以键值对的形式存在.lang文件里,启动时CLanguage::LoadFile把整个文件读进内存;之后每个控件、菜单、提示词在创建时逐级"索要"翻译,粒度从单个字符串到整个窗口不等;最终由 Windows 把中文渲染到屏幕上。这就是 grepWin 多语言支持的全貌,下文沿这条线逐段拆解。
源头:.lang 文件长什么样
先说答案:.lang文件就是"键名固定、值可翻译"的纯文本键值对。
translations/ 目录下 28 种语言平铺存放,从German.lang到Arabic.lang,每种语言一个文件。打开Chinese Simplified.lang,关键内容就是这样的成对行:
# .lang 文件节选(Chinese Simplified.lang) msgid "%ld more matches" msgstr "还有 %ld 个匹配"msgid是英文原文兼资源标识,翻译者只需把译文填进msgstr,键名一概不动。这种集中式管理的直接好处是:新增一门语言等于新增一个文件,核心代码一行不用碰。
CLanguage 如何把文本送上屏幕
先说答案:CLanguage提供三层接口,粒度从一行字到整个窗口,一层比一层省事。
它位于依赖库 sktoolslib/ 中,采用单例设计——全局共享一个实例,保证所有界面读同一份语言资源。
最细粒度:单字符串TranslatedString。构建右键菜单时,逐项取翻译文本:
// src/ShellContextMenu.cpp ::InsertMenu(m_menu, 1, MF_BYPOSITION | MF_STRING, 1, TranslatedString(g_hInst, IDS_OPENCONTAININGFOLDER).c_str());效果:右键菜单里出现了"打开所在文件夹",换成其他语言就显示对应译文。
中间粒度:菜单项TranslateMenu。不用逐条查,整张弹出菜单一次翻完:
// src/BookmarksDlg.cpp CLanguage::Instance().TranslateMenu(hPopup);效果:书签弹出菜单的所有条目一次调用后按当前语言重绘。
最粗粒度:窗口控件TranslateWindow。对话框初始化时按控件 ID 批量翻译:
// src/SearchDlg.cpp CLanguage::Instance().TranslateWindow(*this);效果:主界面的标签、按钮、提示文本一次性全部换好,无需逐个设置。
启动与切换:两条时间线
先说答案:无论首启还是中途换语言,动作都是同一套"读文件、翻窗口",区别只在触发点。
时间线 A(首次启动):程序去查上次记住的语言,然后读入:
// src/grepWin.cpp CLanguage::Instance().LoadFile( bPortable ? iniValue : regValue);即 注册表或便携版 INI →LoadFile解析键值 → 各窗口依次TranslateWindow→ 界面以对应语言出现。
时间线 B(设置中切换语言):在设置对话框的语言下拉框里选中新语言并确认后,代码直接执行:
// src/Settings.cpp CLanguage::Instance().LoadFile(langPath); CLanguage::Instance().TranslateWindow(::GetParent(*this));即LoadFile重载 → 对当前窗口重新TranslateWindow→ 界面原地刷新,全程无需重启应用。
三步给 grepWin 加一门新语言
先说答案:加一门语言零代码改动,三步走完。
① 复制 translations/ 里的English.lang作为模板,改名为你的语言,比如Malay.lang。做完这步目录里会多出你的文件,这就是唯一的"代码改动"。
② 键名保持不动,只改msgstr里的值。对照英文原文逐条填译文,像&About grepWin...这种带&的条目记得保留助记符格式,填完保存即可。
③ 打开 grepWin,在设置的语言下拉框里选中你的新语言,点确定。界面上所有文字都该变成你的语言了——如果某处还是英文,说明第 ② 步有漏填,按位置回头补上。
如果项目里还没有你的语言,它正缺这么一个文件:放进 translations/ 目录,整个界面就会说你的母语。
【免费下载链接】grepWinA powerful and fast search tool using regular expressions项目地址: https://gitcode.com/gh_mirrors/gr/grepWin
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考