Love of the Genre Beats All Friction: A Bilingual Localization for Pillars of Eternity

Side Project Gaming Localization AI CRPG

This is not a corporate postmortem. It’s a player diary with a developer’s toolbox.

I didn’t start this project because someone assigned me a localization task. I started because I love Pillars of Eternity, and because my relationship with language, gaming, and English is more complicated than it looks.


Why language has always been the obstacle

I’m not a native English speaker. In work, that’s fine — technical English, documentation, code reviews, Slack messages. I handle those without much trouble.

But CRPG writing is a different beast entirely.

Pillars of Eternity is essentially a novel you play. Pages of companion dialogue, lore entries, quest descriptions, NPC monologues — all of it dense, literary, full of tone and subtext. Even for native speakers, it’s a lot. For me, reading it in English felt like wading through mud. I’d understand the words, but I’d miss the texture. I’d get the meaning but lose the mood.

So I played in Chinese. Most of the time, the existing community localization served me well. The translation was solid. The game was enjoyable.

But most of the time isn’t all the time.

Every so often, I’d hit a line that felt slightly off. Not wrong enough to break gameplay, but just… tilted. A companion’s sarcasm reading as sincerity. A villain’s menace softened into politeness. An archaic flourish flattened into plain modern speech. Small things. But Pillars is a game where tone is gameplay — when a line slips, it pulls you out of the world. And in that slipping moment, you’re reminded: this text was written by someone else, adapted by someone else, and it’s showing.

That feeling nagged at me.


The bilingual idea: older than I thought

The thought of a bilingual localization — keeping both English and Chinese visible in-game — wasn’t originally mine.

In 2015, someone on the Obsidian forums posted exactly this idea: Bilingual Pillars of Eternity — Learn Languages While Playing. The concept was elegant: show both languages side by side so players could use the game as a language-learning tool. I loved it immediately.

The problem was, that post was ten years old. No one had built it for Chinese text. So I figured: maybe I should.

The bilingual format solved two things at once for me.

First, it gives me a safety net when the Chinese feels wrong. Instead of just suspecting a translation is off, I can glance at the English, and if I’m patient — or curious enough — I can pull up a dictionary and try to reconstruct what the original line actually meant. That slow, deliberate process of comparing both versions is exactly how I used to play games years ago.

I still remember grinding through Baldur’s Gate 2 and Tyranny that way — game open, English dictionary in another window, occasionally pausing mid-combat to look up a word I half-understood. It was slow. It was occasionally maddening. But nothing, absolutely nothing, was going to stop me from playing those games. Love of the genre beats all friction.

Second, it’s genuinely useful for learning. Seeing the English and Chinese next to each other in context — not in a textbook, but inside a world I’m invested in — is more effective than any flashcard app I’ve tried.


Why this was impossible until recently

Here’s the part I want to be honest about: I couldn’t have done this a year ago — not because the idea was too ambitious, but because I had two limitations that together made the project feel out of reach.

The first was scale. A localization of this size involves thousands of string table files across four data packages covering the base game and three expansions. Doing that manually, line by line, would take an unreasonable amount of time. I could imagine the workflow, but I couldn’t execute it alone at any reasonable speed.

The second was confidence. My English is decent for technical work, but literary English — the kind Pillars uses, full of archaic register, careful word choice, deliberate ambiguity — is harder. When I look at a line and think “the Chinese sounds wrong,” I wasn’t always sure I was right. Maybe the original really did mean that. Maybe my instinct was off. That uncertainty made me hesitant to commit changes.

AI changed both of those.

On the programming side, AI can do the things I know how to do — building scripts, structuring files, defining workflows, iterating on output formats — roughly a hundred times faster than I could alone. That means I can stay at the high level: define the task, shape the workflow, evaluate the results. The implementation details get handled. The scale problem dissolves.

On the language side, it’s subtler. AI doesn’t replace my understanding — but it gives me confidence in it. When I look at an English passage and form a reading, I can check that reading. I can ask whether the nuance I’m sensing is real, whether a particular word choice carries the weight I think it does. Most of the time, I’m right. And knowing that — being able to verify rather than just guess — removes the hesitation that used to slow me down.

