前言
如果你查看 Laravel 5.5
的文檔,你會發現本地化中,文檔只是告訴你使用 App::setLocale()
去實現語言的切換,但是當我實現以下代碼,我發現並不能成功:
public function language()
{
if (App::getLocale() == 'en') {
App::setLocale('zh-CN');
}else {
App::setLocale('en');
}
return back()->widthInput();
}
無反應的原因是,Larvel
的 setLocale
只對當前請求有效,下一個請求就失效了
實現
既然是隻對當前請求有效,所以在每個請求前都進行判斷,就能解決持久有效的問題,所以我們需要使用 session
來保存當前的語言種類
由於需求原因,我只實現了中英文切換,但是多語言實現大同小異,只是需要主動傳入語言種類而已
語言包
如果你還不瞭解 Laravel
本地化功能,你可以通過查看中文文檔瞭解 Laravel 5.5 本地化
簡單來說就是在 Resources/lang
中新建你的語言包,語言文件使用 .php
文件返回數組格式的數據。
配置
在 config/app.php
中修改本地默認語言
'locale' => 'zh-CN',
邏輯
創建路由,web.php
Route::get('/language', 'LanguageController@setLocale')->name('language');
創建控制器
php artisan make:controller LanguageController
編輯控制器文件 LanguageContoller
public function setLocale()
{
$lang = session('language', App::getLocale());
if ($lang == 'zh-CN') {
session(['language' => 'en']);
}else {
session(['language' => 'zh-CN']);
}
return back()->withInput();
}
如果你需要多語言,在這裏的路由參數中傳入,然後進行保存
創建中間件,保證每次路由訪問前都進行 App::setLocale()
操作
php artisan make:middleware Language
編輯中間件文件 Language.php
public function handle($request, Closure $next)
{
if (session()->has('language')) {
App::setLocale(session('language'));
}
return $next($request);
}
因爲在控制器中就判斷了沒有session就默認取配置文件中的,所以這裏就是簡單的邏輯判斷
修改 Kernel.php
文件,將中間件註冊
protected $middlewareGroups = [
'web' => [
// ...
\App\Http\Middleware\Language::class,
]
]
完成
只要在頁面中通過 a
標籤進行請求,就能實現中英文切換
<a href="{{ route('language') }}">@lang('language_text')</a>
因爲是中英文切換,所以我的切換按鈕這裏的文本,在默認中文下是 English
,在英文環境下是 中文