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.

[finding][i18n] RecordFormPage 给 form.createTitle 传的 defaultValue 是 New ${label},与 en 包的 Create {{object}} 动词不一致(当前不可达) #3469

Closed

Description

@yinlianghui

观察类发现,当前用户碰不到,故只打 finding,不入队 —— 由 PM 分诊定级。

在 #3462(PR #3468)做消费半径清扫时顺带看到的,不属于该 issue 范围,未在该 PR 中修改。

现象

packages/app-shell/src/views/RecordFormPage.tsx:129-132:

const pageTitle =
  mode === 'create'
    ? t('form.createTitle', { object: label, defaultValue: `New ${label}` })
    : t('form.editTitle',   { object: label, defaultValue: `Edit ${label}` });

form.createTitle 在 en 包里是 Create {{object}},而这里的 defaultValue 写的是 New ${label}。同一个标题在同一个调用点上有两种英文拼法,动词还不一样(Create vs New)。editTitle 那条是一致的(都是 Edit)。

为什么现在不可达

form.createTitle 十个语言包全部定义(en.ts:146 等),all-locales-key-parity.test.ts 也在持续钉住这一点,所以 i18next 永远解析得到,defaultValue 这一支是死的 —— 无论有没有 provider,页面标题都是 Create Contacts。

它属于「已声明但不被执行」的漂移:只有当 form.createTitle 从包里被删掉(或 key 被改名)时才会突然显形,而那一刻页面标题会从 Create X 变成 New X,且没有任何测试会红。

与 #3462 的关系

#3462 把 ObjectView 的抽屉/弹窗/浮层标题也接到了这同一组 key 上,所以现在有四个承载面共用 form.createTitle。这条 defaultValue 是这组 key 周围唯一一处不同拼法,清掉它能让「这个标题只有一种英文」这件事成为结构性事实,而不是巧合。

顺带一提:工具栏的创建按钮解析的是 console.objectView.new(New / 新建),这是刻意与标题分开的另一个 key —— 按钮动词与标题是两种语境。所以这里的 New 并不是「跟按钮对齐」的有意设计,两处也没有任何代码关联。

可能的处理

  • A. 把 defaultValue 改成 Create ${label},与包一致(最小改动)。
  • B. 直接删掉这两个 defaultValue —— key 有 parity 测试保证存在,兜底本身就是冗余;同文件下面 form.createSuccess / form.updateSuccess 等也有同形 defaultValue,可一并评估。

倾向 B:defaultValue 在一个由 parity 测试保证不缺 key 的仓库里,是「消费端容忍」而非契约,留着只会成为第二处会漂的拼写。但这是维护者的取舍,不在本 finding 的判断范围内。

Activity

  1. self-assigned this
    on Aug 7, 2026
  2. yinlianghui commented on Aug 7, 2026

    @yinlianghui
    ContributorAuthor

    认领(PM 分诊晋级)— 会话 session_01GTRjn8xBqp75dk7kFupVRt,分支 claude/issue-3469-dead-defaultvalue。

    分诊结论:取 B 向(删除死的 defaultValue 分支),与 #3470/#3483 的"declared=enforced、消费端不留容忍"先例一致 —— parity 测试已钉住 key 必在,内联兜底是第二处会漂的拼写,删。同文件内其余同形 defaultValue(form.createSuccess / form.updateSuccess 等)按同一规则评估:key 被 parity 测试覆盖的才删,行为必须逐一确认不变。

    文件面:packages/app-shell/src/views/RecordFormPage.tsx + 对应测试。越界即停。


    Generated by Claude Code

  3. yinlianghui commented on Aug 7, 2026

    @yinlianghui
    ContributorAuthor

    验收:ACCEPT — PR #3516。

    核过 GitHub 实物(3 文件与报告一一对应)。裁定要点:

    1. 7 删 1 留,留的有实证:dev 没有把 parity 测试的保证当传递性事实,而是把 8 个 key 逐一对十个包做了实测 —— 结果抓到 form.createTargetOrg 十个包全缺(连 en 都没有),是全文件唯一承重的兜底。按派单规则("仅 parity 钉住的才删")正确保留、双向钉扎(缺失时兜底必须在;回填后测试红并提示删除),并另立 [i18n] form.createTargetOrg 在十个语言包里全部缺失,组织写入目标徽标在所有非英文语言下都渲染英文兜底 #3517。这正是那条规则存在的意义。
    2. "不可能的红方向"处理得诚实:key 在包里时 i18next 根本不查 defaultValue,恢复旧代码不可能变红 —— dev 预告 green→green 并跑了反事实探针(临时删 en key:旧代码静默换动词零信号,新代码裸 key + 守卫红),把删除买到的东西量化了。测试文件头部把这段推理写给了下一个读者。
    3. 新增 16 例测试以 en+zh 双语断言标题来自语言包(内联英文默认值无法满足 zh 断言),并钉住 7 个裸 key 在十包齐全。
    4. Type Check 红 = main 的 Type Check job 全红:#3489 与 #3498 的语义冲突,check-doc-links.test.ts 的 @ts-expect-error 在 allowJs 下变成 TS2578 #3504 既有(job log 核对过坐标);fix(scripts): 删除 check-doc-links 测试中已失效的 @ts-expect-error(修复净 main 上的 TS2578) #3505 已 ready+auto-merge 在队。

    #3517(真实可达缺陷:集团租户徽标十语言全英文)已分诊为待派,但必须等本 PR 合并后再派 —— 修复面(RecordFormPage.tsx + 新测试文件的两条例外钉扎)与本 PR 同文件同区域,先派必撞。

    PR 转 ready + auto-merge。


    Generated by Claude Code

  4. added a commit that references this issue on Aug 10, 2026
    c0c771c
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions