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

时间:2015-04-18 21:58:05

标签: laravel-5

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

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

2 个答案:

答案 0 :(得分:10)

选项1:

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

    <?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');
        }
    
    }
    
    1. 当用户或访客点击某个语言链接然后更新数据库中的用户区域设置或在会话中存储访客选择
    2. 示例: 对于控制器中经过身份验证的用户或来宾

      public function setLocale($locale){
       if(Auth::check()){
           $user = User::find(Auth::user()->id);
           $user->update(['locale'=>$locale]);
        }else{
          Session::put('locale',$locale);
        }
      }
      
      1. 我们需要找到一种在每个请求上设置语言环境的方法,因为Laravel不会存储设置为App::setLocale()的语言环境,因此我们将在每个请求中使用中间件来设置Lococale。
      2. 要理解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));
            }
        

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

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

        你可以看到没有像缓存或会话那样用来记住语言环境,所以我们必须在每个请求上设置它。所以我们为它创建一个中间件。我将其称为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);
            }
        
        }
        
        1. 让我们将中间件设置为在每个请求上运行,方法是将其添加到App \ Http \ Kernel.php中的$ middleware堆栈
        2. 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' ];

答案 1 :(得分:-5)

您可以通过参考Laravel文档来实现上述目标,它是Localization部分。