Skip to content

Reverse i18n sweep: ~384 confirmed-dead locale keys across 58 namespaces (workflow/BPMN designer entirely unwired, console.objectView oversized, more) #4730

Description

@yinlianghui

Follow-up to #4658, which deleted five specific dead keys
(console.objectView.striped/bordered/virtualScroll,
appDesigner.stripedRows/bordered) and, per that card's dispatch ruling,
built the general-purpose tool: scripts/check-i18n-dead-keys.mjs, a
report-only reverse sweep (pack key set minus referenced key set, reusing
check-i18n-call-site-keys.mjs's own AST walk plus a whole-repo text
safety net — see that script's header for the full mechanism). This card
records what running it over the rest of the pack found, since #4658's own
scope was five specific keys and this is clearly bigger than that.

What was measured

node scripts/check-i18n-dead-keys.mjs on top of #4658's PR (2927 pack keys,
13776 referenced):

626 candidate(s) with no call site this pass can see, across 58 namespace(s):
384 CONFIRMED (no textual footprint anywhere else in the repo either),
242 NEEDS-REVIEW (literal key string appears somewhere else in the repo —
an indirect reference the AST pass cannot see, e.g. a `labelKey:
'appDesigner.layoutSidebar'` property consumed through a variable).

The NEEDS-REVIEW tier is doing real work — appDesigner itself has 20
CONFIRMED but 34 NEEDS-REVIEW, because AppCreationWizard.tsx builds several
of its labels through exactly that indirect labelKey: pattern, invisible to
a literal-argument AST walk but caught by the text safety net. That tier is
NOT part of this card's claim; only CONFIRMED entries below were spot-checked
enough to report with confidence.

The two largest, spot-verified instances

workflow.* — 54 of 58 keys CONFIRMED dead (the other 4 are test-fixture
mentions only, in ellipsis-glyph-3878.test.ts and
untranslated-identity-4376.test.ts — not consumers). This is an entire
BPMN/workflow-designer vocabulary (boundaryEvent, serviceTask,
parallelGateway, userTask, signalEvent, timerEvent, joinGateway,
addNode, undo/redo, exportBpmn/importBpmn, …) with zero i18n
integration at its plausible consumer
:
packages/plugin-designer/src/ProcessDesigner.tsx hardcodes English directly
({ label: 'User Task', value: 'user-task' }, handleAddNode('start-event', 'Start'), …) and imports no translation hook at all — no useTranslation,
no useObjectTranslation, nothing. Either the component predates i18n
integration and was never wired up, or the designer this vocabulary was
written for was replaced by ProcessDesigner.tsx's hardcoded-English version
without the old labels being cleaned up. Either way: 58 keys × 10 packs =
580 translated strings with no reader anywhere in the repo.

console.objectView.* — 116 of 154 keys CONFIRMED dead, on top of the
three #4658 already removed. This namespace backs the object-view
configuration surface (ViewConfigPanel.tsx et al.), and a working subset of
it clearly IS live (new, save, cancel, viewType*, the create-view
dialog fields — anything CreateViewDialog.tsx / ObjectView.tsx /
ViewConfigPanel.tsx call t() for directly). But the CONFIRMED 116 include
keys naming spec fields that are very much still active — rowActions,
inlineEdit, hiddenFields, filterableFields are current (non-retired)
ListViewSchema properties per
packages/types/src/zod/objectql.zod.ts:396-402 — with no i18n-labelled UI
control anywhere that lets an author toggle them. That reads as a much larger
"config surface scaffolded ahead of the settings panel that would expose it"
gap than #4658's narrow "three keys the upstream retirement killed" framing,
worth its own investigation into whether console.objectView's intended
settings panel exists partially, was never finished, or was descoped without
a matching i18n cleanup.

Other namespaces worth a look (CONFIRMED / NEEDS-REVIEW, from the same run)

NamespaceConfirmedNeeds-review
console.objectView11638
workflow544
publicForm.demo360
appDesigner2034
configPanel160
renderer130
table102
report101
search90
form82

publicForm.demo (36/36 confirmed, spot-checked: zero hits anywhere for
publicForm.demo.* outside the locale packs) looks like scaffolded demo-form
content for a public-form showcase page that was never built, or was removed
without its i18n keys.

Suggested scope for whoever picks this up

Re-run node scripts/check-i18n-dead-keys.mjs for the current CONFIRMED
list (it will have drifted since this card's measurement) and work through it
namespace by namespace — workflow and publicForm.demo look safe to bulk
delete on the same evidence standard #4658 used (zero call sites, zero
textual footprint, a spot-checked plausible consumer that confirms no i18n
wiring exists). console.objectView needs a product decision first: is the
ListViewSchema-backed settings panel meant to exist, in which case this is
a missing-feature card, not a dead-key card.

Whether to red-ify check-i18n-dead-keys.mjs

Explicitly deferred by #4658's own ruling — it stays report-only
(--strict exists but nothing calls it). This card's data point: 242/626
(38.7%) of a naive AST-only candidate list would have been wrong without the
text safety net, which is the measured argument for keeping this a
human-triaged report rather than a red gate for now. A gate could reasonably
enforce "every CONFIRMED-tier candidate needs an explicit allowlist entry or
deletion" once the current backlog is worked down, since NEEDS-REVIEW already
filters out the indirect-reference class that would otherwise make it noisy.

Metadata

Metadata

Assignees

No one assigned

    Labels

    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpm:queue

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions