#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(); 這個方法,這里有個坑,試了發(fā)現(xiàn)它是易揮發(fā)的 non-persistent 就是作用范圍僅僅是當前這個request,你跳個頁面就沒了。

擦,看來只能自己動手了。思路是把當前的語言設定存在Session里頭,然后再寫個Middleware去截Http請求,在截住的請求里用Session里的語言設定值來設Locale。

第一步,先創(chuàng)建個LanguageController,用來處理設置語言種類的請求

php artisan make:controller LanguageController

代碼如下

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;

class LanguageController extends Controller
{
/**
 * Show the application dashboard.
 *
 * @return \Illuminate\Http\Response
 */

public function setLocale($lang){
    if (array_key_exists($lang, config('app.locales'))) {
        session(['applocale' => $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())
        <li><a href="{{ route('lang.change', $lang) }}">{{$language}}</a></li>
    @endif
@endforeach

第四步 做個Language的Middleware,截住請求,改當前Request的語言設定

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\Session;


class Language
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if (Session::has('applocale') AND array_key_exists(Session::get('applocale'), Config::get('app.locales'))) {
            App::setLocale(Session::get('applocale'));
        }
        else { // This is optional as Laravel will automatically set the fallback language if there is none specified
            App::setLocale(Config::get('app.fallback_locale'));
        }
        return $next($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,
    ],
];

完工了

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容