<?php
class OthFanYi
{
	//翻译入口
	function fanyi($wordArr, $from = 'en', $to = 'zh')
	{
		$from = empty($from)? 'en': $from;
		$to = empty($to)? 'zh': $to;
		$wordArr = array_unique($wordArr);
		$okArr = [];
		$arr = [];
		$file = mvc::$cfg['AUTOLOAD']['Oth']['path'].'cache/baidufanyi_'.$from.'_'.$to.'.php';
		$hasFanyi = [];
		if(file_exists($file)) $hasFanyi = include($file);

		foreach($wordArr as $k=>$v)
		{
			if(isset($hasFanyi[$v]))
			{
				$arr[$v] = ['src'=>$v, 'dst'=>$hasFanyi[$v]];
				unset($wordArr[$k]);
			}
		}
		$qstr = '';
		$count = count($wordArr);
		foreach($wordArr as $v)
		{
			$count--;
			$qstr .= $v."\n";
			if($count == 0 || strlen($qstr) > 1500)
			{
				$args = array(
					'q' => $qstr,
					'appid' => mvc::$cfg['FANYI']['baidu']['APP_ID'],
					'salt' => rand(10000,99999),
					'from' => $from,
					'to' => $to,

				);
				$args['sign'] = $this->buildSign($qstr, mvc::$cfg['FANYI']['baidu']['APP_ID'], $args['salt'], mvc::$cfg['FANYI']['baidu']['SEC_KEY']);
				$ret = $this->call(mvc::$cfg['FANYI']['baidu']['URL'], $args);
				$ret = json_decode($ret, true);
				$qstr = '';
				foreach($ret['trans_result'] as $vv)
				{
					$hasFanyi[$vv['src']] = $vv['dst'];
					$arr[$vv['src']] = $vv;
				}
				LibFc::ArraySave($hasFanyi, $file);
			}
		}
		
		return LibFc::ReturnData(true, array_values($arr));
	}

	//加密
	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 = 10, $headers=array())
	{
		$ret = false;
		$i = 0; 
		while($ret === false) 
		{
			if($i > 1)
				break;
			if($i > 0) 
			{
				sleep(1);
			}
			$ret = $this->callOnce($url, $args, $method, false, $timeout, $headers);
			$i++;
		}
		return $ret;
	}

	function callOnce($url, $args=null, $method="post", $withCookie = false, $timeout = 10, $headers=array())
	{
		$ch = curl_init();
		if($method == "post") 
		{
			$data = $this->convert($args);
			curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
			curl_setopt($ch, CURLOPT_POST, 1);
		}
		else 
		{
			$data = $this->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;
	}
}