Skip to content

feat(i18n): 下拉框与界面文案按界面语言本地化,补全多语言词表 - #1627

Open
1w1w11w1 wants to merge 6 commits into
AUTO-MAS-Project:devfrom
1w1w11w1:i18n-combox
Open

1w1w11w1 wants to merge 6 commits into
AUTO-MAS-Project:devfrom
1w1w11w1:i18n-combox

Conversation

@1w1w11w1

Copy link
Copy Markdown
Contributor

摘要

  • 下拉框选项按界面语言本地化:ComboBoxItem 新增 labelKey / kind / scriptType / name,五个 combox 接口随选项下发结构化元数据,前端经 comboxLabel.ts 统一拼装,旧后端逐字回退 label;调度台队列/脚本判断改用 kind,不再解析中文 label 前缀,标签页标题切语言后重算
  • 界面文案多语言完善:计划默认名、首页问候语(en/ja 各配一份文案)、日志页、模拟器新标签名跟随界面语言;ja-JP 回填缺失译文、en-US 补齐,并补上游 feat(MaaEnd): 支持原生启动指定启动器路径并优化启动方式提示 #1573 新增 MaaEnd 启动键的 en/ja 译文;词表测试新增漏译、占位符一致性与 vue-i18n HTML 误判三条检测
  • 布尔配置由「是/否」下拉框统一改为开关控件;修正 antd 弃用 API(Tabs #rightExtra、Modal 遮罩毛玻璃无效属性)
  • 浏览器 e2e 扩充:新增全路由巡检(含 /taskboard)、界面语言中文泄漏巡检、下拉框选项语言、计划、模拟器、脚本创建向导、脚本编辑页、配置生命周期共 8 个用例文件;启动器加依赖与浏览器预检、空闲端口分配与产物目录按运行隔离

验证

frontend/ 下:

  • yarn typecheck、yarn lint(0 警告 0 错误)、yarn format:check 通过
  • yarn test 101 项通过(另有 frontend/.local/ 下 5 项本地遗留草稿用例失败,为未跟踪文件,与本次改动无关、不在提交内)
  • yarn e2e:check 14/14 通过
  • yarn e2e --grep "@routes|@i18n" 31/31;--grep "@plan|@emulator|@config|@editors" 全过(编辑页两条提示文案断言按后端现状放宽后 16/16);--grep "@queue|@scheduler|@settings|@recovery" 通过(queue 首跑一次时序抖动,单独重跑通过)

仓库根:

  • uv run ruff format --check 与 uv run ruff check(app/core/config.py、app/models/schema.py)通过

- ComboBoxItem 增加 labelKey/kind/scriptType/name,五个 combox 接口随选项下发结构化元数据;前端 comboxLabel.ts 统一拼装本地化文案,旧后端逐字回退 label
- 调度台队列/脚本判断改用 kind,不再解析中文 label 前缀;标签页标题持久化 titleKey,切语言后重算
- 计划默认名、首页问候语、日志页、模拟器新标签名跟随界面语言;问候语 en/ja 各配一份文案
- 词表补全:ja-JP 回填缺失译文、en-US 补齐,并补上游 AUTO-MAS-Project#1573 新增 MaaEnd 启动键的 en/ja 译文
- locales.test 新增漏译、占位符一致性与 vue-i18n HTML 误判检测
脚本与账号编辑页、设置页、队列页的布尔配置统一用 a-switch 开关,
替换原来的「是/否」a-select;顺带移除开关上无效的 size 属性。
- Tabs 标签栏右侧插槽换用 #rightExtra,消除控制台弃用告警
- 电源倒计时弹窗的 :mask="{ blur: true }" 是无效属性,毛玻璃改由
  遮罩层 CSS backdrop-filter 落地
去掉 as unknown as ElectronAPI 的整包强转,改为 Partial<ElectronAPI>:
已写成员的签名由 typecheck 保证,缺的成员要求调用方可选调用兜住。
补齐窗口控制与 Runtime 启动模式桩,TitleBar 相应改为可选调用。
- 新增用例:全路由巡检(含上游新页 /taskboard)、界面语言中文泄漏
  巡检、下拉框选项语言、计划管理、模拟器配置、脚本创建向导、
  脚本编辑页、配置生命周期
- 启动器加依赖/浏览器预检与空闲端口分配,产物目录按运行隔离,
  e2e:report 改为列出并打开最近报告;新增 README 说明用法
- 契约检查补齐:路由清单、标签登记(兼容裸 test 标题前缀)
打开缺失脚本/读取失败时,后端现状会把 KeyError 原样带回给前端,
断言兼容现状与未来的友好文案。
@sourcery-ai

sourcery-ai Bot commented Oct 24, 2026

Copy link
Copy Markdown

Sorry @1w1w11w1, your pull request is larger than the review limit of 150,000 diff characters

@github-actions github-actions Bot added 模块: 设置 按更新日志碎片自动设置 类型: 变更 按更新日志碎片自动设置 labels Oct 24, 2026

Copy link
Copy Markdown
Contributor

建议先修复下面两项 P2,再合并;新增计划 E2E 的清理逻辑和本次组件规模规则也需要调整。

来自 dot
审查 commit:ee16effe5f3a0c885c49065e36d063fb6febf033
base / 真实 merge-base:3639e24f46811348f90bafecb7e7981df5ff87b1。本次为该 head 初审,以下问题均对照 base 核验。

1. [P2] 英文、日文默认计划名重新加载后变成中文,还会绕过后续重名判断

位置:plan/index.vue:570–571。

英文界面新建 MAA 计划时,handleAddPlan 会把 “New MAA plan” 保存到 Info.Name。离开再进入计划页面后,新增的 isDefaultPlanName 能识别这个英文默认名,但下一行 generateUniquePlanName 没有传翻译函数,会退回中文默认名。syncCurrentPlan 又优先采用这个列表名称,因此已保存的英文计划显示成中文。

更重要的是,再新建同类型计划时,getDefaultPlanName 只拿当前 planList 中的名称判重。列表里的第一个名称已经被换成中文,于是第二次又生成并保存 “New MAA plan”,两个实际计划变成同名。日文和其他计划类型有同一问题。

依据:创建与保存、列表名称参与判重、未传 translate 时的中文回退。

最小修复:加载时与创建时使用相同的翻译函数,或保留已有持久化名称,并用真实 Info.Name 做判重。补一条“英文/日文创建默认名 → 不改名直接重新进入 → 再建同类型计划”的回归,检查界面和持久化名称都正确且不重复。

2. [P2] 旧响应缺少 kind 时,调度台把队列当成脚本

位置:comboxLabel.ts:39。

PR 明确保留旧后端 label 的展示回退,但队列分类改为仅判断 kind === 'queue'。旧格式的 { label: "队列 - 名称", value: 队列ID } 能正常显示,却会被判成脚本。

实际影响不只是文案:isQueueTask/isScriptTask 随后会拿队列 ID 请求脚本用户列表;循环队列配置加载 被跳过并回到 AutoProxy;启动参数 也不再带 queueUserIds。队列续跑和账号范围界面会走错分支。

触发条件限定为新版前端连接仍返回旧结构的后端,例如浏览器预览连接独立后端。已核对 Electron 有版本检查,不认为正常安装能任意混用旧版本;不过浏览器入口不经过该检查,且本 PR 没有改版本号,版本检查也不比较 commit。

最小修复:kind 存在时按 kind 判断;仅缺省时沿用原始 label 的队列前缀回退,集中放在这个 helper。验证新结构与旧结构的队列、脚本都走正确业务分支,不需要另建兼容层。

3. [P3] 新增计划 E2E 总把计划列表读成空,清理实际上不会执行

位置:plan.pw.ts:25–37。

app.api.post 已经在 fixtures.ts:193 解包为 parsed.data;但 /api/plan/get 的 index 与 data 是同级字段。这里再读取 data.index,得到的不是顶层计划索引,因此无论有多少计划都会返回 []。

这使 deleteAllPlans 跳过所有删除请求,随后的“清理失败”断言仍通过。尤其“四种计划”用例创建的记录不会由 afterEach 清理;使用同一运行数据目录的后续用例会受到残留影响,读列表判断已删除的断言也失去证明力。

最小修复:本端点通过已有 raw 请求读取并检查完整响应中的 index,或采用等价的端点专用读取方式;不要改全局 post 的解包契约。补查“已有计划时能读到 UID、清理后真实 index 为空”。

规范方面的具体未满足项

该 head 的 Component Size Policy 是强制规则,不是个人风格建议。按规则对完整 .vue 文件与上述 base 计数,以下既有超 500 行组件仍增长:

  • MAAUserEdit.vue:1802 → 1803
  • MaaEndUserEdit.vue:1010 → 1011
  • Emulator.vue:1698 → 1717
  • QueueItemManager.vue:999 → 1004
  • TimeSetManager.vue:1044 → 1045

即使局部维护也要求不超过基线;涉及新增行为则要求先提取受影响职责。这里只建议按实际改动提取最小职责,不扩展为整页重构,也不能靠压缩空行达标。这属于规范问题,不把它说成运行故障。

审查范围与限制:已读取本 commit 的 AGENTS、mas-skills 及适用的前端规范/UI、代码规范、数据模型/配置框架、API 契约、计划调度和 E2E 规则引用。静态核对了 combox 生成到消费者、默认名保存与重载、布尔控件读写、语言切换和 E2E 启动/清理链路;性能检查覆盖选项映射、重复加载和测试资源收尾,没有性能实测。未执行项目代码、类型检查、构建或任何测试,也未验证真实 Electron 渲染;PR 描述中的通过结果属于作者报告,不是本次执行结果。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

模块: 设置 按更新日志碎片自动设置 类型: 变更 按更新日志碎片自动设置

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants