Skip to content
Alp Yalay
HomeWorkCase StudiesResume
Back to Case Studies
Game Localization
Action RPG
Steam Workshop

4,586 Strings, 99 Players: The Heroes of Hammerwatch II Turkish Patch

February 2025 - Present
15 min
Alp Yalay
XLinkedIn
Role
Sole translator, glossary owner and maintainer
Tech Stack
Fable 5 (orchestration), Opus 5 (translation), hand-maintained glossary, in-game review
Platform
PC, Steam Workshop item 3420545026
Scale
4,586 strings across 9 .lang files

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:

01. Diff Against The Live Game

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.

02. Translate Against The Glossary

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.

03. Read Every Line In The Game

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.

99
Players Running It
4,586
Translated Strings

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

110 accounts have subscribed at some point since 2025-02-03.

0
Unique visitors to the page

Over 547 days live. About 43 of them arrived on day one.

0/10
Positive ratings

1 negative, 9 comments, 1 Steam award.

0
Translated strings

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

Parsed from the string bodies only, with markup and placeholders stripped.

15,943
Turkish words

Fewer words for the same meaning.

-14.7%
118,702
English characters

Which is where it gets interesting.

116,810
Turkish characters

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

Strings per language file
4,586Translatable strings
  • Skills & talents1504
  • System & UI strings1468
  • Items360
  • Additional strings272
  • Input & controls272
  • Celestial Ruins update265
  • Dialogue186
  • Equipment157
  • Menus102
Skills & talents1504
System & UI strings1468
Items360
Additional strings272
Input & controls272
Celestial Ruins update265
Dialogue186
Equipment157
Menus102

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

Words per file: English against Turkish
EnglishTurkish
Skills & talents
−1321 words
System & UI strings
−340 words
Items
−240 words
Additional strings
−166 words
Input & controls
+83 words
Celestial Ruins update
−250 words
Dialogue
−557 words
Equipment
+12 words
Menus
+24 words
EnglishTurkish
Skills & talents75606239
System & UI strings40713731
Items19971757
Additional strings1096930
Input & controls280363
Celestial Ruins update15351285
Dialogue16391082
Equipment339351
Menus181205

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

Characters per file: English against Turkish
EnglishTurkish
Skills & talents
−2623 chars
System & UI strings
+1471 chars
Items
−127 chars
Additional strings
+118 chars
Input & controls
+592 chars
Celestial Ruins update
−65 chars
Dialogue
−1508 chars
Equipment
+71 chars
Menus
+179 chars
EnglishTurkish
Skills & talents4815445531
System & UI strings2623827709
Items1275312626
Additional strings68947012
Input & controls28843476
Celestial Ruins update95319466
Dialogue89557447
Equipment20992170
Menus11941373

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

Subscriptions over time

Total subscriptions

Weeks since releaseTotal subscriptions
18
23
318
56
78
1010
1313
1513
1720
1923
2018
2220
2524
2930
3029
3535
3733
4038
4247
4447
4650
4756
4853
5257
5562
6066
6171
6269
6678

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 .lang sources behind every chart on this page are in this site's repository under assets/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.

Previous case studyFive Years on One Spreadsheet Column: Localizing Battle Talent into TurkishGame LocalizationNext case studyTraining FieldNet 1: A 5,077-Species Wildlife Classifier That Fits in 39 MBCase Study

Contents

  1. 1. Nobody Was Going To Do It
  2. 2. What The Text Is Actually Like
  3. 3. How A Pass Actually Runs
  4. 4. What It Added Up To
  5. 5. The Corpus, File By File
  6. Where the patch stands
  7. The corpus
  8. Where the text lives
  9. Words against characters, file by file
  10. Adoption, as far as Steam will tell me
  11. How the toolchain changed, honestly
  12. What I would not claim
  13. Resources & External Links
  14. Key Lessons
  15. Summary

Alp Yalay

Portfolio of products, websites, and bilingual systems from Istanbul.

Pages

HomeWorkCase StudiesResume

Focus

  • Personal products
  • Client websites
  • Mobile apps
  • Bilingual web systems

© 2026 Alp Yalay. All rights reserved.