---
title: "Translation Results"
description: "The notification a translation run ends in – and where to find the reason a segment kept its source text."
canonical_url: "https://kirby.tools/docs/content-translator/panel/translation-results"
---

# Translation Results

> The notification a translation run ends in – and where to find the reason a segment kept its source text.

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.

<note>

Keeping the source text never empties a field. Re-running after fixing the cause is safe.

</note>

## Finding the Reason

Notifications report counts, not causes. The browser console names each rejected segment:

```text
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](/docs/content-translator/advanced/hooks#drop-reasons).

Runs that reach PHP – DeepL, the CLI, and `Translator` calls from your own code – fire [`content-translator.translate:warning`](/docs/content-translator/advanced/hooks#content-translatortranslatewarning) 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.

---

Every page of this site as Markdown: <https://kirby.tools/sitemap.md>
