Laravel app()->getLocale() 内部路由总是打印默认的“en”

wal*_*lid 7 php localization laravel

我在尝试使用新设置的区域设置为我的路线添加前缀时遇到了问题。当我从控制器或路由闭包返回 app()->getLocale() 时,它会正确返回新设置的区域设置,但是当我将其放入路由前缀时,我会得到默认的“en”。就我而言,新的语言环境是“ar”。

这是我在 web.php 中的代码

<?php


//Request to put the choosen locale into the session
Route::get('locale/{locale}', function($locale) {

    session()->put('userLocale', $locale);
    return redirect(app()->getLocale());
});

//Group of routes that are supposed to be prefixed with new set locale 'ar'
Route::group(['prefix' => app()->getLocale(), 'middleware' => 'locale'], function() {

    Route::get('/', function() {
        return app()->getLocale();
    });
});
Run Code Online (Sandbox Code Playgroud)

这是中间件:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Foundation\Application;
use Illuminate\Http\Request;

class Locale
{
    protected $app;

    public function __construct(Application $app)
    {
        $this->app = $app;
    }

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $this->app->setLocale(session('userLocale'));
        return $next($request);
    }
}
Run Code Online (Sandbox Code Playgroud)

注意路由前缀中的“app()->getLocale()”语句,该语句的值始终为“en”。但是当我从闭包中返回它时,它会打印新设置的区域设置“ar”。

我想说的是,在 prefix 内部,app()->getLocale() 的值始终是“en”,但在 Closure 内部它的值是“ar”。

因此,当我在浏览器中运行“localehost:8000 / locale / ar”时,输出是“ar”,这是正确的,但网址变为“localehost:8000 / en”,而应该是“localehost:8000 / ar”不是'它 ?当我在浏览器中运行“localehost:8000/ar”时,我得到一个 404 页面。

我尝试从RouteServiceProvider 的 mapWebRoutes 方法中设置前缀中设置前缀,但它不起作用,因为我认为服务提供程序在中间件之前执行,因此它无法识别中间件设置的新语言环境。

我希望获得帮助或其他方法来为路由添加新的语言环境前缀,因为也许我做错了。

Dev*_*von 4

在中间件运行之前,不会从会话中设置您的区域设置。您的路由必须在中间件运行之前定义,否则系统将不知道哪个中间件应该在哪些路由上运行。

由于 app()->locale() 将在中间件运行之前返回“en”,因此您的代码所做的就是定义“en”前缀。

看来您可能想为区域设置定义一个变量,在这种情况下,您会执行以下操作:

Route::group(['prefix' => '{locale}', 'middleware' => 'locale'], function() {
   ...
});
Run Code Online (Sandbox Code Playgroud)

或者您可以使用一个为您处理本地化网址的包,例如https://github.com/mcamara/laravel-localization