TranslatePress – Translate Multilingual sites - Version 1.6.2

Version Description

  • Fixed admin-bar appearing in translation editor
  • Nextgen plugin compatibility fix
  • Fixed a notice index translation-engine not set.
  • Refactored upgrading settings.
  • Solved issue with notifications shown in all backend that couldn't be dismissed
  • Added ability to detect if table is missing during requests. Show admin notice on all pages.
  • Updated License message and Automatic Translation description
  • Created notifications and error page. Disabled machine translations upon error.
Download this release

Release Info

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

Code changes from version 1.6.1 to 1.6.2

class-translate-press.php CHANGED
@@ -26,6 +26,7 @@ class TRP_Translate_Press{
26
  protected $advanced_tab;
27
  protected $translation_memory;
28
  protected $machine_translation_tab;
 
29
 
30
  public $active_pro_addons = array();
31
  public static $translate_press = null;
@@ -51,7 +52,7 @@ class TRP_Translate_Press{
51
  define( 'TRP_PLUGIN_URL', plugin_dir_url( __FILE__ ) );
52
  define( 'TRP_PLUGIN_BASE', plugin_basename( __DIR__ . '/index.php' ) );
53
  define( 'TRP_PLUGIN_SLUG', 'translatepress-multilingual' );
54
- define( 'TRP_PLUGIN_VERSION', '1.6.1' );
55
 
56
  wp_cache_add_non_persistent_groups(array('trp'));
57
 
@@ -96,6 +97,7 @@ class TRP_Translate_Press{
96
  require_once TRP_PLUGIN_DIR . 'includes/class-plugin-notices.php';
97
  require_once TRP_PLUGIN_DIR . 'includes/class-advanced-tab.php';
98
  require_once TRP_PLUGIN_DIR . 'includes/class-translation-memory.php';
 
99
  require_once TRP_PLUGIN_DIR . 'includes/external-functions.php';
100
  require_once TRP_PLUGIN_DIR . 'includes/compatibility-functions.php';
101
  require_once TRP_PLUGIN_DIR . 'includes/functions.php';
@@ -131,6 +133,7 @@ class TRP_Translate_Press{
131
  $this->plugin_updater = new TRP_Plugin_Updater();
132
  $this->license_page = new TRP_LICENSE_PAGE();
133
  $this->translation_memory = new TRP_Translation_Memory( $this->settings->get_settings() );
 
134
  }
135
 
136
  /**
@@ -189,6 +192,13 @@ class TRP_Translate_Press{
189
  //Machine Translation Logger defaults
190
  $this->loader->add_action( 'trp_machine_translation_sanitize_settings', $this->machine_translator_logger, 'sanitize_settings', 10, 1 );
191
 
 
 
 
 
 
 
 
192
  $this->loader->add_action( 'wp_ajax_nopriv_trp_get_translations_regular', $this->editor_api_regular_strings, 'get_translations' );
193
 
194
  $this->loader->add_action( 'wp_ajax_trp_get_translations_regular', $this->editor_api_regular_strings, 'get_translations' );
@@ -239,7 +249,7 @@ class TRP_Translate_Press{
239
  if( isset( $_REQUEST['doing_wp_cron'] ) )
240
  return;
241
 
242
- $this->loader->add_action( 'init', $this->translation_render, 'start_output_buffer', 0 );
243
  $this->loader->add_action( 'wp_enqueue_scripts', $this->translation_render, 'enqueue_scripts', 10 );
244
  $this->loader->add_action( 'wp_enqueue_scripts', $this->translation_render, 'enqueue_dynamic_translation', 1 );
245
  $this->loader->add_filter( 'wp_redirect', $this->translation_render, 'force_preview_on_url_redirect', 99, 2 );
26
  protected $advanced_tab;
27
  protected $translation_memory;
28
  protected $machine_translation_tab;
29
+ protected $error_manager;
30
 
31
  public $active_pro_addons = array();
32
  public static $translate_press = null;
52
  define( 'TRP_PLUGIN_URL', plugin_dir_url( __FILE__ ) );
53
  define( 'TRP_PLUGIN_BASE', plugin_basename( __DIR__ . '/index.php' ) );
54
  define( 'TRP_PLUGIN_SLUG', 'translatepress-multilingual' );
55
+ define( 'TRP_PLUGIN_VERSION', '1.6.2' );
56
 
57
  wp_cache_add_non_persistent_groups(array('trp'));
58
 
97
  require_once TRP_PLUGIN_DIR . 'includes/class-plugin-notices.php';
98
  require_once TRP_PLUGIN_DIR . 'includes/class-advanced-tab.php';
99
  require_once TRP_PLUGIN_DIR . 'includes/class-translation-memory.php';
100
+ require_once TRP_PLUGIN_DIR . 'includes/class-error-manager.php';
101
  require_once TRP_PLUGIN_DIR . 'includes/external-functions.php';
102
  require_once TRP_PLUGIN_DIR . 'includes/compatibility-functions.php';
103
  require_once TRP_PLUGIN_DIR . 'includes/functions.php';
133
  $this->plugin_updater = new TRP_Plugin_Updater();
134
  $this->license_page = new TRP_LICENSE_PAGE();
135
  $this->translation_memory = new TRP_Translation_Memory( $this->settings->get_settings() );
136
+ $this->error_manager = new TRP_Error_Manager( $this->settings->get_settings() );
137
  }
138
 
139
  /**
192
  //Machine Translation Logger defaults
193
  $this->loader->add_action( 'trp_machine_translation_sanitize_settings', $this->machine_translator_logger, 'sanitize_settings', 10, 1 );
194
 
195
+ //Error manager hooks
196
+ $this->loader->add_action( 'admin_init', $this->error_manager, 'show_notification_about_errors', 10 );
197
+ $this->loader->add_action( 'admin_menu', $this->error_manager, 'register_submenu_errors_page', 10 );
198
+ $this->loader->add_action( 'trp_dismiss_notification', $this->error_manager, 'clear_notification_from_db', 10, 2 );
199
+ $this->loader->add_filter( 'trp_machine_translation_sanitize_settings', $this->error_manager, 'clear_disable_machine_translation_notification_from_db', 10, 1 );
200
+ $this->loader->add_filter( 'trp_error_manager_page_output', $this->error_manager, 'output_db_errors', 10, 1 );
201
+
202
  $this->loader->add_action( 'wp_ajax_nopriv_trp_get_translations_regular', $this->editor_api_regular_strings, 'get_translations' );
203
 
204
  $this->loader->add_action( 'wp_ajax_trp_get_translations_regular', $this->editor_api_regular_strings, 'get_translations' );
249
  if( isset( $_REQUEST['doing_wp_cron'] ) )
250
  return;
251
 
252
+ $this->loader->add_action( 'init', $this->translation_render, 'start_output_buffer', apply_filters( 'trp_start_output_buffer_priority', 0 ) );
253
  $this->loader->add_action( 'wp_enqueue_scripts', $this->translation_render, 'enqueue_scripts', 10 );
254
  $this->loader->add_action( 'wp_enqueue_scripts', $this->translation_render, 'enqueue_dynamic_translation', 1 );
255
  $this->loader->add_filter( 'wp_redirect', $this->translation_render, 'force_preview_on_url_redirect', 99, 2 );
includes/class-error-manager.php ADDED
@@ -0,0 +1,149 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Class TRP_Error_Manager
5
+ */
6
+ class TRP_Error_Manager{
7
+ protected $settings;
8
+ /* @var TRP_Settings */
9
+ protected $trp_settings;
10
+
11
+ public function __construct( $settings){
12
+ $this->settings = $settings;
13
+ }
14
+
15
+ /**
16
+ * Record specified error in trp_db_errors option
17
+ *
18
+ * @param $error_details array Suggested fields:
19
+ 'last_error' => $this->db->last_error,
20
+ 'details' => 'Insert general description',
21
+ 'disable_automatic_translations' => bool
22
+ */
23
+ public function record_error( $error_details ){
24
+ $option = get_option('trp_db_errors', array(
25
+ 'notifications' => array(),
26
+ 'errors' => array()
27
+ ));
28
+ if ( count( $option['errors'] ) >= 5 ){
29
+ // only record the last few errors to avoid huge db options
30
+ array_shift($option['errors'] );
31
+ }
32
+ $error_details['date_time'] = date('Y-m-d H:i:s');
33
+ $error_details['timestamp'] = time();
34
+
35
+ // specific actions for this error: add notification message and disable machine translation
36
+ if ( isset( $error_details['disable_automatic_translations'] ) && $error_details['disable_automatic_translations'] === true ){
37
+
38
+ if ( ! $this->trp_settings ) {
39
+ $trp = TRP_Translate_Press::get_trp_instance();
40
+ $this->trp_settings = $trp->get_component( 'settings' );
41
+ }
42
+ $error_message = wp_kses( sprintf( __('<strong>TranslatePress</strong> encountered SQL errors. <a href="%s" title="View TranslatePress SQL Errors">Check out the errors</a>.', 'translatepress-multilingual'), admin_url( 'admin.php?page=trp_error_manager' ) ), array('a' => array('href' => array(), 'title' => array()), 'strong' => array()));
43
+ $mt_settings_option = get_option('trp_machine_translation_settings', $this->trp_settings->get_default_trp_machine_translation_settings() );
44
+ if ( $mt_settings_option['machine-translation'] != 'no' ) {
45
+ $mt_settings_option['machine-translation'] = 'no';
46
+ update_option('trp_machine_translation_settings', $mt_settings_option );
47
+
48
+ // filter is needed to block automatic translation in this execution. The settings don't update throughout the plugin for this request. Only the next request will have machine translation turned off.
49
+ add_filter( 'trp_disable_automatic_translations_due_to_error', __return_true() );
50
+
51
+ $error_message = wp_kses( __('Automatic translation has been disabled.','translatepress-multilingual'), array('strong' => array() ) ) . ' ' . $error_message ;
52
+ }
53
+ if ( !isset( $option['notifications']['disable_automatic_translations'] ) ) {
54
+ $option['notifications']['disable_automatic_translations' ] = array(
55
+ // we need a unique ID so that after the notice is dismissed and this type of error appears again, it's not already marked as dismissed for that user
56
+ 'notification_id' => 'disable_automatic_translations' . time(),
57
+ 'message' => $error_message
58
+ );
59
+ }
60
+ }
61
+
62
+
63
+ $option['errors'][] = $error_details;
64
+ update_option( 'trp_db_errors', $option );
65
+ }
66
+
67
+
68
+ /**
69
+ * Remove notification from trp_db_errors too (not only user_meta) when dismissed by user
70
+ *
71
+ * Necessary in order to allow logging of this error in the future. Basically allow creation of new notifications about this error.
72
+ *
73
+ * Hooked to trp_dismiss_notification
74
+ *
75
+ * @param $notification_id
76
+ * @param $current_user
77
+ */
78
+ public function clear_notification_from_db($notification_id, $current_user ){
79
+ $option = get_option( 'trp_db_errors', false );
80
+ if ( isset( $option['notifications'] ) ) {
81
+ foreach ($option['notifications'] as $key => $logged_notification ){
82
+ if ( $logged_notification['notification_id'] === $notification_id || $key === $notification_id ) {
83
+ unset( $option['notifications'][$key] );
84
+ update_option('trp_db_errors', $option );
85
+ break;
86
+ }
87
+ }
88
+ }
89
+ }
90
+
91
+ /**
92
+ * When enabling machine translation, clear the Automatic translation has been disabled message
93
+ *
94
+ * @param $mt_settings
95
+ * @return string $mt_settings
96
+ */
97
+ public function clear_disable_machine_translation_notification_from_db( $mt_settings ){
98
+ if ( $mt_settings['machine-translation'] === 'yes' ){
99
+ $this->clear_notification_from_db('disable_automatic_translations', null);
100
+ }
101
+ return $mt_settings;
102
+ }
103
+
104
+ /**
105
+ *
106
+ * Hooked to admin_init
107
+ */
108
+ public function show_notification_about_errors(){
109
+ $option = get_option( 'trp_db_errors', false );
110
+ if ( $option !== false ) {
111
+ foreach( $option['notifications'] as $logged_notification ) {
112
+ $notifications = TRP_Plugin_Notifications::get_instance();
113
+
114
+ $notification_id = $logged_notification['notification_id'];
115
+
116
+ $message = '<p style="padding-right:30px;">' . $logged_notification['message'] . '</p>';
117
+ //make sure to use the trp_dismiss_admin_notification arg
118
+ $message .= '<a href="' . add_query_arg(array('trp_dismiss_admin_notification' => $notification_id)) . '" type="button" class="notice-dismiss" style="text-decoration: none;z-index:100;"><span class="screen-reader-text">' . __('Dismiss this notice.', 'translatepress-multilingual') . '</span></a>';
119
+
120
+ $notifications->add_notification($notification_id, $message, 'trp-notice trp-narrow notice error is-dismissible', true, array('translate-press'), true);
121
+ }
122
+ }
123
+ }
124
+
125
+ public function register_submenu_errors_page(){
126
+ add_submenu_page( 'TRPHidden', 'TranslatePress Error Manager', 'TRPHidden', 'manage_options', 'trp_error_manager', array( $this, 'error_manager_page_content' ) );
127
+ }
128
+
129
+ public function error_manager_page_content(){
130
+ require_once TRP_PLUGIN_DIR . 'partials/error-manager-page.php';
131
+ }
132
+
133
+ public function output_db_errors( $html_content ){
134
+ $option = get_option( 'trp_db_errors', false );
135
+ if ( $option !== false && isset($option['errors']) ) {
136
+ $html_content .= '<table>';
137
+ foreach ($option['errors'] as $count => $error) {
138
+ $count = ( is_int( $count) ) ? $count + 1 : $count;
139
+ $html_content .= '<tr><td>' . esc_html($count) . '</td></tr>';
140
+ foreach( $error as $key => $error_detail ){
141
+ $html_content .= '<tr><td><strong>' . esc_html($key ) . '</strong></td>' . '<td>' .esc_html( $error_detail ) . '</td></tr>';
142
+ }
143
+
144
+ }
145
+ $html_content .= '</table>';
146
+ }
147
+ return $html_content;
148
+ }
149
+ }
includes/class-machine-translation-tab.php CHANGED
@@ -8,8 +8,7 @@ class TRP_Machine_Translation_Tab {
8
 
9
  $this->settings = $settings;
10
 
11
- if( !class_exists( 'TRP_DeepL' ) )
12
- add_filter( 'trp_machine_translation_engines', [ $this, 'translation_engines_upsell' ], 20 );
13
 
14
  }
15
 
@@ -111,6 +110,11 @@ class TRP_Machine_Translation_Tab {
111
  return new $value( $this->settings );
112
  }
113
 
 
 
 
 
 
114
  public function translation_engines_upsell( $engines ){
115
  $engines[] = array( 'value' => 'deepl_upsell', 'label' => __( 'DeepL', 'translatepress-multilingual' ) );
116
 
8
 
9
  $this->settings = $settings;
10
 
11
+ add_action( 'plugins_loaded', array( $this, 'add_upsell_filter' ) );
 
12
 
13
  }
14
 
110
  return new $value( $this->settings );
111
  }
112
 
113
+ public function add_upsell_filter(){
114
+ if( !class_exists( 'TRP_DeepL' ) )
115
+ add_filter( 'trp_machine_translation_engines', [ $this, 'translation_engines_upsell' ], 20 );
116
+ }
117
+
118
  public function translation_engines_upsell( $engines ){
119
  $engines[] = array( 'value' => 'deepl_upsell', 'label' => __( 'DeepL', 'translatepress-multilingual' ) );
120
 
includes/class-machine-translator.php CHANGED
@@ -153,7 +153,7 @@ class TRP_Machine_Translator {
153
  * @return array
154
  */
155
  public function translate($strings, $target_language_code, $source_language_code = null ){
156
- if ( !empty($strings) && is_array($strings) && method_exists( $this, 'translate_array' ) ) {
157
 
158
  /* google has a problem translating this characters ( '%', '$', '#' )...for some reasons it puts spaces after them so we need to 'encode' them and decode them back. hopefully it won't break anything important */
159
  $trp_exclude_words_from_automatic_translation = apply_filters('trp_exclude_words_from_automatic_translation', array('%', '$', '#'));
153
  * @return array
154
  */
155
  public function translate($strings, $target_language_code, $source_language_code = null ){
156
+ if ( !empty($strings) && is_array($strings) && method_exists( $this, 'translate_array' ) && apply_filters( 'trp_disable_automatic_translations_due_to_error', false ) === false ) {
157
 
158
  /* google has a problem translating this characters ( '%', '$', '#' )...for some reasons it puts spaces after them so we need to 'encode' them and decode them back. hopefully it won't break anything important */
159
  $trp_exclude_words_from_automatic_translation = apply_filters('trp_exclude_words_from_automatic_translation', array('%', '$', '#'));
includes/class-plugin-notices.php CHANGED
@@ -42,13 +42,20 @@ class TRP_Add_General_Notices{
42
  if ( current_user_can( 'manage_options' ) ){
43
  // Check that the user hasn't already clicked to ignore the message
44
  if ( ! get_user_meta($user_id, $this->notificationId.'_dismiss_notification' ) || $this->force_show ) {//ignore the dismissal if we have force_show
45
- echo $finalMessage = wp_kses( apply_filters($this->notificationId.'_notification_message','<div class="'. $this->notificationClass .'" >'.$this->notificationMessage.'</div>', $this->notificationMessage), [ 'div' => [ 'class' => [] ], 'p' => ['style' => [], 'class' => []], 'a' => ['href' => [], 'type'=> [], 'class'=> []], 'span' => ['class'=> []], 'strong' => [] ] );
 
 
46
  }
47
  do_action( $this->notificationId.'_notification_displayed', $current_user, $pagenow );
48
  }
49
  do_action( $this->notificationId.'_after_notification_displayed', $current_user, $pagenow );
50
  }
51
 
 
 
 
 
 
52
  function dismiss_notification() {
53
  global $current_user;
54
 
@@ -233,6 +240,7 @@ Class TRP_Plugin_Notifications {
233
  public function dismiss_notification( $notification_id = '' ) {
234
  global $current_user;
235
  add_user_meta( $current_user->ID, $notification_id . '_dismiss_notification', 'true', true );
 
236
  }
237
 
238
 
42
  if ( current_user_can( 'manage_options' ) ){
43
  // Check that the user hasn't already clicked to ignore the message
44
  if ( ! get_user_meta($user_id, $this->notificationId.'_dismiss_notification' ) || $this->force_show ) {//ignore the dismissal if we have force_show
45
+ add_filter('safe_style_css', array( $this, 'allow_z_index_in_wp_kses'));
46
+ echo $finalMessage = wp_kses( apply_filters($this->notificationId.'_notification_message','<div class="'. $this->notificationClass .'" >'.$this->notificationMessage.'</div>', $this->notificationMessage), [ 'div' => [ 'class' => [] ], 'p' => ['style' => [], 'class' => []], 'a' => ['href' => [], 'type'=> [], 'class'=> [], 'style'=>[]], 'span' => ['class'=> []], 'strong' => [] ] );
47
+ remove_filter('safe_style_css', array( $this, 'allow_z_index_in_wp_kses'));
48
  }
49
  do_action( $this->notificationId.'_notification_displayed', $current_user, $pagenow );
50
  }
51
  do_action( $this->notificationId.'_after_notification_displayed', $current_user, $pagenow );
52
  }
53
 
54
+ function allow_z_index_in_wp_kses( $styles ) {
55
+ $styles[] = 'z-index';
56
+ return $styles;
57
+ }
58
+
59
  function dismiss_notification() {
60
  global $current_user;
61
 
240
  public function dismiss_notification( $notification_id = '' ) {
241
  global $current_user;
242
  add_user_meta( $current_user->ID, $notification_id . '_dismiss_notification', 'true', true );
243
+ do_action('trp_dismiss_notification', $notification_id, $current_user);
244
  }
245
 
246
 
includes/class-query.php CHANGED
@@ -12,6 +12,8 @@ class TRP_Query{
12
  public $db;
13
  protected $settings;
14
  protected $translation_render;
 
 
15
 
16
  const NOT_TRANSLATED = 0;
17
  const MACHINE_TRANSLATED = 1;
@@ -76,6 +78,11 @@ class TRP_Query{
76
  $prepared_query = $this->db->prepare( $query, $values );
77
  $dictionary = $this->db->get_results( $prepared_query, OBJECT_K );
78
 
 
 
 
 
 
79
  if ($this->db->last_error !== '')
80
  $dictionary = false;
81
 
@@ -163,12 +170,19 @@ class TRP_Query{
163
  $sql_index = "CREATE INDEX index_name ON `" . $table_name . "` (original(100));";
164
  $this->db->query( $sql_index );
165
 
166
- // full text index for original
167
- $sql_index = "CREATE FULLTEXT INDEX original_fulltext ON `" . $table_name . "`(original);";
168
- $this->db->query( $sql_index );
169
 
170
- //syncronize all translation blocks.
171
- $this->copy_all_translation_blocks_into_table( $default_language, $language_code );
 
 
 
 
 
 
 
 
 
172
  }else{
173
  $this->check_for_block_type_column( $language_code, $default_language );
174
  }
@@ -202,8 +216,11 @@ class TRP_Query{
202
  require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
203
  dbDelta( $sql );
204
 
 
 
205
  if ( $this->db->get_var( "SHOW TABLES LIKE '$table_name'" ) != $table_name )
206
  {
 
207
  // something failed. Table still doesn't exist.
208
  return false;
209
  }
@@ -257,6 +274,8 @@ class TRP_Query{
257
  require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
258
  dbDelta( $sql );
259
 
 
 
260
  $sql_index = "CREATE INDEX index_name ON `" . $table_name . "` (original(100));";
261
  $this->db->query( $sql_index );
262
 
@@ -372,6 +391,8 @@ class TRP_Query{
372
 
373
  $prepared_query = $this->db->prepare($query . ' ', $values);
374
  $this->db->query( $prepared_query );
 
 
375
  }
376
 
377
  /**
@@ -403,6 +424,8 @@ class TRP_Query{
403
  // you cannot insert multiple rows at once using insert() method.
404
  // but by using prepare you cannot insert NULL values.
405
  $this->db->query( $this->db->prepare($query . ' ', $values) );
 
 
406
  }
407
 
408
  public function insert_gettext_strings( $new_strings, $language_code ){
@@ -436,6 +459,8 @@ class TRP_Query{
436
 
437
  $query .= implode(', ', $place_holders);
438
  $this->db->query( $this->db->prepare($query . ' ', $values) );
 
 
439
 
440
  if( count( $new_strings ) == 1 )
441
  return $this->db->insert_id;
@@ -497,6 +522,8 @@ class TRP_Query{
497
  $query .= $on_duplicate;
498
 
499
  $this->db->query( $this->db->prepare($query . ' ', $values) );
 
 
500
  }
501
 
502
  /**
@@ -521,6 +548,8 @@ class TRP_Query{
521
 
522
  $query .= "( " . implode ( ", ", $placeholders ) . " )";
523
  $dictionary = $this->db->get_results( $this->db->prepare( $query, $values ), $output );
 
 
524
  return $dictionary;
525
  }
526
 
@@ -548,6 +577,7 @@ class TRP_Query{
548
 
549
  $query .= "( " . implode ( ", ", $placeholders ) . " )";
550
  $dictionary = $this->db->get_results( $this->db->prepare( $query, $values ), OBJECT_K );
 
551
  return $dictionary;
552
  }
553
 
@@ -575,13 +605,17 @@ class TRP_Query{
575
 
576
  public function get_all_gettext_strings( $language_code ){
577
  $dictionary = $this->db->get_results( "SELECT id, original, translated, domain FROM `" . sanitize_text_field( $this->get_gettext_table_name( $language_code ) ) . "`", ARRAY_A );
578
-
 
 
 
 
579
  return $dictionary;
580
  }
581
 
582
  public function get_all_gettext_translated_strings( $language_code ){
583
  $dictionary = $this->db->get_results("SELECT id, original, translated, domain FROM `" . sanitize_text_field( $this->get_gettext_table_name( $language_code ) ) . "` WHERE translated <>'' AND status != " . self::NOT_TRANSLATED, ARRAY_A );
584
-
585
  return $dictionary;
586
  }
587
 
@@ -645,6 +679,7 @@ class TRP_Query{
645
 
646
 
647
  $dictionary = $this->db->get_results( $query, $output );
 
648
  return $dictionary;
649
  }
650
 
@@ -663,6 +698,7 @@ class TRP_Query{
663
 
664
  $query .= "( " . implode ( ", ", $placeholders ) . " )";
665
  $dictionary = $this->db->get_results( $this->db->prepare( $query, $values ), ARRAY_A );
 
666
  return $dictionary;
667
  }
668
 
@@ -681,6 +717,7 @@ class TRP_Query{
681
 
682
  $query .= "( " . implode ( ", ", $placeholders ) . " )";
683
  $dictionary = $this->db->get_results( $this->db->prepare( $query, $values ), ARRAY_A );
 
684
  return $dictionary;
685
  }
686
 
@@ -829,4 +866,39 @@ class TRP_Query{
829
  return $this->db->query( $sql );
830
  }
831
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
832
  }
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;
78
  $prepared_query = $this->db->prepare( $query, $values );
79
  $dictionary = $this->db->get_results( $prepared_query, OBJECT_K );
80
 
81
+ $this->maybe_record_automatic_translation_error(array( 'details' => 'Error running get_existing_translations()' ) );
82
+ if ( is_array( $dictionary ) && count( $dictionary ) === 0 && !$this->table_exists($this->get_table_name( $language_code )) ){
83
+ // if table is missing then last_error is empty for the select query
84
+ $this->maybe_record_automatic_translation_error(array( 'details' => 'Missing table ' . $this->get_table_name( $language_code ) ), true );
85
+ }
86
  if ($this->db->last_error !== '')
87
  $dictionary = false;
88
 
170
  $sql_index = "CREATE INDEX index_name ON `" . $table_name . "` (original(100));";
171
  $this->db->query( $sql_index );
172
 
173
+ $this->maybe_record_automatic_translation_error(array( 'details' => 'Error creating regular tables' ) );
 
 
174
 
175
+ if ( $this->db->get_var( "SHOW TABLES LIKE '$table_name'" ) != $table_name ) {
176
+ // table still doesn't exist after creation
177
+ $this->maybe_record_automatic_translation_error(array( 'details' => 'Error creating regular strings tables' ), true );
178
+ }else {
179
+ // full text index for original
180
+ $sql_index = "CREATE FULLTEXT INDEX original_fulltext ON `" . $table_name . "`(original);";
181
+ $this->db->query( $sql_index );
182
+
183
+ //syncronize all translation blocks.
184
+ $this->copy_all_translation_blocks_into_table($default_language, $language_code);
185
+ }
186
  }else{
187
  $this->check_for_block_type_column( $language_code, $default_language );
188
  }
216
  require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
217
  dbDelta( $sql );
218
 
219
+ $this->maybe_record_automatic_translation_error(array( 'details' => 'Error creating machine translation log tables' ) );
220
+
221
  if ( $this->db->get_var( "SHOW TABLES LIKE '$table_name'" ) != $table_name )
222
  {
223
+ $this->maybe_record_automatic_translation_error(array( 'details' => 'Error creating machine translation log tables' ), true );
224
  // something failed. Table still doesn't exist.
225
  return false;
226
  }
274
  require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
275
  dbDelta( $sql );
276
 
277
+ $this->maybe_record_automatic_translation_error(array( 'details' => 'Error creating gettext strings tables' ) );
278
+
279
  $sql_index = "CREATE INDEX index_name ON `" . $table_name . "` (original(100));";
280
  $this->db->query( $sql_index );
281
 
391
 
392
  $prepared_query = $this->db->prepare($query . ' ', $values);
393
  $this->db->query( $prepared_query );
394
+
395
+ $this->maybe_record_automatic_translation_error(array( 'details' => 'Error running update_strings()' ) );
396
  }
397
 
398
  /**
424
  // you cannot insert multiple rows at once using insert() method.
425
  // but by using prepare you cannot insert NULL values.
426
  $this->db->query( $this->db->prepare($query . ' ', $values) );
427
+
428
+ $this->maybe_record_automatic_translation_error(array( 'details' => 'Error running insert_strings()' ) );
429
  }
430
 
431
  public function insert_gettext_strings( $new_strings, $language_code ){
459
 
460
  $query .= implode(', ', $place_holders);
461
  $this->db->query( $this->db->prepare($query . ' ', $values) );
462
+
463
+ $this->maybe_record_automatic_translation_error(array( 'details' => 'Error running insert_gettext_strings()' ) );
464
 
465
  if( count( $new_strings ) == 1 )
466
  return $this->db->insert_id;
522
  $query .= $on_duplicate;
523
 
524
  $this->db->query( $this->db->prepare($query . ' ', $values) );
525
+
526
+ $this->maybe_record_automatic_translation_error(array( 'details' => 'Error running update_gettext_strings()' ) );
527
  }
528
 
529
  /**
548
 
549
  $query .= "( " . implode ( ", ", $placeholders ) . " )";
550
  $dictionary = $this->db->get_results( $this->db->prepare( $query, $values ), $output );
551
+
552
+ $this->maybe_record_automatic_translation_error(array( 'details' => 'Error running get_string_ids()' ) );
553
  return $dictionary;
554
  }
555
 
577
 
578
  $query .= "( " . implode ( ", ", $placeholders ) . " )";
579
  $dictionary = $this->db->get_results( $this->db->prepare( $query, $values ), OBJECT_K );
580
+ $this->maybe_record_automatic_translation_error(array( 'details' => 'Error running get_untranslated_strings()' ) );
581
  return $dictionary;
582
  }
583
 
605
 
606
  public function get_all_gettext_strings( $language_code ){
607
  $dictionary = $this->db->get_results( "SELECT id, original, translated, domain FROM `" . sanitize_text_field( $this->get_gettext_table_name( $language_code ) ) . "`", ARRAY_A );
608
+ if ( is_array( $dictionary ) && count( $dictionary ) === 0 && !$this->table_exists($this->get_gettext_table_name( $language_code )) ){
609
+ // if table is missing then last_error is empty
610
+ $this->maybe_record_automatic_translation_error(array( 'details' => 'Missing table ' . $this->get_gettext_table_name( $language_code ) ), true );
611
+ }
612
+ $this->maybe_record_automatic_translation_error(array( 'details' => 'Error running get_all_gettext_strings()' ) );
613
  return $dictionary;
614
  }
615
 
616
  public function get_all_gettext_translated_strings( $language_code ){
617
  $dictionary = $this->db->get_results("SELECT id, original, translated, domain FROM `" . sanitize_text_field( $this->get_gettext_table_name( $language_code ) ) . "` WHERE translated <>'' AND status != " . self::NOT_TRANSLATED, ARRAY_A );
618
+ $this->maybe_record_automatic_translation_error(array( 'details' => 'Error running get_all_gettext_translated_strings()' ) );
619
  return $dictionary;
620
  }
621
 
679
 
680
 
681
  $dictionary = $this->db->get_results( $query, $output );
682
+ $this->maybe_record_automatic_translation_error(array( 'details' => 'Error running get_string_rows()' ) );
683
  return $dictionary;
684
  }
685
 
698
 
699
  $query .= "( " . implode ( ", ", $placeholders ) . " )";
700
  $dictionary = $this->db->get_results( $this->db->prepare( $query, $values ), ARRAY_A );
701
+ $this->maybe_record_automatic_translation_error(array( 'details' => 'Error running get_gettext_string_rows_by_ids()' ) );
702
  return $dictionary;
703
  }
704
 
717
 
718
  $query .= "( " . implode ( ", ", $placeholders ) . " )";
719
  $dictionary = $this->db->get_results( $this->db->prepare( $query, $values ), ARRAY_A );
720
+ $this->maybe_record_automatic_translation_error(array( 'details' => 'Error running get_gettext_string_rows_by_original()' ) );
721
  return $dictionary;
722
  }
723
 
866
  return $this->db->query( $sql );
867
  }
868
 
869
+ public function maybe_record_automatic_translation_error($error_details = array(), $ignore_last_error = false ){
870
+ if ( !empty( $this->db->last_error) || $ignore_last_error ){
871
+ if( !$this->error_manager ){
872
+ $trp = TRP_Translate_Press::get_trp_instance();
873
+ $this->error_manager = $trp->get_component( 'error_manager' );
874
+ }
875
+ $default_error_details = array(
876
+ 'last_error' => $this->db->last_error,
877
+ 'disable_automatic_translations' => true
878
+ );
879
+ $error_details = array_merge( $default_error_details, $error_details );
880
+ $this->error_manager->record_error( $error_details );
881
+ }
882
+ }
883
+
884
+ /**
885
+ * Return true if table exists in db, return false otherwise
886
+ *
887
+ * @param $table_name
888
+ * @param $ignore_cache
889
+ * @return bool
890
+ */
891
+ public function table_exists($table_name, $ignore_cache = false ){
892
+ if( !$ignore_cache && in_array( $table_name, $this->tables_exist ) ){
893
+ return true;
894
+ }
895
+
896
+ $table_name = sanitize_text_field($table_name);
897
+ $table_found = $this->db->get_var( "SHOW TABLES LIKE '$table_name'" ) == $table_name;
898
+ if ( $table_found ) {
899
+ $this->tables_exist[] = $table_name;
900
+ }
901
+ return $table_found;
902
+ }
903
+
904
  }
includes/class-settings.php CHANGED
@@ -292,35 +292,6 @@ class TRP_Settings{
292
  'url-slugs' => array( 'en_US' => 'en', '' ),
293
  );
294
 
295
-
296
-
297
- /* BEGIN Upgrade settings from TP version 1.5.8 or earlier to 1.6.1+*/
298
- $machine_translation_settings = get_option( 'trp_machine_translation_settings', false );
299
-
300
- // move the old API key option
301
- if( !empty( $settings_option['g-translate-key'] ) && empty( $machine_translation_settings['google-translate-key'] ) ){
302
- $machine_translation_settings['google-translate-key'] = $settings_option['g-translate-key'];
303
-
304
- update_option( 'trp_machine_translation_settings', $machine_translation_settings );
305
- }
306
-
307
- // enable machine translation if it was activated before
308
- if( !empty( $settings_option['g-translate'] ) && $settings_option['g-translate'] == 'yes' && ( isset( $machine_translation_settings['machine-translation'] ) && $machine_translation_settings['machine-translation'] != 'yes' ) ){
309
- $machine_translation_settings['machine-translation'] = 'yes';
310
-
311
- update_option( 'trp_machine_translation_settings', $machine_translation_settings );
312
- }
313
-
314
- // set date if missing because of migration of machine translation settings from trp_settings option to trp_machine_translation_settings option
315
- if ( !empty($machine_translation_settings) && empty( $machine_translation_settings['machine_translation_counter_date'] ) ){
316
- $machine_translation_settings['machine_translation_counter_date'] = date ("Y-m-d" );
317
- $machine_translation_settings['machine_translation_counter'] = 0;
318
- update_option( 'trp_machine_translation_settings', $machine_translation_settings );
319
- }
320
- /* END Upgrade settings */
321
-
322
-
323
-
324
  if ( 'not_set' == $settings_option ){
325
  update_option ( 'trp_settings', $default_settings );
326
  $settings_option = $default_settings;
@@ -333,14 +304,17 @@ class TRP_Settings{
333
  }
334
  }
335
 
336
- // These options are not part of the actual trp_settings DB option. But they are included in $settings variable across TP
 
 
 
 
337
  $settings_option['trp_advanced_settings'] = get_option('trp_advanced_settings', array() );
338
- $settings_option['trp_machine_translation_settings'] = get_option('trp_machine_translation_settings', array(
339
- // default settings for trp_machine_translation_settings
340
- 'machine-translation' => 'no',
341
- 'translation-engine' => 'google_translate_v2',
342
- 'block-crawlers' => 'yes'
343
- ) );
344
 
345
  /* @deprecated Setting only used for compatibility with Deepl Add-on 1.0.0 */
346
  if ( $settings_option['trp_machine_translation_settings']['translation-engine'] === 'deepl' && defined( 'TRP_DL_PLUGIN_VERSION' ) && TRP_DL_PLUGIN_VERSION === '1.0.0' ) {
@@ -354,6 +328,18 @@ class TRP_Settings{
354
  $this->settings = $settings_option;
355
  }
356
 
 
 
 
 
 
 
 
 
 
 
 
 
357
  /**
358
  * Enqueue scripts and styles for settings page.
359
  *
292
  'url-slugs' => array( 'en_US' => 'en', '' ),
293
  );
294
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
295
  if ( 'not_set' == $settings_option ){
296
  update_option ( 'trp_settings', $default_settings );
297
  $settings_option = $default_settings;
304
  }
305
  }
306
 
307
+
308
+ /**
309
+ * These options (trp_advanced_settings,trp_machine_translation_settings) are not part of the actual trp_settings DB option.
310
+ * But they are included in $settings variable across TP
311
+ */
312
  $settings_option['trp_advanced_settings'] = get_option('trp_advanced_settings', array() );
313
+
314
+ // Add any missing default option for trp_machine_translation_settings
315
+ $default_trp_machine_translation_settings = $this->get_default_trp_machine_translation_settings();
316
+ $settings_option['trp_machine_translation_settings'] = array_merge( $default_trp_machine_translation_settings, get_option( 'trp_machine_translation_settings', $default_trp_machine_translation_settings ) );
317
+
 
318
 
319
  /* @deprecated Setting only used for compatibility with Deepl Add-on 1.0.0 */
320
  if ( $settings_option['trp_machine_translation_settings']['translation-engine'] === 'deepl' && defined( 'TRP_DL_PLUGIN_VERSION' ) && TRP_DL_PLUGIN_VERSION === '1.0.0' ) {
328
  $this->settings = $settings_option;
329
  }
330
 
331
+ public function get_default_trp_machine_translation_settings(){
332
+ return apply_filters( 'trp_get_default_trp_machine_translation_settings', array(
333
+ // default settings for trp_machine_translation_settings
334
+ 'machine-translation' => 'no',
335
+ 'translation-engine' => 'google_translate_v2',
336
+ 'block-crawlers' => 'yes',
337
+ 'machine_translation_counter_date' => date ("Y-m-d" ),
338
+ 'machine_translation_counter' => 0,
339
+ 'machine_translation_limit' => 1000000
340
+ ));
341
+ }
342
+
343
  /**
344
  * Enqueue scripts and styles for settings page.
345
  *
includes/class-translation-render.php CHANGED
@@ -854,6 +854,11 @@ class TRP_Translation_Render{
854
  function remove_trp_html_tags( $string ){
855
  $string = preg_replace( '/(<|&lt;)trp-gettext (.*?)(>|&gt;)/', '', $string );
856
  $string = preg_replace( '/(<|&lt;)(\\\\)*\/trp-gettext(>|&gt;)/', '', $string );
 
 
 
 
 
857
  if (!isset($_REQUEST['trp-edit-translation']) || $_REQUEST['trp-edit-translation'] != 'preview') {
858
  $string = preg_replace('/(<|&lt;)trp-wrap (.*?)(>|&gt;)/', '', $string);
859
  $string = preg_replace('/(<|&lt;)(\\\\)*\/trp-wrap(>|&gt;)/', '', $string);
854
  function remove_trp_html_tags( $string ){
855
  $string = preg_replace( '/(<|&lt;)trp-gettext (.*?)(>|&gt;)/', '', $string );
856
  $string = preg_replace( '/(<|&lt;)(\\\\)*\/trp-gettext(>|&gt;)/', '', $string );
857
+
858
+ // In case we have a gettext string which was run through rawurlencode(). See more details on iss6563
859
+ $string = preg_replace( '/%23%21trpst%23trp-gettext(.*?)%23%21trpen%23/', '', $string );
860
+ $string = preg_replace( '/%23%21trpst%23%2Ftrp-gettext%23%21trpen%23/', '', $string );
861
+
862
  if (!isset($_REQUEST['trp-edit-translation']) || $_REQUEST['trp-edit-translation'] != 'preview') {
863
  $string = preg_replace('/(<|&lt;)trp-wrap (.*?)(>|&gt;)/', '', $string);
864
  $string = preg_replace('/(<|&lt;)(\\\\)*\/trp-wrap(>|&gt;)/', '', $string);
includes/class-upgrade.php CHANGED
@@ -41,21 +41,29 @@ class TRP_Upgrade {
41
  $this->trp_query = $trp->get_component( 'query' );
42
  }
43
  $stored_database_version = get_option('trp_plugin_version');
44
- if( empty($stored_database_version) || version_compare( TRP_PLUGIN_VERSION, $stored_database_version, '>' ) ){
45
  $this->check_if_gettext_tables_exist();
46
- $this->trp_query->check_for_block_type_column();
47
- }
48
- if( !empty( $stored_database_version ) ) {
49
- $updates = $this->get_updates_details();
50
- foreach( $updates as $update ){
51
- if ( version_compare( $update['version'], $stored_database_version, '>' ) ){
52
- update_option( $update['option_name'], 'no' );
53
- }
54
- }
55
- }
56
-
57
- if( !empty( $stored_database_version ) && version_compare( $stored_database_version, '1.5.3', '<=' ) ) {
58
- $this->add_full_text_index_to_tables();
 
 
 
 
 
 
 
 
59
  }
60
 
61
  // don't update the db version unless they are different. Otherwise the query is run on every page load.
@@ -462,4 +470,36 @@ class TRP_Upgrade {
462
  $this->db->query( $sql_index );
463
  }
464
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
465
  }
41
  $this->trp_query = $trp->get_component( 'query' );
42
  }
43
  $stored_database_version = get_option('trp_plugin_version');
44
+ if( empty($stored_database_version) ){
45
  $this->check_if_gettext_tables_exist();
46
+ }else{
47
+
48
+ // Updates that require admins to trigger manual update of db because of long duration. Set an option in DB if this is the case.
49
+ $updates = $this->get_updates_details();
50
+ foreach ($updates as $update) {
51
+ if (version_compare($update['version'], $stored_database_version, '>')) {
52
+ update_option($update['option_name'], 'no');
53
+ }
54
+ }
55
+
56
+ // Updates that can be done right way. They should take very little time.
57
+ if ( version_compare( $stored_database_version, '1.3.0', '<=' ) ) {
58
+ $this->trp_query->check_for_block_type_column();
59
+ $this->check_if_gettext_tables_exist();
60
+ }
61
+ if ( version_compare($stored_database_version, '1.5.3', '<=')) {
62
+ $this->add_full_text_index_to_tables();
63
+ }
64
+ if ( version_compare($stored_database_version, '1.6.1', '<=')) {
65
+ $this->upgrade_machine_translation_settings();
66
+ }
67
  }
68
 
69
  // don't update the db version unless they are different. Otherwise the query is run on every page load.
470
  $this->db->query( $sql_index );
471
  }
472
  }
473
+
474
+ /**
475
+ * Moving some settings from trp_settings option to trp_machine_translation_settings
476
+ *
477
+ * Upgrade settings from TP version 1.5.8 or earlier to 1.6.2
478
+ */
479
+ private function upgrade_machine_translation_settings(){
480
+ $trp = TRP_Translate_Press::get_trp_instance();
481
+ $trp_settings = $trp->get_component('settings' );
482
+ $machine_translation_settings = get_option( 'trp_machine_translation_settings', false );
483
+
484
+ $default_machine_translation_settings = $trp_settings->get_default_trp_machine_translation_settings();
485
+
486
+ if ( $machine_translation_settings == false ) {
487
+ // 1.5.8 did not have any machine_settings so port g-translate-key and g-translate settings if exists
488
+ $machine_translation_settings = $default_machine_translation_settings;
489
+ // move the old API key option
490
+ if (!empty($this->settings['g-translate-key'] ) ) {
491
+ $machine_translation_settings['google-translate-key'] = $this->settings['g-translate-key'];
492
+ }
493
+
494
+ // enable machine translation if it was activated before
495
+ if (!empty($this->settings['g-translate']) && $this->settings['g-translate'] == 'yes'){
496
+ $machine_translation_settings['machine-translation'] = 'yes';
497
+ }
498
+ update_option('trp_machine_translation_settings', $machine_translation_settings);
499
+ }else{
500
+ // targeting 1.5.9 to 1.6.1 where incomplete machine-translation settings may have resulted
501
+ $machine_translation_settings = array_merge( $default_machine_translation_settings, $machine_translation_settings );
502
+ update_option('trp_machine_translation_settings', $machine_translation_settings);
503
+ }
504
+ }
505
  }
includes/compatibility-functions.php CHANGED
@@ -363,22 +363,34 @@ function trp_strip_request_metadata_keys( $metadata ){
363
  * They start an output buffer at init -1 (before ours at init 0). They print footer scripts after we run translate_page,
364
  * resulting in outputting scripts that won't be stripped of trpst trp-gettext wrappings.
365
  * This includes WooCommerce Checkout scripts, resulting in trpst wrappings around form fields like Street Address.
 
366
  *
367
- * Solution is to move their hook to priority 1
 
368
  *
369
- * This is the chosen hook (after_setup_theme) because
370
- * it needs to be after plugins_loaded (because TP is loading this file later)
371
- * and before init (because the we need to unregister the NextGen Gallery plugin's function hooked on init with priority -1 )
372
  */
373
- add_action( 'after_setup_theme', 'trp_nextgen_compatibility' );
374
- function trp_nextgen_compatibility(){
375
  if ( class_exists( 'C_Photocrati_Resource_Manager' ) ) {
376
- $object_C_Photocrati_Resource_Manager = C_Photocrati_Resource_Manager::$instance;
 
 
 
377
 
378
- // move from priority -1 to 1 because it needs to be after our hook on priority 0
379
- remove_action( 'init', array( &$object_C_Photocrati_Resource_Manager, 'start_buffer' ) );
380
- add_action( 'init', array( &$object_C_Photocrati_Resource_Manager, 'start_buffer', ), 1 );
 
 
 
 
 
 
 
 
381
  }
 
382
  }
383
 
384
  /**
363
  * They start an output buffer at init -1 (before ours at init 0). They print footer scripts after we run translate_page,
364
  * resulting in outputting scripts that won't be stripped of trpst trp-gettext wrappings.
365
  * This includes WooCommerce Checkout scripts, resulting in trpst wrappings around form fields like Street Address.
366
+ * Another issue is that translation editor is a blank page.
367
  *
368
+ * We cannot move their hook to priority 1 because we do not have access to the object that gets hooked is not retrievable so we can't call remove_filter()
369
+ * Also we cannot simply disable ngg using run_ngg_resource_manager hook because we would be disabling features of their plugin.
370
  *
371
+ * So the only solution that works is to move our hook to -2.
 
 
372
  */
373
+ add_filter( 'trp_start_output_buffer_priority', 'trp_nextgen_compatibility' );
374
+ function trp_nextgen_compatibility( $priority ){
375
  if ( class_exists( 'C_Photocrati_Resource_Manager' ) ) {
376
+ return '-2';
377
+ }
378
+ return $priority;
379
+ }
380
 
381
+ /**
382
+ * Compatibility with NextGEN Gallery
383
+ *
384
+ * This plugin is adding wp_footer forcefully in a shutdown hook and appends it to "</body>" which bring up admin bar in translation editor.
385
+ *
386
+ * This filter prevents ngg from hooking the filters to alter the html.
387
+ */
388
+ add_filter( 'run_ngg_resource_manager', 'trp_nextgen_disable_nextgen_in_translation_editor');
389
+ function trp_nextgen_disable_nextgen_in_translation_editor( $bool ){
390
+ if ( isset( $_REQUEST['trp-edit-translation'] ) && esc_attr( $_REQUEST['trp-edit-translation'] ) === 'true' ) {
391
+ return false;
392
  }
393
+ return $bool;
394
  }
395
 
396
  /**
includes/google-translate/class-google-translate-v2-machine-translator.php CHANGED
@@ -104,10 +104,14 @@ class TRP_Google_Translate_V2_Machine_Translator extends TRP_Machine_Translator
104
  * Send a test request to verify if the functionality is working
105
  */
106
  public function test_request(){
 
107
  return $this->send_request( 'en', 'es', array( 'about' ) );
 
108
  }
109
 
110
  public function get_api_key(){
111
- return isset( $this->settings['trp_machine_translation_settings']['google-translate-key'] ) ? $this->settings['trp_machine_translation_settings']['google-translate-key'] : false;
 
 
112
  }
113
  }
104
  * Send a test request to verify if the functionality is working
105
  */
106
  public function test_request(){
107
+
108
  return $this->send_request( 'en', 'es', array( 'about' ) );
109
+
110
  }
111
 
112
  public function get_api_key(){
113
+
114
+ return isset( $this->settings['trp_machine_translation_settings'], $this->settings['trp_machine_translation_settings']['google-translate-key'] ) ? $this->settings['trp_machine_translation_settings']['google-translate-key'] : false;
115
+
116
  }
117
  }
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: 1.6.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: 3.5
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: 1.6.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: 3.8
14
 
15
  == Copyright ==
16
  Copyright 2017 Cozmoslabs (www.cozmoslabs.com)
languages/translatepress-multilingual.catalog.php CHANGED
@@ -38,10 +38,12 @@
38
  <?php __("Your license key has reached its activation limit.", "translatepress-multilingual"); ?>
39
  <?php __("You have successfully activated your license", "translatepress-multilingual"); ?>
40
  <?php __("Others", "translatepress-multilingual"); ?>
 
 
 
41
  <?php __("Automatic Translation", "translatepress-multilingual"); ?>
42
  <?php __("DeepL", "translatepress-multilingual"); ?>
43
  <?php __("You are not using a permalink structure! Please <a href=\"%s\">enable</a> one or install our <a href=\"%s\">\"Language by GET parameter\"</a> addon, so that TranslatePress can function properly.", "translatepress-multilingual"); ?>
44
- <?php __("Dismiss this notice.", "translatepress-multilingual"); ?>
45
  <?php __("Your <strong>TranslatePress</strong> serial number is invalid or missing. <br/>Please %1$sregister your copy%2$s to receive access to automatic updates and support. Need a license key? %3$sPurchase one now%4$s", "translatepress-multilingual"); ?>
46
  <?php __("Your <strong>TranslatePress</strong> license has expired. <br/>Please %1$sRenew Your Licence%2$s to continue receiving access to product downloads, automatic updates and support. %3$sRenew now %4$s", "translatepress-multilingual"); ?>
47
  <?php __("Something went wrong, please try again.", "translatepress-multilingual"); ?>
@@ -170,13 +172,15 @@
170
  <?php __("Use GET parameter to encode language in the url, replacing the language directory. </br> Your urls will look like this: www.example.com?lang=en", "translatepress-multilingual"); ?>
171
  <?php __("TranslatePress Advanced Settings", "translatepress-multilingual"); ?>
172
  <?php __("Save Changes", "translatepress-multilingual"); ?>
 
 
173
  <?php __("Active on this site", "translatepress-multilingual"); ?>
174
  <?php __("Your license is invalid", "translatepress-multilingual"); ?>
175
- <?php __("If you do not have any of the <a href=\"%s\">Advanced or Pro Addons</a> activated you do not need a license key", "translatepress-multilingual"); ?>
176
  <?php __("TranslatePress Automatic Translation", "translatepress-multilingual"); ?>
177
  <?php __("Enable Automatic Translation", "translatepress-multilingual"); ?>
178
  <?php __("No", "translatepress-multilingual"); ?>
179
- <?php __("Enable or disable the automatic translation of the site. Only untranslated strings will receive a translation.", "translatepress-multilingual"); ?>
180
  <?php __("Translation Engine", "translatepress-multilingual"); ?>
181
  <?php __("Choose which engine you want to use in order to automatically translate your website.", "translatepress-multilingual"); ?>
182
  <?php __("<strong>DeepL</strong> automatic translation is available as a premium add-on in <a href=\"%s\" class=\"button button-primary\" target=\"_blank\" title=\"TranslatePress Pro\">TranslatePress PRO</a>", "translatepress-multilingual"); ?>
38
  <?php __("Your license key has reached its activation limit.", "translatepress-multilingual"); ?>
39
  <?php __("You have successfully activated your license", "translatepress-multilingual"); ?>
40
  <?php __("Others", "translatepress-multilingual"); ?>
41
+ <?php __("<strong>TranslatePress</strong> encountered SQL errors. <a href=\"%s\" title=\"View TranslatePress SQL Errors\">Check out the errors</a>.", "translatepress-multilingual"); ?>
42
+ <?php __("Automatic translation has been disabled.", "translatepress-multilingual"); ?>
43
+ <?php __("Dismiss this notice.", "translatepress-multilingual"); ?>
44
  <?php __("Automatic Translation", "translatepress-multilingual"); ?>
45
  <?php __("DeepL", "translatepress-multilingual"); ?>
46
  <?php __("You are not using a permalink structure! Please <a href=\"%s\">enable</a> one or install our <a href=\"%s\">\"Language by GET parameter\"</a> addon, so that TranslatePress can function properly.", "translatepress-multilingual"); ?>
 
47
  <?php __("Your <strong>TranslatePress</strong> serial number is invalid or missing. <br/>Please %1$sregister your copy%2$s to receive access to automatic updates and support. Need a license key? %3$sPurchase one now%4$s", "translatepress-multilingual"); ?>
48
  <?php __("Your <strong>TranslatePress</strong> license has expired. <br/>Please %1$sRenew Your Licence%2$s to continue receiving access to product downloads, automatic updates and support. %3$sRenew now %4$s", "translatepress-multilingual"); ?>
49
  <?php __("Something went wrong, please try again.", "translatepress-multilingual"); ?>
172
  <?php __("Use GET parameter to encode language in the url, replacing the language directory. </br> Your urls will look like this: www.example.com?lang=en", "translatepress-multilingual"); ?>
173
  <?php __("TranslatePress Advanced Settings", "translatepress-multilingual"); ?>
174
  <?php __("Save Changes", "translatepress-multilingual"); ?>
175
+ <?php __("TranslatePress Errors", "translatepress-multilingual"); ?>
176
+ <?php __("There are no logged errors.", "translatepress-multilingual"); ?>
177
  <?php __("Active on this site", "translatepress-multilingual"); ?>
178
  <?php __("Your license is invalid", "translatepress-multilingual"); ?>
179
+ <?php __("If you purchased a premium version, first install and activate any of the <a href=\"%s\">Advanced or Pro Addons</a>. After this you will be prompted with an input to enter your license key.", "translatepress-multilingual"); ?>
180
  <?php __("TranslatePress Automatic Translation", "translatepress-multilingual"); ?>
181
  <?php __("Enable Automatic Translation", "translatepress-multilingual"); ?>
182
  <?php __("No", "translatepress-multilingual"); ?>
183
+ <?php __("Enable or disable the automatic translation of the site. To minimize translation costs, each untranslated string is automatically translated only once, then stored in the database.", "translatepress-multilingual"); ?>
184
  <?php __("Translation Engine", "translatepress-multilingual"); ?>
185
  <?php __("Choose which engine you want to use in order to automatically translate your website.", "translatepress-multilingual"); ?>
186
  <?php __("<strong>DeepL</strong> automatic translation is available as a premium add-on in <a href=\"%s\" class=\"button button-primary\" target=\"_blank\" title=\"TranslatePress Pro\">TranslatePress PRO</a>", "translatepress-multilingual"); ?>
languages/translatepress-multilingual.pot CHANGED
@@ -13,7 +13,7 @@ msgstr ""
13
  "X-Poedit-SourceCharset: UTF-8\n"
14
  "Plural-Forms: nplurals=2; plural=(n != 1);\n"
15
 
16
- #: ../tp-add-on-extra-languages/class-extra-languages.php:57, ../translatepress/includes/class-settings.php:383
17
  msgid "Error! Duplicate URL slug values."
18
  msgstr ""
19
 
@@ -169,43 +169,51 @@ msgstr ""
169
  msgid "Others"
170
  msgstr ""
171
 
172
- #: ../translatepress/includes/class-machine-translation-tab.php:23
 
 
 
 
 
 
 
 
 
 
 
 
173
  msgid "Automatic Translation"
174
  msgstr ""
175
 
176
- #: ../translatepress/includes/class-machine-translation-tab.php:115
177
  msgid "DeepL"
178
  msgstr ""
179
 
180
- #: ../translatepress/includes/class-plugin-notices.php:330
181
  msgid "You are not using a permalink structure! Please <a href=\"%s\">enable</a> one or install our <a href=\"%s\">\"Language by GET parameter\"</a> addon, so that TranslatePress can function properly."
182
  msgstr ""
183
 
184
- #: ../translatepress/includes/class-plugin-notices.php:332, ../translatepress/includes/class-plugin-notices.php:363, ../translatepress/includes/class-plugin-notices.php:382, ../translatepress/includes/class-plugin-notices.php:396, ../translatepress/includes/class-plugin-notices.php:421
185
- msgid "Dismiss this notice."
186
- msgstr ""
187
-
188
- #: ../translatepress/includes/class-plugin-notices.php:353
189
  msgid "Your <strong>TranslatePress</strong> serial number is invalid or missing. <br/>Please %1$sregister your copy%2$s to receive access to automatic updates and support. Need a license key? %3$sPurchase one now%4$s"
190
  msgstr ""
191
 
192
- #: ../translatepress/includes/class-plugin-notices.php:355
193
  msgid "Your <strong>TranslatePress</strong> license has expired. <br/>Please %1$sRenew Your Licence%2$s to continue receiving access to product downloads, automatic updates and support. %3$sRenew now %4$s"
194
  msgstr ""
195
 
196
- #: ../translatepress/includes/class-plugin-notices.php:357
197
  msgid "Something went wrong, please try again."
198
  msgstr ""
199
 
200
- #: ../translatepress/includes/class-plugin-notices.php:378
201
  msgid "Your <strong>TranslatePress</strong> license will expire on %1$s. Please %2$sRenew Your Licence%3$s to continue receiving access to product downloads, automatic updates and support."
202
  msgstr ""
203
 
204
- #: ../translatepress/includes/class-plugin-notices.php:394
205
  msgid "NEW: Display different images based on language. Find out <a href=\"https://translatepress.com/docs/image-translation/\" >how to translate images, sliders and more</a> from the TranslatePress editor."
206
  msgstr ""
207
 
208
- #: ../translatepress/includes/class-plugin-notices.php:418
209
  msgid "The daily quota for machine translation characters exceeded. Please check the <strong>TranslatePress -> <a href=\"%s\">Automatic Translation</a></strong> page for more information."
210
  msgstr ""
211
 
@@ -245,31 +253,31 @@ msgstr ""
245
  msgid "Top Left"
246
  msgstr ""
247
 
248
- #: ../translatepress/includes/class-settings.php:419
249
  msgid "Current Language"
250
  msgstr ""
251
 
252
- #: ../translatepress/includes/class-settings.php:460
253
  msgid "General"
254
  msgstr ""
255
 
256
- #: ../translatepress/includes/class-settings.php:465, ../translatepress/includes/class-translation-manager.php:244
257
  msgid "Translate Site"
258
  msgstr ""
259
 
260
- #: ../translatepress/includes/class-settings.php:470
261
  msgid "Addons"
262
  msgstr ""
263
 
264
- #: ../translatepress/includes/class-settings.php:478
265
  msgid "License"
266
  msgstr ""
267
 
268
- #: ../translatepress/includes/class-settings.php:506, ../translatepress/includes/class-translation-manager.php:276
269
  msgid "Settings"
270
  msgstr ""
271
 
272
- #: ../translatepress/includes/class-settings.php:510
273
  msgid "Pro Features"
274
  msgstr ""
275
 
@@ -553,79 +561,79 @@ msgstr ""
553
  msgid "Page Title"
554
  msgstr ""
555
 
556
- #: ../translatepress/includes/class-upgrade.php:129
557
  msgid "TranslatePress data update"
558
  msgstr ""
559
 
560
- #: ../translatepress/includes/class-upgrade.php:129
561
  msgid "We need to update your translations database to the latest version."
562
  msgstr ""
563
 
564
- #: ../translatepress/includes/class-upgrade.php:130
565
  msgid "IMPORTANT: It is strongly recommended to first backup the database!\nAre you sure you want to continue?"
566
  msgstr ""
567
 
568
- #: ../translatepress/includes/class-upgrade.php:130
569
  msgid "Run the updater"
570
  msgstr ""
571
 
572
- #: ../translatepress/includes/class-upgrade.php:146
573
  msgid "Update aborted! Your user account doesn't have the capability to perform database updates."
574
  msgstr ""
575
 
576
- #: ../translatepress/includes/class-upgrade.php:151
577
  msgid "Update aborted! Invalid nonce."
578
  msgstr ""
579
 
580
- #: ../translatepress/includes/class-upgrade.php:166, ../translatepress/includes/class-upgrade.php:259, ../translatepress/includes/class-upgrade.php:345, ../translatepress/includes/class-upgrade.php:350
581
  msgid "Back to TranslatePress Settings"
582
  msgstr ""
583
 
584
- #: ../translatepress/includes/class-upgrade.php:170
585
  msgid "Successfully updated database!"
586
  msgstr ""
587
 
588
- #: ../translatepress/includes/class-upgrade.php:176
589
  msgid "Updating database to version %s+"
590
  msgstr ""
591
 
592
- #: ../translatepress/includes/class-upgrade.php:177, ../translatepress/includes/class-upgrade.php:232
593
  msgid "Processing table for language %s..."
594
  msgstr ""
595
 
596
- #: ../translatepress/includes/class-upgrade.php:181
597
  msgid "Update aborted! Incorrect action."
598
  msgstr ""
599
 
600
- #: ../translatepress/includes/class-upgrade.php:184
601
  msgid "Update aborted! Incorrect language code."
602
  msgstr ""
603
 
604
- #: ../translatepress/includes/class-upgrade.php:231, ../translatepress/includes/class-upgrade.php:235
605
  msgid " done."
606
  msgstr ""
607
 
608
- #: ../translatepress/includes/class-upgrade.php:345
609
  msgid "Done."
610
  msgstr ""
611
 
612
- #: ../translatepress/includes/class-upgrade.php:350
613
  msgid "Invalid nonce."
614
  msgstr ""
615
 
616
- #: ../translatepress/includes/class-upgrade.php:370
617
  msgid "Querying table <strong>%s</strong>"
618
  msgstr ""
619
 
620
- #: ../translatepress/includes/class-upgrade.php:400
621
  msgid "%s duplicates removed"
622
  msgstr ""
623
 
624
- #: ../translatepress/includes/class-upgrade.php:430
625
  msgid "If the page does not redirect automatically"
626
  msgstr ""
627
 
628
- #: ../translatepress/includes/class-upgrade.php:430
629
  msgid "click here"
630
  msgstr ""
631
 
@@ -697,6 +705,14 @@ msgstr ""
697
  msgid "Save Changes"
698
  msgstr ""
699
 
 
 
 
 
 
 
 
 
700
  #: ../translatepress/partials/license-settings-page.php:25
701
  msgid "Active on this site"
702
  msgstr ""
@@ -706,7 +722,7 @@ msgid "Your license is invalid"
706
  msgstr ""
707
 
708
  #: ../translatepress/partials/license-settings-page.php:48
709
- msgid "If you do not have any of the <a href=\"%s\">Advanced or Pro Addons</a> activated you do not need a license key"
710
  msgstr ""
711
 
712
  #: ../translatepress/partials/machine-translation-settings-page.php:4
@@ -722,7 +738,7 @@ msgid "No"
722
  msgstr ""
723
 
724
  #: ../translatepress/partials/machine-translation-settings-page.php:17
725
- msgid "Enable or disable the automatic translation of the site. Only untranslated strings will receive a translation."
726
  msgstr ""
727
 
728
  #: ../translatepress/partials/machine-translation-settings-page.php:23
13
  "X-Poedit-SourceCharset: UTF-8\n"
14
  "Plural-Forms: nplurals=2; plural=(n != 1);\n"
15
 
16
+ #: ../tp-add-on-extra-languages/class-extra-languages.php:57, ../translatepress/includes/class-settings.php:369
17
  msgid "Error! Duplicate URL slug values."
18
  msgstr ""
19
 
169
  msgid "Others"
170
  msgstr ""
171
 
172
+ #: ../translatepress/includes/class-error-manager.php:42
173
+ msgid "<strong>TranslatePress</strong> encountered SQL errors. <a href=\"%s\" title=\"View TranslatePress SQL Errors\">Check out the errors</a>."
174
+ msgstr ""
175
+
176
+ #: ../translatepress/includes/class-error-manager.php:51
177
+ msgid "Automatic translation has been disabled."
178
+ msgstr ""
179
+
180
+ #: ../translatepress/includes/class-error-manager.php:118, ../translatepress/includes/class-plugin-notices.php:340, ../translatepress/includes/class-plugin-notices.php:371, ../translatepress/includes/class-plugin-notices.php:390, ../translatepress/includes/class-plugin-notices.php:404, ../translatepress/includes/class-plugin-notices.php:429
181
+ msgid "Dismiss this notice."
182
+ msgstr ""
183
+
184
+ #: ../translatepress/includes/class-machine-translation-tab.php:22
185
  msgid "Automatic Translation"
186
  msgstr ""
187
 
188
+ #: ../translatepress/includes/class-machine-translation-tab.php:119
189
  msgid "DeepL"
190
  msgstr ""
191
 
192
+ #: ../translatepress/includes/class-plugin-notices.php:338
193
  msgid "You are not using a permalink structure! Please <a href=\"%s\">enable</a> one or install our <a href=\"%s\">\"Language by GET parameter\"</a> addon, so that TranslatePress can function properly."
194
  msgstr ""
195
 
196
+ #: ../translatepress/includes/class-plugin-notices.php:361
 
 
 
 
197
  msgid "Your <strong>TranslatePress</strong> serial number is invalid or missing. <br/>Please %1$sregister your copy%2$s to receive access to automatic updates and support. Need a license key? %3$sPurchase one now%4$s"
198
  msgstr ""
199
 
200
+ #: ../translatepress/includes/class-plugin-notices.php:363
201
  msgid "Your <strong>TranslatePress</strong> license has expired. <br/>Please %1$sRenew Your Licence%2$s to continue receiving access to product downloads, automatic updates and support. %3$sRenew now %4$s"
202
  msgstr ""
203
 
204
+ #: ../translatepress/includes/class-plugin-notices.php:365
205
  msgid "Something went wrong, please try again."
206
  msgstr ""
207
 
208
+ #: ../translatepress/includes/class-plugin-notices.php:386
209
  msgid "Your <strong>TranslatePress</strong> license will expire on %1$s. Please %2$sRenew Your Licence%3$s to continue receiving access to product downloads, automatic updates and support."
210
  msgstr ""
211
 
212
+ #: ../translatepress/includes/class-plugin-notices.php:402
213
  msgid "NEW: Display different images based on language. Find out <a href=\"https://translatepress.com/docs/image-translation/\" >how to translate images, sliders and more</a> from the TranslatePress editor."
214
  msgstr ""
215
 
216
+ #: ../translatepress/includes/class-plugin-notices.php:426
217
  msgid "The daily quota for machine translation characters exceeded. Please check the <strong>TranslatePress -> <a href=\"%s\">Automatic Translation</a></strong> page for more information."
218
  msgstr ""
219
 
253
  msgid "Top Left"
254
  msgstr ""
255
 
256
+ #: ../translatepress/includes/class-settings.php:405
257
  msgid "Current Language"
258
  msgstr ""
259
 
260
+ #: ../translatepress/includes/class-settings.php:446
261
  msgid "General"
262
  msgstr ""
263
 
264
+ #: ../translatepress/includes/class-settings.php:451, ../translatepress/includes/class-translation-manager.php:244
265
  msgid "Translate Site"
266
  msgstr ""
267
 
268
+ #: ../translatepress/includes/class-settings.php:456
269
  msgid "Addons"
270
  msgstr ""
271
 
272
+ #: ../translatepress/includes/class-settings.php:464
273
  msgid "License"
274
  msgstr ""
275
 
276
+ #: ../translatepress/includes/class-settings.php:492, ../translatepress/includes/class-translation-manager.php:276
277
  msgid "Settings"
278
  msgstr ""
279
 
280
+ #: ../translatepress/includes/class-settings.php:496
281
  msgid "Pro Features"
282
  msgstr ""
283
 
561
  msgid "Page Title"
562
  msgstr ""
563
 
564
+ #: ../translatepress/includes/class-upgrade.php:137
565
  msgid "TranslatePress data update"
566
  msgstr ""
567
 
568
+ #: ../translatepress/includes/class-upgrade.php:137
569
  msgid "We need to update your translations database to the latest version."
570
  msgstr ""
571
 
572
+ #: ../translatepress/includes/class-upgrade.php:138
573
  msgid "IMPORTANT: It is strongly recommended to first backup the database!\nAre you sure you want to continue?"
574
  msgstr ""
575
 
576
+ #: ../translatepress/includes/class-upgrade.php:138
577
  msgid "Run the updater"
578
  msgstr ""
579
 
580
+ #: ../translatepress/includes/class-upgrade.php:154
581
  msgid "Update aborted! Your user account doesn't have the capability to perform database updates."
582
  msgstr ""
583
 
584
+ #: ../translatepress/includes/class-upgrade.php:159
585
  msgid "Update aborted! Invalid nonce."
586
  msgstr ""
587
 
588
+ #: ../translatepress/includes/class-upgrade.php:174, ../translatepress/includes/class-upgrade.php:267, ../translatepress/includes/class-upgrade.php:353, ../translatepress/includes/class-upgrade.php:358
589
  msgid "Back to TranslatePress Settings"
590
  msgstr ""
591
 
592
+ #: ../translatepress/includes/class-upgrade.php:178
593
  msgid "Successfully updated database!"
594
  msgstr ""
595
 
596
+ #: ../translatepress/includes/class-upgrade.php:184
597
  msgid "Updating database to version %s+"
598
  msgstr ""
599
 
600
+ #: ../translatepress/includes/class-upgrade.php:185, ../translatepress/includes/class-upgrade.php:240
601
  msgid "Processing table for language %s..."
602
  msgstr ""
603
 
604
+ #: ../translatepress/includes/class-upgrade.php:189
605
  msgid "Update aborted! Incorrect action."
606
  msgstr ""
607
 
608
+ #: ../translatepress/includes/class-upgrade.php:192
609
  msgid "Update aborted! Incorrect language code."
610
  msgstr ""
611
 
612
+ #: ../translatepress/includes/class-upgrade.php:239, ../translatepress/includes/class-upgrade.php:243
613
  msgid " done."
614
  msgstr ""
615
 
616
+ #: ../translatepress/includes/class-upgrade.php:353
617
  msgid "Done."
618
  msgstr ""
619
 
620
+ #: ../translatepress/includes/class-upgrade.php:358
621
  msgid "Invalid nonce."
622
  msgstr ""
623
 
624
+ #: ../translatepress/includes/class-upgrade.php:378
625
  msgid "Querying table <strong>%s</strong>"
626
  msgstr ""
627
 
628
+ #: ../translatepress/includes/class-upgrade.php:408
629
  msgid "%s duplicates removed"
630
  msgstr ""
631
 
632
+ #: ../translatepress/includes/class-upgrade.php:438
633
  msgid "If the page does not redirect automatically"
634
  msgstr ""
635
 
636
+ #: ../translatepress/includes/class-upgrade.php:438
637
  msgid "click here"
638
  msgstr ""
639
 
705
  msgid "Save Changes"
706
  msgstr ""
707
 
708
+ #: ../translatepress/partials/error-manager-page.php:3
709
+ msgid "TranslatePress Errors"
710
+ msgstr ""
711
+
712
+ #: ../translatepress/partials/error-manager-page.php:6
713
+ msgid "There are no logged errors."
714
+ msgstr ""
715
+
716
  #: ../translatepress/partials/license-settings-page.php:25
717
  msgid "Active on this site"
718
  msgstr ""
722
  msgstr ""
723
 
724
  #: ../translatepress/partials/license-settings-page.php:48
725
+ msgid "If you purchased a premium version, first install and activate any of the <a href=\"%s\">Advanced or Pro Addons</a>. After this you will be prompted with an input to enter your license key."
726
  msgstr ""
727
 
728
  #: ../translatepress/partials/machine-translation-settings-page.php:4
738
  msgstr ""
739
 
740
  #: ../translatepress/partials/machine-translation-settings-page.php:17
741
+ msgid "Enable or disable the automatic translation of the site. To minimize translation costs, each untranslated string is automatically translated only once, then stored in the database."
742
  msgstr ""
743
 
744
  #: ../translatepress/partials/machine-translation-settings-page.php:23
partials/error-manager-page.php ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div id="trp-errors-page" class="wrap">
2
+
3
+ <h1> <?php esc_html_e( 'TranslatePress Errors', 'translatepress-multilingual' );?></h1>
4
+ <?php $page_output = apply_filters( 'trp_error_manager_page_output', '' );
5
+ if ( $page_output === '' ){
6
+ $page_output = esc_html__('There are no logged errors.', 'translatepress-multilingual');
7
+ }
8
+ echo $page_output;
9
+
10
+ ?>
11
+
12
+ </div>
partials/license-settings-page.php CHANGED
@@ -45,5 +45,5 @@ if( !empty( $trp->active_pro_addons ) ){//if we have any Advanced or Pro addons
45
  <?php } else{ ?>
46
  <h1> <?php _e( 'TranslatePress Settings', 'translatepress-multilingual' );?></h1>
47
  <?php do_action ( 'trp_settings_navigation_tabs' ); ?>
48
- <h4><?php printf( __( 'If you do not have any of the <a href="%s">Advanced or Pro Addons</a> activated you do not need a license key', 'translatepress-multilingual' ), admin_url('/admin.php?page=trp_addons_page') ); ?></h4>
49
  <?php } ?>
45
  <?php } else{ ?>
46
  <h1> <?php _e( 'TranslatePress Settings', 'translatepress-multilingual' );?></h1>
47
  <?php do_action ( 'trp_settings_navigation_tabs' ); ?>
48
+ <h4><?php printf( __( 'If you purchased a premium version, first install and activate any of the <a href="%s">Advanced or Pro Addons</a>. After this you will be prompted with an input to enter your license key.', 'translatepress-multilingual' ), admin_url('/admin.php?page=trp_addons_page') ); ?></h4>
49
  <?php } ?>
partials/machine-translation-settings-page.php CHANGED
@@ -14,7 +14,7 @@
14
  </select>
15
 
16
  <p class="description">
17
- <?php _e( 'Enable or disable the automatic translation of the site. Only untranslated strings will receive a translation.', 'translatepress-multilingual' ) ?>
18
  </p>
19
  </td>
20
  </tr>
14
  </select>
15
 
16
  <p class="description">
17
+ <?php _e( 'Enable or disable the automatic translation of the site. To minimize translation costs, each untranslated string is automatically translated only once, then stored in the database.', 'translatepress-multilingual' ) ?>
18
  </p>
19
  </td>
20
  </tr>
readme.txt CHANGED
@@ -3,9 +3,9 @@ Contributors: cozmoslabs, razvan.mo, madalin.ungureanu, 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.2.4
7
  Requires PHP: 5.6.20
8
- Stable tag: 1.6.1
9
  License: GPLv2 or later
10
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
11
 
@@ -143,6 +143,16 @@ For more information please check out [TranslatePress - Multilingual plugin docu
143
 
144
 
145
  == Changelog ==
 
 
 
 
 
 
 
 
 
 
146
  = 1.6.1 =
147
  * Added support for hreflang x-default in Advanced Settings
148
  * Improved checking if quota exceeded on google machine translation for each batch
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.3
7
  Requires PHP: 5.6.20
8
+ Stable tag: 1.6.2
9
  License: GPLv2 or later
10
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
11
 
143
 
144
 
145
  == Changelog ==
146
+ = 1.6.2 =
147
+ * Fixed admin-bar appearing in translation editor
148
+ * Nextgen plugin compatibility fix
149
+ * Fixed a notice index translation-engine not set.
150
+ * Refactored upgrading settings.
151
+ * Solved issue with notifications shown in all backend that couldn't be dismissed
152
+ * Added ability to detect if table is missing during requests. Show admin notice on all pages.
153
+ * Updated License message and Automatic Translation description
154
+ * Created notifications and error page. Disabled machine translations upon error.
155
+
156
  = 1.6.1 =
157
  * Added support for hreflang x-default in Advanced Settings
158
  * Improved checking if quota exceeded on google machine translation for each batch