bezhanSalleh / filament-language-switch

A versatile and user-friendly plugin designed for Filament Panels.
MIT License
210 stars 45 forks source link

Get the default local from the Laravel config file before the browser #70

Closed alkoumi closed 5 months ago

alkoumi commented 8 months ago

To follow Laravel way If I want to start my app using the config('app.locale') by Editing the app file in config directory

'locale' => 'ar',

Then we must put this line

?? config('app.locale', 'en');

above this line

$this->getBrowserLocale($request)

then the final result in the SwitchLanguageLocale Middleware is

$locale = session()->get('locale')
                ?? $request->get('locale')
                ?? $request->cookie('filament_language_switch_locale')
                ?? config('app.locale' , 'en')
                ?? $this->getBrowserLocale($request);
alkoumi commented 8 months ago

I already test this in my application

markosole commented 8 months ago

Hi @alkoumi I am looking for something similar, I would like to set language per user settings set in DB just as initial if cookie isn't set. I can see that language switcher is setting cookie filament_language_switch_locale but it's encrypted.

UPDATE:

I've made Middleware which is then cheching authenticated user's lang prefs. Maybe not ideal solution but works well for me and my use case.


<?php

// namespace BezhanSalleh\FilamentLanguageSwitch\Http\Middleware;
namespace App\Http\Middleware;

use BezhanSalleh\FilamentLanguageSwitch\LanguageSwitch;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class DynamicUserLanguage
{
    public function handle(Request $request, Closure $next): \Illuminate\Http\Response | \Illuminate\Http\RedirectResponse
    {
        $locale = session()->get('locale')
            ?? $request->get('locale')
            ?? $request->cookie('filament_language_switch_locale')
            ?? $this->getUsersDefaultLanguage()
            ?? config('app.locale', 'en');

        if (in_array($locale, LanguageSwitch::make()->getLocales())) {
            app()->setLocale($locale);
        }
        return $next($request);
    }

    private function getBrowserLocale(Request $request): ?string
    {
        $appLocales = LanguageSwitch::make()->getLocales();
        $userLocales = preg_split('/[,;]/', $request->server('HTTP_ACCEPT_LANGUAGE'));
        foreach ($userLocales as $locale) {
            if (in_array($locale, $appLocales)) {
                return $locale;
            }
        }
        return null;
    }

    private function getUsersDefaultLanguage(){
        if(Auth::user()){
            return Auth::user()->user_language;
        }
        return null;
    }
}