Translation workflow — visual diagrams
End-to-end visual guide: source → translate → review → publish → ship, with per-state actions, quality gates, and a guided Get-to-CDN checklist.
Translations move through five stages. Each stage has its own quality gate and its own place in the dashboard. This page shows the flow, the gates, and what to click when something is stuck.
The flow at a glance
Per-language readiness — what the numbers mean
The Quality & Review tab shows five counters per language. Each tells you exactly which gate is blocking you from publishing that language:
| Column | What it counts | How it gets unstuck |
|---|---|---|
| Filled | Translations present and non-empty | AI translate, or edit cell manually |
| Empty | Keys with no value for this language | AI translate, manual entry, or remove the key |
| Stale | Translations where the source changed after the target | "Refresh stale" — rewrites only stale rows |
| Unapproved | AI/human writes pending review | Approve per-cell, or bulk-approve in Quality panel |
| Errors | Quality-check violations | Quality panel → Issues → fix or dismiss |
'Ready' is a lie when unapproved > 0
errors === 0 and empty === 0. With the default policy ( review: ai_only), AI translations still need approval before they ship to the CDN. Check the Unapproved column before publishing.First-time setup checklist
- Push source for
en— 100% filled is required for any publish. - Add target languages in project settings. They appear as empty columns in the editor.
- Translate all missing from the editor toolbar (per language) or Translate all languages for parallel runs.
- Review the
Unapprovedcount — open the Quality tab, bulk-approve AI generations, or edit per cell. - Publish a version (e.g.
production). Approved keys ship to the CDN tag. - Ship by pointing your app at the tag (
version: production). Floating tags update on the next reload.
Stale lifecycle
When the source string for a key changes, every other language is marked stale and a stale_target quality issue is raised. Until you refresh, the old translation may be wrong (different numbers, new features).
Review modes
The default review policy decides whether a write blocks publishing:
| Mode | Behavior | When to use |
|---|---|---|
| off | No review required; everything publishes | Internal tools, prototypes |
| ai_only | Only AI-generated writes need approval | Production with human spot-check |
| selected | Only listed languages need review | Mixed markets, gradual rollout |
| production | Only the production tag needs review | Strict staging → prod gates |
| all | Every write needs approval | Regulated content |
Status glossary
- Origin:
human,ai,memory(TM hit),sync,import,restore,system. Decides whether review policy applies. - Revision: every write appends one. History drawer shows the chain.
- Approved: a revision was reviewed and pinned as the active shipping revision.
approvedRevisionId === currentRevisionId. - Stale: source changed since this translation was written; AI or human refresh recommended.
- Block: quality-check failure preventing publish (configurable in project quality settings).
Get-to-CDN banner
The catalog editor shows a sticky banner above the AI toolbar that lists everything still blocking publish, in the exact order you need to fix it. The banner now has a single Next button for the current blocker; Review filters the catalog to unapproved keys for that language. Click Next to advance, then the banner repaints on the next poll.
How the steps are ordered
- Source ready - is the reference language 100% filled?
- Per target language - empty keys (block) and stale rows (warn; block only if your
blockPublishOnpolicy says so) - Review pending - AI writes that the project's review policy requires approval for
- Publish - aggregate blocker check across every step
Why a banner, not a wizard
The banner never blocks you. You can keep working in the editor while blockers are visible - when you fix something (translate, refresh stale, approve) the banner updates on the next poll (5 seconds while blockers exist, 30 seconds once ready).
Customising actions
lexisync:action CustomEvents on window with a small payload object. The catalog editor listens and forwards to existing flows (runAiTranslate, bulk approve, publish). You can install your own listener to redirect actions to a different UI without touching the banner itself.