一、laravel语言包的配置,在resources/lang/en,这是默认的语言,自己添加一个zh文件夹,在下面创建需要切换的语言页面,如
zh/header.php
<?php return [ 'home' => '首页', 'operation' => '操作', ];
随便定义一个语言,在页面模板中调用的时候就使用{{ trans('header.home') }},当后台语言包设置为英文的时候就是Home,中文的时候就是显示首页。
二、接下来说一下具体的实现,先配置路由中间件,
1.在app/Http/Kernel.php中添加代码如下:
/** * The application's route middleware. * * These middleware may be assigned to groups or used individually. * * @var array */ protected $routeMiddleware = [ 'switch_lang' => Middleware\SwitchLanguage::class,// 语言包中间件注册 ];
2.在app/Http/Middleware文件夹下面创建一个类名字为:SwitchLanguage.php代码如下:
<?php namespace App\Http\Middleware; use Closure; class SwitchLanguage { /** * 根据路由自动切换语言包 * * @param \Illuminate\Http\Request $request * @param Closure $next * @return mixed */ public function handle($request, Closure $next) { $lang = 'en';// 选择的语言包,默认英文 $clientUrl = $request->getPathInfo();// 获取请求路径 // 如果路由为空或者/,则直接选择英文版本 if (!empty($clientUrl) || $clientUrl == '/') { // 获取系统可选择的语言包数组 $langs = config('global.lang');//这里配置语言种类 // 切割数组获取路由中的语言包信息 $urls = explode('/', $clientUrl); // 如果选择的语言版本存在,则切换到该版本 if (!empty($urls) && in_array($urls[1], $langs)) { $lang = $urls[1]; } } app()->setLocale($lang);// 设置语言包 return $next($request); } }
3.这时候配置路由组,找到routes/web.php,写路由组,代码如下:
Route::group(array('prefix' => '{lang}', 'middleware' => 'switch_lang'), function () { // 登录注册 Route::group(array('namespace' => 'Web'), function () { Route::post('index', 'HomeController@index'); }); });
上面prefix为定义前缀,{lang}只是随便取的名字,可以是{a},{bfa},{ds}等等,作用是为了当访问路由http://XXXX.com/zh/home时,那边的zh就表示页面加载的语言包是中文的,当为http://XXXX.com/en/home时,页面加载的语言包就是英文的。实现原理是中间件那边实现的,就是第二部实现切换的。
4.以上基本实现了所需要的配置,接下来是页面中的切换问题、前端页面代码如下:
<ul class="dropdown-menu language-ul"> <li> <a href="" >{{trans('user_header.lang')}}</a> </li> <li> <a href="{{ str_ireplace(['/en/','/zh/'],'/en/',request()->getRequestUri())}}" >{{trans('header.en')}}</a> </li> <li> <a href="{{ str_ireplace(['/en/','/zh/'],'/zh/',request()->getRequestUri())}}" data-value="zh">{{trans('header.zh')}}</a> </li> </ul>以上就实现了页面的中英文切换了。