Skip to content

finding(fields): LocationField's THIRD refusal sentence (the #6715 residue arm) is still hard-coded English after the #6755 ruling keyed the other two #6888

Description

@os-sam

Filed unassigned by the dev seat implementing objectui#6755, as an out-of-scope finding. Recording, not choosing.

Dedup before filing: repo-scoped REST list of all 252 open issues (3 pages, state=open), title+body grepped for 6715 / residue / refusedResidue / is not a number / plain decimals — no match. Control: grepping the same corpus for LocationField returns objectui#6755, so the read was live rather than empty.

What

objectui#6755 ruled (2026-08-29, maintainer) that a widget's own refusal sentence goes through useFieldTranslation + FIELD_DEFAULTS, and locked scope to three sentences: ObjectField's Invalid JSON and LocationField's two refusal sentences.

LocationField now has three. The card was measured on 2026-08-29 06:24 and the ruling written at 14:53; objectui#6715 added a third refusal arm — residue, for a half that is only partly a number (12abc, 34) — whose sentence is built by refusedResidueMessage() in packages/fields/src/widgets/LocationField.tsx:

`Not saved: ${named} ${verb}. Enter plain decimals (example: 30.2741, 120.1551).`

with verb being is not a number / are not numbers and named being latitude "12abc"-style. It is a string literal in the source, exactly like the two the ruling keyed.

Why it is filed rather than folded into the #6755 PR

The ruling says 「范围锁定这 3 句」 and names one same-class instance (objectui#4752) that must NOT ride along. This is a fourth sentence the ruling could not have seen — but reading a scope lock as "except when I find one more" is the dev seat's call to make, not mine. So the #6755 PR keys the three ruled sentences and leaves this one, and no test in that PR pins the residue arm's English text (pinning it would read as endorsement).

The measured consequence of leaving it

All three arms render through the SAME <p> element and the same refusalError state. After #6755 lands, that one line speaks the reader's language when the format or range arm fired and English when the residue arm did — the same shape objectui#4028 was reported for ("four Chinese labels around one English one"), inside a single widget.

Cost if it is ruled in

Mechanically identical to what the #6755 PR already does, one arm wider: one key (fields.location.refusedResidue — an interpolated one: the half names and the quoted text are data), ten pack entries, and it becomes bound by check:i18n-drift like the other three. The English default stays byte-identical, so objectui#6715's own pins and plugin-form's ObjectForm.locationResidue.test.tsx are unaffected.

Not measured: whether the interpolation should carry named/verb as holes or be keyed per arity (_one / _other). That is a real authoring choice — verb is grammar, and a pack whose plural rules differ cannot use an English verb form as a hole — and it is why this is not a two-line copy of the other two keys.

Related

objectui#6755 (the ruling and the PR that keys the other two) · objectui#6715 (added this arm) · objectui#6716 (added the first two) · objectui#4752 (the same class in @object-ui/components, still its own card)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions