TranslatePress – Translate Multilingual sites - Version 2.2.2

Version Description

  • Fixed issue in WP 5.9 causing Invalid Data SQL Error reports
  • Improved page load time for WooCommerce websites on translated languages
  • Improved admin notices regarding database optimization
Download this release

Release Info

Developer razvan.mo
Plugin Icon 128x128 TranslatePress – Translate Multilingual sites
Version 2.2.2
Comparing to
See all releases

Code changes from version 2.2.1 to 2.2.2

assets/js/trp-update-database.js CHANGED
@@ -19,5 +19,6 @@ jQuery( function() {
19
  trigger_update_by_ajax( {
20
  action: 'trp_update_database',
21
  trp_updb_nonce: trp_updb_localized['nonce'],
 
22
  } );
23
  });
19
  trigger_update_by_ajax( {
20
  action: 'trp_update_database',
21
  trp_updb_nonce: trp_updb_localized['nonce'],
22
+ initiate_update: true,
23
  } );
24
  });
assets/lib/simplehtmldom/simple_html_dom.php CHANGED
@@ -36,6 +36,9 @@ namespace TranslatePress;
36
  * (Reason for this change: tag <text> exists in HTML docs so we need a different reserved tag.)
37
  * (In class-translation-render.php we use find('trptext') because of this. ).
38
  *
 
 
 
39
  */
40
 
41
  define('TRP_HDOM_TYPE_ELEMENT', 1);
@@ -506,7 +509,14 @@ class simple_html_dom_node
506
  {
507
  case TRP_HDOM_QUOTE_DOUBLE: $quote = '"'; break;
508
  case TRP_HDOM_QUOTE_SINGLE: $quote = '\''; break;
509
- default: $quote = '';
 
 
 
 
 
 
 
510
  }
511
 
512
  $ret .= $key
36
  * (Reason for this change: tag <text> exists in HTML docs so we need a different reserved tag.)
37
  * (In class-translation-render.php we use find('trptext') because of this. ).
38
  *
39
+ * In function makeup() the default $quote was changed from '' to double quotes, ' " ', because it was causing a JS security issue when onclick()
40
+ * function was used as translation for a link where title was set without double quotes.
41
+ *
42
  */
43
 
44
  define('TRP_HDOM_TYPE_ELEMENT', 1);
509
  {
510
  case TRP_HDOM_QUOTE_DOUBLE: $quote = '"'; break;
511
  case TRP_HDOM_QUOTE_SINGLE: $quote = '\''; break;
512
+ default: $quote = '';
513
+ /*
514
+ * TranslatePress modifications
515
+ * We changed the default $quote from '' to ' " ' to avoid JS security issue. There is a filter applied on this global, $TRP_HDOM_QUOTE_DEFAULT,
516
+ * so it can be changed in case there is a problem for some clients.
517
+
518
+ default: { global $TRP_HDOM_QUOTE_DEFAULT; $quote = $TRP_HDOM_QUOTE_DEFAULT; };
519
+ */
520
  }
521
 
522
  $ret .= $key
