Translation context
The notes, screenshots, and limits attached to a string so a translator knows whether 'Open' is a button, a status, or an adjective.
See it
What it is
A translator working in a TMS sees a list of strings, not your app. Handed the bare word 'Open', they cannot tell if it is a button verb, a status adjective, or the opposite of closed on a shop hours widget, and most languages need a different word for each. Context is the metadata you attach so they can decide: a one-line description, the screen or component name, a screenshot, a character limit, and what each placeholder will contain at runtime.
In practice it lives in three places. The key itself (billing.invoice.download_button beats btn_2). A description or comment field carried by the catalog format: in gettext, descriptive notes go in extracted comments (the '#.' lines), while msgctxt is a different tool entirely, a disambiguator that is part of the lookup itself, so two identical msgid values with different msgctxt are two separate messages. Every TMS has a description slot. And visual context: auto-captured screenshots from your test suite, or in-context editing where the translator types on the live rendered page.
Gotcha: comments in your source code do not reach a translator unless the extractor is configured to carry them, so half the teams that carefully document strings ship nothing. The other classic is key reuse: sharing one 'save' key across a form button and a menu item locks both meanings to one translation forever, and the language where they differ will always read wrong somewhere.
Ask AI for it
Add translation context to every key in this message catalog. For each entry, attach a description saying where the string appears and what grammatical role it plays (button label, page heading, error toast, inline status), the component or route it renders in, the max character budget before the layout breaks, and a plain-English note for each placeholder describing the value it receives. Rename any key that is generic (btn_1, label_2) to a namespaced, meaning-carrying key. Flag any key currently reused in two unrelated places and split it.