Laravel没有在web.php中提供正确的语言环境

问题描述 投票:1回答:2

我的应用可以使用网址请求更改区域设置。

Route::get('/setLocale/{locale}', function (Request $request, $locale) {
    session()->put('locale', $locale);
    App::setLocale($locale);
    return redirect('/');
})->name('setLocale');

该区域设置字符串将存储在会话中。我使用中间件动态更改语言环境,如果有的话。

public function handle($request, Closure $next)
    {
        if (session('locale')) {
            App::setLocale(session('locale'));
        }
        return $next($request);
    }

问题是App::getLocale()中的web.php总是返回默认的语言环境设置,即使将语言环境设置为另一个(因为我可以在Web上看到不同的文本)。

$locale = App::getLocale();

dd($locale); // default locale set in config.php

我尝试使用session('locale'),但它总是返回null。我很确定它是在会话中设置的,因为我可以看到该网站具有该语言环境。

我需要引用locale的原因是因为我想根据locale生成动态路由前缀。

$locale = App::getLocale();

Route::prefix($locale)->group(function () {
   ....
});

我想知道这里的问题是什么?是因为会话没有在路由之前实例化吗?


Kernel.php

protected $middlewareGroups = [
        'web' => [
            ... (default)
            \App\Http\Middleware\SetLocale::class,
        ],
    ];

所以我dd()web.php上的App :: getLocale()和我的全球网络中间件,web.php上的dd()首先被打印出来......

所以我在任何全球中间件注册之前都会调用web.php。但是,如何根据locale设置动态前缀?

php laravel
2个回答
3
投票

你可以使用这样的东西

这是路线

Route::group(['middleware' => ['language']], function () {
   Route::get('/language/{locale}', [
    'uses' => 'Frontend\LanguageController@changeLanguage',
    'as' => 'language.changer',
    'role' => ['company', 'user']
   ]);
});

这是语言控制器

<?php

 namespace App\Http\Controllers\Frontend;
 use Illuminate\Http\Request;
 use App\Http\Controllers\Controller; 
 use Session;

class LanguageController extends Controller
{
public function changeLanguage($locale){
    Session::put('locale', $locale);
    return redirect()->back();
}
}

这是中间件

public function handle($request, Closure $next)
{
    if (Session::has('locale') == true) {

        App::setLocale(Session::get('locale'));
    }
    Carbon::setLocale(Session::get('locale'));
    return $next($request);
}

如果出现问题,这将设置您的默认语言环境

public function boot()
{
    Schema::defaultStringLength(191);
    if(Session::has('locale') == false)
    {
        App::setLocale('en');
    }
}

最后你可以使用这样的东西:

<li class="is-relative hidden-lg hidden-md">
   <a href="/logout">
      <i class="fa fa-power-off"></i> 
      {{ trans('lang.logout') }}
     <span class="sr-only">(current)</span>
  </a>
</li>

希望这对你有所帮助..


1
投票

您可以在web.php文件中使用此全局帮助程序设置和获取区域设置应用程序:

<?php

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
app()->setLocale('en');
dd(app()->getLocale());

但是您的中间件将在您之前请求访问某些路由后应用。因此,要测试您的应用程序区域设置,请将此代码dd(app()->getLocale())放入您的控制器中。

这应该工作。

© www.soinside.com 2019 - 2024. All rights reserved.