This commit is contained in:
2026-04-22 22:00:50 +02:00
parent 16be247ce1
commit e979fbe755
46 changed files with 5302 additions and 274 deletions

View File

@@ -0,0 +1,168 @@
---
phase: 18-en-translation
plan: 01
subsystem: i18n
tags: [gettext, po, mo, translation, flatpickr, bilingual]
requires:
- phase: 16-i18n-plugin-refactor
provides: .pot (157 msgid) + textdomain carei-reservation
- phase: 17-bilingual-packages-and-softra-errors
provides: bilingual pakiety + mapowanie Softra przez __()
provides:
- carei-reservation-en_US.po + .mo (158 wpisów przetłumaczonych)
- carei-reservation-en_GB.po + .mo (kopia en_US)
- PHP mini-kompilator po2mo.php (bez potrzeby msgfmt)
- Flatpickr jako cross-browser date picker z PL/EN locale (scope addition)
- Kompaktowy CSS theme dla flatpickr w kolorach Carei
affects: []
tech-stack:
added:
- Flatpickr 4.6.13 (CDN jsdelivr, enqueued z dependencies)
patterns:
- "MO compilation: własny parser+packer PHP bez msgfmt/Python"
- "Flatpickr static:true dla modala (popup w container) + default dla hero"
- "disableMobile:true dla spójności UX PL/EN na wszystkich urządzeniach"
key-files:
created:
- wp-content/plugins/carei-reservation/languages/carei-reservation-en_US.po
- wp-content/plugins/carei-reservation/languages/carei-reservation-en_US.mo
- wp-content/plugins/carei-reservation/languages/carei-reservation-en_GB.po
- wp-content/plugins/carei-reservation/languages/carei-reservation-en_GB.mo
modified:
- wp-content/plugins/carei-reservation/carei-reservation.php
- wp-content/plugins/carei-reservation/assets/js/carei-reservation.js
- wp-content/plugins/carei-reservation/assets/css/carei-reservation.css
key-decisions:
- "Tłumaczenie przez agenta z pre-zdefiniowanym słownikiem terminów branżowych (~50 mapowań PL→EN car rental)"
- "Własny kompilator PHP zamiast msgfmt/Loco — deterministyczny, niezależny od środowiska"
- "Flatpickr z CDN jsdelivr — brak lokalnych plików, szybki deploy; fallback do native picker jeśli CDN padnie"
- "static:true dla modala — rozwiązuje konflikt focus-trap + z-index"
- "disableMobile:true — jednolity UX zamiast native iOS spinner / Android Material"
- "en_GB = kopia en_US — brak realnej potrzeby różnicowania UK/US na tym etapie"
patterns-established:
- "Własny po2mo compiler w PHP (stored w ~/temp) — reusable dla przyszłych tłumaczeń"
- "CSS override per-klasa flatpickr (compact height/width/spacing) w kolorach Carei #2F2482"
duration: ~40min
started: 2026-04-22
completed: 2026-04-22
---
# Phase 18 Plan 01: EN translation (.po/.mo) + QA — Summary
**Plugin carei-reservation dostarczony w wersji dwujęzycznej: 158 wpisów przetłumaczonych na EN, skompilowanych do .mo (en_US + en_GB), plus cross-browser Flatpickr jako date picker z locale PL/EN. Milestone v0.7 — 100% complete.**
## Performance
| Metric | Value |
|--------|-------|
| Duration | ~40min |
| Tasks | 2 auto + 1 human-verify + 1 scope addition (Flatpickr) |
| Files created | 4 (.po + .mo × 2 locale) |
| Files modified | 3 (bootstrap PHP, JS, CSS) |
| Delegation | 1 agent (tłumaczenie .pot → .po) |
## Acceptance Criteria Results
| Criterion | Status | Notes |
|-----------|--------|-------|
| AC-1: Plik .po kompletnie przetłumaczony | Pass | 158 msgstr, placeholdery zachowane, HTML OK, zero PL diakrytyków |
| AC-2: Plik .mo poprawny binarnie | Pass | Magic 0x950412de, version 0, N=158, 9455 bytes |
| AC-3: EN UI działa po uploadzie | Pass | User confirmed "approved" po pełnym teście |
## Accomplishments
- **158 wpisów PL→EN** przez agenta z uzgodnionym słownikiem terminów rental (`doba→day`, `oddział→location`, `zł→PLN`, `pakiet ochronny→protection package`, etc.)
- **Własny PHP `.mo` compiler** (po2mo.php, ~150 linii) — parsuje .po, sortuje, pakuje binarnie wg gettext spec
- **en_US + en_GB** — dwa locale EN pokryte (Polylang może używać dowolnego)
- **Flatpickr scope addition:** CDN enqueue + JS init + kompaktowy CSS w kolorach Carei. Modal z `static:true` (popup w container, bypass focus-trap). Hero z default renderowaniem. Jednolity UX desktop + mobile (`disableMobile:true`).
- **Weryfikacja binarna `.mo`** przez PHP: `Magic: 0x950412de, Version: 0, N: 158`
## Files Created/Modified
| File | Change | Purpose |
|------|--------|---------|
| `languages/carei-reservation-en_US.po` | Created | 158 wpisów PL→EN |
| `languages/carei-reservation-en_US.mo` | Created | Binarka gettext, 9455 bytes |
| `languages/carei-reservation-en_GB.po` | Created | Kopia en_US z `Language: en_GB\n` |
| `languages/carei-reservation-en_GB.mo` | Created | Skompilowana en_GB |
| `carei-reservation.php` | Modified | Flatpickr enqueue (CDN + pl locale) + deps |
| `assets/js/carei-reservation.js` | Modified | `initDatePickers()` + static:true dla modal + graceful fallback |
| `assets/css/carei-reservation.css` | Modified | Kompaktowy flatpickr theme w kolorach Carei |
## Decisions Made
| Decision | Rationale | Impact |
|----------|-----------|--------|
| Własny po2mo.php zamiast msgfmt | msgfmt/Python msgfmt niedostępne w dev env; Loco Translate wymaga wp-admin flow | Deterministic compilation, reusable dla przyszłych locale (fr, de) |
| Flatpickr scope addition | User zgłosił potrzebę tłumaczenia kalendarza natywnego (browser używa OS locale) — flatpickr jedyne sensowne rozwiązanie | +40KB JS (CDN), ale spójne UX + locale-aware |
| CDN jsdelivr | Szybki deploy, brak zarządzania plikami lokalnymi | Dependency na CDN; graceful fallback do native picker |
| `static:true` dla modal | Default popup w body → konflikt z focus-trap + z-index modala | Picker w containerze inputa — kompatybilne z modalem |
| `disableMobile:true` | Native mobile (iOS spinner, Android Material) ignoruje strony locale | Jednolity UX PL/EN niezależnie od OS użytkownika |
## Deviations from Plan
### Summary
| Type | Count | Impact |
|------|-------|--------|
| Auto-fixed | 2 | Flatpickr popup ukryty w modalu (static:true), native mobile picker (disableMobile:true) |
| Scope additions | 1 | Flatpickr integracja (cross-browser date picker z i18n) — user request podczas apply |
| Deferred | 0 | — |
### Scope additions
**1. [UX] Flatpickr date picker z i18n**
- Found during: Task 3 (human-verify) — user zapytał o tłumaczenie kalendarza
- Problem: Natywny `<input type="datetime-local">` używa locale OS przeglądarki, ignoruje WP locale
- Fix: Integracja Flatpickr 4.6.13 z CDN — enqueue + init per input + kompaktowy CSS theme
- Files: carei-reservation.php, carei-reservation.js, carei-reservation.css
- Verification: User "jest ok" po kompaktowym themie; PL kalendarz, EN kalendarz, oba na desktop + mobile
### Auto-fixed Issues
**1. [Modal] Flatpickr popup nie otwierał się w modalu**
- Issue: Default append do body + focus-trap z Phase 4 → picker focus tracony przed interakcją
- Fix: `static: true` w opts — popup renderowany wewnątrz `.carei-form__date-wrap`
- Verification: User confirmed kalendarz otwiera się w modalu po zmianie
**2. [Mobile] Inny kalendarz na mobile vs desktop**
- Issue: Flatpickr default `disableMobile: false` → na mobile fallback do native OS picker (iOS spinner / Android Material)
- Fix: `disableMobile: true` — flatpickr wszędzie, jednolity wygląd + locale
- Verification: User confirmed "na obu jest flatpickr"
## Issues Encountered
| Issue | Resolution |
|-------|------------|
| msgfmt niedostępny lokalnie | Własny PHP kompilator (po2mo.php) — reusable |
| Modal calendar nie otwiera | static:true flatpickr option |
| Mobile inny picker | disableMobile:true |
| Hero kalendarz po polsku mimo EN | Dodanie hero inputs do initDatePickers() (wcześniej tylko modal) |
## Next Phase Readiness
**Milestone v0.7 COMPLETE** — plugin carei-reservation pełnoprawnie dwujęzyczny (PL + EN):
- Infrastruktura: textdomain + __() + careiI18n (Phase 16)
- Bilingual dane: pakiety pól _en + mapowanie Softra errors (Phase 17)
- Tłumaczenia: .po/.mo dla en_US + en_GB (Phase 18)
- UX: Flatpickr cross-browser + locale-aware (Phase 18 scope addition)
**Out of scope dla kolejnych milestones:**
- Tłumaczenie treści stron Elementora (Polylang Automatic Translate Addon)
- Menu, footer, theme stringi (Polylang String Translation)
- Nazwy miast/krajów (dane biznesowe z API Softra)
- Inne locale (fr, de) — dodaje się przez sam `.po/.mo` bez zmian w kodzie
**Blockers:** None.
---
*Phase: 18-en-translation, Plan: 01*
*Completed: 2026-04-22*