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.
3 Réponses :
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:
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.
Essayez de cette façon
App::setLocale(session('locale')); // set this to App locale
'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
Route::group(['middleware'=>'language'],function () { //your translation routes });
'language' => \App\Http\Middleware\LanguageSwitcher::class,
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, ];
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(); });
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
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
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