LLMs translate UI copy remarkably well — when they can see what the string is. A key named home.cta.start with the text "Start" could be a button, a noun, or a menu label, and each translates differently. Feed strings with screenshots, flow notes, and a glossary; gate every market on a native-speaker review before shipping.
Tier: Core · Workflow area: Styling, responsive & i18n
The difference between machine translation that embarrasses you and LLM translation that reads native is almost entirely context engineering, plus the humility to keep a human gate on the way out.
du vs Sie, tu vs vous — decided before translating, not per string).Build the context pack once per project. This is what separates this playbook from feeding a JSON file to a chatbot:
You are translating a B2B invoicing web app from en-US to de-DE.
Audience: finance professionals; register: formal (Sie). Attached:
(1) glossary.md — do-not-translate list and mandated term choices,
(2) six annotated screenshots of the main flows,
(3) flow-notes.md — one paragraph per screen on what the user is doing.
Rules: preserve ICU syntax exactly ({count, plural, ...}, {name});
never translate interpolation variable names; keep markup tags and
their nesting; German compounds tend long — flag any translation
likely to exceed ~130% of the source length as TIGHT.
Translate in batches with per-string context columns. Send strings as a table, not a blob:
Translate the attached 80 rows. Input columns: key | source string |
where it appears (screen + element type: button/label/toast/empty-state)
| max length if constrained. Output columns: key | translation |
confidence (high/medium/low) | notes. Mark LOW anything where you had
to guess referent, gender, or number — do not guess silently. "Start"
on a button and "Start" as a column header are different words in German;
the element type column is why you know which is which.
The confidence column is the routing mechanism: high-confidence rows go to reviewer skim; low-confidence rows go to reviewer attention. A model that marks nothing low is not being honest — say so and re-run.
Machine-check before any human sees it. Cheap automated validation catches the mechanical breakage: run the translated files through your framework's parser (ICU syntax errors), diff the interpolation variables per key (source {name} must appear exactly once in the translation), and check markup tag parity. An agent can write this validator in ten minutes; it saves reviewers from burning attention on {nom} bugs.
Run the pseudo-and-real layout pass. Load each locale in the running app (or Storybook) and screenshot the main flows. German and Finnish break buttons; Arabic flips the layout (test RTL explicitly if in scope); Japanese changes line-breaking behavior. Route every TIGHT-flagged string plus every visual overflow to a fix: shorter translation, text-overflow handling, or a layout change. This pass is agent-automatable with a browser tool driving the locale switcher.
Gate each market on native review, structured. Give reviewers the same context pack plus a triage protocol so review is hours, not weeks: skim high-confidence rows for tone drift, scrutinize every low-confidence and TIGHT row, and spot-check 10% at random against screenshots. Reviewer verdicts per row: approve / fix (with correction) / escalate. Corrections flow back into the glossary and tone rules — the context pack compounds, so batch two reviews faster than batch one.
Ship through the TMS, not around it. Import the approved batch into Lokalise/Crowdin (or your git-based flow) so translation memory records every approved pair. Next quarter's fifty new strings get pre-filled from memory, LLM-drafted for the remainder, and the same gate — the pipeline is now standing infrastructure.
Formal/informal address is a one-way door — mixing Sie and du across screens reads as broken to every German user, and retrofitting is a full re-review. Decide register per language in the context pack before the first batch, and make it the first thing reviewers verify.
strings.xml / String Catalogs; add device-size screenshots since mobile buttons hit length limits hardest, and remember store-listing metadata needs the marketing lane, not this one.LLM translation quality is a function of what the model can see — element type, screen, audience, register — and shipping quality is a function of who checks it. Invest in the context pack, automate the mechanical validation, and never confuse "fluent" with "reviewed": the human gate is what makes the speed safe.