Laravel 学习笔记

#Laravel学习笔记# 填多语言化 App::setLoca

2017-03-17  本文已影响1336人  babesamhsu

看了官方文档,有点懵,结合自己摸索,记录下多语言化这事儿在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

代码如下

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

完工了

上一篇下一篇

猜你喜欢

热点阅读