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;
}
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(根据您的需求)。
场景2 - 基于URL路径的语言设置:在应用程序配置
中创建一个包含所有可用区域设置的数组
'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);
}
你需要修改 `app\Providers\RouteServiceProvider` 文件中的路由前缀,这样你就可以通过 `example.com` 或 `example.com/fr/` 访问所有路由,而且带有 `法语` 语言。
找到:`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”(除了“en”以外),以避免重复内容,因此最好不要将其添加到available_locales_array
中。