Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions .changeset/3880-es-done-listo.md
Original file line numberDiff line numberDiff line change
@@ -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.
33 changes: 24 additions & 9 deletions packages/i18n/src/__tests__/residue-namespaces-3546.test.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -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('等待中');
});
Expand Down
2 changes: 1 addition & 1 deletion packages/i18n/src/locales/es.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -339,7 +339,7 @@ const es = {
running: "Ejecutando…",
undo: "Deshacer",
undoing: "Deshaciendo…",
done: "Hecho",
done: "Listo",
selectPlaceholder: "Seleccionar…",
loading: "Cargando…",
},
Expand Down
Loading