Laravel 如何實現中英文國際化

前言

如果你查看 Laravel 5.5 的文檔,你會發現本地化中,文檔只是告訴你使用 App::setLocale() 去實現語言的切換,但是當我實現以下代碼,我發現並不能成功:

public function language()
{
	if (App::getLocale() == 'en') {
		App::setLocale('zh-CN');
	}else {
		App::setLocale('en');
	}
	return back()->widthInput();
}

無反應的原因是,LarvelsetLocale 只對當前請求有效,下一個請求就失效了

實現

既然是隻對當前請求有效,所以在每個請求前都進行判斷,就能解決持久有效的問題,所以我們需要使用 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 ,在英文環境下是 中文

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章