PluginProbe
Translate and Go multilingual – Automatic AI translation – wpLingua / 2.12.2
Translate and Go multilingual – Automatic AI translation – wpLingua v2.12.2
2.16.7 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 All 112 releases
wplingua / inc / args.php

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

434 lines 8.3 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 || 'translated' === $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 /**
195 * Check texts unknow array
196 */
197
198 if ( empty( $args['texts_unknow'] )
199 || ! is_array( $args['texts_unknow'] )
200 ) {
201 $args_clear['texts_unknow'] = array();
202 } else {
203 $args_clear['texts_unknow'] = $args['texts_unknow'];
204 }
205
206 $args = $args_clear;
207 }
208
209
210 /**
211 * Return a translations array from a texts array
212 * If text is unknow, call API and save it
213 *
214 * @param array $texts
215 * @param array $args
216 * @return void
217 */
218 function wplng_args_update_from_texts( &$args, $texts ) {
219
220 if ( empty( $texts ) ) {
221 $args['translations'] = array();
222 return;
223 }
224
225 /**
226 * Texts: Sanitize and clear duplicated
227 */
228
229 foreach ( $texts as $key => $text ) {
230
231 if ( ! is_string( $text ) ) {
232 continue;
233 }
234
235 $text = wplng_text_esc( $text );
236
237 if ( '' !== $text ) {
238 $texts[ $key ] = $text;
239 }
240 }
241
242 $texts = array_unique( $texts ); // Remove duplicate
243
244 /**
245 * Update args
246 */
247
248 wplng_args_setup( $args );
249
250 /**
251 * Get all translations for all languages
252 */
253
254 $translations_all_languages = get_transient( 'wplng_cached_translations' );
255
256 if ( empty( $translations_all_languages )
257 || ! is_array( $translations_all_languages )
258 ) {
259 $translations_all_languages = wplng_get_translations_from_query();
260 }
261
262 /**
263 * Get unknow texts & Separate page translations
264 */
265
266 $texts_unknow = array();
267 $translations_in_page = array();
268
269 foreach ( $texts as $text ) {
270
271 $is_in = false;
272 $detection = wplng_api_feature_is_allow( 'detection' );
273
274 $array_index = (string) mb_substr( $text, 0, 1 );
275 $array_index .= (string) strlen( $text );
276
277 if ( ! empty( $translations_all_languages[ $array_index ] ) ) {
278 foreach ( $translations_all_languages[ $array_index ] as $translation ) {
279
280 // $source = $translation['source'];
281
282 if ( $text === $translation['source']
283 && isset( $translation['translations'][ $args['language_target'] ] )
284 && is_string( $translation['translations'][ $args['language_target'] ] )
285 && isset( $translation['review'] )
286 && is_array( $translation['review'] )
287 && isset( $translation['post_id'] )
288 && is_int( $translation['post_id'] )
289 ) {
290
291 $is_in = true;
292
293 $review = in_array(
294 $args['language_target'],
295 $translation['review'],
296 true
297 );
298
299 $translated_text = wplng_text_esc(
300 $translation['translations'][ $args['language_target'] ]
301 );
302
303 $translations_in_page[] = array(
304 'source' => $text,
305 'post_id' => $translation['post_id'],
306 'review' => $review,
307 'translation' => $translated_text,
308 );
309
310 break;
311 }
312 }
313 }
314
315 if ( ! $is_in && $detection ) {
316 $texts_unknow[] = $text;
317 }
318 }
319
320 $args['texts_unknow'] = $texts_unknow;
321
322 /**
323 * Limit $texts_unknow for a total of 4200 char
324 */
325
326 $current_length = 0;
327 $texts_unknow_limited = array();
328
329 foreach ( $texts_unknow as $text ) {
330 $text_length = strlen( $text );
331 if ( $current_length + $text_length > WPLNG_MAX_TRANSLATIONS_CHAR ) {
332 break;
333 }
334 $texts_unknow_limited[] = $text;
335 $current_length += $text_length + 8;
336 }
337
338 /**
339 * Get count_texts
340 */
341
342 $args['count_texts'] = count( $texts );
343 $args['count_texts_unknow'] = count( $texts_unknow );
344
345 /**
346 * Check if the current page is overloaded
347 */
348
349 $args['overloaded'] = wplng_get_api_overloaded() && ! empty( $args['count_texts_unknow'] );
350
351 /**
352 * Define $max_translations
353 */
354
355 $max_translations = WPLNG_MAX_TRANSLATIONS_STR + 1;
356
357 if ( $args['load'] === 'translated' ) {
358
359 /**
360 * This is the page reloaded after "Load in progress" was complete
361 */
362
363 $max_translations = 0;
364
365 wplng_clear_website_cache();
366
367 } elseif ( $args['load'] === 'enabled'
368 && $args['count_texts_unknow'] > 10
369 && ! $args['overloaded']
370 && wplng_api_feature_is_allow( 'detection' )
371 && current_user_can( 'edit_posts' )
372 ) {
373
374 /**
375 * Current page identified as requiring "in progress" mode
376 */
377
378 $args['load'] = 'progress';
379 $max_translations = 0;
380
381 } else {
382 $args['load'] = 'disabled';
383 }
384
385 $texts_unknow_limited = array_splice(
386 $texts_unknow_limited,
387 0,
388 $max_translations
389 );
390
391 /**
392 * Get new translated text
393 */
394
395 $texts_translated = wplng_api_call_translate(
396 $texts_unknow_limited,
397 $args['language_source'],
398 $args['language_target']
399 );
400
401 $texts_unknow = array_diff_assoc( $texts_unknow, $texts_unknow_limited );
402
403 $args['texts_unknow'] = $texts_unknow;
404
405 /**
406 * Save new translation as wplng_translation CPT
407 */
408
409 $translations_new = array();
410
411 foreach ( $texts_unknow_limited as $key => $text_source ) {
412 if ( isset( $texts_translated[ $key ] ) ) {
413 $translations_new[] = array(
414 'source' => $text_source,
415 'translation' => $texts_translated[ $key ],
416 );
417 }
418 }
419
420 $translations_new = wplng_save_translations(
421 $translations_new,
422 $args['language_target']
423 );
424
425 /**
426 * Merge know and new translations
427 */
428
429 $args['translations'] = array_merge(
430 $translations_in_page,
431 $translations_new
432 );
433 }
434