Skip to main content

UIStringBench

A public benchmark for how well LLM judges detect translation errors in software UI strings — mistranslations, omissions and additions that no structural check can see.

v1 · run 2026-09-07 · shipi18n semantic judge — 3-pass majority vote, MQM categories · corpus committed before the judge was written

JudgeProviderPublic split (228 pairs)Held-out (60 pairs)
CatchFalse positivesLabel acc.CatchFalse positives
Claude Haiku 4.5smallAnthropic54/5413/168 (7.7%)98.1%18/180/42 (0.0%)
Claude Sonnet 5frontierAnthropic54/546/168 (3.6%)100.0%18/180/42 (0.0%)
Claude Opus 5frontierAnthropic54/546/168 (3.6%)100.0%18/180/42 (0.0%)
GPT-5.5frontierOpenAI54/546/168 (3.6%)100.0%18/180/42 (0.0%)
GPT-5.4 minismallOpenAI54/547/168 (4.2%)98.1%18/182/42 (4.8%)
Gemini 3.8 FlashfrontierGoogle54/546/168 (3.6%)100.0%18/180/42 (0.0%)
Gemini Pro (latest)frontierGoogle54/546/168 (3.6%)100.0%18/180/42 (0.0%)
Structural checks only (no LLM)0/540/168 (0.0%)0/180/42 (0.0%)

Catch = planted errors flagged (any category). Label acc. = correct MQM category among caught. The held-out split is private (contamination defense) and scored separately.

Everyone catches everything

Every LLM judge caught all 54 planted errors on the public split and all 18 on the held-out split. On deliberate, unambiguous errors, detection is saturated — the differentiation is entirely in false positives. (Which also means the held-out split is too easy; v1.1 will plant subtler errors.)

Frontier judges agree — even when dissenting

The five frontier judges — from three different providers — flagged the identical six "clean" pairs. Three of those six are the same stale sentence in three languages that really was wrong: the judges were right and the corpus label was wrong. Per the pre-registration policy the labels stand, and the disagreement is reported instead.

The baseline makes the case

Structural checks alone — key diffs, placeholders, plurals — catch 0 of 54 semantic errors, with zero false positives. That row is the whole argument for a semantic tier: deterministic checks are necessary and cannot see meaning.

Methodology

  • Pre-registered: the 228-pair public corpus was committed to git before the judge existed; evaluation thresholds were fixed before implementation; labels are never revised after seeing results.
  • Judge under test: each model runs the same harness — 3 passes, majority vote, MQM-style categories (mistranslation / omission / addition) instead of scalar scores.
  • Splits: public (168 clean + 54 planted + 6 glossary, es/de/ja, drawn from real production locale files) and a private 60-pair held-out split in a disjoint domain, scored separately.
  • Known limitations: three language pairs; one domain (UI strings); planted errors are deliberate and less subtle than real drift; corpus authored by the tool's maintainer with LLM assistance. Treat scores as an engineering QA signal, not a validated academic metric.

Run it yourself

The harness, corpus and item-level results are public. Point it at any judge — including a local model via an OpenAI-compatible endpoint.

git clone https://github.com/Shipi18n/shipi18n && cd shipi18n
node evals/semantic/leaderboard.mjs --models anthropic:claude-haiku-4-5 --split public

The judge measured here ships in npx @shipi18n/cli check --semantic — advisory by default, because a noisy gate is a gate teams turn off.