在 #3546 切片四(回填 console 命名空间 41 个缺失 key)顺手量出,不在该 PR 范围内 (组件改动,与本切片"只回填语言包"的围栏无关),单独立项。
现场
packages/app-shell/src/console/ai/AiChatPage.tsx:2195:
planBuildingLabel={
convZh ? '正在搭建…' : t('console.ai.planBuilding', { defaultValue: 'Building…' })
}
convZh(同文件 1587 行)判定的是会话 的语言(isConversationZh(messages)),不是 UI 语言。它上面 1580-1586 行的注释把规则写得很清楚,而且这条规则是对的:
#772 — the confirm-card SEND messages must match the CONVERSATION's language, not the console UI locale … button LABELS stay on the UI locale.
同一个 convZh 门控的另外三个值 —— planApproveMessage / planApproveDefaultsMessage / changesConfirmMessage —— 都是发给 agent 的消息 ,按会话语言取值,完全符合该规则(#772 /#2884 就是为它们建立的)。
planBuildingLabel 是标签 (名字里就写着 Label,渲染在方案卡上),却被同一个门控住了。这是那条注释自己排除掉的那一类。
两个后果
混合语言的卡片。 英文 UI + 中文会话时,方案卡上 planTitle(Proposed plan)、planApprove(Build it)、planBuilt(Built)、planDeferred(Not yet built)全是英文,中间夹一个"正在搭建…"。console-ai UX:三轮真实浏览器魔法流程测试的体验问题清单(登录无声失败/agent 蓝图感知/转介等待/i18n 混杂等) #2458 第 4 条记录的是反方向(中文界面里漏出英文),这是同一个病的另一侧。
zh 包的这个 key 永远读不到。 中文会话恒走硬编码字面量,所以 console.ai.planBuilding 的 zh 值对真实中文用户无效 —— 翻译改它不产生任何效果。258 个 t() 调用点引用的 key 在任何语言包里都不存在(#3530 守卫首跑实测),其中 8 处直接把 raw key 渲染给用户 #3546 切片四刚把这个 key 补进十包(PR fix(i18n): 回填 console 命名空间 41 个缺失语言 key + console.ai.group. 前缀家族,十包补齐 (#3546 切片四) #3839 ),补进去的 zh 值只在"中文 UI + 英文会话"这种组合下才会被读到。
已做的防护(不是修复)
切片四把 zh 值写成与该字面量逐字节相同 的 正在搭建…,并在 packages/i18n/src/__tests__/console-namespace-3546.test.tsx 里加了一条断言,读 AiChatPage.tsx 源码把两者钉在一起:
const literal = src . match ( / c o n v Z h \? ' ( [ ^ ' ] + ) ' : t \( ' c o n s o l e \. a i \. p l a n B u i l d i n g ' / ) ;
expect ( literal , 'the convZh planBuilding branch moved — recheck the finding' ) . not . toBeNull ( ) ;
expect ( at ( builtInLocales . zh , 'console.ai.planBuilding' ) ) . toBe ( literal [ 1 ] ) ;
// ↑ 实际代码在 literal 后带非空断言;GitHub 正文消毒器会吃掉那个字符,故此处省略
所以在本单修掉之前,两条路径至少不会说两种话;该断言在这个三元被删掉时会红,提示回来清理它。
建议的修法(未裁决)
把 planBuildingLabel 从 convZh 里摘出来,直接用 t('console.ai.planBuilding', …),与卡上其他标签一致 —— 一行删除。顺带值得核一遍 convZh 门控的其余三处是否确实都是"发送内容"(实测是),以及是否还有别的 *Label 被同类门控住。
关联:#772 / #2884 (建立"消息随会话、标签随 UI"规则的两单)、#3546 / PR #3839 (切片四补进这个 key 并加了字节钉子)、#2458 第 4 条(AI 面语言混杂,反方向)。
在 #3546 切片四(回填
console命名空间 41 个缺失 key)顺手量出,不在该 PR 范围内(组件改动,与本切片"只回填语言包"的围栏无关),单独立项。现场
packages/app-shell/src/console/ai/AiChatPage.tsx:2195:convZh(同文件 1587 行)判定的是会话的语言(isConversationZh(messages)),不是 UI 语言。它上面 1580-1586 行的注释把规则写得很清楚,而且这条规则是对的:同一个
convZh门控的另外三个值 ——planApproveMessage/planApproveDefaultsMessage/changesConfirmMessage—— 都是发给 agent 的消息,按会话语言取值,完全符合该规则(#772/#2884 就是为它们建立的)。planBuildingLabel是标签(名字里就写着 Label,渲染在方案卡上),却被同一个门控住了。这是那条注释自己排除掉的那一类。两个后果
planTitle(Proposed plan)、planApprove(Build it)、planBuilt(Built)、planDeferred(Not yet built)全是英文,中间夹一个"正在搭建…"。console-ai UX:三轮真实浏览器魔法流程测试的体验问题清单(登录无声失败/agent 蓝图感知/转介等待/i18n 混杂等) #2458 第 4 条记录的是反方向(中文界面里漏出英文),这是同一个病的另一侧。console.ai.planBuilding的 zh 值对真实中文用户无效 —— 翻译改它不产生任何效果。258 个 t() 调用点引用的 key 在任何语言包里都不存在(#3530 守卫首跑实测),其中 8 处直接把 raw key 渲染给用户 #3546 切片四刚把这个 key 补进十包(PR fix(i18n): 回填 console 命名空间 41 个缺失语言 key + console.ai.group. 前缀家族,十包补齐 (#3546 切片四) #3839),补进去的 zh 值只在"中文 UI + 英文会话"这种组合下才会被读到。已做的防护(不是修复)
切片四把 zh 值写成与该字面量逐字节相同的
正在搭建…,并在packages/i18n/src/__tests__/console-namespace-3546.test.tsx里加了一条断言,读AiChatPage.tsx源码把两者钉在一起:所以在本单修掉之前,两条路径至少不会说两种话;该断言在这个三元被删掉时会红,提示回来清理它。
建议的修法(未裁决)
把
planBuildingLabel从convZh里摘出来,直接用t('console.ai.planBuilding', …),与卡上其他标签一致 —— 一行删除。顺带值得核一遍convZh门控的其余三处是否确实都是"发送内容"(实测是),以及是否还有别的*Label被同类门控住。关联:#772 / #2884(建立"消息随会话、标签随 UI"规则的两单)、#3546 / PR #3839(切片四补进这个 key 并加了字节钉子)、#2458 第 4 条(AI 面语言混杂,反方向)。