diff --git a/.changeset/stale-4163-pointers-5591.md b/.changeset/stale-4163-pointers-5591.md new file mode 100644 index 000000000..7b77930b5 --- /dev/null +++ b/.changeset/stale-4163-pointers-5591.md @@ -0,0 +1,41 @@ +--- +'@object-ui/i18n': patch +--- + +`setLocalized`'s published docblock states the single-locale write rule that is +actually in force, instead of deferring the multi-locale-authoring question to a +closed card (objectui#5591). + +The docblock read "is not a multi-locale authoring UI (objectui#4163)". objectui#4163 +closed as completed on 2026-08-15 with that product question still unanswered, so the +parenthetical pointed at nothing — and it read as though the question had been settled +somewhere a reader could go and check. This is the failure mode objectui#5428 +demonstrated is not harmless: there, a dangling deferral of exactly this shape let an +expired justification sit unread for a release cycle at two surfaces. + +The remedy is objectui#5428's, not a re-pointing at a successor card: state the rule in +force (`setLocalized` reaches only the entry for the locale the author is in), keep the +open product question open **in place**, and record why there is deliberately no tracker +reference — so the next reader cannot restore one. Re-pointing is how the class +regenerates, because the next card closes too. The same wording form already landed in +`plugin-designer`'s `writeWidgetTitle` and `DashboardWidgetInspector`. + +Prose only. No behaviour, no signature, no test changes — `setLocalized`'s pairing with +`pickLocalized` is unchanged and still pinned by `src/__tests__/setLocalized.test.ts`. + +Declared as a `patch` for `@object-ui/i18n` alone because the emit was measured per +package rather than assumed, and the two packages this change touches differ: + +- `@object-ui/i18n` — the docblock sits on the **exported** `setLocalized`, so it reaches + the published artifacts. Rebuilt with `tsconfig.tsbuildinfo` cleared first (the build is + `composite`, which otherwise skips emit), and compared by SHA-256 rather than byte count: + `dist/pickLocalized.d.ts` `1e2170ad…` -> `124a1c07…` and `dist/pickLocalized.js` + `06eb88bd…` -> `568cb703…`. A consumer reads this text on hover and in the API docs, so + it publishes something. +- `@object-ui/plugin-dashboard` — the two comments changed there are a `//` banner between + declarations and a test docblock, neither attached to an exported declaration. + `dist/WidgetConfigPanel.d.ts` is **byte-identical** across the rebuild + (`93252e8cdf5a6faa…` both sides). The only artifact that moved is + `dist/WidgetConfigPanel.d.ts.map`, whose mappings shift because lines were added above + the declarations; no declaration text changed. Nothing user-visible publishes from that + package, so it is not named here. diff --git a/packages/i18n/src/pickLocalized.ts b/packages/i18n/src/pickLocalized.ts index 975d3b7d2..dc02e6dc6 100644 --- a/packages/i18n/src/pickLocalized.ts +++ b/packages/i18n/src/pickLocalized.ts @@ -129,8 +129,15 @@ function localeWriteKey( * the "saved" string vanishes — which is why they live in one file. * * ⚠️ This is the minimal non-destructive write for a SINGLE-locale editor. It - * is not a multi-locale authoring UI (objectui#4163) and does not pretend to - * be: an author can only ever reach the entry for the locale they are in. + * is not a multi-locale authoring UI and does not pretend to be: an author can + * only ever reach the entry for the locale they are in. + * + * Authoring every locale from one surface remains an OPEN product question, and + * is deliberately not deferred to a tracker here: the deferral this replaced + * named objectui#4163, which closed as completed on 2026-08-15 with the question + * still unanswered. A comment pointing at a closed card reads as though the + * question were settled somewhere, which is how the previous stale premise in + * this area survived unread. */ export function setLocalized( value: unknown, diff --git a/packages/plugin-dashboard/src/WidgetConfigPanel.tsx b/packages/plugin-dashboard/src/WidgetConfigPanel.tsx index 7628b339f..e9c721cfd 100644 --- a/packages/plugin-dashboard/src/WidgetConfigPanel.tsx +++ b/packages/plugin-dashboard/src/WidgetConfigPanel.tsx @@ -514,8 +514,11 @@ export interface WidgetConfigPanelProps { // WRITE `setLocalized(stored, language, edited)` — replace ONLY the active // locale's entry and carry every other locale across untouched. // -// A full multi-locale editor (authoring every locale in the panel) is -// objectui#4163's territory, not this one. +// A full multi-locale editor — authoring every locale from this panel — is NOT +// what this panel offers; it edits the active locale only. That remains an OPEN +// product question and is deliberately not deferred to a tracker here: the +// deferral this replaced named objectui#4163, which closed as completed on +// 2026-08-15 with the question still unanswered. // --------------------------------------------------------------------------- /** diff --git a/packages/plugin-dashboard/src/__tests__/WidgetConfigPanel.inlineLocaleMap.test.tsx b/packages/plugin-dashboard/src/__tests__/WidgetConfigPanel.inlineLocaleMap.test.tsx index 9fe4cc75e..a8ce1c2c0 100644 --- a/packages/plugin-dashboard/src/__tests__/WidgetConfigPanel.inlineLocaleMap.test.tsx +++ b/packages/plugin-dashboard/src/__tests__/WidgetConfigPanel.inlineLocaleMap.test.tsx @@ -40,8 +40,11 @@ * a different guarantee (a rebuild would add an entry for the active locale * to a map that never carried one). * - * A full multi-locale editor is objectui#4163's territory and is deliberately - * NOT asserted here. + * A full multi-locale editor is deliberately NOT asserted here — this suite pins + * the single-locale write rule above and nothing wider. Authoring every locale + * from one panel remains an OPEN product question, not deferred to a tracker + * here: the deferral this replaced named objectui#4163, which closed as + * completed on 2026-08-15 with the question still unanswered. */ import * as React from 'react';