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 / languages.php

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

553 lines 12.4 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 * Get website language data array
11 *
12 * @return array Language data
13 */
14 function wplng_get_language_website() {
15
16 global $wplng_language_website;
17
18 if ( null != $wplng_language_website ) {
19 return $wplng_language_website;
20 }
21
22 $language = wplng_get_language_by_id(
23 wplng_get_language_website_id()
24 );
25
26 $wplng_language_website = $language;
27
28 return $language;
29 }
30
31
32 /**
33 * Get the website language ID
34 *
35 * @return string Language ID
36 */
37 function wplng_get_language_website_id() {
38
39 $language_api = wplng_get_api_language_website();
40
41 if ( 'all' === $language_api ) {
42 $language_id = get_option( 'wplng_website_language' );
43 } elseif ( false === $language_api ) {
44 return 'en';
45 } else {
46 $language_id = wplng_get_api_language_website();
47 }
48
49 if ( ! wplng_is_valid_language_id( $language_id ) ) {
50 return 'en';
51 }
52
53 return $language_id;
54 }
55
56
57 /**
58 * Get the URL of website language flag image
59 *
60 * @return string URL flag image
61 */
62 function wplng_get_language_website_flag() {
63
64 $website_flag = get_option( 'wplng_website_flag' );
65
66 if ( empty( $website_flag ) ) {
67
68 $website_flag = wplng_get_language_by_id(
69 wplng_get_language_website_id()
70 );
71
72 if ( ! empty( $website_flag['flags'][0]['flag'] ) ) {
73 $website_flag = $website_flag['flags'][0]['flag'];
74 } else {
75 $website_flag = ''; // Return empty string if no valid flag
76 }
77 }
78
79 $website_flag = apply_filters( 'wplng_language_website_flag', $website_flag );
80
81 return esc_url( $website_flag );
82 }
83
84
85 /**
86 * Get language name from language ID or data
87 *
88 * @param mixed $language
89 * @return string
90 */
91 function wplng_get_language_name( $language ) {
92
93 // if $language is a language array, return name
94 if ( ! empty( $language['name'] ) ) {
95 return esc_html( $language['name'] );
96 }
97
98 // $language is a language ID
99 // convert language ID to language array
100 $language = wplng_get_language_by_id( $language );
101
102 // If $language is not a valid, return empty string
103 if ( false === $language ) {
104 return '';
105 }
106
107 // If name is valid, return the name
108 if ( ! empty( $language['name'] ) ) {
109 return esc_html( $language['name'] );
110 }
111
112 // If no name returned here, return empty string
113 return '';
114 }
115
116
117 /**
118 * Get language ID from language ID or data
119 *
120 * @param mixed $language
121 * @return string Language ID
122 */
123 function wplng_get_language_id( $language ) {
124
125 // If $language is a language array
126 if ( ! empty( $language['id'] )
127 && wplng_is_valid_language_id( $language['id'] )
128 ) {
129 return $language['id'];
130 }
131
132 // If $language is a language ID, get language array
133 $language = wplng_get_language_by_id( $language );
134
135 // If language ID is invalid, return a default value
136 if ( false === $language || empty( $language['id'] ) ) {
137 return 'en';
138 }
139
140 return $language['id'];
141 }
142
143
144 /**
145 * Get language name translated from language ID or data
146 *
147 * @param mixed $language Language ID or data
148 * @param string $language_target Language ID
149 * @return string Language name translated
150 */
151 function wplng_get_language_name_translated( $language, $language_target = '' ) {
152
153 // Get target language ID
154 if ( empty( $language_target ) ) {
155 $language_target = wplng_get_language_current_id();
156 } else {
157 $language_target_id = wplng_get_language_id( $language_target );
158 }
159
160 // Get language array
161 if ( empty( $language['id'] ) ) {
162 $language = wplng_get_language_by_id( $language );
163 }
164
165 $translated_language_name = '';
166
167 if ( ! empty( $language['name_translation'][ $language_target_id ] ) ) {
168 $translated_language_name = esc_html( $language['name_translation'][ $language_target_id ] );
169 } else {
170 $translated_language_name = wplng_get_language_name( $language );
171 }
172
173 return esc_html( $translated_language_name );
174 }
175
176
177 function wplng_get_language_name_untranslated( $language ) {
178 return wplng_get_language_name_translated( $language, $language );
179 }
180
181
182 /**
183 * Return a JSON with languages data simplified
184 *
185 * @return array Languages data simplified
186 */
187 function wplng_get_languages_target_simplified() {
188
189 global $wplng_languages_target_simplified;
190
191 if ( null !== $wplng_languages_target_simplified ) {
192 return $wplng_languages_target_simplified;
193 }
194
195 $json = get_option( 'wplng_target_languages' );
196
197 if ( empty( $json ) || ! is_string( $json ) ) {
198 $json = '[]';
199 }
200
201 $languages_target = json_decode( $json, true );
202 $all_languages = wplng_get_languages_allow();
203 $ordered = array();
204
205 // Process languages in the order they appear in the settings (preserve order)
206 foreach ( $languages_target as $language_target ) {
207 if ( empty( $language_target['id'] ) ) {
208 continue;
209 }
210
211 // Skip private languages for non-authorized users
212 if ( ! empty( $language_target['private'] )
213 && ! current_user_can( 'edit_posts' )
214 ) {
215 continue;
216 }
217
218 // Find the language in allowed languages to validate it exists
219 $language_found = false;
220 foreach ( $all_languages as $language ) {
221 if ( ! empty( $language['id'] ) && $language['id'] === $language_target['id'] ) {
222 $language_found = true;
223 break;
224 }
225 }
226
227 // Only add if the language is found in allowed languages
228 if ( $language_found ) {
229 $ordered[] = $language_target;
230 }
231 }
232
233 $wplng_languages_target_simplified = $ordered;
234
235 return $ordered;
236 }
237
238
239 /**
240 * Get target languages data
241 *
242 * @return array
243 */
244 function wplng_get_languages_target() {
245
246 global $wplng_languages_target;
247
248 if ( null !== $wplng_languages_target ) {
249 return $wplng_languages_target;
250 }
251
252 $languages_target = wplng_get_languages_target_simplified();
253 $languages_target_clear = array();
254
255 // Check each $languages_target
256 foreach ( $languages_target as $key => $language_target ) {
257 // Check languages target format
258 if ( ! empty( $language_target['id'] ) && isset( $language_target['flag'] ) ) {
259 // Check if language is valid
260 if ( wplng_is_valid_language_id( $language_target['id'] ) ) {
261 $language = wplng_get_language_by_id( $language_target['id'] );
262 if ( false !== $language ) {
263 $languages_target_clear[] = $language;
264 }
265 }
266 }
267 }
268
269 $wplng_languages_target = $languages_target_clear;
270
271 return $languages_target_clear;
272 }
273
274
275 /**
276 * Get target languages IDs
277 *
278 * @return array
279 */
280 function wplng_get_languages_target_ids() {
281
282 if ( ! empty( $languages ) ) {
283 return $languages;
284 }
285
286 $languages_target = wplng_get_languages_target();
287 $languages_target_ids = array();
288
289 foreach ( $languages_target as $language_target ) {
290 $languages_target_ids[] = $language_target['id'];
291 }
292
293 return $languages_target_ids;
294 }
295
296
297 /**
298 * Get current language ID
299 *
300 * @return string
301 */
302 function wplng_get_language_current_id() {
303
304 global $wplng_language_current_id;
305
306 if ( null !== $wplng_language_current_id ) {
307 return $wplng_language_current_id;
308 }
309
310 global $wplng_request_uri;
311 $current_path = $wplng_request_uri;
312 $languages_target = wplng_get_languages_target_ids();
313
314 if ( empty( $current_path )
315 || ! is_string( $current_path )
316 ) {
317 return wplng_get_language_website_id();
318 }
319
320 foreach ( $languages_target as $language ) {
321 if ( substr( $current_path, 0, 4 ) === '/' . $language . '/'
322 || substr( $current_path, 0, 3 ) === $language . '/'
323 ) {
324
325 $wplng_language_current_id = $language;
326
327 return $language;
328 }
329 }
330
331 return wplng_get_language_website_id();
332 }
333
334
335 /**
336 * Get languages data from languages IDs list
337 *
338 * @param array $language_ids
339 * @return array
340 */
341 function wplng_get_languages_by_ids( $language_ids ) {
342
343 $all_languages = wplng_get_languages_all();
344 $languages = array();
345
346 foreach ( $language_ids as $language_id ) {
347 foreach ( $all_languages as $language ) {
348 if ( ! empty( $language['id'] ) && $language['id'] === $language_id ) {
349 $languages[] = $language;
350 break;
351 }
352 }
353 }
354
355 return $languages;
356 }
357
358
359 /**
360 * Get language data from ID
361 *
362 * @param string $language_id
363 * @return array
364 */
365 function wplng_get_language_by_id( $language_id ) {
366
367 $all_languages = wplng_get_languages_all();
368
369 foreach ( $all_languages as $language ) {
370 if ( ! empty( $language['id'] ) && $language['id'] === $language_id ) {
371 return $language;
372 }
373 }
374
375 // Return a default value if $language_id not exist
376 return wplng_get_language_by_id( 'en' );
377 }
378
379
380 /**
381 * Check if a language ID is valid
382 *
383 * @param string $language_id
384 * @return bool
385 */
386 function wplng_is_valid_language_id( $language_id ) {
387
388 // If $language_id format is not valid, return default data
389 if ( empty( $language_id )
390 || ! is_string( $language_id )
391 || strlen( $language_id ) !== 2
392 ) {
393 return false;
394 }
395
396 // wplng_data_languages_ids
397 $languages_data_id = wplng_data_languages_id();
398 foreach ( $languages_data_id as $language_data_id ) {
399 if ( $language_data_id === $language_id ) {
400 return true;
401 }
402 }
403
404 return false;
405 }
406
407
408 /**
409 * Check if a list of languages ID are valid
410 *
411 * @param array $language_id_list
412 * @return bool Languages ID are valid
413 */
414 function wplng_is_valid_language_ids( $language_id_list ) {
415
416 if ( ! is_array( $language_id_list ) ) {
417 return false;
418 }
419
420 $languages_data_id = wplng_data_languages_id();
421
422 foreach ( $language_id_list as $language_id ) {
423
424 // If $language_id format is not valid, return default data
425 if ( empty( $language_id )
426 || ! is_string( $language_id )
427 || strlen( $language_id ) !== 2
428 ) {
429 return false;
430 }
431
432 // If language ID not exist
433 $is_valid_language = false;
434 foreach ( $languages_data_id as $language_data_id ) {
435 if ( $language_data_id === $language_id ) {
436 $is_valid_language = true;
437 break;
438 }
439 }
440
441 if ( false === $is_valid_language ) {
442 return false;
443 }
444 }
445
446 return true;
447 }
448
449
450 /**
451 * Get data of all languages
452 *
453 * @return array
454 */
455 function wplng_get_languages_all() {
456
457 global $wplng_languages_all;
458
459 if ( null !== $wplng_languages_all ) {
460 return $wplng_languages_all;
461 }
462
463 $languages = wplng_data_languages();
464 $source_language = get_option( 'wplng_website_language' );
465 $source_flag = get_option( 'wplng_website_flag' );
466 $target_flags = get_option( 'wplng_target_languages' );
467
468 if ( empty( $target_flags ) || ! is_string( $target_flags ) ) {
469 $target_flags = '[]';
470 }
471
472 $target_flags = json_decode( $target_flags, true );
473
474 if ( empty( $source_language ) ) {
475 $source_language = 'en';
476 }
477
478 foreach ( $languages as $key => $language ) {
479
480 $flags_style = wplng_get_switcher_flags_style() . '/';
481
482 if ( 'none/' === $flags_style ) {
483 $flags_style = 'rectangular/';
484 }
485
486 // Set custom website flag if defined
487 if ( ! empty( $source_language )
488 && $language['id'] == $source_language
489 && ! empty( $source_flag )
490 ) {
491 $languages[ $key ]['flag'] = $source_flag;
492 } else {
493 $languages[ $key ]['flag'] = plugins_url() . '/wplingua/assets/images/' . $flags_style . $language['flag'] . '.png';
494 }
495
496 // Set custom target flag if defined
497 foreach ( $target_flags as $target_key => $target_flag ) {
498 if ( ! empty( $target_flag['id'] ) && $target_flag['id'] == $language['id'] ) {
499 $languages[ $key ]['flag'] = $target_flag['flag'];
500 break;
501 }
502 }
503
504 // Transform flags to URL
505 foreach ( $languages[ $key ]['flags'] as $key_flag => $flag ) {
506 $languages[ $key ]['flags'][ $key_flag ]['flag'] = plugins_url() . '/wplingua/assets/images/' . $flags_style . $flag['flag'] . '.png';
507 }
508
509 // Add default DIR as LTR if not specified or invalid
510 if ( empty( $language['dir'] )
511 || 'rtl' !== $language['dir']
512 ) {
513 $languages[ $key ]['dir'] = 'ltr';
514 }
515 }
516
517 $wplng_languages_all = $languages;
518
519 return $languages;
520 }
521
522
523 /**
524 * Get data of all languages allowed
525 *
526 * @return array
527 */
528 function wplng_get_languages_allow() {
529
530 global $wplng_languages_allow;
531
532 if ( null !== $wplng_languages_allow ) {
533 return $wplng_languages_allow;
534 }
535
536 $languages_alow = wplng_get_api_languages_target();
537 $languages = array();
538
539 if ( 'all' === $languages_alow ) {
540 return wplng_get_languages_all();
541 } elseif ( empty( $languages_alow ) || ! is_array( $languages_alow ) ) {
542 return array();
543 } else {
544 foreach ( $languages_alow as $language_id_alow ) {
545 $languages[] = wplng_get_language_by_id( $language_id_alow );
546 }
547
548 $wplng_languages_allow = $languages;
549 }
550
551 return $languages;
552 }
553