TranslatePress – Translate Multilingual sites - Version 1.9.6

Version Description

  • Adding missing Uruguay flag
  • Improved security for dynamic translations
  • Disable automatic language redirect when editing a page with Oxygen or Beaver Builder
  • Fixed cases of missing table sql errors
  • Fixed sql error for some MariaDB setups due to deprecated syntax
  • Fixed some issues with Exclude certain paths functionality.
Download this release

Release Info

Developer madalin.ungureanu
Plugin Icon 128x128 TranslatePress – Translate Multilingual sites
Version 1.9.6
Comparing to
See all releases

Code changes from version 1.9.5 to 1.9.6

assets/images/flags/es_UY.png ADDED
Binary file
class-translate-press.php CHANGED
@@ -57,7 +57,7 @@ class TRP_Translate_Press{
57
  define( 'TRP_PLUGIN_URL', plugin_dir_url( __FILE__ ) );
58
  define( 'TRP_PLUGIN_BASE', plugin_basename( __DIR__ . '/index.php' ) );
59
  define( 'TRP_PLUGIN_SLUG', 'translatepress-multilingual' );
60
- define( 'TRP_PLUGIN_VERSION', '1.9.5' );
61
 
62
  wp_cache_add_non_persistent_groups(array('trp'));
63
 
57
  define( 'TRP_PLUGIN_URL', plugin_dir_url( __FILE__ ) );
58
  define( 'TRP_PLUGIN_BASE', plugin_basename( __DIR__ . '/index.php' ) );
59
  define( 'TRP_PLUGIN_SLUG', 'translatepress-multilingual' );
60
+ define( 'TRP_PLUGIN_VERSION', '1.9.6' );
61
 
62
  wp_cache_add_non_persistent_groups(array('trp'));
63
 
includes/advanced-settings/do-not-translate-certain-paths.php CHANGED
@@ -102,6 +102,8 @@ function trp_exclude_include_paths_to_run_on(){
102
 
103
  if( empty( $current_slug ) || $current_slug == '/' )
104
  $current_slug = "{{home}}";
 
 
105
 
106
  if( $advanced_settings['translateable_content']['option'] == 'exclude' ){
107
 
@@ -169,6 +171,8 @@ function trp_exclude_include_do_not_redirect_on_excluded_pages( $redirect, $lang
169
 
170
  if( empty( $current_slug ) || $current_slug == '/' )
171
  $current_slug = "{{home}}";
 
 
172
 
173
  if( $advanced_settings['translateable_content']['option'] == 'exclude' ){
174
 
@@ -205,10 +209,10 @@ add_action( 'init', 'trp_exclude_include_redirect_to_default_language', 1 );
205
  function trp_exclude_include_redirect_to_default_language(){
206
 
207
  if( isset( $_GET['trp-edit-translation'] ) && ( $_GET['trp-edit-translation'] == 'true' || $_GET['trp-edit-translation'] == 'preview' ) )
208
- return $redirect;
209
 
210
  if( isset( $_GET['trp-string-translation'] ) && $_GET['trp-string-translation'] == 'true' )
211
- return $redirect;
212
 
213
  if( is_admin() )
214
  return;
102
 
103
  if( empty( $current_slug ) || $current_slug == '/' )
104
  $current_slug = "{{home}}";
105
+ else
106
+ $current_slug = '/' . ltrim( $current_slug, '/' );
107
 
108
  if( $advanced_settings['translateable_content']['option'] == 'exclude' ){
109
 
171
 
172
  if( empty( $current_slug ) || $current_slug == '/' )
173
  $current_slug = "{{home}}";
174
+ else
175
+ $current_slug = '/' . ltrim( $current_slug, '/' );
176
 
177
  if( $advanced_settings['translateable_content']['option'] == 'exclude' ){
178
 
209
  function trp_exclude_include_redirect_to_default_language(){
210
 
211
  if( isset( $_GET['trp-edit-translation'] ) && ( $_GET['trp-edit-translation'] == 'true' || $_GET['trp-edit-translation'] == 'preview' ) )
212
+ return;
213
 
214
  if( isset( $_GET['trp-string-translation'] ) && $_GET['trp-string-translation'] == 'true' )
215
+ return;
216
 
217
  if( is_admin() )
218
  return;
includes/class-query.php CHANGED
@@ -11,9 +11,11 @@ class TRP_Query{
11
  protected $table_name;
12
  public $db;
13
  protected $settings;
 
14
  protected $translation_render;
15
  protected $error_manager;
16
  protected $tables_exist = array();
 
17
 
18
  const NOT_TRANSLATED = 0;
19
  const MACHINE_TRANSLATED = 1;
@@ -655,11 +657,12 @@ class TRP_Query{
655
  }
656
 
657
  $on_duplicate = ' ON DUPLICATE KEY UPDATE ';
 
658
  foreach ( $columns_to_update as $column ) {
659
  if ( $column == 'id' ){
660
  continue;
661
  }
662
- $on_duplicate .= $column . '=VALUES(' . $column . '),';
663
  }
664
  $query .= implode( ', ', $place_holders );
665
 
@@ -795,11 +798,12 @@ class TRP_Query{
795
  }
796
 
797
  $on_duplicate = ' ON DUPLICATE KEY UPDATE ';
 
798
  foreach ( $columns_to_update as $column ) {
799
  if ( $column == 'id' ){
800
  continue;
801
  }
802
- $on_duplicate .= $column . '=VALUES(' . $column . '),';
803
  }
804
  $query .= implode( ', ', $place_holders );
805
 
@@ -1281,13 +1285,18 @@ class TRP_Query{
1281
 
1282
  public function maybe_record_automatic_translation_error($error_details = array(), $ignore_last_error = false ){
1283
  if ( !empty( $this->db->last_error) || $ignore_last_error ){
 
1284
  if( !$this->error_manager ){
1285
- $trp = TRP_Translate_Press::get_trp_instance();
1286
  $this->error_manager = $trp->get_component( 'error_manager' );
1287
  }
 
 
 
 
1288
  $default_error_details = array(
1289
  'last_error' => $this->db->last_error,
1290
- 'disable_automatic_translations' => true
 
1291
  );
1292
  $error_details = array_merge( $default_error_details, $error_details );
1293
  $this->error_manager->record_error( $error_details );
@@ -1398,4 +1407,48 @@ class TRP_Query{
1398
  $sql = "DROP TABLE `" . sanitize_text_field( $table_name ). "`";
1399
  return $this->db->query( $sql );
1400
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1401
  }
11
  protected $table_name;
12
  public $db;
13
  protected $settings;
14
+ protected $url_converter;
15
  protected $translation_render;
16
  protected $error_manager;
17
  protected $tables_exist = array();
18
+ protected $db_sql_version = null;
19
 
20
  const NOT_TRANSLATED = 0;
21
  const MACHINE_TRANSLATED = 1;
657
  }
658
 
659
  $on_duplicate = ' ON DUPLICATE KEY UPDATE ';
660
+ $key_term_values = $this->is_values_accepted() ? 'VALUES' : 'VALUE';
661
  foreach ( $columns_to_update as $column ) {
662
  if ( $column == 'id' ){
663
  continue;
664
  }
665
+ $on_duplicate .= $column . '=' . $key_term_values . '(' . $column . '),';
666
  }
667
  $query .= implode( ', ', $place_holders );
668
 
798
  }
799
 
800
  $on_duplicate = ' ON DUPLICATE KEY UPDATE ';
801
+ $key_term_values = $this->is_values_accepted() ? 'VALUES' : 'VALUE';
802
  foreach ( $columns_to_update as $column ) {
803
  if ( $column == 'id' ){
804
  continue;
805
  }
806
+ $on_duplicate .= $column . '=' . $key_term_values . '(' . $column . '),';
807
  }
808
  $query .= implode( ', ', $place_holders );
809
 
1285
 
1286
  public function maybe_record_automatic_translation_error($error_details = array(), $ignore_last_error = false ){
1287
  if ( !empty( $this->db->last_error) || $ignore_last_error ){
1288
+ $trp = TRP_Translate_Press::get_trp_instance();
1289
  if( !$this->error_manager ){
 
1290
  $this->error_manager = $trp->get_component( 'error_manager' );
1291
  }
1292
+ if( !$this->url_converter ) {
1293
+ $this->url_converter = $trp->get_component( 'url_converter' );
1294
+ }
1295
+
1296
  $default_error_details = array(
1297
  'last_error' => $this->db->last_error,
1298
+ 'disable_automatic_translations' => true,
1299
+ 'url' => $this->url_converter->cur_page_url(),
1300
  );
1301
  $error_details = array_merge( $default_error_details, $error_details );
1302
  $this->error_manager->record_error( $error_details );
1407
  $sql = "DROP TABLE `" . sanitize_text_field( $table_name ). "`";
1408
  return $this->db->query( $sql );
1409
  }
1410
+
1411
+ /**
1412
+ * Return db sql version
1413
+ *
1414
+ * Using 'select version()' instead of wpdb->db_server_info because
1415
+ * db_server_info returns format 5.5.5-10.3.3-mariadb instead of 10.3.3-mariadb on some setups
1416
+ * https://www.php.net/manual/en/mysqli.get-server-info.php#118822
1417
+ *
1418
+ * @return string|null
1419
+ */
1420
+ public function get_db_sql_version(){
1421
+ if ( $this->db_sql_version === null ){
1422
+ $this->db_sql_version = $this->db->get_var( 'select version()' );
1423
+ $this->db_sql_version = ( $this->db_sql_version === null ) ? '0' : $this->db_sql_version;
1424
+ }
1425
+ return $this->db_sql_version;
1426
+ }
1427
+
1428
+ /**
1429
+ * Whether it is safe to use VALUES() instead of VALUE()
1430
+ *
1431
+ * Starting with 10.3.3 MariaDB recommends using VALUE() instead of VALUES()
1432
+ * Even though they say they still accept the term values for 'on duplicate key update' syntax,
1433
+ * some users still report syntax error.
1434
+ * https://mariadb.com/kb/en/values-value/
1435
+ *
1436
+ * MySQL servers marked the use of VALUES deprecated starting with 8.0.20 but have not removed support for it.
1437
+ * We can't use the MariaDB approach, their alternative is different and not supported by earlier versions.
1438
+ * For now, there is no need to further complicate this SQL query based on DB version and make.
1439
+ *
1440
+ *
1441
+ * @return bool
1442
+ */
1443
+ public function is_values_accepted(){
1444
+ $return = true;
1445
+ $db_sql_version = strtolower( $this->get_db_sql_version() );
1446
+ if ( strpos( $db_sql_version, 'mariadb' ) !== false ){
1447
+ $db_server_array = explode('-', $db_sql_version);
1448
+ if( isset( $db_server_array[1] ) && $db_server_array[1] == 'mariadb' && version_compare($db_server_array[0], '10.3.3', '>=') ){
1449
+ $return = false;
1450
+ }
1451
+ }
1452
+ return $return;
1453
+ }
1454
  }
includes/class-translation-manager.php CHANGED
@@ -522,23 +522,26 @@ class TRP_Translation_Manager
522
  {
523
 
524
 
525
- global $trp_translated_gettext_texts;
526
- if (!is_admin() || $this::is_ajax_on_frontend()) {
527
  $language = get_locale();
528
 
529
- if (!$this->trp_query) {
 
530
  $trp = TRP_Translate_Press::get_trp_instance();
531
- $this->trp_query = $trp->get_component('query');
532
- }
 
533
 
534
- $strings = $this->trp_query->get_all_gettext_strings($language);
535
- if (!empty($strings)) {
536
- $trp_translated_gettext_texts = $strings;
537
 
538
- foreach ($trp_translated_gettext_texts as $key => $value) {
539
- $trp_strings[$value['domain'] . '::' . $value['original']] = $value;
 
 
540
  }
541
- $trp_translated_gettext_texts = $trp_strings;
542
  }
543
  }
544
  }
@@ -583,8 +586,7 @@ class TRP_Translation_Manager
583
  $this->call_gettext_filters('woocommerce_');
584
  }
585
 
586
- public function call_gettext_filters($prefix = '')
587
- {
588
  global $pagenow;
589
 
590
  if (!$this->url_converter) {
@@ -596,7 +598,11 @@ class TRP_Translation_Manager
596
  }
597
 
598
  // Do not process gettext strings on wp-login pages. Do not process strings in admin area except for when when is_ajax_on_frontend. Do not process gettext strings when is rest api from admin url referer. Do not process gettext on xmlrpc.pho
599
- if (($pagenow != 'wp-login.php') && (!is_admin() || $this::is_ajax_on_frontend()) && !$this->is_admin_request && $pagenow != 'xmlrpc.php') {
 
 
 
 
600
  add_filter('gettext', array($this, $prefix . 'process_gettext_strings'), 100, 3);
601
  add_filter('gettext_with_context', array($this, $prefix . 'process_gettext_strings_with_context'), 100, 4);
602
  add_filter('ngettext', array($this, $prefix . 'process_ngettext_strings'), 100, 5);
@@ -776,7 +782,8 @@ class TRP_Translation_Manager
776
 
777
  /* get_locale() returns WP Settings Language (WPLANG). It might not be a language in TP so it may not have a TP table. */
778
  $current_locale = get_locale();
779
- if (!in_array($current_locale, $this->settings['translation-languages'])) {
 
780
  return $translation;
781
  }
782
 
522
  {
523
 
524
 
525
+ global $trp_translated_gettext_texts, $trp_translated_gettext_texts_language;
526
+ if ( $this->processing_gettext_is_needed() ){
527
  $language = get_locale();
528
 
529
+ if ( in_array( $language, $this->settings['translation-languages'] ) ) {
530
+ $trp_translated_gettext_texts_language = $language;
531
  $trp = TRP_Translate_Press::get_trp_instance();
532
+ if ( !$this->trp_query ) {
533
+ $this->trp_query = $trp->get_component( 'query' );
534
+ }
535
 
536
+ $strings = $this->trp_query->get_all_gettext_strings( $language );
537
+ if ( !empty( $strings ) ) {
538
+ $trp_translated_gettext_texts = $strings;
539
 
540
+ foreach ( $trp_translated_gettext_texts as $key => $value ) {
541
+ $trp_strings[ $value['domain'] . '::' . $value['original'] ] = $value;
542
+ }
543
+ $trp_translated_gettext_texts = $trp_strings;
544
  }
 
545
  }
546
  }
547
  }
586
  $this->call_gettext_filters('woocommerce_');
587
  }
588
 
589
+ public function processing_gettext_is_needed(){
 
590
  global $pagenow;
591
 
592
  if (!$this->url_converter) {
598
  }
599
 
600
  // Do not process gettext strings on wp-login pages. Do not process strings in admin area except for when when is_ajax_on_frontend. Do not process gettext strings when is rest api from admin url referer. Do not process gettext on xmlrpc.pho
601
+ return (($pagenow != 'wp-login.php') && (!is_admin() || $this::is_ajax_on_frontend()) && !$this->is_admin_request && $pagenow != 'xmlrpc.php');
602
+ }
603
+
604
+ public function call_gettext_filters($prefix = '') {
605
+ if ( $this->processing_gettext_is_needed() ){
606
  add_filter('gettext', array($this, $prefix . 'process_gettext_strings'), 100, 3);
607
  add_filter('gettext_with_context', array($this, $prefix . 'process_gettext_strings_with_context'), 100, 4);
608
  add_filter('ngettext', array($this, $prefix . 'process_ngettext_strings'), 100, 5);
782
 
783
  /* get_locale() returns WP Settings Language (WPLANG). It might not be a language in TP so it may not have a TP table. */
784
  $current_locale = get_locale();
785
+ global $trp_translated_gettext_texts_language;
786
+ if ( !in_array($current_locale, $this->settings['translation-languages'] ) || empty( $trp_translated_gettext_texts_language) || $trp_translated_gettext_texts_language !== $current_locale ) {
787
  return $translation;
788
  }
789
 
includes/compatibility-functions.php CHANGED
@@ -42,7 +42,9 @@ add_filter( 'trp_allow_tp_to_run', 'trp_missing_mbstrings_library' );
42
  */
43
  add_filter( 'nav_menu_link_attributes', 'trp_remove_html_from_menu_title', 10, 3);
44
  function trp_remove_html_from_menu_title( $atts, $item, $args ){
45
- $atts['title'] = wp_strip_all_tags($atts['title']);
 
 
46
  return $atts;
47
  }
48
 
@@ -839,27 +841,51 @@ if( function_exists('ct_is_show_builder') ) {
839
 
840
  }
841
 
842
- /**
843
- * Used to redirect Oxygen Builder front-end to the default language.
844
- * Hooked before TRP_Language_Switcher::redirect_to_correct_language() so we don't redirect twice
845
- */
846
- add_action( 'template_redirect', 'trp_page_builder_compatibility_redirect_to_default_language', 10 );
847
- function trp_page_builder_compatibility_redirect_to_default_language(){
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
848
 
849
- if( !is_admin() && ( ( isset( $_GET['ct_builder'] ) && $_GET['ct_builder'] == 'true' ) || isset( $_GET['fl_builder'] ) ) ){
850
 
851
- $trp = TRP_Translate_Press::get_trp_instance();
852
- $url_converter = $trp->get_component('url_converter');
853
- $settings = ( new TRP_Settings() )->get_settings();
 
 
854
 
855
- $current_url = $url_converter->cur_page_url();
856
- $current_lang = $url_converter->get_lang_from_url_string( $current_url );
857
 
858
- if( ( $current_lang == null && $settings['add-subdirectory-to-default-language'] == 'yes' ) || ( $current_lang != null && $current_lang != $settings['default-language'] ) ){
859
- $link_to_redirect = $url_converter->get_url_for_language( $settings['default-language'], null, '' );
 
 
860
 
861
- wp_redirect( $link_to_redirect, 301 );
862
- exit;
863
  }
864
 
865
  }
@@ -1352,7 +1378,7 @@ function trp_force_search( $bool ){
1352
  add_filter('gettext_with_context', 'trp_mylisting_exclude_string', 101, 4 );
1353
  }
1354
  }
1355
-
1356
  function trp_mylisting_exclude_string( $translation, $text, $context, $domain ){
1357
 
1358
  if( $domain == 'my-listing' && $text == 'my-listings' )
42
  */
43
  add_filter( 'nav_menu_link_attributes', 'trp_remove_html_from_menu_title', 10, 3);
44
  function trp_remove_html_from_menu_title( $atts, $item, $args ){
45
+ if( isset( $atts['title'] ) )
46
+ $atts['title'] = wp_strip_all_tags($atts['title']);
47
+
48
  return $atts;
49
  }
50
 
841
 
842
  }
843
 
844
+ if( function_exists( 'ct_is_show_builder' ) || defined( 'FL_BUILDER_VERSION' ) ){
845
+
846
+ /**
847
+ * Used to redirect Oxygen Builder front-end to the default language.
848
+ * Hooked before TRP_Language_Switcher::redirect_to_correct_language() so we don't redirect twice
849
+ */
850
+ add_action( 'template_redirect', 'trp_page_builder_compatibility_redirect_to_default_language', 10 );
851
+ function trp_page_builder_compatibility_redirect_to_default_language(){
852
+
853
+ if( !is_admin() && ( ( isset( $_GET['ct_builder'] ) && $_GET['ct_builder'] == 'true' ) || isset( $_GET['fl_builder'] ) ) ){
854
+
855
+ $trp = TRP_Translate_Press::get_trp_instance();
856
+ $url_converter = $trp->get_component('url_converter');
857
+ $settings = ( new TRP_Settings() )->get_settings();
858
+
859
+ $current_url = $url_converter->cur_page_url();
860
+ $current_lang = $url_converter->get_lang_from_url_string( $current_url );
861
+
862
+ if( ( $current_lang == null && $settings['add-subdirectory-to-default-language'] == 'yes' ) || ( $current_lang != null && $current_lang != $settings['default-language'] ) ){
863
+ $link_to_redirect = $url_converter->get_url_for_language( $settings['default-language'], null, '' );
864
+
865
+ if( $link_to_redirect != $current_url ){
866
+ wp_redirect( $link_to_redirect, 301 );
867
+ exit;
868
+ }
869
+
870
+ }
871
+
872
+ }
873
 
874
+ }
875
 
876
+ /**
877
+ * Disable automatic language redirect when the Oxygen or Beaver Builders are showing
878
+ */
879
+ add_action( 'plugins_loaded', 'trp_page_builder_compatibility_disable_automatic_language_redirect' );
880
+ function trp_page_builder_compatibility_disable_automatic_language_redirect(){
881
 
882
+ if( ( isset( $_GET['ct_builder'] ) && $_GET['ct_builder'] == 'true' ) || isset( $_GET['fl_builder'] ) ){
 
883
 
884
+ $trp = TRP_Translate_Press::get_trp_instance();
885
+ $loader = $trp->get_component( 'loader' );
886
+
887
+ $loader->remove_hook( 'wp_enqueue_scripts', 'enqueue_cookie_adding' );
888
 
 
 
889
  }
890
 
891
  }
1378
  add_filter('gettext_with_context', 'trp_mylisting_exclude_string', 101, 4 );
1379
  }
1380
  }
1381
+
1382
  function trp_mylisting_exclude_string( $translation, $text, $context, $domain ){
1383
 
1384
  if( $domain == 'my-listing' && $text == 'my-listings' )
includes/external-functions.php CHANGED
@@ -114,3 +114,12 @@ function trp_sort_dictionary_by_original( $dictionaries, $type, $group, $languag
114
  }
115
  return $array;
116
  }
 
 
 
 
 
 
 
 
 
114
  }
115
  return $array;
116
  }
117
+
118
+ function trp_is_valid_language_code( $language_code ){
119
+ // allowed characters A-Z a-z 0-9 - _
120
+ if ( preg_match('/[^A-Za-z0-9\-_]/i', $language_code ) ) {
121
+ return false;
122
+ }else{
123
+ return true;
124
+ }
125
+ }
includes/trp-ajax.php CHANGED
@@ -22,6 +22,10 @@ class TRP_Ajax{
22
  }
23
 
24
  include './external-functions.php';
 
 
 
 
25
 
26
  if ( $this->connect_to_db() ){
27
 
22
  }
23
 
24
  include './external-functions.php';
25
+ if ( !trp_is_valid_language_code( $_POST['language'] ) || !trp_is_valid_language_code( $_POST['$original_language'] ) ) {
26
+ echo json_encode( 'TranslatePress Error: Invalid language code' );
27
+ exit;
28
+ }
29
 
30
  if ( $this->connect_to_db() ){
31
 
index.php CHANGED
@@ -3,7 +3,7 @@
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: 1.9.5
7
  Author: Cozmoslabs, Razvan Mocanu, Madalin Ungureanu, Cristophor Hurduban
8
  Author URI: https://cozmoslabs.com/
9
  Text Domain: translatepress-multilingual
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: 1.9.6
7
  Author: Cozmoslabs, Razvan Mocanu, Madalin Ungureanu, Cristophor Hurduban
8
  Author URI: https://cozmoslabs.com/
9
  Text Domain: translatepress-multilingual
languages/translatepress-multilingual.pot CHANGED
@@ -681,11 +681,11 @@ msgstr ""
681
  msgid "Translate Page"
682
  msgstr ""
683
 
684
- #: includes/class-translation-manager.php:1261
685
  msgid "Security check"
686
  msgstr ""
687
 
688
- #: includes/class-translation-manager.php:1335
689
  msgid "<strong>Warning:</strong> Some strings have possibly incorrectly encoded characters. This may result in breaking the queries, rendering the page untranslated in live mode. Consider revising the following strings or their method of outputting."
690
  msgstr ""
691
 
681
  msgid "Translate Page"
682
  msgstr ""
683
 
684
+ #: includes/class-translation-manager.php:1268
685
  msgid "Security check"
686
  msgstr ""
687
 
688
+ #: includes/class-translation-manager.php:1342
689
  msgid "<strong>Warning:</strong> Some strings have possibly incorrectly encoded characters. This may result in breaking the queries, rendering the page untranslated in live mode. Consider revising the following strings or their method of outputting."
690
  msgstr ""
691
 
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.6.1
7
  Requires PHP: 5.6.20
8
- Stable tag: 1.9.5
9
  License: GPLv2 or later
10
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
11
 
@@ -138,6 +138,14 @@ For more information please check out our [documentation](https://translatepress
138
 
139
 
140
  == Changelog ==
 
 
 
 
 
 
 
 
141
  = 1.9.5 =
142
  * Added setting that allows you to translate only certain paths or exclude certain paths from being translated.
143
  * Fixed some cases where GET parameters were lost from links in translated languages
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.6.2
7
  Requires PHP: 5.6.20
8
+ Stable tag: 1.9.6
9
  License: GPLv2 or later
10
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
11
 
138
 
139
 
140
  == Changelog ==
141
+ = 1.9.6 =
142
+ * Adding missing Uruguay flag
143
+ * Improved security for dynamic translations
144
+ * Disable automatic language redirect when editing a page with Oxygen or Beaver Builder
145
+ * Fixed cases of missing table sql errors
146
+ * Fixed sql error for some MariaDB setups due to deprecated syntax
147
+ * Fixed some issues with Exclude certain paths functionality.
148
+
149
  = 1.9.5 =
150
  * Added setting that allows you to translate only certain paths or exclude certain paths from being translated.
151
  * Fixed some cases where GET parameters were lost from links in translated languages