The {{count}} that wasn't there
DanceClub now speaks 15 languages. The gap between two and fifteen closed in one night. The hardest bug wasn't the translation. It was the safety net.
DanceClub now speaks 15 languages. Before this week it spoke two.
The gap wasn't strategy. It was "good enough for now" compounding for months. Closing it wasn't technically hard. It was just big.
I had a reason to close it fast. Dance scenes are immigrant scenes. Salsa in Berlin exists because of Cubans. Kizomba in Lisbon exists because of Angolans. Bachata in New York exists because of Dominicans. If the platform only speaks English and German, it is invisible to the people who built the scenes.
So in one night: Spanish, French, Italian, Dutch, Portuguese (Brazil and Portugal), Turkish, Polish, Czech, Swedish, Greek, Russian, Ukrainian. Stacked on top of English and German. Fifteen total.
The pipeline
Hand translations for the 500 most visible strings. A commercial translator for bulk on European locales. A second, unofficial, free endpoint for the rest when the first one's free tier ran out mid-run. Placeholder protection so {{count}} events didn't come back as events {{count}} or just events.
All of that worked. Then the validator started failing.
The bug
A thousand errors, all the same shape. The translation had dropped the placeholder. You have {{count}} events in Polish read Masz wydarzeń, trzymaj tempo. No count variable. Good Polish. Useless translation.
I had a fix script that caught exactly this. If the English original contained {{count}} and the translation did not, reset the translation to the English value. A safety net.
The safety net was the bug.
Every plural branch the translator had mangled snapped back to English. The catalog passed validation. The UI rendered English phrases inside Russian menus. The Spanish feedback page counted characters in English. Polish dashboards greeted the user in English under a Polish header.
One line of logic had decided that a broken translation was better served as English than as broken. It wasn't. It was invisible.
The fix
Correction layers should retry, not revert. Stronger placeholder protection on the way in. Retry on failure. Only fall back to English if the retry also fails, and log it so the next pass can repair it.
I re-ran every reverted branch with ASCII sentinel tokens that translators leave alone. The plural branches came back correct. The app actually spoke the language.
The principle
When automation produces garbage, don't silently substitute the source. The user asked for Russian. Serving English inside a Russian menu is not safety. It's a different kind of failure, one that hides inside a green pipeline.
The whole run was orchestrated through PulseAI, every node traced, every retry logged. That trace is what let me find 2,967 silent fallbacks in one grep and fix them in a single pass.
Fail loud. Revert last. Log everything in between.
Get the next one in your inbox.
No schedule, no spam. One email when I publish something new.
If this resonated, you might like the manifesto or the archive.
Edvard Grei · edvone.dev