PluginProbe
Translate and Go multilingual – Automatic AI translation – wpLingua / 2.10.0
Translate and Go multilingual – Automatic AI translation – wpLingua v2.10.0
2.16.6 2.16.5 2.16.4 2.16.3 2.16.2 2.16.1 2.16.0 2.15.2 2.15.1 2.15.0 2.14.3 2.14.2 2.14.1 2.14.0 2.13.1 2.13.0 2.12.3 2.12.2 2.12.1 trunk 1.0.3 1.0.4 1.0.5 1.1.0 1.1.1 All 111 releases
wplingua / inc / args.php

args.php in Translate and Go multilingual – Automatic AI translation – wpLingua 2.10.0, at inc/args.php

439 lines 8.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 // If this file is called directly, abort.
4 if ( ! defined( 'WPINC' ) ) {
5 die;
6 }
7
8
9 /**
10 * Setup the arguments
11 *
12 * @param array $args
13 * @return void
14 */
15 function wplng_args_setup( &$args ) {
16
17 $args_clear = array();
18
19 /**
20 * Check language website ID
21 */
22
23 if ( empty( $args['language_source'] )
24 || ! wplng_is_valid_language_id( $args['language_source'] )
25 ) {
26 $args_clear['language_source'] = wplng_get_language_website_id();
27 } else {
28 $args_clear['language_source'] = $args['language_source'];
29 }
30
31 /**
32 * Check language website DIR
33 */
34
35 if ( empty( $args['language_source_dir'] ) ) {
36
37 $language = wplng_get_language_by_id( $args_clear['language_source'] );
38
39 $args_clear['language_source_dir'] = $language['dir'];
40
41 } else {
42 $args_clear['language_source_dir'] = $args['language_source_dir'];
43 }
44
45 /**
46 * Check language target ID
47 */
48
49 if ( empty( $args['language_target'] )
50 || ! wplng_is_valid_language_id( $args['language_target'] )
51 ) {
52 $args_clear['language_target'] = wplng_get_language_current_id();
53 } else {
54 $args_clear['language_target'] = $args['language_target'];
55 }
56
57 /**
58 * Check language target DIR
59 */
60
61 if ( empty( $args['language_target_dir'] ) ) {
62
63 $language = wplng_get_language_by_id( $args_clear['language_target'] );
64
65 $args_clear['language_target_dir'] = $language['dir'];
66
67 } else {
68 $args_clear['language_target_dir'] = $args['language_target_dir'];
69 }
70
71 /**
72 * Get count_texts
73 */
74
75 if ( ! isset( $args['count_texts'] )
76 || ! is_int( $args['count_texts'] )
77 ) {
78 $args_clear['count_texts'] = 0;
79 } else {
80 $args_clear['count_texts'] = $args['count_texts'];
81 }
82
83 if ( ! isset( $args['count_texts_unknow'] )
84 || ! is_int( $args['count_texts_unknow'] )
85 ) {
86 $args_clear['count_texts_unknow'] = 0;
87 } else {
88 $args_clear['count_texts_unknow'] = $args['count_texts_unknow'];
89 }
90
91 /**
92 * Get overloaded
93 */
94
95 $args_clear['overloaded'] = isset( $args['overloaded'] ) && ! empty( $args['overloaded'] );
96
97 /**
98 * Get mode (vanilla/editor/list)
99 */
100
101 if ( isset( $args['mode'] )
102 && (
103 'editor' === $args['mode']
104 || 'list' === $args['mode']
105 )
106 ) {
107
108 $args_clear['mode'] = $args['mode'];
109
110 } else {
111
112 $args_clear['mode'] = 'vanilla';
113
114 }
115
116 /**
117 * Get load mode (enabled/progress/disabled)
118 */
119
120 if ( isset( $args['load'] )
121 && (
122 'enabled' === $args['load']
123 || 'progress' === $args['load']
124 || 'loading' === $args['load']
125 )
126 ) {
127 $args_clear['load'] = $args['load'];
128 } else {
129 $args_clear['load'] = 'disabled';
130 }
131
132 /**
133 * Check current URL
134 */
135
136 if ( empty( $args['url_current'] ) ) {
137 $args_clear['url_current'] = remove_query_arg(
138 array(
139 'wplng-mode',
140 'wplng-load',
141 'nocache',
142 ),
143 wp_make_link_relative(
144 wplng_get_url_current()
145 )
146 );
147 } else {
148 $args_clear['url_current'] = $args['url_current'];
149 }
150
151 /**
152 * Check translated URL
153 */
154
155 if ( empty( $args['url_original'] ) ) {
156 $args_clear['url_original'] = remove_query_arg(
157 array(
158 'wplng-mode',
159 'wplng-load',
160 'nocache',
161 ),
162 wp_make_link_relative(
163 wplng_get_url_original()
164 )
165 );
166 } else {
167 $args_clear['url_original'] = $args['url_original'];
168 }
169
170 /**
171 * Get parents (Use by JSON)
172 */
173
174 if ( empty( $args['parents'] )
175 || ! is_array( $args['parents'] )
176 ) {
177 $args_clear['parents'] = array();
178 } else {
179 $args_clear['parents'] = $args['parents'];
180 }
181
182 /**
183 * Check translations array
184 */
185
186 if ( empty( $args['translations'] )
187 || ! is_array( $args['translations'] )
188 ) {
189 $args_clear['translations'] = array();
190 } else {
191 $args_clear['translations'] = $args['translations'];
192 }
193
194 $args = $args_clear;
195 }
196
197
198 /**
199 * Return a translations array from a texts array
200 * If text is unknow, call API and save it
201 *
202 * @param array $texts
203 * @param array $args
204 * @return void
205 */
206 function wplng_args_update_from_texts( &$args, $texts ) {
207
208 if ( empty( $texts ) ) {
209 $args['translations'] = array();
210 return;
211 }
212
213 /**
214 * Texts: Sanitize and clear duplicated
215 */
216
217 foreach ( $texts as $key => $text ) {
218
219 $text = wplng_text_esc( $text );
220
221 if ( '' !== $text ) {
222 $texts[ $key ] = $text;
223 }
224 }
225
226 $texts = array_unique( $texts ); // Remove duplicate
227
228 /**
229 * Update args
230 */
231
232 wplng_args_setup( $args );
233
234 /**
235 * Get all translations for all languages
236 */
237
238 $translations_all_languages = get_transient( 'wplng_cached_translations' );
239
240 if ( empty( $translations_all_languages )
241 || ! is_array( $translations_all_languages )
242 ) {
243 $translations_all_languages = wplng_get_translations_from_query();
244 }
245
246 /**
247 * Get unknow texts & Separate page translations
248 */
249
250 $texts_unknow = array();
251 $translations_in_page = array();
252
253 foreach ( $texts as $text ) {
254
255 $is_in = false;
256 $detection = wplng_api_feature_is_allow( 'detection' );
257
258 $array_index = (string) mb_substr( $text, 0, 1 );
259 $array_index .= (string) strlen( $text );
260
261 if ( ! empty( $translations_all_languages[ $array_index ] ) ) {
262 foreach ( $translations_all_languages[ $array_index ] as $translation ) {
263
264 // $source = $translation['source'];
265
266 if ( $text === $translation['source']
267 && isset( $translation['translations'][ $args['language_target'] ] )
268 && is_string( $translation['translations'][ $args['language_target'] ] )
269 && isset( $translation['review'] )
270 && is_array( $translation['review'] )
271 && isset( $translation['post_id'] )
272 && is_int( $translation['post_id'] )
273 ) {
274
275 $is_in = true;
276
277 $review = in_array(
278 $args['language_target'],
279 $translation['review'],
280 true
281 );
282
283 $translated_text = wplng_text_esc(
284 $translation['translations'][ $args['language_target'] ]
285 );
286
287 $translations_in_page[] = array(
288 'source' => $text,
289 'post_id' => $translation['post_id'],
290 'review' => $review,
291 'translation' => $translated_text,
292 );
293
294 break;
295 }
296 }
297 }
298
299 if ( ! $is_in && $detection ) {
300 $texts_unknow[] = $text;
301 }
302 }
303
304 /**
305 * Limit $texts_unknow for a total of 1000 char
306 */
307
308 $current_length = 0;
309 $limited_texts_unknow = array();
310
311 foreach ( $texts_unknow as $text ) {
312 $text_length = strlen( $text );
313 if ( $current_length + $text_length > WPLNG_MAX_TRANSLATIONS_CHAR ) {
314 break;
315 }
316 $limited_texts_unknow[] = $text;
317 $current_length += $text_length + 8;
318 }
319
320 $texts_unknow = $limited_texts_unknow;
321
322 /**
323 * Get count_texts
324 */
325
326 $args['count_texts'] = count( $texts );
327 $args['count_texts_unknow'] = count( $texts_unknow );
328
329 /**
330 * Check if the current page is overloaded
331 */
332
333 $args['overloaded'] = wplng_get_api_overloaded() && ! empty( $args['count_texts_unknow'] );
334
335 /**
336 * Define $max_translations
337 */
338
339 $max_translations = WPLNG_MAX_TRANSLATIONS_STR + 1;
340
341 if ( $args['load'] === 'enabled'
342 && $args['count_texts_unknow'] > 20
343 && ! $args['overloaded']
344 && wplng_api_feature_is_allow( 'detection' )
345 ) {
346
347 /**
348 * Current page identified as requiring "in progress" mode
349 */
350
351 $redirect_query_arg = array();
352
353 // Set mode to "editor" or "list" if needed
354 if ( 'vanilla' !== $args['mode'] ) {
355 $redirect_query_arg['wplng-mode'] = $args['mode'];
356 }
357
358 $redirect_query_arg['wplng-load'] = 'progress';
359 $redirect_query_arg['nocache'] = (string) time() . (string) rand( 100, 999 );
360
361 wp_safe_redirect(
362 add_query_arg(
363 $redirect_query_arg,
364 $args['url_current']
365 ),
366 302
367 );
368 exit;
369 return;
370
371 } elseif ( $args['load'] === 'progress' ) {
372 $max_translations = 0;
373 } elseif ( $args['load'] === 'loading' ) {
374 $max_translations = 60;
375 } else {
376 $args['load'] = 'disabled';
377 }
378
379 if ( $args['load'] !== 'disabled' ) {
380
381 // Set HTTP no-cache header
382 nocache_headers();
383
384 // Disable cache for plugins
385 if ( ! defined( 'DONOTCACHEPAGE' ) ) {
386 define( 'DONOTCACHEPAGE', true );
387 }
388
389 if ( function_exists( 'do_action' ) ) {
390 do_action( 'litespeed_purge_all' );
391 }
392 }
393
394 $texts_unknow = array_splice(
395 $texts_unknow,
396 0,
397 $max_translations
398 );
399
400 /**
401 * Get new translated text
402 */
403
404 $texts_translated = wplng_api_call_translate(
405 $texts_unknow,
406 $args['language_source'],
407 $args['language_target']
408 );
409
410 /**
411 * Save new translation as wplng_translation CPT
412 */
413
414 $translations_new = array();
415
416 foreach ( $texts_unknow as $key => $text_source ) {
417 if ( isset( $texts_translated[ $key ] ) ) {
418 $translations_new[] = array(
419 'source' => $text_source,
420 'translation' => $texts_translated[ $key ],
421 );
422 }
423 }
424
425 $translations_new = wplng_save_translations(
426 $translations_new,
427 $args['language_target']
428 );
429
430 /**
431 * Merge know and new translations
432 */
433
434 $args['translations'] = array_merge(
435 $translations_in_page,
436 $translations_new
437 );
438 }
439