A template key and its params, become text in the recipient's language.
The locale is the recipient's, never the request's. A French-speaking guardian invited by an
English-speaking member of staff reads French. Getting that backwards is invisible in every test
written by one person in one language, and obvious to the person who receives it.
Three sources, in order: a template the application declared outright, the translation catalogue,
and failing both the key itself.
That last fallback is the point. A missing translation renders its key, never an empty string:
an empty subject looks like a broken mail client and gets ignored for months, while
guardianship.consent_needed is visibly ours and gets reported the same day.
A template key and its params, become text in the recipient's language.
The locale is the recipient's, never the request's. A French-speaking guardian invited by an English-speaking member of staff reads French. Getting that backwards is invisible in every test written by one person in one language, and obvious to the person who receives it.
Three sources, in order: a template the application declared outright, the translation catalogue, and failing both the key itself.
That last fallback is the point. A missing translation renders its key, never an empty string: an empty subject looks like a broken mail client and gets ignored for months, while
guardianship.consent_neededis visibly ours and gets reported the same day.