#Laravel学习笔记# 填多语言化 App::setLocale();不能持久化的坑

看了官方文档,有点懵,结合自己摸索,记录下多语言化这事儿在Laravel里怎么搞。

~/config/app.php文件中加入应用支持的语言版本

'locales' => ['en' => 'English', 'cn' => 'Chinese', 'jp' => 'Japanese'],

同时 ~/config/app.php里面还有一个fallback_locale,可以在这里设定候补语言种类,当一个String在目标语言中没有时可以显示在候补语言中的翻译。我们先设为

'fallback_locale' => 'en',

官方文档里写了用App::setLocale(); 这个方法,这里有个坑,试了发现它是易挥发的 non-persistent 就是作用范围仅仅是当前这个request,你跳个页面就没了。

擦,看来只能自己动手了。思路是把当前的语言设定存在Session里头,然后再写个Middleware去截Http请求,在截住的请求里用Session里的语言设定值来设Locale。

第一步,先创建个LanguageController,用来处理设置语言种类的请求

php artisan make:controller LanguageController

代码如下

 $lang]);
    }
    return back()->withInput();
  }
}

第二步 改路由,在routes\web.php里面加个指向LanguageController@changeLanguage的路由,如下

Route::get('lang/{locale}', ['as'=>'lang.change', 'uses'=>'LanguageController@setLocale']);

第三步 在前端页面里头放个选择语言的链接列表,如下

@foreach (Config::get('app.locales') as $lang => $language)
    @if ($lang != App::getLocale())
        
  • {{$language}}
  • @endif @endforeach

    第四步 做个Language的Middleware,截住请求,改当前Request的语言设定

    第五步 把Language这个中间件在Kernel.php里头注册好

    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            \App\Http\Middleware\Language::class, // Alex Globel Language Settings 2017-03-17
    
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],
    ];
    

    完工了

    你可能感兴趣的:(#Laravel学习笔记# 填多语言化 App::setLocale();不能持久化的坑)