diff --git a/.changeset/3880-es-done-listo.md b/.changeset/3880-es-done-listo.md new file mode 100644 index 0000000000..032c5075e8 --- /dev/null +++ b/.changeset/3880-es-done-listo.md @@ -0,0 +1,30 @@ +--- +'@object-ui/i18n': patch +--- + +The Spanish pack renders `Done` as `Listo` at every one of the four sites that say it +(objectui#3880, triage adjudication 2026-08-09). `grid.bulk.done` — the footer button that +dismisses the bulk-action result dialog — read `Hecho` while `common.done`, `view.done` and +`form.fullscreen.done` all read `Listo`, so the same English word rendered two ways in +Spanish across dialogs a user meets in one session. + +Adjudicated a typo rather than a deliberate contextual split, on three checks. All four +keys hold the byte-identical `en` value `Done`, and all four call sites are the same +control: a dialog-footer button whose click finishes or dismisses the surface +(`BulkActionDialog` `onClose(result)`, `ManageViewsDialog` `onOpenChange(false)`, +`fullscreen-editor` `commitFullscreen`, `InviteMemberDialog`'s invitation-created footer). +The nine other packs each render all four identically (de `Fertig`, fr `Terminé`, pt +`Concluído`, ru `Готово`, ja `完了`, ko `완료`, zh `完成`, ar `تم`), so no other translation +pass had found a context worth splitting on. And the neighbouring `Hecho`/`Deshecho` +pairing that could have justified it does not hold: `grid.bulk.undo` is the verb `Deshacer`, +and `Deshecho: ` is `undonePrefix`, a result-line status rather than a button. + +`Hecho` moved to the 3:1 majority `Listo`, which is the value objectui#3546 slice seven had +already chosen for `common.done`. `packages/i18n/src/__tests__/residue-namespaces-3546.test.tsx` +pinned the old outlier as a recorded example of deliberate divergence; that pin now asserts +the four as one value instead, and its note keeps the history plus the `Pending`/zh row, +which remains a genuine deliberate split. + +No `en` value changes, so no other pack is asked to follow. This is the value half of +objectui#3880 only — the card's 281/164 shared-string census stays on the card as +documentation, and is explicitly not a gate: 164 of those groups diverge legitimately. diff --git a/packages/i18n/src/__tests__/residue-namespaces-3546.test.tsx b/packages/i18n/src/__tests__/residue-namespaces-3546.test.tsx index 0e38a71be7..cc7efb31b3 100644 --- a/packages/i18n/src/__tests__/residue-namespaces-3546.test.tsx +++ b/packages/i18n/src/__tests__/residue-namespaces-3546.test.tsx @@ -552,16 +552,31 @@ describe('objectui#3546 slice seven — the ratchet residue', () => { ); } } - // Recorded because it looks like an omission and is not: two other rows also - // say `Done`/`Pending` in `en` and already disagree with the chosen neighbour - // in one pack each — `grid.bulk.done` is es "Hecho" against "Listo", and - // `approvalsInbox.statusPending` is zh 待审批 ("awaiting approval"), which is - // wrong for an invitation. So the repo ALREADY renders these English strings - // more than one way, on purpose, and picking a neighbour is a choice that has - // to be made rather than derived. + // Recorded because it looks like an omission and is not: another row also + // says `Pending` in `en` and still disagrees with the chosen neighbour in one + // pack — `approvalsInbox.statusPending` is zh 待审批 ("awaiting approval"), + // which is wrong for an invitation. So the repo DOES render some English + // strings more than one way, on purpose, and picking a neighbour is a choice + // that has to be made rather than derived. + // + // `Done` stood beside it as the second example until objectui#3880, which + // adjudicated that one a typo rather than a choice: `grid.bulk.done` was es + // "Hecho" against "Listo" at the other three sites, and all four are the same + // dialog-footer button that finishes the surface — `grid.bulk.done` closes the + // bulk result dialog, `view.done` closes ManageViewsDialog, `form.fullscreen.done` + // commits and leaves the fullscreen editor, `common.done` closes the invitation + // footer — with no grammatical divergence to carry. The nine other packs each + // render all four identically, so no pack had found a contextual reason to + // split them. It converged on the 3:1 majority `Listo`, which is also the value + // this slice had already chosen for `common.done`. The four are pinned together + // below so the outlier cannot regrow, and the `Done` family is no longer an + // example of deliberate divergence — only `Pending` is. expect(at(builtInLocales.en, 'grid.bulk.done')).toBe('Done'); - expect(at(builtInLocales.es, 'grid.bulk.done')).toBe('Hecho'); - expect(at(builtInLocales.es, 'view.done')).toBe('Listo'); + for (const key of ['common.done', 'view.done', 'form.fullscreen.done', 'grid.bulk.done']) { + expect(at(builtInLocales.es, key), `es ${key} (objectui#3880 converged these on one value)`).toBe( + 'Listo', + ); + } expect(at(builtInLocales.zh, 'approvalsInbox.statusPending')).toBe('待审批'); expect(at(builtInLocales.zh, 'organization.invitations.status.pending')).toBe('等待中'); }); diff --git a/packages/i18n/src/locales/es.ts b/packages/i18n/src/locales/es.ts index def7e79b33..888060d288 100644 --- a/packages/i18n/src/locales/es.ts +++ b/packages/i18n/src/locales/es.ts @@ -339,7 +339,7 @@ const es = { running: "Ejecutando…", undo: "Deshacer", undoing: "Deshaciendo…", - done: "Hecho", + done: "Listo", selectPlaceholder: "Seleccionar…", loading: "Cargando…", },