diff --git a/versions/1.2.md b/versions/1.2.md index f321557..63e6265 100644 --- a/versions/1.2.md +++ b/versions/1.2.md @@ -1595,6 +1595,11 @@ entities: The set of languages the whole stack supports is a platform concern, never defined per module. The top-level `languages:` only declares which languages this module provides. +A [report](#reports) reads the same data, so it reads it in the same language: a column bound to a translatable property is shown translated, whether the report is rooted at the multilingual entity or reaches it through a relation. A report grouping by a multilingual nomenclature therefore shows the same term as the pages beside it — before this was stated, a status column could read `DRAFT` next to a list reading the translated word, from the same record. + +> **Normative.** +> Every read of a translatable property of a `multilingual: true` entity is served in the caller's requested language, and a report column bound to such a property is such a read. What a report **matches** is unaffected: a report's `filter:`, its [`scope`](#lifecycle-scope) and any condition applied to it are evaluated against the stored, untranslated values — so translating content can never change which rows a report returns, only how they read. A property with no translation for the requested language, and a caller who requested none, both read the stored value. + #### UI labels Generation also emits a per-project translation catalogue for every generated label: entity names (a humanised singular plus a plural form), field labels, form and report names, and report column headers. The default locale is generated for you; a translator adds a sibling locale folder with the same keys. The UI renders through these keys, falling back to the baked default label for any key a locale has not translated. @@ -1661,7 +1666,7 @@ One line per construct, linking into the chapters above. | [`seeds`](#seeds) | initial data, CSV-backed sets, translations | | [`stage`](#stage--what-a-status-means-to-the-lifecycle) | classify a status: draft / live / cancelled / void | | [status names](#status-references--name-not-number) | reference a status by its seeded name, not its positional id | -| [`multilingual` / `languages`](#multilingual-data) | translation tables + read-time translation overlay | +| [`multilingual` / `languages`](#multilingual-data) | translation tables + read-time translation overlay, on entity reads and report columns alike | | [`permissions`](#permissions) | roles | ### Planned — recognised but not yet implemented