【群聊问题】现在有道机器翻译的的PHP示例跟书上的长得不一样,智商立马不够用了

以下是有道官方提供的代码示例,与教材的示例不一样:


/coding/uploads/files_user1/question/5f2b587b9ac28880283.png


这里的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];
?>


已邀请:

老师,这样改之后,对应的index代码怎么改呀?

请教老师:根据以上代码改编,运行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.phpyoudao_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文档-文本翻译服务


要回复问题请先登录注册