[Bug] De vertaalpoort ziet een veldsprong niet — 23 onvertaalde regels staan er nu al #809

Closed
opened 2026-07-24 17:27:52 +00:00 by brenno · 2 comments
Owner

De poort check-hardcoded-text volgt argumenten terug naar hun declaratie, maar
verliest het spoor zodra een string via een VELD van een object reist. Gemeten
tijdens #803: dat gat is dichtbaar, en erachter staan 23 échte overtredingen.

Het patroon. lib/widgets/dialogs/command_palette.dart rendert de
sneltoetshint met _shortcutHint(cmd.shortcut!). De put ligt binnen
_shortcutHint (Text(text)), maar cmd is een lokale variabele zonder
opgelost type, dus komt de datastroomanalyse niet bij PaletteCommand.shortcut
en blijft shortcut: '…' op de aanroepplaats onzichtbaar. Dit staat als bekende
blinde vlek in de kop van tool/check_hardcoded_text.dart ("Strings die via een
lijst, een veld of een Map reizen").

Hoe het te dichten is. Langs dezelfde weg als methodOwners al doet voor een
aanroep op een variabele: declareert precies één klasse die veldnaam, dan is de
toewijzing eenduidig. Concreet een fieldOwners-afbeelding op _Index (af te
leiden uit de bestaande fields) plus een tak in _originsOf voor een
PrefixedIdentifier/PropertyAccess op een ander doel dan this/widget,
inclusief de !-vorm (PostfixExpression). Werkende patch is bij #803 gemaakt en
gemeten, ~94 toegevoegde regels; hij is daar weer uit gehaald omdat de bevindingen
eronder een eigen afweging vragen.

Wat eronder vandaan komt: 23 overtredingen, verdeling services 14, models 9.
Ze zijn echt, niet cosmetisch:

  • lib/services/reference_standards.dart — de velden bundled en licence
    worden in settings_dialog_standards.dart met een kále Text() gerenderd.
    Dat zijn zeven Nederlandse beschrijvingen ("De checklist-index: per test het
    stabiele id, de canonieke titel en de categorie…") die in 31 talen Nederlands
    blijven, plus de licentie-aanduidingen (CC-BY-SA-4.0, MITRE Terms of Use,
    EUPL-1.2).
  • lib/models/settings.dart — negen hexkleuren (#DC2626, #FFFFFF, …).

Waarom dit een eigen issue is. De beschrijvingen zijn proza: dat zijn ~7
bronstrings × 31 talen, en er zit een keuze onder die niet vanzelf spreekt —
horen catalogusbeschrijvingen in l10n, of zijn het referentiedata die net als de
MASTG-titels ongemoeid horen te blijven? De licentie-aanduidingen en de
hexkleuren zijn identifiers en gaan via d() naar unchangedInAllLanguages, dat
deel is mechanisch. Die twee vragen niet dezelfde beslissing.

Waar te beginnen. Eerst de vraag over de beschrijvingen beantwoorden
(productowner + bewaker), dán de patch terugzetten en de poort groen maken. De
patch los terugzetten laat make check rood achter.

Herkomst: gevonden en gemeten tijdens #803, bewust niet daar opgelost.

De poort `check-hardcoded-text` volgt argumenten terug naar hun declaratie, maar verliest het spoor zodra een string via een VELD van een object reist. Gemeten tijdens #803: dat gat is dichtbaar, en erachter staan 23 échte overtredingen. **Het patroon.** `lib/widgets/dialogs/command_palette.dart` rendert de sneltoetshint met `_shortcutHint(cmd.shortcut!)`. De put ligt binnen `_shortcutHint` (`Text(text)`), maar `cmd` is een lokale variabele zonder opgelost type, dus komt de datastroomanalyse niet bij `PaletteCommand.shortcut` en blijft `shortcut: '…'` op de aanroepplaats onzichtbaar. Dit staat als bekende blinde vlek in de kop van `tool/check_hardcoded_text.dart` ("Strings die via een lijst, een veld of een `Map` reizen"). **Hoe het te dichten is.** Langs dezelfde weg als `methodOwners` al doet voor een aanroep op een variabele: declareert precies één klasse die veldnaam, dan is de toewijzing eenduidig. Concreet een `fieldOwners`-afbeelding op `_Index` (af te leiden uit de bestaande `fields`) plus een tak in `_originsOf` voor een `PrefixedIdentifier`/`PropertyAccess` op een ander doel dan `this`/`widget`, inclusief de `!`-vorm (`PostfixExpression`). Werkende patch is bij #803 gemaakt en gemeten, ~94 toegevoegde regels; hij is daar weer uit gehaald omdat de bevindingen eronder een eigen afweging vragen. **Wat eronder vandaan komt: 23 overtredingen, verdeling services 14, models 9.** Ze zijn echt, niet cosmetisch: - `lib/services/reference_standards.dart` — de velden `bundled` en `licence` worden in `settings_dialog_standards.dart` met een kále `Text()` gerenderd. Dat zijn zeven Nederlandse beschrijvingen ("De checklist-index: per test het stabiele id, de canonieke titel en de categorie…") die in 31 talen Nederlands blijven, plus de licentie-aanduidingen (`CC-BY-SA-4.0`, `MITRE Terms of Use`, `EUPL-1.2`). - `lib/models/settings.dart` — negen hexkleuren (`#DC2626`, `#FFFFFF`, …). **Waarom dit een eigen issue is.** De beschrijvingen zijn proza: dat zijn ~7 bronstrings × 31 talen, en er zit een keuze onder die niet vanzelf spreekt — horen catalogusbeschrijvingen in l10n, of zijn het referentiedata die net als de MASTG-titels ongemoeid horen te blijven? De licentie-aanduidingen en de hexkleuren zijn identifiers en gaan via `d()` naar `unchangedInAllLanguages`, dat deel is mechanisch. Die twee vragen niet dezelfde beslissing. **Waar te beginnen.** Eerst de vraag over de beschrijvingen beantwoorden (productowner + bewaker), dán de patch terugzetten en de poort groen maken. De patch los terugzetten laat `make check` rood achter. **Herkomst:** gevonden en gemeten tijdens #803, bewust niet daar opgelost.
Author
Owner

Opgepakt. Tak: fix/veldsprong-vertaalpoort-809.

Verwachte reikwijdte:

  • tool/check_hardcoded_text.dart (fieldOwners + tak in _originsOf) + test/check_hardcoded_text_tool_test.dart
  • lib/services/reference_standards.dart en lib/models/settings.dart (de 23 bevindingen)
  • lib/l10n/translations/*.dart + test/app_localizations_test.dart
  • docs/ waar nodig

Eerste stap is de vraag uit het issue beantwoorden voordat er iets vertaald wordt, en per bevinding nagaan of hij écht gerenderd wordt — de eenduidige-bezitter-heuristiek kan een veld aan de verkeerde klasse knopen.

Opgepakt. Tak: fix/veldsprong-vertaalpoort-809. Verwachte reikwijdte: - tool/check_hardcoded_text.dart (fieldOwners + tak in _originsOf) + test/check_hardcoded_text_tool_test.dart - lib/services/reference_standards.dart en lib/models/settings.dart (de 23 bevindingen) - lib/l10n/translations/*.dart + test/app_localizations_test.dart - docs/ waar nodig Eerste stap is de vraag uit het issue beantwoorden voordat er iets vertaald wordt, en per bevinding nagaan of hij écht gerenderd wordt — de eenduidige-bezitter-heuristiek kan een veld aan de verkeerde klasse knopen.
Author
Owner

Gemerged als 6b8e5fb0 (PR #813), op main geverifieerd.

De poort volgt nu een veldsprong, langs de weg die het issue voorstelde. Bewust streng gehouden: alleen bij precies één bezitter van de veldnaam. name en title staan op tientallen klassen en blijven dus buiten beeld — een melding die naar het verkeerde bestand wijst kost meer dan een gemiste. Daar staat een test op.

De schatting van 23 klopte niet helemaal. Het waren er 14 om op te lossen en 9 om te herkennen als ruis:

  • De zeven catalogusbeschrijvingen plus de licentieregels zijn écht — een Duitse gebruiker kreeg een Duits instellingenvenster met zeven Nederlandse alinea's. 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 identifiers en staan op unchangedInAllLanguages.
  • De negen hexkleuren waren dat níét. ThemeProfile toont zijn waarden naast het label, dus #FFCC00 gold als zichtbare tekst — mét letters erin, dus de lettertoets ving het niet. En onoplosbaar: de presets zijn const in lib/models, en een model importeert geen l10n. Een kleurcode staat nu in dezelfde categorie als en %.

De vraag uit het issue — interfaceproza of referentiedata — heeft een scherpere grens dan hij leek. De canonieke titels van MASTG en WSTG blijven onvertaald omdát vertalen ze onvindbaar maakt bij de bron. Een zin die wíj schreven over wat we bundelen valt daar niet onder. d() staat op de renderplek en niet in de catalogus: die is const, en lib/services hoort geen l10n te importeren — de erkende indirecte vorm, dezelfde als EditorField(label: …).

Kanttekening bij de uitvoering. Halverwege zette een andere sessie de gedeelde werkkopie op fix/testcache-laadfout-798, waardoor mijn eerste twee commits op díé tak belandden. Ze staan daar nog. Deze PR is opnieuw opgebouwd in een aparte worktree vanaf main en bevat nul regels #798-werk, maar die tak draagt wél mijn commits — bij een rebase op main vallen ze vanzelf weg.

Gemerged als 6b8e5fb0 (PR #813), op main geverifieerd. **De poort** volgt nu een veldsprong, langs de weg die het issue voorstelde. Bewust streng gehouden: alleen bij precies één bezitter van de veldnaam. `name` en `title` staan op tientallen klassen en blijven dus buiten beeld — een melding die naar het verkeerde bestand wijst kost meer dan een gemiste. Daar staat een test op. **De schatting van 23 klopte niet helemaal.** Het waren er 14 om op te lossen en 9 om te herkennen als ruis: - De zeven catalogusbeschrijvingen plus de licentieregels zijn écht — een Duitse gebruiker kreeg een Duits instellingenvenster met zeven Nederlandse alinea's. 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 identifiers en staan op `unchangedInAllLanguages`. - De negen hexkleuren waren dat níét. `ThemeProfile` toont zijn waarden naast het label, dus `#FFCC00` gold als zichtbare tekst — mét letters erin, dus de lettertoets ving het niet. En onoplosbaar: de presets zijn `const` in lib/models, en een model importeert geen l10n. Een kleurcode staat nu in dezelfde categorie als `•` en `%`. **De vraag uit het issue** — interfaceproza of referentiedata — heeft een scherpere grens dan hij leek. De canonieke titels van MASTG en WSTG blijven onvertaald omdát vertalen ze onvindbaar maakt bij de bron. Een zin die wíj schreven over wat we bundelen valt daar niet onder. `d()` staat op de renderplek en niet in de catalogus: die is `const`, en lib/services hoort geen l10n te importeren — de erkende indirecte vorm, dezelfde als `EditorField(label: …)`. **Kanttekening bij de uitvoering.** Halverwege zette een andere sessie de gedeelde werkkopie op `fix/testcache-laadfout-798`, waardoor mijn eerste twee commits op díé tak belandden. Ze staan daar nog. Deze PR is opnieuw opgebouwd in een aparte worktree vanaf main en bevat nul regels #798-werk, maar die tak draagt wél mijn commits — bij een rebase op main vallen ze vanzelf weg.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
LibreKAT/Ocideck#809
No description provided.