Просмотр исходного кода

Taal-cluster: chip-functies taalonafhankelijk + P1-17 werkblad + wezenlijst

- filterDatumVan/filterDatumTot herkennen nu NL+EN+sleutels op kernwoord;
  getest met fvm dart, identiek aan de oude versie op alle NL-invoer.
  Code staat klaar in TASKS.md, moet nog in de Custom Code-editor.
- TAAK-P1-17-vertalingen.md: 80 regels, deel A (nu) / deel B (na P2-29).
- 8 sleutels blijken een FOUTE Engelse vertaling te hebben (Duplicate-erfenis).
- Wezenlijst hermeten vanaf de startpagina: 31 bereikbaar, 19 wezen,
  3 nieuw t.o.v. P2-7 (EvenementComponent, HeaderCurrent, HomeUitgaanSliderComponentCopy).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
bob 10 часов назад
Родитель
Сommit
28453e93c9
2 измененных файлов с 299 добавлено и 10 удалено
  1. 141 0
      TAAK-P1-17-vertalingen.md
  2. 158 10
      TASKS.md

+ 141 - 0
TAAK-P1-17-vertalingen.md

@@ -0,0 +1,141 @@
+# P1-17 · werkblad Engelse vertalingen
+
+*Gegenereerd 2026-09-16 door Claude uit `internationalization.dart`, gefilterd op
+schermen die vanaf de startpagina bereikbaar zijn (dode kopieën weggelaten).
+Vul in de builder per widget het globe-icoontje naast **Text** / **Title** /
+**Button Text** → veld **English**. Weggooien zodra de ronde af is.*
+
+## Deel A — nu al te doen (deze schermen veranderen niet meer)
+
+### EvenementHorecagelegenheid
+
+| sleutel | Nederlands | staat nu in EN | zet op |
+|---|---|---|---|
+| `5tdut8bf` | Bezorgen | Bezorgen | **Delivery** |
+
+### SelectStateDropDownComponent
+
+| sleutel | Nederlands | staat nu in EN | zet op |
+|---|---|---|---|
+| `elx7kse2` | Je volgt deze gemeente | Add to favorites | **You follow this municipality** |
+| `nosgkxy0` | Gemeente volgen | Add to favorites | **Follow municipality** |
+
+### drawerComponent
+
+| sleutel | Nederlands | staat nu in EN | zet op |
+|---|---|---|---|
+| `vnwx710y` | Terug | Favorite | **Back** |
+
+### home
+
+| sleutel | Nederlands | staat nu in EN | zet op |
+|---|---|---|---|
+| `8khvlnye` | Alles | *(leeg)* | **All** |
+| `g09d1fb5` | Alles | *(leeg)* | **All** |
+| `gco4jgol` | Dit weekend | *(leeg)* | **This weekend** |
+| `h6ou1q9q` | Deze week | *(leeg)* | **This week** |
+| `iov8u1yi` | Vandaag | *(leeg)* | **Today** |
+
+### horecagelegenhedenOverzichtCurrent
+
+| sleutel | Nederlands | staat nu in EN | zet op |
+|---|---|---|---|
+| `8gwyy71q` | Activiteiten | Activiteiten | **Activities** |
+| `b8oov17m` | Cultuur | Cultuur | **Culture** |
+| `er4hrrph` | Verhuur, catering | Verhuur, catering | **Rental, catering** |
+| `hnnqfnhk` | Eetgelegenheden | Eetgelegenheden | **Restaurants** |
+| `qqb1howd` | Zoek op naam | *(leeg)* | **Search by name** |
+| `waxjo567` | Uitgaan | Uitgaan | **Going out** |
+| `ykjsgvsf` | Overnachten | Overnachten | **Stay** |
+
+### login
+
+| sleutel | Nederlands | staat nu in EN | zet op |
+|---|---|---|---|
+| `n3cyffso` | Wachtwoord tonen/verbergen | Favorite | **Show/hide password** |
+| `pj545url` | Veld wissen | Favorite | **Clear field** |
+
+### selectprovinciegemeente
+
+| sleutel | Nederlands | staat nu in EN | zet op |
+|---|---|---|---|
+| `xsyz36fr` | Kies je gemeente | *(leeg)* | **Choose your municipality** |
+| `z0wynid6` | Je ziet dan het uitgaansnieuws van die gemeente in het menu. | *(leeg)* | **You'll then see that municipality's going-out news in the menu.** |
+
+### wachtwoordVergeten
+
+| sleutel | Nederlands | staat nu in EN | zet op |
+|---|---|---|---|
+| `503u6v73` | Vul je gebruikersnaam of e-mailadres in. … | Use your username or password to recieve an email to reset your password. | **Enter your username or email address. You'll receive an email to reset your password.** |
+
+## Deel B — pas ná P2-29 (de twee aanmaakpagina's zijn nog in bewerking)
+
+### stadsactiviteitAanmaken
+
+| sleutel | Nederlands | staat nu in EN | zet op |
+|---|---|---|---|
+| `06lh8r3a` | Contact | *(leeg)* | **Contact** |
+| `0brx7n79` | Toelichting Entree | Toelichting Entree | **Admission notes** |
+| `1k52hayg` | Datum eind | Datum eind | **End date** |
+| `41moeajb` | Foto\'s kiezen | Foto\'s kiezen | **Choose photos** |
+| `4czd99zl` | Adres | Adres | **Address** |
+| `5ehouxlk` | Adres | Adres | **Address** |
+| `71z3uvd8` | Datum eind | Datum eind | **End date** |
+| `7dy1oyjr` | Organisator | Organisator | **Organiser** |
+| `7vogkwoh` | Datum | Datum | **Date** |
+| `825wzmk4` | Plaats | Plaats | **Town** |
+| `90c9lm1u` | Organisatie | *(leeg)* | **Organisation** |
+| `a2582hfp` | Toelichting Entree | Toelichting Entree | **Admission notes** |
+| `ajotnz1f` | Select... | *(leeg)* | **Select...** |
+| `bhydpd6h` | Website van de activiteit | Website van de activiteit | **Website of the activity** |
+| `dfa8vusy` | Datum | Datum | **Date** |
+| `dq3j79df` | Wanneer | Wanneer | **When** |
+| `dqeuq7t8` | Select... | *(leeg)* | **Select...** |
+| `fyltb801` | Entreeprijs | Entreeprijs | **Admission price** |
+| `g6cr9u4n` | Activiteit indienen | Activiteit indienen | **Submit activity** |
+| `go2ky4mu` | Waar | *(leeg)* | **Where** |
+| `i66ori1d` | WebsiteURL | *(leeg)* | **Website URL** |
+| `j9h65a88` | Postcode | Postcode | **Postal code** |
+| `l9f37oxb` | Select... | *(leeg)* | **Select...** |
+| `ls6do5d5` | Mijn gemeenten | *(leeg)* | **My municipalities** |
+| `mfaz1x8u` | Entree | Entree | **Admission** |
+| `nfxdqk4i` | Media | Media | **Media** |
+| `np527mil` | Plaats activiteit | Plaats activiteit | **Activity town** |
+| `nxfif83l` | Organisator van de activiteit | Organisator van de activiteit | **Organiser of the activity** |
+| `oo7z1mp8` | Postcode | *(leeg)* | **Postal code** |
+| `p3rwq60m` | Contact email/telefoon | Contact email/telefoon | **Contact email/phone** |
+| `pftju36e` | Entreeprijs | Entreeprijs | **Admission price** |
+| `r6ckp0e0` | Logo kiezen | Logo kiezen | **Choose logo** |
+| `sv5qajjt` | Of kies zelf een plaats | *(leeg)* | **Or pick a town yourself** |
+| `tq77j4hk` | Entreeprijs | Entreeprijs | **Admission price** |
+| `xiba4gka` | Select... | *(leeg)* | **Select...** |
+
+### uitgaansevenementAanmaken
+
+| sleutel | Nederlands | staat nu in EN | zet op |
+|---|---|---|---|
+| `2hitlrxa` | Select... | *(leeg)* | **Select...** |
+| `3h3k4jh2` | Entreeprijs | Entreeprijs | **Admission price** |
+| `4a28vwlf` | Media | Media | **Media** |
+| `9qx16tm9` | Evenement indienen | Activiteit indienen | **Submit event** |
+| `df4oowbq` | Logo kiezen | Logo kiezen | **Choose logo** |
+| `e42lwmdh` | Datum eind | Datum eind | **End date** |
+| `e9n6cj1o` | WebsiteURL | *(leeg)* | **Website URL** |
+| `ge5o3gf7` | Entreeprijs | Entreeprijs | **Admission price** |
+| `gysg1wwq` | Wanneer | Wanneer | **When** |
+| `hqwm9set` | Foto\'s kiezen | Foto\'s kiezen | **Choose photos** |
+| `ht4toe4o` | Select... | *(leeg)* | **Select...** |
+| `nws4h1nz` | Datum | Datum | **Date** |
+| `nzaqrq0w` | Link om kaarten te kopen | Website van de activiteit | **Ticket link** |
+| `obaet4ky` | Entree | Entree | **Admission** |
+| `p0xm7daj` | Categorie evenement | *(leeg)* | **Event category** |
+| `qlzcyn78` | Toelichting Entree | Toelichting Entree | **Admission notes** |
+| `qsf2va25` | Website van het evenement | Website van de activiteit | **Event website** |
+| `qtnlg7nd` | Search... | *(leeg)* | **Search...** |
+| `r9s46lo7` | Entreeprijs | Entreeprijs | **Admission price** |
+| `taujsjo7` | Toelichting Entree | Toelichting Entree | **Admission notes** |
+| `vkyrmq6a` | Organisatie | *(leeg)* | **Organisation** |
+| `wkn1mu1d` | Datum eind | Datum eind | **End date** |
+| `xceonmpt` | Datum | Datum | **Date** |
+| `zfofdq9a` | TicketsURL | *(leeg)* | **Tickets URL** |
+

