Universally Documentation

Step-by-step guides, multilingual SEO tips, and best practices to help you translate and scale your WordPress website.

Translation states

Every string on the Translations screen carries a state, shown as a coloured dot beside it. This page says what each state means, what put the string there, and whether it needs anything from you. It also covers the two things that cause the most confusion: why the list does not show your untranslated strings by default, and why a string can be missing from it entirely.

The states

Dot State What it means
Amber Missing No translation for this language yet
Amber Retry translation Translated, came back identical to the source, and due another attempt
Grey Unreviewed Machine translated, nobody has read it
Green Verified A person wrote it or confirmed it
Blue Unchanged Came back identical to the source, and that is final

Missing and Retry translation share the same amber dot, so you cannot tell them apart by colour. Hover any dot to see its name.

Only two of these ask anything of you: Unreviewed, which is waiting to be read, and Unchanged if you happen to disagree with it. The rest resolve on their own, and a Missing string is translated when the page is next requested in that language.

The dots are states. The Status options in the filter drawer are a different list, and the next section covers how they map onto each other.

The list shows translated strings by default

This is the part worth reading twice, because it changes where you look for things.

The Status options in the filter drawer are Translated, Missing, Unreviewed, Verified and Unchanged. Translated is the default, and it means what it says: strings that have a translation in the language you are viewing. A string with no translation yet is not in that list.

So if you are hunting for work to do, Missing is the option you want, not the default view. Untranslated strings live there and nowhere else.

There is no option for Retry translation. Those rows carry a translation, so they appear under Translated, and they are also collected under Missing because they have no usable translation yet. They are the one state that shows up under both.

"Pending translation" and "Missing" are the same thing

An untranslated row shows the grey italic text Pending translation in its translation cell, while its dot reads Missing. Two labels, one state: the cell is telling you there is nothing to show, and the dot is telling you why. You will see these rows under the Missing filter.

Nothing is queued or in flight when you see this. Translation happens when a visitor requests the page in that language, so the string sits in this state until that happens, however long that is.

A string that is not in the list at all

There are two different reasons a string you expect is nowhere to be found, and they need different responses.

It has a translation but you are looking at the wrong filter. Covered above: check Missing.

Universally has never seen the text. The list only contains text that has actually been processed. A string enters it the first time the page carrying it is rendered, which means text on a page nobody has requested in any language is absent rather than Missing. There is nothing to show because the page has never been read.

So if a phrase is missing from both Translated and Missing, visit the page it lives on. If it still does not appear, it is either excluded or not in the served HTML. See Include and exclude CSS selectors and Translate dynamic and JavaScript content.

Unchanged, and why it is not a failure

Some text is the same in both languages: a product name, a number, an acronym, a word both languages share. When a translation comes back identical to the source, Universally records that rather than storing it as a translation, and after a few attempts it settles on Unchanged and stops retrying.

The hover text on the dot says it plainly: same as the original, this text does not change in this language. Between those attempts the state is Retry translation, which is the same situation before it has been concluded.

Using Translate with AI on such a string tells you directly: the result came back identical to the original, and you can still edit it by hand.

Editing changes the state

Saving an edit marks the string Verified, because a person wrote it. There is no separate state for "edited but not reviewed": your edit is the review.

Both directions are available from the row: Mark as Verified and Mark as Unreviewed, which is how you undo a verification you are no longer sure about. Verifying needs the owner or admin role. See Edit translations manually.

Placeholders can block a save

Some strings contain placeholders standing in for markup that was in the original sentence, such as a link or a bold span. If your edit loses one, or repeats it, the save is refused with:

This translation is missing or changed a placeholder and can't be saved.

The editor also resists deleting a placeholder outright, so the message is a backstop rather than the first line of defence. Keep every placeholder, once each, and the save goes through. Your text is not lost when this happens: the cursor is returned to the field so you can fix it.

Placeholders here mean markup, not variables. Universally has no handling for %s, {{name}} or similar template tokens: those are ordinary text and are translated like anything else.

There is no processing or progress screen

Translation is not a batch you watch. There is no crawl, queue or progress indicator, because nothing is processed ahead of time: a page is translated the first time it is requested in a language, and cached from then on.

That means the way to get a language translated is to visit its pages, and the way to see how much has been translated is the word count on the project, plus the status options on this screen. See Track your usage.

Was this helpful?