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] ObjectView 的 getFormTitle() 自拼英文 Create/Edit/View ${label},喂给 Drawer/Dialog 标题与 popover 浮层 —— #3426/#3459 的同族漏网 #3462

Closed

Description

@yinlianghui

发现于 #3459 的实现过程(PR 待开),不在该 issue 的围栏内,单独立单。

缺陷

packages/plugin-view/src/ObjectView.tsx 的 getFormTitle()(main@a32c4374c 之前约 847 行)在 TypeScript 里拼英文:

const getFormTitle = (): string => {
  if (schema.form?.title) return schema.form.title;
  const objectLabel = (objectSchema?.label as string) || schema.objectName;
  switch (formMode) {
    case 'create': return `Create ${objectLabel}`;
    case 'edit': return `Edit ${objectLabel}`;
    case 'view': return `View ${objectLabel}`;
    default: return objectLabel;
  }
};

三个消费点,全是可见标题:

位置 组件
renderDrawerForm() DrawerTitle
renderModalForm() DialogTitle
formLayout === 'popover' 分支 NavigationOverlay 的 title prop

第三个正是 #3426 描述的那类:宿主传了 title,NavigationOverlay 的 resolvedTitle = title || t('detail.recordDetail') 默认值永不生效。

#3459 只修了同文件里 mode: 'split' 那一处 ${objectLabel} Detail,围栏没含 getFormTitle —— 它是另一组字符串(动词 + 标签),不是同一个 key 家族。

可达性:已核验,不是死默认

用与 #3457/#3459 相同的标准跑了真实交互(渲染块 → 点行 → 读标题),在 zh 会话下通过,即缺陷成立:

// I18nProvider defaultLanguage: 'zh';getObjectSchema 返回 label: '联系人'
// schema: { type: 'object-view', objectName: 'contacts', navigation: { mode: 'drawer' } }
const cell = await screen.findByText('Alice');
fireEvent.click(cell);
await waitFor(() => expect(screen.getByText('View 联系人')).toBeInTheDocument());
// → 通过:zh 会话里抽屉标题是 "View 联系人",英文动词直接挂在本地化标签前面

门槛比 split 那处还低:navigation.mode: 'drawer' 与 'modal' 都到得了,而 ObjectViewSchema.layout 的默认值本身就是 'drawer',deriveRecordSurface 也常返回 'drawer' —— 即 navigation 完全不写也可能进这条路。navigation 在 object-view 的注册 inputs 里是声明过的可编写键。

app-shell 的 ObjectView 包装器钉了 layout: 'page' 并给 onNavigate,那条路被宿主覆盖 —— 是一个消费者的覆盖,不是分支死掉。

修法(建议,未实现)

沿 #3426/#3459 的形状:三个动词分支走 key + {{label}} 插值,让各语言包自己决定语序(de 的复合词、ja/zh 的助词位置都与英文不同)。需要判定的是复用现有 key 还是新增:

英文输出可否逐字节不变取决于选定的 key 拼写,派发时应作为裁定点写清。

相关

未打 finding 标签:这是用户今天就能看到的具体缺陷(zh/ja/de 会话的抽屉/弹窗标题),留给 PM 定级。

Activity

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

    @yinlianghui
    ContributorAuthor

    认领:objectui 分片 PM 并行批第 45 单(前置解除:PR #3464 已 MERGED@aa36e6073,ObjectView.tsx 无在飞占用)
    会话:session_01GTRjn8xBqp75dk7kFupVRt
    分支:claude/issue-3462-form-title-i18n
    Worktree:objectui-issue-3462
    文件面:packages/plugin-view/src/ObjectView.tsx(getFormTitle 及三个消费点)、packages/plugin-view 测试与 VIEW_DEFAULT_TRANSLATIONS 兜底表、packages/i18n/src/locales/*(十包,若查无既有键则新增三键;当前无在飞占用)、changeset。越界即停。

    PM 裁定(issue 留下的 key 判定点):先查十包是否已有 Create/Edit/View {{label}} 形状键,查无则新增 console.objectView.createTitle/editTitle/viewTitle(或与既有 console.objectView.* 家族一致的命名),⛔ 不复用按钮动词键 console.objectView.new(按钮动词与标题是两个语境,复用即埋下一次 #3459 型漂移)。en 取 Create {{label}} 等原拼写——英文输出逐字节不变,无 e2e 预检负担。


    Generated by Claude Code

  3. yinlianghui commented on Aug 6, 2026

    @yinlianghui
    ContributorAuthor

    验收:ACCEPT → PR #3468(并行批第 45 单,会话 session_01GTRjn8xBqp75dk7kFupVRt),blocking 检查绿(shards/Type Check 排队中,本地同范围已绿),已转 ready + auto-merge。

    复核要点,并公开背书 dev 对裁定的偏离:裁定第一句是「先查十包找现成键」——dev 查到了 form.createTitle/form.editTitle(十包全有,app-shell page 模式在用),复用该家族并只补第三个动词 form.viewTitle,拒绝另铸 console.objectView.*。这优于我的备选方案:抽屉/弹窗/浮层/page 是同一标题的四个承载面,另起家族必然分家漂移——正是本系列在治的病;console.* 命名空间错配的判断也对。⛔ 按钮动词键禁令严格遵守并有分离钉。{{object}} 占位符是复用既有家族的机械后果,parity 守卫要求一致,接受。de 语序承重断言(动词后置)设计出色——任何「翻动词再拼接」的退化在任何取值下都产不出该语序。反向验证 9 红 8 绿如预测。顺带发现 #3469(RecordFormPage 的 defaultValue 与包内动词不一致,当前不可达)finding 留池。


    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