【群聊问题】现在有道机器翻译的的PHP示例跟书上的长得不一样,智商立马不够用了
以下是有道官方提供的代码示例,与教材的示例不一样:
这里的do_request()函数怎么修改?
答:
@Ruxin 我看了一下有道提供的PHP示例,它是把设置源语言和目标语言的地方放到了do_request()那个函数里面。
你不是发现有道新的API只有一个参数,而且函数名不是translate,而是变成了do_request()吗?
所谓见招拆招,它这个函数名如果不是do_request(),而你发现整个代码有没有其他地方引用这个函数,所以大可去给它改名字。
再一个就是参数,虽然有道提供的这个代码只有一个参数,但是我们完全可以自己新增两个参数,并且在函数主体内引用这两个参数。
这样就解决了问题,可以直接拿过来使用了。
你可以稍微调整一下代码:
function do_request($q,$source,$target)
{
$salt = create_guid();
$args = array(
'q' => $q,
'appKey' => APP_KEY,
'salt' => $salt,
);
$args['from'] = $source;
$args['to'] = $target;
$args['signType'] = 'v3';
$curtime = strtotime("now");
$args['curtime'] = $curtime;
$signStr = APP_KEY . truncate($q) . $salt . $curtime . SEC_KEY;
$args['sign'] = hash("sha256", $signStr);
$ret = call(URL, $args);
return $ret;
}
全部代码如下:
index.php
<?php define("CURL_TIMEOUT", 2000); define("URL", "https://openapi.youdao.com/api"); define("APP_KEY", ""); // 替换为您的应用ID define("SEC_KEY", ""); // 替换为您的密钥 function translate_y($q,$source,$target) { $salt = create_guid(); $args = array( 'q' => $q, 'appKey' => APP_KEY, 'salt' => $salt, ); $args['from'] = $source; $args['to'] = $target; $args['signType'] = 'v3'; $curtime = strtotime("now"); $args['curtime'] = $curtime; $signStr = APP_KEY . truncate($q) . $salt . $curtime . SEC_KEY; $args['sign'] = hash("sha256", $signStr); $ret = call(URL, $args); 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; } // uuid generator function create_guid(){ $microTime = microtime(); list($a_dec, $a_sec) = explode(" ", $microTime); $dec_hex = dechex($a_dec* 1000000); $sec_hex = dechex($a_sec); ensure_length($dec_hex, 5); ensure_length($sec_hex, 6); $guid = ""; $guid .= $dec_hex; $guid .= create_guid_section(3); $guid .= '-'; $guid .= create_guid_section(4); $guid .= '-'; $guid .= create_guid_section(4); $guid .= '-'; $guid .= create_guid_section(4); $guid .= '-'; $guid .= $sec_hex; $guid .= create_guid_section(6); return $guid; } function create_guid_section($characters){ $return = ""; for($i = 0; $i < $characters; $i++) { $return .= dechex(mt_rand(0,15)); } return $return; } function truncate($q) { $len = abslength($q); return $len <= 20 ? $q : (mb_substr($q, 0, 10) . $len . mb_substr($q, $len - 10, $len)); } function abslength($str) { if(empty($str)){ return 0; } if(function_exists('mb_strlen')){ return mb_strlen($str,'utf-8'); } else { preg_match_all("/./u", $str, $ar); return count($ar[0]); } } function ensure_length(&$string, $length){ $strlen = strlen($string); if($strlen < $length) { $string = str_pad($string, $length, "0"); } else if($strlen > $length) { $string = substr($string, 0, $length); } } // 输入 $q = "待输入的文字"; $ret = translate_y($q,"zh-CHS","en"); $ret = json_decode($ret, true); //var_dump($ret); echo $ret["translation"][0]; ?>
没有找到相关结果
3 个回复
krystal_han93
老师,这样改之后,对应的index代码怎么改呀?
cinlar
请教老师:根据以上代码改编,运行index.php还是显示不出有道的翻译结果。问题如下(第25行也就是tranlate_y函数的return $ret["translation"][0]),该怎么解呢?
Notice: Undefined index: translation in C:\xampp\htdocs\paramt\youdao_transapi.php on line 25
Notice: Trying to access array offset on value of type null in C:\xampp\htdocs\paramt\youdao_transapi.php on line 25
待译原文: 北京语言大学高级翻译学院成立于2011年5月20日。
有道翻译给出的译文为:
函数如下:
function translate_y($q,$source,$target)
{
$salt = create_guid();
$args = array(
'q' => $q,
'appKey' => APP_KEY_y,
'salt' => $salt,
);
$args['from'] = $source;
$args['to'] = $target;
$args['signType'] = 'v3';
$curtime = strtotime("now");
$args['curtime'] = $curtime;
$signStr = APP_KEY_y . truncate($q) . $salt . $curtime . SEC_KEY_y;
$args['sign'] = hash("sha256", $signStr);
$ret = call_y(URL_y, $args);
//return $ret;
$ret = json_decode($ret, true);
return $ret["translation"][0];
}
BrianZhao_185 - 韩老师的小迷弟
参考了老师给出的修改意见,并结合有道和百度的文档技术支持,我对index.php和youdao_transapi.php做了修改,未修改baidu_transapi.php。以下内容,仅供参考,如有不足,欢迎批评指正。
—————————————————————————————————————
index.php
<?php
include "baidu_transapi.php";
include "youdao_transapi.php";
$sourcetext = "未来的时代,一定是人机互动的时代!";
$query = $sourcetext;
$from = "zh";
$to = "en";
$bd_translation = translate($query,$from,$to);
$yd_translation = translate_y($query,$from,$to);
$yd_translation = json_decode($yd_translation, true);//用于将translate_y的数据变为方便获取的数组
echo "待翻译的内容为".$query."<br>";
echo "百度翻译的结果为:".$bd_translation["trans_result"][0]["dst"]."<br>";
echo "有道翻译的结果为:".$yd_translation["translation"][0]."<br>";
?>
——————————————————————————————————————
youdao_transapi.php
<?php
define("CURL_TIMEOUT_y", 2000);
define("URL_y", "将原文件中的网址粘贴于此!!");
define("APP_KEY", "输入您的应用ID"); // 替换为您的应用ID
define("SEC_KEY_y", "输入您的密钥"); // 替换为您的密钥
function translate_y($q,$source,$target)
{
$salt = create_guid();
$args = array(
'q' => $q,
'appKey' => APP_KEY,
'salt' => $salt,
);
$args['from'] = $source;
$args['to'] = $target;
$args['signType'] = 'v3';
$curtime = strtotime("now");
$args['curtime'] = $curtime;
$signStr = APP_KEY . truncate($q) . $salt . $curtime . SEC_KEY_y;
$args['sign'] = hash("sha256", $signStr);
$args['vocabId'] = '您的用户词表ID';
$ret = call_y(URL_y, $args);
return $ret;
}
// 发起网络请求
function call_y($url_y, $args=null, $method="post", $testflag = 0, $timeout = CURL_TIMEOUT_y, $headers=array())
{
$ret = false;
$i = 0;
while($ret === false)
{
if($i > 1)
break;
if($i > 0)
{
sleep(1);
}
$ret = callOnce_y($url_y, $args, $method, false, $timeout, $headers);
$i++;
}
return $ret;
}
function callOnce_y($url_y, $args=null, $method="post", $withCookie = false, $timeout = CURL_TIMEOUT_y, $headers=array())
{
$ch = curl_init();
if($method == "post")
{
$data = convert_y($args);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_POST, 1);
}
else
{
$data = convert_y($args);
if($data)
{
if(stripos($url_y, "?") > 0)
{
$url_y .= "&$data";
}
else
{
$url_y .= "?$data";
}
}
}
curl_setopt($ch, CURLOPT_URL, $url_y);
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_y(&$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;
}
// uuid generator
function create_guid(){
$microTime = microtime();
list($a_dec, $a_sec) = explode(" ", $microTime);
$dec_hex = dechex($a_dec* 1000000);
$sec_hex = dechex($a_sec);
ensure_length($dec_hex, 5);
ensure_length($sec_hex, 6);
$guid = "";
$guid .= $dec_hex;
$guid .= create_guid_section(3);
$guid .= '-';
$guid .= create_guid_section(4);
$guid .= '-';
$guid .= create_guid_section(4);
$guid .= '-';
$guid .= create_guid_section(4);
$guid .= '-';
$guid .= $sec_hex;
$guid .= create_guid_section(6);
return $guid;
}
function create_guid_section($characters){
$return = "";
for($i = 0; $i < $characters; $i++)
{
$return .= dechex(mt_rand(0,15));
}
return $return;
}
function truncate($q) {
$len = abslength($q);
return $len <= 20 ? $q : (mb_substr($q, 0, 10) . $len . mb_substr($q, $len - 10, $len));
}
function abslength($str)
{
if(empty($str)){
return 0;
}
if(function_exists('mb_strlen')){
return mb_strlen($str,'utf-8');
}
else {
preg_match_all("/./u", $str, $ar);
return count($ar[0]);
}
}
function ensure_length(&$string, $length){
$strlen = strlen($string);
if($strlen < $length)
{
$string = str_pad($string, $length, "0");
}
else if($strlen > $length)
{
$string = substr($string, 0, $length);
}
}
// 输入
$q = "待输入的内容";
$ret = translate_y($q,"zh-CHS","en");
//print_r($ret)."<br>";
$ret = json_decode($ret, true);
//print_r($ret);
?>
——————————————————————————————————
需要注意的是,在使参考youdao_transapi.php时,务必将第三行的网址粘贴上去,并且输入您的应用ID和密钥。 本代码主要对老师提出的方案做了以下改变:1)将代码中与baidu_transapi.php中重复的函数进行了修改(加上了_y);2)将老师的参考代码的最后一行“echo $ret["translation"][0];”删除。
——————————————————————————————————————
参考网站:
百度翻译开放平台-开发者文档-通用翻译
有道智云 AI开放平台-自然语言翻译文档目录-API文档-文本翻译服务