App::setLocale()
不是持久性的,并且仅为当前请求(运行时)设置区域设置。您可以通过多种方式实现持久性(示例 2):
Route::post('/locale', function(){
session(['my_locale' => app('request')->input('locale')]);
return redirect()->back();
});
这将设置会话密钥
,其中包含当前用户请求的值。接下来创建中间件
以根据用户会话语言设置区域设置lang
<?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);
}
}
这将获取当前会话,如果为空,则将回退到在应用配置中设置的默认区域设置。
在添加以前创建的中间件中:app\Http\Kernel.php
Language
protected $middleware = [
\App\Http\Middleware\Language::class,
];
作为全球中间件或仅用于Web(根据您的需求)。
方案 No2 - 基于 URL 路径的 Lang 在应用内创建具有所有可用区域设置的array
app config
'available_locale' => ['fr', 'gr', 'ja'],
在中间件内部,我们将检查 URL 第一段是否为 ,设置语言en, fr, gr, cy
available_locale
public function handle($request, Closure $next)
{
if(in_array($request->segment(1), config('app.available_locale'))){
$this->app->setLocale($request->segment(1));
}else{
$this->app->setLocale(config('app.locale'));
}
return $next($request);
}
您需要修改以设置所有路由的前缀。因此,您可以使用“查找”(Find: )访问它们,然后将其添加到其中:(在添加之前)app\Providers\RouteServiceProvider
example.com
example.com/fr/
French language
mapWebRoutes
use Illuminate\Http\Request;
)
public function map(Request $request)
{
$this->mapApiRoutes();
$this->mapWebRoutes($request);
}
protected function mapWebRoutes(Request $request)
{
$locale = null;
if(in_array($request->segment(1), config('app.available_locale'))){
$locale = $request->segment(1);
}
Route::group([
'middleware' => 'web',
'namespace' => $this->namespace,
'prefix' => $locale
], function ($router) {
require base_path('routes/web.php');
});
}
这将用国家/地区字母(如“fr gr cy”)作为所有路由的前缀,除了非重复内容,因此最好不要添加到available_locales_array