fix(l10n): sneltoetsen uit één bron, en de poort die langs een extension heen keek #810

Merged
brenno merged 3 commits from fix/sneltoetsen-vertaalpoort-803 into main 2026-07-24 17:33:05 +00:00
Owner

Closes #803.

Het besluit

Het issue vroeg niet om "even door d() halen" maar om een keuze: is een sneltoets vertaalbare tekst of een identifier? Allebei, maar niet in hetzelfde stuk.

De toets (S, Z, F) hangt aan een LogicalKeyboardKey en verandert niet met de taal — wie die vertaalt, beschrijft een toets die niet werkt. De modificatietoets verandert wél, en de vertalingen deden dat al: Duits leest Strg/Cmd+Z. Alleen dát deel loopt nu door d(); lib/utils/shortcut_label.dart stelt de rest samen.

Kosten: twee bronstrings (Ctrl/Cmd, Shift) in plaats van één per sneltoets. De volgende sneltoets kost geen 31 vertalingen meer. De sleutels undo, redo en saveShortcut konden weg — hun sneltoets zat ín de vertaalde tekst, en dat was precies het tweede patroon.

Duits was de toets: die zag Strg in de werkbalk en Ctrl in het menu ernaast.

De blinde vlek

Bevestigd met een proef vóór de reparatie: een kale literal in _menuItem(…) liet de poort groen. Een aanroep zonder doel binnen extension _X on _YState werd geknoopt aan de naam van de extension, terwijl de declaratie onder de klasse staat. Dat is het patroon waarmee deze repo grote widgets onder de bestandsgrens houdt, dus het gold breed.

Gedicht via extensionOwner in beide bezoekers. Twee fixture-tests staan rood zonder de fix, groen ermee.

Het dichten legde negen onvertaalde regels in het Over-venster bloot (adres, e-mail, KvK, IBAN, BIC, bank, pilot-domein) — nu door d() + unchangedInAllLanguages.

Wat er niet in zit

De tweede route uit het issue, de veldsprong via PaletteCommand.shortcut, is wel gemeten: hij is langs dezelfde weg dichtbaar en legt 23 échte overtredingen bloot, waaronder standard.bundled in reference_standards.dart — Nederlandse proza die met een kale Text() in 31 talen blijft staan. Dat vraagt een eigen productbeslissing (horen catalogusbeschrijvingen in l10n?), dus staat het als #809 met de werkende patch beschreven. Tot die tijd draagt de wacht in test/shortcut_label_test.dart dat halve gat.

Onderweg gevonden

De toetsenlegenda van de presenter beloofde Ctrl+N en Ctrl+W terwijl beide bindings control || meta zijn: op een Mac stond daar al het verkeerde. En mijn eigen wacht had eerst een valse negatief — 'Esc · Ctrl+W' las als proza omdat "Esc" een woord leek. Aangescherpt, en die regel viel er meteen uit.

Borging

  • test/shortcut_label_test.dart — de vertaalde helften per taal, plus de wacht dat geen enkel bestand in lib/ nog zelf een sneltoets schrijft. Een sneltoets ín een vertaalde zin mag wél (proza kan niet samengesteld worden); het onderscheid is of er een woord overblijft als je de notatie wegstreept.
  • test/check_hardcoded_text_tool_test.dart — twee fixtures voor de extension-resolutie, beide geverifieerd rood zonder de fix.

make check groen (exitcode 0 gecontroleerd, niet door een pipe gelezen).

