Vertaaltabellen kunnen ongemerkt uiteenlopen zolang een sleutel ongebruikt is #1523

Closed
opened 2026-08-17 12:45:27 +00:00 by brenno · 1 comment
Owner

Bij het opruimen van de wezen (#1520) bleek dat zes talen — de, es, fr, fy, it, pap — twaalf bronsleutels al misten vóór die opruiming. Onder meer Geen audio gekozen, Auto (A), Sneltoetsen (?) en Presenter view (P).

Dat viel niemand op, en dat is het punt: de dekkingstoets all literal Dutch source strings are translated in every language scant lib/ op d('…')-literalen en eist alleen voor díe sleutels een vertaling in elke taal. Staat een sleutel wél in de tabellen maar wordt hij (even) nergens opgevraagd, dan mag hij in de ene taal bestaan en in de andere ontbreken zonder dat iets klaagt.

De twaalf zijn nu verdwenen omdat ze wees waren. Maar het gat in de bewaking blijft: een sleutel die tijdelijk niet wordt aangeroepen — bijvoorbeeld omdat een scherm in verbouwing is — kan in die periode stilletjes uit een paar talen verdwijnen, en komt dan onvolledig terug in gebruik.

Wat dit issue vraagt: een controle die de tabellen onderling vergelijkt in plaats van alleen tegen het gebruik in lib/. Elke sleutel die in één taal bestaat hoort in alle talen te bestaan, ongeacht of hij op dit moment wordt opgevraagd.

Aandachtspunten:

  • nl.dart is de brontaal en heeft alleen _stringsNl; de Nederlandse bronstrings staan per definitie niet als sleutel in die tabel. De controle moet dat weten en niet elke d('…')-sleutel als ontbrekend in nl melden.
  • Er zijn drie tabellen per taal (_strings*, _dutchSource*, _dutchSourceAdd*); de vergelijking moet per tabel gebeuren.
  • Vindt de controle bij invoering gaten, ruim die dan op in dezelfde tak — anders begint hij met een basislijst en dat is precies wat we bij #1520 hebben weggewerkt.

Gevonden bij #1520.

Bij het opruimen van de wezen (#1520) bleek dat zes talen — `de`, `es`, `fr`, `fy`, `it`, `pap` — twaalf bronsleutels **al** misten vóór die opruiming. Onder meer `Geen audio gekozen`, `Auto (A)`, `Sneltoetsen (?)` en `Presenter view (P)`. Dat viel niemand op, en dat is het punt: de dekkingstoets `all literal Dutch source strings are translated in every language` scant `lib/` op `d('…')`-literalen en eist alleen voor díe sleutels een vertaling in elke taal. Staat een sleutel wél in de tabellen maar wordt hij (even) nergens opgevraagd, dan mag hij in de ene taal bestaan en in de andere ontbreken zonder dat iets klaagt. De twaalf zijn nu verdwenen omdat ze wees waren. Maar het gat in de bewaking blijft: een sleutel die tijdelijk niet wordt aangeroepen — bijvoorbeeld omdat een scherm in verbouwing is — kan in die periode stilletjes uit een paar talen verdwijnen, en komt dan onvolledig terug in gebruik. **Wat dit issue vraagt:** een controle die de tabellen onderling vergelijkt in plaats van alleen tegen het gebruik in `lib/`. Elke sleutel die in één taal bestaat hoort in alle talen te bestaan, ongeacht of hij op dit moment wordt opgevraagd. Aandachtspunten: - `nl.dart` is de brontaal en heeft alleen `_stringsNl`; de Nederlandse bronstrings staan per definitie niet als sleutel in die tabel. De controle moet dat weten en niet elke `d('…')`-sleutel als ontbrekend in `nl` melden. - Er zijn drie tabellen per taal (`_strings*`, `_dutchSource*`, `_dutchSourceAdd*`); de vergelijking moet per tabel gebeuren. - Vindt de controle bij invoering gaten, ruim die dan op in dezelfde tak — anders begint hij met een basislijst en dat is precies wat we bij #1520 hebben weggewerkt. Gevonden bij #1520.
Author
Owner

Gebouwd en gemerged in #1529 (f3bac2a4).

De poort. tool/check_l10n_table_parity.dart + make check-l10n-parity, AST-gemeten. Twee families in plaats van drie: _dutchSource* en _dutchSourceAdd* zijn één naamruimte — add-l10n schrijft in de toevoegingen, d() leest uit allebei, en waar de knip ligt verschilt per taal puur door volgorde (meest 1266/2014, de/es/fr/it 501/2777, tr 1949/1331); per tabel vergelijken zou ruim duizend betekenisloze verschillen per taal melden. nl doet alleen mee in de _strings*-familie, zoals het issue vroeg.

In check, niet in check-full. Exacte verzamelingsvergelijking: geen tekstheuristiek, dus geen valse melding mogelijk en geen basislijn nodig. 32 bestanden, klaar in een seconde.

Gaten bij invoering, alle drie opgeruimd in dezelfde tak — geen basislijn:

  1. Vier bronsleutels (Subtitel, Kies een video, Kies een audiobestand, Platte tekst) ontbraken in de, es, fr, fy, it en pap terwijl 25 talen ze hadden en de app ze wél opvraagt → aangevuld, in de stem van de zusterregels die er al stonden.
  2. Toestemming ingetrokken en U moet eerst de privacy- en gebruiksvoorwaarden accepteren… stonden alléén in diezelfde zes talen en worden nergens opgehaald → weggehaald; aanvullen zou 50 regels dode vertaling opleveren en de wezenbasislijn van nul breken.
  3. 28 identiteitsregels van de LibrePlan-connector stonden alléén in _stringsNl (één met een Engelse waarde) en zijn onbereikbaar, want d() raadpleegt voor nl geen tabel → weggehaald.

De test toetst in twee richtingen op mini-repo's: geen alarm bij gelijke tabellen (ook met nl zonder brontabellen en met de knip op een andere plek), wél alarm bij elk geslagen gat.

Gebouwd en gemerged in #1529 (`f3bac2a4`). **De poort.** `tool/check_l10n_table_parity.dart` + `make check-l10n-parity`, AST-gemeten. Twee families in plaats van drie: `_dutchSource*` en `_dutchSourceAdd*` zijn één naamruimte — `add-l10n` schrijft in de toevoegingen, `d()` leest uit allebei, en waar de knip ligt verschilt per taal puur door volgorde (meest 1266/2014, de/es/fr/it 501/2777, tr 1949/1331); per tabel vergelijken zou ruim duizend betekenisloze verschillen per taal melden. nl doet alleen mee in de `_strings*`-familie, zoals het issue vroeg. **In `check`, niet in `check-full`.** Exacte verzamelingsvergelijking: geen tekstheuristiek, dus geen valse melding mogelijk en geen basislijn nodig. 32 bestanden, klaar in een seconde. **Gaten bij invoering, alle drie opgeruimd in dezelfde tak — geen basislijn:** 1. Vier bronsleutels (`Subtitel`, `Kies een video`, `Kies een audiobestand`, `Platte tekst`) ontbraken in de, es, fr, fy, it en pap terwijl 25 talen ze hadden en de app ze wél opvraagt → **aangevuld**, in de stem van de zusterregels die er al stonden. 2. `Toestemming ingetrokken` en `U moet eerst de privacy- en gebruiksvoorwaarden accepteren…` stonden alléén in diezelfde zes talen en worden nergens opgehaald → **weggehaald**; aanvullen zou 50 regels dode vertaling opleveren en de wezenbasislijn van nul breken. 3. 28 identiteitsregels van de LibrePlan-connector stonden alléén in `_stringsNl` (één met een Engelse waarde) en zijn onbereikbaar, want `d()` raadpleegt voor nl geen tabel → **weggehaald**. De test toetst in twee richtingen op mini-repo's: geen alarm bij gelijke tabellen (ook met nl zonder brontabellen en met de knip op een andere plek), wél alarm bij elk geslagen gat.
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#1523
No description provided.