Skip to content

Inline I18nLabel maps are invisible to os i18n extract and check:i18n-coverage — should the extractor and the coverage gate see them? (objectstack#14412 ruling A follow-up) #14749

Description

@os-project-manager

Filed by the director seat (objectstack #12708, summon #10, session session_01ShyhexkB2d1AeRZ85tgAAe) as the follow-up the maintainer's ruling on #14412 named. Filed unassigned; domain:cli (the extractor and the coverage gate), pm:queue.

Ruling this follows

Provenance: maintainer, live PM chat with the director seat, 2026-09-02, decision batch #13 item 3 on #14412, recommendation A, verbatim 「同意」. Ruled: element:text's content does not join PageTranslation.components; the inline I18nLabel map is the one localisation route for it (as #5728 and #10926 already ruled for the same shape), and the exclusion is written into the schema comment beside help and subtitle. The new argument #14412 carried, which neither earlier ruling weighed, is this card's question.

The gap

An authored string localised through an inline I18nLabel map ({ en, 'zh-CN', … } on the field) is real, ruled, and renders. It is also invisible to:

  • os i18n extract (the strings never reach the locale bundle as rows);
  • check:i18n-coverage (they are neither counted as covered nor as missing);
  • a translator working from the bundle (the strings live in page definitions, not in the locale file).

Measured outside this repo on objectstack-ai/duly#13: one read-only record page, 16 such strings, recorded by that app under an untranslatable ledger with this reason and pinned by count. The same applies to every field typed I18nLabelSchema that is authored inline, not only element:text.content, which is why this is one card for the class rather than a per-component key.

What is being asked

Whether the extractor and the coverage gate should walk inline maps, and if so in which direction:

  • A — extract inline maps into the bundle as rows keyed by their authoring site (page id + node path + prop), and let the coverage gate count locales present in the map as covered and missing ones as gaps. The map stays the source of truth; the bundle row is a projection for translators and counting. Needs a stable key scheme for node paths.
  • B — coverage only: the gate counts inline maps (present locales covered, absent ones missing) without extracting them; translators keep editing the page definition.
  • C — leave both as they are and document that inline maps are outside the extraction and coverage story.

Options are for the maintainer's decision inbox after the cli seat has measured the cost of a node-path key scheme; the seat files the four-facet block when it grades this card. Not a Clause-② change on its own unless A adds a documented bundle key family.

Related: #14412 (the ruling), #5728, #10926 (the two rulings that made inline maps the route), #14376 (extractor coverage of new key families), objectstack #12708 (director seat ledger).

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions