TranslateLogic.php 7.7 KB
<?php
/**
 * @remark :
 * @name   :TranslateLogic.php
 * @author :lyh
 * @method :post
 * @time   :2024/1/12 9:42
 */

namespace App\Http\Logic\Bside\Setting;

use App\Enums\Common\Code;
use App\Http\Logic\Bside\BaseLogic;
use App\Models\WebSetting\Proofreading;
use App\Models\WebSetting\Translate as TranslateModel;
use App\Models\WebSetting\WebLanguage;
use App\Helper\Translate;
use Illuminate\Support\Facades\DB;

class TranslateLogic extends BaseLogic
{
    public function __construct()
    {
        parent::__construct();
        $this->model = new TranslateModel();
        $this->param = $this->requestAll;
    }

    /**
     * @remark :
     * @name   :getTranslateList
     * @author :lyh
     * @method :post
     * @time   :2024/1/12 9:43
     */
    public function getTranslateList(){
        $languageInfo = $this->getLanguage($this->param['language_id']);
        $info = $this->model->read(['url'=>$this->param['url'],'language_id'=>$this->param['language_id'],'type'=>$this->param['type']]);
        //获取当前URl的所有文本内容
        $new_key = $this->getUrlRead($this->param['url']);
        if($info === false){
            $data = [];
            $translate_list = Translate::tran($new_key, $languageInfo['short']);
            foreach ($new_key as $k=>$v){
                $data[] = [
                    trim($v)=>$translate_list[$k],
                ];
            }
            return $this->success($data);
        }
        $old_key = [];//key值组成数据
        $data = json_decode($info['data'],true);
        foreach ($data as $k => $v){
            $old_key[] = $k;
        }
        $arr2 = array_values(array_diff($new_key, $old_key));
        if(!empty($arr2)){
            $translate_list = Translate::tran($arr2, $languageInfo['short']);
            foreach ($arr2 as $k1=>$v1){
                $data[] = [
                    trim($v1)=>$translate_list[$k1]
                ];
            }
        }
        $this->success($data);
    }
    /**
     * @remark :获取图片列表
     * @name   :imageList
     * @author :lyh
     * @method :post
     * @time   :2023/11/23 17:29
     */
    public function getTranslateImageList(){
        $info = $this->model->read(['url'=>$this->param['url'],'language_id'=>$this->param['language_id'],'type'=>$this->param['type']]);
        $data = [];
        if($info === false){
            $new_list = $this->getUrlImageRead($this->param['url']);
            foreach ($new_list as $v){
                $data[] = [
                    $v=>$v,
                ];
            }
            return $this->response('success',Code::SUCCESS,$data);
        }
        $new_list = $this->getUrlImageRead($this->param['url']);
        $old_list = [];
        $data = json_decode($info['data'],true);
        foreach ($data as $k=>$v){
            $old_list[] = $v;
            $data[] = [
                $k=>$v,
            ];
        }
        $arr2 = array_values(array_diff($new_list, $old_list));
        if(!empty($arr2)){
            foreach ($arr2 as $v1){
                $data[] = [
                    $v1=>$v1
                ];
            }
        }
        $this->response('success',Code::SUCCESS,$data);
    }
    /**
     * @remark :获取语种信息
     * @name   :getLanguage
     * @author :lyh
     * @method :post
     * @time   :2024/1/12 9:45
     */
    public function getLanguage($language_id){
        //获取语种信息
        $languageModel = new WebLanguage();
        $languageInfo = $languageModel->read(['id'=>$language_id]);
        if($languageInfo === false){
            $this->fail('请选择语种');
        }
        return $this->success($languageInfo);
    }

    /**
     * @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 = '/>([^<]+)</'; // 定义匹配中间内容不是标签的正则表达式
        $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);
        return $data;
    }

    /**
     * 翻译校对 dom
     */
    public function proofreadPhpQuery()
    {
        $html = file_get_contents(storage_path('logs/proofread.html'));
        $dom = phpQuery::newDocument($html);
        $dom->find('script')->remove();
        $dom->find('style')->remove();
        $test = $dom->text();
        file_put_contents(storage_path('logs/proofreadPhpQuery.html'), $test);
        dd('end');
    }

    /**
     * @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;
    }

    /**
     * @name   :(新增/更新多语言)save
     * @author :lyh
     * @method :post
     * @time   :2023/6/12 10:52
     */
    public function translateSave(){
        try {
            $info = $this->model->read(['language_id'=>$this->param['language_id'],'url'=>$this->param['url'],'type'=>$this->param['type']]);
            if($info === false){
                $param = [
                    'type'=>1,
                    'project_id'=>$this->user['project_id'],
                    'url'=>$this->param['url'],
                    'language_id'=>$this->param['language_id'],
                    'alias'=>$this->param['alias'],
                ];
                $param['data'] = json_encode($this->param['data'],true);
                $this->model->add($param);
            }else{
                $data = json_encode($this->param['data'],true);
                $this->model->edit(['data'=>$data],['language_id'=>$this->param['language_id'],'url'=>$this->param['url'],'type'=>$this->param['type']]);
            }
        }catch (\Exception $e){
            $this->fail('系统错误请联系管理员');
        }
        $this->response('success');
    }
}