fix(l10n): de poort volgt nu een veldsprong — en veertien regels bleken in 31 talen Nederlands #813

Merged
brenno merged 2 commits from fix/veldsprong-809 into main 2026-07-24 18:18:15 +00:00
Owner

Closes #809.

De reparatie

De analyse volgde argumenten terug naar hun declaratie, maar verloor het spoor zodra een string via een veld reisde: _shortcutHint(cmd.shortcut!) heeft zijn put binnen de helper, terwijl cmd een lokale variabele zonder opgelost type is.

Gedicht langs de weg die al bestond voor een aanroep op een variabele — declareert precies één klasse die veldnaam, dan is het eenduidig. Bewust streng gehouden: name en title staan op tientallen klassen en blijven buiten beeld. Een melding die naar het verkeerde bestand wijst kost iemand een halve dag zoeken naar een fout die er niet is; dat is duurder dan een gemiste melding. Er staat een test op die grens.

Wat eronder vandaan kwam

Veertien echte regels. De zeven catalogusbeschrijvingen in reference_standards.dart werden met een kale Text() gerenderd. Wie de app in het Duits gebruikte, kreeg een Duits instellingenvenster met daarin zeven Nederlandse alinea's.

De vraag die het issue stelde — interfaceproza of referentiedata? — heeft een scherpe grens: de canonieke titels van MASTG en WSTG blijven onvertaald omdat vertalen ze onvindbaar maakt bij de bron. Een zin die wíj schreven over wat we bundelen valt daar niet onder. Dus vertaald: acht bronstrings, 248 vertalingen. De licentie-aanduidingen (CC-BY-SA-4.0, EUPL-1.2, MITRE Terms of Use, CC-BY-4.0) zijn wél identifiers en staan op unchangedInAllLanguages.

d() staat op de renderplek en niet in de catalogus: die is const, en lib/services hoort geen l10n te importeren. Dat is de erkende indirecte vorm, dezelfde als EditorField(label: …).

En negen die er niet thuishoorden. ThemeProfile toont zijn hexwaarden naast het label, dus #FFCC00 gold ineens als zichtbare tekst — er staan letters in, dus de lettertoets hielp niet. Onoplosbaar bovendien: de presets zijn const in lib/models, en een model importeert geen l10n. Een kleurcode staat nu in dezelfde categorie als en %. Een melding die niemand kán wegwerken is geen poort maar ruis.

Het issue schatte 23 bevindingen die allemaal opgelost moesten worden; de juiste uitkomst bleek 14 oplossen en 9 herkennen als ruis.

Borging

Twee nieuwe fixtures in check_hardcoded_text_tool_test.dart (de veldsprong wordt gevolgd; een veldnaam met meer bezitters juist niet) plus de kleurcodes in de isVisibleText-test. Geverifieerd rood zonder de fix.

make check groen (exitcode 0, apart gecontroleerd) — gedraaid in een schone worktree op main, zie de opmerking hieronder.

Let op bij het lezen

