PluginProbe
Booking Calendar / 11.9
Booking Calendar v11.9
11.9 11.8.4 11.8.3 11.8.2 11.8.1 11.8 11.7 11.6.1 11.6 11.5 11.4.3 11.4.2 11.4.1 11.4 11.3 11.2.1 11.2 11.1 11.0 10.15.7 10.15.6 10.1.3 10.10 10.10.1 10.10.2 All 205 releases
← All changes | core/wpbc-translation.php +164 -135 10.1.3 → 11.9 View file →
@@ -38,12 +38,12 @@
38 38
39 39 // Get reloaded 'booking' or current WordPress locale
40 40 $locale = wpbc_get_maybe_reloaded_booking_locale(); // if NOT defined WPBC_LOCALE_RELOAD define by current WordPress locale
41 41
42 - //FixIn: 8.9.4.5
42 + // FixIn: 8.9.4.5.
43 43 if ( is_admin() && ( defined( 'DOING_AJAX' ) ) && ( DOING_AJAX ) ) {
44 44 //Reload locale for Ajax request
45 - wpbc_check_ajax_locale__reload_it( $locale ); // Contain --> if ( ! defined( 'WPBC_LOCALE_RELOAD' ) ) define( 'WPBC_LOCALE_RELOAD', esc_js( $_REQUEST['wpdev_active_locale'] ) );
45 + wpbc_check_ajax_locale__reload_it( $locale ); //
46 46 }
47 47
48 48 wpbc_load_country_list_file_php( $locale );
49 49
@@ -55,13 +55,12 @@
55 55
56 56 /**
57 57 * Check ( $_REQUEST['wpdev_active_locale'] ) and Reload specific Locale for the Ajax request
58 58 */
59 -function wpbc_check_ajax_locale__reload_it( $reloaded_locale ) { //FixIn: 8.4.5.1
59 +function wpbc_check_ajax_locale__reload_it( $reloaded_locale ) { // FixIn: 8.4.5.1.
60 60
61 - if ( ( isset( $_REQUEST['wpdev_active_locale'] ) ) || // Reload locale according request parameter
62 - ( isset( $_REQUEST['wpbc_ajx_locale'] ) )
63 - ) { // Reload locale according request parameter
61 + // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.NonceVerification.Missing
62 + if ( ( isset( $_REQUEST['wpdev_active_locale'] ) ) || ( isset( $_REQUEST['wpbc_ajx_locale'] ) ) ) { // Reload locale according request parameter.
64 63
65 64 unload_textdomain( 'booking' );
66 65
67 66 /*
@@ -66,10 +65,10 @@
66 65
67 66 /*
68 67 * Removed because, it's configured in $locale = wpbc_get_maybe_reloaded_booking_locale(); which is executed before this action
69 68 *
70 - if ( ! defined( 'WPBC_LOCALE_RELOAD' ) ) {
71 - define( 'WPBC_LOCALE_RELOAD', esc_js( $_REQUEST['wpdev_active_locale'] ) );
69 + if ( ! defined( 'WPBC_LOCALE_RELOAD' ) ) { // $
70 + define( 'WPBC_LOCALE_RELOAD', ( $_REQUEST['wpdev_active_locale'] ) );
72 71 }
73 72 */
74 73 add_filter( 'locale', 'wpbc_get_maybe_reloaded_booking_locale', 999 ); // Set filter to load the locale of the Booking Calendar
75 74
@@ -137,9 +136,9 @@
137 136 // we have long locale like en_US, get only 2 first letters, for general locale, like 'en'
138 137 $mofile_local_short = WPBC_PLUGIN_DIR . '/languages/' . $domain . '-' . substr( $locale, 0 , 2 ) . '.mo';
139 138
140 139 // Load from General folder /wp-content/languages/plugins/plugin-name-xx_XX.mo
141 - $mofile_in_wp_folder = WP_LANG_DIR . '/plugins/' . $domain . '-' . $locale . '.mo'; //FixIn: 8.9.4.6 Fix '/languages/plugin/' to '/languages/plugins/ //FixIn: 8.7.7.1
140 + $mofile_in_wp_folder = WP_LANG_DIR . '/plugins/' . $domain . '-' . $locale . '.mo'; //FixIn: 8.9.4.6 Fix '/languages/plugin/' to '/languages/plugins/ // FixIn: 8.7.7.1.
142 141
143 142
144 143 /**
145 144 * Try to load from the languages' directory first -> WP_LANG_DIR . '/plugins/' . $mofile
@@ -161,8 +160,9 @@
161 160 * load_textdomain( $domain, WPBC_PLUGIN_DIR . '/languages/' . $domain . '-' . $locale . '.mo' );
162 161 */
163 162
164 163 $plugin_rel_path = WPBC_PLUGIN_DIRNAME . '/languages';
164 + // phpcs:ignore PluginCheck.CodeAnalysis.DiscouragedFunctions.load_plugin_textdomainFound
165 165 $is_mo_loaded = load_plugin_textdomain( $domain, false, $plugin_rel_path );
166 166 }
167 167
168 168
@@ -173,11 +173,11 @@
173 173 /**
174 174 * Direct load from ../wp-content/plugins/booking/languages/booking-fr_FR.mo
175 175 */
176 176
177 - $is_mo_loaded = load_textdomain( $domain, $mofile_in_plugin_folder ); //FixIn: 8.9.4.5
177 + $is_mo_loaded = load_textdomain( $domain, $mofile_in_plugin_folder ); // FixIn: 8.9.4.5.
178 178
179 - } elseif ( ( ! empty( $mofile_local_short ) ) && ( file_exists( $mofile_local_short ) ) ) { //FixIn: 8.1.3.13
179 + } elseif ( ( ! empty( $mofile_local_short ) ) && ( file_exists( $mofile_local_short ) ) ) { // FixIn: 8.1.3.13.
180 180
181 181 /**
182 182 * Direct load of short " booking-en.mo " MO file
183 183 */
@@ -183,9 +183,9 @@
183 183 */
184 184
185 185 $is_mo_loaded = load_textdomain( $domain, $mofile_local_short );
186 186
187 - } elseif ( file_exists( $mofile_in_wp_folder ) ) { //FixIn: 8.9.4.6
187 + } elseif ( file_exists( $mofile_in_wp_folder ) ) { // FixIn: 8.9.4.6.
188 188
189 189 /**
190 190 * Here possible to use
191 191 * return load_plugin_textdomain( $domain, false, $plugin_rel_path );
@@ -198,9 +198,9 @@
198 198 * so that's why we are using direct loadinf: load_textdomain( $domain, $mofile_in_wp_folder ) ../wp-content/languages/plugin/booking-fr_FR.mo
199 199 */
200 200
201 201 $is_mo_loaded = load_textdomain( $domain, $mofile_in_wp_folder );
202 - } else { //FixIn: 7.2.1.21
202 + } else { // FixIn: 7.2.1.21.
203 203
204 204 $is_unloaded = unload_textdomain( $domain );
205 205 }
206 206 }
@@ -214,25 +214,44 @@
214 214 * Load Country List file depends on plugin 'booking' locale
215 215 *
216 216 * @string $locale '' || 'en_US' || 'it_IT'
217 217 */
218 -function wpbc_load_country_list_file_php( $locale ){ //FixIn: 8.8.2.5
218 +function wpbc_load_country_list_file_php( $locale ){ // FixIn: 8.8.2.5.
219 219
220 - if ( ! empty( $locale ) ) {
221 - $locale_lang = strtolower( substr( $locale, 0, 2 ) );
222 - $locale_country = strtolower( substr( $locale, 3 ) );
220 + require_once WPBC_PLUGIN_DIR . '/core/lang/wpdev-country-list.php';
223 221
224 - //FixIn: 8.9.4.12
225 - if ( ( $locale_lang !== 'en' ) && ( wpbc_is_file_exist( '/core/lang/wpdev-country-list-' . $locale . '.php' ) ) ) {
226 - require_once WPBC_PLUGIN_DIR . '/core/lang/wpdev-country-list-' . $locale . '.php';
227 - } else {
228 - require_once WPBC_PLUGIN_DIR . '/core/lang/wpdev-country-list.php';
229 - }
230 - } else {
231 - require_once WPBC_PLUGIN_DIR . '/core/lang/wpdev-country-list.php';
222 + do_action( 'wpbc_country_list_loaded' ); // FixIn: 8.9.4.9.
223 +}
224 +
225 +
226 +/**
227 + * Validate a locale received from a request.
228 + *
229 + * Locale values are used request-wide and can later be rendered inside JavaScript and HTML attributes. Accept only
230 + * ASCII locale identifiers, such as "en", "en_US", "de_DE_formal", or "en-US". Invalid values must be rejected
231 + * instead of sanitized into a different value. // FixIn: 11.4.3.2.
232 + *
233 + * @param mixed $locale Locale value from the request.
234 + *
235 + * @return string|false Valid locale, or false when the value is invalid.
236 + */
237 +function wpbc_validate_request_locale( $locale ) {
238 +
239 + if ( ! is_string( $locale ) ) {
240 + return false;
232 241 }
233 242
234 - do_action( 'wpbc_country_list_loaded' ); //FixIn: 8.9.4.9
243 + $locale = wp_unslash( $locale );
244 +
245 + if (
246 + ( '' === $locale )
247 + || ( strlen( $locale ) > 32 )
248 + || ( 1 !== preg_match( '/\A[A-Za-z0-9]+(?:[_-][A-Za-z0-9]+)*\z/D', $locale ) )
249 + ) {
250 + return false;
251 + }
252 +
253 + return $locale;
235 254 }
236 255
237 256
238 257 /**
@@ -251,19 +270,19 @@
251 270
252 271 /**
253 272 * Check active locale in some other translation plugins, like Polylang (NOT in Ajax), etc...
254 273 */
255 - if ( ! $is_ajax ) { //FixIn: 8.9.4.7
274 + if ( ! $is_ajax ) { // FixIn: 8.9.4.7.
256 275
257 276 // Exception for Polylang plugin. It will force loading locale of Polylang plugin.
258 - if ( function_exists( 'pll_current_language' ) ) { //FixIn: 8.1.2.5
259 - if ( defined( 'POLYLANG_VERSION' ) ) { //FixIn: 8.8.3.16
277 + if ( function_exists( 'pll_current_language' ) ) { // FixIn: 8.1.2.5.
278 + if ( defined( 'POLYLANG_VERSION' ) ) { // FixIn: 8.8.3.16.
260 279 if (
261 - ( version_compare( POLYLANG_VERSION, '2.6.5', '<' ) ) //FixIn: 8.7.1.3
262 - || ( version_compare( POLYLANG_VERSION, '2.7.1', '>' ) ) //FixIn: 8.7.7.11
280 + ( version_compare( POLYLANG_VERSION, '2.6.5', '<' ) ) // FixIn: 8.7.1.3.
281 + || ( version_compare( POLYLANG_VERSION, '2.7.1', '>' ) ) // FixIn: 8.7.7.11.
263 282 ) {
264 283 $locale = pll_current_language( 'locale' );
265 - if ( ! empty( $locale ) ) { //FixIn: 8.7.7.11
284 + if ( ! empty( $locale ) ) { // FixIn: 8.7.7.11.
266 285 return $locale;
267 286 }
268 287 }
269 288 }
@@ -270,13 +289,17 @@
270 289 }
271 290 }
272 291
273 292 $wpbc_ajx_locale = false;
293 + // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.NonceVerification.Missing
274 294 if ( isset( $_REQUEST['wpdev_active_locale'] ) ) {
275 - $wpbc_ajx_locale = esc_js( $_REQUEST['wpdev_active_locale'] );
295 + // phpcs:ignore WordPress.Security.NonceVerification.Recommended
296 + $wpbc_ajx_locale = wpbc_validate_request_locale( $_REQUEST['wpdev_active_locale'] );
276 297 }
298 + // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.NonceVerification.Missing
277 299 if ( isset( $_REQUEST['wpbc_ajx_locale'] ) ) {
278 - $wpbc_ajx_locale = esc_js( $_REQUEST['wpbc_ajx_locale'] );
300 + // phpcs:ignore WordPress.Security.NonceVerification.Recommended
301 + $wpbc_ajx_locale = wpbc_validate_request_locale( $_REQUEST['wpbc_ajx_locale'] );
279 302 }
280 303
281 304 // Reload locale ONLY in AJAX, and if `isset $_REQUEST['wpdev_active_locale']
282 305 if (
@@ -285,10 +308,10 @@
285 308 ){
286 309 if (
287 310 ( $is_ajax )
288 311 || (
289 - ( isset( $_REQUEST['wpbc_ajx_locale_reload'] ) )
290 - && ( 'force' == $_REQUEST['wpbc_ajx_locale_reload'] )
312 + // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.NonceVerification.Missing
313 + ( isset( $_REQUEST['wpbc_ajx_locale_reload'] ) ) && ( 'force' == $_REQUEST['wpbc_ajx_locale_reload'] )
291 314 )
292 315 ) { // Reload locale according request parameter
293 316 define( 'WPBC_LOCALE_RELOAD', $wpbc_ajx_locale );
294 317 }
@@ -296,9 +319,9 @@
296 319
297 320
298 321
299 322 // If not defined than get current WordPress locale and define
300 - if ( ! defined( 'WPBC_LOCALE_RELOAD' ) ) { //FixIn: 7.2.1.21
323 + if ( ! defined( 'WPBC_LOCALE_RELOAD' ) ) { // FixIn: 7.2.1.21.
301 324
302 325 $locale = wpbc_get_current_wordpress_locale(); // 'en_US' or 'it_IT', etc...
303 326
304 327 define( 'WPBC_LOCALE_RELOAD', $locale );
@@ -318,9 +341,9 @@
318 341 * @return string 'en_US'
319 342 */
320 343 function wpbc_get_current_wordpress_locale(){
321 344
322 - if ( function_exists( 'determine_locale' ) ) { //FixIn: 8.7.5.1 //FixIn: 8.7.3.15
345 + if ( function_exists( 'determine_locale' ) ) { //FixIn: 8.7.5.1 // FixIn: 8.7.3.15.
323 346 $current_locale = determine_locale();
324 347 } else {
325 348 if ( function_exists( 'get_user_locale' ) ) {
326 349 $current_locale = is_admin() ? get_user_locale() : get_locale();
@@ -344,9 +367,9 @@
344 367 * @param string $plugin_domain 'booking' - it's Booking Calendar plugin locale
345 368 *
346 369 * @return mixed|string 'it_IT'
347 370 */
348 -function wpbc_filter_recheck_plugin_locale( $locale, $plugin_domain = '' ) { //FixIn: 8.4.4.2
371 +function wpbc_filter_recheck_plugin_locale( $locale, $plugin_domain = '' ) { // FixIn: 8.4.4.2.
349 372
350 373 if (
351 374 ( 'booking' == $plugin_domain )
352 375 && ( defined( 'WPBC_LOCALE_RELOAD' ) )
@@ -384,13 +407,13 @@
384 407 /// Support functions for [lang=xx_XX] shortcode
385 408 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
386 409
387 410 /**
388 - * Translate content. Check for language sections -- [lang=xx_XX] shortcode. //FixIn: 10.0.0.46
411 + * Translate content. Check for language sections -- [lang=xx_XX] shortcode. // FixIn: 10.0.0.46.
389 412 *
390 - * @param $content_orig
413 + * @param mixed $content_orig Content containing optional language sections.
391 414 *
392 - * @return string
415 + * @return string Translated content, or an empty string for unsupported values.
393 416 */
394 417 function wpbc_lang( $content_orig ) {
395 418 return wpdev_check_for_active_language( $content_orig );
396 419 }
@@ -398,23 +421,31 @@
398 421
399 422 /**
400 423 * Check plugin text for active language section -- [lang=xx_XX] shortcode
401 424 *
402 - * @param string $content_orig
403 - * @return string
425 + * @param mixed $content_orig Content containing optional language sections.
426 + * @return string Translated content, or an empty string for unsupported values.
404 427 * Usage:
405 428 * $text = wpbc_lang( $text );
406 429 */
407 -function wpdev_check_for_active_language( $content_orig ) {
430 +function wpdev_check_for_active_language( $content_orig ) { // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedFunctionFound
408 431
409 - $content = $content_orig;
432 + if ( is_string( $content_orig ) ) {
433 + $content = $content_orig;
434 + } elseif ( is_scalar( $content_orig ) ) {
435 + $content = (string) $content_orig;
436 + } elseif ( is_object( $content_orig ) && method_exists( $content_orig, '__toString' ) ) {
437 + $content = (string) $content_orig;
438 + } else {
439 + return '';
440 + }
410 441
411 - $languages = array();
412 - $content_ex = explode('[lang',$content);
442 + $languages = array();
443 + $content_ex = explode( '[lang', $content );
413 444
414 445 foreach ( $content_ex as $value ) {
415 446
416 - if ( '=' == substr( $value, 0, 1 ) ) {
447 + if ( '=' === substr( $value, 0, 1 ) ) {
417 448
418 449 $pos_s = strpos( $value, '=' );
419 450 $pos_f = strpos( $value, ']' );
420 451 $key = trim( substr( $value, ( $pos_s + 1 ), ( $pos_f - $pos_s - 1 ) ) );
@@ -425,9 +456,9 @@
425 456 $languages['default'] = $value;
426 457 }
427 458 }
428 459
429 - $locale = wpbc_get_maybe_reloaded_booking_locale(); // $locale = 'fr_FR';
460 + $locale = wpbc_get_maybe_reloaded_booking_locale(); // $locale = 'fr_FR'.
430 461
431 462 if ( isset( $languages[ $locale ] ) ) {
432 463 $return_text = $languages[ $locale ];
433 464 } else {
@@ -434,9 +465,9 @@
434 465 $return_text = $languages['default'];
435 466 }
436 467
437 468 $return_text = wpbc_bk_check_qtranslate( $return_text, $locale );
438 - $return_text = wpbc_check_wpml_tags( $return_text, $locale ); //FixIn: 5.4.5.8
469 + $return_text = wpbc_check_wpml_tags( $return_text, $locale ); // FixIn: 5.4.5.8.
439 470
440 471 return $return_text;
441 472 }
442 473
@@ -448,12 +479,15 @@
448 479 */
449 480 function wpbc_get_help_rows_about_config_in_several_languges() {
450 481
451 482 $field_options = array();
452 - $field_options[] = '<strong>' . __('Configuration in several languages' ,'booking') . '</strong>';
453 - $field_options[] = sprintf(__('%s - start new translation section, where %s - locale of translation' ,'booking'),'<code>[lang=LOCALE]</code>','<code>LOCALE</code>');
454 - $field_options[] = sprintf(__('Example #1: %s - start French translation section' ,'booking'),'<code>[lang=fr_FR]</code>');
455 - $field_options[] = sprintf(__('Example #2: "%s" - English and French translation of some message' ,'booking'),'<code>Thank you for your booking.[lang=fr_FR]Je vous remercie de votre reservation.</code>');
483 + $field_options[] = '<strong>' . esc_html__('Configuration in several languages' ,'booking') . '</strong>';
484 + /* translators: 1: ... */
485 + $field_options[] = sprintf( __( '%1$s - start new translation section, where %2$s - locale of translation', 'booking' ),'<code>[lang=LOCALE]</code>','<code>LOCALE</code>');
486 + /* translators: 1: ... */
487 + $field_options[] = sprintf(__( 'Example #1: %s - start French translation section' ,'booking'),'<code>[lang=fr_FR]</code>');
488 + /* translators: 1: ... */
489 + $field_options[] = sprintf(__( 'Example #2: "%s" - English and French translation of some message' ,'booking'),'<code>Thank you for your booking.[lang=fr_FR]Je vous remercie de votre reservation.</code>');
456 490
457 491 return $field_options;
458 492 }
459 493
@@ -470,9 +504,9 @@
470 504 * @param string $locale
471 505 *
472 506 * @return string
473 507 */
474 -function wpbc_check_wpml_tags( $text, $locale='' ) { //FixIn: 5.4.5.8
508 +function wpbc_check_wpml_tags( $text, $locale='' ) { // FixIn: 5.4.5.8.
475 509
476 510 if ( $locale == '' ) {
477 511 $locale = wpbc_get_maybe_reloaded_booking_locale();
478 512 }
@@ -512,8 +546,9 @@
512 546 } else { // WPML Version: 3.2
513 547
514 548 // Help info: do_action( 'wpml_register_single_string', string $context, string $name, string $value )
515 549 // https://wpml.org/wpml-hook/wpml_register_string_for_translation/
550 + // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound
516 551 do_action( 'wpml_register_single_string', 'Booking Calendar', 'wpbc-' . tag_escape( $translation_to_check ) , $translation_to_check );
517 552
518 553
519 554 // Help info: apply_filters( 'wpml_translate_single_string', string $original_value, string $context, string $name, string $$language_code )
@@ -519,8 +554,9 @@
519 554 // Help info: apply_filters( 'wpml_translate_single_string', string $original_value, string $context, string $name, string $$language_code )
520 555 // https://wpml.org/wpml-hook/wpml_translate_single_string/
521 556 //$translation_to_check = apply_filters( 'wpml_translate_single_string', $translation_to_check, 'Booking Calendar', 'wpbc-' . tag_escape( $translation_to_check ) );
522 557 $language_code = $locale;
558 + // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound
523 559 $translation_to_check = apply_filters( 'wpml_translate_single_string', $translation_to_check, 'Booking Calendar', 'wpbc-' . tag_escape( $translation_to_check ), $language_code );
524 560
525 561 }
526 562 }
@@ -577,28 +613,23 @@
577 613
578 614 echo
579 615 '<a class="button button tooltip_top"
580 616 data-original-title="'
617 + /* translators: 1: ... */
581 618 . esc_attr( sprintf( __( 'Download translation PO files from %s and update the current translation version.', 'booking' ), 'wp.org / wpbookingcalendar.com' ) )
582 619 . '" href="'
583 - . wpbc_get_settings_url()
584 - . '&system_info=show&_wpnonce='. wp_create_nonce( 'wpbc_settings_url_nonce' ) .'&update_translations=1#wpbc_general_settings_system_info_metabox">'
585 - . __( 'Update Translations' )
620 + . esc_url( wpbc_get_settings_url()
621 + . '&system_info=show&_wpnonce='. wp_create_nonce( 'wpbc_settings_url_nonce' ) ) .'&update_translations=1#wpbc_general_settings_system_info_metabox">'
622 + . esc_html__( 'Update Translations', 'booking' )
586 623 . '</a>';
587 624
588 - echo
589 - '<a class="button button tooltip_top"
590 - data-original-title="'
591 - . esc_attr( __( 'Show exist translations status', 'booking' ) )
592 - . '"
593 - href="'
594 - . wpbc_get_settings_url()
595 - . '&system_info=show&_wpnonce='. wp_create_nonce( 'wpbc_settings_url_nonce' ) .'&show_translation_status=1#wpbc_general_settings_system_info_metabox">'
596 - . __( 'Show translations status', 'booking' )
597 - . '</a>';
625 + echo '<a class="button button tooltip_top"
626 + data-original-title="' . esc_attr( __( 'Show exist translations status', 'booking' ) ) . '"
627 + href="' . esc_url( wpbc_get_settings_url() . '&system_info=show&_wpnonce=' . wp_create_nonce( 'wpbc_settings_url_nonce' ) ) . '&show_translation_status=1#wpbc_general_settings_system_info_metabox">' .
628 + esc_html( __( 'Show translations status', 'booking' ) ) . '</a>';
598 629
599 630
600 - if ( $_SERVER['HTTP_HOST'] === 'beta' ) {
631 + if ( ( isset( $_SERVER['HTTP_HOST'] ) ) && ( 'beta' === $_SERVER['HTTP_HOST'] ) ) {
601 632
602 633 ?><div style="width:100%;height:2em;border-bottom:1px dashed #777;margin-bottom:1em;"></div><?php
603 634
604 635 // Link: http://server.com/wp-admin/admin.php?page=wpbc-settings&system_info=show&pot=1#wpbc_general_settings_system_info_metabox
@@ -605,10 +636,10 @@
605 636 echo
606 637 '<a class="button button-secondary tooltip_top"
607 638 data-original-title="Delete wpbc_all_translations(*).php files, before Updating POT file (manually)"
608 639 style="background:#fff9e6;" href="'
609 - . wpbc_get_settings_url()
610 - . '&system_info=show&_wpnonce='. wp_create_nonce( 'wpbc_settings_url_nonce' ) .'&pot=erase__wpbc_all_translations#wpbc_general_settings_system_info_metabox">'
640 + . esc_url( wpbc_get_settings_url()
641 + . '&system_info=show&_wpnonce='. wp_create_nonce( 'wpbc_settings_url_nonce' ) ) .'&pot=erase__wpbc_all_translations#wpbc_general_settings_system_info_metabox">'
611 642 . '1. Erase Translation PHP files'
612 643 . '</a>';
613 644 echo
614 645 '<a class="button button-secondary tooltip_top"
@@ -614,20 +645,20 @@
614 645 '<a class="button button-secondary tooltip_top"
615 646 data-original-title="Create or update wpbc_all_translations(*).php files, from actual POT file"
616 647 style="background:#fff9e6;"
617 648 href="'
618 - . wpbc_get_settings_url()
619 - . '&system_info=show&_wpnonce='. wp_create_nonce( 'wpbc_settings_url_nonce' ) .'&pot=1#wpbc_general_settings_system_info_metabox">'
649 + . esc_url( wpbc_get_settings_url()
650 + . '&system_info=show&_wpnonce='. wp_create_nonce( 'wpbc_settings_url_nonce' ) ) .'&pot=1#wpbc_general_settings_system_info_metabox">'
620 651 . '2. Generate Translation PHP from POT file'
621 652 . '</a>';
622 653
623 654 echo
624 655 '<a class="button button-secondary tooltip_top"
625 - data-original-title="Just show WP.ORG translation status from ' . WP_LANG_DIR . '/plugins/' . ' "
656 + data-original-title="Just show WP.ORG translation status from ' . esc_attr( WP_LANG_DIR ) . '/plugins/' . ' "
626 657 style="background:#fff9e6;"
627 658 href="'
628 - . wpbc_get_settings_url()
629 - . '&system_info=show&_wpnonce='. wp_create_nonce( 'wpbc_settings_url_nonce' ) .'&show_translation_status=2#wpbc_general_settings_system_info_metabox">'
659 + . esc_url( wpbc_get_settings_url()
660 + . '&system_info=show&_wpnonce='. wp_create_nonce( 'wpbc_settings_url_nonce' ) ) .'&show_translation_status=2#wpbc_general_settings_system_info_metabox">'
630 661 . 'Translation status WP.ORG'
631 662 . '</a>';
632 663
633 664
@@ -632,13 +663,13 @@
632 663
633 664
634 665 echo
635 666 '<a class="button button-secondary tooltip_top"
636 - data-original-title="Just show LOCAL translation status from ' . WPBC_PLUGIN_DIR . '/languages/' . ' "
667 + data-original-title="Just show LOCAL translation status from ' . esc_attr( WPBC_PLUGIN_DIR ) . '/languages/' . ' "
637 668 style="background:#fff9e6;"
638 669 href="'
639 - . wpbc_get_settings_url()
640 - . '&system_info=show&_wpnonce='. wp_create_nonce( 'wpbc_settings_url_nonce' ) .'&show_translation_status=3#wpbc_general_settings_system_info_metabox">'
670 + . esc_url( wpbc_get_settings_url()
671 + . '&system_info=show&_wpnonce='. wp_create_nonce( 'wpbc_settings_url_nonce' ) ) .'&show_translation_status=3#wpbc_general_settings_system_info_metabox">'
641 672 . 'Translation status WPBC'
642 673 . '</a>';
643 674 }
644 675
@@ -647,57 +678,49 @@
647 678 }
648 679 }
649 680
650 681
682 +// ======================================================================================================================
683 +// Update Translations -- DOWNLOAD from WP.ORG and WPBC
684 +// ======================================================================================================================
651 685
652 686
653 -//======================================================================================================================
654 -// Update Translations -- DOWNLOAD from WP.ORG and WPBC
655 -//======================================================================================================================
656 -
657 -
658 -
659 -
660 687 /**
661 688 * Update transaltions of plugin from WP repository
662 689 */
663 -function wpbc_update_translations__from_wp(){
690 +function wpbc_update_translations__from_wp() {
664 691
665 - echo '<h2>' . __('Start updating translation files', 'booking') . '</h2>';
692 + echo '<h2>' . esc_html__( 'Start updating translation files', 'booking' ) . '</h2>';
693 + WPBC_Action_Scheduler_Compatibility::raise_memory_limit();
694 + WPBC_Action_Scheduler_Compatibility::raise_time_limit( 300 );
666 695
667 - if ( function_exists( 'set_time_limit' ) ) { set_time_limit( 900 ); }
668 - @ini_set('memory_limit','256M');
669 - @ini_set('max_execution_time', 300);
670 -
671 696 $wpbc_download_result = false;
672 697 if ( 'translations_updated_from_wpbc' !== get_bk_option( 'booking_translation_update_status' ) ) {
673 -
674 698 $wpbc_download_result = wpbc_translation_download_from_wpbc();
675 -
676 699 }
677 700 if ( ( ! is_wp_error( $wpbc_download_result ) ) && ( false !== $wpbc_download_result ) ) {
678 701 update_bk_option( 'booking_translation_update_status', 'translations_updated_from_wpbc' );
679 702 }
680 703
704 + $wp_org_translation_packages_arr = wpbc_get_translation_packages_arr_from_wp();
705 + /**
706 + * ..., array ( [language] => sk_SK
707 + * [version] => 8.9.3
708 + * [updated] => 2020-03-11 17:10:35
709 + * [english_name] => Slovak
710 + * [native_name] => Slovenčina
711 + * [package] => https://downloads.wordpress.org/translation/plugin/booking/8.9.3/sk_SK.zip
712 + * [iso] => Array ( [1] => sk, [2] => slk )
713 + * ),
714 + * ...
715 + */
681 716
682 - $wp_org_translation_packages_arr = wpbc_get_translation_packages_arr_from_wp(); /**
683 - * ..., array ( [language] => sk_SK
684 - [version] => 8.9.3
685 - [updated] => 2020-03-11 17:10:35
686 - [english_name] => Slovak
687 - [native_name] => Slovenčina
688 - [package] => https://downloads.wordpress.org/translation/plugin/booking/8.9.3/sk_SK.zip
689 - [iso] => Array ( [1] => sk, [2] => slk )
690 - ),
691 - * ...
692 - */
693 -
694 717 $download_result_arr = wpbc_transaltion_download_from_wp_org( $wp_org_translation_packages_arr );
695 718
696 - echo '<h2>' . __('End updating translation files', 'booking') . '</h2>';
697 - echo '<a class="button button-secondary" style="margin:10px 0;" href="' . wpbc_get_settings_url() . '" >' . __( 'Go to Settings', 'booking' ) . '</a>';
719 + echo '<h2>' . esc_html__( 'End updating translation files', 'booking' ) . '</h2>';
720 + echo '<a class="button button-secondary" style="margin:10px 0;" href="' . esc_url( wpbc_get_settings_url() ) . '" >' . esc_html__( 'Go to Settings', 'booking' ) . '</a>';
698 721
699 - update_bk_option( 'booking_translation_update_status' , 'translations_updated_from_wpbc_and_wp');
722 + update_bk_option( 'booking_translation_update_status', 'translations_updated_from_wpbc_and_wp' );
700 723 }
701 724
702 725
703 726 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -748,13 +771,15 @@
748 771
749 772 /**
750 773 * Download translations from wpbookingcalendar.com, unpack it to the ../WPBC_PLUGIN_DIR/languages/' folder
751 774 *
775 + * @param WP_Upgrader_Skin|null $skin Optional authorized upgrader skin.
776 + *
752 777 * @return array|bool|string|WP_Error - result
753 778 */
754 - function wpbc_translation_download_from_wpbc(){
779 + function wpbc_translation_download_from_wpbc( $skin = null ){
755 780
756 - $my_upgrader = wpbc_get_translation_upgrader_obj();
781 + $my_upgrader = wpbc_get_translation_upgrader_obj( $skin );
757 782
758 783 $result = $my_upgrader->run( array(
759 784 'package' => 'https://wpbookingcalendar.com/download/languages/languages.zip', // Please always pass this.
760 785 'destination' => WPBC_PLUGIN_DIR . '/languages/', // WPBC_PLUGIN_DIR . '/lang/', // ...and this.
@@ -771,11 +796,13 @@
771 796
772 797 /**
773 798 * Get translation Upgrader object
774 799 *
800 + * @param WP_Upgrader_Skin|null $skin Optional authorized upgrader skin.
801 + *
775 802 * @return WP_Upgrader obj
776 803 */
777 - function wpbc_get_translation_upgrader_obj(){
804 + function wpbc_get_translation_upgrader_obj( $skin = null ){
778 805
779 806 require_once ABSPATH . 'wp-admin/includes/file.php';
780 807 require_once ABSPATH . 'wp-admin/includes/plugin.php';
781 808 require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
@@ -781,11 +808,13 @@
781 808 require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
782 809 require_once ABSPATH . 'wp-admin/includes/plugin-install.php';
783 810
784 811 require_once WPBC_PLUGIN_DIR . '/core/class/wpbc-class-upgrader-translation-skin.php';
785 - $skin = new WPBC_Upgrader_Translation_Skin(
786 - array( 'skip_header_footer' => true )
787 - );
812 + if ( ! ( $skin instanceof WP_Upgrader_Skin ) ) {
813 + $skin = new WPBC_Upgrader_Translation_Skin(
814 + array( 'skip_header_footer' => true )
815 + );
816 + }
788 817
789 818 $my_upgrader = new WP_Upgrader( $skin );
790 819
791 820 $my_upgrader->init(); // it's required for defining skin messages
@@ -815,9 +844,9 @@
815 844 if ( ! is_admin() ) {
816 845 return $translations_arr;
817 846 }
818 847
819 - require_once( ABSPATH . 'wp-admin/includes/translation-install.php' );
848 + require_once ABSPATH . 'wp-admin/includes/translation-install.php';
820 849
821 850 $api = translations_api( 'plugins', array(
822 851 'slug' => 'booking',
823 852 'version' => WP_BK_VERSION_NUM, //'8.9.3',
@@ -840,11 +869,10 @@
840 869
841 870
842 871 function wpbc_show_translation_status_compare_wpbc_wp( ) {
843 872
844 - if ( function_exists( 'set_time_limit' ) ) { set_time_limit( 900 ); }
845 - @ini_set('memory_limit','256M');
846 - @ini_set('max_execution_time', 300);
873 + WPBC_Action_Scheduler_Compatibility::raise_memory_limit();
874 + WPBC_Action_Scheduler_Compatibility::raise_time_limit( 300 );
847 875
848 876 $params = array(
849 877 'sort_field_name' => 'locale'
850 878 , 'sort_order' => SORT_ASC
@@ -987,9 +1015,9 @@
987 1015 //////////////////////////////////////////////////////////////////////////////////
988 1016
989 1017 wpbc_show_message_in_settings( $translation_message, 'info' );
990 1018
991 - echo '<a class="button button-secondary" style="margin:10px 0;" href="' . wpbc_get_settings_url() . '" >' . __( 'Go to Settings', 'booking' ) . '</a>';
1019 + echo '<a class="button button-secondary" style="margin:10px 0;" href="' . esc_url( wpbc_get_settings_url() ) . '" >' . esc_html__( 'Go to Settings', 'booking' ) . '</a>';
992 1020 }
993 1021
994 1022 /**
995 1023 * Get or Show translation statuses from "WP_LANG_DIR" folder at Booking > Settings General page
@@ -1096,9 +1124,9 @@
1096 1124 }
1097 1125
1098 1126 wpbc_show_message_in_settings( $translation_message, 'info' );
1099 1127
1100 - echo '<a class="button button-secondary" style="margin:10px 0;" href="' . wpbc_get_settings_url() . '" >' . __( 'Go to Settings', 'booking' ) . '</a>';
1128 + echo '<a class="button button-secondary" style="margin:10px 0;" href="' . esc_url( wpbc_get_settings_url() ) . '" >' . esc_html__( 'Go to Settings', 'booking' ) . '</a>';
1101 1129 }
1102 1130
1103 1131 return $translation_status_arr;
1104 1132 }
@@ -1191,9 +1219,9 @@
1191 1219 //////////////////////////////////////////////////////////////////////////////////
1192 1220
1193 1221 wpbc_show_message_in_settings( $translation_message, 'info' );
1194 1222
1195 - echo '<a class="button button-secondary" style="margin:10px 0;" href="' . wpbc_get_settings_url() . '" >' . __( 'Go to Settings', 'booking' ) . '</a>';
1223 + echo '<a class="button button-secondary" style="margin:10px 0;" href="' . esc_url( wpbc_get_settings_url() ) . '" >' . esc_html__( 'Go to Settings', 'booking' ) . '</a>';
1196 1224 }
1197 1225
1198 1226 return $translation_status_arr;
1199 1227 }
@@ -1216,9 +1244,9 @@
1216 1244 */
1217 1245 function wpbc_get_available_language_locales_from_wp_org_api(){
1218 1246
1219 1247 // Get Language names for all Locales
1220 - require_once( ABSPATH . 'wp-admin/includes/translation-install.php' );
1248 + require_once ABSPATH . 'wp-admin/includes/translation-install.php';
1221 1249 /**
1222 1250 * Array( ["nl_NL"] => array ( language = "nl_NL"
1223 1251 version = "5.9"
1224 1252 updated = "2022-02-10 16:24:09"
@@ -1430,9 +1458,9 @@
1430 1458 * Load translation POT file, and generate PHP file with all translations relative to plugin.
1431 1459 * Link: http://server.com/wp-admin/admin.php?page=wpbc-settings&system_info=show&pot=1#wpbc_general_settings_system_info_metabox
1432 1460 */
1433 1461 function wpbc_pot_to_php() {
1434 -
1462 + return;
1435 1463 /*
1436 1464 * $shortcode = 'wpml';
1437 1465
1438 1466 // Find anything between [wpml] and [/wpml] shortcodes. Magic here: [\s\S]*? - fit to any text
@@ -1461,9 +1489,9 @@
1461 1489 $po->import_from_file( $pot_file );
1462 1490
1463 1491 wpbc_show_message_in_settings( 'Found <strong>' . count($po->entries) . '</strong> translations' , 'info' );
1464 1492
1465 - //FixIn: 8.7.3.6
1493 + // FixIn: 8.7.3.6.
1466 1494 $translation_files = array();
1467 1495
1468 1496
1469 1497 // Generate content of the file
@@ -1473,9 +1501,9 @@
1473 1501 $all_translations = '';
1474 1502 foreach ( $po->entries as $transaltion => $transaltion_obj ) {
1475 1503
1476 1504 $transaltion = str_replace( "'", "\'", $transaltion );
1477 - $all_translations .= ' $wpbc_all_translations[] = __(\''. $transaltion .'\', \'booking\'); ' . "\n";
1505 + $all_translations .= ' $wpbc_all_translations[] = __(\''. $transaltion .'\', \'booking\'); /* translators: 1: ... */ ' . "\n";
1478 1506 $lines_number++;
1479 1507
1480 1508 // Maximum number of lines in such files
1481 1509 if ( $lines_number >= 998 ) {
@@ -1497,10 +1525,10 @@
1497 1525
1498 1526 foreach ( $translation_files as $file_number => $file_content ) {
1499 1527
1500 1528 // Path to new PHP file with all
1501 - $new_php_file = WP_PLUGIN_DIR . '/' . trim( WPBC_PLUGIN_DIRNAME . '/core/lang/wpbc_all_translations' . ( ( ! empty( $file_number ) ) ? $file_number : '' ) . '.php', '/' ); //FixIn: 8.9.4.12
1502 -
1529 + $new_php_file = WP_PLUGIN_DIR . '/' . trim( WPBC_PLUGIN_DIRNAME . '/core/lang/wpbc_all_translations' . ( ( ! empty( $file_number ) ) ? $file_number : '' ) . '.php', '/' ); // FixIn: 8.9.4.12.
1530 + // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_fopen
1503 1531 $fh = fopen( $new_php_file, 'w' );
1504 1532 if ( false === $fh ) {
1505 1533 wpbc_show_message_in_settings( 'Can not create or edit PHP file: ' . $new_php_file, 'error' );
1506 1534
@@ -1505,8 +1533,9 @@
1505 1533 wpbc_show_message_in_settings( 'Can not create or edit PHP file: ' . $new_php_file, 'error' );
1506 1534
1507 1535 return false;
1508 1536 }
1537 + // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_fwrite
1509 1538 $res = fwrite( $fh, $file_content );
1510 1539 if ( false === $res ) {
1511 1540 wpbc_show_message_in_settings( 'Some error during saving data into file ' . $new_php_file, 'error' );
1512 1541
@@ -1511,14 +1540,15 @@
1511 1540 wpbc_show_message_in_settings( 'Some error during saving data into file ' . $new_php_file, 'error' );
1512 1541
1513 1542 return false;
1514 1543 }
1544 + // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_fclose
1515 1545 $res = fclose( $fh );
1516 1546
1517 1547 wpbc_show_message_in_settings( 'Completed! [ ' . htmlentities( $new_php_file ) . ' ]', 'info' );
1518 1548 }
1519 1549
1520 - echo '<a class="button button-secondary" style="margin:10px 0;" href="' . wpbc_get_settings_url() . '" >' . __( 'Go to Settings', 'booking' ) . '</a>';
1550 + echo '<a class="button button-secondary" style="margin:10px 0;" href="' . esc_url( wpbc_get_settings_url() ) . '" >' . esc_html__( 'Go to Settings', 'booking' ) . '</a>';
1521 1551
1522 1552 return $res;
1523 1553
1524 1554 } else {
@@ -1567,14 +1597,13 @@
1567 1597 foreach ( $path_arr as $path ) {
1568 1598
1569 1599 if ( file_exists( $path ) ) {
1570 1600 if ( is_file( $path ) ) {
1571 - if ( ! unlink( $path ) ) {
1572 - throw new \RuntimeException( "Failed to unlink {$path}: " . var_export( error_get_last(), true ) );
1601 + if ( ! wp_delete_file( $path ) ) {
1602 + throw new \RuntimeException( 'Failed to unlink ' . esc_html( $path ) . ': ' . var_export( error_get_last(), true ) ); // phpcs:ignore WordPress.Security.EscapeOutput.ExceptionNotEscaped, WordPress.PHP.DevelopmentFunctions.error_log_var_export
1573 1603 } else {
1574 - echo '<p style="color:red;">Deleted: ' . $path . '</p>';
1604 + echo '<p style="color:red;">Deleted: ' . esc_html( $path ) . '</p>';
1575 1605 }
1576 -
1577 1606 }
1578 1607 }
1579 1608 }
1580 1609 }
@@ -1581,9 +1610,9 @@
1581 1610
1582 1611
1583 1612 // $translation = apply_filters( "gettext_{$domain}", $translation, $text, $domain );
1584 1613
1585 -//FixIn: 9.1.3.2
1614 +// FixIn: 9.1.3.2.
1586 1615 /**
1587 1616 * Check consistency of translations. For situations, when translators made mistakes with missed symbols like %s or additional items
1588 1617 *
1589 1618 * @param $translation