Machine translation is fast and mostly right. The problem is the "mostly": a translator drops {0} from "You found {0} coins", and the German build throws a FormatException in front of a player you will never hear from. The string looked fine. Nobody read all 72 of them.
This package translates, and then checks.
TRANSLATION
Send entries to OpenAI, Anthropic, DeepL or Google Cloud Translation, one at a time or in batches. Each request carries the context the model needs to be right: the category the string belongs to, whether it is a menu button or a line of dialogue, the character speaking it, the placeholders that must survive, and the glossary terms found in the text.
VALIDATION
Twelve rules run over every translation:
Placeholder integrity: {0}, {name}, %s, $var and <br/> must all come through, in any order. Reordering arguments for German or Japanese word order is normal and passes.
Terminology consistency: "Health" is "Gesundheit" everywhere, not "Trefferpunkte" in the string a different contractor did.
Length constraints: a button 12 characters wide will not stretch for German.
Numbers, URLs, punctuation, casing, whitespace, double spaces, empty translations, and translations that are just a copy of the source.
Each result carries a score and the exact lines that caused it. Run the whole project in one call and put it in your build pipeline: a translation that lost a placeholder stops the build instead of reaching the store.
Where the answer is unambiguous, such as stray spaces, doubled spaces or trailing whitespace, one call fixes it. Meaning is never touched automatically.
GLOSSARY
Terms are defined once with their translation per language and a note on usage, and the matcher finds them in live strings so the model gets them with every request. Brand names are marked do-not-translate.
EXCHANGE
Export to CSV for a spreadsheet, XLIFF for a translation agency, or JSON for your own tooling, and import the result back. The CSV parser follows RFC 4180, so a line containing a comma, a quote or a newline inside a value comes back as one entry rather than silently splitting into two.
REQUIRES YOUR OWN API KEY
Translation is performed by a third-party service of your choice: OpenAI, Anthropic, DeepL or Google Cloud Translation. This package neither includes nor proxies API access, and all translation costs are billed to you by that provider under their terms. Keys are stored in EditorPrefs, per user and per machine, and are never written into the project or into a build. Every other feature, including validation, glossary, import and export, works without a key.