
grepWin 多语言支持的完整解析国际化与本地化实现原理【免费下载链接】grepWinA powerful and fast search tool using regular expressions项目地址: https://gitcode.com/gh_mirrors/gr/grepWingrepWin 是一款基于正则表达式的快速搜索工具内置完整的国际化与本地化能力支持 28 种语言。本文带你跟一个字符串走完全程语言文件如何组织、启动时如何加载、如何落到窗口、菜单和工具提示上最后用三步给项目加一门新语言。所有语言资源集中在translations/目录每个语言一个.lang文件CLanguage单例负责加载LoadFile是唯一的加载入口翻译分三种粒度单字符串、整窗口批量、菜单设置里切换语言即时生效无需重启应用语言文件怎么组织一份原文-译文对照表打开 translations/ 语言文件目录你会看到 28 个.lang文件。每个文件的结构都是msgid英文原文配一行msgstr译文就像一本对照字典。以简体中文为例#. Resource IDs: (149) msgid %ld more matches msgstr 还有 %ld 个匹配语言清单按地区大致可以这样分组分组语言文件中文Chinese Simplified.lang、Chinese Traditional.lang亚洲Japanese.lang、Korean.lang、Vietnamese.lang、Indonesian.lang、Hindi.lang、Tamil.lang欧洲German.lang、French.lang、Russian.lang、Dutch.lang、Finnish.lang、Greek.lang、Hungarian.lang、Italian.lang、Polish.lang、Slovak.lang、Swedish.lang、Turkish.lang、Belarusian.lang美洲与其他Spanish.lang、Spanish Mexican.lang、Portuguese.lang、Portuguese Brazilian.lang、English.lang、English British.lang、Afrikaans.lang新增一种语言只需要在目录里多放一个这样的文件代码侧不需要任何改动。启动那一刻LoadFile 加载链路程序启动时CLanguage单例会去读用户上次选的是哪个语言文件。这里有个小细节grepWin 同时支持便携版配置存 ini和安装版配置存注册表两处的键名都叫languagefile// src/grepWin.cpp 启动时确定语言文件 CLanguage::Instance().LoadFile(bPortable ? g_iniFile.GetValue(Lglobal, Llanguagefile, L) : std::wstring(CRegStdString(LSoftware\\grepWin\\languagefile)));白话讲先从配置里拿到语言文件路径再把它整本字典读进内存。之后所有翻译查询都走内存不会反复读盘。在 src/Settings.cpp 语言切换逻辑 中你在设置对话框选中新语言并点确定后走的是同一条链路先LoadFile换成新字典再对主窗口做一遍批量翻译——这就是运行时切换语言、无需重启的来源CLanguage::Instance().LoadFile(langPath); CLanguage::Instance().TranslateWindow(::GetParent(*this));三种翻译粒度单串、整窗、菜单grepWin 把翻译接口拆成了三档按覆盖面积从小到大排TranslatedString翻译单条字符串最基础的翻译单元。菜单项、按钮文本这类逐个插入的地方都用它TranslateWindow遍历窗口内所有控件按控件 ID 自动匹配译文。对话框写完就调一次省事TranslateMenu针对弹出菜单的批量翻译书签对话框里就有使用单串翻译的典型现场是右键菜单见 src/ShellContextMenu.cpp 右键菜单翻译// 逐项插入菜单每项单独翻译 ::InsertMenu(m_menu, 1, MF_BYPOSITION | MF_STRING, 1, TranslatedString(g_hInst, IDS_OPENCONTAININGFOLDER).c_str());整窗批量则简单得多各对话框初始化时一行搞定// 对话框初始化时翻译所有控件 CLanguage::Instance().TranslateWindow(*this);界面现场主界面、菜单与工具提示三种粒度组合起来就覆盖了用户能看到的所有文字主搜索界面标签、按钮、提示区全部由TranslateWindow批量处理换成日文或韩文后整体自动切换右键菜单打开所在文件夹复制路径等项逐个走TranslatedString设置对话框静态文本之外连动态生成的说明和工具提示也做了本地化比如深色模式提示IDS_DARKMODE_TT、备份目录提示IDS_BACKUPINFOLDER_TT工具提示这类看不太显眼的文本同样走了翻译接口本地化做得比较彻底。 给项目加一门新语言三步走整个流程不需要碰任何 C 源码复制模板把translations/English.lang复制一份改名为目标语言如Thai.lang翻译内容保持每个msgid原样不动只填写对应的msgstr文件头注释也提醒了ONLY change the msgstr field验证效果重新构建后在设置的 Language 下拉框中选择新语言检查主界面、菜单、工具提示是否全部生效由于设置对话框是扫描目录动态生成语言列表的新文件放对位置就会自动出现在选项里。收束这套架构的好处可以浓缩成三点语言资源与业务逻辑彻底分离译者可以独立维护加载与翻译走内存运行时随时切换新增语言零改核心代码。对任何想做好本地化的桌面应用来说grepWin 的多语言支持实现原理都是一个值得参考的开源软件国际化架构范例。【免费下载链接】grepWinA powerful and fast search tool using regular expressions项目地址: https://gitcode.com/gh_mirrors/gr/grepWin创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考