发现于 #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 定级。
发现于 #3459 的实现过程(PR 待开),不在该 issue 的围栏内,单独立单。
缺陷
packages/plugin-view/src/ObjectView.tsx的getFormTitle()(main@a32c4374c 之前约 847 行)在 TypeScript 里拼英文:三个消费点,全是可见标题:
renderDrawerForm()DrawerTitlerenderModalForm()DialogTitleformLayout === 'popover'分支NavigationOverlay的titleprop第三个正是 #3426 描述的那类:宿主传了
title,NavigationOverlay的resolvedTitle = title || t('detail.recordDetail')默认值永不生效。#3459 只修了同文件里
mode: 'split'那一处${objectLabel} Detail,围栏没含getFormTitle—— 它是另一组字符串(动词 + 标签),不是同一个 key 家族。可达性:已核验,不是死默认
用与 #3457/#3459 相同的标准跑了真实交互(渲染块 → 点行 → 读标题),在 zh 会话下通过,即缺陷成立:
门槛比 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 还是新增:console.objectView.new已存在([i18n] 另外三个插件也自拼英文标题传给 NavigationOverlay 的 title prop(kanban / tree / plugin-view),#3426 的围栏没覆盖到 #3459 实现里useCreateVerb读的就是它),但那是按钮动词,不是「Create + 对象名」的标题;Create/Edit/View {{label}}形状的 key 需要先查,查不到再新增三个,并同步补进VIEW_DEFAULT_TRANSLATIONS([i18n] 另外三个插件也自拼英文标题传给 NavigationOverlay 的 title prop(kanban / tree / plugin-view),#3426 的围栏没覆盖到 #3459 已在该文件建好这张兜底表)。英文输出可否逐字节不变取决于选定的 key 拼写,派发时应作为裁定点写清。
相关
${objectLabel} Detail(split)未打
finding标签:这是用户今天就能看到的具体缺陷(zh/ja/de 会话的抽屉/弹窗标题),留给 PM 定级。