I've mostly been working on Wings of Empire recently, where the main story has reached day 30 (and most of the way to the end of Act II), but I took a couple of days to integrate a Chinese localization a Patreon sent me.
I've had people attempt localizations before, from quick google translate passes to a Russian team who approached it with loving care but buckled under the sheer scope of the story. Across the 3 games Love of Magic's got more text than the Lord of the Rings books combined, so... hard work.
Having said that, LLMs (like ChatGPT) have come a long way, and now do as good job localizing as an average human. The process of localizing via LLM + touching up as a human makes things a lot more doable than a full translation from scratch.
The first step was exporting all the text in a way that I could easily recover (and automate, I'm lazy).
I wrote a quick script to take every dialog in the game, and dump out the text file. The result looks like this:
-- Conversation: IntroductionToHenry
--
---------------------------------------------
8fb60bb1-2fec-46b8-b30e-02431543a1d9 Ah. Your Highness. Let me be so forward as to welcome you to Camelot.
dae8136d-1335-492c-8ae3-a324d13a194a Thanks, I'm sure. And who are you?
(and 10,000 lines after that). The numerical chunk at the start is what's called a GUID (unique ID); each line has a different one, and all I have to do at runtime is ask for the text string that corresponds to that GUID.
-- Conversation: IntroductionToHenry
--
---------------------------------------------
8fb60bb1-2fec-46b8-b30e-02431543a1d9 啊。殿下。请容我冒昧地欢迎您来到卡美洛。
dae8136d-1335-492c-8ae3-a324d13a194a 谢了,我想。你是哪位?
Now, I don't really speak Chinese (beyond enough to order a beer or curse at someone), and I certainly don't read it. I don't know if it captures Henry's stuffy tone, or MC's casual, slightly annoyed, tone. But then I guess that's true even if you paid a professional translation company to do it.
The actual process, once I have this all translated is reasonably straight forward. It needed a new font (Chinese glyphs aren't usually represented in most font-sets, and unsupported glyphs show up as square boxes), and now when I would normally display English, I check which language is active and load that instead. Simple!
Now, if all I cared about was the dialog this would all I needed to do. But at that point I don't really feel I have fully 'localized' it. For that we need to localize the UI (buttons, etc) and ancillary text (achievements, spankbank hints, gem descriptions, etc). All in all a lot of work.
I'm lazy, as I mentioned, so the first step is asking myself how I can make the computer do that for me.
A lot of this is highly systemic; every UI widget with text on it will probably need to be localized, every achievement, etc. Writing some code to go through the entire project looking for that kind of stuff is actually reasonably straight-forward, if fiddly. All of that gets added into another txt file, and fed to the hungry LLMs.

All of this is pure code work, so the GPU's been left to slack around. I decided to fix that, and get it rendering. While most of that is just me wanting to render some more Molly in a leotard, it also serves a purpose. I wanted to make sure the system's robust enough to pick up changes (like new conversations, new emails received, etc) and correctly identify just what's changed. Molly, of course, is happy to help me demonstrate. The new emails from her show up on your computer day 71+ on the development branch.
Doc62 Productions
2025-05-31 19:56:39 +0000 UTCKaiko
2025-05-29 08:09:13 +0000 UTC