App::setLocale()
nie jest trwały, ustawia ustawienia regionalne tylko dla bieżącego żądania. Co można zrobić, to:
Route::post('/locale', function(){
session(['my_locale' => Request::Input('locale')]);
return redirect()->back();
});
Spowoduje to ustawienie session key
dla bieżącego użytkownika Po będziemy potrzebować Middleware
wykryć locale
<?php namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Foundation\Application;
class Language {
public function __construct(Application $app, Request $request) {
$this->app = $app;
$this->request = $request;
}
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$this->app->setLocale(session('my_locale', config('app.locale')));
return $next($request);
}
}
To będzie sesję, a jeśli jest pusty to przywróci domyślne ustawienia regionalne ustawione w konfiguracji aplikacji.
Otwarte app\Http\Kernel.php
i dodać tę linię:
protected $middleware = [
\App\Http\Middleware\Language::class,
];
jak globalne middlware lub po prostu dla sieci web. nadzieję, że to pomogło i masz pomysł jak to działa
Scenariusz №2 Załóż array
ze wszystkich dostępnych lokalizacjach na swojej stronie wewnątrz app config
'available_locale' => ['fr', 'gr', 'ja'],
Wewnątrz Middleware będziemy sprawdzać URL pierwszy segment en fr gr cy
jeżeli ten segment jest w available_locales_array
możemy ustawić locale
public function handle($request, Closure $next)
{
if(in_array($request->segment(1), config('app.available_locales_array'))){
$this->app->setLocale($request->segment(1));
}else{
$this->app->setLocale(config('app.locale'));
}
return $next($request);
}
będziesz nee d zmodyfikuj app\Providers\RouteServiceProvider
, aby ustawić prefiks dla wszystkich twoich tras. dzięki czemu można uzyskać do nich dostęp domain.com
lub domain.com/fr/
z French language
znajdują się: mapWebRoutes
i dodać do niego:
if(in_array($request->segment(1), config('app.available_locales_array'))){
$locale = $request->segment(1);
}else{
$locale = null;
}
Route::group([
'middleware' => 'web',
'namespace' => $this->namespace,
'prefix' => $locale
], function ($router) {
require base_path('routes/web.php');
});
To będzie poprzedzić wszystkie swoje trasy na literę kraj jak „fr gr cy” z wyjątkiem pl dla non-duplikaty , więc lepiej nie dodawać do available_locales_array
setLocale nie jest trwały, więc zmiana go, a następnie przekierowanie pozostawi domyślną. Skorzystaj z sesji (lub bazy danych) i oprogramowania pośredniego, aby ta zmiana stała się stała dla użytkownika. Powinienem zauważyć, że jeśli jest to strona internetowa z widokiem publicznym, powinieneś używać różnych adresów URL dla różnych języków. – Devon