美文网首页Laravel 学习笔记
#Laravel学习笔记# 填多语言化 App::setLoca

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

作者: babesamhsu | 来源:发表于2017-03-17 14:59 被阅读1336次

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

    完工了

    相关文章

      网友评论

      本文标题:#Laravel学习笔记# 填多语言化 App::setLoca

      本文链接:https://www.haomeiwen.com/subject/wujenttx.html