Together, those two changes made the project feel possible in a way it simply wasn’t before.


My design decision: bilingual where story matters, concise where UI matters

Not all text has the same job — and I learned that the hard way, by actually running the scripts and loading the game.

Story text (conversations/, quests): keep both languages visible

[EN] ...
[ZH] ...

Dialogue and quest text is where I want to compare tone, catch translation drift, and feel authorial intent. Seeing both languages together makes that comparison immediate, without leaving the game.

A tavern conversation in the opening area — both the NPC narration and the dialogue choices show the bilingual format side by side.

A tavern conversation early in the game. The aumaua barkeep’s narration shows the [EN] description first, followed by [ZH] — and the player’s reply options follow the same pattern. The comparison is instant, without breaking the scene.

The same format carries into the quest journal. Every quest name, every objective, every lore entry — bilingual throughout.

The quest journal showing bilingual quest names on the left and a full bilingual quest description on the right.

The quest log for “The Master Below”. When a quest description reads oddly in Chinese, I can immediately check the English source. If I’m curious, I can look up the exact word choice and understand what the writer intended. That option didn’t exist before.

System/UI text (game/): keep it clean in Chinese only

UI labels, ability names, item names, menu options — these are about speed and readability. During combat or fast inventory navigation, bilingual clutter actively hurts. Chinese only.

The character sheet for my Watcher, Cerror — stats, abilities, and skills all displayed in Chinese with no English in sight.

My Watcher’s character sheet. Thirty-odd stats, passive bonuses, skill ranks, combat history — all in Chinese, clean and scannable. Adding English labels here would just be noise.

This split was one of the best decisions in the project. It respects how people actually read games: immersively for story, functionally for interface.


The workflow, in honest detail

Pass one: make it playable

The first pass is purely mechanical. A Python script walks through all the source files, pairs the existing English text with the existing Chinese text, and writes the [EN] / [ZH] format into the EZ string tables. No translation judgment yet — just structure.

Then I do a spot-check pass: load the game, walk around, look for format breaks, fix anything that crashes the UI or renders wrong. Repeat until the game is actually playable.

This is also when I discovered that the UI doesn’t need bilingual at all. The lesson wasn’t theoretical — I saw it in the game. Ability names, item tooltips, menu options with two lines of text crammed into a space designed for one. It looked terrible. The bilingual format is immersive in dialogue; in the UI, it’s just noise. That’s when I made the split.

Pass two: AI in the lead, human in the loop

The second pass is where the real work happens — and where I leaned hardest on AI.

I’m using two AI agents: Codex and Claude. They work independently on the same localization, reviewing each other’s output and catching issues the other missed. So far, they haven’t fought. If anything, they seem to collaborate — one flags something, the other confirms or refines. I’ll enjoy that while it lasts.

The workflow they follow: accumulate a batch of changes (roughly 30–50 edits), then open a pull request for me to review. I read through the diffs, leave comments, raise questions. If something feels wrong, I say so — but I’m careful to frame it correctly every time: I’m a Chinese speaker, not a native English speaker, and not a professional translator. Treat my comments as a signal about what feels off, not as a final answer about what’s right. That framing matters. It keeps the agents from over-correcting based on my imprecise wording while still trusting my instinct about what breaks.

Over time, this produced two documents that both AI agents and I keep adding to: a findings.md of recurring patterns and pitfalls, and a localization guide with concrete examples of decisions we’ve made. It started as my notes. Now it’s a shared document that Codex, Claude, and I are all writing together.

The third layer: playing the game

The part I enjoy most: sync_to_game.py deploys only the changed files to my local game installation, and then I just play.

Any time a line feels wrong — not wrong in an obvious way, but that small tilt where something doesn’t quite land — I take a screenshot. I think about what might be off. Then I ask ChatGPT. If ChatGPT confirms the translation is wrong, I do two things: I go into the repository and fix the line myself, and I write down the principle behind the fix so the agents can apply it to similar cases in the future.

This is the feedback loop that no automated pass can replace. And the reason why comes down to a single structural problem: the lines that matter most don’t live next to each other in the string tables.


