一行界面文字如何变成 28 种语言?grepWin 国际化与多语言支持机制拆解
2026/8/21 21:49:30 网站建设 项目流程

一行界面文字如何变成 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.langArabic.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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询