HTML tag handling in LLM and MT engine translations
Tag errors occur in 98% of MT engine translations and 41% of LLM translations.
How do LLMs and MT engines compare on tag handling?
Translations from LLMs lose tags in 41% of the cases, from open-weight LLMs in 71%, from LLM-based MT engines in 80% and from other MT engines in 98%. A tag error is a tag of the source lost or changed, checked with its attributes, and at the median, translations from LLMs have 0 tag errors per 1,000 words, against 1.3 for open-weight LLMs, 5.9 for MT engines and 8.2 for LLM-based MT engines. Translations from Google Gemini 3.1 Pro Preview keep every tag in 72 of the 75 languages where we shortlisted them, and translations from OpenAI GPT-5.5 in 52 of 59.
Translations into 33 of the 82 languages have a median of 0 tag errors per 1,000 words
Translations into European Spanish, Japanese, Chinese Simplified and Marathi have the highest medians, 2.0 to 2.3.
Translations from Google Gemini 3.1 Pro Preview keep every tag in 72 of 75 languages, and translations from Translated Lara 2 in 31 of 44
Of the 28 MT engines we tested, 11 reach a shortlist with an Intento LQA result. Translations from DeepL Next Gen, Microsoft Translator, Google Translation LLM and Widn AI Tower Sugarloaf have tag errors in every language where we shortlisted them, with medians of 5.9 to 59.8 tag errors per 1,000 words, as do translations from Amazon Translate, ModernMT Enterprise Edition, Google Cloud Advanced Translation API, Yandex Cloud Translate v2 and Elia Machine Translation System, which are on fewer shortlists. Among LLMs, translations from Anthropic Claude Opus 4.8 keep every tag in 11 of 45 languages and from Anthropic Claude Sonnet 4.6 in 6 of 31.
One-step solutions below the bar have a median of 1.3 tag errors per 1,000 words, 0.7 as two-step solutions and 0 as three-step solutions
On the same solutions, 59% keep every tag as two-step solutions (translation + post-edit) and 56% as three-step solutions (translation + LQA + repair). Where tags or formatting were the only problem, we repair the tags by code, without an LLM, and 90% of these two-step solutions keep every tag. We measured these fixes on LLM solutions, since we leave out the MT engine solutions as too far off.
Disclaimers
- We check tags strictly, every tag instance of the source with its attributes. We send every text as HTML with the format or tag-handling parameter of the API set wherever one exists, and we tell the LLMs in the prompt to keep every tag in place.
- We assess only the shortlisted one-step solutions (10 to 13 per language by COMET-Kiwi or MetricX, with at least three real-time solutions among them), so a model has no result in a language where it is not on the shortlist.
- The results come from four business texts of ~3,000 words. Other content can show other results.
- We build two-step and three-step solutions only in the languages with fewer than two solutions that meet every Standard requirement, so their results describe those languages.
Tag handling of one-step solutions, by model
| Model | Type | Languages where we shortlisted it | Languages with no tag errors | Tag errors per 1,000 words, median |
|---|---|---|---|---|
| Google Gemini 3.1 Pro Preview | LLM | 75 | 72 | 0 |
| Google Gemini 3.5 Flash | LLM | 63 | 35 | 0 |
| Anthropic Claude Fable 5 | LLM | 60 | 41 | 0 |
| OpenAI GPT-5.5 | LLM | 59 | 52 | 0 |
| Translated Lara 2 | LLM-based MT engine | 44 | 31 | 0 |
| OpenAI GPT-4.1 | LLM | 43 | 31 | 0 |
| z.ai GLM-5 | LLM | 33 | 29 | 0 |
| OpenAI GPT-5.6 Sol | LLM | 32 | 19 | 0 |
| OpenAI GPT-5.6 Terra | LLM | 20 | 16 | 0 |
| DeepSeek V3.2 | LLM | 14 | 8 | 0 |
| OpenAI GPT-5.6 Luna | LLM | 26 | 12 | 0.7 |
| xAI Grok 4.20 (reasoning) | LLM | 15 | 6 | 0.7 |
| MoonshotAI Kimi K2.5 | LLM | 11 | 5 | 0.7 |
| OpenAI gpt-oss-120b | Open-weight LLM | 14 | 5 | 1 |
| Cohere Command A Translate | LLM | 22 | 6 | 1.2 |
| Anthropic Claude Opus 4.8 | LLM | 45 | 11 | 1.3 |
| Google Gemma 4 | Open-weight LLM | 37 | 11 | 1.3 |
| Anthropic Claude Sonnet 5 | LLM | 35 | 11 | 1.3 |
| Anthropic Claude Sonnet 4.6 | LLM | 31 | 6 | 1.3 |
| Mistral Large 3 | LLM | 28 | 10 | 1.3 |
| xAI Grok 4.20 (non-reasoning) | LLM | 8 | 1 | 1.3 |
| Microsoft Translator | MT engine | 32 | 0 | 5.9 |
| Google Translation LLM | LLM-based MT engine | 32 | 0 | 8.2 |
| DeepL Next Gen | LLM-based MT engine | 69 | 0 | 9.2 |
| Widn AI Tower Sugarloaf | LLM-based MT engine | 10 | 0 | 59.8 |
| ALL-Lab | MT engine | 1 | 1 | 0 |
| Alibaba Qwen3-235B-A22B | Open-weight LLM | 2 | 0 | 1.3 |
| Yandex Cloud Translate v2 | MT engine | 2 | 0 | 1.3 |
| Meta Llama 4 Maverick | Open-weight LLM | 2 | 0 | 2 |
| Anthropic Claude Haiku 4.5 | LLM | 2 | 0 | 2.3 |
| AI21 Jamba Large 1.7 | LLM | 1 | 0 | 2.3 |
| Elia Machine Translation System | MT engine | 1 | 0 | 2.7 |
| Mistral Medium 3.1 | LLM | 4 | 0 | 4.6 |
| ModernMT Enterprise Edition | MT engine | 5 | 0 | 5 |
| Amazon Translate | MT engine | 7 | 0 | 6.9 |
| Google Cloud Advanced Translation API | MT engine | 2 | 0 | 9.6 |
| Swiss AI Apertus-8B-2509 | Open-weight LLM | 1 | 0 | 23.1 |
| MiniMax M2.5 | LLM | 1 | 0 | 30.7 |
One-step solutions with an Intento LQA result in 82 languages, the models on fewer than eight shortlists after the others. The four texts hold 508 tags.
Tag handling of one-step solutions, by language
| Language | Tag errors per 1,000 words, median | Models with no tag errors |
|---|---|---|
| Albanian | 0 |
|
| Basque | 0 |
|
| Belarusian | 0 |
|
| Bosnian | 0 |
|
| Catalan | 0 |
|
| Cebuano | 0 |
|
| Croatian | 0 |
|
| Danish | 0 |
|
| French | 0 |
|
| Frisian | 0 |
|
| Greek | 0 |
|
| Hebrew | 0 |
|
| Indonesian | 0 |
|
| Irish | 0 |
|
| Latvian | 0 |
|
| Lithuanian | 0 |
|
| Macedonian | 0 |
|
| Malay | 0 |
|
| Norwegian | 0 |
|
| Russian | 0 |
|
| Serbian | 0 |
|
| Sinhala | 0 |
|
| Slovak | 0 |
|
| Slovenian | 0 |
|
| Sundanese | 0 |
|
| Swahili | 0 |
|
| Swedish | 0 |
|
| Tagalog | 0 |
|
| Tajik | 0 |
|
| Thai | 0 |
|
| Ukrainian | 0 |
|
| Welsh | 0 |
|
| Yiddish | 0 |
|
| Bulgarian | 0.2 |
|
| Czech | 0.2 |
|
| Armenian | 0.3 |
|
| Galician | 0.3 |
|
| Hungarian | 0.3 |
|
| Icelandic | 0.3 |
|
| Khmer | 0.3 |
|
| Nepali | 0.3 |
|
| Romanian | 0.3 |
|
| Afrikaans | 0.7 |
|
| Amharic | 0.7 |
|
| Arabic (MSA) | 0.7 |
|
| Dutch | 0.7 |
|
| Georgian | 0.7 |
|
| Kyrgyz | 0.7 |
|
| Odia (Oriya) | 0.7 |
|
| Vietnamese | 0.7 |
|
| Burmese | 1 |
|
| Chinese Traditional | 1 |
|
| Estonian | 1 |
|
| Farsi | 1 |
|
| Lao | 1 |
|
| Pashto | 1 |
|
| Portuguese (European) | 1 |
|
| Tamil | 1 |
|
| Tatar | 1 |
|
| Punjabi | 1.2 |
|
| Assamese | 1.3 |
|
| Azerbaijani | 1.3 |
|
| Bengali | 1.3 |
|
| Finnish | 1.3 |
|
| German | 1.3 |
|
| Gujarati | 1.3 |
|
| Hindi | 1.3 |
|
| Italian | 1.3 |
|
| Kannada | 1.3 |
|
| Kazakh | 1.3 |
|
| Malayalam | 1.3 |
|
| Mongolian | 1.3 |
|
| Polish | 1.3 |
|
| Telugu | 1.3 |
|
| Turkish | 1.3 |
|
| Urdu | 1.3 |
|
| Uzbek | 1.3 |
|
| Korean | 1.7 |
|
| Chinese Simplified | 2 |
|
| Japanese | 2 |
|
| Marathi | 2 |
|
| Spanish (European) | 2.3 |
|
One-step solutions with an Intento LQA result, in the languages where the requirement applies.
Tag handling in two-step and three-step solutions
| Solution | Tag errors per 1,000 words, median |
|---|---|
| One-step solutions | 1.3 |
| Two-step solutions (translation + post-edit) | 0.7 |
| Three-step solutions (translation + LQA + repair) | 0 |
The same solutions as one-step, two-step and three-step solutions: the one-step solutions below the bar that we built three-step solutions on, in the languages with fewer than two solutions that meet every Standard requirement.