Skip to content

Commit 9529989

Browse files
huangyiireneclaude
andauthored
fix(platform-objects): decide the page Interface panel en-echoes per leaf, and derive the panel pin (#19428)
Part of #19403 Clause-②: no ## What this is Round 2 of this card. One panel family, decided **leaf by leaf**. The card's deliverable is a per-leaf judgement with its reason recorded, not 30 translations; every leaf below was decided on its own evidence, and the verdicts with their reasons live in a ledger the suite reads (`page-interface-panel-echo-decisions.test.ts`), not only in this body. **The family: the `page` Interface panel** — `page.fields['interfaceConfig*']` plus the `page.sections.interface` heading it sits under. This is where a list page is authored: which object it reads, which columns it shows, how end users filter it, what the toolbar offers. It is the largest family the round-1 table left (15 of the 65 keys). Not `Fixes` — this is one family of the card's population, and the card outlives this round. **Seven families remain** (50 label keys), tabled at the foot of this body. ## The reading, re-taken on this base — the numbers are NOT inherited Census instrument: flatten every `*.metadata-forms.generated.ts` bundle and compare `.label` leaves against the `en` bundle. Population fixed here: the `.label` leaves of the metadata-form catalogs (the card's population, 538 leaves), **plus the sibling `helpText` leaf of every key this round decides, plus the `description` leaf of the section** — a panel whose field name is Chinese and whose tooltip is English is the same defect half fixed. Measured on worktree base `576d5df66`: | reading | result | |:--|:--| | `en` string leaves in the metadata-form catalogs | 893 | | of which `.label` leaves | 538 | | POSITIVE CONTROL — labels genuinely translated | **473** (`zh-CN`) · **457** (`ja-JP`) · **457** (`es-ES`) | | labels echoing the `en` source, per locale | 65 · 81 · 81 | | label keys echoing in ALL THREE locales | **65** ⇒ 195 leaves | The control is what makes the echo count mean something: 473 translated against 65 echoing is a discrimination, not a parser that matches everything. **This is 65 / 195, the same reading round 1's LANDED comment recorded on the trunk** — this round inherited no drift, and that is itself a measurement rather than an assumption: four commits landed on `origin/main` between my base and this push (`50bfe137c`, `7ffddfa49`, `f9e16d856`, `488f4f546`) and `git diff 576d5df..origin/main -- packages/platform-objects/src/apps/translations/` is **empty**. The card's own banner exists because a sibling PR moved this population under a previous round; it did not happen here, and the way to know is to look. **After this change**: 50 keys / 150 leaves echo in all three locales; control **488** · **472** · **472** — echoes down 15 and the control up 15, same population, same run. ## The verdicts — 15 keys × 2 string leaves × 3 locales = 90 decisions Every one is `translate`, and **not one of them is "translate because it is English"**. The echo direction was tested per leaf by asking what this catalog's own authored corpus answers for that term. - **The authored twin.** `interfaceConfig` inlines the view's own surface onto the page — the form's own helpText says "The page IS the view" — and `view.fields.<same key>` is authored in all three locales for most of the family: `columns` (列 / 列 / Columnas), `sort` (排序 / 並び替え / Orden), `appearance` (外观 / 外観 / Apariencia), `userFilters` (用户筛选器 / ユーザーフィルター / Filtros de usuario), `userActions` (用户操作 / ユーザーアクション / Acciones de usuario), `addRecord` (添加记录 / レコードを追加 / Agregar registro), `showRecordCount` (显示记录数 / レコード数を表示 / Mostrar recuento de registros). A translator who judged the English right here would have had to judge it wrong one panel away. - **Decided AGAINST both of its same-string precedents** — `interfaceConfig.source.label`. This catalog answers the bare word `Source` twice, in opposite directions: `hook.fields.body.source` is 源码 / ソース / Código fuente (source CODE) and `sys_metadata.fields.source` is 来源 / ソース / Origen (provenance). This leaf is neither — its own helpText says "Object this page reads from". So `zh-CN` and `es-ES` depart from **both** (数据来源 / Origen de datos) while `ja-JP` keeps ソース, the word both precedents already use and the one that carries the data-source sense unambiguously in Japanese. Per locale, not per string. - **Decided AGAINST a same-string precedent, the other way** — `interfaceConfig.userFilters.helpText`. `view.fields.userFilters.helpText` translates its `dropdown / tabs / toggle` (下拉 / 标签页 / 开关), but those are the stored `element` VALUES. The `None / Tabs / Dropdown` here are the visible option labels of the `filter-mode` widget, which objectui renders and this catalog holds no key for — translating them would assert a rendering this package cannot deliver. Kept **English**, the way this same panel's authored `page.fields.type.helpText` keeps the quoted option labels "List / Interface". (The precedent it departs from turns out to be a defect in its own right — see Acceptance notes.) - **Machine tokens and product terms kept English inside translated prose** — the five literal key names in `interfaceConfig.helpText` (`source`, `columns`, `filterBy`, `appearance.allowedVisualizations`, `userActions`), on the authored precedent of `view.fields.appearance.helpText`, which keeps `allowedVisualizations` verbatim in all three locales; the renderer tokens `Grid / Kanban / Calendar / …`, on this same panel's authored `page.fields.type.helpText`, which keeps `grid / kanban / calendar / …`; and `Interface` and `Airtable`, on `page.fields.type.helpText` and `view.sections.end_user_controls.description` respectively. - **A distinction the source draws, preserved** — `interfaceConfig.levels.helpText` says "tree-like sources". `object.fields.fields.reference.helpText` is authored on both sides of that line in all three locales: it keeps the machine token (`tree 字段` / `tree フィールド` / `un campo tree`) and translates the shape in the same sentence (树 / ツリー / árbol). This one is the shape, so it is translated. - **Panel-internal control** for the prose leaves: each carried an entry in this package's per-locale `source-hashes.generated.ts` provenance table in all three locales, while all 43 authored neighbours on the same `page` panel carried none in any of them — which is what an unauthored extractor fill looks like here. Per-leaf reasons for all 30 leaves are in the ledger; this list is the summary, not the record. ## The instrument, extended not reinvented `page-interface-panel-echo-decisions.test.ts` is the #19355 shape as round 1 left it: one row per leaf, verdict per locale, reason, and the `en` source pinned EQUAL to the live bundle so rewording the English reds the row instead of leaving a decision standing over text nobody judged. Both of round 1's deliberate additions are carried over: 1. **The echo-reason rule is a predicate with a dark control.** Every verdict here is `translate`, so asserting the rule over the ledger alone evaluates nothing — the suite feeds it a synthetic `echo` row, asserts it is refused, then asserts it is accepted once a departure reason is added. 2. **The panel population is DERIVED from the `en` catalog**, not hand-listed, so the pin cannot drift into a maintained list. Three things this panel let the instrument gain that the earlier rounds could not: - **An authored control INSIDE the family.** `interfaceConfig.sort` is `type: 'repeater'`, so its two row properties (`interfaceConfig.sort.field` / `.order`) are the one slice of this panel that `repeater-row-properties.test.ts` already derives — and they are the **only two** leaves under `interfaceConfig` that were already translated (字段 / 排序方向, フィールド / 並び方向, Campo / Dirección). Everything the existing pin could see was fine; everything it could not see was an echo. That is the card's 「0 of the keys sit inside it」 measured on this panel, with the covered slice as its own control, and the suite asserts both halves. - **A SECOND, independent witness: the provenance table.** The ledger now also asserts that no decided leaf is still recorded as an extractor fill in any of the three `source-hashes.generated.ts` companions. It fires on a different trigger than the catalog assertion (a re-fill followed by an extract, rather than the re-fill itself) and it is per-locale, so it is not blind in the case `check:i18n-stale-fill`'s cross-locale witness is blind. It carries its own dark control: the lookup is proved to find a key the table does hold, matched by pattern rather than pinned to a family, so a later round of this card cannot red it by fixing one. - **The population covers the section heading too.** `page.sections.interface` is a `.label` + `.description` pair that no `.label`-only census counts in full; the derived walk takes both. ## Regeneration — the silent-loss hazard on this path Translated-locale values are hand-written; the provenance tables are not. Regenerated with **`pnpm i18n:extract`** (the command this package's extract config documents), never by hand, and **no key was added or removed** — so the `merge=os-regen` gap on `*.metadata-forms.generated.ts` (`git check-attr merge` reads `unspecified` on these paths) has nothing to lose even in principle. Measured rather than asserted: the bundle diff is **30 insertions / 30 deletions** in each of the three translated bundles — a pure value replacement — and the key lines of all four bundles are byte-identical lists before and after (1465 in each, same order). The extract's own diff is **0 insertions / 30 deletions** per provenance table: the 30 rows per locale that now record these leaves as authored. The `en` bundle and all four `*.objects.generated.ts` bundles are untouched. `pnpm check:i18n` green is the proof that the hand-written values are byte-identical to what a fresh extract writes, across all nine bundle sets. ## Reverse verification — the new pin can fail, in three independent places Committed first, then ablated through `scripts/ablation-replace.mjs` (anchor must hit; on-disk counts and blob hashes are the tool's own verdict). No rebuild is needed for these: the ledger imports the bundles by relative path inside its own package, so nothing here resolves through a package `exports` to `dist/` — this package's one vitest alias is for `@objectstack/lint` and touches none of it. **Ablation A — one decided leaf reverted to its English source in `zh-CN`:** - anchor `label: "数据来源",` x1 → x0 · replacement `label: "Source",` x2 → x3 · blob `71cc7c4c47c0` → `8a8147b989ed` - suite under the mutation: **2 failed | 16 passed** — the enumerated verdict (`zh-CN page.fields.interfaceConfig.source.label reads its en source again`) AND the derived panel pin, independently - restored: blob back to `71cc7c4c47c0` == HEAD, `git diff HEAD` empty **Ablation B — one provenance row re-added for a decided leaf** (a row swapped in `zh-CN.source-hashes.generated.ts`, so the table claims the leaf is still a byte copy of its source): - anchor x1 → x0 · replacement x0 → x1 · blob `4746249617fb` → `5a5f08eea895` - suite under the mutation: **1 failed | 17 passed** — and it is a **different** assertion than A's two (`zh-CN: no decided leaf is still recorded as an extractor fill`), so the second witness is not a restatement of the first - restored: blob back to `4746249617fb` == HEAD, `git diff HEAD` empty Suite restored and re-run: **18 passed**, working tree clean. ## Verification - `pnpm --filter @objectstack/platform-objects test` — 45 files, **628 passed** (610 before; +18 from the new ledger) - `pnpm --filter @objectstack/platform-objects typecheck` — green; its `tsconfig.test.json` program reaches the new file (`--listFiles` names it) and it contributes no errors - `pnpm check:i18n` — **green**, 9 packages in sync. Its first run exited **3** (PREREQUISITE NOT MET), which is not a reading; cleared by building the closure the gate itself names, then re-run green - `pnpm lint` — repo-wide, `eslint . --no-inline-config`, **exit 0**, at `9adb9f774` (the head of this branch; no commit has landed since that run) - Gate families derived with `scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack` and reconciled with `--ran` carrying every exit code: **60 derived · 59 run green · 0 unrun · 1 NOT MEASURED** — `pnpm check:dual-build-cjs-loads` exits 3 (PREREQUISITE NOT MET: it reads built output for every package in the repo). That prerequisite is a whole-repo build, which is CI's `Build Core`, and this diff adds no package and changes no export. ## Changeset, measured `@objectstack/platform-objects` declares no `private` and ships `files: ["dist", …]`, and `src/metadata-translations/index.ts` imports all three translated bundles. Probed on the built output: three new leaves (`Origen de datos`, and 数据来源 / 階層レベル in their esbuild-escaped form) are present in `dist/metadata-translations/index.js`, `dist/index.js` and `dist/plugin.js`, with three pre-existing translated leaves as positive controls and two negative controls (an invented string, and the raw un-escaped CJK). ⇒ the diff publishes, `skip-changeset` would be wrong, and a **`patch`** changeset is included. One line for whoever probes this dist next, refining the lesson round 1 recorded. Round 1 wrote that "tsup emits non-ASCII as `\uXXXX` escapes", which is right but not enough to write a working probe: esbuild emits **upper-case** hex, and uses `\xNN` for U+0080–U+00FF. My first probe spelled the escape in lower case and came back **0 hits including its own positive control** — the same failure round 1 warned about, caught the same way. The raw-CJK negative control above is in the probe precisely so the next reader can see that the zero means "escaped", not "absent". ## The seven families that remain (50 label keys, all-three-locale echoes, this base) | family | keys | |:--|--:| | `dataset.fields.*` + `dataset.sections.*` + `dataset.label` | 12 | | `object.fields.enable.*` (+ `validations`) — the object capabilities panel | 9 | | `field.fields.*` — the standalone field panel (several keys have a precedent from round 1) | 9 | | `action.fields.body.*` + `action.fields.ai` | 6 | | metadata-type display names with no panel: `seed` · `mapping` · `api` · `doc` · `book` · `capability` | 6 | | `hook.fields.retryPolicy.*` + `hook.fields.body.memoryMb` + `hook.fields.timeoutMs` | 5 | | `report.fields.drilldown` + `report.fields.runtimeFilter` + `report.sections.dataset_binding` | 3 | The `page` type is now absent from the echo census **and** from the `metadataForms.page.*` half of all three provenance tables — 0 rows remain there, where 30 per locale stood on this base. ## Acceptance notes To file (class (c), a metadata-authoring trap — dedupe words: `helpText translates enum values` · `userFilters element dropdown tabs toggle` · `translated locale names illegal value` · `metadata form tooltip enum spelling` · `strict enum rejects translated token`): - `view.fields.userFilters.helpText` names the legal values of `UserFiltersSchema.element` — a `z.enum(['dropdown', 'tabs', 'toggle'])` inside a `strictObject` — and all three translated locales render those three tokens as words: 控件样式(下拉 / 标签页 / 开关), 要素スタイル(ドロップダウン / タブ / トグル), estilo de elemento (desplegable / pestañas / interruptor). An author working in one of those locales is told the element styles are 下拉 / ドロップダウン / desplegable; writing that is refused by the enum, and the tooltip is the only place the panel names them. This is the inverse of this card's defect and it is what made this round keep `None / Tabs / Dropdown` English. Seam: `spec:UserFiltersSchema.element` → renderer: objectui `plugin-list/src/UserFilters.tsx`. Not fixed here: the bounded-fix exemption needs the finding to be the same defect class as the card, and this is the opposite one. Noted, not filed: - `repeater-row-properties.test.ts` filters on `spec.type === 'repeater'`. Round 1 measured the `record` blind spot; this round measures the `composite` one: `page.fields.interfaceConfig` is declared `{ field: 'interfaceConfig', type: 'composite' }` with 15 children, and that derivation therefore yielded exactly the two `interfaceConfig.sort.*` row properties and none of the 30 leaves decided here. Closed for THIS panel by the derived pin this PR adds; the same blind spot remains for any other `composite` or `record` child. Successor: the remaining-family rounds, each of which will meet it. - `report.sections.*` (label and description) — the population the card records as having no home. Still uncounted by any `.label` census and unseen by any pin. Successor: the `report` family row above, if the seat dispatches it. Note the same shape now has one fewer instance: `page.sections.interface` was exactly such a pair and is decided here, so the class is reachable, not structural. - `page.fields.interfaceConfig.appearance.helpText` writes the renderer tokens capitalised (`Grid / Kanban / Calendar`) while `page.fields.type.helpText` on the same panel writes them lower-case (`grid / kanban / calendar`) and `VisualizationTypeSchema`'s values are lower-case. Checked because a capitalisation split looked like the same trap as the finding above: it is softer — the sentence reads as display names of the renderers rather than as the literal whitelist entries, and the neighbouring helpText spells the values correctly one row up. Recorded as a boundary of that class, not a second instance. Successor: none. - The eight bundle sets other than this one still do not opt into the provenance table (`--source-hashes`), so their generated leaves stay legacy-trusted and no per-leaf control like this round's exists for them. Documented in the extract config as deliberate; not this card's. 承接者:无. --- _Generated by [Claude Code](https://claude.ai/code/session_01NcPSwnmJHczmTu6FG7NMjE)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent c27e160 commit 9529989

8 files changed

Lines changed: 778 additions & 180 deletions
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
---
2+
'@objectstack/platform-objects': patch
3+
---
4+
5+
Decide the `page` Interface panel's en-echoes per leaf and render the decided ones in `zh-CN` / `ja-JP` / `es-ES`
6+
7+
`page.fields['interfaceConfig*']` and the `page.sections.interface` heading shipped their English source byte-for-byte in all three translated metadata-form catalogs — 15 keys, 30 string leaves, the panel every list page is authored on. Each leaf was judged on its own evidence rather than translated wholesale: the `view` panel is the authored twin for most of them, `Interface`, `Airtable`, the `interfaceConfig` key names, the `Grid / Kanban / Calendar` renderer tokens and the `filter-mode` option labels stay English, and `interfaceConfig.source` departs from both of this catalog's same-string precedents because it names the page's data binding rather than source code or provenance.
8+
9+
The verdicts and their reasons are pinned in `page-interface-panel-echo-decisions.test.ts`, whose population is derived from the `en` catalog, so a re-fill or a key added to the panel is red on the day it lands.

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

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -781,8 +781,8 @@ export const esESMetadataForms: NonNullable<TranslationData['metadataForms']> =
781781
description: "Regiones de página y componentes colocados en ellas."
782782
},
783783
interface: {
784-
label: "Interface (list pages)",
785-
description: "Interface mode (Airtable parity): the page defines its own data surface directly — columns, filters, visualizations and toolbar — no inheriting from a separate view."
784+
label: "Interface (páginas de lista)",
785+
description: "Modo Interface (paridad con Airtable): la página define directamente su propia superficie de datos — columnas, filtros, visualizaciones y barra de herramientas — sin heredar de una vista aparte."
786786
},
787787
advanced: {
788788
label: "Avanzado",
@@ -852,24 +852,24 @@ export const esESMetadataForms: NonNullable<TranslationData['metadataForms']> =
852852
label: "Componentes"
853853
},
854854
interfaceConfig: {
855-
label: "Interface Config",
856-
helpText: "The page IS the view: source picks the object, columns/filterBy are defined directly here; appearance.allowedVisualizations whitelists renderers (one entry = locked); userActions toggles the toolbar."
855+
label: "Configuración de Interface",
856+
helpText: "La página ES la vista: source elige el objeto, columns/filterBy se definen directamente aquí; appearance.allowedVisualizations restringe los renderizadores (una sola entrada = bloqueado); userActions conmuta la barra de herramientas."
857857
},
858858
"interfaceConfig.source": {
859-
label: "Source",
860-
helpText: "Object this page reads from"
859+
label: "Origen de datos",
860+
helpText: "Objeto del que lee esta página"
861861
},
862862
"interfaceConfig.columns": {
863-
label: "Columns",
864-
helpText: "Columns to show — defined directly on the page (blank = all object fields)"
863+
label: "Columnas",
864+
helpText: "Columnas que mostrar — definidas directamente en la página (en blanco = todos los campos del objeto)"
865865
},
866866
"interfaceConfig.filterBy": {
867-
label: "Filter By",
868-
helpText: "Always-on base filter for the page — same visual builder as the list toolbar."
867+
label: "Filtrar por",
868+
helpText: "Filtro base siempre activo para la página — el mismo constructor visual que la barra de herramientas de la lista."
869869
},
870870
"interfaceConfig.sort": {
871-
label: "Sort",
872-
helpText: "Default sort order for the page, defined directly on the page."
871+
label: "Orden",
872+
helpText: "Orden predeterminado de la página, definido directamente en la página."
873873
},
874874
"interfaceConfig.sort.field": {
875875
label: "Campo"
@@ -878,40 +878,40 @@ export const esESMetadataForms: NonNullable<TranslationData['metadataForms']> =
878878
label: "Dirección"
879879
},
880880
"interfaceConfig.levels": {
881-
label: "Levels",
882-
helpText: "Hierarchy levels to display (tree-like sources)"
881+
label: "Niveles",
882+
helpText: "Niveles de jerarquía que mostrar (orígenes de tipo árbol)"
883883
},
884884
"interfaceConfig.appearance": {
885-
label: "Appearance",
886-
helpText: "Allowed visualizations (Grid / Kanban / Calendar / …) and description visibility"
885+
label: "Apariencia",
886+
helpText: "Visualizaciones permitidas (Grid / Kanban / Calendar / …) y visibilidad de la descripción"
887887
},
888888
"interfaceConfig.userFilters": {
889-
label: "User Filters",
890-
helpText: "End-user filter bar: None (no bar) / Tabs (named presets) / Dropdown (per-field). None removes the config."
889+
label: "Filtros de usuario",
890+
helpText: "Barra de filtros para el usuario final: None (sin barra) / Tabs (preajustes con nombre) / Dropdown (por campo). None elimina la configuración."
891891
},
892892
"interfaceConfig.userActions": {
893-
label: "User Actions",
894-
helpText: "Toolbar toggles (search, sort, filter, row height)"
893+
label: "Acciones de usuario",
894+
helpText: "Conmutadores de la barra de herramientas (buscar, ordenar, filtrar, altura de fila)"
895895
},
896896
"interfaceConfig.addRecord": {
897-
label: "Add Record",
898-
helpText: "Add-record entry point"
897+
label: "Agregar registro",
898+
helpText: "Punto de entrada para agregar registros"
899899
},
900900
"interfaceConfig.buttons": {
901-
label: "Buttons",
902-
helpText: "Toolbar buttons — pick from this object's actions"
901+
label: "Botones",
902+
helpText: "Botones de la barra de herramientas — elige entre las acciones de este objeto"
903903
},
904904
"interfaceConfig.recordAction": {
905-
label: "Record Action",
906-
helpText: "How clicking a record opens its detail"
905+
label: "Acción de registro",
906+
helpText: "Cómo se abre el detalle al hacer clic en un registro"
907907
},
908908
"interfaceConfig.showRecordCount": {
909-
label: "Show Record Count",
910-
helpText: "Show the record count bar"
909+
label: "Mostrar recuento de registros",
910+
helpText: "Mostrar la barra de recuento de registros"
911911
},
912912
"interfaceConfig.allowPrinting": {
913-
label: "Allow Printing",
914-
helpText: "Allow users to print this page"
913+
label: "Permitir impresión",
914+
helpText: "Permitir que los usuarios impriman esta página"
915915
},
916916
isDefault: {
917917
label: "Predeterminado",

‎packages/platform-objects/src/apps/translations/es-ES.source-hashes.generated.ts‎

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -136,36 +136,6 @@ export const esESGeneratedSourceHashes: Readonly<Record<string, string>> = {
136136
"metadataForms.object.fields.lifecycle.ttl.label": "e37616f70b0d157a",
137137
"metadataForms.object.fields.validations.helpText": "1f6e59e364995ce8",
138138
"metadataForms.object.fields.validations.label": "06fc6dd288348779",
139-
"metadataForms.page.fields.interfaceConfig.addRecord.helpText": "3eb7b86c3a630db9",
140-
"metadataForms.page.fields.interfaceConfig.addRecord.label": "01068706d8b5418a",
141-
"metadataForms.page.fields.interfaceConfig.allowPrinting.helpText": "b8fa84e13cd1432c",
142-
"metadataForms.page.fields.interfaceConfig.allowPrinting.label": "3d0f3f6f51215492",
143-
"metadataForms.page.fields.interfaceConfig.appearance.helpText": "a6118f268ea9f841",
144-
"metadataForms.page.fields.interfaceConfig.appearance.label": "e71255d10680838c",
145-
"metadataForms.page.fields.interfaceConfig.buttons.helpText": "bdc9b266702b27d8",
146-
"metadataForms.page.fields.interfaceConfig.buttons.label": "213eb6a492478539",
147-
"metadataForms.page.fields.interfaceConfig.columns.helpText": "f2330254ad68acb8",
148-
"metadataForms.page.fields.interfaceConfig.columns.label": "c849ea0a39dedbb6",
149-
"metadataForms.page.fields.interfaceConfig.filterBy.helpText": "a73677b167a7379e",
150-
"metadataForms.page.fields.interfaceConfig.filterBy.label": "141e52c71ef928bc",
151-
"metadataForms.page.fields.interfaceConfig.helpText": "d99664c5cd130355",
152-
"metadataForms.page.fields.interfaceConfig.label": "ebcdc9f327772aac",
153-
"metadataForms.page.fields.interfaceConfig.levels.helpText": "6d33feacb82984ff",
154-
"metadataForms.page.fields.interfaceConfig.levels.label": "f90c5b5c1457e991",
155-
"metadataForms.page.fields.interfaceConfig.recordAction.helpText": "2356903762168e64",
156-
"metadataForms.page.fields.interfaceConfig.recordAction.label": "b6e738e297b43df0",
157-
"metadataForms.page.fields.interfaceConfig.showRecordCount.helpText": "23de51872ec0e7a5",
158-
"metadataForms.page.fields.interfaceConfig.showRecordCount.label": "3f45f6242141d01a",
159-
"metadataForms.page.fields.interfaceConfig.sort.helpText": "15ebb2c0a3d2390e",
160-
"metadataForms.page.fields.interfaceConfig.sort.label": "4c590a0ed0c02eff",
161-
"metadataForms.page.fields.interfaceConfig.source.helpText": "f3351049c2af63e7",
162-
"metadataForms.page.fields.interfaceConfig.source.label": "8fe786e8e29c8cec",
163-
"metadataForms.page.fields.interfaceConfig.userActions.helpText": "f720e5e6f4f35dae",
164-
"metadataForms.page.fields.interfaceConfig.userActions.label": "3aea42abc7d6ffd0",
165-
"metadataForms.page.fields.interfaceConfig.userFilters.helpText": "8791bc40505cac7d",
166-
"metadataForms.page.fields.interfaceConfig.userFilters.label": "7e2bbb262bd29aa1",
167-
"metadataForms.page.sections.interface.description": "7e60b977279a05dc",
168-
"metadataForms.page.sections.interface.label": "e2280abc5267ddec",
169139
"metadataForms.report.fields.drilldown.helpText": "778174eac8057764",
170140
"metadataForms.report.fields.drilldown.label": "25ae77d240ced5f5",
171141
"metadataForms.report.fields.runtimeFilter.helpText": "eb9ba8aeb55b7d40",

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

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -781,8 +781,8 @@ export const jaJPMetadataForms: NonNullable<TranslationData['metadataForms']> =
781781
description: "ページ領域とそこに配置するコンポーネント。"
782782
},
783783
interface: {
784-
label: "Interface (list pages)",
785-
description: "Interface mode (Airtable parity): the page defines its own data surface directly — columns, filters, visualizations and toolbar — no inheriting from a separate view."
784+
label: "Interface(リストページ)",
785+
description: "Interface モード(Airtable 互換):ページが自身のデータサーフェスを直接定義します——列、フィルター、可視化、ツールバー——独立したビューを継承しません。"
786786
},
787787
advanced: {
788788
label: "詳細",
@@ -852,24 +852,24 @@ export const jaJPMetadataForms: NonNullable<TranslationData['metadataForms']> =
852852
label: "コンポーネント"
853853
},
854854
interfaceConfig: {
855-
label: "Interface Config",
856-
helpText: "The page IS the view: source picks the object, columns/filterBy are defined directly here; appearance.allowedVisualizations whitelists renderers (one entry = locked); userActions toggles the toolbar."
855+
label: "Interface 設定",
856+
helpText: "ページ自体がビューです:source でオブジェクトを選び、columns/filterBy はここで直接定義します。appearance.allowedVisualizations が使用可能なレンダラーを限定し(1 件のみならロック)、userActions がツールバーを切り替えます。"
857857
},
858858
"interfaceConfig.source": {
859-
label: "Source",
860-
helpText: "Object this page reads from"
859+
label: "ソース",
860+
helpText: "このページがデータを読み取るオブジェクト"
861861
},
862862
"interfaceConfig.columns": {
863-
label: "Columns",
864-
helpText: "Columns to show — defined directly on the page (blank = all object fields)"
863+
label: "列",
864+
helpText: "表示する列——ページ上で直接定義します(空欄はオブジェクトの全フィールド)"
865865
},
866866
"interfaceConfig.filterBy": {
867-
label: "Filter By",
868-
helpText: "Always-on base filter for the page — same visual builder as the list toolbar."
867+
label: "フィルター条件",
868+
helpText: "ページに常時適用される基本フィルター——リストツールバーと同じビジュアルビルダー。"
869869
},
870870
"interfaceConfig.sort": {
871-
label: "Sort",
872-
helpText: "Default sort order for the page, defined directly on the page."
871+
label: "並び替え",
872+
helpText: "ページの既定の並び順。ページ上で直接定義します。"
873873
},
874874
"interfaceConfig.sort.field": {
875875
label: "フィールド"
@@ -878,40 +878,40 @@ export const jaJPMetadataForms: NonNullable<TranslationData['metadataForms']> =
878878
label: "並び方向"
879879
},
880880
"interfaceConfig.levels": {
881-
label: "Levels",
882-
helpText: "Hierarchy levels to display (tree-like sources)"
881+
label: "階層レベル",
882+
helpText: "表示する階層レベル(ツリー状のソース)"
883883
},
884884
"interfaceConfig.appearance": {
885-
label: "Appearance",
886-
helpText: "Allowed visualizations (Grid / Kanban / Calendar / …) and description visibility"
885+
label: "外観",
886+
helpText: "使用可能な可視化(Grid / Kanban / Calendar / …)と説明の表示可否"
887887
},
888888
"interfaceConfig.userFilters": {
889-
label: "User Filters",
890-
helpText: "End-user filter bar: None (no bar) / Tabs (named presets) / Dropdown (per-field). None removes the config."
889+
label: "ユーザーフィルター",
890+
helpText: "エンドユーザー用フィルターバー:None(バーなし)/ Tabs(名前付きプリセット)/ Dropdown(フィールド単位)。None は設定を削除します。"
891891
},
892892
"interfaceConfig.userActions": {
893-
label: "User Actions",
894-
helpText: "Toolbar toggles (search, sort, filter, row height)"
893+
label: "ユーザーアクション",
894+
helpText: "ツールバーの切り替え(検索、並べ替え、フィルター、行の高さ)"
895895
},
896896
"interfaceConfig.addRecord": {
897-
label: "Add Record",
898-
helpText: "Add-record entry point"
897+
label: "レコードを追加",
898+
helpText: "レコード追加の入口"
899899
},
900900
"interfaceConfig.buttons": {
901-
label: "Buttons",
902-
helpText: "Toolbar buttons — pick from this object's actions"
901+
label: "ボタン",
902+
helpText: "ツールバーのボタン——このオブジェクトのアクションから選択します"
903903
},
904904
"interfaceConfig.recordAction": {
905-
label: "Record Action",
906-
helpText: "How clicking a record opens its detail"
905+
label: "レコードアクション",
906+
helpText: "レコードをクリックしたときに詳細をどう開くか"
907907
},
908908
"interfaceConfig.showRecordCount": {
909-
label: "Show Record Count",
910-
helpText: "Show the record count bar"
909+
label: "レコード数を表示",
910+
helpText: "レコード数バーを表示します"
911911
},
912912
"interfaceConfig.allowPrinting": {
913-
label: "Allow Printing",
914-
helpText: "Allow users to print this page"
913+
label: "印刷を許可",
914+
helpText: "ユーザーがこのページを印刷できるようにします"
915915
},
916916
isDefault: {
917917
label: "既定",

‎packages/platform-objects/src/apps/translations/ja-JP.source-hashes.generated.ts‎

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -136,36 +136,6 @@ export const jaJPGeneratedSourceHashes: Readonly<Record<string, string>> = {
136136
"metadataForms.object.fields.lifecycle.ttl.label": "e37616f70b0d157a",
137137
"metadataForms.object.fields.validations.helpText": "1f6e59e364995ce8",
138138
"metadataForms.object.fields.validations.label": "06fc6dd288348779",
139-
"metadataForms.page.fields.interfaceConfig.addRecord.helpText": "3eb7b86c3a630db9",
140-
"metadataForms.page.fields.interfaceConfig.addRecord.label": "01068706d8b5418a",
141-
"metadataForms.page.fields.interfaceConfig.allowPrinting.helpText": "b8fa84e13cd1432c",
142-
"metadataForms.page.fields.interfaceConfig.allowPrinting.label": "3d0f3f6f51215492",
143-
"metadataForms.page.fields.interfaceConfig.appearance.helpText": "a6118f268ea9f841",
144-
"metadataForms.page.fields.interfaceConfig.appearance.label": "e71255d10680838c",
145-
"metadataForms.page.fields.interfaceConfig.buttons.helpText": "bdc9b266702b27d8",
146-
"metadataForms.page.fields.interfaceConfig.buttons.label": "213eb6a492478539",
147-
"metadataForms.page.fields.interfaceConfig.columns.helpText": "f2330254ad68acb8",
148-
"metadataForms.page.fields.interfaceConfig.columns.label": "c849ea0a39dedbb6",
149-
"metadataForms.page.fields.interfaceConfig.filterBy.helpText": "a73677b167a7379e",
150-
"metadataForms.page.fields.interfaceConfig.filterBy.label": "141e52c71ef928bc",
151-
"metadataForms.page.fields.interfaceConfig.helpText": "d99664c5cd130355",
152-
"metadataForms.page.fields.interfaceConfig.label": "ebcdc9f327772aac",
153-
"metadataForms.page.fields.interfaceConfig.levels.helpText": "6d33feacb82984ff",
154-
"metadataForms.page.fields.interfaceConfig.levels.label": "f90c5b5c1457e991",
155-
"metadataForms.page.fields.interfaceConfig.recordAction.helpText": "2356903762168e64",
156-
"metadataForms.page.fields.interfaceConfig.recordAction.label": "b6e738e297b43df0",
157-
"metadataForms.page.fields.interfaceConfig.showRecordCount.helpText": "23de51872ec0e7a5",
158-
"metadataForms.page.fields.interfaceConfig.showRecordCount.label": "3f45f6242141d01a",
159-
"metadataForms.page.fields.interfaceConfig.sort.helpText": "15ebb2c0a3d2390e",
160-
"metadataForms.page.fields.interfaceConfig.sort.label": "4c590a0ed0c02eff",
161-
"metadataForms.page.fields.interfaceConfig.source.helpText": "f3351049c2af63e7",
162-
"metadataForms.page.fields.interfaceConfig.source.label": "8fe786e8e29c8cec",
163-
"metadataForms.page.fields.interfaceConfig.userActions.helpText": "f720e5e6f4f35dae",
164-
"metadataForms.page.fields.interfaceConfig.userActions.label": "3aea42abc7d6ffd0",
165-
"metadataForms.page.fields.interfaceConfig.userFilters.helpText": "8791bc40505cac7d",
166-
"metadataForms.page.fields.interfaceConfig.userFilters.label": "7e2bbb262bd29aa1",
167-
"metadataForms.page.sections.interface.description": "7e60b977279a05dc",
168-
"metadataForms.page.sections.interface.label": "e2280abc5267ddec",
169139
"metadataForms.report.fields.drilldown.helpText": "778174eac8057764",
170140
"metadataForms.report.fields.drilldown.label": "25ae77d240ced5f5",
171141
"metadataForms.report.fields.runtimeFilter.helpText": "eb9ba8aeb55b7d40",

0 commit comments

Comments
 (0)