Lavavel 根据请求动态多语言切换
最近想要做一个多语言的项目,正好Laravel框架支持多语言,于是就通过Laravel的中间件简单的进行语言切换,支持在请求头、请求地址和请求主体中传递对应语言参数
PHP Version: 7.2+
Laravel: 7.X
接口多语言支持
1. 在命令行中的对应目录下执行命令创建一个中间件:
php artisan make:middleware Lang
2. 打开对应文件编写代码
<?php
namespace App\Http\Middleware;
use Closure;
/**
* 多语言
*
* @author Wenhsing
*/
class LangMiddleware
{
/**
* Handle an incoming request.
*
* @author Wenhsing
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
// 获取请求头中的语言
$lang = $request->header('lang');
// 获取请求地址参数中的语言
if (empty($lang)) {
$lang = $request->query('lang');
}
// 获取请求主体中的语言
if (empty($lang)) {
$lang = $request->input('lang');
}
// 匹配语言,进行语言设置
\App::setLocale($lang);
$response = $next($request);
// 进行其他操作
// 例如:设置请求的语言到响应
$response->header('lang', $lang);
return $response;
}
}
3. 在Kernel.php
文件中添加中间件
<?php
namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
/**
* The application's global HTTP middleware stack.
*
* These middleware are run during every request to your application.
*
* @var array
*/
protected $middleware = [
// 添加中间件
\App\Http\Middleware\LangMiddleware::class,
// 省略其他中间件
];
// 省略其他代码
}
测试
1. 在resources/lang
目录下添加对应的语言目录及文件
resources/
lang/
en/
lang.php
zh/
lang.php
这里创建了zh
目录,并在zh
目录中添加lang.php
文件,英文及其他语言同理
<?php
// 文件路径为 resources/lang/zh/lang.php
return [
'name' => '中文',
];
2. 在web.php
文件中添加测试用代码
<?php
Route::get('/', function () {
// [对应语言文件].[对应字段]
return __('lang.name');
});
3. 开始测试
curl -H 'lang: zh' http://127.0.0.1:8000
curl http://127.0.0.1:8000?lang=zh
curl -X POST -d 'lang=zh' http://127.0.0.1:8000
curl -H 'lang: en' http://127.0.0.1:8000
curl http://127.0.0.1:8000?lang=en
curl -X POST -d 'lang=en' http://127.0.0.1:8000