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 +186 -38 1.0.32.16.7 View file →
@@ -11,9 +11,22 @@
11 11 *
12 12 * @return array Language data
13 13 */
14 14 function wplng_get_language_website() {
15 - return wplng_get_language_by_id( wplng_get_language_website_id() );
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;
16 29 }
17 30
18 31
19 32 /**
@@ -101,8 +114,57 @@
101 114 }
102 115
103 116
104 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 +/**
105 167 * Get language ID from language ID or data
106 168 *
107 169 * @param mixed $language
108 170 * @return string Language ID
@@ -109,9 +171,11 @@
109 171 */
110 172 function wplng_get_language_id( $language ) {
111 173
112 174 // If $language is a language array
113 - if ( ! empty( $language['id'] ) && wplng_is_valid_language_id( $language['id'] ) ) {
175 + if ( ! empty( $language['id'] )
176 + && wplng_is_valid_language_id( $language['id'] )
177 + ) {
114 178 return $language['id'];
115 179 }
116 180
117 181 // If $language is a language ID, get language array
@@ -128,9 +192,9 @@
128 192
129 193 /**
130 194 * Get language name translated from language ID or data
131 195 *
132 - * @param mixed $language Language ID or data
196 + * @param mixed $language Language ID or data
133 197 * @param string $language_target Language ID
134 198 * @return string Language name translated
135 199 */
136 200 function wplng_get_language_name_translated( $language, $language_target = '' ) {
@@ -137,11 +201,10 @@
137 201
138 202 // Get target language ID
139 203 if ( empty( $language_target ) ) {
140 204 $language_target = wplng_get_language_current_id();
141 - } else {
142 - $language_target_id = wplng_get_language_id( $language_target );
143 205 }
206 + $language_target_id = wplng_get_language_id( $language_target );
144 207
145 208 // Get language array
146 209 if ( empty( $language['id'] ) ) {
147 210 $language = wplng_get_language_by_id( $language );
@@ -170,8 +233,14 @@
170 233 * @return array Languages data simplified
171 234 */
172 235 function wplng_get_languages_target_simplified() {
173 236
237 + global $wplng_languages_target_simplified;
238 +
239 + if ( null !== $wplng_languages_target_simplified ) {
240 + return $wplng_languages_target_simplified;
241 + }
242 +
174 243 $json = get_option( 'wplng_target_languages' );
175 244
176 245 if ( empty( $json ) || ! is_string( $json ) ) {
177 246 $json = '[]';
@@ -180,20 +249,38 @@
180 249 $languages_target = json_decode( $json, true );
181 250 $all_languages = wplng_get_languages_allow();
182 251 $ordered = array();
183 252
184 - foreach ( $all_languages as $language ) {
185 - foreach ( $languages_target as $language_target ) {
186 - if (
187 - ! empty( $language['id'] )
188 - && ! empty( $language_target['id'] )
189 - && $language['id'] === $language_target['id']
190 - ) {
191 - $ordered[] = $language_target;
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;
192 272 }
193 273 }
274 +
275 + // Only add if the language is found in allowed languages
276 + if ( $language_found ) {
277 + $ordered[] = $language_target;
278 + }
194 279 }
195 280
281 + $wplng_languages_target_simplified = $ordered;
282 +
196 283 return $ordered;
197 284 }
198 285
199 286
@@ -203,8 +290,14 @@
203 290 * @return array
204 291 */
205 292 function wplng_get_languages_target() {
206 293
294 + global $wplng_languages_target;
295 +
296 + if ( null !== $wplng_languages_target ) {
297 + return $wplng_languages_target;
298 + }
299 +
207 300 $languages_target = wplng_get_languages_target_simplified();
208 301 $languages_target_clear = array();
209 302
210 303 // Check each $languages_target
@@ -220,8 +313,10 @@
220 313 }
221 314 }
222 315 }
223 316
317 + $wplng_languages_target = $languages_target_clear;
318 +
224 319 return $languages_target_clear;
225 320 }
226 321
227 322
@@ -231,8 +326,14 @@
231 326 * @return array
232 327 */
233 328 function wplng_get_languages_target_ids() {
234 329
330 + global $wplng_languages_target_ids;
331 +
332 + if ( null !== $wplng_languages_target_ids ) {
333 + return $wplng_languages_target_ids;
334 + }
335 +
235 336 $languages_target = wplng_get_languages_target();
236 337 $languages_target_ids = array();
237 338
238 339 foreach ( $languages_target as $language_target ) {
@@ -238,8 +339,10 @@
238 339 foreach ( $languages_target as $language_target ) {
239 340 $languages_target_ids[] = $language_target['id'];
240 341 }
241 342
343 + $wplng_languages_target_ids = $languages_target_ids;
344 +
242 345 return $languages_target_ids;
243 346 }
244 347
245 348
@@ -249,14 +352,19 @@
249 352 * @return string
250 353 */
251 354 function wplng_get_language_current_id() {
252 355
356 + global $wplng_language_current_id;
357 +
358 + if ( null !== $wplng_language_current_id ) {
359 + return $wplng_language_current_id;
360 + }
361 +
253 362 global $wplng_request_uri;
254 363 $current_path = $wplng_request_uri;
255 364 $languages_target = wplng_get_languages_target_ids();
256 365
257 - if ( ! wplng_url_is_translatable()
258 - || empty( $current_path )
366 + if ( empty( $current_path )
259 367 || ! is_string( $current_path )
260 368 ) {
261 369 return wplng_get_language_website_id();
262 370 }
@@ -264,14 +372,19 @@
264 372 foreach ( $languages_target as $language ) {
265 373 if ( substr( $current_path, 0, 4 ) === '/' . $language . '/'
266 374 || substr( $current_path, 0, 3 ) === $language . '/'
267 375 ) {
376 +
377 + $wplng_language_current_id = $language;
378 +
268 379 return $language;
269 - break;
270 380 }
271 381 }
272 382
273 - return wplng_get_language_website_id();
383 + $website_language_id = wplng_get_language_website_id();
384 + $wplng_language_current_id = $website_language_id;
385 +
386 + return $website_language_id;
274 387 }
275 388
276 389
277 390 /**
@@ -301,9 +414,9 @@
301 414 /**
302 415 * Get language data from ID
303 416 *
304 417 * @param string $language_id
305 - * @return array
418 + * @return array|false Language data array, or false if not found
306 419 */
307 420 function wplng_get_language_by_id( $language_id ) {
308 421
309 422 $all_languages = wplng_get_languages_all();
@@ -313,9 +426,14 @@
313 426 return $language;
314 427 }
315 428 }
316 429
317 - // Return a default value if $language_id not exist
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
318 436 return wplng_get_language_by_id( 'en' );
319 437 }
320 438
321 439
@@ -334,25 +452,17 @@
334 452 ) {
335 453 return false;
336 454 }
337 455
338 - // Check if $language_id is in languages data
339 - $languages_data = wplng_data_languages();
340 - foreach ( $languages_data as $language_data ) {
341 - if ( $language_data['id'] === $language_id ) {
342 - return true;
343 - }
344 - }
345 -
346 - return false;
456 + return in_array( $language_id, wplng_data_languages_id(), true );
347 457 }
348 458
349 459
350 460 /**
351 - * Check if a list of language ID are valid
461 + * Check if a list of languages ID are valid
352 462 *
353 463 * @param array $language_id_list
354 - * @return bool
464 + * @return bool Languages ID are valid
355 465 */
356 466 function wplng_is_valid_language_ids( $language_id_list ) {
357 467
358 468 if ( ! is_array( $language_id_list ) ) {
@@ -358,12 +468,32 @@
358 468 if ( ! is_array( $language_id_list ) ) {
359 469 return false;
360 470 }
361 471
472 + $languages_data_id = wplng_data_languages_id();
473 +
362 474 foreach ( $language_id_list as $language_id ) {
363 - if ( ! wplng_is_valid_language_id( $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 + ) {
364 481 return false;
365 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 + }
366 496 }
367 497
368 498 return true;
369 499 }
@@ -375,8 +505,14 @@
375 505 * @return array
376 506 */
377 507 function wplng_get_languages_all() {
378 508
509 + global $wplng_languages_all;
510 +
511 + if ( null !== $wplng_languages_all ) {
512 + return $wplng_languages_all;
513 + }
514 +
379 515 $languages = wplng_data_languages();
380 516 $source_language = get_option( 'wplng_website_language' );
381 517 $source_flag = get_option( 'wplng_website_flag' );
382 518 $target_flags = get_option( 'wplng_target_languages' );
@@ -400,9 +536,9 @@
400 536 }
401 537
402 538 // Set custom website flag if defined
403 539 if ( ! empty( $source_language )
404 - && $language['id'] == $source_language
540 + && $language['id'] === $source_language
405 541 && ! empty( $source_flag )
406 542 ) {
407 543 $languages[ $key ]['flag'] = $source_flag;
408 544 } else {
@@ -410,9 +546,9 @@
410 546 }
411 547
412 548 // Set custom target flag if defined
413 549 foreach ( $target_flags as $target_key => $target_flag ) {
414 - if ( ! empty( $target_flag['id'] ) && $target_flag['id'] == $language['id'] ) {
550 + if ( ! empty( $target_flag['id'] ) && $target_flag['id'] === $language['id'] ) {
415 551 $languages[ $key ]['flag'] = $target_flag['flag'];
416 552 break;
417 553 }
418 554 }
@@ -429,8 +565,10 @@
429 565 $languages[ $key ]['dir'] = 'ltr';
430 566 }
431 567 }
432 568
569 + $wplng_languages_all = $languages;
570 +
433 571 return $languages;
434 572 }
435 573
436 574
@@ -440,19 +578,29 @@
440 578 * @return array
441 579 */
442 580 function wplng_get_languages_allow() {
443 581
582 + global $wplng_languages_allow;
583 +
584 + if ( null !== $wplng_languages_allow ) {
585 + return $wplng_languages_allow;
586 + }
587 +
444 588 $languages_alow = wplng_get_api_languages_target();
445 589 $languages = array();
446 590
447 591 if ( 'all' === $languages_alow ) {
448 - return wplng_get_languages_all();
592 + $wplng_languages_allow = wplng_get_languages_all();
593 + return $wplng_languages_allow;
449 594 } elseif ( empty( $languages_alow ) || ! is_array( $languages_alow ) ) {
450 - return array();
451 - }
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 + }
452 601
453 - foreach ( $languages_alow as $language_id_alow ) {
454 - $languages[] = wplng_get_language_by_id( $language_id_alow );
602 + $wplng_languages_allow = $languages;
455 603 }
456 604
457 605 return $languages;
458 606 }