ProofreadingController.php 9.3 KB
<?php

namespace App\Http\Controllers\Bside\Setting;

use App\Enums\Common\Code;
use App\Helper\Translate;
use App\Http\Controllers\Bside\BaseController;
use App\Http\Logic\Bside\Setting\ProofreadingLogic;
use App\Models\WebSetting\Proofreading;
use App\Models\WebSetting\WebSettingCountry;
use Illuminate\Support\Facades\DB;

class ProofreadingController extends BaseController
{
    const LANGUAGE_ID = 1;//默认语言英语
    const TYPE_IMAGE = 2;//校队图片
    /**
     * @name   :lists
     * @author :lyh
     * @method :post
     * @time   :2023/6/12 10:52
     */
    public function lists(){
        //获取语种信息
        $webSettingCountryModel = new WebSettingCountry();
        $countryInfo = $webSettingCountryModel->read(['id'=>$this->param['language_id']]);
        //获取当前链接和语种的校队列表
        $proofreadingModel = new Proofreading();
        $list = $proofreadingModel->list(['url'=>$this->param['url'],'language_id'=>$this->param['language_id'],'type'=>1],'created_at',['text','translate']);
        //获取当前URl的所有文本内容
        $new_list = $this->getUrlRead($this->param['url']);
        if(empty($list)){
            $data = [];
            $translate_list = Translate::tran($new_list, $countryInfo['alias']);
            foreach ($new_list as $k=>$v){
                $data[] = [
                    'text'=>trim($v),
                    'translate'=>$translate_list[$k],
                ];
            }
            return $this->response('success',Code::SUCCESS,$data);
        }
        $data = [];//返回数据
        $old_list = [];
        foreach ($list as $v){
            $old_list[] = $v['text'];
            $data[] = [
                'text'=>$v['text'],
                'translate'=>$v['translate'],
            ];
        }
        $arr2 = array_values(array_diff($new_list, $old_list));
        if(!empty($arr2)){
            $translate_list = Translate::tran($arr2, $countryInfo['alias']);
            foreach ($arr2 as $k1=>$v1){
                $data[] = [
                    'text'=>$v1,
                    'translate'=>$translate_list[$k1]
                ];
            }
        }
        $this->response('success',Code::SUCCESS,$data);
    }

    /**
     * @remark :获取图片列表
     * @name   :imageList
     * @author :lyh
     * @method :post
     * @time   :2023/11/23 17:29
     */
    public function imageList(){
        $proofreadingModel = new Proofreading();
        $list = $proofreadingModel->list(['url'=>$this->param['url'],'language_id'=>$this->param['language_id'],'type'=>2],'created_at',['text','translate']);
        if(empty($list)){
            $new_list = $this->getUrlImageRead($this->param['url']);
            foreach ($new_list as $k=>$v){
                $data[] = [
                    'text'=>$v,
                    'translate'=>$v,
                ];
            }
            return $this->response('success',Code::SUCCESS,$data);
        }
        $new_list = $this->getUrlImageRead($this->param['url']);
        $data = [];//返回数据
        $old_list = [];
        foreach ($list as $v){
            $old_list[] = $v['text'];
            $data[] = [
                'text'=>$v['text'],
                'translate'=>$v['translate'],
            ];
        }
        $arr2 = array_values(array_diff($new_list, $old_list));
        if(!empty($arr2)){
            foreach ($arr2 as $v1){
                $data[] = [
                    'text'=>$v1,
                    'translate'=>$v1
                ];
            }
        }
        $this->response('success',Code::SUCCESS,$data);
    }

    /**
     * @name   :(新增/更新多语言)save
     * @author :lyh
     * @method :post
     * @time   :2023/6/12 10:52
     */
    public function save(){
        //清除以前的翻译校队数据,重新添加
        $param = [
            'type'=>1,
            'project_id'=>$this->user['project_id'],
            'url'=>$this->param['url'],
            'language_id'=>$this->param['language_id'],
            'alias'=>$this->param['alias'],
            'created_at'=>date('Y-m-d H:i:s'),
            'updated_at'=>date('Y-m-d H:i:s')
        ];
        $proofreadingModel = new Proofreading();
        DB::beginTransaction();
        try {
            $proofreadingModel->del(['language_id'=>$this->param['language_id'],'url'=>$this->param['url'],'type'=>1]);
            //删除成功后,重新添加
            $save_data = [];
            foreach ($this->param['data'] as $k => $v){
                $param['text'] = $v['text'];
                $param['translate'] = $v['translate'];
                $save_data[] = $param;
            }
            $proofreadingModel->insert($save_data);
            DB::commit();
        }catch (\Exception $e){
            DB::rollBack();
            $this->fail('系统错误请联系管理员');
        }
        $this->response('success');
    }

