<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[MachineTranslation.com Developer Notes]]></title><description><![CDATA[MachineTranslation.com Developer Notes]]></description><link>https://machinetranslation.hashnode.dev</link><image><url>https://cdn.hashnode.com/uploads/logos/6ad0893ce06d0302332b9a0a/e6ea1c71-16fd-43ab-865f-af198ea232c2.jpg</url><title>MachineTranslation.com Developer Notes</title><link>https://machinetranslation.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Mon, 26 Oct 2026 23:02:14 GMT</lastBuildDate><atom:link href="https://machinetranslation.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[How do you decide which i18n translations need human review?]]></title><description><![CDATA[Short answer: Run each string through two or three translation engines and compare the results. Where they agree, ship it. Where they disagree, send it to…]]></description><link>https://machinetranslation.hashnode.dev/how-do-you-decide-which-i18n-translations-need-human-review</link><guid isPermaLink="true">https://machinetranslation.hashnode.dev/how-do-you-decide-which-i18n-translations-need-human-review</guid><category><![CDATA[AI translation tools]]></category><category><![CDATA[translation]]></category><dc:creator><![CDATA[Content Tomedes]]></dc:creator><pubDate>Thu, 15 Oct 2026 08:20:08 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6ad0893ce06d0302332b9a0a/9de78f83-2a75-4c5c-9460-1653c73efd4e.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Short answer: Run each string through two or three translation engines and compare the results. Where they agree, ship it. Where they disagree, send it to a human. You review fewer strings and still catch the ones that matter.</p>
<p>The problem</p>
<p>You have an en.json with 800 strings and you need Spanish, German and Japanese by Friday. Human review of everything is slow. Trusting a single engine with no review is risky, because one engine can be confidently wrong, and a wrong button label or error message is hard to spot later.</p>
<p>Why engine disagreement works</p>
<p>Engines are trained differently, so their mistakes do not always overlap. When three of them produce nearly the same sentence, it is usually safe. When they split, something is often ambiguous: a short string with no context, an idiom, or a term with several meanings. That split is where human attention helps most.</p>
<p>Step 1: protect your placeholders</p>
<p>Before comparing anything, check that each translation kept your variables intact. A translation that drops {name} or %s is broken, however fluent it reads.</p>
<p>python import re</p>
<p>PLACEHOLDER = re.compile(r"{{\s*\w+\s*}}|{\w+}|%(\w+)s|%s")</p>
<p>def placeholders(text): return sorted(PLACEHOLDER.findall(text)) Step 2: score agreement</p>
<p>For each engine's output, measure how similar it is to the others. The output closest to the rest is your pick, and the average similarity is your confidence signal.</p>
<p>python from difflib import SequenceMatcher</p>
<p>def similarity(a, b): return SequenceMatcher(None, a.lower(), b.lower()).ratio()</p>
<p>def pick(source, candidates, threshold=0.8): """candidates: {engine_name: translated_text}""" ok = {k: v for k, v in candidates.items() if placeholders(v) == placeholders(source)} if len(ok) &lt; 2: return None, 0.0, "needs review"</p>
<pre><code class="language-plaintext">scores = {
    k: sum(similarity(v, w) for j, w in ok.items() if j != k) / (len(ok) - 1)
    for k, v in ok.items()
}
best = max(scores, key=scores.get)
status = "auto" if scores[best] &gt;= threshold else "needs review"
return ok[best], scores[best], status
</code></pre>
<p>The score averages each output's similarity to the other engines' outputs and does not count votes. With three engines, two that agree and one that differs can still land below the threshold and go to review. That is intended: when the engines split, a person looks.</p>
<p>Step 3: run it over your strings python import json</p>
<p>def localize(path, lang, engines): strings = json.load(open(path)) done, review = {}, {} for key, source in strings.items(): candidates = {name: fn(source, lang) for name, fn in engines.items()} text, score, status = pick(source, candidates) if status == "auto": done[key] = text else: review[key] = {"source": source, "options": candidates, "score": score} return done, review</p>
<p>Here engines is a dict of functions that wrap whichever translation services you already have access to. The logic does not depend on any particular one.</p>
<p>Ship the done strings and send the review file to a native speaker. Add their fixes to a glossary so the next run starts with better terms.</p>
<p>What to watch Agreement is a triage signal. Engines can agree and still be wrong, especially when they share the same weakness, so spot-check a sample of the auto-approved strings too. Short strings disagree more. "Save" and "Post" are ambiguous without context, so add context notes or keep a glossary for them. Languages with different word order and scripts score differently. Check the review list for your first batch and tune the threshold per language. Keep a human in the loop for anything legal, medical or customer-facing. FAQ How many engines should I compare?</p>
<p>The script needs at least two engines that kept your placeholders. Three lets you see which output sits closest to the rest.</p>
<p>What if every engine agrees and the translation is still wrong?</p>
<p>It can happen when the engines share a weakness. Spot-check a sample of the auto-approved strings, and add the terms you catch to your glossary.</p>
<p>Can this replace a human reviewer?</p>
<p>No. It decides which strings a reviewer looks at first. For legal, medical and customer-facing text, a person should still review the result.</p>
<p>--</p>
<p><a href="http://MachineTranslation.com"><em>MachineTranslation.com</em></a> <em>compares several AI engines side by side. The script above works with any engines. For more on comparing engines, see</em> <a href="https://machinetranslation.com/blog/why-smart-might-be-the-best-feature-of-machinetranslation-com-so-far"><em>how consensus across engines works</em></a> <em>and</em> <a href="https://www.machinetranslation.com/blog/what-accurate-ai-translation-actually-means"><em>what accurate translation means for a language pair</em></a><em>.</em></p>
]]></content:encoded></item></channel></rss>