Skip to content
better-i18n.com

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 #

StatusWhat it means
draftThe value exists and is not vouched for. Imports, syncs and machine output land here
approvedSomeone 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:

FilterFinds
missingKeys with no value in that language — what to translate next
draftValues nobody has vouched for
approvedValues someone has
allEverything

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 #

Bash
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 now

publish:status is the honest answer to "what state is my project in" — it lists what is pending rather than counting states.