diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index 5c22ddd..a5844a3 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -111,11 +111,13 @@ class HomeController extends Controller */ public function updateLanguage(Request $request): \Illuminate\Http\RedirectResponse { - if(! in_array($request->language, config('lang-detector.languages'))) { - return redirect()->back(); - } + abort_unless(in_array($request->language, config('app.supported_locales'), true), 404); - Cookie::queue(Cookie::forever('locale', $request->language)); + session(['locale' => $request->language]); + + if (Auth::check()) { + Auth::user()->update(['locale' => $request->language]); + } return redirect()->back(); } diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 01c41f1..360c802 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -37,6 +37,7 @@ class Kernel extends HttpKernel \App\Http\Middleware\VerifyCsrfToken::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, \App\Http\Middleware\IsBanned::class, + \App\Http\Middleware\SetLocale::class, ], 'api' => [ diff --git a/app/Http/Middleware/SetLocale.php b/app/Http/Middleware/SetLocale.php new file mode 100644 index 0000000..7627f1f --- /dev/null +++ b/app/Http/Middleware/SetLocale.php @@ -0,0 +1,41 @@ +locale) { + App::setLocale(Auth::user()->locale); + return $next($request); + } + + // 2. Session (guest or user override) + if (session()->has('locale') && in_array($request->language, config('app.supported_locales'), true)) { + App::setLocale(session('locale')); + return $next($request); + } + + // 3. Browser language + $locale = $request->getPreferredLanguage(config('app.supported_locales')); + + if ($locale) { + App::setLocale($locale); + } + + return $next($request); + } +} diff --git a/config/app.php b/config/app.php index fb93f3e..be4adc8 100644 --- a/config/app.php +++ b/config/app.php @@ -111,6 +111,18 @@ return [ 'faker_locale' => 'en_US', + /* + |-------------------------------------------------------------------------- + | Supported Locales + |-------------------------------------------------------------------------- + | + | This is used to display the supported locales by this app, it also is + | used to verify session data and requests in the SetLocale Middleware + | + */ + + 'supported_locales' => ['en', 'de', 'fr'], + /* |-------------------------------------------------------------------------- | Encryption Key diff --git a/database/migrations/2026_01_11_151205_add_locale_to_users_table.php b/database/migrations/2026_01_11_151205_add_locale_to_users_table.php new file mode 100644 index 0000000..5bc874f --- /dev/null +++ b/database/migrations/2026_01_11_151205_add_locale_to_users_table.php @@ -0,0 +1,30 @@ +string('locale', 10) + ->nullable() + ->after('discord_avatar'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn('locale'); + }); + } +};