English is the source; other locales use a prebuilt pack when complete, otherwise translation memory plus machine translation per key
When a report is generated for a non-English locale, the message pack is resolved at that moment. The order of resolution is deterministic and identical for every run.
Step 1 — English and complete packs#
For en, the source pack is returned as-is: its status is translated by construction. For any other supported locale, the locale lookup first checks for a complete prebuilt pack; if the locale ships one, that pack is returned immediately with status translated — no external work happens for those locales.
Step 2 — fill the gaps per key#
If no complete pack exists, resolution walks every message key: the English source text is looked up in the workspace's translation memory first (previously approved text is reused verbatim); only keys the memory does not cover go to machine translation for that locale. Each key's review state is tracked as it lands.
Step 3 — report status honestly#
The resolved pack comes back with translationStatus: "translated" only when every key was approved; otherwise it is "fallback" — meaning some strings are machine output not yet approved, even though the pack is fully readable. Nothing pretends to be complete: the status travels with the pack the report was built from (see Review fallbacks).

