A voluntary Turkish patch for a co-op action RPG that never shipped with Turkish. Ninety-nine people are running it right now. That is not a big number, and it is the whole point: it is ninety-nine actual people playing the game in their own language.
I put fifty-odd hours into Heroes of Hammerwatch II with friends before it occurred to me that I was the reason we could play it. The game leans on its item text: a skill node is three lines of numbers and conditions, and if you misread one you build your character wrong. My friends were guessing. There is no Turkish in the game and there was never going to be, because Turkish is not on the list for a small co-op action RPG from a studio of a dozen people.
So I made one. It is a Steam Workshop mod, it is free, nobody asked for it and nobody is paying for it. It went up on 3 February 2025 and I have kept it in step with the game since, most recently for the Celestial Ruins update in July 2025, which arrived as a whole new file. This page is an honest account of what that involves, including the parts where the numbers are small.
The corpus is nine .lang files and 4,586 strings. It is not the volume that makes it awkward, it is the kind of text:
A third of the whole corpus lives in skills.lang, and skill text is dense: a value, a condition, a duration, a stacking rule, all in one line with format placeholders holding the numbers. Get the word order wrong in Turkish and the placeholder ends up describing the wrong noun. These are the strings a player reads while deciding what to spend a level-up on, so a translation that is merely approximate actively costs them something.
An item name in items.lang appears again in a skill description in skills.lang, in a tooltip in system.lang, and in a line of shopkeeper dialogue. If it is not identical in all four, the player cannot connect them. I keep a glossary by hand for every proper noun, item, skill and stat, and it is the piece of this project that has never been automated, because it is the piece where a wrong decision propagates everywhere.
Turkish is agglutinative, so a suffix chain does the work of several English words. Across the whole corpus Turkish uses 14.7% fewer words than English but almost exactly the same number of characters. That is a real UI problem rather than a fun fact: fewer, longer words wrap badly in fixed-width tooltips and buttons, and a string that fits in English can break the layout in Turkish even when it is technically shorter.
Three steps, and the last one is the slow one:
When the game updates I pull the English files and compare them key by key against my Turkish set: new keys, changed English on existing keys, removed keys. Celestial Ruins added dlc_1.lang, 265 strings that did not exist before. Nothing gets translated until I know exactly what moved, because a patch that silently drops keys is worse than no patch.
Today Fable 5 orchestrates the pass and Opus 5 does the translation, working file by file with the glossary in context so established terms come back the same way they went in. When it proposes a new term for something the glossary has not seen, that decision comes to me rather than going into the file.
Then I play. Every line gets looked at in the place it appears, because a tooltip that reads fine in a text editor can overflow its box, and a skill description that parses correctly can still be wrong about what the skill does. This is the step that takes the time and it is the step I have never found a way to skip.
459 unique visitors over 547 days on the Workshop. 99 people running the patch right now, 110 accounts that have subscribed at some point. Ten ratings: nine positive, one negative. Nine comments and one Steam award. Around 43 of those visitors arrived on the first day and the rest trickled in a couple at a time for a year and a half.
"Ninety-nine is not a big number. It is also ninety-nine people who are reading skill descriptions in Turkish tonight instead of guessing at them, which is more than the number who could before I started. I would rather publish the real figure with that framing than round it into something that sounds like reach."
The charts below read from the mod's own source files, parsed on 4 August 2026. A note on one number the old version of this page carried: it claimed 46,522 words, which was English and Turkish added together off raw file lines, XML scaffolding included. The honest figure for the English source is 18,698 words.
110 accounts have subscribed at some point since 2025-02-03.
Over 547 days live. About 43 of them arrived on day one.
1 negative, 9 comments, 1 Steam award.
Across 9 .lang files, kept in sync through every game update.
Steam Workshop item 3420545026, owner stats page read on 2026-08-04. Published 2025-02-03, last updated 2025-07-29.
Those are the lifetime figures from my own Workshop stats page, read on 4 August 2026. Nothing here is projected or annualized. The item is Heroes of Hammerwatch II Türkçe Yama, published on 3 February 2025 and last updated on 29 July 2025 for the Celestial Ruins content.
I want to be blunt about the shape of this, because case studies usually are not. 459 people looked at the page in a year and a half. Roughly 43 of them came the day it went up, and after that it settled into two or three visitors on a good day. Ten people rated it and one of them did not like it. There is no growth curve to point at and no inflection point to explain.
Parsed from the string bodies only, with markup and placeholders stripped.
Fewer words for the same meaning.
-14.7%Which is where it gets interesting.
Almost identical. The words got longer, not fewer in substance.
-1.6%Every string in the English set has a Turkish counterpart and nothing is orphaned in either direction — I check the key sets against each other rather than trusting a line count, because a .lang file with a missing key does not fail loudly, it just falls back to English mid-sentence.
The two pairs of numbers above are the whole linguistic story of this project. Turkish uses 14.7% fewer words than English to say the same things and needs 1.6% fewer characters to do it. Those are not the same claim. Turkish folds "the damage of your next attack" into a couple of long suffixed words, so the word count drops while the character count barely moves, and anything downstream that budgets space by word count will be wrong.
String count is a poor proxy for effort here. system.lang has 1,468 strings and 4,071 English words, so it averages under three words a string: button labels, menu headings, error text. skills.lang has 1,504 strings and 7,560 words, and those words are the dense conditional ones. dialogue.lang is the extreme case in the other direction — only 186 strings, but 1,639 words, because each one is a full line of character voice.
That last file is where the localization stops being mechanical. When a villager under attack shouts "Help!", translating it as "Yardım!" is correct and completely flat. It went in as "İmdaaat! Yetişin!", which is what someone actually yells. Nobody will ever notice that line specifically, which is roughly the definition of it working.
Turkish needs fewer words almost everywhere
| English | Turkish | |
|---|---|---|
| Skills & talents | 7560 | 6239 |
| System & UI strings | 4071 | 3731 |
| Items | 1997 | 1757 |
| Additional strings | 1096 | 930 |
| Input & controls | 280 | 363 |
| Celestial Ruins update | 1535 | 1285 |
| Dialogue | 1639 | 1082 |
| Equipment | 339 | 351 |
| Menus | 181 | 205 |
Dialogue shows the largest proportional drop — 1,639 English words become 1,082 Turkish ones. The exceptions are the short-label files: input, equipment and menus all go up slightly, because a two-word English button label often needs an explicit Turkish noun to make sense on its own.
Parsed from the mod's source .lang files on 2026-08-04, with inline markup and format placeholders stripped before counting.
Now the same nine files measured in characters instead:
The same text, measured a different way
| English | Turkish | |
|---|---|---|
| Skills & talents | 48154 | 45531 |
| System & UI strings | 26238 | 27709 |
| Items | 12753 | 12626 |
| Additional strings | 6894 | 7012 |
| Input & controls | 2884 | 3476 |
| Celestial Ruins update | 9531 | 9466 |
| Dialogue | 8955 | 7447 |
| Equipment | 2099 | 2170 |
| Menus | 1194 | 1373 |
The word gap almost vanishes. system.lang actually gets longer in Turkish despite using 340 fewer words. This is the number that matters for UI: the string still has to fit in the same box.
Same parse, counting characters after stripping inline markup.
This is why I do not trust word count as a workload or layout estimate on Turkish work. The file that shed the most words is not the file that shed the most space, and system.lang — all buttons and labels, the least forgiving place for overflow — came out longer in characters than the English it replaced.
The shape is a small launch bump and then a straight, slow, unglamorous line. There is a mild step up around the Celestial Ruins update in the second half of 2025, which is what you would expect: people come back to the game for new content, look for the patch, find it current.
That is the only marketing this thing has ever had. I posted it once. Everything after that is people searching the Workshop for their own language and finding something that still works.
I started this in February 2025 with Gemini 2.5 Pro, pasting files into a chat window, which worked until it did not. Context ran out, terms drifted between sessions, and I spent as long checking consistency as translating.
Today Fable 5 orchestrates the pass and Opus 5 does the translating, file by file, with the glossary supplied as context so the terms that already exist come back unchanged. It is a better setup, and the honest description of the improvement is narrow: it removed the drift. It did not remove the review, and it never touched the glossary, which is still a file I write by hand.
Three examples of what those glossary decisions look like:
None of these are hard individually. The work is that there are several hundred of them and they all have to still be true two updates later.
.lang sources behind every chart on this page are in this site's repository under assets/MyWorkContext/heroes-of-hammerstorm-translation/languages/.The translation itself is replaceable; models get better every few months and I have swapped mine twice. What is not replaceable is the accumulated set of decisions about what each term is called in Turkish, why, and where it appears. That file is the only thing in this project that would be genuinely painful to lose, and it is the only part I have never let a model own.
Shipping the first version was a few weeks. Staying current is the ongoing commitment, and it is the reason most community patches die: the game updates, the patch does not, and six months later it is worse than nothing because it silently reverts strings to English mid-sentence. Celestial Ruins was 265 new strings, and the only reason it was manageable is that I had a diff step rather than a memory.
The earlier version of this page rounded 99 subscribers into '50+ subscribers, 100% positive sentiment' and inflated the word count by double-counting. None of that made the project look better to anyone who checked, and it made every other number on the page worth less. The figures here are the ones on my own stats page, including the one negative rating.
A voluntary Turkish patch for a game that will never officially have one: 4,586 strings, nine files, kept in sync through eighteen months of updates. The toolchain changed twice along the way, from a single chat model in early 2025 to an orchestrated pass today, but the two things that determine whether it is any good have not changed at all — a glossary maintained by hand, and reading every line in the game before it ships.
Small-audience localization is not a scale problem, it is a maintenance problem. The interesting question was never whether a model could translate 18,698 words. It was whether one person could keep 4,586 strings correct, consistent and current for a year and a half, for free, for ninety-nine people. That part is still manual, and I think it will stay that way.