fix(app-shell): 方案卡的 Building… 徽标随 UI 语言取值,不再被会话语言门控 (#3837) - #3897
Merged
Conversation
`AiChatPage` 用 `convZh`(会话语言)门控四个字符串,因为 cloud 确认门 (`service-ai-studio` `confirm-gate.ts` `APPROVAL_RE`)只认中英,发进线程的 文本必须与线程本身同语言(#772/#2884)。该门上方注释的后半句写明了另一半规 则:button LABELS stay on the UI locale。 `planBuildingLabel`(#2632 引入)落在了这句的错误一侧,中文会话恒取硬编码的 `正在搭建…`,两个后果都已实测: - **混合语言的卡片**:英文控制台里,中文会话的方案卡 `Proposed plan` / `Build it` / `Built` / `Not yet built` 全英文,中间夹一个中文徽标。#2458 第 4 条记录的是同一个病的反方向。 - **翻译永远读不到**:中文会话恒走字面量,`console.ai.planBuilding` 的 zh 值对中文读者无效。#3546 切片四(PR #3839)刚把该 key 补进十包,只能做围 堵 —— 把 zh 值写成与字面量逐字节相同并把两者钉在一起。 徽标现在与相邻十二个标签一样读 `t('console.ai.planBuilding', …)`:十个包全 部可达(德文控制台 + 中文会话渲染 `Wird erstellt…`),zh 包成为该中文措辞的 唯一来源(值不变,中文读者看到的字符串与改动前完全一致)。 三条出站文本(`planApproveMessage` / `planApproveDefaultsMessage` / `changesConfirmMessage`)一行未动,仍随会话语言 —— 复核确认三者都交给 `onSendMessage`(`ChatbotEnhanced.tsx:1598`、`:2395`)、由门读取,正是 `convZh` 分支存在的那一类;全文件再无其它 `*Label`/`*Title` 被该门控住 (`convZh` 全部读点:定义 1 处 + 这三条)。 钉子: - `packages/app-shell/.../AiChatPage.planCardLocale.test.tsx`(新增)真渲染 `ChatPane` + 真 `I18nProvider` + 真 `isConversationZh`,把 `ChatbotEnhanced` 换成 props 记录器:en 控制台 + 中文会话 → `Building…` 且卡上 `*Label` 无一含中日韩字符;de 控制台 + 中文会话 → `Wird erstellt…` (三方语言证明是包在应答,而非两路三元);zh 控制台 → `正在搭建…`;三条 出站文本仍随会话。 - `packages/i18n/.../console-namespace-3546.test.tsx`:切片四埋的围堵钉按其 自述翻转 —— 从「字面量与 zh 包逐字节相同」改为钉住门已移除,并把不变量放 宽一步:`convZh` 只许门控出站 `*Message`,任何新读点都会红。 反向验证(方向先判后跑,与预判一致):还原三元 → 3 红 —— i18n 钉子按自定义 消息点名、en 控制台用例、de 控制台用例;zh 控制台用例与三条出站文本保持绿 (前者按设计逐字节相同,不具区分力,已在测试头注明)。 顺带:`conversationLanguage.ts` 模块头把 progress labels 也列进「随会话」, 该句在本改动后不再为真,收窄为「只治离开控制台发给 agent 的文本」。 写钉子时量到发送半边另有一个缺陷(zh 控制台 + 英文会话会把中文确认句发进英 文线程;`planAnswerMessage` 完全没有门控),不在本单范围,已立 #3896。 测试:`packages/app-shell/src/console/ai` + `packages/i18n` 47 文件 654 通过; 两包 type-check 通过,全仓 `turbo run type-check` 78/78 通过;改动文件 eslint 零告警;`check-control-bytes` / `check-i18n-call-site-keys` / `check-i18n-en-drift` 均通过(零 en 值变更)。 Claude-Session: https://claude.ai/code/session_01GTRjn8xBqp75dk7kFupVRt Co-authored-by: Claude <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
评审可读性,零行为改动:`ChatPane` 的 agents 桩从 `as never` 改成 `as unknown as AgentDescriptor`(类型导入,运行期擦除;该模块在本文件里被 vi.mock,类型不受影响)。 Claude-Session: https://claude.ai/code/session_01GTRjn8xBqp75dk7kFupVRt Co-authored-by: Claude <noreply@anthropic.com>
Contributor
✅ Console Performance Budget
📦 Bundle Size Report
Size Limits
|
Collaborator
Author
|
✅ 验收(PM,session 实物核验:头 裁定要点:
转 ready 并挂 auto-merge。 Generated by Claude Code |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #3837
AiChatPage用convZh(会话语言)门控四个字符串,因为 cloud 确认门(service-ai-studioconfirm-gate.tsAPPROVAL_RE)只认中英,发进线程的文本必须与线程本身同语言(#772 / #2884)。该门上方注释(AiChatPage.tsx:1581-1586)的后半句写明了规则的另一半:> button LABELS stay on the UI locale.
planBuildingLabel(#2632 引入)落在了这句的错误一侧,中文会话恒取硬编码的正在搭建…。两个后果(都已实测)
Proposed plan/Build it/Built/Not yet built之间夹一个正在搭建…Building…正在搭建…Wird erstellt…正在搭建…(来自字面量)正在搭建…(来自 zh 包)第二个后果是翻译永远读不到:中文会话恒走字面量,
console.ai.planBuilding的 zh 值对中文读者无效 —— 改措辞不产生任何效果。#3546 切片四(PR #3839)刚把该 key 补进十包,只能做围堵:把 zh 值写成与字面量逐字节相同,并在测试里把两者钉在一起。#2458 第 4 条记录的是同一个病的反方向(中文界面里漏出英文)。改法
一行:徽标与相邻十二个标签一样读
t('console.ai.planBuilding', …)。十个包全部可达,zh 包成为该中文措辞的唯一来源(值不变,中文读者看到的字符串与改动前完全一致)。三条出站文本(
planApproveMessage/planApproveDefaultsMessage/changesConfirmMessage)一行未动。核验结果:三者确为发送内容 —— 都交给onSendMessage(ChatbotEnhanced.tsx:1598、:2395),由确认门读取,正是convZh分支存在的那一类。全文件再无其它*Label/*Title被该门控住:convZh的读点就是「定义 1 处 + 这三条」。钉子
packages/app-shell/src/console/ai/__tests__/AiChatPage.planCardLocale.test.tsx—— 真渲染ChatPane+ 真I18nProvider+ 真isConversationZh探针,把ChatbotEnhanced换成 props 记录器(ChatPane 交下去的 props 就是这两条规则所在之处)。四例:en 控制台 + 中文会话 →Building…且卡上*Label无一含中日韩字符;de 控制台 + 中文会话 →Wird erstellt…(第三方语言才能证明是包在应答,而不是一个两路三元);zh 控制台(两种会话)→正在搭建…;三条出站文本仍随会话语言。packages/i18n/src/__tests__/console-namespace-3546.test.tsx里切片四埋的围堵钉 —— 其自述就是「在这个三元被删时红,提示回来清理」。现在钉的是门已移除,并把不变量放宽一步:convZh只许门控出站*Message,任何新读点(尤其喂给渲染的)都会红并点名。反向验证(方向先判后跑)
预判:还原三元 → en / de 两例红(徽标变回
正在搭建…)、i18n 钉子红并点名;zh 控制台一例与三条出站文本保持绿 —— 前者按设计与字面量逐字节相同,不具区分力(与切片四「en 断言无法区分前后」同一个道理,已写在测试头)。实跑与预判一致:
3 failed | 35 passed,红的三条正是上述三条,i18n 钉子的报错是自定义消息the convZh gate is back over planBuildingLabel — the zh pack value is dead again (#3837)。顺带
conversationLanguage.ts模块头把 progress labels 也列进「必须随会话」,该句在本改动后不再为真(它现在只治离开控制台发给 agent 的文本)—— 收窄了这一句,并写明标签走 UI 语言。这是本 PR 所收窄的同一条规则的陈述,不是无关顺手活。越界发现(未在本 PR 修)
写钉子时量到发送半边另有缺陷,已立 #3896(未打标签,待 PM 分诊):三条出站文本的
t()分支读的是 UI 包,而 zh 是唯一被允许(且被要求)定义这些 key 的非 en 包,所以 zh 控制台 + 英文会话会把确认,开始搭建。发进英文线程(#2884 症状的反向触发);planAnswerMessage属于OUTBOUND_KEYS却完全不过convZh。因此本 PR 的出站断言故意用de控制台(该包不定义这些 key,保证落到英文默认值),而不是把 zh 控制台的现状钉成正确。测试
pnpm exec vitest run packages/app-shell/src/console/ai packages/i18n --maxWorkers=2→ 47 文件 / 654 通过pnpm --filter @object-ui/app-shell --filter @object-ui/i18n type-check→ 通过;全仓turbo run type-check --concurrency=2→ 78/78eslint零输出;check-control-bytes/check-i18n-call-site-keys/check-i18n-en-drift(零 en 值变更)均通过@object-ui/app-shellpatchGenerated by Claude Code