Skip to content

spec: a report column of a multilingual entity is read in the caller's language - #25

Open
delchev wants to merge 1 commit into
mainfrom
spec/multilingual-reports
Open

spec: a report column of a multilingual entity is read in the caller's language#25
delchev wants to merge 1 commit into
mainfrom
spec/multilingual-reports

Conversation

@delchev

@delchev delchev commented Aug 15, 2026

Copy link
Copy Markdown
Contributor

What this clarifies

The Multilingual data chapter already says that every read of a translatable property is served in the caller's requested language. It never said whether a report column counts as such a read — and a report is not an entity read at all, it is an aggregation over stored values, so an implementation could reasonably go either way.

In practice implementations went the other way, and the result is visibly wrong to a user: a report grouping by a multilingual nomenclature showed the stored term (DRAFT) right beside a list page showing the translated one, for the same record.

What it says

Two sentences of prose plus a Normative paragraph in Multilingual data → Data, and the Appendix A row:

  • A report column bound to a translatable property is a read of that property, so it is served in the caller's requested language — whether the report is rooted at the multilingual entity or reaches it through a relation.
  • The boundary that makes this safe: what a report matches is unaffected. A report's filter:, its 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.

No new construct and no new keyword — this constrains what a conforming generator must do with the existing multilingual: attribute.

Reference implementation

Proven out in the reference implementation by eclipse-dirigible/dirigible#6750 (issue #6544): the translated column is emitted as a COALESCE over a LEFT JOIN to the entity's translation table keyed on a bound language parameter, so the fallback and the filter boundary both fall out of the SQL rather than being enforced separately. Its integration test asserts the same published report returning the translated term under one request language and the stored one under another.

…s language

The chapter already said every read of a translatable property is served in the
caller's requested language, but left open whether a report column counts as
such a read - and in practice it did not, so a report grouping by a multilingual
nomenclature showed the stored term beside a list showing the translated one.

State it normatively, and state the boundary that makes it safe: what a report
MATCHES is unaffected - its filter, its 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.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant