今日已更新 177 条资讯 | 累计 42235 条内容
关于我们

I built the localization checker before the localization. It still missed three defects.

Maksim Demin 2026年09月12日 05:28 3 次阅读 来源:Dev.to

Parlotype's UI was English-only, with the copy baked into markup and C#: 211 literal attributes across 26 .axaml files, roughly 200 string literals across 48 view models, plus the tray menu, the dialogs and the toasts. I wanted Russian and Spanish, and I wanted the ninth language to cost one translation file and nothing else. Most of that work is mechanical, which makes it a good fit for an agent. I ran it as a directed session with Claude Code: I made the architectural calls and reviewed everything, the agent did the extraction, the translations, the tests and most of the implementation. The result is on master. 389 keys in three languages, 122 files changed, +11,467 / -618. I built the guardrails before the bulk work: a parity script, an xUnit mirror of it, two Claude Code hooks and a skill file. Three user-visible defects shipped past all of them anyway. Each one was a different category of blind spot, and none was a translation error. That is what this post is about. Some context on me: twenty years across C, C++, Java and Scala, about two years into .NET. This is the second postmortem from Parlotype , a local voice-to-text desktop app I build in the open with .NET 10 and Avalonia 12. Guardrails before the work they guard The obvious order is: extract the strings, then write something that checks them. I inverted it. The checker, the test, the hooks and the skill all landed in phase 2, before a single one of the ~450 keys moved. The reason is specific to agent work. An agent doing bulk mechanical extraction across 26 markup files will drift: miss an attribute, invent a key naming scheme halfway through, translate one locale and forget the other. A human reviewer catches that at review time, which is the expensive moment. A checker catches it in the loop, which is free. What went in first: scripts/check-localization.ps1 . Key parity across locales, placeholder parity ( {0} counts must match, or string.Format throws in front of a user), every {loc:Tr} key in marku

本文内容来源于互联网,版权归原作者所有
查看原文