Don't translate it. Fix the English first

When the source is tangled, the ambiguity travels into every target language, and a bigger model does not save you.

Hojung Kim · September 2026

Dethrone the source where the tangle gets caught Source line English, as delivered Is it tangled? LLM as a judge CLEAN TANGLED Rewrite the source remove ambiguity Translate target language

In the American sitcom Friends, Joey Tribbiani lost his role on a soap opera for telling a magazine that he wrote his own lines. The pissed-off writers put Dr. Drake Ramoray down an elevator shaft in the next episode.

Joey, in a doctor's coat, waiting at an elevator.
Friends, Season 2.

This post is going to argue that a translator should rewrite the source text. Fair warning.

An earlier post, LLM translates best when it's told not to translate, argued that a translator should not translate. Instead of asking a model to translate, there are better ways to get a natural, fluent result, such as asking it to act or perform as a native speaker. Framing the model as a person speaking, rather than as a translator, moved the logprob by roughly 3 in my runs on dialogue. Naming a specific actor moved it about 2. Naming a famous author moved it barely at all.

Now this one goes one step further upstream, and it caught a lot of the everything-is-right-and-still-wrong feeling.

Dethrone the source

Rewrite the source. The English is treated as given. Sacred. Which means that when the English itself is ambiguous, the ambiguity travels, and even a frontier model cannot save you.

One thing to note is that a long paragraph is not the same as a tangled one. From the Steam Subscriber Agreement:

The Steam client software and any other software, content, and updates you download or access via Steam, including but not limited to Valve or third party video games and in-game content, software associated with Hardware and any virtual items you may acquire in a Subscription Marketplace are referred to in this Agreement as "Content and Services".

In your graph engineering you can simply ask the model whether the source is tangled. Frontier, Gemma 4 and Qwen 3 all answered no. Forty plus words. A lawyer wrote it carefully. Every item hangs off the same hook, the exceptions are parked in a clause, one verb closes it. It is tedious to read and it is not a problem. Korean, Chinese, Spanish and German all rendered it correctly.

However, look at this clause.

100% of Northwind Interactive's net proceeds for this special item, less VAT/sales tax, will be donated to the Ironsong Foundation (a charity registered in Ireland, CRO: 486219). The Ironsong Foundation provides grants to registered Irish charities and not-for-profits in Canada which places unemployed and underemployed musicians in Canada and Ireland into high-quality jobs. By purchasing this pack, you will directly contribute to the Foundation's mission.

All models immediately answered TANGLED. A singular verb picking up a plural subject, two organisations with a country each, and now nobody can tell whether the relative clause belongs to both of them or only the second.

A chat window. The Steam clause is answered CLEAN. The charity clause is answered TANGLED, with the exact spots quoted back.
The same prompt, the same two sentences, one word back each time.

This really hit me in the head. I have been loud about never asking a model to multi-task. That is exactly what a tangled source does. You are splitting the model's attention in two, fix the source meaning and translate it, and that is where the lukewarm right-but-wrong translation comes from.

And this is LLM as a judge again. In The most advanced glossary system in localization: Ctrl+K the model asked itself whether it needed to look up a term in the corpus. Same shape here. If a model can reliably answer whether the source is tangled, you can wire the graph to send only the tangled ones down the rewrite path, and leave the clean ones alone, the Steam clause or what I call simple UI dictation strings.

Also, one side benefit is that most models think in English, so doing this work in English plays to their strongest attention.

The result for Korean. No matter how hard I try, pre-made COMET, MetricX and MetricX QE could not catch naturalness, so here I used a custom criterion. Korean stacks its modifiers in front of the noun, where English hangs them off the back. A lousy machine translation that only chases a good score, or that gets confused by a low quality source, just piles those modifiers up. Before the rewrite the Korean carried 53 characters of modifier before it reached the noun. After, 15. A native speaker feels that drop immediately.

53아이언송 재단은 캐나다와 아일랜드의 실업 상태이거나 저고용 상태인 음악가들이 양질의 일자리를 찾을 수 있도록 돕는 캐나다 및 아일랜드 내 등록 자선단체와 비영리 단체에 보조금을 지원합니다.
15아이언송 재단은 아일랜드의 등록 자선단체와 캐나다의 비영리 단체에 보조금을 지원하며, 해당 단체들은 캐나다와 아일랜드의 실업 및 저고용 음악가들이 양질의 일자리를 찾을 수 있도록 돕고 있습니다.

For the other three languages the pattern was the same. Chinese used to break in the same place as Korean, and it healed the same way. Spanish and German were already okay before the rewrite, but after it they got breathing room. One relative clause carrying everything became two sentences.

Some knots that cannot be untied

"registered Irish charities and not-for-profits in Canada" has a second problem the model cannot solve. Does registered reach both? Or just Irish charities?

If that fact is not critical in the final delivery, you can let the model pick. In my example it attached registered to the Irish charities only. But if the fact really matters, a human has to search, send an email or pick up the phone to get it 100% right.

The delivery

The rewritten English is just scaffolding. It is thrown away. The client's source file goes back exactly as it arrived and only the translated cells change. Nobody ships a rewritten source. Also again this is not for every line. A four word UI label gains nothing from this. Run it through a rewriting pass and the model starts deliberating, and the output gets stiffer rather than better.

Which is the actual point. I'm a huge fan of high low mix of models. If a cheaper local model can deliver what a frontier does, running it locally cuts your cost enormously and it is lightning fast. This logic also applies in the graph engineering. You must wire the expensive path like source rewrite and glossary lookup to strings that only need it.

A chicken knife for a chicken, an ox knife for an ox.

Originally published on LinkedIn.