Skip to content

action-param-dialog renders a hardcoded English Select... placeholder — untranslated in zh, and ASCII after #3878 moved the packs to U+2026 #4386

Closed

Description

@yinlianghui

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

  1. It is hardcoded English. action-param-dialog.tsx imports no translation hook at all — grep for useObjectTranslation / useTranslation / @object-ui/i18n over the file returns nothing — so a zh-CN user opening an action's parameter dialog sees Select... in an otherwise Chinese dialog. This is the hardcoded-English family (Console: list-view chrome (Grid / Gallery switcher, 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.
  2. 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

  1. self-assigned this
    on Aug 12, 2026
  2. yinlianghui commented on Aug 12, 2026

    @yinlianghui
    CollaboratorAuthor

    CLAIM — PM seat session_017Qqyix2QcnpUC9XeYVDzx3, branch claude/issue-4386-action-param-select-placeholder, one dev agent, one PR, Fixes #4386. Promoted straight to pm: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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions