路线内的Laravel app()-> getLocale()始终会打印默认的“ en”

时间:2018-08-20 20:43:08

标签: php laravel localization

在尝试给路由添加新的设置区域设置前缀时遇到了一个问题。 当我从控制器或路由闭包中返回app()-> getLocale()时,它会正确返回新的设置语言环境,但是当我将其放在Route前缀中时,会得到默认的'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();
    });
});

这是中间件:

<?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);
    }
}

请注意Route前缀内的语句“ app()-> getLocale()”,该语句的值始终为“ en”。但是,当我从闭包内部返回它时,它会打印新的设置语言环境“ ar”。

我要说的是,在前缀内部,app()-> getLocale()的值始终为“ en”,但在Closure中,其值为“ ar”。

因此,当我在浏览器中运行“ localehost:8000 / locale / ar”时,输出为“ ar”,这是正确的,但URL变为“ localehost:8000 / en”,并且应为“ localehost:8000 / ar” “是吗?当我在浏览器中运行“ localehost:8000 / ar”时,我得到一个404页面。

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

我希望获得帮助或使用新的语言环境为路由添加前缀的另一种方法,因为也许我做错了。

2 个答案:

答案 0 :(得分:0)

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

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

似乎您想为语言环境定义一个变量,在这种情况下,您将执行以下操作:

Route::group(['prefix' => '{locale}', 'middleware' => 'locale'], function() {
   ...
});

或者您可以使用一个像https://github.com/mcamara/laravel-localization

这样的程序包为您处理本地化的url。

答案 1 :(得分:0)

制作一个名为 SetLocale 的中间件,如下所示,并在 kernel.php 文件中注册:

public function handle($request, Closure $next)
{
    $desiredLocale=$request->segment(1);
    in_array($desiredLocale, ["en", "ar"]) ? app()->setLocale($desiredLocale) : app()->setLocale('en');

    return $next($request);
}

在 kernel.php 中添加 $routeMiddleware 数组,如下所示:

'local.set'=>\App\Http\Middleware\SetLocale::class,

现在,您可以像这样将其应用于所有路线:

Route::group(['prefix' => '{locale}','middleware' => 'local.set'], function () {
......
});