Store guest user language preference in long-lived cookie

Changes:
- LocaleController: Set 1-year cookie when language is changed
- SetLocale middleware: Check cookie after session, before default
  Priority: User DB > Session > Cookie > Default

This allows guest users to retain their language preference
even after closing the browser (persists for 1 year).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-30 12:32:01 +09:00
parent 61d42d79f1
commit b419991940
2 changed files with 16 additions and 3 deletions

View File

@@ -20,7 +20,7 @@ public function update(Request $request)
$locale = $validated['locale']; $locale = $validated['locale'];
// Save to session (works for both authenticated and guest users) // Save to session for immediate effect
$request->session()->put('locale', $locale); $request->session()->put('locale', $locale);
// If authenticated, also save to user record for persistence // If authenticated, also save to user record for persistence
@@ -28,6 +28,9 @@ public function update(Request $request)
Auth::user()->update(['locale' => $locale]); Auth::user()->update(['locale' => $locale]);
} }
// Set long-lived cookie (1 year) for guest users
cookie()->queue('locale', $locale, 525600); // 525600 minutes = 1 year
return redirect()->back()->with('success', __('messages.settings.language_updated')); return redirect()->back()->with('success', __('messages.settings.language_updated'));
} }
} }

View File

@@ -27,20 +27,30 @@ class SetLocale
/** /**
* Handle an incoming request. * Handle an incoming request.
* *
* Priority order:
* 1. Authenticated user's database preference
* 2. Session (for immediate effect after changing)
* 3. Cookie (long-term storage for guest users)
* 4. Default locale from config
*
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next * @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
*/ */
public function handle(Request $request, Closure $next): Response public function handle(Request $request, Closure $next): Response
{ {
$locale = config('app.locale', 'en'); $locale = config('app.locale', 'en');
// Check authenticated user's preference // Priority 1: Check authenticated user's preference
if (Auth::check() && Auth::user()->locale) { if (Auth::check() && Auth::user()->locale) {
$locale = Auth::user()->locale; $locale = Auth::user()->locale;
} }
// Check session (for immediate effect after changing) // Priority 2: Check session (for immediate effect after changing)
elseif ($request->session()->has('locale')) { elseif ($request->session()->has('locale')) {
$locale = $request->session()->get('locale'); $locale = $request->session()->get('locale');
} }
// Priority 3: Check cookie (long-term storage for guest users)
elseif ($request->cookie('locale')) {
$locale = $request->cookie('locale');
}
// Validate locale // Validate locale
if (!array_key_exists($locale, self::SUPPORTED_LOCALES)) { if (!array_key_exists($locale, self::SUPPORTED_LOCALES)) {