-
Notifications
You must be signed in to change notification settings - Fork 0
Closed
Labels
Description
📝 Description
Allow users to set their preferred language in their profile, which overrides the browser's Accept-Language header. This gives users explicit control over the application language regardless of their browser settings.
🎯 User Story
As a user, I want to set my preferred language in my profile settings, so that I can use SecPal in my language of choice even when my browser is configured for a different language.
💡 Proposed Solution
Locale Priority Order
- User Profile Setting (highest priority) - if user has explicitly set a language preference
- Accept-Language Header (fallback) - browser preference
- Application Default (en) - if neither is available
Implementation Steps
-
Add
preferred_localecolumn touserstable (nullable, default: null)- Values:
en,de, ornull(use Accept-Language)
- Values:
-
Update Locale Middleware to check user preference first:
$locale = $request->user()?->preferred_locale ?? $request->getPreferredLanguage(['en', 'de']) ?? 'en';
-
Add API endpoint to update user language preference:
PATCH /api/v1/me/languagewith body{ "locale": "de" }
-
Frontend: Add language selector in user profile/settings
✅ Acceptance Criteria
- User can set
preferred_localein their profile - User's explicit language choice overrides
Accept-Languageheader - Setting
preferred_localetonullfalls back toAccept-Language - API endpoint validates locale values (only
en,deallowed) - Tests verify priority order: user preference > header > default
- Migration is reversible
- Documentation updated
🔗 Dependencies
- Depends on: PR-1: API Translation.io Integration & Configuration #84 (API Translation.io Integration must be complete)
- Depends on: TBD (Middleware implementation for Accept-Language)
- Related: [EPIC] Multi-Language Support with Translation.io #83 (Epic: Multi-Language Support)
📚 Technical Notes
- Store as 2-character locale code (
en,de) - Column type:
VARCHAR(5)(allows future expansion toen-US,de-DE) - Add validation rule:
in:en,deor nullable - Consider adding index on
preferred_localeif we need to query by language in future
🚫 Non-Goals
- Automatic detection based on IP/location (not in scope)
- Language switching without authentication (guests always use Accept-Language)
- Per-tenant language settings (tenant admins can't force language for all users)
Priority: Medium (enhancement after basic i18n is working)
Effort: Small (~2-4 hours including tests)
Metadata
Metadata
Assignees
Labels
Type
Projects
Status
✅ Done