基于百度翻译API的火车头PHP翻译插件,可以翻译HTML片段
关于火车头的百度翻译插件,相信大家在火车头官网或网上都能找到相关代码,百度翻译插件是PHP写的,就一个PHP文件,简单灵活,不受火车头软件版本限制,任何有PHP插件权限的火车头版本都可以使用。但是百度API翻译有一个致命的缺陷,就是不支持html代码翻译,如果采集的字段包含html片段,那翻译完全就错乱了,没法正常使用,下面给大家分享一个简易翻译html代码片段的方法。
<?phpdefine("CURL_TIMEOUT", 30);
define("URL", "http://api.fanyi.baidu.com/api/trans/vip/translate");
define("APP_ID", ""); //替换为您的APPID
define("SEC_KEY", "");//替换为您的密钥
define("FROM", "en");//采集的源语言标识码,默认为中文“zh”
define("TO", "zh");//翻译后的目标语言标识码,默认翻译为英文“en”function translate($query)
{$args = array('q' => $query,'appid' => APP_ID,'salt' => rand(10000,99999),'from' => FROM,'to' => TO,);$args['sign'] = buildSign($query, APP_ID, $args['salt'], SEC_KEY);$ret = call(URL, $args);$ret = json_decode($ret, true);if (isset($ret['error_code'])) {switch ($ret['error_code']) {case 52003:return "错误代码(".$ret['error_code']."):APP_ID不正确,请检查您填写的APP_ID是否和百度翻译开放平台申请的一致。";break;case 54001:return "错误代码(".$ret['error_code']."):密钥不正确,请检查您填写的密钥是否和百度翻译开放平台申请的一致。";break;case 54000:return "错误代码(".$ret['error_code']."):翻译内容为空,请检查您的采集规则是否正确,出现本错误可能软件未采集到内容。";break;case 54004:return "错误代码(".$ret['error_code']."):余额不足,您的免费字符已用完或余额不足,请登陆百度翻译开放平台充值。";break;case 58001:return "错误代码(".$ret['error_code']."):译文语言方向错误,请检查您设置的目标语言标识码是否正确。";break;default:return "错误代码(".$ret['error_code']."):不可预知的错误,https://tpl.sryun.net";break;}}return $ret["trans_result"]["0"]["dst"];
}function buildSign($query, $appID, $salt, $secKey)
{$str = $appID . $query . $salt . $secKey;$ret = md5($str);return $ret;
}function call($url, $args=null, $method="post", $testflag = 0, $timeout = CURL_TIMEOUT, $headers=array())
{$ret = false;$i = 0; while($ret === false) {if($i > 1)break;if($i > 0) {sleep(1);}$ret = callOnce($url, $args, $method, false, $timeout, $headers);$i++;}return $ret;
}function callOnce($url, $args=null, $method="post", $withCookie = false, $timeout = CURL_TIMEOUT, $headers=array())
{$ch = curl_init();if($method == "post") {$data = convert($args);curl_setopt($ch, CURLOPT_POSTFIELDS, $data);curl_setopt($ch, CURLOPT_POST, 1);}else {$data = convert($args);if($data) {if(stripos($url, "?") > 0) {$url .= "&$data";}else {$url .= "?$data";}}}curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);if(!empty($headers)) {curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);}if($withCookie){curl_setopt($ch, CURLOPT_COOKIEJAR, $_COOKIE);}$r = curl_exec($ch);curl_close($ch);return $r;
}function convert(&$args)
{$data = '';if (is_array($args)){foreach ($args as $key=>$val){if (is_array($val)){foreach ($val as $k=>$v){$data .= $key.'['.$k.']='.rawurlencode($v).'&';}}else{$data .="$key=".rawurlencode($val)."&";}}return trim($data, "&");}return $args;
}// function translateHTML($html)
// {
// // 使用正则表达式保护HTML标签不被翻译
// $html = preg_replace_callback('/<[^>]+>|[^<]+/', function($matches) {
// $segment = $matches[0];
// if (preg_match('/<[^>]+>/', $segment)) {
// // 这是一个HTML标签,直接返回
// return $segment;
// } else {
// // 这是文本内容,进行翻译
// return translate($segment);
// }
// }, $html);// return $html;
// }//逐词逐句分割翻译-并不精准,勉强刊用
// function translateHTML($html)
// {
// // 使用正则表达式保护HTML标签不被翻译
// $parts = preg_split('/(<[^>]+>)/', $html, -1, PREG_SPLIT_DELIM_CAPTURE);
// $translatedHTML = '';// foreach ($parts as $part) {
// if (preg_match('/<[^>]+>/', $part)) {
// // 这是一个HTML标签,直接附加
// $translatedHTML .= $part;
// } else {
// // 这是文本内容,进行逐词或逐句翻译
// $translatedHTML .= translateTextBySentence($part);
// }
// }// return $translatedHTML;
// }// function translateTextBySentence($text) {
// // 使用句号分割句子
// $sentences = preg_split('/([.!?]+)/', $text, -1, PREG_SPLIT_DELIM_CAPTURE);
// $translated = '';
// foreach ($sentences as $sentence) {
// if (trim($sentence) !== '') {
// $translated .= translate($sentence);
// }
// }
// return $translated;
// }//特定标签翻译
function translateContent($html)
{$pattern = '/(<div class="ariticle-body">)(.*?)(<br\s*\/?>)/is';$html = preg_replace_callback($pattern, function ($matches) {$contentToTranslate = strip_tags($matches[2]);$translatedContent = translate($contentToTranslate);return $matches[1] . $translatedContent . $matches[3];}, $html);return $html;
}if($LabelArray['PageType']=="Save")
{/*** 下面的内容需要根据火车头的采集规则进行修改,一行为一个需要翻译的标签。* 后面的为采集到的原始标签,前面的为翻译后的标签。* 这里的标签名必须和采集规则里的标签名一致,否则无法翻译。*/$LabelArray['翻译的标题'] = translate($query = $LabelArray['标题']);$LabelArray['翻译的内容'] = translateContent($query = $LabelArray['内容']);$LabelArray['翻译的描述'] = translate($query = $LabelArray['描述']);
}
echo serialize($LabelArray);?>
代码的关键就在于translateContent函数,因为我采集的数据字段都是英文,需要翻译为中文,字段包含在标签<div class="ariticle-body">和<br/>标签之间,所以我只需要翻译这之间的文本就可以,翻译完成之后,并将翻译结果插入回原始HTML中。
我注释掉的translateHTML函数,也可以整段的翻译内容字段,只是效果并不是很完美,因为百度翻译不支持大段文本翻译,只能是逐句分割翻译,所以就弃用了,大家可以私下进行调试修改。
我不知道火车头是否能完美的支持php类和扩展,我测试的是不支持,可能是我不熟悉,也没深入研究,不然翻译效果可能会更好。有需要的朋友试试吧!
相关文章:
基于百度翻译API的火车头PHP翻译插件,可以翻译HTML片段
关于火车头的百度翻译插件,相信大家在火车头官网或网上都能找到相关代码,百度翻译插件是PHP写的,就一个PHP文件,简单灵活,不受火车头软件版本限制,任何有PHP插件权限的火车头版本都可以使用。但是百度API翻…...
mysql高级用法常用函数
mysql高级用法 1、自定义排序 select * from movies order by field(actors, 成龙, 靳东, 刘亦菲, 范冰冰); // 字段中存在null值 select * from movies order by field (coalesce(actors,null),成龙, 靳东, 刘亦菲, 范冰冰,null)2、空值NULL排序(ORDER BY IF(ISN…...
【打印100个常用Linux命令】
#!/bin/bash 定义一个函数,用于打印100个常用Linux命令 print_commands() { echo “以下是一些常用的Linux命令:” echo “----------------------------------” echo “1. pwd - 显示当前工作目录” echo “2. ls - 列出当前目录下的文件和文件夹” …...
友情提示:lazarus的tsortgrid.autofillcolumns存在BUG
直接在tsortgrid的属性中设置autofillcolumns为true,会提示:123个错误。即使修改为false,编译运行照样会出现上述错误。唯一解决的办法就是删除sortgrid重新添加一个。 代码设置SortGrid1.AutoFillColumns : TRUE不受影响。...
github的个人readme文件
一个好的svg图: Simon-He95/profile-3d-contrib/profile-season-animate.svg at 4281d9f46e3d5416bd8f8cc5779157bfdaa8589d Simon-He95/Simon-He95 GitHub 请访问他的主页从提交记录就可以看到这个立体的登录github的图...
java面试题: HashMap、HashSet 和 HashTable 的区别
HashMap 常用方法 HashMap 是一个基于哈希表的 Map 接口的实现。它允许使用 null 值和 null 键。 java 复制 // 创建一个HashMap HashMap<KeyType, ValueType> map new HashMap<>(); // 添加元素 map.put(key, value); // 获取元素 ValueType value map.get…...
CPP初级:模板的运用!
目录 一.泛型编程 二.函数模板 1.函数模板概念 2.函数模板格式 3.函数模板的原理 三.函数模板的实例化 1.隐式实例化 2.显式实例化 3.模板参数的匹配原则 四.类模板 1.类模板的定义格式 2.类模板的实例化 一.泛型编程 泛型编程:编写与类型无关的通用代码…...
排序---基数排序
前言 个人小记 一、简介 基数排序是一种非比较排序,所以排序速度较快,当为32位int整数排序时,可以将数分为个位十位分别为2^16,使得拷贝只需要两轮,从而达到2*n,然后给一个偏移量,使得可以对负数排序。以…...
“新高考”下分班怎么分?
来自安徽的张女士告诉我:上一年孩子升入了高中,但没想到才高一,孩子就面临了一个困难的挑选:312”分班! 什么是312”分班呢?许多人或许不明白,便是要求学生在高一入学时,针对于3门必…...
二叉树的层序遍历-力扣
本题是二叉树的层序遍历,通过一个队列来控制遍历的节点,二叉树每层的节点和上一层入队的节点个数是相同的,根据这一点编写循环条件。 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* …...
N32G45XVL-STB之移植LVGL(lvgl-8.2.0)
目录 概述 1 软硬件介绍 1.1 软件版本信息 1.2 ST7796-LCD 1.3 MCU IO与LCD PIN对应关系 2 认识LVGL 2.1 LVGL官网 2.2 LVGL库文件下载 3 移植LVGL 3.1 准备移植文件 3.2 添加lvgl库文件到项目 3.2.1 src下的文件 3.2.2 examples下的文件 3.2.3 配置文件路径 3.2…...
【设计模式】创建型设计模式之 原型模式
介绍 原型模式是一种创建型设计模式,主要用于创建重复的对象,而无需重新初始化它们,从而提高效率并简化对象的创建过程。此模式的核心思想是利用已存在的对象实例,通过复制(克隆)的方式来生成新的对象&…...
【类型商店】字符字符串(下)
啊,哈喽,小伙伴们大家好。我是#Y清墨,今天呐,我要介绍的是字符与字符串。 导语 前两期,我们已经懂得了概念,今天来看些函数。 正题 一.增加或连接 (1) 后面增加() string s1,s2; //定义 s…...
『 Linux 』内存管理与文件系统
文章目录 交换分区页与页框(页帧)交换分区与内存之间的交换操作系统如何管理内存物理地址转换页号与页内偏移量 内存管理,文件系统与文件管理之间的联系 交换分区 在Linux的安装过程中,用户将会被提示创建一个交换分区; 这是一个特殊的分区,其大小可以由用户根据系统内存需求和…...
线性代数|机器学习-P8矩阵低秩近似eckart-young
文章目录 1. SVD奇异值分解2. Eckart-Young2.1 范数 3. Q A Q U Σ V T QAQU\Sigma V^T QAQUΣVT4. 主成分分析图像表示 1. SVD奇异值分解 我们知道,对于任意矩阵A来说,我们可以将其通过SVD奇异值分解得到 A U Σ V T AU\Sigma V^T AUΣVT࿰…...
平面设计神器CorelDRAW2021精简版,你值得拥有!
亲爱的设计师小伙伴们,今天我要为大家种草一款神奇的软件——CorelDRAW平面设计软件2021精简版!🤩✨作为一名专业的图形设计师,我深知一个好工具对于我们的工作有多么重要。而这款软件简直就是我们设计师的救星!&#…...
kafka是什么?
Kafka是一个由Apache软件基金会开发的开源流处理平台,最初由LinkedIn公司开发,使用Scala和Java编写。它是一个高吞吐量的分布式发布订阅消息系统,可以处理消费者在网站中的所有动作流数据,如网页浏览、搜索和其他用户行为等。Kafk…...
ABC351
C 栈的应用 #include<bits/stdc.h>using namespace std;stack<int>stk;int main() {int n;cin>>n;for(int i1;i<n;i){int a;cin>>a;while(!stk.empty()&&astk.top()){stk.pop();a;}stk.push(a);}cout<<stk.size()<<endl;retur…...
base上海,数据科学,数据挖掘,数据分析等岗位求收留
裁员了,base上海,数据科学,数据挖掘,数据分析等岗位,期望30k~40k,求推荐求收留 1,6年数据算法工作,做过指标体系搭建,用户画像,货品定价,社区分析…...
IC元器件
1.电阻: 电阻的作用: 1.与负载串联:做限流分压 2.电阻并联:将小功率电阻并联成大功率,防烧毁 2.电容: 电容就是两块金属板+中间的介质(相当于两个人坐在一起加上中间的空气…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
