4,586 Strings, 99 Players: The Heroes of Hammerwatch II Turkish Patch
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.
1. Nobody Was Going To Do It
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.
2. What The Text Is Actually Like
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:
Most Of It Is Numbers In A Sentence
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.
Terms Have To Match Across Files
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 Longer Per Word And Shorter Per Sentence
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.
3. How A Pass Actually Runs
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.
4. What It Added Up To
The Numbers, Unpolished
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.
On The Size Of That
"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."
5. The Corpus, File By File
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.
Where the patch stands
- 0
- People running the patch today
- 0
- Unique visitors to the page
- 0/10
- Positive ratings
- 0
- Translated strings
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.
The corpus
- 18,698
- English source words
- 15,943
- Turkish words
- 118,702
- English characters
- 116,810
- Turkish characters
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.
Where the text lives
4,586 strings across nine files
- Skills & talents1504
- System & UI strings1468
- Items360
- Additional strings272
- Input & controls272
- Celestial Ruins update265
- Dialogue186
- Equipment157
- Menus102
| Skills & talents | 1504 |
| System & UI strings | 1468 |
| Items | 360 |
| Additional strings | 272 |
| Input & controls | 272 |
| Celestial Ruins update | 265 |
| Dialogue | 186 |
| Equipment | 157 |
| Menus | 102 |
skills.lang is a third of the entire corpus on its own. system.lang is nearly as large but much lighter per string — mostly short UI labels rather than paragraphs of mechanics.
Counted as <string name=...> elements in the English files; the Turkish files match key for key.
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.
Words against characters, file by file
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.
Adoption, as far as Steam will tell me
Read by hand off Steam's lifetime chart, approximate
Total subscriptions
| Weeks since release | Total subscriptions |
|---|---|
| 1 | 8 |
| 2 | 3 |
| 3 | 18 |
| 5 | 6 |
| 7 | 8 |
| 10 | 10 |
| 13 | 13 |
| 15 | 13 |
| 17 | 20 |
| 19 | 23 |
| 20 | 18 |
| 22 | 20 |
| 25 | 24 |
| 29 | 30 |
| 30 | 29 |
| 35 | 35 |
| 37 | 33 |
| 40 | 38 |
| 42 | 47 |
| 44 | 47 |
| 46 | 50 |
| 47 | 56 |
| 48 | 53 |
| 52 | 57 |
| 55 | 62 |
| 60 | 66 |
| 61 | 71 |
| 62 | 69 |
| 66 | 78 |
Read this for its shape, not its ceiling. Every point is an eyeballed reading against the gridlines and should be treated as give or take two. The chart tops out near 78 while the stats table on the same page reports 99 current and 110 lifetime unique subscribers — Steam counts subscription events and unique accounts differently, and neither figure is wrong.
Steam Workshop owner stats page for item 3420545026, screenshot of 2026-08-04. Steam exposes no numeric export for this chart.
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.
How the toolchain changed, honestly
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:
- "Fire Ball" → "Ateş Topu". Direct, obvious, and the right call precisely because it is obvious. Some terms should be the thing the player already expects.
- "Off Hand" → "İkincil El". Literal options in Turkish are either clumsy or ambiguous. "Secondary hand" explains the slot's mechanic and fits the width the UI gives it.
- "Multiplayer" → "Çok Oyunculu Mod". Turkish tends to collapse co-op and multiplayer into one phrase, and picking the co-op-flavoured wording would have promised campaign mechanics the game does not have.
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.
What I would not claim
- This is not a reach story. 99 concurrent users is a small mod by any measure, and any framing that makes it sound otherwise is a lie about a free patch.
- The subscriber curve is not precise. It was read by eye off a screenshot because Steam offers no export. Its trend is trustworthy; its individual values are not.
- AI did not do this. It did the first draft of the words. The glossary, the diff discipline, the layout judgement and every in-game read-through are mine, and that is where the difference between this and a machine-translated dump sits.
- I cannot prove quality from ratings. Nine positive ratings out of ten is not a quality measurement, it is nine people being nice on the internet. The best evidence I have is that the patch is still current after eighteen months.
Resources & External Links
- Heroes of Hammerwatch II Türkçe Yama on the Steam Workshop — the mod itself, free, updated through Celestial Ruins.
- The parsed English and Turkish
.langsources behind every chart on this page are in this site's repository underassets/MyWorkContext/heroes-of-hammerstorm-translation/languages/.
Key Lessons
The Glossary Is The Product
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.
Keeping Pace Is The Real Work
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.
Say The Small Number
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.
Summary
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.