Repository navigation
action-param-dialog renders a hardcoded English Select... placeholder — untranslated in zh, and ASCII after #3878 moved the packs to U+2026 #4386
Description
Found while executing #4377 (the metadata-admin designer table's ellipsis convergence), on branch claude/issue-4377-designer-table-ellipsis. Out of that card's scope — its dispatch scoped the change to packages/app-shell/src/views/metadata-admin/i18n.ts alone — so recorded separately.
The line
packages/components/src/custom/action-param-dialog.tsx:198 — the placeholder prop passed to the SelectValue inside the select branch's SelectTrigger:
placeholder={param.placeholder || 'Select...'}(The full JSX element is written here without its opening angle bracket on purpose: GitHub's body sanitizer strips < followed by a letter, and it silently ate this snippet on the first save of this issue.)
The fallback fires whenever an action parameter of kind select declares no placeholder of its own, which is the ordinary case for hand-written action metadata.
Two defects on one literal
- It is hardcoded English.
action-param-dialog.tsximports no translation hook at all —grepforuseObjectTranslation/useTranslation/@object-ui/i18nover the file returns nothing — so a zh-CN user opening an action's parameter dialog seesSelect...in an otherwise Chinese dialog. This is the hardcoded-English family (Console: list-view chrome (Grid/Galleryswitcher,Avg:/Sum:aggregate footer) and the form dialog's a11y fallback text are hardcoded English #4024 and siblings); the sibling cases named there are different sites, and this one is not covered by any of them. - The ellipsis is ASCII. [finding] en 包 32 个值用 ASCII "..." 结尾、113 个用 U+2026 "…" —— 同一屏上省略号两种字形,且九包各自跟着抄 #3878 converged the ten locale packs on U+2026
…per the consistency pass on objectstack#6015, and [finding] The metadata-admin designer's own i18n table kept ASCII "..." after #3878 converged the ten packs on U+2026 — designer panel and console chrome now spell the ellipsis differently on one screen #4377 has just done the same for the metadata-admin designer's own table. This literal is in neither, so it keeps.... Same-screen visible in the same way both of those were: the dialog renders inside the console shell beside placeholders that now end in….
Fixing (1) subsumes (2) — a pack key carries whatever glyph each locale wants — so this should not be fixed as a two-character glyph edit.
Why no gate sees it
packages/i18n/src/__tests__/ellipsis-glyph-3878.test.ts scans pack values and says so in its own header; this string is not in a pack. check-i18n-call-site-keys.mjs reads t() calls and their options object; there is no t() call here to read. all-locales-key-parity and check-i18n-en-drift.mjs likewise never see a string that exists in no pack.
Not a duplicate of #4375
#4375 covers two call sites that assemble a placeholder as t(key) + '...' (plugin-list/src/ListView.tsx:2829, fields/src/widgets/LookupField.tsx:1085). Those have a translated stem and a concatenated literal. This one has no t() at all — the whole string is a literal. Different shape, different fix, third site.
Adjacent, lower-value
examples/schema-catalog/src/schemas/components-form-select/with-placeholder.json sets "placeholder": "Select...". That is an example schema demonstrating the placeholder prop, so the string is sample authored metadata rather than product copy — worth re-spelling to … if someone is in the file, but it is not the same defect and does not need its own card.
Anchor
Verified on origin/main at 079f15571. Related: #4024 (hardcoded-English family), #4375 (the concatenation shape), #3878 / objectstack#6015 (the ellipsis ruling), #4377 (the designer table).
Generated by Claude Code
Activity
yinlianghui commentedon Aug 12, 2026
CLAIM — PM seat
session_017Qqyix2QcnpUC9XeYVDzx3, branchclaude/issue-4386-action-param-select-placeholder, one dev agent, one PR,Fixes #4386. Promoted straight topm:queue/pm:dispatched: user-visible (English in a zh dialog), one line, fix direction settled by the card itself — wiring a translation channel subsumes the glyph; no two-character band-aid.Conflict rule riding on the dispatch: the #4375+#4376 pair is in flight ON the locale packs. So reuse-first — if an existing pack key semantically fits the select placeholder, read it through the package's existing safe-translation pattern and touch no pack file. Only if no existing key fits may a new key be added, and then only AFTER the pair's PR lands (poll), to avoid ten-file pack conflicts. The example-schema string stays as-is per the card's own grading (sample authored metadata, not product copy).
Generated by Claude Code
fix(components): ActionParamDialog's select placeholder reads the `co…