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

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

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