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 <wenhsing@qq.com>
 */
class LangMiddleware
{

    /**
     * Handle an incoming request.
     *
     * @author Wenhsing <wenhsing@qq.com>
     * @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
posted @ 2021-01-13 17:23  Wenhsing  阅读(599)  评论(0编辑  收藏  举报