Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
This repository was archived by the owner on Nov 4, 2026. It is now read-only.

[i18n] 另外三个插件也自拼英文标题传给 NavigationOverlay 的 title prop(kanban / tree / plugin-view),#3426 的围栏没覆盖到 #3459

Closed

Description

@yinlianghui

Blocked-by: #3426(PR #3457)

缘起

#3426 修的是 ListView 与 ObjectGrid 两处「在传入侧自拼英文标题、把 NavigationOverlay 的 i18n 默认值挤掉」的缺陷。那个 issue 的文件围栏只圈了 plugin-list / plugin-grid。在核验 #3426 前提时按同一模式全仓 grep,发现同一类缺陷还有三处,都在围栏外,本次未改动:

文件 传给 title 的东西
packages/plugin-kanban/src/ObjectKanban.tsx(约 504 行) ${objectName 首字母大写并把下划线换成空格} Detail,无 objectName 时是字面量 'Card Details'
packages/plugin-tree/src/ObjectTree.tsx(约 453 行) 裸字面量 "Record Details"
packages/plugin-view/src/ObjectView.tsx(约 1153 行) ${objectLabel} Detail(mode="split" 的那个浮层)

行号取自 main@112b20912,会漂。用 NavigationOverlay + title 搜更稳。

为什么这是缺陷而不是风格问题

NavigationOverlay 的 resolvedTitle 是 title || t('detail.recordDetail') —— 只要宿主传了 title,组件自己的 i18n 默认值就永远不生效。而这个值不是无障碍名,是可见标题:抽屉里是 SheetTitle,模态里是 DialogTitle,split 模式是一个 h3,popover 是一个 h4。所以一个 zh/ja/de 会话会拿到一个通体本地化的浮层,顶上挂着唯一一句英文。这正是 #3426 的形状。

可达性:本人未核验

#3426 的两条路径我逐条核验过并写进了 PR #3457(公开页面块 + navigation 可编写键 + 行点击接 handleClick,并有走完整用户路径的测试作为可执行证据)。这三处我没有做同等核验 —— 它们只是 grep 同形命中。三处看上去都挂在 navigation.isOverlay 门后,与 list/grid 同构,但「看上去同构」不等于可达,派发时应先做与 #3426 同样的可达性判定,可能出现某一处其实被上层覆盖/是死默认的情况。

修法(若可达)

沿用 #3426 落下的形状,不要在 NavigationOverlay 里加宽容:

一个需要决定的点

kanban 的 'Card Details' 和 tree 的 "Record Details" 都是复数拼法,语言包里没有对应键(现有的是单数 detail.recordDetail = Record Detail)。两条路:

倾向 A:这是同一个组件的同一个标题槽,plugin-detail 里 label: 'Record Details' 那种别处的用法不构成保留理由;英文串的变化面很小,改前 grep 一遍 e2e/ 即可确认。但涉及可见文案的取舍,留给维护者拍板。

相关

Activity

  1. yinlianghui commented on Aug 6, 2026

    @yinlianghui
    ContributorAuthor

    分诊:bug + pm:queue(objectui 分片 PM,会话 session_01GTRjn8xBqp75dk7kFupVRt)。

    判级理由:与 #3426(PR #3457,已验收)同族同证据链的三处残余(plugin-kanban/plugin-tree/plugin-view);立单者已诚实声明这三处是 grep 形状命中、未按 #3426 的标准复核可达性——派发时前提检查必须先重做可达性判定,不可达的分支按 premise 处置。

    PM 裁定(issue 留下的复数拼写问题):采 A——归一到单数 detail.recordDetail / recordDetailWithLabel 家族,veto 窗口开放。理由:B(铸复数孪生键)为保英文逐字节不变而复刻的正是本族要消灭的漂移形状——同一控件两份措辞;A 的代价只是 "Card Details"→既有键文案的英文微调,属 chrome 措辞一致性,长期一份翻译一处维护。英文文案变化会在 PR 里明示,维护者可否决。

    派发前置:等 PR #3457 MERGED(Blocked-by: #3426 随之解除,recordDetailWithLabel 键已在);文件面 plugin-kanban/plugin-tree/plugin-view 三包 + 语言包(若需新键)+ 测试,派发时与在飞单错开语言包占用。


    Generated by Claude Code

  2. self-assigned this
    on Aug 6, 2026
  3. yinlianghui commented on Aug 6, 2026

    @yinlianghui
    ContributorAuthor

    认领:objectui 分片 PM 并行批第 44 单(Blocked-by #3426 已解除:PR #3457 MERGED@61958416e)
    会话:session_01GTRjn8xBqp75dk7kFupVRt
    分支:claude/issue-3459-overlay-titles-remaining
    Worktree:objectui-issue-3459
    文件面:packages/plugin-kanban/src/ObjectKanban.tsx、packages/plugin-tree/src/ObjectTree.tsx、packages/plugin-view/src/ObjectView.tsx + 三包各自兜底表/测试 + packages/i18n/src/locales/*(十包,当前无在飞占用)+ changeset。越界即停。
    复数拼写已裁 A(归一单数键族,见上方分诊评论);英文文案变化须在 PR 明示并先 grep e2e/ 确认无旧串寻址。


    Generated by Claude Code

  4. yinlianghui commented on Aug 6, 2026

    @yinlianghui
    ContributorAuthor

    验收:ACCEPT → PR #3464(并行批第 44 单,会话 session_01GTRjn8xBqp75dk7kFupVRt),17/17 检查落定零失败,已转 ready + auto-merge。

    复核要点:

    1. 可达性复核纠正了 issue 两处前提——kanban 的消费者是 RecordDetailDrawer(非 NavigationOverlay),标题渲染进 sr-only header 是可访问名而非可见文案(断言相应用 toHaveAccessibleName);'Card Details' 臂被证明结构性死亡(消费 IIFE 在同条件下先 return null),入键防护但刻意零断言、钉的是死性本身。这正是「grep 同形 ≠ 可达」要求的判定深度。
    2. A 裁定落实且预检完备:tree 的可见变化(Record Details→Record Detail)先全仓 grep 确认零寻址(e2e/单测均无);tree 两条英文断言 before 红被如实归因于裁定本身而非回归,在 PR/changeset/测试头三处声明。
    3. 零新键(复用 fix(i18n): ListView / ObjectGrid 记录详情浮层标题改为入键,不再自拼英文 (#3426) #3457 键族)、plugin-tree 新增 i18n 依赖三件套齐(package.json/vite globals/lockfile)、lazy 边界抢跑预防(AGENTS.md 测试纪律的头号 flake 类)。反向验证 11 红 9 绿与预测一致。
    4. 三条发现处置:[i18n] ObjectView 的 getFormTitle() 自拼英文 Create/Edit/View ${label},喂给 Drawer/Dialog 标题与 popover 浮层 —— #3426/#3459 的同族漏网 #3462(getFormTitle 拼 'Create/Edit/View ${label}',dev 已按同标准验证可达且门槛更低)分诊 bug+pm:queue;[finding] ObjectKanban 里两处死代码:navIsOverlay 算了从不用,detailTitle 的无 objectName 分支不可达 #3463、[finding] KanbanRenderer.uncolumned.test.tsx 的两条断言落在 React.lazy 边界之后,未按 §测试纪律 在模块作用域预载 ./KanbanImpl #3465 finding 留池(池 ~21,分诊轮在即)。

    Generated by Claude Code

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

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions