What do translation statuses mean?
A translation's status is deliberately small: draft or approved. Everything else you might expect — "needs review", "outdated" — is not a status here, and knowing that saves you looking for a workflow that does not exist.
The two statuses #
| Status | What it means |
|---|---|
| draft | The value exists and is not vouched for. Imports, syncs and machine output land here |
| approved | Someone stands behind it. A value you type yourself is approved, because editing it is vouching for it |
A key with no value in a language has no status at all — it is simply missing, which is a different question from "what state is this translation in".
Why your own edits are approved immediately #
Type a translation and it saves as approved. There is no self-review step, because a review queue that you feed and then approve yourself is a formality with a UI. Where review matters is other people's output — machine translation, an import, a teammate's pass — and that arrives as draft precisely so it can be looked at.
Publishing is the separate axis #
Status is about confidence. Publishing is about reach. They are not stages of one pipeline:
- Publishing takes what is eligible and pushes it to the CDN
- The default gate is approved only
- The dashboard's publish popover deliberately widens it to draft and approved, so what you see listed as publishable is what actually publishes
That widening is worth knowing about, because it means a draft can go live from the dashboard. If you rely on draft meaning "not live", check what the publish action lists before confirming it.
Filtering #
The filter has one more option than the status field does:
| Filter | Finds |
|---|---|
missing | Keys with no value in that language — what to translate next |
draft | Values nobody has vouched for |
approved | Values someone has |
all | Everything |
missing is the one to reach for when you are looking for work. Filtering by a language shows keys that have that language; filtering by missing shows keys that need it.
What is not modelled #
Being explicit, because both are reasonable expectations:
- No "outdated" flag. Editing a source string does not mark its translations stale, and nothing goes offline on its own. Catching drift is your process, not a state the platform tracks: re-translate the keys you changed, in the same pass in which you changed them.
- No "needs review" state. Draft is the closest thing — it means unvouched-for, and review is the act of turning it into approved. See How do I review and approve translations?.
From the CLI #
better-i18n check:missing # in code, not in the project
better-i18n check:unused # in the project, not found in code
better-i18n publish:status # what would go live right nowpublish:status is the honest answer to "what state is my project in" — it lists what is pending rather than counting states.
Better I18N