【问题标题】:Laravel 5.8 setLocale globallyLaravel 5.8 全局设置区域设置
【发布时间】:2019-03-26 09:25:14
【问题描述】:

我有一条路线:

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

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

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

    app()->getLocale();

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

【问题讨论】:

  • config/app.php 中根据需要更改'locale' 值。
  • @dparoli 我需要在网络上使用路由更改语言环境,但不是在配置中。谢谢
  • App::setLocale($locale);是每个请求,所以你甚至必须在 back() 路由中调用它
  • @Dronax 如果您得到回答,则将您的答案标记为已接受的答案,这样该问题就不会出现在未回答的问题中

标签: php laravel localization


【解决方案1】:

试试这个方法

1。当用户选择一种语言时,我们将我们选择的语言环境(语言)放在会话中 [example 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

【讨论】:

  • 请在您的代码中添加一些解释,以便其他人可以从中学习
  • @NicoHaase 感谢您的建议。现在添加解释
【解决方案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);
}

希望对您有所帮助。

有用的链接:

【讨论】:

  • Session store not set on request. 中间件出错。
  • 你可能需要使用会话助手方法,或者在这种情况下使用会话门面。
【解决方案3】:

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

@php

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

@endphp

希望对你有帮助

【讨论】:

    猜你喜欢
    • 2013-06-16
    • 2015-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    • 2018-08-23
    相关资源
    最近更新 更多