当前位置: 首页 > news >正文

基于百度翻译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类和扩展,我测试的是不支持,可能是我不熟悉,也没深入研究,不然翻译效果可能会更好。有需要的朋友试试吧!

相关文章:

  • mybatis-plus 多租户方案1使用和坑注意事项,方案是需要实现租户功能的表都增加租户id字段
  • 【Linux多线程】线程的终止、等待和分离
  • Bond 网卡绑定技术学习
  • k8s-CCE创建工作负载变量引用
  • jquery.datetimepicker无法添加清除按钮的问题
  • eNSP学习——RIP的路由引入
  • 记录一下npm安装时的错误排查过程
  • 2024-06-06 问AI: 在深度学习中,什么是欧几里德长度?
  • QT串口调试助手V2.0(源码全开源)--上位机+多通道波形显示+数据保存(优化波形显示控件)
  • 【全开源】云调查考试问卷系统(FastAdmin+ThinkPHP+Uniapp)
  • 【C语言从入门到入土】第八章 结构体
  • 【全开源】多功能投票小程序系统源码(ThinkPHP+FastAdmin+Uniapp)
  • 软件安全技术【太原理工大学】
  • Java面向对象-方法的重写、super
  • 【C++】<知识点> C++11新特性
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 【node学习】协程
  • 2017前端实习生面试总结
  • 3.7、@ResponseBody 和 @RestController
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • IDEA常用插件整理
  • Laravel 菜鸟晋级之路
  • Laravel 中的一个后期静态绑定
  • Markdown 语法简单说明
  • SOFAMosn配置模型
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 前端学习笔记之观察者模式
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 写代码的正确姿势
  • k8s使用glusterfs实现动态持久化存储
  • linux 淘宝开源监控工具tsar
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • (2024,Flag-DiT,文本引导的多模态生成,SR,统一的标记化,RoPE、RMSNorm 和流匹配)Lumina-T2X
  • (AngularJS)Angular 控制器之间通信初探
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (五)c52学习之旅-静态数码管
  • (学习日记)2024.01.19
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • .bat文件调用java类的main方法
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .NET IoC 容器(三)Autofac
  • .NET 指南:抽象化实现的基类
  • .NET处理HTTP请求
  • .NET连接数据库方式
  • .NET委托:一个关于C#的睡前故事
  • .Net中的集合
  • .stream().map与.stream().flatMap的使用
  • @RestControllerAdvice异常统一处理类失效原因