PluginProbe
Translate and Go multilingual – Automatic AI translation – wpLingua / 2.16.7
Translate and Go multilingual – Automatic AI translation – wpLingua v2.16.7
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
← All changes | inc/languages.php +606 -593 2.12.12.16.7 View file →
@@ -1,593 +1,606 @@
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 -}
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 +}