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

时间:2018-03-02 00:04:33

标签: php laravel

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

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始终返回默认的区域设置,即使区域设置设置为另一个(因为我可以在网络上看到不同的文本)。

$locale = App::getLocale();

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

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

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

$locale = App::getLocale();

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

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

Kernal.php

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

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

所以我在注册任何全局中间件之前调用web.php。但是,如何根据locale ???

设置动态前缀

2 个答案:

答案 0 :(得分: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 :(得分: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())放入您的控制器中。

这应该有用。