关于火车头的百度翻译插件,相信大家在火车头官网或网上都能找到相关代码,百度翻译插件是PHP写的,就一个PHP文件,简单灵活,不受火车头软件版本限制,任何有PHP插件权限的火车头版本都可以使用。但是百度API翻译有一个致命的缺陷,就是不支持html代码翻译,如果采集的字段包含html片段,那翻译完全就错乱了,没法正常使用,下面给大家分享一个简易翻译html代码片段的方法。
<?php
define("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片段
发表评论 取消回复