PluginProbe
Translation with DeepL API / 1.5.2.5
Translation with DeepL API v1.5.2.5
trunk 0.1.20180323 1.0 1.2.5.1 1.5.2.5 1.7.5 2.4.3.12 2.4.3.9 2.4.5
wpdeepl / client / deeplapi.class.php

deeplapi.class.php in Translation with DeepL API 1.5.2.5, at client/deeplapi.class.php

371 lines 9.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 abstract class DeepLApi extends DeepLData {
4 protected $endPoint = '';
5 private $endPointURL = false;
6 protected $authKey = '';
7 protected $log = false;
8 protected $headers = array();
9
10 protected $cache_dir = false;
11
12 protected $request = array();
13 protected $uniqid = false;
14 protected $cache_file = false;
15 protected $response = false;
16 public $cache_prefix = false;
17 protected $cache_id = false;
18
19 public $allow_cache = true;
20 public $response_type = 'fresh';
21 public $request_cache_file = '';
22 public $response_cache_file = '';
23
24 public $start_microtime = 0;
25 public $end_microtime = 0;
26 public $request_microtime = 0;
27
28 const TIMEOUT = 15;
29
30 public function __construct( $languages = array(), $log = false ) {
31 $this->authKey = DeepLConfiguration::getAPIKey();
32 //$this->request['auth_key'] = $auth_key;
33 $this->log = $log;
34
35 $this->languages = DeepLConfiguration::DefaultsAllLanguages();
36
37 if( defined( 'DOING_CRON' ) && DOING_CRON ) {
38 $this->doing_cron = true;
39 }
40 else {
41 $this->doing_cron = false;
42 }
43
44 $this->instance = $this;
45
46 $this->cache_dir = $this->getCacheDirectory();
47 }
48
49 public function wasItCached() {
50 return $this->response_type === 'cache';
51 }
52
53 public function getTimeElapsed() {
54 return $this->request_microtime;
55 }
56
57 protected function buildQuery( $mode = 'POST' ) {
58 $args = array();
59
60 if( count( $this->headers ) )
61 $args['headers'] = $this->headers;
62
63 //$request = array( 'auth_key' => $this->authKey );
64
65 $request = array();
66 if( $this->request ) {
67 foreach( $this->request as $key => $value ) {
68 $request[$key] = $value;
69 }
70 }
71
72 if( $mode == 'POST' ) {
73 // fixed in 0.3 by schalipp https://wordpress.org/support/topic/translate-button-not-doing-anything/#post-10825822
74 // modified in 1.0 to send all strings in one request
75
76 $bits = array();
77 foreach( $request as $key => $value ) {
78 if( is_array( $value ) ) {
79 foreach( $value as $sub_key => $sub_value ) {
80 $bits[] = "$key=$sub_value";
81 }
82 }
83 else {
84 $bits[] = "$key=$value";
85 }
86 }
87
88 $args['body'] = implode( '&', $bits );
89 //$args['body'] = http_build_query( $request );
90 }
91 else {
92 $request['auth_key'] = $this->authKey;
93 $args['query'] = http_build_query( $request );
94 }
95
96 $args['timeout'] = self::TIMEOUT;
97
98 $this->final_request = $args;
99 $this->saveRequest();
100 return $args;
101 }
102
103 public function getRequestUniqueID() {
104 if( $this->cache_id ) {
105 $this->uniqid = $this->cache_id;
106 }
107 elseif( !$this->uniqid ) {
108 $this->uniqid = microtime();
109 }
110 return $this->uniqid;
111 }
112
113 public function isValidRequest() {
114 return true;
115 }
116
117 /*
118 protected function maybeLimitRequestSize() {
119 }
120 */
121 protected function saveRequest() {
122 if( isset( $this->request_cache_file ) ) {
123 file_put_contents( $this->request_cache_file, json_encode( $this->final_request ) );
124 }
125 }
126 protected function doRequest( $mode = 'POST' ) {
127 if( $mode == 'GET' ) {
128 $response = $this->doGETRequest();
129 }
130 else {
131 $response = $this->doPOSTRequest();
132 }
133
134 return $response;
135 }
136
137 static function getInstance() {
138 return $this->instance;
139 }
140
141 protected function setCacheID( $idstring ) {
142 $this->cache_id = $idstring;
143 }
144
145 public function setCachePrefix( $prefix = '' ) {
146 if( !empty( $prefix ) ) {
147 $this->cache_prefix = $prefix;
148 }
149 else {
150 $this->cache_prefix = '';
151 }
152 }
153
154 public function getCacheFile( $type ) {
155 if( $type == 'response' ) {
156 return $this->response_cache_file;
157 }
158 elseif( $type == 'request' ) {
159 return $this->request_cache_file;
160 }
161 }
162
163 public function setCacheNames() {
164 $cache_name = '';
165 if( !empty( $this->cache_prefix ) ) {
166 $cache_name .= $this->cache_prefix .'-';
167 }
168 $cache_name .= $this->cache_id;
169 $this->request_cache_file = trailingslashit( $this->cache_dir ) . $cache_name . '-request';
170 $this->response_cache_file = trailingslashit( $this->cache_dir ) . $cache_name . '-response';
171 }
172
173 public function request() {
174
175 $log_bits = array('class' => get_class($this));
176
177 if( $this->allow_cache )
178 $this->uniqid = $this->getRequestUniqueID();
179
180 $log_bits['uniqid'] = $this->uniqid;
181
182 $this->setCacheNames();
183 $this->result = false;
184 //plouf( $this ); die( 'opzirjizerj' );
185
186 if( $this->isCacheValid( $this->response_cache_file ) ) {
187 $this->response_type = 'cache';
188 $this->why_no_cache = false;
189 $this->result = file_get_contents( $this->response_cache_file );
190 $log_bits['type'] = 'cached';
191
192 //echo "\nIS CACHE"; //plouf( $this->result );
193 }
194 else {
195 $log_bits['type'] = 'fresh';
196 $log_bits['mode'] = $this->http_mode;
197 $this->start_microtime = microtime( true );
198 //echo "\nIS FRESH";
199 $this->response_type = 'fresh';
200
201 if( $this->http_mode == 'GET' ) {
202 $response = $this->doRequest( 'GET' );
203 }
204 else {
205 $response = $this->doRequest( 'POST' );
206 }
207
208 $this->end_microtime = microtime( true );
209 $this->request_microtime = $this->end_microtime - $this->start_microtime;
210
211 if( $response['response']['code'] > 299 ) {
212 $log_bits['response_error'] = $response['response']['code'];
213 $log_bits['response'] = $response['response'];
214 if( $response['response']['code'] == 429 ) {
215 $log_bits['error_cause'] = 'Excessive request size';
216 }
217 if( DeepLConfiguration::getLogLevel() ) wpdeepl_log($log_bits, "operation");
218 return new WP_Error( 'deeplerror', implode( ' : ', $response['response'] ) );
219 }
220
221 if( array_key_exists( 'body', $response ) && strlen( $response['body'] ) )
222 $this->result = $response['body'];
223 else
224 $this->result = false;
225
226 if( $this->result ) {
227 //echo " putting " . strlen( serialize( $this->result ) ) ." in "
228 file_put_contents( $this->response_cache_file, $this->result );
229 }
230
231 $log_bits['request_microtime'] = $this->request_microtime;
232 }
233
234 if( DeepLConfiguration::getLogLevel() ) {
235 if( DeepLConfiguration::getLogLevel() > 1 ) {
236 $log_bits['args'] = $this->request;
237 }
238 else {
239 foreach( array ('source_lang', 'target_lang') as $key ) {
240 if( isset( $this->request[$key] ) ) {
241 $log_bits[$key] = $this->request[$key];
242 }
243 }
244 }
245 if( isset( $this->request['text'] ) ) {
246 $text_size = 0;
247 foreach( $this->request['text'] as $i => $string ) {
248 $text_size += strlen($string);
249 }
250 $log_bits['text_size'] = $text_size;
251 }
252 }
253
254 if($this->response_type == 'fresh') {
255 // test if JSON
256 json_decode($this->result);
257 if(json_last_error() == JSON_ERROR_NONE) {
258 $log_bits['response'] = json_decode($this->result, 1 );
259 if( DeepLConfiguration::getLogLevel() ) {
260 if(isset( $log_bits['response']['translations'] ) ) {
261 $translated_text_size = 0;
262 foreach( $log_bits['response']['translations'] as $i => $translation ) {
263 $translated_text_size += strlen( $translation['text'] );
264 }
265 $log_bits['translated_text_size'] = $translated_text_size;
266 }
267 }
268 }
269 else {
270 $log_bits['response'] = $this->result;
271 }
272
273 }
274 else {
275 $log_bits['response'] = '--hidden response because cached request--';
276
277 }
278 $log_bits['response_length'] = strlen($this->result);
279
280 if( $this->result ) {
281 $this->result = json_decode( $this->result );
282 $this->result = ( array ) $this->result;
283 $this->result['response_type'] = $this->response_type;
284 if( $this->why_no_cache ) {
285 $log_bits['why_no_cache'] = $this->why_no_cache;
286 $this->result['why_no_cache'] = $this->why_no_cache;
287 }
288 if( DeepLConfiguration::getLogLevel() ) wpdeepl_log($log_bits, "operation");
289 return $this->result;
290 }
291 else {
292 if( DeepLConfiguration::getLogLevel() ) wpdeepl_log($log_bits, "operation");
293 return $this->response['response']['message'];
294 }
295 }
296
297 public function getRequestTime( $result_in_milliseconds = false ) {
298 if( !$this->request_microtime ) {
299 return false;
300 }
301
302 if( $result_in_milliseconds ) {
303 return floatval( $this->request_microtime );
304 }
305 else {
306 return floatval( $this->request_microtime/1000 );
307 }
308 }
309
310 public function getEndPointURL( $add_auth_key = false ) {
311 if( !$this->endPointURL ) {
312 if( $this->endPoint === '' ) {
313 $this->endPointURL = DEEPL_API_URL;
314 }
315 else {
316 $this->endPointURL = trailingslashit( DEEPL_API_URL ) . $this->endPoint;
317 }
318 }
319
320 if( $add_auth_key ) {
321 $this->endPointURL .= '?auth_key=' . $this->authKey;
322 }
323
324 return $this->endPointURL;
325 }
326 /*
327 * send a POST request
328 *
329 * @since 0.1
330 */
331 public function doPOSTRequest( $args = array() ) {
332 $add_auth_key = true;
333
334 $this->headers['Content-Type'] = 'application/x-www-form-urlencoded';
335 // $this->headers['Content-Length'] = strlen( $this->request['text'] );
336 $args = $this->buildQuery( 'POST' );
337
338
339 $response = wp_remote_post( $this->getEndPointURL( $add_auth_key ), $args );
340 //plouf($response); plouf( $args, "ARGS POSTS pour URL " . $this->getEndPointURL() ); plouf( $this ); die( 'ok izpepiezrir' );
341
342 if ( is_wp_error( $response ) ) {
343 $this->response = $response->get_error_message();
344 plouf( $args, $this->getEndPointURL() );
345 die( 'do post requestijezpoirer' );
346 } else {
347 $this->response = $response;
348 }
349 return $response;
350 }
351
352 /*
353 * send a GET request
354 *
355 * @since 0.1
356 */
357 public function doGETRequest() {
358 $args = $this->buildQuery( 'GET' );
359
360 $url = $this->getEndPointURL() . '?' . $args['query'];
361 //louf( $args, "REQUESTING URL = '$url'" );
362 // die( 'ok' );
363 $response = wp_remote_get( $url, $args );
364 if ( is_wp_error( $response ) ) {
365 $this->response = $response->get_error_message();
366 } else {
367 $this->response = $response;
368 }
369 return $response;
370 }
371 }