PluginProbe
Translate and boost SEO – Automatic AI translation – wpLingua / 2.16.8
Translate and boost SEO – Automatic AI translation – wpLingua v2.16.8
2.16.8 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 All 113 releases
← All changes | inc/languages.php +606 -606 2.16.62.16.8 View file →
@@ -1,606 +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 - }
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 -}
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 +}