#Laravel學(xué)習(xí)筆記# 填多語言化 App::setLocale();不能持久化的坑

看了官方文檔薄腻,有點懵隐圾,結(jié)合自己摸索橄镜,記錄下多語言化這事兒在Laravel里怎么搞必指。

~/config/app.php文件中加入應(yīng)用支持的語言版本

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

同時 ~/config/app.php里面還有一個fallback_locale,可以在這里設(shè)定候補語言種類株茶,當(dāng)一個String在目標(biāo)語言中沒有時可以顯示在候補語言中的翻譯来涨。我們先設(shè)為

'fallback_locale' => 'en',

官方文檔里寫了用App::setLocale(); 這個方法,這里有個坑启盛,試了發(fā)現(xiàn)它是易揮發(fā)的 non-persistent 就是作用范圍僅僅是當(dāng)前這個request扫夜,你跳個頁面就沒了。

擦,看來只能自己動手了笤闯。思路是把當(dāng)前的語言設(shè)定存在Session里頭堕阔,然后再寫個Middleware去截Http請求,在截住的請求里用Session里的語言設(shè)定值來設(shè)Locale颗味。

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

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晶默,截住請求谨娜,改當(dāng)前Request的語言設(shè)定

<?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,
    ],
];

完工了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市磺陡,隨后出現(xiàn)的幾起案子趴梢,更是在濱河造成了極大的恐慌,老刑警劉巖币他,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坞靶,死亡現(xiàn)場離奇詭異,居然都是意外死亡蝴悉,警方通過查閱死者的電腦和手機彰阴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拍冠,“玉大人尿这,你說我怎么就攤上這事∏於牛” “怎么了妻味?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長欣福。 經(jīng)常有香客問我,道長焦履,這世上最難降的妖魔是什么拓劝? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮嘉裤,結(jié)果婚禮上郑临,老公的妹妹穿的比我還像新娘。我一直安慰自己屑宠,他們只是感情好厢洞,可當(dāng)我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般躺翻。 火紅的嫁衣襯著肌膚如雪丧叽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天公你,我揣著相機與錄音踊淳,去河邊找鬼。 笑死陕靠,一個胖子當(dāng)著我的面吹牛迂尝,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播剪芥,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼垄开,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了税肪?” 一聲冷哼從身側(cè)響起溉躲,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎寸认,沒想到半個月后签财,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡偏塞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年唱蒸,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片灸叼。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡神汹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出古今,到底是詐尸還是另有隱情屁魏,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布捉腥,位于F島的核電站氓拼,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏抵碟。R本人自食惡果不足惜桃漾,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拟逮。 院中可真熱鬧撬统,春花似錦、人聲如沸敦迄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至苦囱,卻和暖如春嗅绸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背沿彭。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工朽砰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人喉刘。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓瞧柔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親睦裳。 傳聞我的和親對象是個殘疾皇子造锅,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容