[Bug] Importmeldingen en notitiedia's zijn Nederlands, ongeacht de ingestelde taal #806

Closed
opened 2026-07-24 16:20:28 +00:00 by brenno · 2 comments
Owner

Bij de bewaker-toets op #772 (presentatie-import) kwamen twee lokalisatiegaten boven die de vertaalpoort niet ziet. Ze zijn verwant maar niet hetzelfde, en het tweede is het vervelendst.

1. Foutmeldingen bereiken het scherm onvertaald

De servicelaag draagt Nederlandse literals die via een variabele bij de gebruiker komen — en daardoor blijft check-hardcoded-text groen, want die poort ziet alleen literals op een widget-plek.

  • lib/services/import/presentation_import_service.dart (formaat niet ondersteund, bestand te groot)
  • lib/services/import/importers/{pptx,odp,keynote}/*_importer.dart (kon niet lezen)
  • lib/services/import/pipeline/format_detector.dart (geen geldig zip-archief, beschadigd, te klein)

Route: result.failure?.messageshowErrorSnackBar in presentation_import_action.dart, en progress.message in presentation_import_queue_dialog.dart. De FormatException-teksten uit archive_utils.dart zijn zelfs Engels en komen via error: '$e' in de wachtrijdialoog terecht.

Gevolg: een Franse gebruiker kiest een beschadigd bestand en leest presentatie.pptx: dit bestand is geen herkende presentatie (pptx/odp/key).

Richting: de servicelaag heeft geen BuildContext, dus vertalen hoort aan de UI-kant. Geef ImportFailure een reden-code (enum) naast de technische tekst, en laat de UI die door l10n.d halen. De vrije tekst blijft bruikbaar voor het log.

2. Notitiedia's bakken Nederlands ín het document van de gebruiker

Ernstiger, want dit is blijvend: unconverted_tracker.dart en deck_builder.dart schrijven "# Niet overgenomen van slide 7", "niet overgenomen (OciDeck heeft geen audio-slides)" en "Geredde tekst" rechtstreeks als inhoud het .md in. Het commentaar erkent het al ("The wording is Dutch for now").

Een Griekse gebruiker houdt permanent Nederlandse alinea's in zijn eigen bestand, en die reizen mee naar elk ander Marp-gereedschap. In een product met 32 talen is dat geen detail.

Richting: geef DeckBuilder een vertaalnaad (String Function(String), standaard identiteit) die de UI vult met l10n.d. Dan wordt de notitietekst op importmoment in de taal van de gebruiker gezet en zó opgeslagen — wat klopt, want het is inhoud en geen interface. Vergt wel dat die zinnen (met hun interpolaties) door de 31-talen-keten gaan.

Waarom niet meteen in #772

Beide zijn echte fouten, maar het zijn eigen ontwerpkeuzes (reden-codes, een vertaalnaad in de bouwer) plus een flinke vertaalronde. Ze meenemen zou #772 verder oprekken terwijl de import zelf af en getoetst is. De bewaker vroeg om een vastgelegd besluit in plaats van stilzwijgen — dit issue ís dat besluit.

Herkomst: bewaker-toets op #772, punten 5 en 6.

Bij de bewaker-toets op #772 (presentatie-import) kwamen twee lokalisatiegaten boven die de vertaalpoort niet ziet. Ze zijn verwant maar niet hetzelfde, en het tweede is het vervelendst. ## 1. Foutmeldingen bereiken het scherm onvertaald De servicelaag draagt Nederlandse literals die via een *variabele* bij de gebruiker komen — en daardoor blijft `check-hardcoded-text` groen, want die poort ziet alleen literals op een widget-plek. - `lib/services/import/presentation_import_service.dart` (formaat niet ondersteund, bestand te groot) - `lib/services/import/importers/{pptx,odp,keynote}/*_importer.dart` (kon niet lezen) - `lib/services/import/pipeline/format_detector.dart` (geen geldig zip-archief, beschadigd, te klein) Route: `result.failure?.message` → `showErrorSnackBar` in `presentation_import_action.dart`, en `progress.message` in `presentation_import_queue_dialog.dart`. De `FormatException`-teksten uit `archive_utils.dart` zijn zelfs Engels en komen via `error: '$e'` in de wachtrijdialoog terecht. Gevolg: een Franse gebruiker kiest een beschadigd bestand en leest `presentatie.pptx: dit bestand is geen herkende presentatie (pptx/odp/key).` **Richting:** de servicelaag heeft geen `BuildContext`, dus vertalen hoort aan de UI-kant. Geef `ImportFailure` een reden-code (enum) naast de technische tekst, en laat de UI die door `l10n.d` halen. De vrije tekst blijft bruikbaar voor het log. ## 2. Notitiedia's bakken Nederlands ín het document van de gebruiker Ernstiger, want dit is blijvend: `unconverted_tracker.dart` en `deck_builder.dart` schrijven "# Niet overgenomen van slide 7", "niet overgenomen (OciDeck heeft geen audio-slides)" en "Geredde tekst" rechtstreeks als **inhoud** het `.md` in. Het commentaar erkent het al ("The wording is Dutch for now"). Een Griekse gebruiker houdt permanent Nederlandse alinea's in zijn eigen bestand, en die reizen mee naar elk ander Marp-gereedschap. In een product met 32 talen is dat geen detail. **Richting:** geef `DeckBuilder` een vertaalnaad (`String Function(String)`, standaard identiteit) die de UI vult met `l10n.d`. Dan wordt de notitietekst op importmoment in de taal van de gebruiker gezet en zó opgeslagen — wat klopt, want het is inhoud en geen interface. Vergt wel dat die zinnen (met hun interpolaties) door de 31-talen-keten gaan. ## Waarom niet meteen in #772 Beide zijn echte fouten, maar het zijn eigen ontwerpkeuzes (reden-codes, een vertaalnaad in de bouwer) plus een flinke vertaalronde. Ze meenemen zou #772 verder oprekken terwijl de import zelf af en getoetst is. De bewaker vroeg om een vastgelegd besluit in plaats van stilzwijgen — dit issue ís dat besluit. **Herkomst:** bewaker-toets op #772, punten 5 en 6.
Author
Owner

Opgepakt. Tak: fix/import-lokalisatie-806. #812 is net gemerged, dus deck_builder.dart en de import-service zijn vrij.

Beide punten, en punt 2 eerst: dat schrijft blijvend Nederlands in het bestand van de gebruiker, en dat is de enige schade hier die niet met een herstart weggaat.

Reikwijdte zoals jij hem schetste: ImportFailure krijgt een reden-code naast de technische tekst (die blijft, voor het log), de UI vertaalt de code; DeckBuilder en unconverted_tracker.dart krijgen een vertaalnaad die de UI met l10n.d vult, zodat de notitietekst op importmoment in de taal van de gebruiker wordt opgeslagen. Plus de vertaalronde over 31 talen.

Opgepakt. Tak: `fix/import-lokalisatie-806`. #812 is net gemerged, dus `deck_builder.dart` en de import-service zijn vrij. Beide punten, en punt 2 eerst: dat schrijft blijvend Nederlands in het bestand van de gebruiker, en dat is de enige schade hier die niet met een herstart weggaat. Reikwijdte zoals jij hem schetste: `ImportFailure` krijgt een reden-code naast de technische tekst (die blijft, voor het log), de UI vertaalt de code; `DeckBuilder` en `unconverted_tracker.dart` krijgen een vertaalnaad die de UI met `l10n.d` vult, zodat de notitietekst op importmoment in de taal van de gebruiker wordt opgeslagen. Plus de vertaalronde over 31 talen.
Author
Owner

Gemerged in 2f5e5aa6 (PR #826), op main geverifieerd. Beide punten die je schetste zitten erin, plus een poort die het afdwingt.

Punt 1 — foutmeldingen. ImportFailure draagt nu een reden-code (ImportFailureReason) naast de technische tekst, precies zoals je voorstelde. De UI vertaalt via importFailureText, langs dezelfde weg als de WebDAV-/S3-/git-meldingen. De ruwe message blijft voor het log en komt nooit meer op het scherm. FormatException uit archive_utils bereikt de gebruiker niet langer rauw — de service zet er een reden-code op.

Punt 2 — notitiedia's. Dit was het ergste, en het is opgelost zoals je aangaf: DeckBuilder en UnconvertedTracker krijgen een vertaalnaad die de UI met l10n.d vult. De notitie wordt op importmoment in de taal van de gebruiker gezet en zó opgeslagen — inhoud, geen interface. Een Griekse gebruiker houdt nu Griekse notities in zijn eigen .md.

Twee dingen die je richting nog scherper maakten:

  • ClassifiedSlide.issues was een List<String> met een ' — '-splitsing die de lokalisatie in de weg zat; nu List<ConversionIssue>, net als SourceDeck.issues al was.
  • De Keynote-salvage bouwde salvagedBits.join(' + ') — een samengestelde string is per taal onvindbaar. Nu drie vaste sleutels.

De vertaalronde die je voorzag: 78 bronstrings × 31 talen = 2387 vertalingen. Een nieuwe poort (test/import_note_l10n_test.dart) haalt élke notitie- en vaste voortgangstekst via de AST uit de servicelaag en eist alle 31 — zo ontsnapt ook een toekomstige string niet meer.

Wat er (bewust) buiten viel, met reden: de per-dia voortgangsregel "Slide 3/10". Vluchtig, vrijwel geheel numeriek, en lokaliseren vraagt een aparte voortgangsnaad. Vastgelegd in docs/KNOWN_LIMITATIONS.md. En de vertaalkwaliteit voor Klingon en Latijn is eerlijk gemeld als de zwakste; de grote talen zijn solide.

Poort: make check groen in een verse worktree, ook na rebase op #821 — 6.585 tests, dekking 86,5%.

Gemerged in `2f5e5aa6` (PR #826), op main geverifieerd. Beide punten die je schetste zitten erin, plus een poort die het afdwingt. **Punt 1 — foutmeldingen.** `ImportFailure` draagt nu een reden-code (`ImportFailureReason`) naast de technische tekst, precies zoals je voorstelde. De UI vertaalt via `importFailureText`, langs dezelfde weg als de WebDAV-/S3-/git-meldingen. De ruwe message blijft voor het log en komt nooit meer op het scherm. `FormatException` uit `archive_utils` bereikt de gebruiker niet langer rauw — de service zet er een reden-code op. **Punt 2 — notitiedia's.** Dit was het ergste, en het is opgelost zoals je aangaf: `DeckBuilder` en `UnconvertedTracker` krijgen een vertaalnaad die de UI met `l10n.d` vult. De notitie wordt op importmoment in de taal van de gebruiker gezet en zó opgeslagen — inhoud, geen interface. Een Griekse gebruiker houdt nu Griekse notities in zijn eigen `.md`. **Twee dingen die je richting nog scherper maakten:** - `ClassifiedSlide.issues` was een `List<String>` met een `' — '`-splitsing die de lokalisatie in de weg zat; nu `List<ConversionIssue>`, net als `SourceDeck.issues` al was. - De Keynote-salvage bouwde `salvagedBits.join(' + ')` — een samengestelde string is per taal onvindbaar. Nu drie vaste sleutels. **De vertaalronde die je voorzag:** 78 bronstrings × 31 talen = 2387 vertalingen. Een nieuwe poort (`test/import_note_l10n_test.dart`) haalt élke notitie- en vaste voortgangstekst via de AST uit de servicelaag en eist alle 31 — zo ontsnapt ook een toekomstige string niet meer. **Wat er (bewust) buiten viel, met reden:** de per-dia voortgangsregel "Slide 3/10". Vluchtig, vrijwel geheel numeriek, en lokaliseren vraagt een aparte voortgangsnaad. Vastgelegd in `docs/KNOWN_LIMITATIONS.md`. En de vertaalkwaliteit voor Klingon en Latijn is eerlijk gemeld als de zwakste; de grote talen zijn solide. Poort: `make check` groen in een verse worktree, ook na rebase op #821 — 6.585 tests, dekking 86,5%.
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#806
No description provided.