class-translate-press.php CHANGED
@@ -34,6 +34,7 @@ class TRP_Translate_Press{
34
  protected $install_plugins;
35
  protected $reviews;
36
  protected $rewrite_rules;
 
37
 
38
  public $active_pro_addons = array();
39
  public static $translate_press = null;
@@ -59,7 +60,7 @@ class TRP_Translate_Press{
59
  define( 'TRP_PLUGIN_URL', plugin_dir_url( __FILE__ ) );
60
  define( 'TRP_PLUGIN_BASE', plugin_basename( __DIR__ . '/index.php' ) );
61
  define( 'TRP_PLUGIN_SLUG', 'translatepress-multilingual' );
62
- define( 'TRP_PLUGIN_VERSION', '2.2.1' );
63
 
64
  wp_cache_add_non_persistent_groups(array('trp'));
65
 
@@ -118,6 +119,7 @@ class TRP_Translate_Press{
118
  require_once TRP_PLUGIN_DIR . 'includes/class-install-plugins.php';
119
  require_once TRP_PLUGIN_DIR . 'includes/class-reviews.php';
120
  require_once TRP_PLUGIN_DIR . 'includes/class-rewrite-rules.php';
 
121
  require_once TRP_PLUGIN_DIR . 'assets/lib/tp-add-ons-listing/tp-add-ons-listing.php';
122
  if ( did_action( 'elementor/loaded' ) )
123
  require_once TRP_PLUGIN_DIR . 'includes/class-elementor-language-for-blocks.php';
@@ -159,6 +161,7 @@ class TRP_Translate_Press{
159
  $this->install_plugins = new TRP_Install_Plugins();
160
  $this->reviews = new TRP_Reviews( $this->settings->get_settings() );
161
  $this->rewrite_rules = new TRP_Rewrite_Rules( $this->settings->get_settings() );
 
162
  }
163
 
164
  /**
@@ -249,10 +252,10 @@ class TRP_Translate_Press{
249
 
250
 
251
  $this->loader->add_action( 'admin_menu', $this->upgrade, 'register_menu_page' );
 
252
  $this->loader->add_action( 'admin_init', $this->upgrade, 'show_admin_notice' );
253
  $this->loader->add_action( 'admin_init', $this->upgrade, 'show_notification_about_add_ons_removal' );
254
  $this->loader->add_action( 'admin_init', $this->upgrade, 'trp_prepare_options_for_database_optimization' );
255
- $this->loader->add_action( 'admin_init', $this->upgrade, 'show_admin_error_message' );
256
  $this->loader->add_action( 'admin_enqueue_scripts', $this->upgrade, 'enqueue_update_script', 10, 1 );
257
  $this->loader->add_action( 'wp_ajax_trp_update_database', $this->upgrade, 'trp_update_database' );
258
 
34
  protected $install_plugins;
35
  protected $reviews;
36
  protected $rewrite_rules;
37
+ protected $check_invalid_text;
38
 
39
  public $active_pro_addons = array();
40
  public static $translate_press = null;
60
  define( 'TRP_PLUGIN_URL', plugin_dir_url( __FILE__ ) );
61
  define( 'TRP_PLUGIN_BASE', plugin_basename( __DIR__ . '/index.php' ) );
62
  define( 'TRP_PLUGIN_SLUG', 'translatepress-multilingual' );
63
+ define( 'TRP_PLUGIN_VERSION', '2.2.2' );
64
 
65
  wp_cache_add_non_persistent_groups(array('trp'));
66
 
119
  require_once TRP_PLUGIN_DIR . 'includes/class-install-plugins.php';
120
  require_once TRP_PLUGIN_DIR . 'includes/class-reviews.php';
121
  require_once TRP_PLUGIN_DIR . 'includes/class-rewrite-rules.php';
122
+ require_once TRP_PLUGIN_DIR . 'includes/class-check-invalid-text.php';
123
  require_once TRP_PLUGIN_DIR . 'assets/lib/tp-add-ons-listing/tp-add-ons-listing.php';
124
  if ( did_action( 'elementor/loaded' ) )
125
  require_once TRP_PLUGIN_DIR . 'includes/class-elementor-language-for-blocks.php';
161
  $this->install_plugins = new TRP_Install_Plugins();
162
  $this->reviews = new TRP_Reviews( $this->settings->get_settings() );
163
  $this->rewrite_rules = new TRP_Rewrite_Rules( $this->settings->get_settings() );
164
+ $this->check_invalid_text = new TRP_Check_Invalid_Text();
165
  }
166
 
167
  /**
252
 
253
 
254
  $this->loader->add_action( 'admin_menu', $this->upgrade, 'register_menu_page' );
255
+ $this->loader->add_action( 'admin_init', $this->upgrade, 'show_admin_error_message' );
256
  $this->loader->add_action( 'admin_init', $this->upgrade, 'show_admin_notice' );
257
  $this->loader->add_action( 'admin_init', $this->upgrade, 'show_notification_about_add_ons_removal' );
258
  $this->loader->add_action( 'admin_init', $this->upgrade, 'trp_prepare_options_for_database_optimization' );
 
259
  $this->loader->add_action( 'admin_enqueue_scripts', $this->upgrade, 'enqueue_update_script', 10, 1 );
260
  $this->loader->add_action( 'wp_ajax_trp_update_database', $this->upgrade, 'trp_update_database' );
261
 
includes/class-check-invalid-text.php ADDED
@@ -0,0 +1,91 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Class TRP_Check_Invalid_Text
4
+ *
5
+ * Used to exclude problematic strings triggering 'WordPress database error: Could not perform query because it contains invalid data.' from TP query functions.
6
+ *
7
+ * Divide et impera method used to minimise number of queries needed to detect needle in haystack. Applied for key functions:
8
+ * get_existing_translations, insert_strings and update_strings.
9
+ */
10
+ class TRP_Check_Invalid_Text{
11
+ protected $table_charset;
12
+ protected $check_current_query;
13
+ protected $col_meta;
14
+
15
+ public function get_existing_translations_without_invalid_text( $dictionary, $prepared_query, $strings_array, $language_code, $block_type ){
16
+ if ( $this->is_invalid_data_error() ){
17
+ $count = count($strings_array);
18
+ if ( $count <= 1 ){
19
+ // fake translated so it doesn't get auto translated or updated in DB later
20
+ $entry = new stdClass();
21
+ $entry->translated = $strings_array[0];
22
+ $entry->original = $strings_array[0];
23
+ $entry->status = "1";
24
+ $entry->invalid_data = true;
25
+ return array( $strings_array[0] => $entry);
26
+ }else{
27
+ $trp = TRP_Translate_Press::get_trp_instance();
28
+ $trp_query = $trp->get_component( 'query' );
29
+
30
+ $half = floor( $count / 2 );
31
+
32
+ $array1 = $trp_query->get_existing_translations( array_slice( $strings_array, 0, $half ), $language_code, $block_type );
33
+ $array2 = $trp_query->get_existing_translations( array_slice( $strings_array, $half ), $language_code, $block_type );
34
+ return array_merge( $array1, $array2 );
35
+ }
36
+ }
37
+ return $dictionary;
38
+ }
39
+
40
+ public function insert_translations_without_invalid_text( $new_strings, $language_code, $block_type ){
41
+ if ( $this->is_invalid_data_error() ){
42
+ $count = count($new_strings);
43
+ if ( $count <= 1 ){
44
+ return;
45
+ }else{
46
+ $trp = TRP_Translate_Press::get_trp_instance();
47
+ $trp_query = $trp->get_component( 'query' );
48
+
49
+ $half = floor( $count / 2 );
50
+
51
+ $trp_query->insert_strings( array_slice( $new_strings, 0, $half ), $language_code, $block_type );
52
+ $trp_query->insert_strings( array_slice( $new_strings, $half ), $language_code, $block_type );
53
+ return;
54
+ }
55
+ }
56
+
57
+ }
58
+
59
+ public function update_translations_without_invalid_text( $update_strings, $language_code, $block_type ){
60
+ if ( $this->is_invalid_data_error() ){
61
+ $count = count($update_strings);
62
+ if ( $count <= 1 ){
63
+ return;
64
+ }else{
65
+ $trp = TRP_Translate_Press::get_trp_instance();
66
+ $trp_query = $trp->get_component( 'query' );
67
+
68
+ $half = floor( $count / 2 );
69
+
70
+ $trp_query->update_strings( array_slice( $update_strings, 0, $half ), $language_code, $block_type );
71
+ $trp_query->update_strings( array_slice( $update_strings, $half ), $language_code, $block_type );
72
+ return;
73
+ }
74
+ }
75
+
76
+ }
77
+
78
+ public function is_invalid_data_error(){
79
+ // Using $trp_disable_invalid_data_detection as a sort of apply_filters to turn off this feature.
80
+ // Not using proper WP filter to reduce page load time. This function is executed many times.
81
+ global $wpdb, $trp_disable_invalid_data_detection;
82
+ if ( !empty($wpdb->last_error) && !isset( $trp_disable_invalid_data_detection) ) {
83
+ $invalid_data_error = __( 'WordPress database error: Could not perform query because it contains invalid data.' ); /* phpcs:ignore */ /* $domain arg is purposely omitted because we want to identify the exact wpdb last_error message. Only used for comparison reasons, it's not actually displayed. */
84
+ if ( $wpdb->last_error == $invalid_data_error ) {
85
+ return true;
86
+ }
87
+ }
88
+ return false;
89
+ }
90
+
91
+ }
includes/class-query.php CHANGED
@@ -14,6 +14,7 @@ class TRP_Query{
14
  protected $url_converter;
15
  protected $translation_render;
16
  protected $error_manager;
 
17
  protected $tables_exist = array();
18
  protected $db_sql_version = null;
19
 
@@ -80,15 +81,26 @@ class TRP_Query{
80
  $prepared_query = $this->db->prepare( $query, $values );
81
  $dictionary = $this->db->get_results( $prepared_query, OBJECT_K );
82
 
 
 
 
 
 
 
 
 
83
  $this->maybe_record_automatic_translation_error(array( 'details' => 'Error running get_existing_translations()' ) );
84
- if ( is_array( $dictionary ) && count( $dictionary ) === 0 && !$this->table_exists($this->get_table_name( $language_code )) ){
 
 
 
 
 
85
  // if table is missing then last_error is empty for the select query
86
  $this->maybe_record_automatic_translation_error(array( 'details' => 'Missing table ' . $this->get_table_name( $language_code ) . ' . To regenerate tables, try going to Settings->TranslatePress->General tab and Save Settings.'), true );
87
  }
88
- if ($this->db->last_error !== '')
89
- $dictionary = false;
90
 
91
- return apply_filters( 'trp_get_existing_translations', $dictionary, $prepared_query, $strings_array );
92
  }
93
 
94
  /**
@@ -674,7 +686,11 @@ class TRP_Query{
674
 
675
  $prepared_query = $this->db->prepare($query . ' ', $values);
676
  $this->db->query( $prepared_query );
677
-
 
 
 
 
678
  $this->maybe_record_automatic_translation_error(array( 'details' => 'Error running update_strings()' ) );
679
  }
680
 
@@ -711,9 +727,12 @@ class TRP_Query{
711
  // you cannot insert multiple rows at once using insert() method.
712
  // but by using prepare you cannot insert NULL values.
713
  $this->db->query( $this->db->prepare($query . ' ', $values) );
714
-
 
 
 
 
715
  $this->maybe_record_automatic_translation_error(array( 'details' => 'Error running insert_strings()' ) );
716
-
717
  }
718
 
719
  public function insert_gettext_strings( $new_strings, $language_code ){
@@ -955,11 +974,11 @@ class TRP_Query{
955
 
956
  public function get_all_gettext_strings( $language_code ){
957
  $dictionary = $this->db->get_results( "SELECT id, original, translated, domain FROM `" . sanitize_text_field( $this->get_gettext_table_name( $language_code ) ) . "`", ARRAY_A );
 
958
  if ( is_array( $dictionary ) && count( $dictionary ) === 0 && !$this->table_exists($this->get_gettext_table_name( $language_code )) ){
959
  // if table is missing then last_error is empty
960
  $this->maybe_record_automatic_translation_error(array( 'details' => 'Missing table ' . $this->get_gettext_table_name( $language_code ). ' . To regenerate tables, try going to Settings->TranslatePress->General tab and Save Settings.'), true );
961
  }
962
- $this->maybe_record_automatic_translation_error(array( 'details' => 'Error running get_all_gettext_strings()' ) );
963
  return $dictionary;
964
  }
965
 
@@ -1396,7 +1415,12 @@ class TRP_Query{
1396
  }
1397
 
1398
  public function maybe_record_automatic_translation_error($error_details = array(), $ignore_last_error = false ){
1399
- if ( !empty( $this->db->last_error) || $ignore_last_error ){
 
 
 
 
 
1400
  $trp = TRP_Translate_Press::get_trp_instance();
1401
  if( !$this->error_manager ){
1402
  $this->error_manager = $trp->get_component( 'error_manager' );
14
  protected $url_converter;
15
  protected $translation_render;
16
  protected $error_manager;
17
+ protected $check_invalid_text;
18
  protected $tables_exist = array();
19
  protected $db_sql_version = null;
20
 
81
  $prepared_query = $this->db->prepare( $query, $values );
82
  $dictionary = $this->db->get_results( $prepared_query, OBJECT_K );
83
 
84
+
85
+
86
+ if( !$this->check_invalid_text ){
87
+ $trp = TRP_Translate_Press::get_trp_instance();
88
+ $this->check_invalid_text = $trp->get_component( 'check_invalid_text' );
89
+ }
90
+ $dictionary = $this->check_invalid_text->get_existing_translations_without_invalid_text($dictionary, $prepared_query, $strings_array, $language_code, $block_type );
91
+
92
  $this->maybe_record_automatic_translation_error(array( 'details' => 'Error running get_existing_translations()' ) );
93
+
94
+ if ($this->db->last_error !== '' && !$this->check_invalid_text->is_invalid_data_error())
95
+ $dictionary = false;
96
+
97
+ $dictionary = apply_filters( 'trp_get_existing_translations', $dictionary, $prepared_query, $strings_array, $language_code, $block_type );
98
+ if ( is_array( $dictionary ) && count( $dictionary ) === 0 && !$this->table_exists($this->get_table_name( $language_code )) && !$this->check_invalid_text->is_invalid_data_error()){
99
  // if table is missing then last_error is empty for the select query
100
  $this->maybe_record_automatic_translation_error(array( 'details' => 'Missing table ' . $this->get_table_name( $language_code ) . ' . To regenerate tables, try going to Settings->TranslatePress->General tab and Save Settings.'), true );
101
  }
 
 
102
 
103
+ return $dictionary;
104
  }
105
 
106
  /**
686
 
687
  $prepared_query = $this->db->prepare($query . ' ', $values);
688
  $this->db->query( $prepared_query );
689
+ if( !$this->check_invalid_text ){
690
+ $trp = TRP_Translate_Press::get_trp_instance();
691
+ $this->check_invalid_text = $trp->get_component( 'check_invalid_text' );
692
+ }
693
+ $this->check_invalid_text->update_translations_without_invalid_text( $update_strings, $language_code, $columns_to_update );
694
  $this->maybe_record_automatic_translation_error(array( 'details' => 'Error running update_strings()' ) );
695
  }
696
 
727
  // you cannot insert multiple rows at once using insert() method.
728
  // but by using prepare you cannot insert NULL values.
729
  $this->db->query( $this->db->prepare($query . ' ', $values) );
730
+ if( !$this->check_invalid_text ){
731
+ $trp = TRP_Translate_Press::get_trp_instance();
732
+ $this->check_invalid_text = $trp->get_component( 'check_invalid_text' );
733
+ }
734
+ $this->check_invalid_text->insert_translations_without_invalid_text($new_strings, $language_code, $block_type);
735
  $this->maybe_record_automatic_translation_error(array( 'details' => 'Error running insert_strings()' ) );
 
736
  }
737
 
738
  public function insert_gettext_strings( $new_strings, $language_code ){
974
 
975
  public function get_all_gettext_strings( $language_code ){
976
  $dictionary = $this->db->get_results( "SELECT id, original, translated, domain FROM `" . sanitize_text_field( $this->get_gettext_table_name( $language_code ) ) . "`", ARRAY_A );
977
+ $this->maybe_record_automatic_translation_error(array( 'details' => 'Error running get_all_gettext_strings()' ) );
978
  if ( is_array( $dictionary ) && count( $dictionary ) === 0 && !$this->table_exists($this->get_gettext_table_name( $language_code )) ){
979
  // if table is missing then last_error is empty
980
  $this->maybe_record_automatic_translation_error(array( 'details' => 'Missing table ' . $this->get_gettext_table_name( $language_code ). ' . To regenerate tables, try going to Settings->TranslatePress->General tab and Save Settings.'), true );
981
  }
 
982
  return $dictionary;
983
  }
984
 
1415
  }
1416
 
1417
  public function maybe_record_automatic_translation_error($error_details = array(), $ignore_last_error = false ){
1418
+ if( !$this->check_invalid_text ){
1419
+ $trp = TRP_Translate_Press::get_trp_instance();
1420
+ $this->check_invalid_text = $trp->get_component( 'check_invalid_text' );
1421
+ }
1422
+
1423
+ if ( ( !empty( $this->db->last_error) && !$this->check_invalid_text->is_invalid_data_error() ) || $ignore_last_error ){
1424
  $trp = TRP_Translate_Press::get_trp_instance();
1425
  if( !$this->error_manager ){
1426
  $this->error_manager = $trp->get_component( 'error_manager' );
includes/class-translation-render.php CHANGED
@@ -381,6 +381,9 @@ class TRP_Translation_Render{
381
  return $output;
382
  }
383
 
 
 
 
384
  global $trp_editor_notices;
385
 
386
  /* replace our special tags so we have valid html */
381
  return $output;
382
  }
383
 
384
+ global $TRP_HDOM_QUOTE_DEFAULT;
385
+ $TRP_HDOM_QUOTE_DEFAULT = apply_filters('trp_hdom_quote_default_double_quotes', '"');
386
+
387
  global $trp_editor_notices;
388
 
389
  /* replace our special tags so we have valid html */
includes/class-upgrade.php CHANGED
@@ -226,9 +226,10 @@ class TRP_Upgrade {
226
  return;
227
  }
228
  $updates_needed = $this->get_updates_details();
 
229
  foreach( $updates_needed as $update ){
230
  $option = get_option( $update['option_name'], 'is not set' );
231
- if ( $option === 'no' ){
232
  add_action( 'admin_notices', array( $this, 'admin_notice_update_database' ) );
233
  break;
234
  }
@@ -264,13 +265,11 @@ class TRP_Upgrade {
264
  return;
265
  }
266
  $updates_needed = $this->get_updates_details();
267
- foreach ( $updates_needed as $update ) {
268
- $option = get_option( $update['option_name'] );
269
- if ( $option === 'no' ) {
270
- add_action( 'admin_notices', array( $this, 'trp_admin_notice_error_database' ) );
271
- break;
272
- }
273
  }
 
274
  }
275
 
276
  public function trp_admin_notice_error_database(){
@@ -305,6 +304,9 @@ class TRP_Upgrade {
305
  $request = array();
306
  $request['progress_message'] = '';
307
  $updates_needed = $this->get_updates_details();
 
 
 
308
  if ( empty ( $_REQUEST['trp_updb_action'] ) ){
309
  foreach( $updates_needed as $update_action_key => $update ) {
310
  $option = get_option( $update['option_name'], 'is not set' );
@@ -586,7 +588,6 @@ class TRP_Upgrade {
586
  }
587
 
588
  if ( $redirect ) {
589
- update_option('trp_show_error_db_message', 'no');
590
  $url = add_query_arg( array( 'page' => 'trp_update_database' ), site_url( 'wp-admin/admin.php' ) );
591
  wp_safe_redirect( $url );
592
  exit;
226
  return;
227
  }
228
  $updates_needed = $this->get_updates_details();
229
+ $option_db_error_message = get_option($updates_needed['show_error_db_message']['option_name']);
230
  foreach( $updates_needed as $update ){
231
  $option = get_option( $update['option_name'], 'is not set' );
232
+ if ( $option === 'no' && $option_db_error_message !== 'no'){
233
  add_action( 'admin_notices', array( $this, 'admin_notice_update_database' ) );
234
  break;
235
  }
265
  return;
266
  }
267
  $updates_needed = $this->get_updates_details();
268
+ $option_db_error_message = get_option($updates_needed['show_error_db_message']['option_name']);
269
+ if ( $option_db_error_message === 'no' ) {
270
+ add_action( 'admin_notices', array( $this, 'trp_admin_notice_error_database' ) );
 
 
 
271
  }
272
+
273
  }
274
 
275
  public function trp_admin_notice_error_database(){
304
  $request = array();
305
  $request['progress_message'] = '';
306
  $updates_needed = $this->get_updates_details();
307
+ if (isset($_REQUEST['initiate_update']) && $_REQUEST['initiate_update']=== "true" ){
308
+ update_option('trp_show_error_db_message', 'no');
309
+ }
310
  if ( empty ( $_REQUEST['trp_updb_action'] ) ){
311
  foreach( $updates_needed as $update_action_key => $update ) {
312
  $option = get_option( $update['option_name'], 'is not set' );
588
  }
589
 
590
  if ( $redirect ) {
 
591
  $url = add_query_arg( array( 'page' => 'trp_update_database' ), site_url( 'wp-admin/admin.php' ) );
592
  wp_safe_redirect( $url );
593
  exit;
includes/compatibility-functions.php CHANGED
@@ -1623,5 +1623,4 @@ function trp_page_builders_compatibility_with_subdirectory_for_default_language(
1623
  $needed_language = $settings['default-language'];
1624
  }
1625
  return $needed_language;
1626
- }
1627
-
1623
  $needed_language = $settings['default-language'];
1624
  }
1625
  return $needed_language;
1626
+ }
 
includes/functions.php CHANGED
@@ -94,7 +94,11 @@ function trp_x( $text, $context, $domain, $language ){
94
  * @return string the path of the mo file if it is found else an empty string
95
  */
96
  function trp_find_translation_location_for_domain( $domain, $language ){
97
-
 
 
 
 
98
  $path = '';
99
 
100
  if( file_exists( WP_LANG_DIR . '/plugins/'. $domain .'-' . $language . '.mo') ) {
@@ -107,8 +111,8 @@ function trp_find_translation_location_for_domain( $domain, $language ){
107
  } else {
108
  $possible_translation_folders = array( '', 'languages/', 'language/', 'translations/', 'translation/', 'lang/' );
109
  foreach( $possible_translation_folders as $possible_translation_folder ){
110
- if (file_exists(get_template_directory() . '/' . $possible_translation_folder . $domain . '-' . $language . '.mo')) {
111
- $path = get_template_directory() . '/' . $possible_translation_folder . $domain . '-' . $language . '.mo';
112
  } elseif ( file_exists(WP_PLUGIN_DIR . '/' . $domain . '/' . $possible_translation_folder . $domain . '-' . $language . '.mo') ) {
113
  $path = WP_PLUGIN_DIR . '/' . $domain . '/' . $possible_translation_folder . $domain . '-' . $language . '.mo';
114
  }
94
  * @return string the path of the mo file if it is found else an empty string
95
  */
96
  function trp_find_translation_location_for_domain( $domain, $language ){
97
+ global $trp_template_directory;
98
+ if ( !isset($trp_template_directory)){
99
+ // "caching" this because it sometimes leads to increased page load time due to many calls
100
+ $trp_template_directory = get_template_directory();
101
+ }
102
  $path = '';
103
 
104
  if( file_exists( WP_LANG_DIR . '/plugins/'. $domain .'-' . $language . '.mo') ) {
111
  } else {
112
  $possible_translation_folders = array( '', 'languages/', 'language/', 'translations/', 'translation/', 'lang/' );
113
  foreach( $possible_translation_folders as $possible_translation_folder ){
114
+ if (file_exists($trp_template_directory . '/' . $possible_translation_folder . $domain . '-' . $language . '.mo')) {
115
+ $path = $trp_template_directory . '/' . $possible_translation_folder . $domain . '-' . $language . '.mo';
116
  } elseif ( file_exists(WP_PLUGIN_DIR . '/' . $domain . '/' . $possible_translation_folder . $domain . '-' . $language . '.mo') ) {
117
  $path = WP_PLUGIN_DIR . '/' . $domain . '/' . $possible_translation_folder . $domain . '-' . $language . '.mo';
118
  }
index.php CHANGED
@@ -3,14 +3,14 @@
3
  Plugin Name: TranslatePress - Multilingual
4
  Plugin URI: https://translatepress.com/
5
  Description: Experience a better way of translating your WordPress site using a visual front-end translation editor, with full support for WooCommerce and site builders.
6
- Version: 2.2.1
7
  Author: Cozmoslabs, Razvan Mocanu, Madalin Ungureanu, Cristophor Hurduban
8
  Author URI: https://cozmoslabs.com/
9
  Text Domain: translatepress-multilingual
10
  Domain Path: /languages
11
  License: GPL2
12
  WC requires at least: 2.5.0
13
- WC tested up to: 6.2
14
 
15
  == Copyright ==
16
  Copyright 2017 Cozmoslabs (www.cozmoslabs.com)
3
  Plugin Name: TranslatePress - Multilingual
4
  Plugin URI: https://translatepress.com/
5
  Description: Experience a better way of translating your WordPress site using a visual front-end translation editor, with full support for WooCommerce and site builders.
6
+ Version: 2.2.2
7
  Author: Cozmoslabs, Razvan Mocanu, Madalin Ungureanu, Cristophor Hurduban
8
  Author URI: https://cozmoslabs.com/
9
  Text Domain: translatepress-multilingual
10
  Domain Path: /languages
11
  License: GPL2
12
  WC requires at least: 2.5.0
13
+ WC tested up to: 6.2.1
14
 
15
  == Copyright ==
16
  Copyright 2017 Cozmoslabs (www.cozmoslabs.com)
languages/translatepress-multilingual.pot CHANGED
@@ -185,7 +185,7 @@ msgstr ""
185
  msgid "Automatic translation has been disabled."
186
  msgstr ""
187
 
188
- #: includes/class-error-manager.php:146, includes/class-plugin-notices.php:341, includes/class-plugin-notices.php:392, includes/class-plugin-notices.php:373, includes/class-plugin-notices.php:406, includes/class-plugin-notices.php:431, includes/class-plugin-notices.php:455, includes/class-reviews.php:119, includes/class-reviews.php:122, includes/class-upgrade.php:816
189
  msgid "Dismiss this notice."
190
  msgstr ""
191
 
@@ -837,63 +837,63 @@ msgstr ""
837
  msgid "Finishing up..."
838
  msgstr ""
839
 
840
- #: includes/class-upgrade.php:249
841
  msgid "TranslatePress data update"
842
  msgstr ""
843
 
844
- #: includes/class-upgrade.php:249
845
  msgid "We need to update your translations database to the latest version."
846
  msgstr ""
847
 
848
- #: includes/class-upgrade.php:250
849
  msgid "IMPORTANT: It is strongly recommended to first backup the database!\nAre you sure you want to continue?"
850
  msgstr ""
851
 
852
- #: includes/class-upgrade.php:250
853
  msgid "Run the updater"
854
  msgstr ""
855
 
856
- #: includes/class-upgrade.php:279
857
  msgid "Database optimization did not complete successfully. We recommend restoring the original database or <a href=\"%s\" >trying again.</a>"
858
  msgstr ""
859
 
860
- #: includes/class-upgrade.php:297
861
  msgid "Update aborted! Your user account doesn't have the capability to perform database updates."
862
  msgstr ""
863
 
864
- #: includes/class-upgrade.php:302
865
  msgid "Update aborted! Invalid nonce."
866
  msgstr ""
867
 
868
- #: includes/class-upgrade.php:343
869
  msgid "Update aborted! Incorrect action."
870
  msgstr ""
871
 
872
- #: includes/class-upgrade.php:346
873
  msgid "Update aborted! Incorrect language code."
874
  msgstr ""
875
 
876
- #: includes/class-upgrade.php:330
877
  msgid "Updating database to version %s+"
878
  msgstr ""
879
 
880
- #: includes/class-upgrade.php:334, includes/class-upgrade.php:397
881
  msgid "Processing table for language %s..."
882
  msgstr ""
883
 
884
- #: includes/class-upgrade.php:317, includes/class-upgrade.php:427
885
  msgid "Back to TranslatePress Settings"
886
  msgstr ""
887
 
888
- #: includes/class-upgrade.php:321
889
  msgid "Successfully updated database!"
890
  msgstr ""
891
 
892
- #: includes/class-upgrade.php:402, includes/class-upgrade.php:394
893
  msgid " done."
894
  msgstr ""
895
 
896
- #: includes/class-upgrade.php:814
897
  msgid "All individual TranslatePress add-on plugins <a href=\"%1$s\" target=\"_blank\">have been discontinued</a> and are now included in the premium Personal, Business and Developer versions of TranslatePress. Please log into your <a href=\"%2$s\" target=\"_blank\">account page</a>, download the new premium version and install it. Your individual addons settings will be ported over."
898
  msgstr ""
899
 
185
  msgid "Automatic translation has been disabled."
186
  msgstr ""
187
 
188
+ #: includes/class-error-manager.php:146, includes/class-plugin-notices.php:341, includes/class-plugin-notices.php:392, includes/class-plugin-notices.php:373, includes/class-plugin-notices.php:406, includes/class-plugin-notices.php:431, includes/class-plugin-notices.php:455, includes/class-reviews.php:119, includes/class-reviews.php:122, includes/class-upgrade.php:817
189
  msgid "Dismiss this notice."
190
  msgstr ""
191
 
837
  msgid "Finishing up..."
838
  msgstr ""
839
 
840
+ #: includes/class-upgrade.php:250
841
  msgid "TranslatePress data update"
842
  msgstr ""
843
 
844
+ #: includes/class-upgrade.php:250
845
  msgid "We need to update your translations database to the latest version."
846
  msgstr ""
847
 
848
+ #: includes/class-upgrade.php:251
849
  msgid "IMPORTANT: It is strongly recommended to first backup the database!\nAre you sure you want to continue?"
850
  msgstr ""
851
 
852
+ #: includes/class-upgrade.php:251
853
  msgid "Run the updater"
854
  msgstr ""
855
 
856
+ #: includes/class-upgrade.php:278
857
  msgid "Database optimization did not complete successfully. We recommend restoring the original database or <a href=\"%s\" >trying again.</a>"
858
  msgstr ""
859
 
860
+ #: includes/class-upgrade.php:296
861
  msgid "Update aborted! Your user account doesn't have the capability to perform database updates."
862
  msgstr ""
863
 
864
+ #: includes/class-upgrade.php:301
865
  msgid "Update aborted! Invalid nonce."
866
  msgstr ""
867
 
868
+ #: includes/class-upgrade.php:345
869
  msgid "Update aborted! Incorrect action."
870
  msgstr ""
871
 
872
+ #: includes/class-upgrade.php:348
873
  msgid "Update aborted! Incorrect language code."
874
  msgstr ""
875
 
876
+ #: includes/class-upgrade.php:332
877
  msgid "Updating database to version %s+"
878
  msgstr ""
879
 
880
+ #: includes/class-upgrade.php:336, includes/class-upgrade.php:399
881
  msgid "Processing table for language %s..."
882
  msgstr ""
883
 
884
+ #: includes/class-upgrade.php:319, includes/class-upgrade.php:429
885
  msgid "Back to TranslatePress Settings"
886
  msgstr ""
887
 
888
+ #: includes/class-upgrade.php:323
889
  msgid "Successfully updated database!"
890
  msgstr ""
891
 
892
+ #: includes/class-upgrade.php:404, includes/class-upgrade.php:396
893
  msgid " done."
894
  msgstr ""
895
 
896
+ #: includes/class-upgrade.php:815
897
  msgid "All individual TranslatePress add-on plugins <a href=\"%1$s\" target=\"_blank\">have been discontinued</a> and are now included in the premium Personal, Business and Developer versions of TranslatePress. Please log into your <a href=\"%2$s\" target=\"_blank\">account page</a>, download the new premium version and install it. Your individual addons settings will be ported over."
898
  msgstr ""
899
 
readme.txt CHANGED
@@ -3,9 +3,9 @@ Contributors: cozmoslabs, razvan.mo, madalin.ungureanu, sareiodata, cristophor
3
  Donate link: https://www.translatepress.com/
4
  Tags: translate, translation, multilingual, automatic translation, bilingual, front-end translation, google translate, language
5
  Requires at least: 3.1.0
6
- Tested up to: 5.9
7
  Requires PHP: 5.6.20
8
- Stable tag: 2.2.1
9
  License: GPLv2 or later
10
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
11
 
@@ -140,6 +140,11 @@ For more information please check out our [documentation](https://translatepress
140
 
141
 
142
  == Changelog ==
 
 
 
 
 
143
  = 2.2.1 =
144
  * Added Advanced option to adjust hreflang to hide region independent language tags or country locale tags
145
  * Added missing flags for Tamil (Sri Lanka), Spanish (Ecuador), Spanish (Dominican Republic), Amharic
3
  Donate link: https://www.translatepress.com/
4
  Tags: translate, translation, multilingual, automatic translation, bilingual, front-end translation, google translate, language
5
  Requires at least: 3.1.0
6
+ Tested up to: 5.9.1
7
  Requires PHP: 5.6.20
8
+ Stable tag: 2.2.2
9
  License: GPLv2 or later
10
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
11
 
140
 
141
 
142
  == Changelog ==
143
+ = 2.2.2 =
144
+ * Fixed issue in WP 5.9 causing Invalid Data SQL Error reports
145
+ * Improved page load time for WooCommerce websites on translated languages
146
+ * Improved admin notices regarding database optimization
147
+
148
  = 2.2.1 =
149
  * Added Advanced option to adjust hreflang to hide region independent language tags or country locale tags
150
  * Added missing flags for Tamil (Sri Lanka), Spanish (Ecuador), Spanish (Dominican Republic), Amharic