Translation Results
Every run ends in one notification, picked by how many text segments the provider actually translated.
A text segment is one piece of text handed to the provider: a field value, the text of a block, a single structure or table cell. One field can hold many, so the counts run higher than the number of fields in the form.
What You See
Content translated: every translatable segment came back translated. A batch run says Content translated for selected languages instead.
No translatable content found: nothing translatable was collected. Either the blueprint marks no field translatable, or every value is one a provider would only corrupt – a price, a URL, a number. A narrow fieldTypes or a stray translate: false are the usual causes.
of {total} text segments kept their source text: part of the response was unusable. Those segments stay in the source language, the rest is saved.
None of the {total} text segments could be translated: the provider answered, but nothing it returned could be applied. Usually a configuration problem rather than one bad field.
Failed to translate into {languages}: a batch run lost one or more languages outright. It opens a dialog rather than a notice and replaces the counts. The languages that did translate stay written, and the console names the cause.
No importable content found: an import found nothing to copy – no syncable field, no title, no slug. Imports copy rather than translate, so they report no segment counts.
Both counting notifications stay on screen until something replaces them.
Finding the Reason
Notifications report counts, not causes. The browser console names each rejected segment:
Rejected "intro" (de): placeholder mismatch, expected 0,1, got 0. Keeping source text.
Field key, target language, and the check that rejected it. The language code is part of the line because a batch run repeats every field once per language. AI runs add what the check expected and what it got; runs that reach PHP log the reason alone. For the full list of reasons, see Drop Reasons.
Runs that reach PHP – DeepL, the CLI, and Translator calls from your own code – fire content-translator.translate:warning for the same rejections. Wire it to your logger to catch drops where nobody is watching a console. Panel AI translation runs in the browser and never reaches the hook.