Docs · Features
QA checks
Every segment a machine translates is checked before it is trusted. A check never rewrites your text; it flags the segment, sends it to review, and keeps damaged text out of translation memory.
What it does#
Each segment carries a status and a list of quality flags. The status says where the segment is in its life (untranslated, translated, needs review, approved); the flags say what a machine check found. Read them together: a segment can be translated and still carry a flag that makes it unshippable.
Flags fall into two kinds. Hard findings, such as broken inline tags, changed numbers or a dropped placeholder, keep the segment out of translation memory and, for tag damage, out of a delivery until a person fixes it. Soft findings send the segment to review but do not block the file. The same flags show in the editor, in doc show --detail, in the segments API and in MCP results.
The flags#
| Flag | What it means |
|---|---|
refusal | The engine answered with a refusal or commentary instead of a translation. The text is quarantined for review and never stored as a translation. |
nontranslation | The output does not read as a translation into the target language, for example the source text came back unchanged. |
tag_integrity | Inline formatting tags were dropped, added or damaged. Blocks export of that segment until fixed. |
placeholder_integrity | A placeholder such as {0}, {name} or %s was dropped, added or duplicated. Kept out of translation memory. |
number_integrity | A number in the source is missing or different in the translation. |
glossary_violation, dnt_violation | A required glossary term was not used, or a do-not-translate term was translated. |
review_hold | One of the review-hold checks below fired. Soft: the export still writes the text. |
whitespace | An interior double space, or whitespace the engine added at the edges. Soft. |
char_limit | The translation is longer than the segment's character limit. Soft. |
qe | A quality-estimation score from the workflow's QE gate fell below its threshold. See Quality judges. |
fix_reverted, fix_term_regression | An automated fix was discarded because it broke a term, or was kept while a term issue remains. |
source_fallback | The source text was used in place of a translation. |
source_changed | The source text changed after the segment was translated, so the translation needs review. |
step_error | A workflow step failed on this segment. |
Review holds#
Some engine output is wrong without being broken. Three checks catch the common cases and set review_hold. They run only on output from a real engine, send the segment to needs review with a badge naming the reason, and keep the text out of translation memory until a person saves or approves it, which clears the hold. They never change the file: the export still writes the translation, while connectors hold the unit back like any other segment that needs review.
- Ambiguous date. A date written in numbers whose day and month could be swapped, and that a reader of the target language would read differently from what the source means. A US
10/11/2026(11 October) written as German10.11.2026, or kept as10/11/2026for Hebrew or Thai readers, is held. A correct conversion (11.10.2026), a date whose day is above 12 (25/12/2026) and the same day-first convention on both sides pass. Identifiers are skipped, and only years 1000 to 2999 count. - Line breaks differ. The translation has more or fewer line breaks than the source, for example a one-line table cell that came back on two lines. HTML, XML, Markdown and other markup where a line break is just a space are not checked, and a subtitle cue joined into one line passes.
- Words joined at a formatting change. In German, Dutch, Finnish, Korean, Turkish, Arabic and Hebrew, two words the source separates with a space next to a formatting change (a bold word, for example) came back written together and do not form a plausible compound. Real compounds such as Benutzername pass.
Placeholders that may move#
Languages order words differently, so a translation may legitimately move a placeholder. A placeholder that names its argument, such as %1$s, {name}, %(name)s or an XLIFF placeholder with an id, may move anywhere in the translation. A placeholder that does not name its argument, such as %s, %@ or {}, must keep its order, because moving it would swap values. Dropping, adding or duplicating any placeholder is still a finding.
Product names and code written in Latin letters no longer count as the wrong script in a non-Latin target, as long as the translation contains some text in the target script.
Plural forms#
Languages have different numbers of plural forms: English has two, Polish and Russian have more, Arabic has six. When a target language needs a plural form the file does not have, it is filled with the plural translation (which keeps the count placeholder), so a program never shows English or a blank for some numbers. The singular is used only where the target language's rule applies it to the number one, or when there is no plural translation. A form that already exists in the file is never replaced. This applies to gettext catalogs, i18next JSON, Qt Linguist, Rails YAML, Fluent, ARB, Android and Apple resources. Filled forms can read a little roughly for some counts; review them in the exported file.
Sentence splitting#
New documents are split into sentences with abbreviation-aware rules: a sentence does not end after e.g., incl., a title such as Dr., a measure abbreviation before a number, or a single initial. The rule version is recorded on each document, so documents uploaded earlier keep the split they were translated with, and their segments, exports and translation memory alignment do not move. Custom SRX segmentation rules still take precedence.
Bilingual files#
A vendor bilingual file (Trados, memoQ, Phrase, Wordfast, TagEditor or zipped XLIFF) declares its own target language. It is translated only into that language. If the project has no matching target language, the upload is refused with a message naming the file's language, the project's languages and both fixes, and nothing is stored.
Works with#
- Documents: flags show in the editor next to the segment, and the export guard reads them.
- Translation memory: hard findings and review holds keep text out of memory until a person approves it.
- Glossary: term and do-not-translate checks use the glossaries the workflow step pins.
- Quality judges: a QE gate adds a scored check on top of these deterministic ones.
- File formats: each format decides which parts become protected tags and placeholders.
Current limits#
The joined-words lists are short on purpose; a German content-word join without a change of case can pass unflagged.
A price written out in words stays held for review.
Some formats still treat named placeholders as fixed-order (Salesforce STF arguments, TOML Go actions, server-page expressions and subtitle codes). They are held on reorder, which is safe but stricter.
Segments ingested before the free-order placeholder rule keep the stricter fixed-order behaviour; upload the file again to pick up the new rule.