    /**
     * @name   :(新增/更新多语言)save
     * @author :lyh
     * @method :post
     * @time   :2023/6/12 10:52
     */
    public function saveImage(){
        //清除以前的翻译校队数据,重新添加
        $param = [
            'type'=>2,
            'project_id'=>$this->user['project_id'],
            'url'=>$this->param['url'],
            'language_id'=>$this->param['language_id'],
            'alias'=>$this->param['alias'],
            'created_at'=>date('Y-m-d H:i:s'),
            'updated_at'=>date('Y-m-d H:i:s')
        ];
        $proofreadingModel = new Proofreading();
        DB::beginTransaction();
        try {
            $proofreadingModel->del(['language_id'=>$this->param['language_id'],'url'=>$this->param['url'],'type'=>2]);
            //删除成功后,重新添加
            $save_data = [];
            foreach ($this->param['data'] as $k => $v){
                $param['text'] = $v['text'];
                $param['translate'] = $v['translate'];
                $save_data[] = $param;
            }
            $proofreadingModel->insert($save_data);
            DB::commit();
        }catch (\Exception $e){
            DB::rollBack();
            $this->fail('系统错误请联系管理员');
        }
        $this->response('success');
    }

    /**
     * @name   :(当前项目选中的语言列表)languageList
     * @author :lyh
     * @method :post
     * @time   :2023/6/12 15:52
     */
    public function languageList(ProofreadingLogic $proofreadingLogic){
        $list = $proofreadingLogic->countryLanguageList($this->map,$this->order);
        $this->response('success',Code::SUCCESS,$list);
    }

    /**
     * @remark :获取Url内容
     * @name   :getUrlRead
     * @author :lyh
     * @method :post
     * @time   :2023/11/22 10:02
     */
    public function getUrlRead($url){
        $contextOptions = [
            'ssl' => [
                'verify_peer' => false,
                'verify_peer_name' => false,
            ],
        ];
        $context = stream_context_create($contextOptions);
        $sourceCode = file_get_contents($url, false, $context);
        $pattern = '/<style\b[^>]*>(.*?)<\/style>/s'; // 定义匹配`<style>`标签及其内容的正则表达式
        $strippedContent = preg_replace($pattern, '', $sourceCode); // 删除`<style>`标签及其内容
        $pattern = '/<script\b[^>]*>(.*?)<\/script>/s'; // 定义匹配`<script>`标签及其内容的正则表达式
        $strippedContent = preg_replace($pattern, '', $strippedContent); // 删除`<script>`标签及其内容
        $pattern = '/<link\b[^>]*>/'; // 定义匹配 `<link>` 标签的正则表达式
        $strippedContent = preg_replace($pattern, '', $strippedContent); // 删除 `<link>` 标签
        $pattern = '/<footer\b[^>]*>(.*?)<\/footer>/s'; // 定义匹配`<script>`标签及其内容的正则表达式
        $strippedContent = preg_replace($pattern, '', $strippedContent); // 删除`<script>`标签及其内容
        $pattern = '/>([^<]+)</'; // 定义匹配中间内容不是标签的正则表达式
        $matches = array();
        preg_match_all($pattern, $strippedContent, $matches);
        $textContentArray = array_filter($matches[1], function($item) {
            return !empty(trim($item));
        });
        $data = [];
        foreach ($textContentArray as $v){
            $content = trim($v);
            $trimmedString = preg_replace('/\s+/', ' ', $content);
            $data[] = $trimmedString;
        }
        $data = array_values($data);
        $uniqueArray = array_unique($data);
        $data = array_values($uniqueArray);
        return $data;
    }

    /**
     * @remark :获取Url内容
     * @name   :getUrlRead
     * @author :lyh
     * @method :post
     * @time   :2023/11/22 10:02
     */
    public function getUrlImageRead($url){
        $contextOptions = [
            'ssl' => [
                'verify_peer' => false,
                'verify_peer_name' => false,
            ],
        ];
        $pattern = '/<img.*?src="(.*?)".*?>/i';
        $matches = array();
        $context = stream_context_create($contextOptions);
        $sourceCode = file_get_contents($url, false, $context);
        preg_match_all($pattern, $sourceCode, $matches);
        $textContentArray = $matches[1];
        $data = [];
        foreach ($textContentArray as $v){
            if(!empty($v)){
                $data[] = $v;
            }
        }
        $uniqueArray = array_unique($data);
        $data = array_values($uniqueArray);
        return $data;
    }
}