TranslateLogic.php 9.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\Http\Logic\Bside\BaseLogic;
use App\Models\WebSetting\Translate as TranslateModel;
use App\Models\WebSetting\WebLanguage;
use App\Helper\Translate;

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(){
        $data = [];
        if($this->param['url'] == 'All'){
            $info = $this->model->read(['url'=>$this->param['url'],'language_id'=>$this->param['language_id'],'type'=>$this->param['type']]);
            if(!empty($info) && !empty($info['data'])){
                $translateInfo = json_decode($info['data'],JSON_UNESCAPED_UNICODE);
                foreach ($translateInfo as $k => $v){
                    $data[] = [$k=>$v];
                }
            }
            return $this->success($data);
        }
        $url = $this->user['domain'].(($this->param['url'] != '/') ? $this->param['url'] : '');
        $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($url);
        if($info === false){
            $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_read = json_decode($info['data'],JSON_UNESCAPED_UNICODE);
        foreach ($data_read as $k => $v){
            $old_key[] = $k;
            $data[] = [$k => $v];
        }
        $arr2 = array_values(array_diff($new_key, $old_key));
        if(!empty($arr2)){
            $translate_list = Translate::tran($arr2, $languageInfo['short']);
            if(count($arr2) == 1){
                $data[] = [
                    $arr2[0]=>$translate_list
                ];
            }else{
                foreach ($arr2 as $k => $v){
                    $data[] = [
                        trim($v)=>$translate_list[$k]
                    ];
                }
            }
        }
        return $this->success($data);
    }

    /**
     * @remark :获取图片列表
     * @name   :imageList
     * @author :lyh
     * @method :post
     * @time   :2023/11/23 17:29
     */
    public function getTranslateImageList(){
        if($this->param['url'] == 'All'){
            $info = $this->model->read(['url'=>$this->param['url'],'language_id'=>$this->param['language_id'],'type'=>$this->param['type']]);
            $data = [];
            if(!empty($info) && !empty($info['data'])){
                $translateInfo = json_decode($info['data'],JSON_UNESCAPED_UNICODE);
                foreach ($translateInfo as $k => $v){
                    $data[] = [$k=>$v];
                }
            }
            return $this->success($data);
        }
        $url = $this->user['domain'].(($this->param['url'] != '/') ? $this->param['url'] : '');
        $info = $this->model->read(['url'=>str_replace_url($this->param['url']),'language_id'=>$this->param['language_id'],'type'=>$this->param['type']]);
        $data = [];
        if($info === false){
            $new_list = $this->getUrlImageRead($url);
            foreach ($new_list as $v){
                $data[] = [
                    $v=>$v,
                ];
            }
            return $this->success($data);
        }
        $new_list = $this->getUrlImageRead($url);
        $old_list = [];
        $data_read = json_decode($info['data'],JSON_UNESCAPED_UNICODE);
        foreach ($data_read as $k=>$v){
            $old_list[] = $k;
            $data[] = [
                $k=>$v,
            ];
        }
        $arr2 = array_values(array_diff($new_list, $old_list));
        if(!empty($arr2)){
            foreach ($arr2 as $v1){
                $data[] = [
                    $v1=>$v1
                ];
            }
        }
        return $this->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);
        if(!$sourceCode){
            $this->fail('当前url不存在');
        }
        // 过滤掉具有 "change-language-cont" 类的元素
        $pattern = '/<div\b[^>]*\sclass=[\'"]([^\'"]*change-language-cont[^\'"]*)[\'"][^>]*>(.*?)<\/div>/is';
        $sourceCode = preg_replace($pattern, '', $sourceCode);
        $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));
        });
        $contentData  = [];
        foreach ($textContentArray as $v){
            $content = trim($v);
            $trimmedString = preg_replace('/\s+/', ' ', $content);
            $contentData[] = $trimmedString;
        }
        $contentData = array_values($textContentArray);
        $pattern = '/<meta\s+[^>]*name=[\'"](keywords|description)[\'"][^>]*content=[\'"]([^\'"]+)[\'"]>/i'; // 匹配 name 为 "keywords" 或 "description" 的 meta 标签的正则表达式
        $matches = array();
        preg_match_all($pattern, $strippedContent, $matches);
        $metaData = array();
        @file_put_contents(storage_path('logs/lyh_error.log'), var_export($matches[2], true) . PHP_EOL, FILE_APPEND);
        foreach ($matches[2] as $index => $content) {
            if(!empty(trim($content))){
                $metaData[] = $content;
            }
        }
        $data = array_merge($metaData, $contentData);
        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;
    }

    /**
     * @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'=>$this->param['type'],
                    'project_id'=>$this->user['project_id'],
                    'url'=>str_replace_url($this->param['url']),
                    'language_id'=>$this->param['language_id'],
                    'alias'=>$this->param['alias'],
                ];
                $param['data'] = json_encode((object)$this->param['data'],JSON_UNESCAPED_UNICODE);
                $this->model->add($param);
            }else{
                $data = json_encode((object)$this->param['data'],JSON_UNESCAPED_UNICODE);
                $this->model->edit(['data'=>$data],['language_id'=>$this->param['language_id'],'url'=>$this->param['url'],'type'=>$this->param['type']]);
            }
//        }catch (\Exception $e){
//            $this->fail('系统错误请联系管理员');
//        }
        return $this->success();
    }
}