Tijdens dit werk zette een andere sessie de gedeelde werkkopie op fix/testcache-laadfout-798 (#798). Mijn twee commits zijn daardoor eerst op díé tak beland en staan daar nog steeds. Deze PR draait op een aparte worktree vanaf main en bevat nul regels van dat #798-werk — nagekeken. Maar fix/testcache-laadfout-798 bevat wél mijn twee commits; als die tak zo gemerged wordt, landt #809 mee in #798.

Closes #809. ## De reparatie De analyse volgde argumenten terug naar hun declaratie, maar verloor het spoor zodra een string via een **veld** reisde: `_shortcutHint(cmd.shortcut!)` heeft zijn put binnen de helper, terwijl `cmd` een lokale variabele zonder opgelost type is. Gedicht langs de weg die al bestond voor een aanroep op een variabele — declareert precies één klasse die veldnaam, dan is het eenduidig. **Bewust streng gehouden:** `name` en `title` staan op tientallen klassen en blijven buiten beeld. Een melding die naar het verkeerde bestand wijst kost iemand een halve dag zoeken naar een fout die er niet is; dat is duurder dan een gemiste melding. Er staat een test op die grens. ## Wat eronder vandaan kwam **Veertien echte regels.** De zeven catalogusbeschrijvingen in `reference_standards.dart` werden met een kale `Text()` gerenderd. Wie de app in het Duits gebruikte, kreeg een Duits instellingenvenster met daarin zeven Nederlandse alinea's. De vraag die het issue stelde — interfaceproza of referentiedata? — heeft een scherpe grens: de canonieke titels van MASTG en WSTG blijven onvertaald *omdat vertalen ze onvindbaar maakt bij de bron*. Een zin die wíj schreven over wat we bundelen valt daar niet onder. Dus vertaald: acht bronstrings, 248 vertalingen. De licentie-aanduidingen (`CC-BY-SA-4.0`, `EUPL-1.2`, `MITRE Terms of Use`, `CC-BY-4.0`) zijn wél identifiers en staan op `unchangedInAllLanguages`. `d()` staat op de renderplek en niet in de catalogus: die is `const`, en `lib/services` hoort geen l10n te importeren. Dat is de erkende indirecte vorm, dezelfde als `EditorField(label: …)`. **En negen die er niet thuishoorden.** `ThemeProfile` toont zijn hexwaarden naast het label, dus `#FFCC00` gold ineens als zichtbare tekst — er staan letters in, dus de lettertoets hielp niet. Onoplosbaar bovendien: de presets zijn `const` in `lib/models`, en een model importeert geen l10n. Een kleurcode staat nu in dezelfde categorie als `•` en `%`. Een melding die niemand kán wegwerken is geen poort maar ruis. Het issue schatte 23 bevindingen die allemaal opgelost moesten worden; de juiste uitkomst bleek 14 oplossen en 9 herkennen als ruis. ## Borging Twee nieuwe fixtures in `check_hardcoded_text_tool_test.dart` (de veldsprong wordt gevolgd; een veldnaam met meer bezitters juist niet) plus de kleurcodes in de `isVisibleText`-test. Geverifieerd rood zonder de fix. `make check` groen (exitcode 0, apart gecontroleerd) — gedraaid in een **schone worktree** op `main`, zie de opmerking hieronder. ## Let op bij het lezen Tijdens dit werk zette een andere sessie de gedeelde werkkopie op `fix/testcache-laadfout-798` (#798). Mijn twee commits zijn daardoor eerst op díé tak beland en staan daar nog steeds. Deze PR draait op een aparte worktree vanaf `main` en bevat **nul** regels van dat #798-werk — nagekeken. Maar `fix/testcache-laadfout-798` bevat wél mijn twee commits; als die tak zo gemerged wordt, landt #809 mee in #798.
De analyse volgde argumenten terug naar hun declaratie, maar verloor het
spoor zodra een string via een VELD reisde. `_shortcutHint(cmd.shortcut!)`
heeft zijn put binnen de helper, terwijl `cmd` een lokale variabele zonder
opgelost type is — dus kwam de analyse nooit bij PaletteCommand.shortcut.

Gedicht langs dezelfde weg die al bestond voor een aanroep op een
variabele: declareert precies één klasse die veldnaam, dan is het
eenduidig. Bewust streng gehouden — `name` en `title` staan op tientallen
klassen en blijven buiten beeld. Een melding die naar het verkeerde
bestand wijst kost iemand een halve dag zoeken naar een fout die er niet
is, en dat is duurder dan een gemiste melding.

Dezelfde stap bracht negen kleurcodes boven die er niet thuishoorden.
ThemeProfile toont zijn hexwaarden naast het label, dus #FFCC00 gold
ineens als zichtbare tekst — er staan letters in, dus de lettertoets
hielp niet. Onoplosbaar bovendien: de presets zijn `const` in lib/models
en een model importeert geen l10n. Een kleurcode staat nu in dezelfde
categorie als • en %.

Refs #809
fix(l10n): de catalogusbeschrijvingen stonden in 31 talen in het Nederlands
All checks were successful
scans / scans (pull_request) Successful in 3m19s
2485343564
Zeven beschrijvingen in reference_standards.dart — "De checklist-index:
per test het stabiele id, de canonieke titel en de categorie…" — werden
met een kale Text() gerenderd. Wie de app in het Duits gebruikte kreeg
een Duits instellingenvenster met daarin zeven Nederlandse alinea's.

Dat is interfaceproza, geen referentiedata. De canonieke titels van MASTG
en WSTG blijven onvertaald omdat vertalen ze onvindbaar maakt bij de bron;
een zin die wíj schreven over wat we bundelen valt daar niet onder. Acht
bronstrings, 248 vertalingen. De licentie-aanduidingen zijn wél
identifiers en staan op unchangedInAllLanguages.

d() staat op de renderplek en niet in de catalogus: die is `const`, en
lib/services hoort geen l10n te importeren. Dat is de erkende indirecte
vorm, dezelfde als EditorField(label: …).

Refs #809
brenno merged commit 6b8e5fb0e8 into main 2026-07-24 18:18:15 +00:00
Sign in to join this conversation.
No description provided.