Laravel 5.4存储Locale setLocale()的正确方法

时间:2017-08-01 09:22:23

标签: laravel locale

我需要知道。为用户存储Locale的正确方法是什么。如果对于每个用户的请求,我通过

更改语言
    App::setLocale($newLocale);

它不会改变我的整个项目和其他请求的语言吗?我的意思是当一个用户更改语言时,它将被用作其他用户的默认语言。

提前致谢

5 个答案:

答案 0 :(得分:8)

如果您在App::setLocale()中设置了AppServiceProvider.php,则会为所有用户进行更改。

您可以为此创建中间件。类似的东西:

<?php

namespace App\Http\Middleware;

use Closure;

class SetLocale
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        app()->setLocale($request->user()->getLocale());

        return $next($request);
    }
}

(您需要在User模型上创建一个getLocale()方法才能使其生效。)

然后在Kernel.php中为auth创建一个中间件组:

'auth' => [
    \Illuminate\Auth\Middleware\Authenticate::class,
    \App\Http\Middleware\SetLocale::class,
],

auth数组中移除$routeMiddlewareKernel.php)。

现在,在使用auth中间件的每条路由上,您将为每个用户设置Laravel应用程序的区域设置。

答案 1 :(得分:4)

我用控制器,中间件和会话解决了这个问题。 这对我很有用,希望它可以帮到你。

通过控制器处理用户请求:

只需将语言设置为用户会话。

     /**
     * Locale switcher
     *
     * @param Request $request
     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
     */
    public function switchLocale(Request $request)
    {
        if (!empty($request->userLocale)) {
             Session::put('locale', $request->userLocale);
        }
        return redirect($request->header("referer"));
    }

路由到切换区域设置:

Route::post('translations/switchLocale}', ['as' => 'translations.switch', 'uses' => 'Translation\TranslationController@switchLocale']);

用于处理所需设置的中间件:

在中间件中检查用户的语言设置会话,如果它的pereset设置它。

/**
 * @param $request
 * @param Closure $next
 * @param null $guard
 * @return mixed
 */
public function handle(Request $request, Closure $next, $guard = null)
{
   if (Session::has('locale')) {
        App::setLocale(Session::get('locale'));
   }
}

最后转换形式:

{!! Form::open(["route" => "translations.switch", "id" => "sideBarLocaleSelectorForm"]) !!}
{!! Form::select("userLocale", $languages, Session::get("locale")) !!}
{!! Form::close() !!}

<script>
    $(document).on("change", "select", function (e) {
        e.preventDefault();
        $(this).closest("form").submit();
    })
</script>

答案 2 :(得分:1)

当有人加载您的网站时,它会使用配置文件中设置的默认值。

  

应用程序的默认语言存储在config / app.php配置文件中。

使用App::setLocale()方法只会更改我认为会在会话中设置的特定用户,配置文件值不会被更改。

  

您还可以使用App facade上的setLocale方法在运行时更改活动语言

您可以通过在两个不同的浏览器中打开您的网站(因为他们将使用两个不同的会话),然后在一个中更改区域设置并在另一个浏览器中查看默认加载来自己看到这一点。

https://laravel.com/docs/5.4/localization#introduction

答案 3 :(得分:0)

您可以创建如下所示的中间件。

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class SetLocale
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {
        if (auth()->check() && $languageId = auth()->user()->language_id) {
            $locale = Language::find($languageId)->locale;
            app()->setLocale($locale);
        }
        
        if ($request->lang) {
            app()->setLocale($request->lang);
        }

        return $next($request);
    }
}


答案 4 :(得分:-1)

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

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

@endphp

希望它会为您提供帮助