3
votes

Laravel 5.8 setLocale dans le monde

J'ai un itinéraire:

    app()->getLocale();

Quand je vais sur: example.com/setlocale/ro je reviens à la page. Mais la langue n'est pas changée. Pourquoi? Je reçois toujours la langue en . Je vérifie la langue avec:

    Route::get('/setlocale/{locale}', function($locale) {
            App::setLocale($locale);

            return back();
    })->name('setlocale');

Mais j'ai besoin de définir la langue globalement pour l'application.


5 commentaires

dans config / app.php modifiez la valeur de 'locale' comme vous le souhaitez.


@dparoli J'ai besoin de changer les paramètres régionaux avec la route sur le Web, mais pas dans la configuration .. Merci


App :: setLocale ($ locale); est par demande, vous devez donc l'appeler même dans la route back ()


Le doublon possible de Le changement de paramètres régionaux de Laravel ne fonctionne pas


@Dronax si vous avez obtenu une réponse, marque votre réponse comme réponse acceptée à cette question ne s'affichera pas dans les questions sans réponse


3 Réponses :


2
votes

Il ne sera défini que pour cette demande en cours. Vous appelez la méthode back () , qui lancera une nouvelle requête / réponse et réinitialisera les paramètres régionaux.

Vous devez conserver la valeur dans la session des utilisateurs, ou cookie, puis utilisez un fournisseur de services ou un middleware pour définir les paramètres régionaux à partir de la session / du cookie.

Route::get('/setlocale/{locale}', function (\Illuminate\Http\Request $request, $locale) {
    $request->session()->put('locale', $locale);
    // or
    session(['locale' => $locale]);

    return back();
});


// Middleware:

public function handle($request, $next) {
    App::setLocale($request->session->get('locale', 'some default locale');

    // or

    App::setLocale(session('locale'));

    return $next($request);
}

J'espère que cela vous aidera.

Liens utiles:

  • https://laravel.com/docs/5.8/session#storing-data
  • https://laravel.com/docs/5.8/middleware

  • 2 commentaires

    Magasin de session non défini sur demande. Erreur avec le middleware.


    Vous devrez peut-être utiliser la méthode d'assistance de session ou la façade de session dans ce cas.



    17
    votes

    Essayez de cette façon

    1. tout d'abord, lorsque l'utilisateur choisit une langue, nous mettons notre locale (langue) sélectionnée en session [exemple en, fr, hi]

    App::setLocale(session('locale')); // set this to App locale
    

    2. Deuxièmement, nous utilisons un middleware pour traduire les pages en fonction de nos paramètres régionaux de session (sélectionné par l'utilisateur)

    'locale' => 'en',  // config/app.php
     Session::put('locale',Config::get('app.locale')); // in middleware code we use Config method to get app configuration locale
    App::setLocale(session('locale')); // finally set this to App locale
    

    3. Troisièmement, nous mettons ce middleware dans kernel.php routeMiddleware (app / Http / kernel.php)

    Route::group(['middleware'=>'language'],function ()
    {
        //your translation routes
    });
    
    'language' => \App\Http\Middleware\LanguageSwitcher::class,
    

    4. Quatrièmement, pour servir ce middleware, nous avons besoin d'un groupe de routes. donc chaque requête passe par ce middleware

    protected $routeMiddleware = [
            'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
            'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
            'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
            'can' => \Illuminate\Auth\Middleware\Authorize::class,
            'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
            'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
            'language' => \App\Http\Middleware\LanguageSwitcher::class,        
        ];
    

    Logique dans le middleware

    Dans le middleware pour chaque requête, nous vérifions si les paramètres régionaux sont définis dans la session en cours ou non. si la session n'a pas de paramètres régionaux, alors pour la demande actuelle, nous définissons les paramètres régionaux sur config locale signifie dans votre configuration d'application locale

    <?php
    
    namespace App\Http\Middleware;
    
    use Closure;
    use Session;
    use App;
    use Config;
    class LanguageSwitcher
    {
        /**
         * Handle an incoming request.
         *
         * @param  \Illuminate\Http\Request  $request
         * @param  \Closure  $next
         * @return mixed
         */
        public function handle($request, Closure $next)
        {
            if (!Session::has('locale'))
             {
               Session::put('locale',Config::get('app.locale'));
            }
            App::setLocale(session('locale'));
            return $next($request);
        }
    }
    

    sinon si nous avons des paramètres régionaux dans la session actuelle, nous définissons cela sur App locale

    Route::get('setlocale/{locale}',function($lang){
           \Session::put('locale',$lang);
           return redirect()->back();   
    });
    


    2 commentaires

    Veuillez ajouter une explication à votre code afin que d'autres puissent en tirer des leçons


    @NicoHaase Merci pour votre suggestion. maintenant une explication ajoutée



    0
    votes

    J'étais confronté au même problème, la locale changeait en session mais pas en config. Donc, j'ai vérifié les paramètres régionaux de la session dans chaque lame et contrôleur et défini la langue par défaut à partir de là, voici le code sur mon fichier lame

    @php
    
    if(\Session::get('locale') == 'en') 
        \App::setLocale('en');
    else                                
        \App::setLocale('bn');
    
    @endphp
    

    J'espère que cela vous aidera


    0 commentaires