i18n 工程、学校英文兼容与安全修补交付¶
历史记录 / Historical record:本文保留当时的计划、研究或验收证据,不代表 0.11 当前能力全集。现行说明见 文档入口;英文入口见 English overview。
工作分支 exp,2026-10-20。本轮从现有业务继续实现,没有用 PR 57 的旧页面覆盖新版界面;翻译交接和安全审查并行收口。源文键数、候选译文数与批次以 交付清单 为准。
最终清单为 7,296 条源文、92 批;英文有 564 条待复核候选、6,732 条待填。--locale en-US --complete 实际运行仍按预期拒绝发布,空值没有被计为翻译完成。
翻译模型现在负责什么¶
只填写 apps/desktop/src/i18n/locales/en-US.ts 的指定字符串值。入口为 翻译指南、术语表、批次 001。批次检查要求工程基线,拒绝错占位符、缺键、执行代码、源文版本不一致、越批修改,以及改动业务/测试等其他文件。
运行时已覆盖语言保存、跨窗口、三种模式设置入口、document.lang、OneGUI 默认文案、确认/表单/Toast、稳定设置定位和按语言重算的展示值。29 个业务及插件表单入口的固定显示文案改为描述符,已打开的表单可跟随语言更新;默认值、用户输入和选项身份保持原值。切换语言不重挂应用。翻译函数在调用时读取当前语言,回调不因单纯 locale 依赖被批量重建,避免意外重触发请求副作用。
中英文词典具有一致键集;英文空值表示待翻译并回退中文。已有候选译文也要复核。工程接入、英文覆盖率、语言质量是三个不同验收项,当前没有声称英文或其他语言已经翻译完成。
本轮修正了提取中发现的身份边界:THOS 中文状态比较、洗衣机定位、外校课程搜索词、系统日历名称、系统首页持久名称保持原值。导航、搜索和标签的展示文案单独解析;学堂行的 Atom 使用原始课程名,避免在暂存箱产生重复内容。
Android 桌面小组件也接入同一词典:快照携带语言和 62 条模板,原生后台重算继续使用该语言;语言切换会更新快照,并阻止旧异步任务覆盖。另修复了插件槽位存储/读取结构不一致,以及实例枚举失败后仍错误清理已保存内容的问题。见 小组件验收。
学校英文页面¶
- 网络学堂有学校自己的语言切换入口和
englishName数据。中文显示原课程名;其他非中文语言优先学校英文名,没有则保留原名;搜索兼容两者。 - 用户第二份附件是 Info 英文门户,不是英文选课内页。解析器补了中英文表头、分页、会话识别和业务拒绝;未知页面不会当作空课表,明确失败不会被旧已选记录掩盖。
- 作业提交只承认明确的机器成功字段;退课与志愿调整需准确身份的回读确认。没有自动修改学校网站语言设置。
- 原始附件包含私人信息,未复制到仓库。使用匿名结构验证,未进行学校登录、真实提交、选课或退课。官方英文内页没有足够实样,不能称为在线全站验收。
见 学校英文解析与身份报告。
修复的安全问题¶
| 范围 | 实际问题与结果 | 证据 |
|---|---|---|
| HTML 与文档 | 多个预览入口可以保留事件属性/危险 URL;统一 DOMPurify,解析失败按纯文本显示;场馆 token 内联脚本安全转义 | HTML 审查 |
| 插件与文件 | 插件 ..、manifest 入口逃逸、符号链接、任意程序路径、失败安装损坏旧目录、存储失败假成功 |
原生边界 |
| 请求与凭据 | 跨 origin 重定向重放鉴权/body、Cookie Secure/host-only 属性丢失、普通文件权限、Windows shell 二次解释 | 原生边界 |
| 日志与隐私 | Cookie 值、认证 URL 查询、HTML、脚本、作业正文等进入日志或诊断导出;删除源头 dump,TS/Rust 出口脱敏,私有目录与权限 | 账号与诊断、核心客户端 |
| 账号隔离 | 云盘退出后目录缓存可读、旧请求回填、配置载入和持久化竞态;增加账号代次与串行写入,写失败不报告成功 | 账号与诊断 |
| 组织与分享 | 复核服务端角色、独立授权路径、修订冲突、撤权失败重试及私密分享密钥边界,协议值不随译文变化 | 账号与权限 |
| 整包更新 | 共享取消位、多次 Range 拼接、临时文件、路径/协议输入、任意安装文件及安装前篡改 | 更新审查 |
| 依赖 | SheetJS 0.18.5 的两个高危公告;升级官方固定 0.20.3 tarball 并锁完整性;验证实际表格/文档读取 | 依赖触发面 |
正式资源热更新按用户后续指示撤出范围。开发 HMR 保留,已有整包升级继续可用;没有新增 OTA 后端或声称正式资源可热替换。
验证的含义¶
验证执行真实业务模块、实际 React 组件、DOMParser、DOMPurify、文件系统或本地 HTTP 服务;账号、远端写入和系统安装调用使用隔离替身。具体命令及逐项结果在各专题报告中。
| 验证域 | 本轮证据 |
|---|---|
| i18n 基础和交接 | 运行时 29、兄弟宿主浏览器 17、设置定位 12、OneGUI 65;词典语法/参数与十类批次拒绝变异 |
| 实际 App | Chromium/WebKit × 三模式 × 1280/390;真实语言控件、跨窗口、草稿、路由和点击命中;两引擎分别 77 项且自然退出 0,截图已人工查看 |
| 实际业务表单 | 28 项;组织的两个真实入口、两引擎、跨窗口切换,标题/字段更新且三种草稿与 DOM 保留;取消后组织数据不变 |
| 学校英文与显示 | 匿名客户端 48、浏览器 DOMParser 32、隐私 30、实际课程行与 Atom/点击 50、GUI/IM 补漏 24 |
| HTML | 两浏览器四个实际消费入口,221 项;场馆内联脚本 35 项 |
| 原生与更新 | 原生路径/网络/Cookie/日志/插件/镜像 20 组;下载真实 HTTP/文件系统 10 组,安装 IPC 14 项;Android Rust 编译 |
| Android 小组件 | 22 项 TS、14 项 JVM;真实 Kotlin 文件用 Android API 36 编译,旧快照/槽位兼容及失败时不修剪 |
| 账号与同步 | 云盘 9、邮箱 23、云日历 137、系统日历 27、组织 38;日程编辑与作业截止回归 |
| 独立业务复核 | 身份 39、安全协议 15、MadModel 31、短口令浏览器 52;末轮显示 33、学期/成绩缓存 10;原断言保留,只补真实词典依赖 |
没有通过增加 OneGUI 基线或删除业务断言来消除失败。旧源码文案护栏使用 AST 将真实词典还原为测试视图;行为测试仍执行业务模块,不将测试视图当成应用。
最终集成命令:pnpm test:i18n、pnpm guard、pnpm guard:onegui、pnpm typecheck、pnpm test、pnpm --filter @onethu/desktop build 和 git diff --check。词典检查也验证未知语言参数会失败;开发 Vite 和正式构建均拒绝可执行的译文文件。正式构建保留原有大 chunk 警告。
提交后的交接实测还修复了检查器对 "messages" 带引号属性名的误判:原比较器只接受 messages 写法,会拒绝生成词典中的合法译文修改。新增回归在独立临时 Git 仓库复制真实词典和首批清单,实际运行生产 CLI;只填本批译文成功,越批改值与改结构仍失败。修复前复现拒绝,修复后整套 pnpm test:i18n 通过,未改应用或译文。
仍然存在的边界¶
- 英文仍待批次翻译;最终长译文、其他语言、实体手机与 Windows WebView2 尚需发布验收。390 视口的浏览器点击不冒充手机真机。
- 缺少第二个真实账号,组织跨账号联调未执行,入口保留。学校英文选课内页、真实作业提交、学校 SSO 仍无在线验证。
- 生产依赖审计仍有 Quill 低危、sprintf-js 中危公告。当前两个 Quill 编辑器禁用涉事格式且 HTML 输出消毒;sprintf-js 位于 Mammoth CLI 的 argparse 路径,实际浏览器转换 bundle 未包含它。没有忽略告警,也不宣称依赖零风险。
- 私有文件权限和脱敏不等于系统钥匙串或全量凭据加密;原生插件仍拥有用户授权的本机权限,并未建立操作系统沙箱。没有静默删除历史日志。
- 更新清单仍依赖 HTTPS 来源,哈希不等于发行者签名。没有真实系统覆盖升级、签名迁移、断电恢复或原生包事务回滚证据。
- 安全审查是已列数据流和失败路径的工程检查,不是对全仓或所有未来服务行为的安全保证。打包仍有较大 chunk 警告;没有通过调高阈值隐藏它。
- 本轮没有生成或安装新的原生包;Rust/Kotlin 的修复需要重新打包后才会进入已安装的 App。浏览器和 Vite 验收只证明当前前端源码。
本轮不发布、不推送、不读取真实凭据,也不修改真实学校账户或云端权限。