Jelajahi Sumber

Reapply "[智价云] 翻译接入"

This reverts commit 186816b1a0216286711622100ab560110b0e0a9f.
tangyuanwang 1 bulan lalu
induk
melakukan
84812f03ce

+ 38 - 11
app/Http/Controllers/Api/Museum/Spot.php

@@ -9,6 +9,7 @@ use App\Servers\Wenlv\MuseumServer;
 use App\Models\Api\Museum\Spot as SpotModel;
 use App\Models\Api\Museum\SpotTmp as SpotTmpModel;
 use App\Models\Manager\Citys as CitysModel;
+use App\Servers\Tenxunyun\TextTranslate;
 
 class Spot extends Controller
 {
@@ -92,22 +93,22 @@ class Spot extends Controller
                     $province_name = $province_name . '省';
                 }
             }
-            $province_id ='0';
+            $province_id = '0';
             if ($province_name != '') {
                 $province_info = $CitysModel->where([['name', 'like', "%$province_name%"], ['level', '=', '1']])->first();
-                $province_id = $province_info ? $province_info->id :'0';
+                $province_id = $province_info ? $province_info->id : '0';
             }
-            $city_id ='0';
+            $city_id = '0';
             if ($city_name != '') {
                 $city_info = $CitysModel->where([['name', 'like', "%$city_name%"], ['level', '=', '2']])->first();
-                $city_name = $city_info ? $city_info->name :'';
-                $city_id = $city_info ? $city_info->id :'0';
+                $city_name = $city_info ? $city_info->name : '';
+                $city_id = $city_info ? $city_info->id : '0';
             }
-            $district_id='0';
-            if($district_name){
+            $district_id = '0';
+            if ($district_name) {
                 $district_info = $CitysModel->where([['name', 'like', "%$district_name%"], ['level', '=', '3']])->first();
-                $district_name = $district_info ? $district_info->name :'';
-                $district_id = $district_info ? $district_info->id :'0';
+                $district_name = $district_info ? $district_info->name : '';
+                $district_id = $district_info ? $district_info->id : '0';
             }
 
 
@@ -115,7 +116,7 @@ class Spot extends Controller
             $insert_data['museum_level'] = isset($value['NB_ZLDJ_NAME']) ? $value['NB_ZLDJ_NAME'] : '';
             $insert_data['is_open'] = '0';
             $insert_data['name'] = isset($value['NB_BWGMC']) ? $value['NB_BWGMC'] : '';
-            $insert_data['intro'] = isset($value['NB_BWGJJ']) ? trim($value['NB_BWGJJ'] ): '';
+            $insert_data['intro'] = isset($value['NB_BWGJJ']) ? trim($value['NB_BWGJJ']) : '';
             $insert_data['province_name'] = $province_name;
             $insert_data['province_id'] = $province_id;
             $insert_data['city_name'] = $city_name;
@@ -127,6 +128,7 @@ class Spot extends Controller
             //查询是否存在博物馆
             $museum_info = $SpotModel->where(['name' => $insert_data['name'], 'province_name' => $insert_data['province_name']])->first();
             if (!$museum_info) {
+
                 $SpotModel->insert($insert_data);
             }
         }
@@ -138,7 +140,7 @@ class Spot extends Controller
      * @version   1.0
      * @date      2026-04-02
      */
-    public function nearby_list(Request $request, SpotModel $SpotModel)
+    public function nearby_list(Request $request, SpotModel $SpotModel, TextTranslate $TextTranslate)
     {
         $longitude = $request->input('longitude', '');
         $latitude = $request->input('latitude', '');
@@ -161,4 +163,29 @@ class Spot extends Controller
         }
         return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $data]);
     }
