Speaking Your Language
Bringing EveLens to the Korean and Chinese EVE communities — and the architecture that makes the next language almost free.
For everyone. No engineering background needed.
On May 27th, a Korean EVE player opened a discussion on the EveLens GitHub. They didn't ask me to add Korean. They offered to do it themselves: "I'd love to translate those 300+ interface strings — point me in the right direction."
Five days later, they sent back all 464 of them. Hand-translated. Every placeholder in place, every line break where it belonged. I didn't have to fix a single one.
That gift is what this post is about — and the bug it uncovered, the kind that had been quietly hurting Chinese players for months while everyone looked right past it.
01Two jobs hiding inside one
If you've never thought about translating a tool like EveLens, it sounds like a single task: translate the words. It's actually two completely different jobs, and only one of them is something a person should ever touch.
The first job is the app's own words — the menus, the buttons, the tab names, the little tooltips. "Add Character." "Skill Farm Dashboard." There are 464 of these. They're short, they're mine, and a human can translate them in an afternoon.
The second job is the entire EVE universe — every ship, skill, item, and station. "Caldari Battleship." "Capacitor Management." There are more than fifty thousand of these in each language, and no volunteer should ever go near them, because CCP already publishes official translations for every single one in the game's static data export.
So the whole job is really: get a human to do the 464, let the machine pull CCP's 50,000, and wire the two together so they switch as one. Simple to say. There was a trap in it.
02English words, where they shouldn't be
I wired Korean in and started testing it myself before shipping. Menus, Korean. Tabs, Korean. Then I opened the plan editor — the screen where you build a training queue — and English words were scattered through it. I kept clicking around and they kept popping up: a skill name here, an item name there, sitting in the middle of an otherwise-Korean screen. My first reaction was just: why is this happening?
The skill names were still in English.
The menus around them were Korean. The skill names in the middle of the screen were not. Same data, same setting, two halves of one window disagreeing. And the Skills tab showed those exact same skills in Korean, correctly. So it wasn't missing data. It was something in the code.
Here is what was happening. Every ship and skill in EveLens carries two names: its plain English name, and its translated name. Different parts of the app were asking for different ones. The Skills tab asked for the translated name. The plan editor asked for the English name — and had been doing exactly that since long before Korean existed.
That last part is the quiet one. EveLens has shipped in Chinese since version 1.3.0, back in May. Every screen that asked for the English name had been showing English to Chinese players the whole time — and nobody, including me, had noticed. The menus were Chinese, that felt translated enough, and the eye slid right past the rest. It took a fresh language, and me actually sitting there testing it, for the gap to finally look wrong instead of normal.
03The second language finds the first one's bugs
That's the lesson, and it caught me off guard: adding a second language is what surfaced the bug the first language had trained me to ignore.
When only one translation exists, its rough spots go invisible — even to the person who built it. The Chinese had looked "good enough" to me for a month. It was only when I sat down to test Korean, with fresh eyes on a fresh language, that the English words finally registered as wrong instead of normal. The bug had been there since spring; it took a second language to make me see it.
So I didn't just fix the one screen in the screenshot. About nineteen places across the app were reaching for the English name where a player would actually read it. I fixed the rule in one shared place, so every screen pulls the translated name from now on — and then I added a check that fails the build if anyone ever wires it up the old way again. The first time that check ran, it caught two more screens I'd missed by hand.
04Making the next language almost free
The bigger question was never Korean. It was: when the next community shows up — Japanese, Russian, French — how much work is that going to be?
Before this, the honest answer was "about a week, and easy to get wrong." The translations lived inside the code as one enormous list I had to hand-edit, escaping every quote and special character by hand. Add a language and you also had to remember to update four other places scattered around the project.
So I rebuilt it on a single idea: the file a translator hands me should be the exact file the app reads. No conversion step in between, because every conversion step is a chance to introduce a mistake — and I'd just spent a week proving that.
Now each language is a plain text file, in the same simple "key equals value" shape a translator naturally produces. One short list in the code says which languages exist, and everything else — the settings menu, the loader for CCP's 50,000 names, the fallback to English — reads from that one list.
The payoff: adding a brand-new language is now three small steps. Drop in the translator's text file. Run one command to fetch CCP's official names for that language. Add one line to the list. Ten minutes of my time, plus the translator's afternoon. The thing that used to eat a week is essentially free.
05The honest part
I won't oversell where this landed, because the moment someone catches an overclaim, the whole thing loses trust.
The 464 interface strings are fully translated in Korean and Chinese. The 50,000 EVE names are fully translated in both, courtesy of CCP. But while rebuilding the system I also pulled a few hundred bits of text out of the code that had been hardcoded in English and never translated at all. Those fall back to English until a human fills them in. So if you run EveLens in Korean or Chinese today, you'll still meet the occasional English label among the translated ones. That's the safety net doing its job — not a crash — but it isn't "done" either.
Which is exactly why I'm asking for help.
06An invitation to the Korean and Chinese communities
EveLens is a free, open-source character planner and skill queue manager for EVE Online — the modern successor to EVEMon — and it now runs in English, Simplified Chinese, and Korean. The language picker is in Settings, under Appearance. It restarts and comes back in your language.
If you're a native Korean or Chinese speaker and a phrase reads awkwardly, or you find one still sitting in English, I'd genuinely like to hear about it. The translation files are plain text — you don't need to be a programmer to suggest a better word. Everyone who helps is credited by name in the app's About page and the release notes. Korean exists at all because one player decided it should.
There's a thread for each language on GitHub: one for Korean, one for Chinese.
07What this taught me
- The second language finds the first language's bugs. If you support one non-English language, you almost certainly have localization bugs you can no longer see. A second one drags them into the light.
- One wrong rule, repeated, isn't nineteen bugs. Fix it at the source, add a check that enforces it, and the twentieth instance never happens.
- Make the translator's file the file the app reads. The single biggest simplification here was deleting the step between "a human wrote a text file" and "the app loads the text." They're now the same file.
- Design for the language you don't have yet. I'll never hand-edit a 464-line list again. The next community that shows up gets a ten-minute answer instead of a week.
Built with Claude Code, directed by me, and made real by a Korean pilot who volunteered an afternoon. Fly safe. o7
Previous: Part 10 — Ship It