PluginProbe
Translate and Go multilingual – Automatic AI translation – wpLingua / 2.16.6
Translate and Go multilingual – Automatic AI translation – wpLingua v2.16.6
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.16.6, at inc/languages.php

607 lines 14.0 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 plural forms from language ID ("en" or "en_US") or data
119 *
120 * @param mixed $language
121 * @return string
122 */
123 function wplng_get_language_plural_forms( $language ) {
124
125 // if $language is a language array, return plural_forms
126 if ( is_array( $language )
127 && ! empty( $language['plural_forms'] )
128 ) {
129 return $language['plural_forms'];
130 }
131
132 if ( ! is_string( $language ) ) {
133 // Return most current plural form
134 return 'nplurals=2; plural=n != 1;';
135 }
136
137 // If string is like "en_US"
138 if ( strlen( $language ) > 2 ) {
139 $language = strtolower( explode( '_', $language )[0] );
140 }
141
142 if ( ! wplng_is_valid_language_id( $language ) ) {
143 // Return most current plural form
144 return 'nplurals=2; plural=n != 1;';
145 }
146
147 // $language is a language ID
148 // convert language ID to language array
149 $language = wplng_get_language_by_id( $language );
150
151 // If $language is not a valid, return most current plural form
152 if ( false === $language ) {
153 return 'nplurals=2; plural=n != 1;';
154 }
155
156 // If plural forms is know, return it
157 if ( ! empty( $language['plural_forms'] ) ) {
158 return $language['plural_forms'];
159 }
160
161 // If no plural forms returned here, return most current plural form
162 return 'nplurals=2; plural=n != 1;';
163 }
164
165
166 /**
167 * Get language ID from language ID or data
168 *
169 * @param mixed $language
170 * @return string Language ID
171 */
172 function wplng_get_language_id( $language ) {
173
174 // If $language is a language array
175 if ( ! empty( $language['id'] )
176 && wplng_is_valid_language_id( $language['id'] )
177 ) {
178 return $language['id'];
179 }
180
181 // If $language is a language ID, get language array
182 $language = wplng_get_language_by_id( $language );
183
184 // If language ID is invalid, return a default value
185 if ( false === $language || empty( $language['id'] ) ) {
186 return 'en';
187 }
188
189 return $language['id'];
190 }
191
192
193 /**
194 * Get language name translated from language ID or data
195 *
196 * @param mixed $language Language ID or data
197 * @param string $language_target Language ID
198 * @return string Language name translated
199 */
200 function wplng_get_language_name_translated( $language, $language_target = '' ) {
201
202 // Get target language ID
203 if ( empty( $language_target ) ) {
204 $language_target = wplng_get_language_current_id();
205 }
206 $language_target_id = wplng_get_language_id( $language_target );
207
208 // Get language array
209 if ( empty( $language['id'] ) ) {
210 $language = wplng_get_language_by_id( $language );
211 }
212
213 $translated_language_name = '';
214
215 if ( ! empty( $language['name_translation'][ $language_target_id ] ) ) {
216 $translated_language_name = esc_html( $language['name_translation'][ $language_target_id ] );
217 } else {
218 $translated_language_name = wplng_get_language_name( $language );
219 }
220
221 return esc_html( $translated_language_name );
222 }
223
224
225 function wplng_get_language_name_untranslated( $language ) {
226 return wplng_get_language_name_translated( $language, $language );
227 }
228
229
230 /**
231 * Return a JSON with languages data simplified
232 *
233 * @return array Languages data simplified
234 */
235 function wplng_get_languages_target_simplified() {
236
237 global $wplng_languages_target_simplified;
238
239 if ( null !== $wplng_languages_target_simplified ) {
240 return $wplng_languages_target_simplified;
241 }
242
243 $json = get_option( 'wplng_target_languages' );
244
245 if ( empty( $json ) || ! is_string( $json ) ) {
246 $json = '[]';
247 }
248
249 $languages_target = json_decode( $json, true );
250 $all_languages = wplng_get_languages_allow();
251 $ordered = array();
252
253 // Process languages in the order they appear in the settings (preserve order)
254 foreach ( $languages_target as $language_target ) {
255 if ( empty( $language_target['id'] ) ) {
256 continue;
257 }
258
259 // Skip private languages for non-authorized users
260 if ( ! empty( $language_target['private'] )
261 && ! current_user_can( 'edit_posts' )
262 ) {
263 continue;
264 }
265
266 // Find the language in allowed languages to validate it exists
267 $language_found = false;
268 foreach ( $all_languages as $language ) {
269 if ( ! empty( $language['id'] ) && $language['id'] === $language_target['id'] ) {
270 $language_found = true;
271 break;
272 }
273 }
274
275 // Only add if the language is found in allowed languages
276 if ( $language_found ) {
277 $ordered[] = $language_target;
278 }
279 }
280
281 $wplng_languages_target_simplified = $ordered;
282
283 return $ordered;
284 }
285
286
287 /**
288 * Get target languages data
289 *
290 * @return array
291 */
292 function wplng_get_languages_target() {
293
294 global $wplng_languages_target;
295
296 if ( null !== $wplng_languages_target ) {
297 return $wplng_languages_target;
298 }
299
300 $languages_target = wplng_get_languages_target_simplified();
301 $languages_target_clear = array();
302
303 // Check each $languages_target
304 foreach ( $languages_target as $key => $language_target ) {
305 // Check languages target format
306 if ( ! empty( $language_target['id'] ) && isset( $language_target['flag'] ) ) {
307 // Check if language is valid
308 if ( wplng_is_valid_language_id( $language_target['id'] ) ) {
309 $language = wplng_get_language_by_id( $language_target['id'] );
310 if ( false !== $language ) {
311 $languages_target_clear[] = $language;
312 }
313 }
314 }
315 }
316
317 $wplng_languages_target = $languages_target_clear;
318
319 return $languages_target_clear;
320 }
321
322
323 /**
324 * Get target languages IDs
325 *
326 * @return array
327 */
328 function wplng_get_languages_target_ids() {
329
330 global $wplng_languages_target_ids;
331
332 if ( null !== $wplng_languages_target_ids ) {
333 return $wplng_languages_target_ids;
334 }
335
336 $languages_target = wplng_get_languages_target();
337 $languages_target_ids = array();
338
339 foreach ( $languages_target as $language_target ) {
340 $languages_target_ids[] = $language_target['id'];
341 }
342
343 $wplng_languages_target_ids = $languages_target_ids;
344
345 return $languages_target_ids;
346 }
347
348
349 /**
350 * Get current language ID
351 *
352 * @return string
353 */
354 function wplng_get_language_current_id() {
355
356 global $wplng_language_current_id;
357
358 if ( null !== $wplng_language_current_id ) {
359 return $wplng_language_current_id;
360 }
361
362 global $wplng_request_uri;
363 $current_path = $wplng_request_uri;
364 $languages_target = wplng_get_languages_target_ids();
365
366 if ( empty( $current_path )
367 || ! is_string( $current_path )
368 ) {
369 return wplng_get_language_website_id();
370 }
371
372 foreach ( $languages_target as $language ) {
373 if ( substr( $current_path, 0, 4 ) === '/' . $language . '/'
374 || substr( $current_path, 0, 3 ) === $language . '/'
375 ) {
376
377 $wplng_language_current_id = $language;
378
379 return $language;
380 }
381 }
382
383 $website_language_id = wplng_get_language_website_id();
384 $wplng_language_current_id = $website_language_id;
385
386 return $website_language_id;
387 }
388
389
390 /**
391 * Get languages data from languages IDs list
392 *
393 * @param array $language_ids
394 * @return array
395 */
396 function wplng_get_languages_by_ids( $language_ids ) {
397
398 $all_languages = wplng_get_languages_all();
399 $languages = array();
400
401 foreach ( $language_ids as $language_id ) {
402 foreach ( $all_languages as $language ) {
403 if ( ! empty( $language['id'] ) && $language['id'] === $language_id ) {
404 $languages[] = $language;
405 break;
406 }
407 }
408 }
409
410 return $languages;
411 }
412
413
414 /**
415 * Get language data from ID
416 *
417 * @param string $language_id
418 * @return array|false Language data array, or false if not found
419 */
420 function wplng_get_language_by_id( $language_id ) {
421
422 $all_languages = wplng_get_languages_all();
423
424 foreach ( $all_languages as $language ) {
425 if ( ! empty( $language['id'] ) && $language['id'] === $language_id ) {
426 return $language;
427 }
428 }
429
430 // Avoid infinite recursion: if 'en' itself is not found, return false
431 if ( 'en' === $language_id ) {
432 return false;
433 }
434
435 // Return English as fallback if the requested language ID does not exist
436 return wplng_get_language_by_id( 'en' );
437 }
438
439
440 /**
441 * Check if a language ID is valid
442 *
443 * @param string $language_id
444 * @return bool
445 */
446 function wplng_is_valid_language_id( $language_id ) {
447
448 // If $language_id format is not valid, return default data
449 if ( empty( $language_id )
450 || ! is_string( $language_id )
451 || strlen( $language_id ) !== 2
452 ) {
453 return false;
454 }
455
456 return in_array( $language_id, wplng_data_languages_id(), true );
457 }
458
459
460 /**
461 * Check if a list of languages ID are valid
462 *
463 * @param array $language_id_list
464 * @return bool Languages ID are valid
465 */
466 function wplng_is_valid_language_ids( $language_id_list ) {
467
468 if ( ! is_array( $language_id_list ) ) {
469 return false;
470 }
471
472 $languages_data_id = wplng_data_languages_id();
473
474 foreach ( $language_id_list as $language_id ) {
475
476 // If $language_id format is not valid, return default data
477 if ( empty( $language_id )
478 || ! is_string( $language_id )
479 || strlen( $language_id ) !== 2
480 ) {
481 return false;
482 }
483
484 // If language ID not exist
485 $is_valid_language = false;
486 foreach ( $languages_data_id as $language_data_id ) {
487 if ( $language_data_id === $language_id ) {
488 $is_valid_language = true;
489 break;
490 }
491 }
492
493 if ( false === $is_valid_language ) {
494 return false;
495 }
496 }
497
498 return true;
499 }
500
501
502 /**
503 * Get data of all languages
504 *
505 * @return array
506 */
507 function wplng_get_languages_all() {
508
509 global $wplng_languages_all;
510
511 if ( null !== $wplng_languages_all ) {
512 return $wplng_languages_all;
513 }
514
515 $languages = wplng_data_languages();
516 $source_language = get_option( 'wplng_website_language' );
517 $source_flag = get_option( 'wplng_website_flag' );
518 $target_flags = get_option( 'wplng_target_languages' );
519
520 if ( empty( $target_flags ) || ! is_string( $target_flags ) ) {
521 $target_flags = '[]';
522 }
523
524 $target_flags = json_decode( $target_flags, true );
525
526 if ( empty( $source_language ) ) {
527 $source_language = 'en';
528 }
529
530 foreach ( $languages as $key => $language ) {
531
532 $flags_style = wplng_get_switcher_flags_style() . '/';
533
534 if ( 'none/' === $flags_style ) {
535 $flags_style = 'rectangular/';
536 }
537
538 // Set custom website flag if defined
539 if ( ! empty( $source_language )
540 && $language['id'] === $source_language
541 && ! empty( $source_flag )
542 ) {
543 $languages[ $key ]['flag'] = $source_flag;
544 } else {
545 $languages[ $key ]['flag'] = plugins_url() . '/wplingua/assets/images/' . $flags_style . $language['flag'] . '.png';
546 }
547
548 // Set custom target flag if defined
549 foreach ( $target_flags as $target_key => $target_flag ) {
550 if ( ! empty( $target_flag['id'] ) && $target_flag['id'] === $language['id'] ) {
551 $languages[ $key ]['flag'] = $target_flag['flag'];
552 break;
553 }
554 }
555
556 // Transform flags to URL
557 foreach ( $languages[ $key ]['flags'] as $key_flag => $flag ) {
558 $languages[ $key ]['flags'][ $key_flag ]['flag'] = plugins_url() . '/wplingua/assets/images/' . $flags_style . $flag['flag'] . '.png';
559 }
560
561 // Add default DIR as LTR if not specified or invalid
562 if ( empty( $language['dir'] )
563 || 'rtl' !== $language['dir']
564 ) {
565 $languages[ $key ]['dir'] = 'ltr';
566 }
567 }
568
569 $wplng_languages_all = $languages;
570
571 return $languages;
572 }
573
574
575 /**
576 * Get data of all languages allowed
577 *
578 * @return array
579 */
580 function wplng_get_languages_allow() {
581
582 global $wplng_languages_allow;
583
584 if ( null !== $wplng_languages_allow ) {
585 return $wplng_languages_allow;
586 }
587
588 $languages_alow = wplng_get_api_languages_target();
589 $languages = array();
590
591 if ( 'all' === $languages_alow ) {
592 $wplng_languages_allow = wplng_get_languages_all();
593 return $wplng_languages_allow;
594 } elseif ( empty( $languages_alow ) || ! is_array( $languages_alow ) ) {
595 $wplng_languages_allow = array();
596 return $wplng_languages_allow;
597 } else {
598 foreach ( $languages_alow as $language_id_alow ) {
599 $languages[] = wplng_get_language_by_id( $language_id_alow );
600 }
601
602 $wplng_languages_allow = $languages;
603 }
604
605 return $languages;
606 }
607