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 而不添加它。