Laravel 5.8 setLocale全局

时间:2019-03-26 09:25:15

标签: php laravel localization

我有一条路线:

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

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

当我转到example.com/setlocale/ro时,我返回页面。但是语言没有改变。为什么?我总是得到语言en。我通过以下方式检查语言:

app()->getLocale();

但是我需要为应用程序全局设置语言。

3 个答案:

答案 0 :(得分:5)

尝试这种方式

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('locale'));
        return $next($request);
    }
}

3。第三,我们将该中间件放入kernal.php routeMiddleware(app / Http / kernal.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
});

中间件中的逻辑

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

'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('locale')); // finally set this to app locale

否则,如果当前会话中具有语言环境,则将其设置为“应用语言环境”

App::setLocale(session('locale')); // set this to app locale

答案 1 :(得分:2)

仅针对该当前请求进行设置。您正在调用back()方法,该方法将启动新的请求/响应并重置语言环境。

您应将值持久保存到用户会话或cookie,然后使用服务提供商或中间件从会话/ cookie中设置区域设置。

Route::get('/setlocale/{locale}', function (\Illuminate\Http\Request $request, $locale) {
    $request->session()->put('locale', $locale);
    // or
    session(['locale' => $locale]);

    return back();
});


// Middleware:

public function handle($request, $next) {
    App::setLocale($request->session->get('locale', 'some default locale');

    // or

    App::setLocale(session('locale'));

    return $next($request);
}

希望有帮助。

有用的链接:

答案 2 :(得分:0)

我遇到了同样的问题,在会话中更改了语言环境,但在配置中没有更改。因此,已经在每个刀片服务器和控制器中检查了会话的语言环境,并从那里设置了默认的语言即时设置,这是刀片服务器文件中的代码

@php

if(\Session::get('locale') == 'en') 
    \App::setLocale('en');
else                                
    \App::setLocale('bn');

@endphp

希望它会为您提供帮助