Repository navigation
Commit 326a559
chore(i18n): delete 92 message keys nothing reads from all ten locale packs (#26158)
<!-- claude-projects-attribution: {"github_login":"os-steve"} -->
_Requested by **Steve** · [project
thread](https://claude.ai/code/project/chan_01FdL1XeUyvVNxLreh3F4Qi9?thread=cmsg_01FdL1XeUyvVNxLreh3F4Qi9SgBCUABMtPXuje9dvRBdof)_
Part of #25921 (the dead i18n keys slice; the card's other items stay
open there).
Clause-②: yes (`TranslationKeys` narrows: the 92 dead keys of #25921 and
`validation.formInvalid` from #26040; additive `InvitationSignUpPrompt`
export from #26044; patch per the objectui#4730 key-retirement
precedent)
Metadata-protocol: none
## i18n batch (seat `domain:ui#1`)
This PR also carries three already-reviewed PRs on the same locale
packs, merged in rather than landed one by one, so
`scripts/sdui-manifest.sources/i18n.json` is re-recorded once and the
merge queue runs once. The queue squash-merges, so stacked PRs would
still conflict. The source PRs are closed as superseded when this
merges.
| source PR | card | packages | its review |
|---|---|---|---|
| #26040 | 25874 (form refusal focuses the first invalid field) |
components, i18n | seat 1 ACCEPT |
| #26044 | 25886 (invitation arrival copy) | app-shell, console, i18n |
seat 2 ACCEPT + contract review 6413489249 |
| #26048 | 25889 (map style failure notice) | plugin-map, i18n | seat 2
ACCEPT |
| this branch | 25921 (92 dead keys) | i18n | seat 1 |
Each source PR keeps its own changeset. The non-locale files are
byte-identical to each source PR's head (checked by the seat), and the
diff against `main` is exactly the union of the four PRs' files plus
`scripts/sdui-manifest.sources/{components,i18n,plugin-map}.json`. Cards
25874, 25886 and 25889 are referenced without a closing keyword on
purpose: each seat closes out its own card after this lands.
## What
Deletes 92 message keys that nothing reads from all ten locale packs
under `ui/packages/i18n/src/locales/` (`ar`, `de`, `en`, `es`, `fr`,
`ja`, `ko`, `pt`, `ru`, `zh`). Pure deletions: no key is renamed or
added, and no value changes. Each pack loses the same 92 leaves (`en`
shows 93 deleted lines because `publicForm.unavailableDescription` spans
two).
Two test ratchets that name keys follow the deletion in the same PR:
-
`ui/packages/i18n/src/__tests__/objectView-config-keys-retired-4730.test.ts`:
`console.objectView.ufTabs` and `viewTypeUnavailableShort` move from the
surviving half (105 to 103) to the retired list (124 to 126). The total
stays 229, and the retired list now pins both keys absent from every
pack.
- `ui/packages/app-shell/src/__tests__/product-specific.allowlist.json`:
`workspace.invite` and `workspace.members` are deleted from the live
list, as its own test asks ("a migrated one is deleted from the live
list"). The list takes deletions only, and this is one.
## How each key was proved unused
Measured on `origin/main` `6d15acab` (objectstack-ai/objectstack), with
three searches per key:
1. `node ui/scripts/check-i18n-dead-keys.mjs --json`: every key below is
in its CONFIRMED tier (no `t()` / `tt()` call site, no dynamic template
head that reaches it, no indirect one-hop template, and no key-boundary
textual occurrence of the dotted key or its property chain anywhere in
`ui/`). The run reported 3,879 pack keys, 398 candidates, 122 CONFIRMED,
276 NEEDS-REVIEW, `wrongVerdicts: []` and `classFourUncovered: []`.
2. A whole-repository search, wider than the tool's `ui/` scope: `git
grep -n -F -f KEYS -- . ':!ui/packages/i18n/src/locales'`, then a filter
that keeps a hit only where the key is bounded on both sides by a
character that cannot continue a dotted key. Result: 0 hits for all 92
keys. The one raw line it printed is `object-grid.rowHeight` in a
`packages/spec` comment, a component name and not `grid.rowHeight`.
Positive control: the same search for `preview.changes.typeCount.object`
finds `DraftChangesPanel.tsx`.
3. A read of the subtree and dynamic pack readers the tool reports but
cannot tier (its classes 1 and 5): `LoadingScreen.tsx` spreads
`console.error` but reads only `connectionFailed` and `checkServer`;
`outboundAgentText.ts` indexes `console.ai` only by its four
`OutboundAgentTextKey` names; `flowResponse.ts` reads only
`form.noPermissionToSave`. None of them reads a deleted key. A probe for
template heads (a template literal or a string concatenation that starts
with the key's parent namespace) over all non-test source in
`ui/packages`, `ui/apps`, `ui/examples` and `ui/e2e` found one, a
`table.` template inside an error message in
`ui/packages/types/src/zod/objectql.zod.ts`, which is refusal text and
not a translation lookup.
After the change the tool reports 3,787 pack keys, 30 CONFIRMED (the 30
kept on purpose, listed below) and the same 276 NEEDS-REVIEW, so the
deletion moved no key into either tier.
### The 92 deleted keys
- `appDesigner`: `addComponent`, `aggregate`, `appearance`,
`colorVariant`, `componentProperties`, `createApp`, `editApp`, `fields`,
`livePreview`, `modeCode`, `modePreview`, `navBuilder`, `rowHeight`,
`selectObjects`, `showFilters`, `showSearch`, `showSort`, `toolbar`,
`valueField`, `viewType`
- `console.ai`: `conversationReady`, `preparingConversation`,
`workspaceSubtitle`, `workspaceTitle`
- `console.commandPalette`: `createApp`
- `console.error`: `serverUnreachable`, `timeout`
- `console.objectView`: `ufTabs`, `viewTypeUnavailableShort`
- `console`: `title`
- `dashboard`: `addWidget`, `editLayout`, `resetLayout`, `saveLayout`
- `errors`: `networkError`, `notFound`, `serverError`, `timeout`
- `form`: `deleteSuccess`, `invalidFormat`, `removeItem`, `saveSuccess`
- `grid`: `rowHeight`
- `home`: `allApps`, `createFirstApp`, `title`, `welcomeDescription`
- `home.gettingStarted`: `cta`, `title`
- `kanban`: `deleteCard`, `deleteColumn`
- `layout.appSwitcher`: `addApp`, `editApp`, `editNavigation`, `home`,
`manageAllApps`, `noAppsConfigured`, `systemConsole`
- `publicForm`: `consentLabelDefault`, `consentLink`, `retry`,
`secureNotice`, `submitAnother`, `tryDemo`, `unavailableDescription`,
`unavailableTitle`
- `report`: `allLabel`, `columnTotal`, `columnsLabel`, `emptyLabel`,
`failedToLoad`, `grandTotal`, `needsAcross`, `rowTotal`, `rowsLabel`
- `sidebar`: `scope`, `settings`
- `table`: `collapseRow`, `expandRow`, `exportExcel`, `filterColumn`,
`freezeColumn`, `showing`, `unfreezeColumn`
- `user`: `settings`
- `validation`: `type`
- `view`: `activeFilters`, `activeSort`, `saveAsView`, `unsavedChanges`
- `workspace`: `invite`, `members`
## Kept although the tool lists them CONFIRMED (30)
- **28 plural forms.**
`preview.changes.typeCount.{object,view,page,dashboard,app,action,report,flow,permission,agent,email_template}_one`
/ `_other`, `notifications.arrivalMany_one` / `_other`,
`notifications.arrivalRepeats_one` / `_other`,
`fields.relativeDate.overdue_one` / `_other`. Their base keys are called
with `count` (`DraftChangesPanel.tsx`, `useInboxArrivalNotifier.ts`,
`core/src/utils/date-display.ts`), so i18next reads exactly these
suffixed forms. The tool expands plural suffixes only for call sites it
classifies as pack calls; these call sites reach the base key through a
passed-in translator, so the base key lands in NEEDS-REVIEW and its
suffixed forms fall to CONFIRMED. Deleting them would turn every count
string on those screens back to the bare fallback.
- **`console.ai.agentLabels.dataChat` and `metadataAssistant`.** No code
reads them (`AiChatPage.tsx` maps only `ask` and `build`), but the pack
marks them "Legacy keys kept for back-compat with any external
overrides". Dropping them is a separate call.
## Acceptance notes
- `ui/scripts/check-i18n-dead-keys.mjs` false-positive class, not fixed
here: the plural forms of a base key that is called with `count` through
a translator the AST pass does not classify as a pack call are reported
CONFIRMED. 28 of today's 122 CONFIRMED entries (23%) are this class.
Carrier: none.
- `ui/scripts/check-i18n-dead-keys.mjs`'s text footprint does not see a
key that a JSON list spells as namespace plus leaf
(`product-specific.allowlist.json`): `workspace.invite` and
`workspace.members` were CONFIRMED while that list named them. Carrier:
none.
- The pack objects' TypeScript types (`typeof en`, `TranslationKeys`)
lose the deleted members. Nothing in this repository reads one of them
by property (search 2 above covers the property chains too, and the
tool's property-chain leg found none); an external host that does would
see a type error. Recorded here because the claim line says no exported
type changes.
- `scripts/sdui-manifest.sources/i18n.json` is re-recorded (`node
scripts/gen-sdui-manifest-node.mjs` after merging `main` at `a335f1de`),
because `@object-ui/i18n` is in the console registry closure; `node
scripts/check-sdui-manifest.mjs` is green on the pushed head. The i18n
packs are serialised: #26045, #26040, #26044, #26048 and #26055 land
first, and #26040 also edits these packs. When its turn comes this
branch merges `main` again, re-records the digest and rebuilds the
Console; the seat enqueues it. It is not armed or queued from here.
Local test runs and gate readings are in the `os-dev-report` comment on
#25921.
---
_Generated by [Claude
Code](https://claude.ai/code/session_01FpUtgwNrSiRgWJ8GAepPeP)_
🤖 Generated with [Claude Code](https://claude.com/claude-code)
https://claude.ai/code/session_01FpUtgwNrSiRgWJ8GAepPeP
---------
Co-authored-by: Claude <noreply@anthropic.com>1 parent df8aac4 commit 326a559
42 files changed
Lines changed: 1126 additions & 1078 deletions
File tree
- .changeset
- scripts/sdui-manifest.sources
- ui
- apps/console/src/pages/auth
- __tests__
- packages
- app-shell/src
- __tests__
- console
- auth
- __tests__
- organizations
- __tests__
- manage
- components/src/renderers/form
- __tests__
- i18n/src
- __tests__
- locales
- plugin-map/src
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | | - | |
| 1 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | | - | |
| 1 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | | - | |
| 1 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
26 | 26 | | |
27 | 27 | | |
28 | 28 | | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
29 | 35 | | |
30 | 36 | | |
31 | 37 | | |
| |||
54 | 60 | | |
55 | 61 | | |
56 | 62 | | |
| 63 | + | |
57 | 64 | | |
58 | 65 | | |
59 | 66 | | |
| |||
304 | 311 | | |
305 | 312 | | |
306 | 313 | | |
| 314 | + | |
307 | 315 | | |
308 | 316 | | |
309 | 317 | | |
| |||
345 | 353 | | |
346 | 354 | | |
347 | 355 | | |
348 | | - | |
| 356 | + | |
| 357 | + | |
| 358 | + | |
349 | 359 | | |
350 | 360 | | |
351 | | - | |
352 | | - | |
353 | | - | |
| 361 | + | |
| 362 | + | |
| 363 | + | |
| 364 | + | |
| 365 | + | |
| 366 | + | |
| 367 | + | |
354 | 368 | | |
355 | 369 | | |
| 370 | + | |
| 371 | + | |
| 372 | + | |
| 373 | + | |
| 374 | + | |
356 | 375 | | |
357 | | - | |
358 | | - | |
359 | | - | |
| 376 | + | |
| 377 | + | |
360 | 378 | | |
361 | 379 | | |
362 | 380 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
257 | 257 | | |
258 | 258 | | |
259 | 259 | | |
260 | | - | |
261 | | - | |
262 | | - | |
263 | | - | |
| 260 | + | |
| 261 | + | |
| 262 | + | |
| 263 | + | |
| 264 | + | |
| 265 | + | |
| 266 | + | |
| 267 | + | |
| 268 | + | |
| 269 | + | |
| 270 | + | |
| 271 | + | |
| 272 | + | |
| 273 | + | |
| 274 | + | |
| 275 | + | |
| 276 | + | |
264 | 277 | | |
265 | 278 | | |
266 | 279 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
49 | 49 | | |
50 | 50 | | |
51 | 51 | | |
| 52 | + | |
| 53 | + | |
52 | 54 | | |
53 | 55 | | |
54 | 56 | | |
| |||
162 | 164 | | |
163 | 165 | | |
164 | 166 | | |
165 | | - | |
| 167 | + | |
166 | 168 | | |
167 | 169 | | |
168 | 170 | | |
169 | | - | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
170 | 181 | | |
171 | 182 | | |
172 | 183 | | |
| |||
202 | 213 | | |
203 | 214 | | |
204 | 215 | | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
205 | 221 | | |
206 | 222 | | |
207 | 223 | | |
| |||
220 | 236 | | |
221 | 237 | | |
222 | 238 | | |
223 | | - | |
| 239 | + | |
224 | 240 | | |
225 | 241 | | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
226 | 246 | | |
227 | 247 | | |
228 | 248 | | |
| |||
0 commit comments