发现于 #3807 的实施过程(围栏外,本 PR 未夹带)。未认领,交 PM triage。
机制
packages/app-shell/src/views/metadata-admin/previews/block-config.ts:310-321,record:details 的 sections 数组条目只给了三个 itemFields:
itemFields: [
{ name: 'label', label: 'Label', kind: 'text' },
{ name: 'columns', label: 'Columns', kind: 'number', placeholder: '2' },
{ name: 'fields', label: 'Fields', kind: 'field-list', objectFrom: 'page' },
],
缺的是 name。而 pin 版 @objectstack/spec@17.0.0-rc.5 的 RecordDetailsProps.sections[].name 的 describe 明确它是 i18n 锚点:Stable section identifier for i18n lookup (snake_case) — resolves objects.{object}._sections.{name}.label; a nameless section renders its authored label in every locale。渲染器实读也确实如此(packages/plugin-detail/src/renderers/record-details.tsx):
const translatedTitle = s.name && objectName
? sectionLabel(objectName, s.name, rawTitle ?? s.name)
: rawTitle;
sectionLabel 的键约定在 packages/i18n/src/useObjectLabel.ts:419({ns}.objects.{objectName}._sections.{sectionName}.label)。s.name 缺失时直接退回 authored label —— 于是在设计器里搭出来的每个 section,在所有 locale 下都显示同一串作者当时敲进去的文字,而且在 UI 里没有任何位置能补上锚点。
上游 spec 那段注释还写着:packages/lint 的 translation-section-name-missing 规则存在的目的就是提醒作者补 name。合起来就是:设计器产出的页面必然挂着一条作者在设计器里修不掉的诊断。
建议
给 itemFields 加 name(kind: 'text'),并顺带决定两件小事:
- 是否做 snake_case 校验 / 从
label 自动派生一次(派生要避免把已翻译的 label 变成锚点);
- 已存在的、只有
label 的 section 打开设计器时 name 留空还是回填。
同一设计面 #3807 已把发布给作者的 sections 说明改成对象形并写清 name 的语义,所以"作者知道要写 name、但设计器没有格子"这个落差从本单开始是可见的。
参考位置
关联:#3807、#3134(表单布局设计器的 i18n,邻域但另一个设计面)、objectstack#5611
发现于 #3807 的实施过程(围栏外,本 PR 未夹带)。未认领,交 PM triage。
机制
packages/app-shell/src/views/metadata-admin/previews/block-config.ts:310-321,record:details的sections数组条目只给了三个itemFields:缺的是
name。而 pin 版@objectstack/spec@17.0.0-rc.5的RecordDetailsProps.sections[].name的 describe 明确它是 i18n 锚点:Stable section identifier for i18n lookup (snake_case) — resolves objects.{object}._sections.{name}.label; a nameless section renders its authored label in every locale。渲染器实读也确实如此(packages/plugin-detail/src/renderers/record-details.tsx):sectionLabel的键约定在packages/i18n/src/useObjectLabel.ts:419({ns}.objects.{objectName}._sections.{sectionName}.label)。s.name缺失时直接退回 authored label —— 于是在设计器里搭出来的每个 section,在所有 locale 下都显示同一串作者当时敲进去的文字,而且在 UI 里没有任何位置能补上锚点。上游 spec 那段注释还写着:
packages/lint的translation-section-name-missing规则存在的目的就是提醒作者补name。合起来就是:设计器产出的页面必然挂着一条作者在设计器里修不掉的诊断。建议
给
itemFields加name(kind: 'text'),并顺带决定两件小事:label自动派生一次(派生要避免把已翻译的 label 变成锚点);label的 section 打开设计器时name留空还是回填。同一设计面 #3807 已把发布给作者的
sections说明改成对象形并写清name的语义,所以"作者知道要写 name、但设计器没有格子"这个落差从本单开始是可见的。参考位置
packages/app-shell/src/views/metadata-admin/previews/block-config.ts:310-321packages/plugin-detail/src/renderers/record-details.tsx——sectionLabel(objectName, s.name, ...)packages/i18n/src/useObjectLabel.ts:419—— 键约定packages/plugin-detail/src/index.tsx——record:details.sections的 input 说明(record:details的sectionsinput description 还在教已被 spec 退役的「Section IDs」形状,渲染器只认对象形 —— 照 manifest 写出来的 sections 一条都不渲染 #3807 后)关联:#3807、#3134(表单布局设计器的 i18n,邻域但另一个设计面)、objectstack#5611