如何让用户在Laravel 5中切换语言?

wes*_*ner 3 laravel-5

我创建了一个双语laravel 5应用程序,它包含两个语言环境,en和ar.

我想要的是网站访问者能够通过点击标有语言名称的链接来更改网站的语言.

Eme*_*bah 10

选项1:

  1. 在数据库中存储用户语言,我在用户表中有我的.这是为了避免每次用户登录您的应用程序时询问用户.您可以将'en'设置为默认值.但是,如果用户是访客,我们会在会话中存储区域设置.

因此,您的迁移可能如下所示:

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUsersTable extends Migration {

    /**
     * Run the migrations.
     * @return void
     */
    public function up()
    {
        Schema::create('users', function(Blueprint $table)
        {
            $table->increments('id');
            $table->string('email')->unique();
            $table->string('password', 60);
            $table->string('locale', 5)->default('en');
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('users');
    }

}
Run Code Online (Sandbox Code Playgroud)
  1. 当用户或访客点击某个语言链接时,更新数据库中的用户区域设置或在会话中存储访客选择

示例:对于控制器中经过身份验证的用户或来宾

public function setLocale($locale){
 if(Auth::check()){
     $user = User::find(Auth::user()->id);
     $user->update(['locale'=>$locale]);
  }else{
    Session::put('locale',$locale);
  }
}
Run Code Online (Sandbox Code Playgroud)
  1. 我们需要找到一种在每个请求上设置区域设置的方法,因为Laravel不存储区域设置,App::setLocale()因此我们将在每个请求上使用中间件setLocale.

要理解Laravel如何处理App::setLocale()这里是Illuminate\Foundation\Application.php中处理语言环境设置的方法

    public function setLocale($locale)
    {
        $this['config']->set('app.locale', $locale);

        $this['translator']->setLocale($locale);

        $this['events']->fire('locale.changed', array($locale));
    }
Run Code Online (Sandbox Code Playgroud)

此方法调用Translator.php中的另一个方法如下所示:

/**
     * Set the default locale.
     *
     * @param  string  $locale
     * @return void
     */
    public function setLocale($locale)
    {
        $this->locale = $locale;
    }
Run Code Online (Sandbox Code Playgroud)

你可以看到没有像缓存或会话那样用来记住语言环境,所以我们必须在每个请求上设置它.所以我们为它创建一个中间件.我将其称为LocaleMiddleware.

<?php namespace App\Http\Middleware;

use Closure, Session, Auth;

class LocaleMiddleware {


    public function handle($request, Closure $next)
    {
        if(Auth::user()){
            app()->setLocale(Auth::user()->locale);
        }elseif($locale = Session::has('locale')){
            app()->setLocale($locale);
        }


        return $next($request);
    }

}
Run Code Online (Sandbox Code Playgroud)
  1. 让我们将中间件设置为在每个请求上运行,方法是将其添加到App\Http\Kernel.php中的$ middleware堆栈

protected $middleware = [ 'Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode', 'Illuminate\Cookie\Middleware\EncryptCookies', 'Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse', 'Illuminate\Session\Middleware\StartSession', 'Illuminate\View\Middleware\ShareErrorsFromSession', 'App\Http\Middleware\VerifyCsrfToken', 'App\Http\Middleware\LocaleMiddleware' ];