+
+    /**
+     * 翻译博物馆数据
+     * @author 唐远望
+     * @version 1.0
+     * @date 2025-12-04
+     * @param Request $request
+     */
+    public function translate(SpotModel $SpotModel, TextTranslate $TextTranslate)
+    {
+        $result = $SpotModel->where([['status', '=', 0], ['level', '<', 3]])->get()->toarray();
+        if (!empty($result)) {
+            foreach ($result as $key => $value) {
+                //增加睡眠时间,防止请求过快被腾讯云接口拒绝
+                usleep(1000);
+                $result = $TextTranslate->translateText($value['name'], 'zh', 'en');
+                if ($result['success']) {
+                    $target_text = $result['target_text'] ?? '';
+                    //更新本地数据为英文
+                    $SpotModel->where(['id' => $value['id']])->update(['name' => $target_text]);
+                }
+            }
+            return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
+        }
+    }
 }

+ 25 - 1
app/Http/Controllers/Manager/Citys.php

@@ -6,7 +6,7 @@ use App\Http\Controllers\Controller;
 use App\Http\Requests\Manager\Citys as Request;
 use App\Models\Manager\Citys as CitysModel;
 use App\Models\Manager\citysZoning as citysZoningModel;
-
+use App\Servers\Tenxunyun\TextTranslate;
 
 /**
  * 城市管理
@@ -54,4 +54,28 @@ class Citys extends Controller
         }
         return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $zoning_result]);
     }
+
+    /**
+     * 翻译省份城市信息
+     * @author 唐远望
+     * @version 1.0
+     * @date 2025-12-04
+     * @param Request $request
+     */
+    public function translate(CitysModel $CitysModel, TextTranslate $TextTranslate)
+    {
+        $result = $CitysModel->where([['status', '=', 0], ['level', '<', 3]])->get(['id', 'name', 'pid'])->toarray();
+        if (!empty($result)) {
+            foreach ($result as $key => $value) {
+                $result = $TextTranslate->translateText($value['name'], 'zh', 'en');
+                if ($result['success']) {
+                    $target_text = $result['target_text'] ?? '';
+                    //更新本地数据为英文
+                    $CitysModel->where(['id' => $value['id']])->update(['name' => $target_text]);
+                    $result[$key]['name'] = $target_text;
+                }
+            }
+            return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
+        }
+    }
 }

+ 87 - 0
app/Servers/Tenxunyun/TextTranslate.php

@@ -0,0 +1,87 @@
+<?php
+
+namespace App\Servers\Tenxunyun;
+
+use TencentCloud\Common\Credential;
+use TencentCloud\Common\Profile\ClientProfile;
+use TencentCloud\Common\Profile\HttpProfile;
+use TencentCloud\Tmt\V20180321\TmtClient;
+use TencentCloud\Tmt\V20180321\Models\TextTranslateRequest;
+use Exception;
+use Illuminate\Support\Facades\Log;
+
+/**
+ * 腾讯云文本翻译服务
+ * @author 唐远望
+ * @date 2026-04-08
+ */
+class TextTranslate
+{
+    protected $client;
+
+    public function __construct()
+    {
+        // 从 .env 文件中获取密钥
+        $secretId = config('tenxunyun.tencentcloud.secret_id', '');
+        $secretKey = config('tenxunyun.tencentcloud.secret_key', '');
+
+        // 1. 实例化一个认证对象
+        $credential = new Credential($secretId, $secretKey);
+
+        // 2. 配置HTTP访问属性
+        $httpProfile = new HttpProfile();
+        $httpProfile->setEndpoint("tmt.tencentcloudapi.com");
+
+        // 3. 配置客户端参数
+        $clientProfile = new ClientProfile();
+        $clientProfile->setHttpProfile($httpProfile);
+
+        // 4. 实例化要请求的client对象,这里选择上海区,你也可选其他地域如ap-beijing
+        $this->client = new TmtClient($credential, "ap-shanghai", $clientProfile);
+    }
+
+    /**
+     * 执行文本翻译
+     *
+     * @param string $sourceText 待翻译的文本
+     * @param string $source 源语言,如 'auto'(自动检测), 'zh'(中文), 'en'(英文)
+     * @param string $target 目标语言,如 'en'(英文), 'zh'(中文)
+     * @param int $projectId 项目ID,没有特殊要求传0即可
+     * @return array 包含翻译结果和请求ID的数组
+     */
+    public function translateText($sourceText, $source, $target, $projectId = 0)
+    {
+        try {
+            // 实例化请求对象
+            $req = new TextTranslateRequest();
+            
+            // 设置请求参数
+            $req->setSourceText($sourceText);
+            $req->setSource($source);
+            $req->setTarget($target);
+            $req->setProjectId($projectId);
+
+            // 调用API,获取响应
+            $resp = $this->client->TextTranslate($req);
+            
+            // 返回结果
+            return [
+                'success' => true,
+                'target_text' => $resp->getTargetText(),
+                'source' => $resp->getSource(),
+                'target' => $resp->getTarget(),
+                'used_amount' => $resp->getUsedAmount(),
+                'request_id' => $resp->getRequestId()
+            ];
+
+        } catch (Exception $e) {
+            // 记录错误日志
+            Log::error('腾讯云翻译失败: ' . $e->getMessage());
+            
+            return [
+                'success' => false,
+                'error' => $e->getMessage()
+            ];
+        }
+    }
+}

