如何一步为宏录制器加上中文界面?PyMacroRecord 国际化的完整实践
【免费下载链接】PyMacroRecordFree and Open Source Macro Recorder with a modern GUI using Python项目地址: https://gitcode.com/gh_mirrors/py/PyMacroRecord
打开一款国外开源工具,满屏英文,你的第一反应往往是:能不能换成中文?PyMacroRecord 是一款免费开源的宏录制工具,负责录制鼠标移动、点击和键盘输入并回放。本文拆解 PyMacroRecord 中文支持的完整实现——一个 Python GUI 应用如何低成本完成国际化。
PyMacroRecord 中文支持:翻译文件放在哪、怎么组织
先把翻译当成一套"可插拔的资源包":每种语言一个 JSON 文件,统一放在同一个目录里,这就是整个方案的核心思路。
- 所有语言文件都在 src/langs/ 目录下,一种语言一个文件:zh-CN.json、
en.json、de.json、fr.json、es.json、it.json、pt-BR.json、ru-RU.json、tr.json、nl.json、bg.json等 - 覆盖英语、中文简体、德语、法语、西班牙语、意大利语、葡萄牙语(巴西)、俄语、土耳其语、荷兰语、保加利亚语等 11 种语言
- 这种"一语言一文件"的放法有三个好处:
- 代码和翻译彻底分离,不会写代码的人也能参与翻译
- 运行时按用户选择动态加载对应文件
- 新增语言只丢一个 JSON 进去,一行代码都不用改
单个语言文件内部是分层结构:顶层放"元信息",其余按功能模块组织文本。以 中文语言文件 为例:
"information": { "author": "DennyClarkson", "lang_short": "zh-CN", "lang_long": "Chinese-Simplified" }, "content": { "global": { "confirm_button": "确认", ... } }information记录作者和语言标识(短码 + 全称),content则按模块切分:全局按钮、文件菜单、选项菜单(回放、设置)、帮助菜单、其它菜单……每段界面文本都有固定"地址"。好处很直接:换语言时整个文件可以原样替换,代码侧不用改一个字符。
如何让用户自己切换语言:动态扫描目录生成下拉选项
语言选择窗口由 src/windows/options/settings/select_language.py 实现。它最省心的地方在于:下拉选项不是写死的,而是打开窗口时现扫现建——
for lang in os.listdir(resource_path('langs')): file_lang = os.path.join(resource_path('langs'), lang) with open(file_lang, encoding='UTF-8') as f: content = json.load(f) self.options[content["information"]["lang_long"]] = content["information"]["lang_short"]流程翻译成大白话就是:
- 遍历
langs目录里的所有文件 - 逐个打开,读出
information里的语言信息 - 下拉框显示全称(如
Chinese-Simplified),背后取值用短码(zh-CN)
这样"语言列表"就是文件列表的镜像:目录里多一个文件,下拉框里自动多一个选项;删掉一个,选项随之消失。维护成本基本为零。
点击确认之后发生了什么:语言切换的完整时间线
用户在窗口里选定语言并点击确认后,setNewLanguage按顺序做四件事:
def setNewLanguage(self, newLang, main_app): self.settings.change_settings("Language", None, None, self.options[newLang]) main_app.load_language() main_app.version.refresh_locale_text() # 旧菜单丢弃后整体重建 main_app.menu = MenuBar(main_app)按时间线拆开看:
- 写配置:把语言短码持久化到用户设置里,程序重启后选择不会丢
- 重载资源:
load_language()按配置读取对应 JSON,装进main_app.text_content字典;若某条翻译缺失,会用en.json兜底补齐,界面上不会出现"键缺失" - 刷新界面文本:全界面文本统一从
main_app.text_content这个字典里按路径取,指向新字典后,当前窗口内的标题、按钮、提示自动换成新语言 - 重建菜单栏:菜单栏是常驻控件,逐条改文字容易漏,不如销毁旧菜单、用新语言整体重建一份 MenuBar,干净且稳定
避坑指南:编码、布局与资源路径三个坑 🚧
坑 1:编码。中文乱码往往不是"翻译错了",而是读文件时没声明编码。项目里凡涉及语言文件的读写,一律显式指定 UTF-8:
with open(file_lang, encoding='UTF-8') as f: content = json.load(f)坑 2:布局。同样的意思,中文和英文占用宽度不同——中文"字少但单个字宽",按钮用英文刚好放下的,换成中文可能挤成一团。翻译时要盯住四点:
- 术语一致性:同一专业术语全软件统一译法
- 中文标点规范:全角标点为主,不要中英标点混用
- 给按钮和标签预留宽度余量,别按极限宽度设计
- 长文本提示语在目标语言下重新看一眼换行效果
坑 3:资源路径。开发时相对路径能跑,打包成可执行文件后,工作目录往往不在语言文件旁边,路径一断就全线崩溃。项目用 resource_path() 统一解决开发、PyInstaller、cx_Freeze 三种环境:
def resource_path(relative_path): """Get absolute path to resource, works for dev, PyInstaller and cx_Freeze.""" if getattr(sys, "frozen", False): base_path = getattr(sys, "_MEIPASS", path.dirname(sys.executable)) else: base_path = path.abspath(".") return path.join(base_path, relative_path)如何把这套多语言方案复制到你自己的项目 📋
想在自己的 Python GUI 项目里做同样的事,抓住这五条就够了:
- 早期规划:JSON 目录和文件格式在设计期就定下来,别等界面全部做完再补国际化
- 资源分离:所有界面文案进语言文件,代码里不许硬编码任何显示文本
- 统一接口:建一个
text_content式的字典,组件只认键名不认字符串,换语言就是换字典 - 测试覆盖:每加一种语言,把所有窗口和对话框走一遍,确认翻译无缺漏——兜底机制只是保险,不能替代完整翻译
- 社区协作:翻译是天然适合众包的贡献形式,用开源社区组织校对和纠错,比一个人扛省力得多
写在最后
最终效果一句话就能说清:中文用户打开 PyMacroRecord 看到的是全中文界面,而其他语言用户的体验完全不受影响——代价只是十几份 JSON 和一个小巧的语言选择窗口。如果把这套架构继续往前推,下一步很自然:接入机器翻译自动生成新语言的 JSON 骨架,人工只做校对,多语言支持的边际成本还能再砍一刀。
【免费下载链接】PyMacroRecordFree and Open Source Macro Recorder with a modern GUI using Python项目地址: https://gitcode.com/gh_mirrors/py/PyMacroRecord
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考