前言
如果你查看 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
,在英文环境下是 中文