Check XLIFF and TMX translations offline before you deliver them.
Free guide download? The KvasirQA-1.0.0-guide-and-examples.zip download contains this manual and the practice files only. The steps below need the app (KvasirQA.html and its app folder), which is in the paid download KvasirQA-1.0.0.zip.
KvasirQA reads bilingual translation files and lists problems a reviewer or client would notice: untranslated segments, numbers, tags, links and e-mail addresses that differ from the source, glossary terms that were not used, the same sentence translated in different ways, and punctuation and spacing slips. It never changes your files and never uploads them: it runs in your browser from a folder on your computer. You fix what it finds in your translation tool, export again and check again.
.xlf, .xliff), or TMX 1.4 (.tmx, the TMX 1.4b format). The version and namespace are checked; other versions are refused with a message.Tested with synthetic XLIFF 1.2, 2.0, 2.1 and TMX 1.4 files written to the published specifications. Real Trados, memoQ and Phrase exports have not been tested; vendor-specific files and packages may not work. Free alternatives such as Okapi CheckMate cover similar checks; KvasirQA offers a smaller browser workflow.
KvasirQA-1.0.0.zip into a folder you can find again. Keep KvasirQA.html and the app, docs and examples folders together.KvasirQA.html in Chrome. Drag the file into a Chrome window, or right-click it and choose Open with › Google Chrome.
The practice set describes a fictional kettle brand, “Brightfern”: a segmented English → German XLIFF 1.2 file, an English → French XLIFF 2.1 file, an English → German TMX 1.4 memory and a three-term glossary. The mistakes are planted on purpose.
The 13 planted findings:
| Check | File › segment | What is wrong |
|---|---|---|
| Numbers | kettle manual (de) › 3 | “1.7 litres” became “1,5 Liter”. |
| Tags | kettle manual (de) › 8 | Placeholder tag x:2 is missing in the German text. |
| Links and e-mail | kettle manual (de) › 9 | The support link was changed from /support to /hilfe. |
| Untranslated | kettle manual (de) › 10; app (fr) › hold/s2 | No target text. |
| Glossary | kettle manual (de) › 6 and › 7 | “power button” should be “Ein-/Aus-Taste”; “descaler” should be “Entkalker”. |
| Same source, different translations | de: manual › 4, › 6 and memory › m1; fr: app › start and › start-again | “Press the power button.” and “Start boiling” were translated two ways. |
| Same translation, different sources | app (fr) › filter, › filters | “Filtre” is used for both “Filter” and “Filters”. |
| Target same as source | kettle manual (de) › 12 | “Brightfern” is unchanged — correct for a brand name. Warnings can be intentional. |
| Ending punctuation | kettle manual (de) › 11 | The source ends with “.”, the target has no full stop. |
| Spaces | kettle manual (de) › 11 | Double space in the German text. |
en-US → de-DE). In the example below, the German file disagrees with the translation memory.<sub> text inside an inline code), it turns amber and says Partial result; the files tile shows “N not checked” for unread files. Counts and reports then cover only what was checked, and every report lists what was left out. Units marked translate="no" are listed too, but do not make the result partial.
file › segment), across XLIFF and TMX files.On a narrow window the table becomes one card per finding:
| Button | File | Use it for |
|---|---|---|
| Download CSV | kvasirqa-report-<date>-<time>.csv | Excel, LibreOffice or Google Sheets. UTF-8 with a byte-order mark; one row per finding. Cells that start with =, +, - or @ get a leading apostrophe so spreadsheets do not run them as formulas. |
| Download HTML | …html | A standalone page with files, counts per check and all findings. Open it in a browser and print or save as PDF for a client. |
| JSON | …json | Automation and archiving: every finding with file, segment, languages and details. |
Chrome saves the files in your usual downloads folder. The report reflects the checks that were switched on when you clicked the button.
Units marked translate="no" are skipped and counted in the file card: on an XLIFF 1.2 trans-unit or an enclosing group, or on an XLIFF 2.0/2.1 unit, group or file. The nearest setting wins, so a unit marked translate="yes" inside such a group is checked. Segments locked in your tool by other means are checked like any other segment.
A CSV or TSV file (comma, semicolon or tab; UTF-8) with one term per row:
source,target,language
power button,Ein-/Aus-Taste,de
descaler,Entkalker|Entkalkungsmittel,de
descaling,détartrage,fr
language is optional: de applies to de, de-DE, de-AT…; empty means every target language.|. Matching ignores upper/lower case and only matches whole words.Problems are shown in red under the file or glossary concerned. Other files are still checked.
case.xlf) is still checked.| You see | Cause | Do this | It worked when |
|---|---|---|---|
| Buttons do nothing, page has no colours | Opened from inside the ZIP, or the app folder is missing | Extract the whole ZIP again and open KvasirQA.html from the extracted folder | The green Start here box appears |
| “not well-formed XML (line …, column …)” | The file is damaged or was edited by hand | Export it again from your tool, or fix the XML near that line | The red message disappears after you add the file again |
| “Not a bilingual file: the main element is <…>” | You added the original document or another XML file | Export the bilingual XLIFF/TMX instead | The file card shows its format and segment count |
| “No checkable segments were found” | The export is empty, a TMX has no defined source language, or every unit has <sub> text inside an inline code | Check the export settings in your tool; export a TMX with a specific source language | Segments are counted |
| “Nothing to check in this … file: … marked translate="no"” | Every unit is marked not-for-translation, directly or by an enclosing group or file | Nothing, if that is intended; otherwise export the units that need translation | The file card shows its segment count |
| “Unsupported XLIFF version” / “Unsupported TMX version” | The file is XLIFF 1.0/1.1/2.2 or TMX other than 1.4, or its namespace does not match its version | Export as XLIFF 1.2, 2.0, 2.1 or TMX 1.4 | The file card shows its format |
| Amber “Partial result” line | Some files were not checked, or units were skipped that KvasirQA cannot check (TMX source language undefined, <sub> text inside an inline code) | Fix or re-export the files listed, then add them again; review skipped units in your tool | The line starts with “Scope:” instead |
| “not valid UTF-8” / encoding message | The file was saved in another encoding | Re-export as UTF-8 | The file card shows its format |
| “larger than 50 MB” | Very large file (for example with an embedded original document) | Split the project or check fewer files at a time | The file is read |
| Glossary message in red | No rows with both a source and a target term | Use the source,target,language columns | “… · N terms” appears |
| “No findings match this filter” | Chips or search hide every finding | Click All or clear the search box | Rows appear again |
Support: give the KvasirQA version, your operating system and browser, the step and the exact message, and whether the practice files work. Do not send client files; if needed, send a small made-up example that shows the problem.
Segment text. Text inside formatting and highlight markers (XLIFF 1.2 g, mrk; XLIFF 2 pc, mrk; TMX hi) is kept. Native code (bpt, ept, ph, it; TMX also ut) is left out of the text and counted as a tag. Units whose source or target has <sub> text inside such a code (an XLIFF 1.2 or TMX sub-flow, for example a footnote or a link title) are skipped, counted and the result is marked partial: KvasirQA does not check sub-flow text. translate="no" on an XLIFF 1.2 trans-unit or enclosing group, or on an XLIFF 2.0/2.1 unit, group or file, skips the unit (nearest setting wins). Inline translate="no" markers inside a segment (XLIFF 2 mrk/sm) are not used: that text is checked like the rest of the segment. Whitespace runs are collapsed to one space for comparisons. Segments: segmented XLIFF 1.2 uses seg-source/mrk mtype="seg" (segment = mid); if the target of such a unit has text but no segment markers, the whole unit is checked as one segment; otherwise one segment per trans-unit. XLIFF 2: each segment of a unit. TMX: the source language is the unit's srclang if present, otherwise the header's; every other language variant is a target. Units whose source language is *all*, missing, or not among their variants are skipped and counted, never guessed. Not checked: XLIFF 1.2 alt-trans alternatives and XLIFF 2 ignorable content.
| Check | Severity | Reported when |
|---|---|---|
| Untranslated | error | The source has text and the target is missing or empty. Other checks skip such segments. |
| Numbers | error | The digit sequences differ. A number is digits with optional . , ' or non-breaking-space separators; separators are ignored, so 1,234.5 = 1.234,5 = 1 234,5 (with a non-breaking space). An ordinary space splits numbers; 3.5 and 3,50 differ. |
| Tags | error | The inline codes (type and id) in source and target differ in kind or count. Order is not compared. Compared: XLIFF 1.2 g, x, bx, ex, bpt, ept, ph, it; XLIFF 2.0/2.1 ph, pc, sc, ec; TMX bpt, ept, it, ph, ut. Highlight and annotation markers (TMX hi, XLIFF mrk, XLIFF 2 sm/em) are not compared: a target that drops a hi marker is not reported, but the text inside it is checked. |
| Links and e-mail | error | http(s):// addresses or e-mail addresses differ (trailing punctuation ignored). |
| Glossary | error | The source contains a glossary term (whole word, any case) and the target contains none of its translations. |
| Same source, different translations | warning | Identical source text has more than one translation among all loaded files with the same language pair (source and target codes; upper/lower case ignored; de and de-DE are different codes). |
| Same translation, different sources | warning | One translation is used for more than one source text (same language pair). |
| Target same as source | warning | The target equals the source and contains letters. |
| Ending punctuation | warning | After closing quotes and brackets, the last character differs among . ! ? : ; …, or only one side ends with one. Full-width 。!?:;, Arabic ؟ ؛, Urdu ۔ and Devanagari । count as their equivalents; for Greek (el) a final ; counts as a question mark. |
| Spaces | warning | The target has a double space that the source does not, or leading/trailing spaces differ. |
<sub> inside inline codes) is not checked: such units are skipped and counted, and the result is marked partial. Highlight markers (TMX hi, XLIFF mrk) are not compared by the Tags check; the text inside them is.KvasirQA 1.0.0 · Licence: LICENSE.txt · Changes: CHANGELOG.md