Skip to content

Commit 0005fec

Browse files
fix(spec,app-shell): zh-CN view panel reads Chinese on every row of its collapsed sections (#30356)
<!-- claude-projects-attribution: {"github_login":"os-support-ai"} --> _Requested by **Yibo Wang** · [project thread](https://claude.ai/code/project/chan_01BVUyyPie8gHwoPM18iABwB?thread=cmsg_01BVUyyPie8gHwoPM18iABwB5hMAwYpcBhDQ6HsKVez9s8)_ Fixes #30267 Clause-②: no Metadata-protocol: none ## 维护者速读 - 改了什么:中文控制台下,Studio 视图属性面板里「表格选项 / 分页 / 终端用户控制 / 导航与共享」四个折叠区块展开后的行名与说明全部变成中文(实测英文行 70 → 9,剩下 9 个是「允许的可视化」里的类型选项名 Grid / Kanban 等);英文控制台文字不变。 - 为什么改:这些区块的子项在 spec 表单里没有逐项声明,翻译提取器只认已声明的子项,所以它们从来没有翻译键,任何语言都显示英文;#30039 浏览器验收时发现。 - 风险与回滚:只改表单布局、提示文字与翻译目录,不动数据与接口;面板不再显示两个早已退役的键(导航 `view`、共享 `type`),已存的值保存时原样保留。回滚即还原本 PR。 - 先看:`packages/spec/src/ui/view.form.ts`(逐项声明子字段与提示)、`packages/platform-objects/src/apps/translations/zh-CN.metadata-forms.generated.ts`(中文译文)、`ui/packages/app-shell/src/views/metadata-admin/metadata-form-zh-cn.ts`(控制台中文副本)。 - 两分钟验证:`pnpm --dir ui exec vitest run packages/app-shell/src/views/metadata-admin/metadata-form-i18n.test.ts`,预期全部通过,其中 objectstack#30267 一组断言四个区块下每一行的名称与说明都含中文、英文对照组不含中文。 - 需要你做的:无,席位落地。 ## What changes `viewForm` declared `selection`, `pagination`, `userFilters`, `appearance`, `userActions`, `navigation` and `sharing` as `type: 'composite'` with no children. The panel (`SchemaForm`) then derives the child rows from the JSON Schema, and `os i18n extract` walks only DECLARED children, so none of those rows had a `metadataForms.view.fields['PARENT.CHILD']` key. A zh-CN Studio read 70 English rows across the four collapsed sections. - **`packages/spec/src/ui/view.form.ts`** spells out every live child of the seven composites (plus hints on `addRecord`'s two existing children), and gives the rows that had no hint one. Every declared hint is byte-equal to the schema `.describe()` text the panel already showed, so an English console reads the same text. `userFilters.fields` is enumerated as a `repeater` with `widget: 'grid'` and `required: true` on `field`, which keeps the inline table it rendered as before (the auto-detected master-detail table), now with translatable column heads. - **`packages/spec/src/ui/view.zod.ts`**: `UserFilterFieldSchema`'s six properties carry `.meta({ title })` (Field / Label / Type / Options / Show Count / Default Values, the strings the panel already printed). The repeater-title guard requires it for any enumerated repeater. - **Retired keys no longer offered**: the schema-derived list rendered the `navigation.view` and `sharing.type` tombstones as editable rows; the declared lists omit them, as `addRecord` already did for its two tombstones. A stored value is not dropped by a panel save: `CompositeField` writes `{ ...obj, [child]: v }` (`SchemaForm.tsx`, the composite `onChange`), so a key the form does not render is carried through unchanged, exactly as before. - **Catalogs** (`packages/platform-objects/src/apps/translations/*.metadata-forms.generated.ts`): regenerated with `node scripts/check-i18n-bundles.mjs --write`; every new leaf is translated in zh-CN, ja-JP and es-ES (the catalog-wide echo ledgers hold all three translated locales at zero en echoes). The provenance companions lose the rows of leaves that are now translated, as the regenerator writes them. - **Console overlay** (`ui/packages/app-shell/src/views/metadata-admin/metadata-form-zh-cn.ts`): copies the platform's zh-CN leaves for every new row, leaf for leaf. ## Tests - `packages/spec/src/ui/view-form-composite-children.test.ts` (new): each composite's declared children EQUAL the schema's live keys (tombstones excluded), so a key added to a block later cannot silently drop out of the panel; each declared hint equals its schema description; the repeater's row labels equal the item titles; no retired key is offered. - `packages/platform-objects/src/apps/translations/view-composite-children.test.ts` (new): population derived from the form; every declared child is a key in all four catalogs, the en leaf is the form's text, zh-CN never echoes en. - `ui/.../metadata-form-i18n.test.ts`: new objectstack#30267 group, every row label and hint under the four sections contains CJK in zh-CN, a sample per composite, the two retired rows gone, and an en control that reads the spec English with no CJK. - `object-lifecycle-panel-echo-decisions.test.ts`: positive-control count 701 → 731 (thirty new row labels, authored in all three locales). - `metadata-form-zod-reconciliation.test.ts`: three `omit` rows for `view` / `userFilters` (`tabs`, `showAllRecords`, `allowAddTab`). The walk resolves the block through the view union to the page-shaped `UserFiltersSchema`; the list arm the form lays out is `ObjectUserFiltersSchema`, which refuses those keys. Ablation (each through `scripts/ablation-replace.mjs`, mutation proven on disk, restored to HEAD): | Mutation | Pin that went red | |:--|:--| | delete the overlay row `'userActions.editInline'` | ui: "every row label and every hint under the four sections is Chinese", "a sample of each composite's children" (2 failed / 22) | | delete the `refresh` declaration from `userActions` | spec: "userActions: declares exactly the schema's live keys" (1 failed / 20) | | zh-CN `pagination.pageSize` label back to `Page Size` | platform-objects: "zh-CN carries its own text for every leaf" (1 failed / 7) | ## Acceptance notes - **Live, example CRM, zh-CN**, `/studio/com.example.crm/interfaces?surface=view:crm_lead.all`, four sections expanded, English lines counted per section: 表格选项 5 → 0, 分页 5 → 0, 终端用户控制 44 → 9, 导航与共享 16 → 0 (70 → 9). The 9 left are the `appearance.allowedVisualizations` option chips (Grid, Kanban, Gallery, Calendar, Timeline, Gantt, Map, Chart, Tree): enum values the widget prints raw. The metadata-forms catalog has no channel for a form field's option labels (the extractor emits `label` / `helpText` / `placeholder`), so they are reported, not fixed here. en-US after: the same English rows as before, minus the two tombstone rows; the `userFilters.fields` table still shows `Field* Label Type Options Show Count Default Values`. - File surface beyond the claim's list: `view.zod.ts` (six titles), the two ledger tests above, and the ja-JP / es-ES catalogs (required by the echo ledgers). - Out of scope, unchanged: the authored-label vs translated-rail mismatch noted in #30265. ## Verification <details><summary>Commands and readings (final head)</summary> Head `f5483a169f` (branch merged with `origin/main` c1240a3 first; `git merge-tree` against main 8c9f48f is clean). - Full build `npx turbo run build --filter='!@objectstack/docs'` under `os-verify-lock`: VERDICT command-exit 0 (13m50s). - `pnpm --filter @objectstack/spec test`: exit 0 (an earlier run on this branch failed only `metadata-form-zod-reconciliation` → fixed by the three ledger rows). - `pnpm --filter @objectstack/spec typecheck`: exit 0 · `pnpm --filter @objectstack/spec check:generated`: exit 0, all 14 artifacts up to date. - `pnpm --filter @objectstack/platform-objects test` / `typecheck`: exit 0 / exit 0. - `pnpm --dir ui exec vitest run packages/app-shell/src/views/metadata-admin/metadata-form-i18n.test.ts`: exit 0 (22 tests) · `pnpm --dir ui --filter @object-ui/app-shell type-check`: exit 0 · eslint on the touched ui and spec/platform-objects files: exit 0. - `node scripts/check-i18n-bundles.mjs`: all 11 bundle sets in sync · `check:i18n-stale-fill`: OK. - `dispatch-gates --ran`: 84 derived, 84 run, 0 NOT-MEASURED. `check-plugin-teardown-shape --self-test` first exited 3 (shallow clone could not read its pinned fixture commit); after `git fetch origin 621a487…` it exits 0. ```text node scripts/check-adr-0087-registration.mjs --base origin/main :: exit 0 node scripts/check-adr-0087-registration.mjs --self-test :: exit 0 node scripts/check-changeset-no-major.mjs --base origin/main :: exit 0 node scripts/check-closing-keyword-parity.mjs :: exit 0 node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0 node scripts/check-comment-mask-adoption.mjs :: exit 0 node scripts/check-comment-mask-adoption.mjs --self-test :: exit 0 node scripts/check-comment-mask-corpus.mjs :: exit 0 node scripts/check-dev-prereqs.mjs --self-test :: exit 0 node scripts/check-dts-emitted.mjs --self-test :: exit 0 node scripts/check-empty-changeset.mjs --base origin/main :: exit 0 node scripts/check-empty-changeset.mjs --self-test :: exit 0 node scripts/check-issue-citations.mjs :: exit 0 node scripts/check-plugin-teardown-shape.mjs :: exit 0 node scripts/check-plugin-teardown-shape.mjs --self-test :: exit 0 node scripts/check-sdui-manifest.mjs :: exit 0 node scripts/check-sdui-manifest.mjs --self-test :: exit 0 node scripts/ci/assert-turbo-remote-cache.mjs --self-test :: exit 0 node scripts/ci/plan-test-core-shards.mjs --self-test :: exit 0 node scripts/ci/prune-turbo-cache.mjs --self-test :: exit 0 node scripts/docs-audit/check-affected-docs.mjs :: exit 0 node scripts/docs-audit/check-drift-comment.mjs :: exit 0 node scripts/pm/release-rehearsal-clone.mjs --self-test :: exit 0 node scripts/release-pending-publish.mjs --self-test :: exit 0 pnpm --dir ui exec vitest run scripts/ :: exit 0 pnpm --filter @objectstack/lint run check:doc-formula-expressions :: exit 0 pnpm --filter @objectstack/spec run check:api-surface :: exit 0 pnpm --filter @objectstack/spec run check:authorable-surface :: exit 0 pnpm --filter @objectstack/spec run check:browser-reachable-entries :: exit 0 pnpm --filter @objectstack/spec run check:docs :: exit 0 pnpm --filter @objectstack/spec run check:dual-source-exports :: exit 0 pnpm --filter @objectstack/spec run check:duration-unit-keys :: exit 0 pnpm --filter @objectstack/spec run check:empty-state :: exit 0 pnpm --filter @objectstack/spec run check:entry-nameability :: exit 0 pnpm --filter @objectstack/spec run check:export-origins :: exit 0 pnpm --filter @objectstack/spec run check:exported-any :: exit 0 pnpm --filter @objectstack/spec run check:liveness :: exit 0 pnpm --filter @objectstack/spec run check:llms-txt :: exit 0 pnpm --filter @objectstack/spec run check:skill-refs :: exit 0 pnpm --filter @objectstack/spec run check:strictness-ledger :: exit 0 pnpm --filter @objectstack/spec run check:variant-docs :: exit 0 pnpm --filter @objectstack/spec run check:yaml-examples :: exit 0 pnpm check:changeset-gate-self-tests :: exit 0 pnpm check:ci-filter-parity :: exit 0 pnpm check:closed-ceremony-text :: exit 0 pnpm check:cross-package-test-inputs :: exit 0 pnpm check:dispatcher-error-vocabulary :: exit 0 pnpm check:doc-authoring :: exit 0 pnpm check:driver-memory-census :: exit 0 pnpm check:dts-closure :: exit 0 pnpm check:dual-build-cjs-loads :: exit 0 pnpm check:engine-double-contract :: exit 0 pnpm check:gitlink-declared :: exit 0 pnpm check:i18n :: exit 0 pnpm check:i18n-stale-fill :: exit 0 pnpm check:issue-citations :: exit 0 pnpm check:keyed-text-bounds :: exit 0 pnpm check:lean-entry-closure :: exit 0 pnpm check:logger-receiver-detach :: exit 0 pnpm check:merge-driver :: exit 0 pnpm check:nul-bytes :: exit 0 pnpm check:objectql-double-limit :: exit 0 pnpm check:org-identifier :: exit 0 pnpm check:page-declaration-shape :: exit 0 pnpm check:platform-object-tenancy-census :: exit 0 pnpm check:pm-prior-rulings :: exit 0 pnpm check:published-files :: exit 0 pnpm check:query-options-erasure :: exit 0 pnpm check:refd-timer-probe :: exit 0 pnpm check:registry-log-declared :: exit 0 pnpm check:rest-log-spy-declared :: exit 0 pnpm check:skill-identifier-liveness :: exit 0 pnpm check:slot-lookup :: exit 0 pnpm check:sourcemap-no-sources-content :: exit 0 pnpm check:spec-docblock-symbol-anchors :: exit 0 pnpm check:spec-parsed-alias :: exit 0 pnpm check:system-context-census :: exit 0 pnpm check:test-source-alias :: exit 0 pnpm check:tier-file-adoption :: exit 0 pnpm check:type-check-coverage :: exit 0 pnpm check:type-check-debt :: exit 0 pnpm check:undeclared-dep-imports :: exit 0 pnpm check:watch-hint-literal :: exit 0 pnpm check:where-matcher :: exit 0 ``` </details> --- 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01WGufzjGQVFPCizmQreyKkv --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent c580081 commit 0005fec

13 files changed

Lines changed: 1024 additions & 74 deletions
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
---
2+
'@objectstack/spec': patch
3+
'@objectstack/platform-objects': patch
4+
'@object-ui/app-shell': patch
5+
---
6+
7+
fix: on a zh-CN console every row of the view properties panel's collapsed sections (表格选项 / 分页 / 终端用户控制 / 导航与共享) reads in Chinese
8+
9+
Clause-②: no
10+
Metadata-protocol: none
11+
12+
- `viewForm` (`@objectstack/spec/ui`) now spells out the children of its `selection`, `pagination`, `userFilters`, `appearance`, `userActions`, `navigation` and `sharing` composites, and gives the rows that had none a hint. Each declared hint is the schema description the panel already showed, so an English console reads the same text; `os i18n extract` now emits a `metadataForms.view.fields['<parent>.<child>']` key per row.
13+
- `userFilters.fields` is enumerated as an inline-table repeater, and `UserFilterFieldSchema`'s six properties carry a `.meta({ title })` (Field / Label / Type / Options / Show Count / Default Values) — the English column heads, unchanged.
14+
- The panel no longer offers `navigation.view` and `sharing.type`: both are `retiredKey()` tombstones that the schema-derived child list used to render as editable rows. A stored value is untouched by a panel save (the composite editor spreads the block it was given).
15+
- The platform metadata-forms catalogs carry zh-CN, ja-JP and es-ES text for every new row, and the console's zh-CN overlay copies the zh-CN rows.

‎packages/platform-objects/src/apps/translations/en.metadata-forms.generated.ts‎

Lines changed: 135 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1154,19 +1154,36 @@ export const enMetadataForms: NonNullable<TranslationData['metadataForms']> = {
11541154
helpText: "Field names available for quick search"
11551155
},
11561156
resizable: {
1157-
label: "Resizable"
1157+
label: "Resizable",
1158+
helpText: "Enable column resizing"
11581159
},
11591160
compactToolbar: {
1160-
label: "Compact Toolbar"
1161+
label: "Compact Toolbar",
1162+
helpText: "Collapse Group/Color/Density/Hide-fields into a single View settings popover"
11611163
},
11621164
rowHeight: {
1163-
label: "Row Height"
1165+
label: "Row Height",
1166+
helpText: "Row height / density setting"
11641167
},
11651168
selection: {
1166-
label: "Selection"
1169+
label: "Selection",
1170+
helpText: "Row selection configuration"
1171+
},
1172+
"selection.type": {
1173+
label: "Type",
1174+
helpText: "Selection mode"
11671175
},
11681176
pagination: {
1169-
label: "Pagination"
1177+
label: "Pagination",
1178+
helpText: "Pagination configuration"
1179+
},
1180+
"pagination.pageSize": {
1181+
label: "Page Size",
1182+
helpText: "Number of records per page. On a view with no pager (kanban, gallery, timeline) it is the fetch ceiling, and the renderer owes two things: bound its fetch at this number, and, when the filtered set is larger than it, show a visible truncation signal saying what is on screen is not the whole set"
1183+
},
1184+
"pagination.pageSizeOptions": {
1185+
label: "Page Size Options",
1186+
helpText: "Available page size options"
11701187
},
11711188
kanban: {
11721189
label: "Kanban"
@@ -1190,31 +1207,138 @@ export const enMetadataForms: NonNullable<TranslationData['metadataForms']> = {
11901207
label: "User Filters",
11911208
helpText: "Quick-filter bar: element style (dropdown / tabs / toggle) + exposed fields or tab presets"
11921209
},
1210+
"userFilters.element": {
1211+
label: "Element",
1212+
helpText: "Filter control style on object views: \"dropdown\" (per-field value chips). \"toggle\" is deprecated. \"tabs\" is page-only — use `listViews` for named presets."
1213+
},
1214+
"userFilters.fields": {
1215+
label: "Fields",
1216+
helpText: "Fields exposed as quick filters (dropdown/toggle elements)"
1217+
},
1218+
"userFilters.fields.field": {
1219+
label: "Field"
1220+
},
1221+
"userFilters.fields.label": {
1222+
label: "Label"
1223+
},
1224+
"userFilters.fields.type": {
1225+
label: "Type"
1226+
},
1227+
"userFilters.fields.options": {
1228+
label: "Options"
1229+
},
1230+
"userFilters.fields.showCount": {
1231+
label: "Show Count"
1232+
},
1233+
"userFilters.fields.defaultValues": {
1234+
label: "Default Values"
1235+
},
11931236
appearance: {
11941237
label: "Appearance",
11951238
helpText: "allowedVisualizations: which renderers users may switch between"
11961239
},
1240+
"appearance.showDescription": {
1241+
label: "Show Description",
1242+
helpText: "Show the view description text"
1243+
},
1244+
"appearance.allowedVisualizations": {
1245+
label: "Allowed Visualizations",
1246+
helpText: "Whitelist of visualization types users can switch between (e.g. [\"grid\", \"gallery\", \"kanban\"])"
1247+
},
11971248
userActions: {
11981249
label: "User Actions",
11991250
helpText: "Toolbar toggles: sort / search / filter / row height"
12001251
},
1252+
"userActions.sort": {
1253+
label: "Sort",
1254+
helpText: "Allow users to sort records"
1255+
},
1256+
"userActions.search": {
1257+
label: "Search",
1258+
helpText: "Allow users to search records"
1259+
},
1260+
"userActions.filter": {
1261+
label: "Filter",
1262+
helpText: "Allow users to filter records"
1263+
},
1264+
"userActions.refresh": {
1265+
label: "Refresh",
1266+
helpText: "Allow users to reload the view data from the backend without a full page reload"
1267+
},
1268+
"userActions.rowHeight": {
1269+
label: "Row Height",
1270+
helpText: "Allow users to toggle row height/density"
1271+
},
1272+
"userActions.group": {
1273+
label: "Group",
1274+
helpText: "Allow users to change record grouping from the toolbar. Toggle only — the grouping itself is configured in the view-level `grouping` block."
1275+
},
1276+
"userActions.addRecordForm": {
1277+
label: "Add Record Form",
1278+
helpText: "Add records through a form instead of inline"
1279+
},
1280+
"userActions.editInline": {
1281+
label: "Edit Inline",
1282+
helpText: "Allow users to edit records inline. On by default: a user who may update the object edits a cell in place with the field's type-aware widget (the same control the form uses), under the permission gate that already decides whether the object is editable at all. Declare `editInline: false` to make the list read-only in place."
1283+
},
1284+
"userActions.hideFields": {
1285+
label: "Hide Fields",
1286+
helpText: "Allow users to hide/show fields from the toolbar (the affordance behind the view-level `hiddenFields` list). Boolean toggle — distinct from the record-details component's `hideFields`, which is an array of field names to omit. On by default: a reader hides and shows columns for themselves; declare `hideFields: false` to withhold the control."
1287+
},
1288+
"userActions.rowColor": {
1289+
label: "Row Color",
1290+
helpText: "Allow users to configure row colouring from the toolbar. Boolean toggle — the colour rules themselves live in the view-level `rowColor` block. Off by default: row colouring is opt-in."
1291+
},
1292+
"userActions.buttons": {
1293+
label: "Buttons",
1294+
helpText: "Custom action button IDs to show in the toolbar"
1295+
},
12011296
addRecord: {
1202-
label: "Add Record"
1297+
label: "Add Record",
1298+
helpText: "Add record entry point configuration"
12031299
},
12041300
"addRecord.enabled": {
1205-
label: "Enabled"
1301+
label: "Enabled",
1302+
helpText: "Show the add record entry point — REQUIRED: `true` draws the Add button, `false` declares it off"
12061303
},
12071304
"addRecord.position": {
1208-
label: "Position"
1305+
label: "Position",
1306+
helpText: "Position of the add record button: `top` (the toolbar, the default), `bottom` (under the list) or `both`"
12091307
},
12101308
showRecordCount: {
1211-
label: "Show Record Count"
1309+
label: "Show Record Count",
1310+
helpText: "Show record count at the bottom of the list"
12121311
},
12131312
navigation: {
1214-
label: "Navigation"
1313+
label: "Navigation",
1314+
helpText: "Configuration for item click navigation (drawer by default, page, new_window or none)"
1315+
},
1316+
"navigation.mode": {
1317+
label: "Mode"
1318+
},
1319+
"navigation.preventNavigation": {
1320+
label: "Prevent Navigation",
1321+
helpText: "Disable standard navigation entirely"
1322+
},
1323+
"navigation.openNewTab": {
1324+
label: "Open New Tab",
1325+
helpText: "Force open in new tab (applies to page mode)"
1326+
},
1327+
"navigation.size": {
1328+
label: "Size",
1329+
helpText: "Overlay size bucket for the drawer detail: 'auto' (default — renderer derives from field count + viewport; AI writes nothing) or a coarse override sm/md/lg/xl/full. Prefer this over the pixel `width`; page mode ignores it."
1330+
},
1331+
"navigation.width": {
1332+
label: "Width",
1333+
helpText: "[DEPRECATED → size] Pixel/percent width of the drawer (e.g. \"600px\"). A pixel width cannot be chosen at authoring time without knowing the client viewport — use the `size` bucket."
12151334
},
12161335
sharing: {
1217-
label: "Sharing"
1336+
label: "Sharing",
1337+
helpText: "View sharing configuration: who locked the view configuration"
1338+
},
1339+
"sharing.lockedBy": {
1340+
label: "Locked By",
1341+
helpText: "User who locked the view configuration"
12181342
}
12191343
}
12201344
},

‎packages/platform-objects/src/apps/translations/es-ES.metadata-forms.generated.ts‎

Lines changed: 135 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1154,19 +1154,36 @@ export const esESMetadataForms: NonNullable<TranslationData['metadataForms']> =
11541154
helpText: "Nombres de campo disponibles para búsqueda rápida"
11551155
},
11561156
resizable: {
1157-
label: "Redimensionable"
1157+
label: "Redimensionable",
1158+
helpText: "Permite cambiar el ancho de las columnas"
11581159
},
11591160
compactToolbar: {
1160-
label: "Barra compacta"
1161+
label: "Barra compacta",
1162+
helpText: "Agrupa Grupo / Color / Densidad / Ocultar campos en un único menú emergente de «Configuración de la vista»"
11611163
},
11621164
rowHeight: {
1163-
label: "Altura de fila"
1165+
label: "Altura de fila",
1166+
helpText: "Ajuste de altura / densidad de las filas"
11641167
},
11651168
selection: {
1166-
label: "Selección"
1169+
label: "Selección",
1170+
helpText: "Configuración de la selección de filas"
1171+
},
1172+
"selection.type": {
1173+
label: "Tipo de selección",
1174+
helpText: "Modo de selección"
11671175
},
11681176
pagination: {
1169-
label: "Paginación"
1177+
label: "Paginación",
1178+
helpText: "Configuración de la paginación"
1179+
},
1180+
"pagination.pageSize": {
1181+
label: "Tamaño de página",
1182+
helpText: "Número de registros por página. En una vista sin paginador (kanban, galería, línea de tiempo) es el límite de carga, y el renderizador debe hacer dos cosas: limitar la carga a este número y, cuando el conjunto filtrado sea mayor, mostrar un aviso visible de truncamiento que indique que lo que hay en pantalla no es el conjunto completo"
1183+
},
1184+
"pagination.pageSizeOptions": {
1185+
label: "Opciones de tamaño de página",
1186+
helpText: "Tamaños de página disponibles"
11701187
},
11711188
kanban: {
11721189
label: "Configuración Kanban"
@@ -1190,31 +1207,138 @@ export const esESMetadataForms: NonNullable<TranslationData['metadataForms']> =
11901207
label: "Filtros de usuario",
11911208
helpText: "Barra de filtros rápidos: estilo de elemento (dropdown / tabs / toggle) + campos expuestos o preajustes de pestañas"
11921209
},
1210+
"userFilters.element": {
1211+
label: "Estilo del control",
1212+
helpText: "Estilo del control de filtro en vistas de objeto: \"dropdown\" (chips de valores por campo). \"toggle\" está obsoleto. \"tabs\" es solo para páginas: usa `listViews` para los preajustes con nombre."
1213+
},
1214+
"userFilters.fields": {
1215+
label: "Campos de filtro",
1216+
helpText: "Campos expuestos como filtros rápidos (controles dropdown / toggle)"
1217+
},
1218+
"userFilters.fields.field": {
1219+
label: "Campo"
1220+
},
1221+
"userFilters.fields.label": {
1222+
label: "Etiqueta"
1223+
},
1224+
"userFilters.fields.type": {
1225+
label: "Tipo"
1226+
},
1227+
"userFilters.fields.options": {
1228+
label: "Opciones"
1229+
},
1230+
"userFilters.fields.showCount": {
1231+
label: "Mostrar recuento"
1232+
},
1233+
"userFilters.fields.defaultValues": {
1234+
label: "Valores predeterminados"
1235+
},
11931236
appearance: {
11941237
label: "Apariencia",
11951238
helpText: "allowedVisualizations: qué renderizadores pueden alternar los usuarios"
11961239
},
1240+
"appearance.showDescription": {
1241+
label: "Mostrar descripción",
1242+
helpText: "Muestra el texto de descripción de la vista"
1243+
},
1244+
"appearance.allowedVisualizations": {
1245+
label: "Visualizaciones permitidas",
1246+
helpText: "Lista de tipos de visualización entre los que los usuarios pueden cambiar (p. ej. [\"grid\", \"gallery\", \"kanban\"])"
1247+
},
11971248
userActions: {
11981249
label: "Acciones de usuario",
11991250
helpText: "Conmutadores de la barra de herramientas: ordenar / buscar / filtrar / altura de fila"
12001251
},
1252+
"userActions.sort": {
1253+
label: "Ordenar",
1254+
helpText: "Permite a los usuarios ordenar los registros"
1255+
},
1256+
"userActions.search": {
1257+
label: "Buscar",
1258+
helpText: "Permite a los usuarios buscar registros"
1259+
},
1260+
"userActions.filter": {
1261+
label: "Filtrar",
1262+
helpText: "Permite a los usuarios filtrar los registros"
1263+
},
1264+
"userActions.refresh": {
1265+
label: "Actualizar",
1266+
helpText: "Permite a los usuarios volver a cargar los datos de la vista desde el servidor sin recargar toda la página"
1267+
},
1268+
"userActions.rowHeight": {
1269+
label: "Altura de fila",
1270+
helpText: "Permite a los usuarios cambiar la altura / densidad de las filas"
1271+
},
1272+
"userActions.group": {
1273+
label: "Agrupar",
1274+
helpText: "Permite a los usuarios cambiar la agrupación de registros desde la barra de herramientas. Solo es un interruptor: la agrupación en sí se configura en el bloque `grouping` de la vista."
1275+
},
1276+
"userActions.addRecordForm": {
1277+
label: "Agregar registro con formulario",
1278+
helpText: "Agrega registros mediante un formulario en lugar de en línea"
1279+
},
1280+
"userActions.editInline": {
1281+
label: "Edición en línea",
1282+
helpText: "Permite a los usuarios editar registros en línea. Activado por defecto: un usuario que puede actualizar el objeto edita una celda en su sitio con el control adecuado al tipo del campo (el mismo que usa el formulario), bajo la misma comprobación de permisos que ya decide si el objeto es editable. Declara `editInline: false` para que la lista sea de solo lectura en su sitio."
1283+
},
1284+
"userActions.hideFields": {
1285+
label: "Ocultar campos",
1286+
helpText: "Permite a los usuarios ocultar / mostrar campos desde la barra de herramientas (la función detrás de la lista `hiddenFields` de la vista). Interruptor booleano, distinto del `hideFields` del componente de detalles del registro, que es un array de nombres de campo que se omiten. Activado por defecto: cada lector oculta y muestra columnas para sí mismo; declara `hideFields: false` para retirar el control."
1287+
},
1288+
"userActions.rowColor": {
1289+
label: "Color de fila",
1290+
helpText: "Permite a los usuarios configurar el coloreado de filas desde la barra de herramientas. Interruptor booleano: las reglas de color están en el bloque `rowColor` de la vista. Desactivado por defecto: el coloreado de filas es opcional."
1291+
},
1292+
"userActions.buttons": {
1293+
label: "Botones",
1294+
helpText: "ID de los botones de acción personalizados que se muestran en la barra de herramientas"
1295+
},
12011296
addRecord: {
1202-
label: "Agregar registro"
1297+
label: "Agregar registro",
1298+
helpText: "Configuración del punto de entrada para agregar registros"
12031299
},
12041300
"addRecord.enabled": {
1205-
label: "Habilitado"
1301+
label: "Habilitado",
1302+
helpText: "Muestra el punto de entrada para agregar registros. OBLIGATORIO: `true` dibuja el botón Agregar y `false` lo declara desactivado"
12061303
},
12071304
"addRecord.position": {
1208-
label: "Posición"
1305+
label: "Posición",
1306+
helpText: "Posición del botón para agregar registros: `top` (la barra de herramientas, por defecto), `bottom` (debajo de la lista) o `both`"
12091307
},
12101308
showRecordCount: {
1211-
label: "Mostrar recuento de registros"
1309+
label: "Mostrar recuento de registros",
1310+
helpText: "Muestra el recuento de registros al pie de la lista"
12121311
},
12131312
navigation: {
1214-
label: "Navegación"
1313+
label: "Navegación",
1314+
helpText: "Configuración de la navegación al hacer clic en un elemento (panel lateral por defecto; también page, new_window o none)"
1315+
},
1316+
"navigation.mode": {
1317+
label: "Modo"
1318+
},
1319+
"navigation.preventNavigation": {
1320+
label: "Impedir navegación",
1321+
helpText: "Desactiva por completo la navegación estándar"
1322+
},
1323+
"navigation.openNewTab": {
1324+
label: "Abrir en pestaña nueva",
1325+
helpText: "Fuerza la apertura en una pestaña nueva (se aplica al modo page)"
1326+
},
1327+
"navigation.size": {
1328+
label: "Tamaño",
1329+
helpText: "Categoría de tamaño del panel de detalle: 'auto' (por defecto: el renderizador lo deriva del número de campos y del área visible; la IA no escribe nada) o un ajuste aproximado sm/md/lg/xl/full. Prefiérelo al `width` en píxeles; el modo page lo ignora."
1330+
},
1331+
"navigation.width": {
1332+
label: "Ancho",
1333+
helpText: "[OBSOLETO → size] Ancho en píxeles / porcentaje del panel lateral (p. ej. \"600px\"). Al crear la vista no se conoce el área visible del cliente, así que no se puede elegir un ancho en píxeles: usa la categoría `size`."
12151334
},
12161335
sharing: {
1217-
label: "Compartición"
1336+
label: "Compartición",
1337+
helpText: "Configuración de uso compartido de la vista: quién bloqueó su configuración"
1338+
},
1339+
"sharing.lockedBy": {
1340+
label: "Bloqueado por",
1341+
helpText: "Usuario que bloqueó la configuración de la vista"
12181342
}
12191343
}
12201344
},

0 commit comments

Comments
 (0)