【问题标题】:How can I make the user switch languages in Laravel 5?如何让用户在 Laravel 5 中切换语言?
【发布时间】:2015-06-25 17:31:02
【问题描述】:

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

我希望网站访问者能够通过单击标有语言名称的链接来更改网站的语言。

【问题讨论】:

    标签: laravel-5


    【解决方案1】:

    选项 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');
        }
    
    }
    
    1. 当用户或访客点击某个语言链接时,更新数据库中的用户区域设置或在会话中存储访客选择

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

    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() 设置的区域设置,因此我们将使用中间件来设置每个请求的区域设置。

    要了解 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 堆栈来设置中间件以在每个请求上运行

    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' ];

    【讨论】:

    • 我偶然发现了这个解决方案,但是如果用户是访客而不是注册用户怎么办,我怎样才能让他能够切换语言?
    • 我似乎遇到了配置缓存问题,它阻止了应用程序设置的更改。 .如何在 laravel 5 中禁用配置缓存?
    • OK 我试图清除缓存,因为我认为 laravel 会自动缓存设置,但似乎没有。无论如何,我已经创建了一个将语言环境设置为 ar 的控制器,但它没有从 ar 文件夹加载字符串文件。控制器是:public function getSwitchLang() { App::setLocale('ar'); return redirect()-&gt;back(); } 那我做错了什么?
    • 很好的解释!谢谢:)
    • 感谢您的详细回答。 Taylor 和他的同事真的应该更新手册以在本地化部分 laravel.com/docs/5.5/localization 中指定 setLocale 不会持续存在,您必须使用中间件。另请注意,对于 Laravel 5.5,我必须将其添加到 protected $middlewareGroups for web
    猜你喜欢
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    • 2017-07-12
    相关资源
    最近更新 更多