+ 158 - 10
TASKS.md

@@ -43,14 +43,138 @@ tegelijk in bouwen:*
 
 
 *Niet geraakt (bewust): de twee aanmaakpagina's (P2-29, andere sessie).*
 *Niet geraakt (bewust): de twee aanmaakpagina's (P2-29, andere sessie).*
 
 
+### 🟢 AFGEROND 2026-09-16 (Claude, sessie "taal-cluster") — browserloos, geen builder aangeraakt
+
+*Geclaimd en uitgevoerd terwijl twee andere sessies in de builder zaten. Dit
+cluster raakt géén FlutterFlow-pagina en géén Chrome — alles is meting +
+kant-en-klare code. Er staat nog **één ding open dat Bob (of een sessie met de
+browser) moet doen**: de twee functie-bodies hieronder plakken.*
+
+**1 · `filterDatumVan` / `filterDatumTot` taalonafhankelijk — code klaar, moet
+nog in de Custom Code-editor.** Dit blokkeerde Bob's taak 3 (vertaalronde): de
+functies matchten letterlijk op `Vandaag`/`Dit weekend`/`Deze week`, dus zodra
+de chips een Engelse tekst krijgen doet het datumfilter niets meer. De nieuwe
+versie herkent op **kernwoord** i.p.v. op de hele zin, en dus NL + EN +
+hoofdletters/spaties + de interne sleutels (`vandaag`/`weekend`/`week`) tegelijk.
+Getest met `fvm dart` tegen de oude versie: **op elke Nederlandse invoer exact
+dezelfde uitkomst**, en `Today`/`This weekend`/`This week` werken er nu bij.
+Volgorde is belangrijk — `weekend` moet vóór `week` getest worden, want
+"This weekend" bevat ook "week".
+
+*Plakken in FlutterFlow → Custom Code → Functions → `filterDatumVan`. **Alleen de
+body**, FlutterFlow schrijft de signature zelf (zie `CLAUDE.md`). Daarna Ctrl+S.*
+```dart
+  final k = (keuze ?? '').toLowerCase().trim();
+  String soort = '';
+  if (k.contains('weekend')) {
+    soort = 'weekend';
+  } else if (k.contains('vandaag') || k.contains('today')) {
+    soort = 'vandaag';
+  } else if (k.contains('week')) {
+    soort = 'week';
+  }
+  if (soort == '') {
+    return '';
+  }
+  final nu = DateTime.now();
+  int extra = 0;
+  if (soort == 'weekend' && nu.weekday < 6) {
+    extra = 6 - nu.weekday;
+  }
+  final start = DateTime(nu.year, nu.month, nu.day + extra);
+  final maand = start.month.toString().padLeft(2, '0');
+  final dag = start.day.toString().padLeft(2, '0');
+  return '${start.year}-$maand-$dag 00:00:00';
+```
+*En in `filterDatumTot`:*
+```dart
+  final k = (keuze ?? '').toLowerCase().trim();
+  String soort = '';
+  if (k.contains('weekend')) {
+    soort = 'weekend';
+  } else if (k.contains('vandaag') || k.contains('today')) {
+    soort = 'vandaag';
+  } else if (k.contains('week')) {
+    soort = 'week';
+  }
+  if (soort == '') {
+    return '';
+  }
+  final nu = DateTime.now();
+  int extra = 0;
+  if (soort != 'vandaag' && nu.weekday < 7) {
+    extra = 7 - nu.weekday;
+  }
+  final eind = DateTime(nu.year, nu.month, nu.day + extra);
+  final maand = eind.month.toString().padLeft(2, '0');
+  final dag = eind.day.toString().padLeft(2, '0');
+  return '${eind.year}-$maand-$dag 23:59:59';
+```
+⚠️ **Koppeling met de vertaalronde:** de Engelse chip-teksten moeten
+**`All` / `Today` / `This weekend` / `This week`** worden. Elke andere Engelse
+formulering mag, zolang "today", "weekend" of "week" erin voorkomt — staat er
+iets als "Upcoming" dan filtert de chip niets. Dit staat ook in het werkblad.
+
+**2 · P1-17 volledig geïnventariseerd — werkblad ligt klaar in
+`TAAK-P1-17-vertalingen.md`.** Bob's taak 3 is daarmee puur uitvoerwerk: 80
+regels, elk met sleutel + Nederlandse tekst + wat er nu in EN staat + een
+voorgestelde Engelse tekst. Gesplitst in **Deel A (21 regels, nu al te doen —
+die schermen veranderen niet meer)** en **Deel B (59 regels, pas ná P2-29)**.
+Gemeten op de schermen die vanaf de startpagina bereikbaar zijn; de dode
+kopieën (`favorietenCopy`, `drawerComponentCopy`, `kanwegTestUpload`) zaten in
+de oude telling van 134/99 en zijn er nu uit.
+Werkelijke omvang in levende code: **26 leeg, 58 gelijk aan NL, 8 fout**.
+
+**3 · Nieuw gevonden: 8 sleutels hebben geen lege maar een FOUTE Engelse
+vertaling** — die vallen in geen enkele telling op en zijn erger dan leeg, want
+de gebruiker krijgt een tekst die iets anders betekent. Oorzaak is het bekende
+`Duplicate`-patroon (een kopie erft de EN-tekst van het origineel):
+| sleutel | scherm | Nederlands | staat er nu in EN |
+|---|---|---|---|
+| `vnwx710y` | drawerComponent | Terug | Favorite |
+| `pj545url` | login | Veld wissen | Favorite |
+| `n3cyffso` | login | Wachtwoord tonen/verbergen | Favorite |
+| `nosgkxy0` | SelectStateDropDown | Gemeente volgen | Add to favorites |
+| `elx7kse2` | SelectStateDropDown | Je volgt deze gemeente | Add to favorites |
+| `qsf2va25` | uitgaansevenementAanmaken | Website van het evenement | Website van de activiteit |
+| `nzaqrq0w` | uitgaansevenementAanmaken | Link om kaarten te kopen | Website van de activiteit |
+| `9qx16tm9` | uitgaansevenementAanmaken | Evenement indienen | Activiteit indienen |
+
+Plus één inhoudelijke fout op `wachtwoordVergeten` (`503u6v73`): de Engelse zin
+zegt *"Use your username or password to recieve an email"* — verkeerde betekenis
+én een typefout. Correctie staat in het werkblad.
+
+**4 · Wezenlijst opnieuw gemeten (aanvulling op P2-7 / Bob's taak 4).**
+Reproduceerbaar bepaald door vanaf de startpagina de widget-graaf te volgen:
+**31 van de 50 widgets zijn bereikbaar, 19 niet.** Drie namen die nog niet in
+de P2-7-lijst stonden: **`EvenementComponent`**, **`HeaderCurrent`** en
+**`HomeUitgaanSliderComponentCopy`**. De eerste twee worden *alleen* door de
+pagina `Event` gebruikt, dus die vallen vanzelf vrij zodra `Event` weg is.
+Handige volgorde voor de opruimronde — gooi eerst de pagina weg, dan de
+componenten die eraan hingen:
+- `Event` → daarna vallen `EvenementComponent` + `HeaderCurrent` vrij
+- `drawer_component_copy` + `kanweghorecagelegenheid_current_copy` → daarna
+  `KanwegHorecagelegenhedenOverzicht`
+- `slider_uitgaan_component_small_current` → daarna `KaartSliderUitgaanSComp`
+- zonder afhankelijkheden, kunnen meteen: `FavorietenCopy`, `HomeCopy`,
+  `KanwegHomeCopy`, `KanwegTestUpload`, `HeaderButtonsComponentCopymethartje`,
+  `KanwegHeaderButtonsComponentCopy`, `KaartTabelUitgaanComp`,
+  `KaartTabelUitgaanSComp`, `HomeUitgaantabelKaartComponentCopy`,
+  `HomeUitgaanSliderComponentCopy`, `PUitgaantabelKaartComponentOrgineelMetKaartjeerin`
+
+*Twee namen uit de oude P2-7-lijst bestaan niet meer op schijf
+(`kanwaeg_select_state_drop_down_component_copy`,
+`kanweg_home_uitgaantabel_kaart_component_copy`) — in de builder mogelijk nog
+wel, daar niet gecontroleerd (geen browser gebruikt).*
+
 ### 📋 Bob's 7 — de geordende lijst van 2026-09-15 (laat), max. 7, niets anders oppakken
 ### 📋 Bob's 7 — de geordende lijst van 2026-09-15 (laat), max. 7, niets anders oppakken
 
 
 *Stand bij afsluiten 2026-09-15 23:30: taak 1 af; 2 t/m 7 zijn voor morgen,
 *Stand bij afsluiten 2026-09-15 23:30: taak 1 af; 2 t/m 7 zijn voor morgen,
-in deze volgorde. Voor Claude ligt er los één klein ding klaar (niet geclaimd):
-**`filterDatumVan`/`filterDatumTot` taalonafhankelijk maken** (nu matchen ze
-op de Nederlandse chip-labels `Vandaag`/`Dit weekend`/`Deze week`; met EN
-erbij moeten ook `Today`/`This weekend`/`This week` werken, of de chips
-moeten interne sleutels zetten) — nodig vóór taak 3. Standaardzin voor morgen:*
+in deze volgorde. **Update 2026-09-16: het losse klusje voor Claude
+(`filterDatumVan`/`filterDatumTot` taalonafhankelijk) is klaar** — de code staat
+in het groene blok hierboven en hoeft alleen nog geplakt te worden. Taak 3 is
+daarmee niet meer geblokkeerd en heeft nu een kant-en-klaar werkblad
+(`TAAK-P1-17-vertalingen.md`). Standaardzin voor morgen:*
 
 
 > Pak Bob's 7-lijst bovenin `TASKS.md` op, in volgorde. Ik doe de Drupal- en
 > Pak Bob's 7-lijst bovenin `TASKS.md` op, in volgorde. Ik doe de Drupal- en
 > Play-Console-stappen zelf; jij verifieert met een verse export/curl en noemt
 > Play-Console-stappen zelf; jij verifieert met een verse export/curl en noemt
@@ -79,11 +203,15 @@ moeten interne sleutels zetten) — nodig vóór taak 3. Standaardzin voor morge
    FlutterFlow-deploy (dan hoeft er lokaal niets) of lokaal (dan keystore +
    FlutterFlow-deploy (dan hoeft er lokaal niets) of lokaal (dan keystore +
    `android/key.properties`, want release staat op `signingConfigs.debug`).
    `android/key.properties`, want release staat op `signingConfigs.debug`).
    iOS wel/niet in scope.
    iOS wel/niet in scope.