+ 1 - 0
composer.json

@@ -22,6 +22,7 @@
         "laravel/sanctum": "^2.11",
         "laravel/tinker": "^2.5",
         "phpoffice/phpspreadsheet": "^1.12",
+        "tencentcloud/tencentcloud-sdk-php": "^3.0",
         "vinkla/hashids": "^9.1",
         "w7corp/easywechat": "^5.35",
         "wantp/snowflake": "^1.2"

+ 45 - 1
composer.lock

@@ -4,7 +4,7 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "7935dd7a027081a40739602ca8ae0656",
+    "content-hash": "2e1f8e3896c7e4f29cc2fa8b6b9dd183",
     "packages": [
         {
             "name": "adbario/php-dot-notation",
@@ -7673,6 +7673,50 @@
             ],
             "time": "2023-01-13T08:34:10+00:00"
         },
+        {
+            "name": "tencentcloud/tencentcloud-sdk-php",
+            "version": "3.0.1563",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/tencentcloud/tencentcloud-sdk-php/3.0.1563/tencentcloud-tencentcloud-sdk-php-3.0.1563.zip",
+                "reference": "c56b7cf075af2c4fc0f2b1e2fbccae14441f007c",
+                "shasum": ""
+            },
+            "require": {
+                "guzzlehttp/guzzle": "^6.3 || ^7.0",
+                "php": ">=5.6.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.5"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "TencentCloud\\": "./src/TencentCloud"
+                },
+                "classmap": [
+                    "src/QcloudApi/QcloudApi.php"
+                ]
+            },
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "coolli",
+                    "email": "tencentcloudapi@tencent.com",
+                    "homepage": "https://cloud.tencent.com/document/sdk/PHP",
+                    "role": "Developer"
+                }
+            ],
+            "description": "TencentCloudApi php sdk",
+            "homepage": "https://github.com/TencentCloud/tencentcloud-sdk-php",
+            "support": {
+                "issues": "https://github.com/TencentCloud/tencentcloud-sdk-php/issues",
+                "source": "https://github.com/TencentCloud/tencentcloud-sdk-php/tree/3.0.1563"
+            },
+            "time": "2026-04-07T20:16:45+00:00"
+        },
         {
             "name": "tijsverkoyen/css-to-inline-styles",
             "version": "v2.3.0",

+ 9 - 0
config/tenxunyun.php

@@ -0,0 +1,9 @@
+<?php
+
+return [
+
+    'tencentcloud'               => [
+        'secret_id'       => env('TENCENT_SECRET_ID', ''), // 腾讯云 SecretId
+        'secret_key'   => env('TENCENT_SECRET_KEY', ''), // 腾讯云 SecretKey
+    ],
+];