Repository navigation
Releases
PopGlot 0.1.40
Windows 10(版本 19041 及以上)或 Windows 11,64 位。
方式一(推荐):下载安装包 PopGlot-v0.1.40-win-x64-setup.exe
标准 Windows 安装向导,默认按当前用户安装、不需要管理员权限;装完自动出现在开始菜单。
下一次升级直接运行新版安装包即可——它会自动找到上次的安装位置并原地覆盖,不需要先卸载。
卸载只删除程序文件,你的配置与历史保留在 %LOCALAPPDATA%\PopGlot。
方式二:便携 zip PopGlot-v0.1.40-win-x64.zip
这个 zip 自带 .NET 10 桌面运行时。解压后运行 PopGlot.exe,不用另外安装 .NET。
两个包各自带一个 .sha256 校验值:
(Get-FileHash -Path .\PopGlot-v0.1.40-win-x64-setup.exe -Algorithm SHA256).Hash.ToLower()
Get-Content .\PopGlot-v0.1.40-win-x64-setup.exe.sha256变更
- 破坏性操作二次确认交互与文案统一:统一全桌面破坏性操作确认文案标点(「确认删除?」、「确认清空?」、「确认清除?」、「确认覆盖?」),统一采用全角问号;针对固定尺寸(如 32/36 DIP)的图标按钮,在武装二次确认时自适应放宽宽度与内边距,使确认文案清晰展示不被截断;支持 Esc 键就地撤消确认、全局单按钮互斥武装与卸载自动解除。
- 隐私设置就地开关公共翻译:设置页隐私模块恢复直接开关公共免费引擎授权(
FreeEngineConsentToggle),无需绕路首次向导;在安全模式(离线模式)开启时强制禁用该开关并提供引导说明。
修复
- 二次确认按钮状态与属性还原:重构
ConfirmButton属性快照机制(PropertySnapshot),在解除确认时按依赖属性本地值、样式继承与数据绑定分别精确还原,不再粗暴调用ClearValue导致 XAML 本地定义的尺寸与内边距丢失;审查并移除失焦强制取消,防止物理鼠标点击行内按钮或切换焦点时二次确认被意外取消。 - 资料库模式切换解除清空确认:在资料库中切换生词本与历史记录视图、或重试加载生词本时,主动解除清空按钮的武装状态,防止在不同视图间切换后误触发清空。
- 引擎列表行内删除二次确认隔离:修复引擎列表行删除按钮二次确认与行选中事件联动引起的意外取消,确保列表行两步删除和详情编辑器删除各自独立、行内二次确认正常触发;切换引擎上下文或打开/关闭编辑器时准确解除未完成的确认状态。
- 隐私与朗读设置状态解耦与异常回滚保护:将云端语音朗读与公共翻译授权的状态刷新分离,解决刷新朗读开关时误写公共翻译开关的问题;设置保存失败异常回滚时增加状态防护,避免事件循环递归。
迁移
- 无破坏性变更。沿用现有配置与本地数据。
验证与边界
scripts/verify.ps1全量门禁通过(EXITCODE=0):Rust 格式检查、工作区测试 252 项(--locked)、Clippy(0 warnings)、WPF Debug 构建、PureTests 73 项、LogicTests 414 项、CliTests --ui 31 项,全部 0 失败。- 单个
ConfirmButton在武装状态下按 Esc 键、超时(3 秒)或触发其他确认按钮均可安全撤消,失去键盘焦点不会意外中断正常的连续点击二次确认。
PopGlot 0.1.39
Windows 10(版本 19041 及以上)或 Windows 11,64 位。
方式一(推荐):下载安装包 PopGlot-v0.1.39-win-x64-setup.exe
标准 Windows 安装向导,默认按当前用户安装、不需要管理员权限;装完自动出现在开始菜单。
下一次升级直接运行新版安装包即可——它会自动找到上次的安装位置并原地覆盖,不需要先卸载。
卸载只删除程序文件,你的配置与历史保留在 %LOCALAPPDATA%\PopGlot。
方式二:便携 zip PopGlot-v0.1.39-win-x64.zip
这个 zip 自带 .NET 10 桌面运行时。解压后运行 PopGlot.exe,不用另外安装 .NET。
两个包各自带一个 .sha256 校验值:
(Get-FileHash -Path .\PopGlot-v0.1.39-win-x64-setup.exe -Algorithm SHA256).Hash.ToLower()
Get-Content .\PopGlot-v0.1.39-win-x64-setup.exe.sha256变更
- 快捷键冲突诊断与一键修复:快捷键设置页新增冲突诊断,检测全局热键注册失败与组合互相占用,列出问题项并提供一键改绑;候选键池刻意优先避开含 Alt 的组合——按下 Alt 会先关掉 Win32 与浏览器的悬停菜单/提示,再按第二个键时目标已经消失,截图快捷键因此优先推荐
Ctrl+Shift+Space这类无 Alt 组合。快捷键录制中实时格式化修饰键显示,Backspace 直接解绑当前组合;独立F8/PrintScreen单键热键改为 keyup 提交,不再被修饰键判定拦截。 - 首次运行向导可安全重开:重新打开向导时保留已保存的设置并展示当前生效的实时快捷键,已完成的引导不再被当作新用户覆盖配置。
- 免费引擎长文本顺序批处理:约 25k token(~32,000 字符)以上的长文改为顺序分批翻译后拼接,免费引擎超限长文不再整单失败或静默截断;FFI 分段计划模式更名
segmented→segments。
修复
- 截图前冻结桌面快照:选区覆盖层出现前先抓取整幅虚拟桌面快照,选区期间悬停提示、右键菜单与弹出层被冻结在画面里,不再因覆盖层出现而消失;确认选区后按快照裁剪输出 PNG,关闭覆盖层立即释放位图。
- 译文注音层:翻译面板结果卡新增独立音标层(引擎头下方、正文上方),音标不再与正文挤在同一行。
迁移
- 无破坏性变更。沿用现有配置与本地数据。
验证与边界
scripts/verify.ps1全量门禁通过(EXITCODE=0):Rust 格式检查、工作区测试 155 项(--locked)、Clippy、WPF Debug 构建、PureTests 73 项、LogicTests 409 项、CliTests --ui 31 项,全部 0 失败。- 候选键池无法穷举所有第三方全局热键占用,冲突诊断以本机注册失败为准如实报告;回环 mock 验证不代表真实引擎长文质量,超长文本的批次划分按字符预算估算,极端排版可能仍有截断提示。
PopGlot 0.1.38
Windows 10(版本 19041 及以上)或 Windows 11,64 位。
方式一(推荐):下载安装包 PopGlot-v0.1.38-win-x64-setup.exe
标准 Windows 安装向导,默认按当前用户安装、不需要管理员权限;装完自动出现在开始菜单。
下一次升级直接运行新版安装包即可——它会自动找到上次的安装位置并原地覆盖,不需要先卸载。
卸载只删除程序文件,你的配置与历史保留在 %LOCALAPPDATA%\PopGlot。
方式二:便携 zip PopGlot-v0.1.38-win-x64.zip
这个 zip 自带 .NET 10 桌面运行时。解压后运行 PopGlot.exe,不用另外安装 .NET。
两个包各自带一个 .sha256 校验值:
(Get-FileHash -Path .\PopGlot-v0.1.38-win-x64-setup.exe -Algorithm SHA256).Hash.ToLower()
Get-Content .\PopGlot-v0.1.38-win-x64-setup.exe.sha256变更
- 引擎切换菜单与按钮统一短名:下拉菜单主标签统一显示引擎简短名称(如
OpenAI、DeepSeek、Gemini、Claude、ChatGPT、Codex、Antigravity、Ollama、LiteLLM),右侧副标签保留完整紧凑模型名并放宽显示宽度,与选中后按钮及译文徽标保持一致;将翻译浮窗的模型切换按钮移至底部状态栏右侧,释出结果标题栏空间,避免在默认和最小宽度下挤占或截断引擎徽标与音标;同步放宽查词与主窗口引擎切换按钮宽度上限。 - 界面文案清理:清理首次配置向导、隐私设置页、浮窗按钮提示与引擎浮层说明中的冗余及宣传性表述,并将遗留的「服务页」指引统一改为「设置 → 引擎」。
修复
- 划词与截图语言方向自动切换:改进中英混排语句及含
{placeholder}占位符文本的语种识别;当此前手动交换过语言方向导致固定源语言与新划词文本语种冲突时,划词翻译自动恢复为自动检测并切换目标语言;截图 OCR 识别出原文后同步按原文语种自动切换目标语言。 - 划词浮窗防遮挡定位:光标/单行锚点优先在选区正下方或正上方弹出,并保留整行高度安全间距;在屏幕右侧、右下角或紧凑屏幕上划词时,改进夹紧与回退布局逻辑,避免回退位置覆盖所选文字;浮窗按原文长度自适应调整初始高度时重新贴合锚点。
- 浮窗切换引擎重译与往返缓存:在浮窗手动切换引擎时强制发起新引擎重译并刷新主窗口、查词窗与浮窗的模型状态;截图无识别文本时切换引擎自动重新执行截图翻译;普通语言方向交换仍保留往返缓存复用。
迁移
- 无破坏性变更。沿用现有配置与本地数据。
PopGlot 0.1.37
Windows 10(版本 19041 及以上)或 Windows 11,64 位。
方式一(推荐):下载安装包 PopGlot-v0.1.37-win-x64-setup.exe
标准 Windows 安装向导,默认按当前用户安装、不需要管理员权限;装完自动出现在开始菜单。
下一次升级直接运行新版安装包即可——它会自动找到上次的安装位置并原地覆盖,不需要先卸载。
卸载只删除程序文件,你的配置与历史保留在 %LOCALAPPDATA%\PopGlot。
方式二:便携 zip PopGlot-v0.1.37-win-x64.zip
这个 zip 自带 .NET 10 桌面运行时。解压后运行 PopGlot.exe,不用另外安装 .NET。
两个包各自带一个 .sha256 校验值:
(Get-FileHash -Path .\PopGlot-v0.1.37-win-x64-setup.exe -Algorithm SHA256).Hash.ToLower()
Get-Content .\PopGlot-v0.1.37-win-x64-setup.exe.sha256变更
- 资料库清空当前列表改为两步确认(首次点击武装「确认清空?」,再次点击才清空);设置页清空历史仍为单击。
- 浮窗 Esc 优先级扩展到模型/风格菜单:开菜单时 Esc 先关菜单,不取消在途请求、不隐藏窗口。
修复
- T1 输出预算:单次翻译输出上限 1200→4096 token,公式改为
clamp(源字符数×3+512, 512, 4096),覆盖中译英膨胀并为 trailer/思考留量;长中文段落不再频繁触发「输出截断」。Summarize/Explain 预算不变;CLI 执行器IncludeExplanation改读「显示详细解析」设置。 - T1b 协议完整性:Anthropic
stop_reason=max_tokens、OpenAI Responsesresponse.incomplete、GeminiMAX_TOKENS统一归类为截断(Partial),不再漏报或误因;FFI 失败信封新增error_kind,C# 按类型化 Kind 分类,删除「网络」「Key」字符串猜测,真实传输错误不再误报「模型网络目前未启用」;会话/CLI 死线归类为 Timeout,不再伪装用户取消。 - T2 状态文案:徽标说类别、状态行说原因——「输出截断」(黄)/「连接早闭」(黄)/「生成失败」(红)/「已取消」(不再称「中断」),三端共用
TranslationStatusText分类。 - T3 账号与引擎删除:ChatGPT 直连可退出账号(删凭据与注册)、删除死账号;托管引擎删除走两段确认,列表行消失、默认引擎正确回退,不再抛 Win32Exception。
- T4 登录入口统一:合并「登录 ChatGPT」按钮,登录/添加账号/重新授权统一进引擎编辑页;托管引擎可改名。
- T5 资料库原文可复制:原文可拖选,复制原文/译文/解释与术语芯片均可用。
- T6 语言智能定向:源为 auto 时中文原文自动定向英语、英文原文自动定向简体中文;手选源语言始终覆盖。
- T7 语言切换自动重译:swap 三端一致(译文回填输入框后自动重译,查词重译的是译文);语言下拉变化且有原文时自动重译,先取消在途请求。
- T8 往返缓存:A→B 再 B→A 命中会话缓存,状态「已复用上次译文」,零网络、不重复写历史。
- T9.1–T9.35 通用体验(35 条):撤销部分恢复如实报数、资料库清空两步确认、模式切换撤销条归属、时间显示年份、双击载入、列表截断悬停全文、搜索读屏名如实、浮窗自动复制保留列表格式、原文复制不 Trim、托管列表显示账号归属、查词原文复制按钮、解释区可选中、免费引擎长文本超时、浮窗隐藏保留终态、自动复制文案限定浮窗、查词失败重试入口、查词清空按钮、浮窗 Ctrl+S 收藏、Esc 优先关菜单、资料库页换引擎不静默重译、浮窗流式中原文可编辑、翻译/朗读键提示服从录制快捷键、复制收藏提示统一、固定按钮提示如实、工作台状态悬停保留引擎详情、超预算输入提示、新翻译复位滚动、查词单层滚动、查词 Partial 恢复入口、空态隐私文案、浮窗空输入重试提示、诊断完成度按真实终态、查词 Partial 快照恢复为不完整、连接测试优先显示截断原因。
迁移
- 无破坏性变更。沿用现有配置与本地数据。
验证与边界
scripts/verify.ps1全量门禁通过(EXITCODE=0):Rust 格式检查、工作区测试 251 项(--locked)、Clippy、WPF Debug 构建(0 警告 0 错误)、PureTests 73 项、LogicTests 397 项、CliTests --ui 31 项,全部 0 失败。- 诚实边界:回环 mock 与隔离宿主验证不代表真实提供商、账号授权或模型质量;真实 ChatGPT/OMP 登录流程需真实账号人工复核。语言启发式对混合文本与西欧语言有误判可能,手选源语言始终可覆盖,不宣称「100% 检测准确」。依赖物理鼠标/焦点的用例需在解锁且空闲的桌面运行。
PopGlot 0.1.36
Windows 10(版本 19041 及以上)或 Windows 11,64 位。
方式一(推荐):下载安装包 PopGlot-v0.1.36-win-x64-setup.exe
标准 Windows 安装向导,默认按当前用户安装、不需要管理员权限;装完自动出现在开始菜单。
下一次升级直接运行新版安装包即可——它会自动找到上次的安装位置并原地覆盖,不需要先卸载。
卸载只删除程序文件,你的配置与历史保留在 %LOCALAPPDATA%\PopGlot。
方式二:便携 zip PopGlot-v0.1.36-win-x64.zip
这个 zip 自带 .NET 10 桌面运行时。解压后运行 PopGlot.exe,不用另外安装 .NET。
两个包各自带一个 .sha256 校验值:
(Get-FileHash -Path .\PopGlot-v0.1.36-win-x64-setup.exe -Algorithm SHA256).Hash.ToLower()
Get-Content .\PopGlot-v0.1.36-win-x64-setup.exe.sha256修复
- 截图 OCR 大幅修复。中文 Windows 默认只带中文 OCR 包,对小字号英文截图(100% 缩放、12-16px)此前直接返回空结果,识别基本不可用。现在:
- 识别前按行高估算做条件放大(小字 2x/3x,大图不动——放大已可读的图反而掉准确率),多档结果按「字数 × 完整度」评分择优;
- 一次识别为空时自动换放大倍数重试;
- 中文结果里引擎插入的字间空格被折叠(原样输出会把「无法连接」拆成「无 法 连 接」,译文跟着遭殃);
- 所选原文语言的 OCR 包未安装时回退到可用引擎继续识别,不再整单失败;错误提示改为引导安装对应语言的光学字符识别组件。
- README 徽章改为仓库内 SVG(docs/badges/),不再依赖外站徽章服务,弱网环境不再裂图。
scripts/make-badges.ps1 -Version <版本号>重新生成。
变更
- 仓库清理:移除内部工作文档(评审、交接、任务书等),只保留面向用户与贡献者的文档。
- README 重写,缩短近半。
迁移
- 无。沿用现有配置与本地数据。
PopGlot 0.1.35
Windows 10(版本 19041 及以上)或 Windows 11,64 位。
方式一(推荐):下载安装包 PopGlot-v0.1.35-win-x64-setup.exe
标准 Windows 安装向导,默认按当前用户安装、不需要管理员权限;装完自动出现在开始菜单。
下一次升级直接运行新版安装包即可——它会自动找到上次的安装位置并原地覆盖,不需要先卸载。
卸载只删除程序文件,你的配置与历史保留在 %LOCALAPPDATA%\PopGlot。
方式二:便携 zip PopGlot-v0.1.35-win-x64.zip
这个 zip 自带 .NET 10 桌面运行时。解压后运行 PopGlot.exe,不用另外安装 .NET。
两个包各自带一个 .sha256 校验值:
(Get-FileHash -Path .\PopGlot-v0.1.35-win-x64-setup.exe -Algorithm SHA256).Hash.ToLower()
Get-Content .\PopGlot-v0.1.35-win-x64-setup.exe.sha256新增
- Windows 安装包:Release 现在同时提供
PopGlot-v0.1.35-win-x64-setup.exe(含.sha256)与便携 zip。安装包由 Inno Setup 6 编译,具备标准 Windows 安装体验:- 覆盖升级:固定
AppId+UsePreviousAppDir,再次运行新版本安装包会自动探测上一次的安装位置并原地覆盖,不需要先卸载; - 无需管理员:默认按当前用户安装(
{autopf}\PopGlot),需要时可在向导里选「为所有用户安装」再提权; - 干净卸载:写入标准「添加/删除程序」条目(发布者、版本、支持与更新链接),卸载只删程序文件,配置与历史保留在
%LOCALAPPDATA%\PopGlot并在卸载结束时明确告知; - 覆盖升级不打断:安装前自动关闭正在运行的 PopGlot,装完再拉起;
- 可选代码签名:配置
POPGLOT_SIGN_CERTIFICATE_PATH(或证书指纹)后自动对安装包与卸载程序做 SHA-256 签名并加时间戳;未配置时照常出未签名包; - 安装脚本在
.github/workflows/ci.yml里每次 push/PR 都真实编译一次,不再等到发 tag 才暴露脚本问题。
- 覆盖升级:固定
- 首次配置向导:全新安装第一次启动时弹出(后台自启不弹)。三步完成,隐私一页给出五项选择并标注推荐值:云端翻译(默认开)、内置免费引擎(默认开)、保存翻译历史(默认开)、开机自启(默认开)、上报诊断(默认关)。关掉内置免费引擎的选择会被持久化,后续升级不会静默翻回。「设置 → 通用 → 重新显示引导」可随时重新打开它。
- 应用内检查更新(只提示):启动约 20 秒后静默读一次 GitHub Releases(公开只读,不需要令牌),「设置 → 通用」也提供「立即检查」。发现新版本只在托盘提示版本号并给出下载页;不下载、不安装、不触碰用户数据,「启动时检查更新」可随时关掉。
- 防泄露加固:
- 统一密钥脱敏器
SecretRedactor:凭据读写的那一刻登记真实密钥,之后日志、诊断导出、备份包、GitHub Issue 正文、界面报错里再出现该字符串一律替换为掩码;另有一层形状匹配(sk-/ghp_/Bearer/api_key=/ URLuser:pass@等),覆盖从别处复制进来的密钥。 - 内置免费引擎的端点不再明文躺在二进制里:URL 模板以混淆形式存放、运行期拼装;新增本机每小时配额(400 次/小时),超限后本小时内不再自动重试。
- 统一密钥脱敏器
变更
- 内置免费引擎默认允许,设置页不再放「允许/拒绝」按钮(隐私区只保留状态陈述与总开关「允许连接云端翻译服务」)。此前「未表态」被当成拒绝,用户必须钻进设置页点「允许」才能翻译;现在全新安装开箱即用。同时移除「仅本次允许」单次令牌与首用询问弹窗,保留每次发送前的实时策略复核:翻译途中撤销授权或切换安全离线模式,尚未发出的端点一个都不会再发。
- 「重新显示引导」从展开工作区引导条改为直接打开首次配置向导——这是关掉免费引擎后唯一的回头路。
迁移
- 无破坏性变更。旧配置文件里的「未表态」在 0.1.35 起等同允许(不会给老用户弹首次引导);曾经明确拒绝过的仍然拒绝,不会被升级翻回。
验证与边界
scripts/verify.ps1全量门禁通过(EXITCODE=0):Rust 格式检查、工作区测试(--locked)、Clippy、WPF Debug 构建(0 警告 0 错误)、PureTests 62 项、Windows 逻辑测试、CliTests --ui,全部 0 失败。- 诚实边界:端点混淆是提高扒取门槛,不是加密——下定决心的逆向者仍能从内存或抓包拿到地址,它挡的是「扫一遍二进制就批量拿走」的低成本滥用。安装包目前未签名(没有证书),首次运行可能出现 SmartScreen 提示;签名通道已就绪,配好证书即生效。安装只做覆盖升级,不提供静默自动安装,下载与安装始终由用户亲手完成。
- 已知:LogicTests 中有一项依赖真实物理鼠标悬停,在无头/非交互环境下可能失败,与本轮改动无关。
PopGlot 0.1.34
Windows 10(版本 19041 及以上)或 Windows 11,64 位。
这个 zip 自带 .NET 10 桌面运行时。解压后运行 PopGlot.exe,不用另外安装 .NET。
下载本页的 PopGlot-v0.1.34-win-x64.zip。旁边的 .sha256 是校验值:
(Get-FileHash -Path .\PopGlot-v0.1.34-win-x64.zip -Algorithm SHA256).Hash.ToLower()
Get-Content .\PopGlot-v0.1.34-win-x64.zip.sha256修复
- 修复 Windows 逻辑测试结果不可复现(OPT-021):同一命令在不同运行中曾得到 361 项全通过与 227 项通过 / 134 项失败两种结果,用例总数恒为 361,失败项均为「不能在同一 AppDomain 中创建多个 System.Windows.Application 实例」。根因是把 AppDomain 级的一次性语义委托给了
Application.Current守卫——它无法表达「已尝试但失败」,一旦首次创建在中途失败,此后每个触碰 WPF 的用例都会拿到同一条异常而成片失败。现改为由测试宿主自己的状态位记录引导结果,并始终将 Application 创建封送到唯一的 STA harness 线程;引导失败时在第一个用例之前输出根因并退出,不再级联。修复后连续运行的用例结论逐字一致。- 该缺陷属于测试宿主,不影响产品运行行为;修复只落在
tests/PopGlot.Windows.LogicTests/,未改动生产代码。
- 该缺陷属于测试宿主,不影响产品运行行为;修复只落在
变更
- 关闭主窗口时不再重复读取设置:原
OnClosing中两次读取各自触发一次完整读盘与 SHA256 校验,现共用一次快照(OPT-002R)。关闭时直接退出而非最小化到托盘的路径,读盘次数与改动前相同。 - 划词浮窗、极速查词窗口与截图浮层的 19 处圆角改为引用主题 token(新增
ChipRadius、FloatingRadius),替换值与原先的硬编码数值逐字一致,无视觉变化(OPT-010)。这是圆角 token 化的第一批切片,其余窗口与字号不在此列。
迁移
- 无。沿用现有配置与本地数据。
验证与边界
scripts/verify.ps1全量门禁通过(EXITCODE=0):Rust 格式检查、工作区测试(--locked)、Clippy、WPF Debug 构建(0 警告 0 错误)、PureTests 58 项、Windows 逻辑测试 361 项、连接流程 CliTests --ui 29 项,全部 0 失败。本轮未使用任何已知波动豁免,CliTests 亦为首轮通过。- OPT-021 稳定性专项:修复后连续运行 LogicTests 共 13 次(实施方 8 次 + 验证方独立 5 次,其中 2 次在版本号收口之后),每次均为 361 项通过 / 0 项失败;361 条用例判定行的 MD5 在各次运行之间逐字相同(
ee425592370e2ef6ca02ddfa80eed1bb),AppDomain相关报错计数为 0,且每次运行的首行均为同一个命名 STA harness 线程创建的 Application,证明其创建于第一个用例之前。- 日志全文的 MD5 在各次运行之间仍不同,差异经逐行比对确认只落在性能基准数字(P50/P95/最大耗时、测试宿主工作集等),不落在任何用例判定行内,不影响测试结论。若要求「日志逐字可复现」需单独立项。
- 上述数字是本批在本机上的实测结果,不构成对其它环境的无条件承诺。该问题此前表现为环境与时点敏感(同一命令在不同人、不同时点可得到两种结论),本次属于结构性消除而非压低概率:测试宿主现在只有唯一一个 Application 创建点(此前有三个),且创建动作发生在第一个用例之前,失败即整体退出、不会级联成片。这一点可从当前代码直接复核。
- 如实说明一项证据的边界:快速失败路径(引导失败时输出根因并退出、而非级联)在实施期通过一次性故障注入观测验证——该注入是当时的临时改动,已复原,当前代码中不含注入缝,因此这次观测无法从本版代码复现。
- 可从本版代码复现的证据有三项,均不需要额外工具:①每次运行的日志首行恒为
[harness] creating Application on 'PopGlot.LogicTests.WpfHarness' #<线程号> apartment=STA,且只出现一行——线程名证明创建发生在唯一的 harness 线程而非线程池,apartment=STA证明不在 MTA 上,行数为一证明整个进程只创建了一次;②11 次连跑的用例判定行逐字一致;③AppDomain相关报错计数为 0。 - 后续版本计划把故障注入做成常设开关,并补一条收尾 canary 持续断言「全程恰好一个 Application、且
Application.Current仍是引导时创建的那个」,使失败路径与成功路径都具备可被他人复现的验证入口。 - 给后续批次的判据:今后若再出现成片失败且报「不能在同一 AppDomain 中创建多个 System.Windows.Application 实例」,应视为新引入的回归并查明原因,不得再援引本条作为免责解释。
- 故障注入验证:人为让 Application 创建失败时,输出恰一条根因信息、退出码 4、0 个用例执行,不会出现成片失败。
- 圆角 token 化的 19 处替换值与原先的硬编码数值逐字相等,已逐项核对;
ChipRadius与FloatingRadius在全库各只有一处定义。视觉无变化。 - 逻辑测试中有一项依赖真实物理鼠标悬停的前置条件,在无头或非交互环境下仍可能失败。
- 划词浮窗与极速查词窗口在 100% 与 150% 缩放下的按钮排布仍需实机目视确认;此前只做了代码层面的布局复核与自动化布局断言。
- 本地测试运行确认真实用户配置未改变,且没有未经许可的公网请求;真实桌面的鼠标交互、多显示器和输入法行为仍需实机验证。
PopGlot 0.1.33
Windows 10(版本 19041 及以上)或 Windows 11,64 位。
这个 zip 自带 .NET 10 桌面运行时。解压后运行 PopGlot.exe,不用另外安装 .NET。
下载本页的 PopGlot-v0.1.33-win-x64.zip。旁边的 .sha256 是校验值:
(Get-FileHash -Path .\PopGlot-v0.1.33-win-x64.zip -Algorithm SHA256).Hash.ToLower()
Get-Content .\PopGlot-v0.1.33-win-x64.zip.sha256变更
- 划词浮窗译文操作行的模型与风格按钮高度改为 32,与同一行的朗读、复制、收藏按钮对齐;极速查词窗口头部的风格按钮同样改为 32。
- 产品规格中的空闲内存指标改用 Private Bytes 口径:当前 60.44 MiB,达到 80 MiB 软目标。工作集仍为 106.24 MiB,其中约 45.8 MiB 是自包含 .NET 运行时的共享代码页,多进程共用、不计入本应用独占占用,因此原本以工作集计的 80 MiB 软目标无法达成,改为以 Private Bytes 衡量。
- 发布工作流(
.github/workflows/release.yml)的版本一致性校验新增第 4 项:Cargo.lock中三个 workspace 包的版本必须与发布 tag 一致。不一致时在门禁阶段即失败,并提示执行cargo update --workspace,避免同类问题再次静默漏网。
修复
- 主窗口隐藏到托盘后不再继续每 2 秒轮询刷新「恢复暂存」按钮状态。此前该轮询只在窗口卸载时停止,而关闭到托盘走的是隐藏(不触发卸载),轮询会在后台一直进行。
- 修复本版首次发版时的构建失败:版本从 0.1.32 提升时只改了
Cargo.toml的[workspace.package] version,未同步Cargo.lock;发布工作流的版本一致性校验当时只覆盖PopGlot.Windows.csproj、Cargo.toml与CHANGELOG.md三处,因此没有拦截,随后所有带--locked的 Cargo 步骤均以「cannot update the lock file because --locked was passed」失败,Release 没有打包、也没有产出安装包。已同步 lock 文件中 popglot-core、popglot-domain、popglot-ffi 三个包的版本后重新发布,编号沿用 0.1.33(该编号此前从未成功发布,无 Release 页与安装包,故不视为已占用)。
迁移
- 无。沿用现有配置与本地数据。
验证与边界
scripts/verify.ps1全量门禁通过:Rust 格式检查、工作区测试(--locked)、Clippy、WPF Debug 构建、PureTests 58 项、Windows 逻辑测试 361 项,全部 0 失败。cargo test --workspace --locked --no-run通过(这是首次发版失败的直接步骤)。- 新增的
Cargo.lock版本校验已在本机模拟两种场景验证:版本一致时通过并打印三个包的版本;人为把 popglot-domain 改回旧版本时按预期抛出明确错误并提示修复命令。 - CliTests --ui 首次运行为 28 项通过 / 1 项失败(
OMP login failure/cancel/unsafe URL isolation),同命令立即重跑为 29 项通过 / 0 项失败。该批为零 C# 行为改动,判定为该项偶发波动而非回归,已作为测试稳定性问题记录待查。 - 已知 Windows 逻辑测试存在与调用方式无关的结果波动:同一命令在不同运行中曾得到 361 项全通过与 227 项通过 / 134 项失败两种结果,失败均为「不能在同一 AppDomain 中创建多个 System.Windows.Application 实例」,根因待查。本批数字以
scripts/verify.ps1全量运行的输出为准。 - 逻辑测试中有一项依赖真实物理鼠标悬停的前置条件,在无头或非交互环境下仍可能失败。
- 划词浮窗与极速查词窗口在 100% 与 150% 缩放下的按钮排布仍需实机目视确认;本批只做了代码层面的布局复核与自动化布局断言。
- 本地测试运行确认真实用户配置未改变,且没有未经许可的公网请求;真实桌面的鼠标交互、多显示器和输入法行为仍需实机验证。
PopGlot 0.1.32
Windows 10(版本 19041 及以上)或 Windows 11,64 位。
这个 zip 自带 .NET 10 桌面运行时。解压后运行 PopGlot.exe,不用另外安装 .NET。
下载本页的 PopGlot-v0.1.32-win-x64.zip。旁边的 .sha256 是校验值:
(Get-FileHash -Path .\PopGlot-v0.1.32-win-x64.zip -Algorithm SHA256).Hash.ToLower()
Get-Content .\PopGlot-v0.1.32-win-x64.zip.sha256修复
- 默认全局快捷键被操作系统或其他程序占用,或在升级后与既有自定义键冲突时,自动停用冲突的默认项并保存,避免重启后反复冲突;不自动清除自定义键。保存失败时明确提示,两项自定义键相互冲突时仍报错。
- 修复悬停提示(ToolTip)的折行与禁用可见性:纯文本提示自动折行并限制最大宽度 360 DIP,按钮禁用时仍可显示说明,显示时长延长至 15 秒。
- 修复划词浮窗底部状态栏在窄窗口下的排列:改用有限列宽与单行省略截断,防止状态与路由提示互相挤占。
- 修复设置窗口快捷键页点击「恢复默认」后未触发未保存(Dirty)状态的问题,恢复后立即更新草稿状态。
- 查词窗口搜索框的无障碍提示改为「Enter 翻译」;划词浮窗空闲底栏移除重复的「Ctrl+Enter 翻译」文案。
迁移
- 无。沿用现有配置与本地数据;被停用的冲突默认按键可在「设置 → 快捷键」中重新录制。
验证与边界
- Pure 单元测试 58 项通过;Windows Debug 完整逻辑回归 360 项通过、1 项失败(唯一失败项为依赖真实物理鼠标悬停的前置条件)。
- 本地测试运行确认真实用户配置未改变,且没有未经许可的公网请求;真实桌面的鼠标交互、多显示器和输入法行为仍需实机验证。
云端发布验证
- Rust workspace Release 测试、Clippy 与格式检查通过。
- Windows Release:纯逻辑测试 58/58、完整逻辑回归 361/361、CLI/UI 测试 29/29 通过。
- 本地此前受真实鼠标悬停前置条件阻碍的用例,在云端完整回归中通过。
- win-x64 自包含便携包及 SHA256 校验文件已上传。
PopGlot 0.1.31
Windows 10(版本 19041 及以上)或 Windows 11,64 位。
这个 zip 自带 .NET 10 桌面运行时。解压后运行 PopGlot.exe,不用另外安装 .NET。
下载本页的 PopGlot-v0.1.31-win-x64.zip。旁边的 .sha256 是校验值:
(Get-FileHash -Path .\PopGlot-v0.1.31-win-x64.zip -Algorithm SHA256).Hash.ToLower()
Get-Content .\PopGlot-v0.1.31-win-x64.zip.sha256变更
- 工作台、浮窗与极速查词切换模型或风格后,有原文就重新翻译;翻译途中可切换模型。
- 模型与风格均通过按钮打开列表选择;按钮只保留图标与当前名称,悬停提示跟随自定义快捷键。
- OMP 引擎按提供方显示名称;同一模型在不同提供方下用提供方短名区分。
- 公共翻译隐藏不支持的风格与要点入口;引擎状态色只采用与当前连接配置匹配的测试结果。
- 快捷键录制时按退格键可停用该动作;停用项不注册、不参与冲突判定,仍可从界面入口使用。
- 精简设置中的推荐、截图处理和翻译说明,重写随包帮助;保留联网接收方、图片上传和测试额度提示。
修复
- 查词切换模型后不再等待整次翻译结束才解除选择器锁定;返回文字期间仍可再次切换。
- 重新选择当前引擎不再重复发送原文;收起查词窗口后,尚未保存完的切换不会启动新的翻译。
- 工作台与浮窗的模型提示不再写成「下次生效」;选择风格但没有原文时,不再提示正在重译。
- 帮助中的工作台按键改为 Ctrl+Enter 翻译、Enter 换行;查词改为按 Enter 提交,删除不存在的诊断导出入口和不准确的启动项恢复说明。
- 主窗口、设置和帮助的品牌图标统一为 26 DIP,裁去透明边距并移除外层装饰边框。
- 引擎编辑页统一边框、分组标题和操作行对齐;移除重复的未保存徽标、协议摘要和常驻推荐理由。
迁移
- 无。沿用现有配置与本地数据。