-3. **P1-17 · Engelse vertalingen in één ronde** — pas ná P2-29 (aanmaak-
-   pagina's), anders vertaal je twee keer. Omvang:
-   134 lege + 99 gelijk aan NL. Zwaartepunt: `stadsactiviteitAanmaken`,
-   `uitgaansevenementAanmaken`, Home-chips, `Selectprovinciegemeente`.
-   Claude maakt vooraf de chip-functie taalonafhankelijk.
+3. **P1-17 · Engelse vertalingen** — werkblad ligt klaar in
+   **`TAAK-P1-17-vertalingen.md`** (sleutel + NL + huidige EN + voorgestelde EN
+   per regel). **Deel A (21 regels) kan nu al**: Home-chips, drawer, login,
+   horeca-overzicht, `Selectprovinciegemeente`, gemeentehartje. **Deel B (59
+   regels)** pas ná P2-29, want de twee aanmaakpagina's zijn nog in bewerking.
+   Echte omvang in levende code: 26 leeg + 58 gelijk aan NL + **8 fout** (de
+   oude telling 134/99 bevatte dode kopieën). De chip-functie is al
+   taalonafhankelijk gemaakt — mits de chips exact
+   `All`/`Today`/`This weekend`/`This week` krijgen.
 4. **Builder-opruimronde.** P2-7 (21 dode eenheden; begin met
 4. **Builder-opruimronde.** P2-7 (21 dode eenheden; begin met
    `drawer_component_copy` + `kanweghorecagelegenheid_current_copy`),
    `drawer_component_copy` + `kanweghorecagelegenheid_current_copy`),
    `HorecagelegenhedenOverzichtCopy3Copy`, `homeCopy` (het datumfilter is af en op een toestel getest, dus mag weg),
    `HorecagelegenhedenOverzichtCopy3Copy`, `homeCopy` (het datumfilter is af en op een toestel getest, dus mag weg),
@@ -1160,6 +1288,26 @@ aan de app-kant niets te veranderen.
 
 
 7. Geef Claude daarna het **`display_id`** door (= taak 26).
 7. Geef Claude daarna het **`display_id`** door (= taak 26).
 
 
+✅ **Nagemeten op PRODUCTIE 2026-09-16 (Claude) — de Drupal-kant is af en live.**
+`display_id=services_2` + `townid=28695` geeft 19 bezorgers in Amsterdam,
+`categorie` komt als **array** (niet de P1-45-komma-string), titels schoon. Het
+`horcat`-filter is er echt af: `horcat=17967`, lege `horcat` en geen `horcat`
+geven alle drie 19 items. Aan Drupal hoeft niets meer.
+
+❌ **De app-kant is nog nergens aangesloten.** (a) De `ListTile` "Thuis
+bezorgen" (`t46xiboh`) in `lib/shared/drawer_component/drawer_component_widget.dart:744`
+heeft **geen** omhullende `InkWell`/`onTap` — alle 16 andere menu-items wél;
+tikken doet niets. (b) Geen enkele pagina vraagt `services_2` op:
+`horecagelegenhedenOverzichtCurrent` heeft alleen parameter `plaats` en
+hardcodeert 6× `'services_1'` (regels 57, 414, 430, 447, 464, 481). Let op: de
+`services_2` in `api_calls.dart:248` hoort bij **`flutterflowmobiel1`** (events,
+Home-tab) — ander ding, zelfde displaynummer.
+
+➡️ **De ontwerpvraag hieronder is hiermee beslecht: het moet een LOSSE
+lijstpagina worden.** Omdat `horcat` genegeerd wordt, zouden de zes
+categorietabs van de bestaande pagina alle zes dezelfde 19 items tonen; een
+`displayId`-page-parameter op die pagina is dus geen optie.
+
 **Open ontwerpvraag voor Bob:** "Thuis bezorgen" is één lijst, terwijl
 **Open ontwerpvraag voor Bob:** "Thuis bezorgen" is één lijst, terwijl
 `horecagelegenhedenOverzichtCurrent` uit zes categorietabs bestaat. Wil je
 `horecagelegenhedenOverzichtCurrent` uit zes categorietabs bestaat. Wil je
 die tabs daar ook, of liever een aparte, simpele lijstpagina? Dat bepaalt of
 die tabs daar ook, of liever een aparte, simpele lijstpagina? Dat bepaalt of