The game ships in six languages — English, French, Spanish, Italian, German and Portuguese — and any other language can be added without a single line of code: a translation is one text file dropped in your mods folder’s lang/ (%APPDATA%\TheUndercut\mods\lang\ on Windows — see where the files go).
mods/
lang/
pl.txt ← the whole language pack
As soon as the file is there, the language appears in Settings → Language, with its flag. Switching is instant, in-career or from the main menu.
English is the key
There are no string identifiers. The English sentence written in the game is the translation key, and a pack maps English lines to yours:
#name: Polski
#flag: pl
>New Career
=Nowa kariera
>Lap {} / {}
=Okrążenie {} / {}
>opens a key (the English string),=gives the translation,#is a comment.#name:is the name shown in the selector,#flag:the two-letter country code for its flag.{}and{named}placeholders must be kept — the game substitutes into them in order.- One entry is one physical line. A multi-line text (an email body) writes its breaks as a literal
\n.
A half-finished pack is perfectly playable. Anything you have not translated shows in English — there is no broken state, no missing-string marker, and you can ship a pack at 40 % and finish it later.
The Language Editor
Main menu → Modding Tools → Language Editor (or open lang-editor/index.html in the game folder). Like the Mod Editor, it runs offline in your browser, from the file itself.
- Every translatable string is listed: English on the left, your translation on the right. The French translation is shown as a second reference — hide it with the toggle if it gets in the way.
- Fill the header: the language name shown in-game, the file code (
pl→pl.txt) and the flag code. - Translate. The editor marks a row red when its placeholders no longer match the English key — that is the one mistake worth catching, because a broken placeholder is visible in game.
- Save pack (
Ctrl+S) intomods/lang/. Chrome and Edge write back to the file; Firefox downloads it. - In the game: Settings → Language → your flag.
Untranslated only and the progress counter track what is left. Reopening an existing pack resumes where you stopped, and strings from a different game version are preserved at the end of the file rather than dropped.
Translating without the editor
The string list is a plain text file, which makes bulk translation — including with an AI — straightforward. Work in chunks of 200–300 entries with one rule:
Fill the
=lines, never touch the>lines.
The English key is matched byte for byte at runtime. A retyped key — one extra space, one changed accent — is not an error; it is a silent no-op that leaves that string in English forever. Keep every {placeholder} exactly as it appears.
What a pack cannot do
- It cannot shadow a built-in language. The six embedded ones always win; a pack has to bring a new code.
- It does not translate proper names. Drivers, teams, sponsors and circuits are generated content and stay as they are.
- The tutorial voice-over stays English. Only its on-screen text is translated.
- Emails keep the language they arrived in. A mail is translated when it is written and stored that way, so switching language mid-career leaves old mail as it was.
Scripts and fonts
The game’s display fonts cover Latin and, through an automatic fallback, Latin Extended and Cyrillic: when a loaded language uses letters the chosen font lacks, the game swaps that font for one that covers them and puts the original back when you switch away. So Polish, Czech, Turkish, Russian or Ukrainian packs render correctly with no extra work.
Chinese, Japanese and Korean are not supported yet — they need a font the game does not ship. A CJK pack will load, but the glyphs will not draw.
Sharing
Send the .txt file and it drops into someone’s mods/lang/. To publish it for subscription, see the Workshop guide: a language pack goes either at the item root (as <code>.txt) or under a lang/ folder inside it. Your own file always wins over a subscribed one with the same code — which is how you test an edit without unsubscribing.