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 ,在英文环境下是 中文

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