104 lines
3.6 KiB
Markdown
104 lines
3.6 KiB
Markdown
---
|
|
phase: 15-locale-detection-routing
|
|
plan: 01
|
|
subsystem: i18n
|
|
tags: [locale, cookie, middleware, wintercms-extension, browser-detection]
|
|
|
|
# Dependency graph
|
|
requires:
|
|
- phase: 11-translation-infrastructure
|
|
provides: Translate plugin with LocaleMiddleware and browser detection config
|
|
provides:
|
|
- LocalePicker extension setting manual selection cookie
|
|
- Database sync of user locale preference on switch
|
|
- URL prefix cookie setting in routes.php
|
|
affects: [16-content-localization, 17-i18n-testing]
|
|
|
|
# Tech tracking
|
|
tech-stack:
|
|
added: []
|
|
patterns: [WinterCMS component extension in Plugin boot(), Cookie queue pattern]
|
|
|
|
key-files:
|
|
created: []
|
|
modified:
|
|
- plugins/golem15/quotify/Plugin.php
|
|
- plugins/golem15/translate/routes.php
|
|
|
|
key-decisions:
|
|
- "Use WinterCMS extension pattern (no modification to core Translate plugin classes)"
|
|
- "Cookie name from config: golem15.translate::browserDetection.manualSelectionCookie"
|
|
- "1-year cookie expiry (525600 minutes) from config"
|
|
|
|
patterns-established:
|
|
- "LocalePicker extension: Use component.beforeRunAjaxHandler event for pre-handler logic"
|
|
- "Cookie setting: Use \\Cookie::queue() with config-based name and expiry"
|
|
|
|
# Metrics
|
|
duration: 2min
|
|
completed: 2026-02-02
|
|
---
|
|
|
|
# Phase 15 Plan 01: Locale Preference Infrastructure Summary
|
|
|
|
**LocalePicker extension with manual selection cookie (1-year) and user DB sync, plus URL prefix cookie setting in routes.php**
|
|
|
|
## Performance
|
|
|
|
- **Duration:** 2 min
|
|
- **Started:** 2026-02-02T01:01:04Z
|
|
- **Completed:** 2026-02-02T01:02:55Z
|
|
- **Tasks:** 3
|
|
- **Files modified:** 2
|
|
|
|
## Accomplishments
|
|
|
|
- LocalePicker component extended to set `locale_manually_set` cookie on manual language switch
|
|
- Logged-in users' locale preference saved to database (`preferred_locale` field) on switch
|
|
- URL prefix visits (/pl/, /de/) now set manual selection cookie preventing browser detection override
|
|
- Verified LocaleMiddleware reads the same cookie name correctly
|
|
|
|
## Task Commits
|
|
|
|
Each task was committed atomically:
|
|
|
|
1. **Task 1: Extend LocalePicker to set cookie and sync user preference** - `4a04780` (feat) [quotify submodule]
|
|
2. **Task 2: Set cookie on URL prefix detection in routes.php** - `c389de1` (feat) [translate submodule]
|
|
3. **Task 3: Verify middleware reads the cookie correctly** - verification only, no commit required
|
|
|
|
**Submodule update:** `382b7a6` (chore: update submodule references)
|
|
|
|
## Files Created/Modified
|
|
|
|
- `plugins/golem15/quotify/Plugin.php` - Added extendLocalePicker() method with Cookie::queue and Auth user sync
|
|
- `plugins/golem15/translate/routes.php` - Added cookie setting after loadLocaleFromRequest() succeeds
|
|
|
|
## Decisions Made
|
|
|
|
- **WinterCMS extension pattern:** Extended LocalePicker component in Quotify Plugin.php rather than modifying core Translate plugin classes (preserves plugin isolation)
|
|
- **Config-driven cookie settings:** Used `golem15.translate::browserDetection.manualSelectionCookie` and `manualSelectionExpiry` config values for consistency across all cookie operations
|
|
|
|
## Deviations from Plan
|
|
|
|
None - plan executed exactly as written.
|
|
|
|
## Issues Encountered
|
|
|
|
None - all tasks completed successfully.
|
|
|
|
## User Setup Required
|
|
|
|
None - no external service configuration required.
|
|
|
|
## Next Phase Readiness
|
|
|
|
- Locale preference infrastructure complete
|
|
- Manual selections now persist via cookie (1-year expiry)
|
|
- Logged-in users' preferences sync to database
|
|
- Browser detection correctly skipped when manual selection cookie present
|
|
- Ready for Phase 15 Plan 02 (if any) or Phase 16 (Content Localization)
|
|
|
|
---
|
|
*Phase: 15-locale-detection-routing*
|
|
*Completed: 2026-02-02*
|