You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Repository navigation
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Activity
xuyushun441-sys commentedon Aug 3, 2026
认领:PM 循环第 4 轮
会话:
session_01NVPjPzmmAJ2Ngtvgg5MSRa(objectui 分片 PM,账号xuyushun441-sys)分支:
claude/issue-3263-builtin-select-empty-i18nWorktree:
objectui-issue-3263前置已解除,且本单是 #3231 刻意留下的最后一块
#3231(PR #3262)已落在 main(
825bbe33c),它补的两个 key ——fields.options.empty与fields.options.selectFirst—— 已在十个语言包里就位,而且fields.options.selectFirst已经被form.tsx的门控提示(gatedHint)使用。所以现在
form.tsx里是「一半走了 i18n、一半没走」,内建 select 分支那句'No options available'是同一个文件里唯一剩下的硬编码副本。这是当时 scope fence 明确留的口子,不是遗漏。派发范围(小且明确)
form.tsx内建分支改用t('fields.options.empty');useSafeFormTranslation的 defaults map 补同名英文默认值 —— 与fields.options.selectFirst已有的做法一致,这样无 provider 时英文渲染逐字不变;两条边界
⛔ 不要把内建分支与
packages/fields的OptionsEmptyState统一成一个组件。原单说得对:两者是不同包、不同渲染路径,该共享的只有 i18n key,不是组件。内建分支走的是BUILTIN_FIELD_TYPES命中时的内联渲染,已注册 widget 走注册表 —— 把它们并起来会把一条路径的约束强加给另一条。form-cascading-select.test.tsx)预期英文,defaults map 落回后应当逐字不变;若有测试因此转红,说明 defaults 没接对,不要去改断言。Generated by Claude Code
xuyushun441-sys commentedon Aug 3, 2026
PM 验收:ACCEPT — PR #3271,已入合并队列
CI 16 项全 success;4 个文件,全在
packages/components(packages/i18n未动 —— 两个 key 由 #3231 补齐,它核对过en.ts/zh.ts才确认不需要改)。边界遵守:没有把内建分支与packages/fields的OptionsEmptyState做组件级统一,只共享 i18n key。它发现了一个我和 issue 都没预见的约束
不能直接在原地调
t():renderFieldComponent是普通 helper 而不是组件,它在"已注册 widget"那条路径上会提前 return —— 在那里调 hook 就是条件调用(rules-of-hooks)。所以空状态被提成同文件里的小组件BuiltinSelectEmptyState。更要紧的是它顺带守住了一处无障碍接线:该组件必须转发
...rest,因为FormControl是 Radix Slot,控件的id/aria-describedby/aria-invalid是它注入的 —— 丢掉 rest props 会让该字段 label 的for指向一个不存在的 id。这一点有测试钉住,而且变异验证的 DOM dump 里顺便确认了id="_r_4_-form-item"与aria-describedby仍落在那个 div 上。一个只关心文案的改动,很容易在这里静默弄坏 label 关联。缺陷的真实形态比 issue 描述的更难看
PR 正文点出来了:同一个 widget 在 zh 会话里会中途换语言 —— 被
dependsOn门控时显示「请先选择Country」,用户把父字段填成一个匹配不到选项的值之后,同一个框立刻变成英文 "No options available"。不是"有一句没翻译",是一个控件在一次交互里跨了两种语言。测试也钉住了这条:门控解除后两句话仍在同一种语言里。
现有英文断言全绿,没被改动
form-cascading-select.test.tsx、plugin-form/selectOptions.test.tsx未改且通过 —— 说明 defaults 回落接对了。我在派发时说过"若它们转红,说明接线错了,去修接线不要改断言",没有触发。越界发现 #3272,已入队
form.tsx里还有一批用户可见的硬编码英文:FullscreenTextarea整个全屏编辑对话框('Edit text' 标题、sr-only 描述、Cancel/Done 按钮)、aria-label="required",以及内建 select 分支里一处够不到的死兜底placeholder || 'Select an option'(唯一调用点已经传了t('common.selectOption'))。其中
submitLabel='Submit'/cancelLabel='Cancel'是 schema 默认值,它标注了这一条牵涉「默认值 vs 渲染时回落」的语义选择,需要定方向 —— 没有自行决定,对。Generated by Claude Code
fix(components): translate the built-in select branch's empty copy (o…