fix(l10n): vertaal de vijftien Engelse meldingen, en laat de poort ze zien (#677) #690

Merged
brenno merged 3 commits from fix/onvertaalde-meldingen-677 into main 2026-07-22 21:10:57 +00:00
Owner

Sluit #677.

De vijftien meldingen zijn vertaald

In de, es, fr, fy, it en pap. Register en terminologie zijn per taal uit het bestand zelf gehaald in plaats van verzonnen — Stichpunkte in het Duits, viñetas in het Spaans, puces in het Frans — en bij "Erg veel …" volgt de vertaling de consensus van de 25 talen die het al goed hadden ("te veel", niet "heel veel").

Er kwamen er vier bij die je telling niet had: woorden, niveau en tegenover waren net zo Engels en wórden getoond, midden in dezelfde meldingen. Een Duitse gebruiker las (140 words) en (level 4). Die zijn meegegaan.

En het woord bullets stond hardgecodeerd

Twee keer, buiten l10n.d(), midden in een verder wél vertaalde zin:

Viele Stichpunkte auf dieser Folie (12 bullets).

Vertaald begin, onvertaald staartje, in dezelfde melding. De sleutel bestond al in alle 32 talen en werd alleen niet aangeroepen — dezelfde fout, één laag dieper, en botst bovendien met de regel "geen zichtbare tekst buiten l10n.d()".

De poort die dit voortaan ziet

test/l10n_untranslated_test.dart, meegenomen in make l10n-check. De regel: een waarde die letterlijk gelijk is aan de Engelse vertaling van dezelfde sleutel, in een taal die geen Engels is, is vrijwel altijd een niet-vertaalde string.

Dat "vrijwel" is het hele ontwerp, en het is de reden dat jouw voorstel niet één-op-één te bouwen was. Losse woorden zijn massaal identiek zonder dat er iets mis is: Logo, Design, Version, Classification in het Frans. Een naïeve gelijkheidstoets vindt er 446 en heeft in ruim driehonderd gevallen ongelijk. Dat is geen poort maar ruis, en ruis wordt weggeklikt.

Daarom telt alleen wat drie woorden of meer is: een hele zin die in twee talen identiek is, is geen toeval. Dat vond er precies 93 — de 90 echte plus drie terechte uitzonderingen, die met reden in de lijst staan: een pangram die als lettertypevoorbeeld dient, een CVSS-vakterm, en één Deens leenwoord.

Wat de keuze kost staat in de test zelf: een onvertaalde string van één of twee woorden glipt erdoorheen. Dat is de prijs voor een poort die niet liegt, en hij is te betalen — deze fout bestond uit hele zinnen.

De parser heeft een eigen zelftoets, want hij moet drie dingen aankunnen die in deze bestanden echt voorkomen: een dubbele punt in de wáárde, een ontsnapt aanhalingsteken in de sleutel, en een paar dat dart format over twee regels brak. Dat laatste is geen detail — juist de lange waarden worden gebroken, en dat zijn precies de zinnen waar deze poort over gaat.

Poort

make check groen (niet door tail gepijpt), make l10n-check groen.

Sluit #677. ## De vijftien meldingen zijn vertaald In `de`, `es`, `fr`, `fy`, `it` en `pap`. Register en terminologie zijn per taal uit het bestand zelf gehaald in plaats van verzonnen — `Stichpunkte` in het Duits, `viñetas` in het Spaans, `puces` in het Frans — en bij *"Erg veel …"* volgt de vertaling de consensus van de 25 talen die het al goed hadden ("te veel", niet "heel veel"). Er kwamen er vier bij die je telling niet had: `woorden`, `niveau` en `tegenover` waren net zo Engels en wórden getoond, midden in dezelfde meldingen. Een Duitse gebruiker las `(140 words)` en `(level 4)`. Die zijn meegegaan. ## En het woord `bullets` stond hardgecodeerd Twee keer, buiten `l10n.d()`, midden in een verder wél vertaalde zin: Viele Stichpunkte auf dieser Folie (12 bullets). Vertaald begin, onvertaald staartje, in dezelfde melding. De sleutel bestond al in alle 32 talen en werd alleen niet aangeroepen — dezelfde fout, één laag dieper, en botst bovendien met de regel "geen zichtbare tekst buiten `l10n.d()`". ## De poort die dit voortaan ziet `test/l10n_untranslated_test.dart`, meegenomen in `make l10n-check`. De regel: een waarde die letterlijk gelijk is aan de Engelse vertaling van dezelfde sleutel, in een taal die geen Engels is, is vrijwel altijd een niet-vertaalde string. **Dat "vrijwel" is het hele ontwerp**, en het is de reden dat jouw voorstel niet één-op-één te bouwen was. Losse woorden zijn massaal identiek zonder dat er iets mis is: `Logo`, `Design`, `Version`, `Classification` in het Frans. Een naïeve gelijkheidstoets vindt er **446** en heeft in ruim driehonderd gevallen ongelijk. Dat is geen poort maar ruis, en ruis wordt weggeklikt. Daarom telt alleen wat **drie woorden of meer** is: een hele zin die in twee talen identiek is, is geen toeval. Dat vond er precies 93 — de 90 echte plus drie terechte uitzonderingen, die met reden in de lijst staan: een pangram die als lettertypevoorbeeld dient, een CVSS-vakterm, en één Deens leenwoord. Wat de keuze kost staat in de test zelf: een onvertaalde string van één of twee woorden glipt erdoorheen. Dat is de prijs voor een poort die niet liegt, en hij is te betalen — deze fout bestond uit hele zinnen. De parser heeft een eigen zelftoets, want hij moet drie dingen aankunnen die in deze bestanden echt voorkomen: een dubbele punt in de wáárde, een ontsnapt aanhalingsteken in de sleutel, en een paar dat `dart format` over twee regels brak. Dat laatste is geen detail — juist de lange waarden worden gebroken, en dat zijn precies de zinnen waar deze poort over gaat. ## Poort `make check` groen (niet door `tail` gepijpt), `make l10n-check` groen.
Zes talen — de, es, fr, fy, it, pap — droegen vijftien kwaliteitsmeldingen
als onvertaald Engels. Het kwaliteitspaneel zette die pal naast correct
vertaalde meldingen: een Duitse gebruiker las "Many bullets on this slide"
naast een Duitse zin, op de plek waar de app juist gezaghebbend hoort te
klinken — hij vertelt je immers wat er mis is met jouw werk.

`make l10n-check` zag het niet, en dat is het eigenlijke gat: die poort
toetst dekking (staat er een waarde bij deze sleutel?) en niet of die
waarde in de doeltaal staat. Een Engelse zin in het Duitse bestand is voor
hem een ingevulde string.

Er staat nu een poort naast die wél kijkt: een waarde die letterlijk gelijk
is aan de Engelse vertaling van dezelfde sleutel is vrijwel altijd een
niet-vertaalde string.

Vrijwel — en dat "vrijwel" is het hele ontwerp. Losse woorden zijn massaal
identiek zonder dat er iets mis is: `Logo`, `Design`, `Version`,
`Classification` in het Frans. Een naïeve gelijkheidstoets vindt er 446 en
heeft in ruim driehonderd gevallen ongelijk; dat is geen poort maar ruis,
en ruis wordt weggeklikt. Daarom telt alleen wat drie woorden of meer is:
een hele zin die in twee talen identiek is, is geen toeval. Wat die keuze
kost staat in de test: een onvertaalde string van één of twee woorden
glipt erdoorheen. Dat is de prijs voor een poort die niet liegt.

Drie uitzonderingen staan met reden in de lijst: een pangram die als
lettertypevoorbeeld dient, een CVSS-vakterm, en één Deens leenwoord.

Sluit #677.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Gevonden bij het vertalen van de vijftien meldingen hierboven. Het woord
`bullets` stond twee keer hardgecodeerd buiten `l10n.d()` in
`slide_quality_localization.dart`, midden in een verder wél vertaalde zin:

    Viele Stichpunkte auf dieser Folie (12 bullets).

Vertaald begin, onvertaald staartje, in dezelfde melding. De sleutel
bestond al in alle 32 talen en werd alleen niet aangeroepen — het is dus
de goedkoopste helft van dit issue, en hij hoort erbij: het is precies
dezelfde fout, één laag dieper.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
test(l10n): 'bullets' is in het Engels hetzelfde woord
Some checks failed
CI / Web hardening (pull_request) Failing after 24s
CI / Supply-chain (Trivy · advisory) (pull_request) Failing after 28s
CI / Docs links (pull_request) Failing after 30s
CI / Gate (Linux) · Format · Analyze · Coverage (pull_request) Failing after 30s
CI / Gate (Linux) · Format · Analyze · Coverage (push) Failing after 25s
CI / Docs links (push) Failing after 26s
CI / Web hardening (push) Failing after 28s
CI / Supply-chain (Trivy · advisory) (push) Failing after 24s
CI / Test (macos-latest) (pull_request) Has been cancelled
CI / Test (windows-latest) (pull_request) Has been cancelled
CI / Test (macos-latest) (push) Has been cancelled
CI / Test (windows-latest) (push) Has been cancelled
caf201c1cc
De poort 'elke Nederlandse bronstring heeft een Engelse vertaling' meldt
een string waarvan de Engelse waarde gelijk is aan de bron. Voor 'bullets'
klopt dat en is het geen fout — net als bij 'slides', dat er al om
dezelfde reden stond. De andere 31 talen vertalen het wél.

Kwam pas boven toen het woord door `d()` ging in plaats van hardgecodeerd
midden in de zin te staan; dáárvoor zag geen enkele poort hem.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
brenno merged commit 3e60d9afc5 into main 2026-07-22 21:10:57 +00:00
Sign in to join this conversation.
No description provided.