Why context is the one thing AI can’t get from files alone

Let me show you what I mean with three real examples.

”transfixed” — a word that looks simple and isn’t

Early in the game, you encounter a man described like this:

[EN] You see a man wearing simple but mostly neat clothes. He’s transfixed, however, by a ragged tear in the seam of his tunic.

[ZH] 你看到一名男子,衣着朴素但大体整洁。然而,他被自己长袍缝线上的破洞迷住了

“迷住了” means fascinated — as if the tear in his clothes was beautiful or interesting. But transfixed here means something closer to staring vacantly, the way someone might stare at nothing when they’re embarrassed, or lost in thought.

This man is a down-on-his-luck nobleman. He’s not fascinated by the tear. He’s staring at it because he can’t quite accept it’s there. That’s a moment of quiet characterization — and the original Chinese turns it into a non sequitur.

I noticed it while playing. Asked ChatGPT. Fixed it. And added a note to the guide: transfixed in narrative description almost never means “fascinated”; check what emotional state it’s actually depicting.

”high-minded” — a word that sounds like a compliment

This one is subtle. Heodan, a companion you meet early, describes the Readcerans as hardworking but a little fanatical. You have a dialogue option to respond:

Heodan's dialogue — he's explaining why he left home.

The player's dialogue options, showing the second choice mistranslated as "你真是大度啊".

The original response is: “That’s high-minded of you.”

The translation: “你真是大度啊”“how magnanimous of you.”

High-minded in English means principled, idealistic, morally ambitious — sometimes used sincerely, sometimes with a light edge of dry humor. 大度 means forgiving, generous, magnanimous — an entirely different concept. You say 大度 when someone lets a slight go. You don’t say it when someone expresses a balanced, slightly lofty view of another culture.

The wrong word doesn’t break the scene. But it makes your character sound like they said something odd. That’s the kind of slippage that erodes immersion slowly, line by line.

”that’s no longer a concern” — a pronoun that murders a punchline

This is the one that made me most appreciate playing over reading files. Eder, the fighter companion, tells you that after the war, people started saying his brother sided with the enemy. He explains:

“I was safe because I fought, but then this rumor starts that my brother, that he was on the wrong side… they’d have to hang him to get to me.”

Then the scene shifts. He looks up.

Eder telling the story of his brother, with the line "they'd have to hang him to get to me."

Eder looking up at the swaying bodies in the tree, then saying "Seems that's no longer a concern."

His eyes follow one of the swaying bodies hanging from the tree.

“Seems that’s no longer a concern.”

Translation: “原因已经无关紧要了。”“The reason is no longer relevant.”

Concern is not reason. And “that” doesn’t refer to an abstract concept — it refers to his brother, who was standing between him and danger, and who is now hanging from that tree. The English line is deliberately understated, cold, dark. The translation gets the rough meaning across, but quietly drops the referent and the tone along the way — the kind of thing you’d never notice unless you were watching the scene unfold.

I could only catch this because I watched those two lines play out in sequence, in a scene, with the image of the bodies on screen. Those two lines are not adjacent in the string table. An AI reading files would see each in isolation and have no reason to connect them.

That’s the review that can only happen in the game.


Why this project became more personal than expected

I originally thought I was “just cleaning up text,” but it became a way to revisit one of my favorite games with a level of attention I’d never given it before.

Localization stopped being a background utility and became part of the play experience itself:

  • reading closer
  • noticing voice and tone
  • making deliberate choices about phrasing and register
  • learning by rewriting, not just consuming

There’s something quietly satisfying about it. It feels like co-traveling with the game’s writers, one line at a time — close-reading a world I already love, and leaving it a little more precise than I found it.


If I had to summarize this project in one sentence

I’m not building this because I must — I’m building it because I love this game, because I’ve always found a way to play the games I love regardless of the friction, and because for the first time, the tools exist to do it properly.

If any of this resonates with you, maybe your favorite RPG deserves the same treatment.

The project is open — scripts, string tables, glossary, and all the accumulated findings — at github.com/cerrorism/poe-localization.