Laravel 8 route() 不本地化字符串
Laravel 8 route() does not localize strings
编辑:找到了我所有问题的答案:https://github.com/codezero-be/laravel-localized-routes(当然还有 42)。
我正在开发 multi-language 网站,其中 URL 包含本地化字符串。例如:
https:///site/en/会员/john-doe
https:///site/nl/leden/john-doe
(对于每种语言也是如此)
在 web.php 中,我为我的路线添加了前缀。通过中间件,我设置了当前语言(从第一个 URL-segment 中检索)。这适用于一切(在控制器和 blade 中)...除了由 route() 生成的 URLs。它们始终使用默认语言。即使其他所有内容都已正确本地化。如果我将 app()->getLocale() 转储到 blade 的控制器中,它会显示正确的语言。只有 route() 函数生成的 URLs 总是使用默认的后备语言。
我试过在 middleware-groups 列表中将我的 middleware-class 移到更高的位置。那没有什么不同。
web.php
Route::prefix('{lang}')->group(function() {
Route::get(trans('routes.members') . '/{username}/', 'MembersController@profile')
->name('members.show');
}
设置语言中间件
...
public function handle(Request $request, Closure $next)
{
$lang = $request->segment(1) ?? app()->getLocale();
//set app language
app()->setLocale($lang);
//set default url parameter
URL::defaults(['lang' => $lang]);
return $next($request);
}
...
App\Http\Kernel.php
...
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Laravel\Jetstream\Http\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\App\Http\Middleware\SetLanguage::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\App\Http\Middleware\UserLastSeenAt::class,
],
...
知道了(在朋友的帮助下)
在我添加的AppServiceProvider的启动函数中
public function boot(Request $request)
{
//set app language
app()->setLocale($request->segment(1) ?? app()->getLocale());
}
& SetLanguage-中间件现在只包含
public function handle(Request $request, Closure $next)
{
//set default url parameter
URL::defaults(['lang' => app()->getLocale()]);
return $next($request);
}
成功了!
太棒了!我和你做的一样,但是当我选择从切换器更改语言时我遇到了问题。
blade中的切换器:
<a class="ml-1 underline ml-2 mr-2" href="{{ route('change-lang')}}">
<span>{{ $locale_name }}</span>
</a>
目标路线:
Route::get('/lang', [LangController::class, 'changeLang'])->name('change-lang');
LangController中的函数:
public function changeLang($locale){
App::setLocale($locale);
session()->put('locale', $locale);
return redirect()->back();
}
让我解释一下:
如果我导航,例如,在关于部分,我的 url 是“webname/it/azienda”,我在 EN 中切换语言,我的 url 变成“webname/it/en” ;
如果我的主页有“webname/azienda”或“/”,则更改语言不会有问题。
我不能只更改参数 LOCALE 而不添加它。
编辑:找到了我所有问题的答案:https://github.com/codezero-be/laravel-localized-routes(当然还有 42)。
我正在开发 multi-language 网站,其中 URL 包含本地化字符串。例如:
https:///site/en/会员/john-doe
https:///site/nl/leden/john-doe
(对于每种语言也是如此)
在 web.php 中,我为我的路线添加了前缀。通过中间件,我设置了当前语言(从第一个 URL-segment 中检索)。这适用于一切(在控制器和 blade 中)...除了由 route() 生成的 URLs。它们始终使用默认语言。即使其他所有内容都已正确本地化。如果我将 app()->getLocale() 转储到 blade 的控制器中,它会显示正确的语言。只有 route() 函数生成的 URLs 总是使用默认的后备语言。
我试过在 middleware-groups 列表中将我的 middleware-class 移到更高的位置。那没有什么不同。
web.php
Route::prefix('{lang}')->group(function() {
Route::get(trans('routes.members') . '/{username}/', 'MembersController@profile')
->name('members.show');
}
设置语言中间件
...
public function handle(Request $request, Closure $next)
{
$lang = $request->segment(1) ?? app()->getLocale();
//set app language
app()->setLocale($lang);
//set default url parameter
URL::defaults(['lang' => $lang]);
return $next($request);
}
...
App\Http\Kernel.php
...
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Laravel\Jetstream\Http\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\App\Http\Middleware\SetLanguage::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\App\Http\Middleware\UserLastSeenAt::class,
],
...
知道了(在朋友的帮助下)
在我添加的AppServiceProvider的启动函数中
public function boot(Request $request)
{
//set app language
app()->setLocale($request->segment(1) ?? app()->getLocale());
}
& SetLanguage-中间件现在只包含
public function handle(Request $request, Closure $next)
{
//set default url parameter
URL::defaults(['lang' => app()->getLocale()]);
return $next($request);
}
成功了!
太棒了!我和你做的一样,但是当我选择从切换器更改语言时我遇到了问题。 blade中的切换器:
<a class="ml-1 underline ml-2 mr-2" href="{{ route('change-lang')}}">
<span>{{ $locale_name }}</span>
</a>
目标路线:
Route::get('/lang', [LangController::class, 'changeLang'])->name('change-lang');
LangController中的函数:
public function changeLang($locale){
App::setLocale($locale);
session()->put('locale', $locale);
return redirect()->back();
}
让我解释一下:
如果我导航,例如,在关于部分,我的 url 是“webname/it/azienda”,我在 EN 中切换语言,我的 url 变成“webname/it/en” ;
如果我的主页有“webname/azienda”或“/”,则更改语言不会有问题。
我不能只更改参数 LOCALE 而不添加它。