zoukankan      html  css  js  c++  java
  • php+google/baidu翻译接口

    <?php
    /**
     * @link http://www.joinf.com
     * @copyright Copyright (C) 2017 joinf.com. All rights reserved.
     */
    
    namespace siteadmincontroller;
    
    use siteadminmodelLanguageModel;
    
    /**
     * 翻译管理
     */
    class TranslateController extends siteadmincomponentController
    {
    	
    	private $appid;
    	private $seckey;
    	private $_model;
    	
    	/**
    	 * 初始化
    	 * @access public
    	 * @return void
    	 */
    	public function __construct()
    	{
    		$this->_model = new LanguageModel();
    		$translate=$this->_model->getTranslate();
    		if($translate){
    			$this->appid=$translate['appid'];
    			$this->seckey=$translate['seckey'];
    		}else{
    			$this->appid='';
    			$this->seckey='';
    		}
    	}
    	
    	/**
    	 * 翻译接口
    	 *
    	 * POST:source_id=原始语言ID,dest_ids=目标语言(数组格式),txts=数据源(数组格式)
    	 *
    	 * @access public
    	 * @return void
    	 */
    	public function toLanguage()
    	{
    /* 		$this->request->post= [
    				'source_id'  => '1',
    				'dest_ids' => ["2",'3'],
    				'txts' =>['今天天气不错,挺风和日丽的','我们都有一个家,名字叫中国'],
    		]; */
    		
    		//google翻译接口
    		$language_id=isset($this->request->post['source_id'])?$this->request->post['source_id']:'';
    		$dest_ids=isset($this->request->post['dest_ids'])?$this->request->post['dest_ids']:'';
    		$data = isset($this->request->post['txts']) ? $this->request->post['txts']: '';
    		
    		if(empty($language_id)||empty($dest_ids)||empty($data)){
    		
    			$this->flash('error', '参数错误');
    			return $this->formatResponse();
    		
    		}else{
    			//获取源语种
    			$b_l=explode(',',$this->config->get('sys_google_translate_code'));
    			$url=$this->config->get('sys_google_translate_url');
    		
    			foreach ($b_l as $k=>$v){
    				if(($k+1)==$language_id){
    					$source=$v;
    				}
    			}
    		
    			$t_data=array();
    
    			foreach ($dest_ids as $kk=>$vv){
    				//计算翻译目标语种
    				foreach ($b_l as $k=>$v){
    					if(($k+1)==$vv){
    						$target=$v;
    					}
    				}
    				
    				//组装译文
    				$translist=array();
    				foreach ($data as $key=>$value){
    					//初始化
    					$curl = curl_init();
    					//设置抓取的url
    					curl_setopt($curl, CURLOPT_URL, $url);
    					//设置头文件的信息作为数据流输出
    					curl_setopt($curl, CURLOPT_HEADER, 1);
    					//设置获取的信息以文件流的形式返回,而不是直接输出。
    					curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    					//设置post方式提交
    					curl_setopt($curl, CURLOPT_POST, 1);
    					//设置post数据
    					$post_data = array(
    							"q" => $value,
    							"source" => $source,
    							"target" => $target,
    							'format' => 'text'
    					);
    					curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);
    					//执行命令
    					$exec_data = curl_exec($curl);
    					//关闭URL请求
    					curl_close($curl);
    					//显示获得的数据
    					$result=json_decode(strstr($exec_data,'{'),true);
    					$translist[]=$result['data']['translations'][0]['translatedText'];
    				}
    				//该语种全部译文
    				$t_data[$vv]=$translist;
    			}
    			$this->manageLogModel->add('多语言翻译');
    			$this->flash('success', '翻译成功');
    			$this->formatResponse($t_data);
    		}
    		
    		
    		//百度翻译接口
    		/* $language_id=isset($this->request->post['source_id'])?$this->request->post['source_id']:'';
    		$dest_ids=isset($this->request->post['dest_ids'])?$this->request->post['dest_ids']:'';
    		$data = isset($this->request->post['txts']) ? $this->request->post['txts']: '';
    		
    		if(empty($language_id)||empty($dest_ids)||empty($data)){
    				
    			$this->flash('error', '提交错误');
    			return $this->formatResponse();
    				
    		}else{
    			//获取源语种
    			$b_l=explode(',',$this->config->get('sys_baidu_language_code'));
    		
    			foreach ($b_l as $k=>$v){
    				if(($k+1)==$language_id){
    					$from=$v;
    				}
    			}
    
    			$t_data=array();
    			$count_num=0;
    			foreach ($dest_ids as $kk=>$vv){
    				//计算翻译目标语种
    				foreach ($b_l as $k=>$v){
    					if(($k+1)==$vv){
    						$to=$v;
    					}
    				}
    				//组装译文
    				$translist=array();
    				foreach ($data as $key=>$value){
    					$result=$this->translate($value,$from,$to);
    					$translist[]=$result['trans_result'][0]['dst'];
    					$count_num+=mb_strlen($value,'utf-8');
    				}
    				//该语种全部译文
    				$t_data[$vv]=$translist;
    			}
    			$this->_model->updateTranslate($this->appid,$count_num,time());
    			$this->manageLogModel->add('多语言翻译');
    			$this->flash('success', '翻译成功');
    			$this->formatResponse($t_data);
    		} */
    		
    	}
    	
    	//翻译入口
    	public function translate($query, $from, $to){
    		$args = array(
    			'q' => $query,
    	        'appid' => $this->appid,
    	        'salt' => rand(10000,99999),
    	        'from' => $from,
    	        'to' => $to,
    		);
    		$args['sign'] = $this->buildSign($query, $this->appid, $args['salt'], $this->seckey);
    		$ret = $this->call($this->config->get('sys_baidu_url'), $args,'post',0,$this->config->get('sys_baidu_curl_timeout'));
    		$ret = json_decode($ret, true);
    		return $ret;
    	}
    	
    	//加密
    	public function buildSign($query, $appID, $salt, $secKey){
    		$str = $appID . $query . $salt . $secKey;
    		$ret = md5($str);
    		return $ret;
    	}
    	
    	//发起网络请求
    	public function call($url, $args=null, $method="post", $testflag = 0, $timeout = 0, $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;
    	}
    	
    	public function callOnce($url, $args=null, $method="post", $withCookie = false, $timeout = 0, $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 = 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;
    	}
    	
    	public 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;
    	}
    }
    

      

  • 相关阅读:
    Mybatis入门之常规操作CURD案例Demo(附源码)
    如何捕获Wince下form程序的全局异常
    如何捕获winform程序全局异常?(续)
    log4net学习目录
    如何捕获winform程序全局异常?
    有关学习的思考
    使用VS2012主题插件创建自己的主题
    Vistual Studio 2012更换皮肤
    log4net使用经验总结
    log4net使用流程
  • 原文地址:https://www.cnblogs.com/tdalcn/p/8509693.html
Copyright © 2011-2022 走看看