首页 > 解决方案 > Laravel 5.8 全局设置区域设置

问题描述

我有一条路线:

    Route::get('/setlocale/{locale}', function($locale) {
            App::setLocale($locale);

            return back();
    })->name('setlocale');

当我去:example.com/setlocale/ro我回到页面。但语言没有改变。为什么?我总是得到语言en。我检查语言:

    app()->getLocale();

但我需要在全球范围内为应用程序设置语言。

标签: phplaravellocalization

解决方案


试试这个方法

1.当用户选择一种语言时,我们将我们选择的语言环境(语言)放在会话中[例如 en、fr、hi]


Route::get('setlocale/{locale}',function($lang){
       \Session::put('locale',$lang);
       return redirect()->back();   
});

2. 我们使用中间件根据我们的会话语言环境翻译页面(用户选择)

<?php

namespace App\Http\Middleware;

use Closure;
use Session;
use App;
use Config;
class LanguageSwitcher
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if (!Session::has('locale'))
         {
           Session::put('locale', Config::get('app.locale'));
        }
        App::setLocale(Session::get('locale'));
        return $next($request);
    }
}

3.我们把这个中间件放在kernel.php routeMiddleware (app/Http/kernel.php)

protected $routeMiddleware = [
        'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'language' => \App\Http\Middleware\LanguageSwitcher::class,        
    ];
'language' => \App\Http\Middleware\LanguageSwitcher::class,

4. 为了服务这个中间件,我们需要路由组。所以每个请求都通过这个中间件

Route::group(['middleware'=>'language'],function ()
{
    //your translation routes
});

中间件中的逻辑

在每个请求的中间件中,我们检查当前会话中是否设置了语言环境。如果会话没有语言环境,那么对于当前请求,我们将语言环境设置为配置语言环境意味着在您的应用程序配置语言环境中

'locale' => 'en',  // config/app.php
 Session::put('locale',Config::get('app.locale')); // in middleware code we use Config method to get app configuration locale
App::setLocale(Session::get('locale')); // finally set this to App locale

否则,如果我们在当前会话中有语言环境,那么我们将其设置为 App 语言环境

App::setLocale(Session::get('locale')); // set this to App locale

完整的文章和源代码 - www.ultimateakash.com


推荐阅读