Closes #803. ## Het besluit Het issue vroeg niet om "even door `d()` halen" maar om een keuze: is een sneltoets vertaalbare tekst of een identifier? **Allebei, maar niet in hetzelfde stuk.** De toets (`S`, `Z`, `F`) hangt aan een `LogicalKeyboardKey` en verandert niet met de taal — wie die vertaalt, beschrijft een toets die niet werkt. De modificatietoets verandert wél, en de vertalingen deden dat al: Duits leest `Strg/Cmd+Z`. Alleen dát deel loopt nu door `d()`; `lib/utils/shortcut_label.dart` stelt de rest samen. Kosten: **twee** bronstrings (`Ctrl/Cmd`, `Shift`) in plaats van één per sneltoets. De volgende sneltoets kost geen 31 vertalingen meer. De sleutels `undo`, `redo` en `saveShortcut` konden weg — hun sneltoets zat ín de vertaalde tekst, en dat was precies het tweede patroon. Duits was de toets: die zag Strg in de werkbalk en Ctrl in het menu ernaast. ## De blinde vlek Bevestigd met een proef vóór de reparatie: een kale literal in `_menuItem(…)` liet de poort groen. Een aanroep zonder doel binnen `extension _X on _YState` werd geknoopt aan de naam van de **extension**, terwijl de declaratie onder de klasse staat. Dat is het patroon waarmee deze repo grote widgets onder de bestandsgrens houdt, dus het gold breed. Gedicht via `extensionOwner` in beide bezoekers. Twee fixture-tests staan rood zonder de fix, groen ermee. Het dichten legde **negen** onvertaalde regels in het Over-venster bloot (adres, e-mail, KvK, IBAN, BIC, bank, pilot-domein) — nu door `d()` + `unchangedInAllLanguages`. ## Wat er niet in zit De tweede route uit het issue, de veldsprong via `PaletteCommand.shortcut`, is **wel gemeten**: hij is langs dezelfde weg dichtbaar en legt **23 échte** overtredingen bloot, waaronder `standard.bundled` in `reference_standards.dart` — Nederlandse proza die met een kale `Text()` in 31 talen blijft staan. Dat vraagt een eigen productbeslissing (horen catalogusbeschrijvingen in l10n?), dus staat het als #809 met de werkende patch beschreven. Tot die tijd draagt de wacht in `test/shortcut_label_test.dart` dat halve gat. ## Onderweg gevonden De toetsenlegenda van de presenter beloofde `Ctrl+N` en `Ctrl+W` terwijl beide bindings `control || meta` zijn: op een Mac stond daar al het verkeerde. En mijn eigen wacht had eerst een valse negatief — `'Esc · Ctrl+W'` las als proza omdat "Esc" een woord leek. Aangescherpt, en die regel viel er meteen uit. ## Borging - `test/shortcut_label_test.dart` — de vertaalde helften per taal, plus de wacht dat geen enkel bestand in `lib/` nog zelf een sneltoets schrijft. Een sneltoets ín een vertaalde zin mag wél (proza kan niet samengesteld worden); het onderscheid is of er een woord overblijft als je de notatie wegstreept. - `test/check_hardcoded_text_tool_test.dart` — twee fixtures voor de extension-resolutie, beide geverifieerd rood zonder de fix. `make check` groen (exitcode 0 gecontroleerd, niet door een pipe gelezen).
Er leefden er twee. Het commandopalet droeg losse literals
(shortcut: 'Ctrl/Cmd+S') en het ⋮-menu een achtervoegsel buiten d() om,
terwijl de vertaalbestanden de sneltoets juist ÍN de vertaalde tekst
hadden staan: 'undo': 'Rückgängig (Strg/Cmd+Z)'. Wie de app in het Duits
gebruikte zag beide tegelijk — Strg in de werkbalk, Ctrl in het menu
ernaast.

De vraag eronder is of een sneltoets tekst is of een identifier. Het
antwoord is allebei, maar niet in hetzelfde stuk: de toets hangt aan een
LogicalKeyboardKey en verandert niet met de taal, de modificatietoets wél
— en de bestaande vertalingen deden dat al. Alleen dat deel loopt nu door
d(); shortcut_label.dart stelt de rest samen. Twee bronstrings in plaats
van één per sneltoets, dus de volgende kost geen 31 vertalingen. De
sleutels undo, redo en saveShortcut konden weg.

De wacht in shortcut_label_test vond meteen twee regels die niemand
zocht: de toetsenlegenda beloofde Ctrl+N en Ctrl+W terwijl beide
bindings `control || meta` zijn. Op een Mac stond daar dus al het
verkeerde.

Refs #803
Deze repo hakt grote widgets in `part of`-bestanden met elk een extension
op dezelfde state-klasse, om onder de bestandsgrensratchet te blijven. De
aanroep staat dan in `extension _Menu on _ShellState` terwijl de
declaratie in _ShellState zelf zit — en check_hardcoded_text knoopte die
aan de naam van de EXTENSION. Twee sleutels die nooit bij elkaar kwamen,
dus bleef de literal onzichtbaar. Dezelfde helper naar top-level tillen
liet hem meteen wél opvallen: de vorm van de aanroeper besliste of er
gekeken werd, en dat is precies hoe een patroon ongemerkt doorgroeit.

Het dichten legde negen onvertaalde regels in het Over-venster bloot —
adres, e-mail, KvK, IBAN, BIC, bank en de pilot-domeinnaam. Die lopen nu
door d() en staan op unchangedInAllLanguages: vertalen zou ze onvindbaar
maken bij de instantie die ze uitgaf.

_aboutKeyValue verhuist naar top-level. Het heeft niets van de state
nodig, en anders tikt de klasse-plafondratchet aan op puur commentaar —
zelfde reden als _publisherCardBody ernaast.

De tweede ontsnappingsroute uit #803, de veldsprong via
PaletteCommand.shortcut, zit hier NIET in: die legt 23 échte
overtredingen bloot die een eigen afweging vragen. Staat als #809.

Refs #803
docs(l10n): de sneltoetsbron in de bronkaart, en waarom er één patroon is
All checks were successful
scans / scans (pull_request) Successful in 3m15s
f580126e0e
Closes #803
brenno force-pushed fix/sneltoetsen-vertaalpoort-803 from f580126e0e
All checks were successful
scans / scans (pull_request) Successful in 3m15s
to f51a84949e
All checks were successful
scans / scans (pull_request) Successful in 3m15s
2026-07-24 17:32:59 +00:00
Compare
brenno merged commit 7f07d04282 into main 2026-07-24 17:33:05 +00:00
Sign in to join this conversation.
No description provided.