The bug that only existed in German
A repeating reminder showed the English word "daily" in all nine translations. The test suite built to catch exactly that never saw it. Here is the gap.
Latr ships in nine languages, and the build refuses to pass if any of them is missing a string. There is a check that scans every source file for English text and fails on anything that looks like a sentence. It has caught real mistakes.
It did not catch this one.
The symptom
A reminder set to repeat weekly displayed, in its row, the word “daily” or “weekly” — in English — sitting immediately next to fully translated text. In the German build. In the Japanese build. In all nine.
Why the guard missed it
The check looks for English string literals in source files. The offending line was:
if (event.recurring) meta.append(dim('·'), event.recurring.type);
There is no English in that line. event.recurring.type is a stored value — the
string 'weekly' that was written to storage when the user picked it from a dropdown.
It took a scenic route from a <option value="weekly"> into the database and back out
onto the screen, and at no point did it look like text to a linter.
The general shape of the problem
This is a whole class of internationalisation bug, and it is invisible to the usual tooling:
Any time a stored enum reaches the interface, it needs a label map.
The value in storage and the word on screen are different things. They happened to be spelled the same in the language the product was written in, which is exactly what makes it easy to miss and hard to notice for months.
The fix was four lines — a map from stored value to message key, mirroring the one that already existed for colour tags:
const REPEAT_NAME = {
daily: 'repeatDaily',
weekdays: 'repeatWeekdays',
weekly: 'repeatWeekly',
monthly: 'repeatMonthly',
};
The dropdown that sets the value was already built from those exact message keys. The row that displayed it was ignoring nine complete translation catalogues that were sitting right there.
What we changed beyond the fix
Finding it by eye, in a screenshot, is not a process. The lesson we took was not “look harder at German builds” but “the guard was checking the wrong layer” — and the same week we added a second one for duplicate element IDs, after a similar bug where a new button silently collided with an existing one and no check noticed.
A test suite is only as good as the failure modes it imagines. Two of ours were missing.