【问题标题】:Laravel 8 route() does not localize stringsLaravel 8 route() 不本地化字符串
【发布时间】:2021-03-20 23:42:21
【问题描述】:

编辑:找到我所有问题的答案:https://github.com/codezero-be/laravel-localized-routes(当然还有 42 个)。

我正在开发一个多语言网站,其中 URL 包含本地化字符串。例如:

https://site/en/会员/john-doe
https://site/nl/leden/john-doe
(对于每种语言也是如此)

在 web.php 中,我为我的路线添加了前缀。通过中间件,我设置了当前语言(从第一个 URL 段中检索)。这适用于所有东西(在控制器和刀片中)...除了 route() 生成的 URL。它们始终使用默认语言。即使其他所有内容都已正确本地化。如果我将 app()->getLocale() 转储到刀片控制器中,它会显示正确的语言。只有 route() 函数生成的 URL 始终使用默认的后备语言。

我尝试将我的中间件类在中间件组列表中上移。这并没有什么不同。

web.php

Route::prefix('{lang}')->group(function() {
        Route::get(trans('routes.members') . '/{username}/', 'MembersController@profile')
            ->name('members.show');
}

SetLanguage 中间件

... 
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,
        ],
        ...

【问题讨论】:

  • 我发现这是一个可能的解决方案,但它似乎有点......矫枉过正。如果 route() 函数使用我在调用它之前设置的语言,我很好:) mydnic.be/post/…

标签: laravel localization translation laravel-routing laravel-8


【解决方案1】:

知道了(在朋友的帮助下)

在我已经添加的AppServiceProvider的启动函数中

 public function boot(Request $request)
 {
        //set app language
        app()->setLocale($request->segment(1) ?? app()->getLocale());
  }
    

& SetLanguage-middleware 现在只包含

public function handle(Request $request, Closure $next)
{
    //set default url parameter
    URL::defaults(['lang' => app()->getLocale()]);
     return $next($request);
 }

成功了!

【讨论】:

  • 我发现的其他东西:trans('file.key', [], 'fr') 获取键的法语值。与当前应用语言环境无关。
【解决方案2】:

太棒了!我和你做的一样,但是当我选择从切换器更改语言时遇到问题。 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();
    }

让我解释一下:

如果我导航,例如,在 about 部分,我的 url 是“webname/it/azienda”,我在 EN 中切换语言,我的 url 变成“webname/it/en”;

如果主页有“webname/azienda”或“/”,我更改语言没有问题。

我不能只更改参数 LOCALE 而不添加它。

【讨论】:

  • 你必须让你的 switch-url 替换语言部分而不是附加它:例如 webname/en 而不是 webname/it/en
猜你喜欢
  • 2014-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-09
  • 2021-01-07
  • 2013-11-10
  • 1970-01-01
相关资源
最近更新 更多