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