TranslatePress – Translate Multilingual sites - Version 1.9.5

Version Description

  • Added setting that allows you to translate only certain paths or exclude certain paths from being translated.
  • Fixed some cases where GET parameters were lost from links in translated languages
  • WP Bakery integration that allow to include/exclude blocks for languages
  • Added a compatibility for the MyListing theme.
  • Load unsupported languages section only if an API key is saved.
  • Add support for AIO SEO sitemap detection
Download this release

Release Info

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

Code changes from version 1.9.4 to 1.9.5

assets/css/trp-back-end-style.css CHANGED
@@ -215,3 +215,16 @@ a.trp-recommended-learn-more{
215
  .trp-recommended-buttons{
216
  margin-bottom: 40px;
217
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
215
  .trp-recommended-buttons{
216
  margin-bottom: 40px;
217
  }
218
+
219
+ #trp-adv-translate-certain-paths .trp-adv-holder {
220
+ margin-bottom: 24px;
221
+ }
222
+
223
+ #trp-adv-translate-certain-paths .trp-adv-holder label:not(:last-child) {
224
+ margin-right: 24px;
225
+ }
226
+
227
+ #trp-adv-translate-certain-paths textarea {
228
+ width: 450px;
229
+ min-height: 150px;
230
+ }
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.4' );
61
 
62
  wp_cache_add_non_persistent_groups(array('trp'));
63
 
@@ -116,6 +116,9 @@ class TRP_Translate_Press{
116
  require_once TRP_PLUGIN_DIR . 'includes/class-install-plugins.php';
117
  if ( did_action( 'elementor/loaded' ) )
118
  require_once TRP_PLUGIN_DIR . 'includes/class-elementor-language-for-blocks.php';
 
 
 
119
  }
120
 
121
  /**
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
 
116
  require_once TRP_PLUGIN_DIR . 'includes/class-install-plugins.php';
117
  if ( did_action( 'elementor/loaded' ) )
118
  require_once TRP_PLUGIN_DIR . 'includes/class-elementor-language-for-blocks.php';
119
+ if ( defined( 'WPB_VC_VERSION' ) ) {
120
+ require_once TRP_PLUGIN_DIR . 'includes/class-wp-bakery-language-for-blocks.php';
121
+ }
122
  }
123
 
124
  /**
includes/advanced-settings/do-not-translate-certain-paths.php ADDED
@@ -0,0 +1,443 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ add_filter( 'trp_register_advanced_settings', 'trp_register_do_not_translate_certain_paths', 120 );
4
+ function trp_register_do_not_translate_certain_paths( $settings_array ){
5
+
6
+ $settings_array[] = array(
7
+ 'type' => 'custom',
8
+ 'name' => 'translateable_content',
9
+ 'rows' => array( 'option' => 'radio', 'paths' => 'textarea' ),
10
+ 'label' => esc_html__( 'Do not translate certain paths', 'translatepress-multilingual' ),
11
+ 'description' => wp_kses( __( 'Choose what paths can be translated. Supports wildcard at the end of the path.<br>For example, to exclude https://example.com/some/path you can either use the rule /some/path/ or /some/*.<br>Enter each rule on it\'s own line. To exclude the home page use {{home}}.', 'translatepress-multilingual' ), array( 'br' => array() )),
12
+ );
13
+
14
+ return $settings_array;
15
+
16
+ }
17
+
18
+ add_filter( 'trp_advanced_setting_custom_translateable_content', 'trp_output_do_not_translate_certain_paths' );
19
+ function trp_output_do_not_translate_certain_paths( $setting ){
20
+
21
+ $trp_settings = ( new TRP_Settings() )->get_settings();
22
+
23
+ ?>
24
+ <tr id="trp-adv-translate-certain-paths">
25
+ <th scope="row"><?php echo $setting['label']; ?></th>
26
+ <td>
27
+ <div class="trp-adv-holder">
28
+ <label>
29
+ <input type='radio' id='$setting_name' name="trp_advanced_settings[<?php echo $setting['name']; ?>][option]" value="exclude" <?php echo isset( $trp_settings['trp_advanced_settings'][$setting['name']]['option'] ) && $trp_settings['trp_advanced_settings'][$setting['name']]['option'] == 'exclude' ? 'checked' : ''; ?>>
30
+ <?php _e( 'Exclude Paths From Translation', 'translatepress' ); ?>
31
+ </label>
32
+
33
+ <label>
34
+ <input type='radio' id='$setting_name' name="trp_advanced_settings[<?php echo $setting['name']; ?>][option]" value="include" <?php echo isset( $trp_settings['trp_advanced_settings'][$setting['name']]['option'] ) && $trp_settings['trp_advanced_settings'][$setting['name']]['option'] == 'include' ? 'checked' : ''; ?> >
35
+ <?php _e( 'Translate Only Certain Paths', 'translatepress' ); ?>
36
+ </label>
37
+ </div>
38
+
39
+ <textarea class="trp-adv-big-textarea" name="trp_advanced_settings[<?php echo $setting['name']; ?>][paths]"><?php echo $trp_settings['trp_advanced_settings'][$setting['name']]['paths']; ?></textarea>
40
+
41
+ <p class="description"><?php echo $setting['description']; ?></p>
42
+ </td>
43
+ </tr>
44
+
45
+
46
+ <?php
47
+ return;
48
+ }
49
+
50
+ // Prevent TranslatePress from loading on excluded pages
51
+ add_action( 'trp_allow_tp_to_run', 'trp_exclude_include_paths_to_run_on', 2 );
52
+ function trp_exclude_include_paths_to_run_on(){
53
+
54
+ if( is_admin() )
55
+ return true;
56
+
57
+ if( isset( $_GET['trp-edit-translation'] ) && ( $_GET['trp-edit-translation'] == 'true' || $_GET['trp-edit-translation'] == 'preview' ) )
58
+ return true;
59
+
60
+ if( isset( $_GET['trp-string-translation'] ) && $_GET['trp-string-translation'] == 'true' )
61
+ return true;
62
+
63
+ $settings = get_option( 'trp_settings', false );
64
+ $advanced_settings = get_option( 'trp_advanced_settings', false );
65
+
66
+ if( empty( $advanced_settings ) || !isset( $advanced_settings['translateable_content'] ) || !isset( $advanced_settings['translateable_content']['option'] ) || empty( $advanced_settings['translateable_content']['paths'] ) )
67
+ return true;
68
+
69
+ $trp = TRP_Translate_Press::get_trp_instance();
70
+ $url_converter = $trp->get_component('url_converter');
71
+ $current_lang = $url_converter->get_lang_from_url_string( $url_converter->cur_page_url() );
72
+
73
+ if( empty( $current_lang ) )
74
+ $current_lang = $settings['default-language'];
75
+
76
+ if ( $url_converter->is_sitemap_path() )
77
+ return true;
78
+
79
+ // Skip checks if this is not the default language
80
+ if( !empty( $current_lang ) && $settings['default-language'] != $current_lang )
81
+ return true;
82
+
83
+ $paths = explode("\n", str_replace("\r", "", $advanced_settings['translateable_content']['paths'] ) );
84
+ $current_slug = sanitize_text_field( $_SERVER['REQUEST_URI'] );
85
+
86
+ $replace = '/';
87
+
88
+ if( isset( $settings['add-subdirectory-to-default-language'] ) && $settings['add-subdirectory-to-default-language'] == 'yes' )
89
+ $replace .= $settings['url-slugs'][$current_lang];
90
+
91
+ $current_slug = str_replace( $replace, '', untrailingslashit( $current_slug ) );
92
+
93
+ // Explode get params
94
+ $current_slug = explode( '?', $current_slug );
95
+
96
+ if( isset( $current_slug[1] ) ){
97
+ $current_get = $current_slug[1];
98
+ $current_slug = $current_slug[0];
99
+ } else {
100
+ $current_slug = $current_slug[0];
101
+ }
102
+
103
+ if( empty( $current_slug ) || $current_slug == '/' )
104
+ $current_slug = "{{home}}";
105
+
106
+ if( $advanced_settings['translateable_content']['option'] == 'exclude' ){
107
+
108
+ foreach( $paths as $path ){
109
+
110
+ if( !empty( $path ) ){
111
+
112
+ if( untrailingslashit( $current_slug ) == untrailingslashit( $path ) || ( strpos( $path, '*' ) !== false && strpos( untrailingslashit( $current_slug ), str_replace( '/*', '', $path ) ) !== false ) )
113
+ return false;
114
+
115
+ }
116
+ }
117
+
118
+ } else if( $advanced_settings['translateable_content']['option'] == 'include' ){
119
+
120
+ foreach( $paths as $path ){
121
+
122
+ if( !empty( $path ) ){
123
+ if( untrailingslashit( $current_slug ) == untrailingslashit( $path ) || ( strpos( $path, '*' ) !== false && strpos( untrailingslashit( $current_slug ), str_replace( '/*', '', $path ) ) !== false ) )
124
+ return true;
125
+ }
126
+
127
+ }
128
+
129
+ return false;
130
+
131
+ }
132
+
133
+ return true;
134
+
135
+ }
136
+
137
+ add_filter( 'trp_allow_language_redirect', 'trp_exclude_include_do_not_redirect_on_excluded_pages', 20, 3 );
138
+ function trp_exclude_include_do_not_redirect_on_excluded_pages( $redirect, $language, $url ){
139
+
140
+ if( isset( $_GET['trp-edit-translation'] ) && ( $_GET['trp-edit-translation'] == 'true' || $_GET['trp-edit-translation'] == 'preview' ) )
141
+ return $redirect;
142
+
143
+ if( isset( $_GET['trp-string-translation'] ) && $_GET['trp-string-translation'] == 'true' )
144
+ return $redirect;
145
+
146
+ $settings = get_option( 'trp_settings', false );
147
+ $advanced_settings = get_option( 'trp_advanced_settings', false );
148
+
149
+ if( empty( $advanced_settings ) || !isset( $advanced_settings['translateable_content'] ) || !isset( $advanced_settings['translateable_content']['option'] ) || empty( $advanced_settings['translateable_content']['paths'] ) )
150
+ return $redirect;
151
+
152
+ if( empty( $language ) || $language != $settings['default-language'] )
153
+ return $redirect;
154
+
155
+ $replace = trailingslashit( home_url() );
156
+
157
+ $current_slug = str_replace( $replace, '', trailingslashit( $url ) );
158
+ $paths = explode("\n", str_replace("\r", "", $advanced_settings['translateable_content']['paths'] ) );
159
+
160
+ // Explode get params
161
+ $current_slug = explode( '?', $current_slug );
162
+
163
+ if( isset( $current_slug[1] ) ){
164
+ $current_get = $current_slug[1];
165
+ $current_slug = $current_slug[0];
166
+ } else {
167
+ $current_slug = $current_slug[0];
168
+ }
169
+
170
+ if( empty( $current_slug ) || $current_slug == '/' )
171
+ $current_slug = "{{home}}";
172
+
173
+ if( $advanced_settings['translateable_content']['option'] == 'exclude' ){
174
+
175
+ foreach( $paths as $path ){
176
+
177
+ if( !empty( $path ) ){
178
+
179
+ if( untrailingslashit( $current_slug ) == untrailingslashit( $path ) || ( strpos( $path, '*' ) !== false && strpos( untrailingslashit( $current_slug ), str_replace( '/*', '', $path ) ) !== false ) )
180
+ return false;
181
+
182
+ }
183
+ }
184
+
185
+ } else if( $advanced_settings['translateable_content']['option'] == 'include' ){
186
+
187
+ foreach( $paths as $path ){
188
+
189
+ if( !empty( $path ) ){
190
+ if( untrailingslashit( $current_slug ) == untrailingslashit( $path ) || ( strpos( $path, '*' ) !== false && strpos( untrailingslashit( $current_slug ), str_replace( '/*', '', $path ) ) !== false ) )
191
+ return $redirect;
192
+ }
193
+
194
+ }
195
+
196
+ return false;
197
+
198
+ }
199
+
200
+ return $redirect;
201
+
202
+ }
203
+
204
+ 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;
215
+
216
+ $settings = get_option( 'trp_settings', false );
217
+ $advanced_settings = get_option( 'trp_advanced_settings', false );
218
+
219
+ if( empty( $advanced_settings ) || !isset( $advanced_settings['translateable_content'] ) || !isset( $advanced_settings['translateable_content']['option'] ) || empty( $advanced_settings['translateable_content']['paths'] ) )
220
+ return;
221
+
222
+ global $TRP_LANGUAGE;
223
+ $trp = TRP_Translate_Press::get_trp_instance();
224
+ $url_converter = $trp->get_component('url_converter');
225
+
226
+ $current_original_url = $url_converter->get_url_for_language( $settings['default-language'], null, '' );
227
+
228
+ // Attempt to redirect on default language only if the current URL contains the language
229
+ if( !isset( $TRP_LANGUAGE ) || $settings['default-language'] == $TRP_LANGUAGE ){
230
+
231
+ if( $url_converter->get_lang_from_url_string( $current_original_url ) === null )
232
+ return;
233
+
234
+ }
235
+
236
+ $absolute_home = $url_converter->get_abs_home();
237
+
238
+ // Take into account the subdirectory for default language option
239
+ if ( isset( $settings['add-subdirectory-to-default-language'] ) && $settings['add-subdirectory-to-default-language'] == 'yes' )
240
+ $absolute_home = trailingslashit( $absolute_home ) . $settings['url-slugs'][$settings['default-language']];
241
+
242
+ $current_slug = str_replace( $absolute_home, '', untrailingslashit( $current_original_url ) );
243
+ $paths = explode("\n", str_replace("\r", "", $advanced_settings['translateable_content']['paths'] ) );
244
+
245
+ // Remove language from this URL if present
246
+ $current_original_url = str_replace( '/' . $settings['url-slugs'][$settings['default-language']], '', $current_original_url );
247
+
248
+ // Explode get params
249
+ $current_slug = explode( '?', $current_slug );
250
+
251
+ if( isset( $current_slug[1] ) ){
252
+ $current_get = $current_slug[1];
253
+ $current_slug = $current_slug[0];
254
+ } else {
255
+ $current_slug = $current_slug[0];
256
+ }
257
+
258
+ if( empty( $current_slug ) || $current_slug == '/' )
259
+ $current_slug = "{{home}}";
260
+
261
+ if( $advanced_settings['translateable_content']['option'] == 'exclude' ){
262
+
263
+ foreach( $paths as $path ){
264
+
265
+ if( !empty( $path ) ){
266
+
267
+ if( untrailingslashit( $current_slug ) == untrailingslashit( $path ) || ( strpos( $path, '*' ) !== false && strpos( untrailingslashit( $current_slug ), str_replace( '/*', '', $path ) ) !== false ) ){
268
+
269
+ if( $url_converter->cur_page_url() != $current_original_url ){
270
+ wp_redirect( $current_original_url, 301 );
271
+ exit;
272
+ }
273
+
274
+ }
275
+
276
+ }
277
+ }
278
+
279
+ } else if( $advanced_settings['translateable_content']['option'] == 'include' ){
280
+
281
+ foreach( $paths as $path ){
282
+
283
+ if( !empty( $path ) ){
284
+ if( untrailingslashit( $current_slug ) == untrailingslashit( $path ) || ( strpos( $path, '*' ) !== false && strpos( untrailingslashit( $current_slug ), str_replace( '/*', '', $path ) ) !== false ) )
285
+ return;
286
+ }
287
+
288
+ }
289
+
290
+ if( $url_converter->cur_page_url() != $current_original_url ){
291
+ wp_redirect( $current_original_url, 301 );
292
+ exit;
293
+ }
294
+
295
+ }
296
+
297
+ }
298
+
299
+ // only force custom links in paths that are translatable
300
+ add_filter( 'trp_force_custom_links', 'trp_exclude_include_filter_custom_links', 10, 4);
301
+ function trp_exclude_include_filter_custom_links( $new_url, $url, $TRP_LANGUAGE, $a_href ){
302
+
303
+ if( isset( $_GET['trp-edit-translation'] ) && ( $_GET['trp-edit-translation'] == 'true' || $_GET['trp-edit-translation'] == 'preview' ) )
304
+ return $new_url;
305
+
306
+ if( isset( $_GET['trp-string-translation'] ) && $_GET['trp-string-translation'] == 'true' )
307
+ return $new_url;
308
+
309
+ $advanced_settings = get_option( 'trp_advanced_settings', false );
310
+ $settings = get_option( 'trp_settings', false );
311
+
312
+ if( empty( $advanced_settings ) || !isset( $advanced_settings['translateable_content'] ) || !isset( $advanced_settings['translateable_content']['option'] ) || empty( $advanced_settings['translateable_content']['paths'] ) )
313
+ return $new_url;
314
+
315
+ global $TRP_LANGUAGE;
316
+ $trp = TRP_Translate_Press::get_trp_instance();
317
+ $url_converter = $trp->get_component('url_converter');
318
+
319
+ if( !isset( $TRP_LANGUAGE ) || $settings['default-language'] == $TRP_LANGUAGE )
320
+ return;
321
+
322
+ $current_original_url = $url_converter->get_url_for_language( $settings['default-language'], $new_url, '' );
323
+
324
+ // Remove language from this URL if present
325
+ $current_original_url = str_replace( '/' . $settings['url-slugs'][$settings['default-language']], '', $current_original_url );
326
+
327
+ $absolute_home = $url_converter->get_abs_home();
328
+
329
+ $current_slug = str_replace( $absolute_home, '', untrailingslashit( $current_original_url ) );
330
+ $paths = explode("\n", str_replace("\r", "", $advanced_settings['translateable_content']['paths'] ) );
331
+
332
+ // Explode get params
333
+ $current_slug = explode( '?', $current_slug );
334
+
335
+ if( isset( $current_slug[1] ) ){
336
+ $current_get = $current_slug[1];
337
+ $current_slug = $current_slug[0];
338
+ } else {
339
+ $current_slug = $current_slug[0];
340
+ }
341
+
342
+ if( empty( $current_slug ) || $current_slug == '/' )
343
+ $current_slug = "{{home}}";
344
+
345
+ if( $advanced_settings['translateable_content']['option'] == 'exclude' ){
346
+
347
+ foreach( $paths as $path ){
348
+
349
+ if( !empty( $path ) ){
350
+ if( untrailingslashit( $current_slug ) == untrailingslashit( $path ) || ( strpos( $path, '*' ) !== false && strpos( untrailingslashit( $current_slug ), str_replace( '/*', '', $path ) ) !== false ) )
351
+ return $current_original_url;
352
+ }
353
+
354
+ }
355
+
356
+ } else if( $advanced_settings['translateable_content']['option'] == 'include' ){
357
+
358
+ foreach( $paths as $path ){
359
+
360
+ if( !empty( $path ) ){
361
+ if( untrailingslashit( $current_slug ) == untrailingslashit( $path ) || ( strpos( $path, '*' ) !== false && strpos( untrailingslashit( $current_slug ), str_replace( '/*', '', $path ) ) !== false ) )
362
+ return $new_url;
363
+ }
364
+
365
+ }
366
+
367
+ return $current_original_url;
368
+
369
+ }
370
+
371
+ return $new_url;
372
+
373
+ }
374
+
375
+ add_action( 'init', 'trp_exclude_include_add_sitemap_filter' );
376
+ function trp_exclude_include_add_sitemap_filter(){
377
+ if( defined( 'TRP_SP_PLUGIN_VERSION' ) && version_compare( TRP_SP_PLUGIN_VERSION, '1.3.6', '>=' ) )
378
+ add_filter( 'trp_xml_sitemap_output_for_url', 'trp_exclude_include_filter_sitemap_links', 10, 6 );
379
+ }
380
+
381
+ function trp_exclude_include_filter_sitemap_links( $new_output, $output, $settings, $alternate, $all_lang_urls, $url ){
382
+
383
+ $advanced_settings = get_option( 'trp_advanced_settings', false );
384
+ $settings = get_option( 'trp_settings', false );
385
+
386
+ if( empty( $advanced_settings ) || !isset( $advanced_settings['translateable_content'] ) || !isset( $advanced_settings['translateable_content']['option'] ) || empty( $advanced_settings['translateable_content']['paths'] ) )
387
+ return $new_output;
388
+
389
+ global $TRP_LANGUAGE;
390
+ $trp = TRP_Translate_Press::get_trp_instance();
391
+ $url_converter = $trp->get_component('url_converter');
392
+
393
+ if( empty( $url['loc'] ) )
394
+ return $new_output;
395
+
396
+ $current_original_url = $url_converter->get_url_for_language( $settings['default-language'], $url['loc'], '' );
397
+ $absolute_home = $url_converter->get_abs_home();
398
+
399
+ $current_slug = str_replace( $absolute_home, '', untrailingslashit( $current_original_url ) );
400
+ $paths = explode("\n", str_replace("\r", "", $advanced_settings['translateable_content']['paths'] ) );
401
+
402
+ // Explode get params
403
+ $current_slug = explode( '?', $current_slug );
404
+
405
+ if( isset( $current_slug[1] ) ){
406
+ $current_get = $current_slug[1];
407
+ $current_slug = $current_slug[0];
408
+ } else {
409
+ $current_slug = $current_slug[0];
410
+ }
411
+
412
+ if( empty( $current_slug ) || $current_slug == '/' )
413
+ $current_slug = "{{home}}";
414
+
415
+ if( $advanced_settings['translateable_content']['option'] == 'exclude' ){
416
+
417
+ foreach( $paths as $path ){
418
+
419
+ if( !empty( $path ) ){
420
+ if( untrailingslashit( $current_slug ) == untrailingslashit( $path ) || ( strpos( $path, '*' ) !== false && strpos( untrailingslashit( $current_slug ), str_replace( '/*', '', $path ) ) !== false ) )
421
+ return $output;
422
+ }
423
+
424
+ }
425
+
426
+ } else if( $advanced_settings['translateable_content']['option'] == 'include' ){
427
+
428
+ foreach( $paths as $path ){
429
+
430
+ if( !empty( $path ) ){
431
+ if( untrailingslashit( $current_slug ) == untrailingslashit( $path ) || ( strpos( $path, '*' ) !== false && strpos( untrailingslashit( $current_slug ), str_replace( '/*', '', $path ) ) !== false ) )
432
+ return $new_output;
433
+ }
434
+
435
+ }
436
+
437
+ return $output;
438
+
439
+ }
440
+
441
+ return $new_output;
442
+
443
+ }
includes/class-advanced-tab.php CHANGED
@@ -77,10 +77,25 @@ class TRP_Advanced_Tab {
77
  $settings[ $registered_setting['name'] ] = sanitize_text_field($submitted_settings[ $registered_setting['name'] ]);
78
  break;
79
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
80
  case 'input_array': {
81
  foreach ( $registered_setting['rows'] as $row_label => $row_name ) {
82
  if (isset($submitted_settings[$registered_setting['name']][$row_label])) {
83
- $settings[$registered_setting['name']][$row_label] = sanitize_text_field($submitted_settings[$registered_setting['name']][$row_label]);
84
  }
85
  }
86
  break;
@@ -205,6 +220,7 @@ class TRP_Advanced_Tab {
205
  include_once(TRP_PLUGIN_DIR . 'includes/advanced-settings/separators.php');
206
  include_once(TRP_PLUGIN_DIR . 'includes/advanced-settings/disable-languages-sitemap.php');
207
  include_once(TRP_PLUGIN_DIR . 'includes/advanced-settings/remove-duplicates-from-db.php');
 
208
  }
209
 
210
  /*
@@ -263,6 +279,9 @@ class TRP_Advanced_Tab {
263
  case 'mixed':
264
  echo $this->mixed_setting( $setting );
265
  break;
 
 
 
266
  }
267
  }
268
  }
@@ -610,7 +629,7 @@ class TRP_Advanced_Tab {
610
  break;
611
  }
612
  }
613
- $html .= "<td><input type='button' class='button-secondary trp-adst-button-add-new-item' value='" . __( 'Add', 'translatepress-multilingual' ) . "'><span class='trp-adst-remove-element' style='display: none;' data-confirm-message='" . __('Are you sure you want to remove this item?', 'translatepress-multilingual') . "'>" . __( 'Remove', 'translatepress-multilingual' ) . "</span></td>";
614
  $html .= "</tr></table>";
615
  $html .= "<p class='description'>
616
  " . $setting['description'] . "
@@ -621,4 +640,20 @@ class TRP_Advanced_Tab {
621
  return apply_filters( 'trp_advanced_setting_list', $html );
622
 
623
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
624
  }
77
  $settings[ $registered_setting['name'] ] = sanitize_text_field($submitted_settings[ $registered_setting['name'] ]);
78
  break;
79
  }
80
+ case 'custom': {
81
+ foreach ( $registered_setting['rows'] as $row_label => $row_type ) {
82
+ if (isset($submitted_settings[$registered_setting['name']][$row_label])) {
83
+
84
+ if( $row_type != 'textarea' )
85
+ $value = sanitize_text_field( $submitted_settings[$registered_setting['name']][$row_label] );
86
+ else
87
+ $value = sanitize_textarea_field( $submitted_settings[$registered_setting['name']][$row_label] );
88
+
89
+ $settings[$registered_setting['name']][$row_label] = $value;
90
+
91
+ }
92
+ }
93
+ break;
94
+ }
95
  case 'input_array': {
96
  foreach ( $registered_setting['rows'] as $row_label => $row_name ) {
97
  if (isset($submitted_settings[$registered_setting['name']][$row_label])) {
98
+ $settings[$registered_setting['name']][$row_label] = sanitize_text_field( $submitted_settings[$registered_setting['name']][$row_label] );
99
  }
100
  }
101
  break;
220
  include_once(TRP_PLUGIN_DIR . 'includes/advanced-settings/separators.php');
221
  include_once(TRP_PLUGIN_DIR . 'includes/advanced-settings/disable-languages-sitemap.php');
222
  include_once(TRP_PLUGIN_DIR . 'includes/advanced-settings/remove-duplicates-from-db.php');
223
+ include_once(TRP_PLUGIN_DIR . 'includes/advanced-settings/do-not-translate-certain-paths.php');
224
  }
225
 
226
  /*
279
  case 'mixed':
280
  echo $this->mixed_setting( $setting );
281
  break;
282
+ case 'custom':
283
+ echo $this->custom_setting( $setting );
284
+ break;
285
  }
286
  }
287
  }
629
  break;
630
  }
631
  }
632
+ $html .= "<td><input type='button' id='button_add_" . $setting['name'] . "' class='button-secondary trp-adst-button-add-new-item' value='" . __( 'Add', 'translatepress-multilingual' ) . "'><span class='trp-adst-remove-element' style='display: none;' data-confirm-message='" . __('Are you sure you want to remove this item?', 'translatepress-multilingual') . "'>" . __( 'Remove', 'translatepress-multilingual' ) . "</span></td>";
633
  $html .= "</tr></table>";
634
  $html .= "<p class='description'>
635
  " . $setting['description'] . "
640
  return apply_filters( 'trp_advanced_setting_list', $html );
641
 
642
  }
643
+
644
+
645
+ /**
646
+ * Can be used to output content outside the very static methods from above
647
+ * Hook to the provided filter
648
+ *
649
+ */
650
+ public function custom_setting( $setting ){
651
+
652
+ if( empty( $setting['name'] ) )
653
+ return;
654
+
655
+ return apply_filters( 'trp_advanced_setting_custom_' . $setting['name'], $setting );
656
+
657
+ }
658
+
659
  }
includes/class-language-switcher.php CHANGED
@@ -46,7 +46,7 @@ class TRP_Language_Switcher{
46
 
47
  $needed_language = $this->determine_needed_language( $language_from_url, $trp );
48
 
49
- $allow_redirect = apply_filters( 'trp_allow_language_redirect', true, $needed_language );
50
  if ( $allow_redirect ) {
51
  if ( ( $language_from_url == null && isset( $this->settings['add-subdirectory-to-default-language'] ) && $this->settings['add-subdirectory-to-default-language'] == 'yes' ) ||
52
  ( $language_from_url == null && $needed_language != $this->settings['default-language'] ) ||
46
 
47
  $needed_language = $this->determine_needed_language( $language_from_url, $trp );
48
 
49
+ $allow_redirect = apply_filters( 'trp_allow_language_redirect', true, $needed_language, $this->url_converter->cur_page_url() );
50
  if ( $allow_redirect ) {
51
  if ( ( $language_from_url == null && isset( $this->settings['add-subdirectory-to-default-language'] ) && $this->settings['add-subdirectory-to-default-language'] == 'yes' ) ||
52
  ( $language_from_url == null && $needed_language != $this->settings['default-language'] ) ||
includes/class-machine-translation-tab.php CHANGED
@@ -130,13 +130,14 @@ class TRP_Machine_Translation_Tab {
130
 
131
  return $engines;
132
  }
133
-
134
  public function display_unsupported_languages(){
135
  $trp = TRP_Translate_Press::get_trp_instance();
136
  $machine_translator = $trp->get_component( 'machine_translator' );
137
  $trp_languages = $trp->get_component( 'languages' );
138
 
139
  if ( 'yes' === $this->settings['trp_machine_translation_settings']['machine-translation'] &&
 
140
  !$machine_translator->check_languages_availability($this->settings['translation-languages'])
141
  ){
142
 
130
 
131
  return $engines;
132
  }
133
+
134
  public function display_unsupported_languages(){
135
  $trp = TRP_Translate_Press::get_trp_instance();
136
  $machine_translator = $trp->get_component( 'machine_translator' );
137
  $trp_languages = $trp->get_component( 'languages' );
138
 
139
  if ( 'yes' === $this->settings['trp_machine_translation_settings']['machine-translation'] &&
140
+ !empty( $machine_translator->get_api_key() ) &&
141
  !$machine_translator->check_languages_availability($this->settings['translation-languages'])
142
  ){
143
 
includes/class-url-converter.php CHANGED
@@ -105,13 +105,16 @@ class TRP_Url_Converter {
105
  $path = $_SERVER['REQUEST_URI'];
106
  }
107
 
108
- //check if sitemap and .xml
109
  if( strpos($path, 'sitemap') !== false &&
110
- strpos($path, '.xml') !== false &&
111
- !in_array( 'wpseo_sitemap_url', $wp_current_filter ) &&
 
112
  !in_array( 'seopress_sitemaps_url', $wp_current_filter ) &&
113
- !in_array( 'rank_math/sitemap/url', $wp_current_filter )&&
114
- !in_array( 'aiosp_sitemap_data', $wp_current_filter )
 
 
115
  ){
116
  return true;
117
  }
@@ -323,17 +326,15 @@ class TRP_Url_Converter {
323
 
324
  $processed_permalink = get_permalink($post_id);
325
 
326
- if($url_obj->isSchemeless()){
327
- $arguments = str_replace(trailingslashit($processed_permalink), '', trailingslashit(trailingslashit( home_url() ) . ltrim($url, '/') ) );
328
- } else {
329
- $arguments = str_replace($processed_permalink, '', $url );
330
- }
331
 
332
  // if nothing was replaced, something was wrong, just use the normal permalink without any arguments.
333
- if( $arguments == $url ) $arguments = '';
 
334
 
335
  $TRP_LANGUAGE = $language;
336
- $new_url = get_permalink( $post_id ) . $arguments;
337
  trp_bulk_debug($debug, array('url' => $url, 'new url' => $new_url, 'found post id' => $post_id, 'url type' => 'based on permalink', 'for language' => $TRP_LANGUAGE));
338
  $TRP_LANGUAGE = $trp_language_copy;
339
 
@@ -754,4 +755,4 @@ class TRP_Url_Converter {
754
  return $url;
755
  }
756
 
757
- }
105
  $path = $_SERVER['REQUEST_URI'];
106
  }
107
 
108
+ // Verify that this is a sitemap url and that it contains the .xml extension
109
  if( strpos($path, 'sitemap') !== false &&
110
+ strpos($path, '.xml') !== false &&
111
+ // Bypass this check if we're on certain filters in order to be able to generate other language urls
112
+ !in_array( 'wpseo_sitemap_url', $wp_current_filter ) &&
113
  !in_array( 'seopress_sitemaps_url', $wp_current_filter ) &&
114
+ !in_array( 'rank_math/sitemap/url', $wp_current_filter ) &&
115
+ !in_array( 'aiosp_sitemap_data', $wp_current_filter ) &&
116
+ !in_array( 'aioseo_sitemap_terms', $wp_current_filter ) &&
117
+ !in_array( 'aioseo_sitemap_posts', $wp_current_filter )
118
  ){
119
  return true;
120
  }
326
 
327
  $processed_permalink = get_permalink($post_id);
328
 
329
+ $url_to_replace = ($url_obj->isSchemeless()) ? trailingslashit(trailingslashit( home_url() ) . ltrim($url, '/') ) : $url;
330
+ $arguments = str_replace(untrailingslashit($processed_permalink), '', $url_to_replace );
 
 
 
331
 
332
  // if nothing was replaced, something was wrong, just use the normal permalink without any arguments.
333
+ if( $arguments == $url_to_replace )
334
+ $arguments = '';
335
 
336
  $TRP_LANGUAGE = $language;
337
+ $new_url = trailingslashit( get_permalink($post_id) ) . ltrim($arguments, '/');
338
  trp_bulk_debug($debug, array('url' => $url, 'new url' => $new_url, 'found post id' => $post_id, 'url type' => 'based on permalink', 'for language' => $TRP_LANGUAGE));
339
  $TRP_LANGUAGE = $trp_language_copy;
340
 
755
  return $url;
756
  }
757
 
758
+ }
includes/class-wp-bakery-language-for-blocks.php ADDED
@@ -0,0 +1,262 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Exit if accessed directly
4
+ if (!defined('ABSPATH')) {
5
+ exit();
6
+ }
7
+
8
+ class TRP_WPBakery {
9
+ private static $_instance = null;
10
+
11
+ public $shortcode_param_type_dropdown_multi = 'trp_dropdown_multi';
12
+ public $param_name_show = 'trp_param_show';
13
+ public $param_name_show_language = 'trp_param_show_language';
14
+ public $param_name_exclude = 'trp_param_exclude';
15
+ public $param_name_exclude_languages = 'trp_param_exclude_languages';
16
+
17
+ /**
18
+ * Register plugin action hooks and filters
19
+ */
20
+ public function __construct() {
21
+ add_action('init', [$this, 'init'], PHP_INT_MAX /* We need to collect all available shortcodes */);
22
+ add_filter(
23
+ 'do_shortcode_tag',
24
+ [$this, 'do_shortcode_tag'],
25
+ PHP_INT_MAX /* We should be the last one, so no other filter can add additional content */,
26
+ 3
27
+ );
28
+ }
29
+
30
+ public function init() {
31
+ if (class_exists('WPBMap')) {
32
+ WPBMap::addAllMappedShortcodes();
33
+ }
34
+ $this->register_dropdown_multi();
35
+ $this->register_params_show_for_shortcodes();
36
+ $this->register_params_exclude_for_shortcodes();
37
+ }
38
+
39
+ /**
40
+ * Modify the output of a given shortcode if TranslatePress is configured.
41
+ */
42
+ public function do_shortcode_tag($output, $tag, $attr) {
43
+ return $this->is_hidden($attr) ? '' : $output;
44
+ }
45
+
46
+ /**
47
+ * Visual Composer does not a multi-dropdown out-of-the-box. But we can add an alternative
48
+ * `type` which supports the `<select multiple` usage.
49
+ *
50
+ * @see https://stackoverflow.com/a/48125515/5506547
51
+ */
52
+ private function register_dropdown_multi() {
53
+ vc_add_shortcode_param($this->shortcode_param_type_dropdown_multi, function ($param, $value) {
54
+ if (!is_array($value)) {
55
+ $param_value_arr = explode(',', $value);
56
+ } else {
57
+ $param_value_arr = $value;
58
+ }
59
+
60
+ $param_line = '';
61
+ $param_line .=
62
+ '<select multiple name="' .
63
+ esc_attr($param['param_name']) .
64
+ '" class="wpb_vc_param_value wpb-input wpb-select ' .
65
+ esc_attr($param['param_name']) .
66
+ ' ' .
67
+ esc_attr($param['type']) .
68
+ '">';
69
+ foreach ($param['value'] as $text_val => $val) {
70
+ if (is_numeric($text_val) && (is_string($val) || is_numeric($val))) {
71
+ $text_val = $val;
72
+ }
73
+ $selected = '';
74
+ if (!empty($param_value_arr) && in_array($val, $param_value_arr)) {
75
+ $selected = ' selected="selected"';
76
+ }
77
+ $param_line .=
78
+ '<option class="' . $val . '" value="' . $val . '"' . $selected . '>' . $text_val . '</option>';
79
+ }
80
+ $param_line .= '</select>';
81
+
82
+ return $param_line;
83
+ });
84
+ }
85
+
86
+ /**
87
+ * We need to register the parameter attributes for all available shortcodes.
88
+ *
89
+ * @see https://kb.wpbakery.com/docs/inner-api/vc_add_param/
90
+ */
91
+ private function register_params_show_for_shortcodes() {
92
+ global $shortcode_tags;
93
+ $shortcode_bases = array_keys($shortcode_tags);
94
+ $group = $this->get_group();
95
+
96
+ $attributes_checkbox = [
97
+ 'type' => 'checkbox',
98
+ 'heading' => __('Restrict element to language', 'translatepress'),
99
+ 'param_name' => $this->param_name_show,
100
+ 'group' => $group,
101
+ 'description' => __('Show this element only in one language.', 'translatepress')
102
+ ];
103
+
104
+ $attributes_value = [
105
+ 'type' => 'dropdown',
106
+ 'heading' => __('Select language', 'translatepress'),
107
+ 'param_name' => $this->param_name_show_language,
108
+ 'group' => $group,
109
+ 'value' => array_flip($this->get_published_languages(true)),
110
+ 'description' => __('Choose in which language to show this element.', 'translatepress'),
111
+ 'dependency' => [
112
+ 'element' => $this->param_name_show,
113
+ 'value' => 'true'
114
+ ]
115
+ ];
116
+
117
+ $skip_sc = apply_filters( 'trp_wpbakery_skip_shortcodes', $this->get_skip_sc_array());
118
+ foreach ($shortcode_bases as $sh) {
119
+ if ( !in_array( $sh, $skip_sc ) ) {
120
+ vc_add_param( $sh, $attributes_checkbox );
121
+ vc_add_param( $sh, $attributes_value );
122
+ }
123
+ }
124
+ }
125
+
126
+ /**
127
+ * We need to register the parameter attributes for all available shortcodes.
128
+ *
129
+ * @see https://kb.wpbakery.com/docs/inner-api/vc_add_param/
130
+ */
131
+ private function register_params_exclude_for_shortcodes() {
132
+ global $shortcode_tags;
133
+ $shortcode_bases = array_keys($shortcode_tags);
134
+ $group = $this->get_group();
135
+
136
+ $attributes_checkbox = [
137
+ 'type' => 'checkbox',
138
+ 'heading' => __('Exclude from Language', 'translatepress'),
139
+ 'param_name' => $this->param_name_exclude,
140
+ 'group' => $group,
141
+ 'description' => __('Exclude this element from specific languages.', 'translatepress')
142
+ ];
143
+
144
+ $message =
145
+ '<p>' .
146
+ __(
147
+ 'This element will still be visible when you are translating your website through the Translation Editor.',
148
+ 'translatepress'
149
+ ) .
150
+ '</p>';
151
+ $message .=
152
+ '<p>' .
153
+ __('The content of this element should be written in the default language.', 'translatepress') .
154
+ '</p>';
155
+
156
+ $attributes_value = [
157
+ 'type' => $this->shortcode_param_type_dropdown_multi,
158
+ 'heading' => __('Select languages', 'translatepress'),
159
+ 'param_name' => $this->param_name_exclude_languages,
160
+ 'group' => $group,
161
+ 'value' => array_flip($this->get_published_languages(true)),
162
+ 'description' => __('Choose from which languages to exclude this element.', 'translatepress') . $message,
163
+ 'dependency' => [
164
+ 'element' => $this->param_name_exclude,
165
+ 'value' => 'true'
166
+ ]
167
+ ];
168
+
169
+ $skip_sc = apply_filters( 'trp_wpbakery_skip_shortcodes', $this->get_skip_sc_array());
170
+ foreach ($shortcode_bases as $sh) {
171
+ if ( !in_array( $sh, $skip_sc ) ) {
172
+ vc_add_param( $sh, $attributes_checkbox );
173
+ vc_add_param( $sh, $attributes_value );
174
+ }
175
+ }
176
+ }
177
+
178
+ private function get_group() {
179
+ return __('TranslatePress', 'translatepress');
180
+ }
181
+
182
+ private function get_published_languages($placeholder = false) {
183
+ $trp = TRP_Translate_Press::get_trp_instance();
184
+ $trp_languages = $trp->get_component('languages');
185
+ $trp_settings = $trp->get_component('settings');
186
+ $result = $trp_languages->get_language_names($trp_settings->get_settings()['publish-languages']);
187
+
188
+ if ($placeholder) {
189
+ $result = array_merge(['' => ''], $result);
190
+ }
191
+ return $result;
192
+ }
193
+
194
+ private function is_inline_editor() {
195
+ return ( isset($_GET['vc_action']) && $_GET['vc_action'] === 'vc_inline' ) ||
196
+ ( isset($_GET['vc_editable']) && $_GET['vc_editable'] === 'true' );
197
+ }
198
+
199
+ private function is_hidden($attr) {
200
+ if (!is_array($attr) || $this->is_inline_editor()) {
201
+ return false;
202
+ }
203
+
204
+ // Restrict to only one language
205
+ if (isset($attr[$this->param_name_show], $attr[$this->param_name_show_language])) {
206
+ $current_language = get_locale();
207
+
208
+ if ($current_language !== $attr[$this->param_name_show_language]) {
209
+ return true;
210
+ }
211
+ }
212
+
213
+ // Exclude to multiple languages
214
+ if (isset($attr[$this->param_name_exclude], $attr[$this->param_name_exclude_languages])) {
215
+ $current_language = get_locale();
216
+ $exclude = explode(',', $attr[$this->param_name_exclude_languages]);
217
+
218
+ if (in_array($current_language, $exclude)) {
219
+ return true;
220
+ }
221
+ }
222
+
223
+ return false;
224
+ }
225
+
226
+ /**
227
+ *
228
+ * Ensures only one instance of the class is loaded or can be loaded.
229
+ *
230
+ * @return TRP_WPBakery An instance of the class.
231
+ */
232
+ public static function instance() {
233
+ if (is_null(self::$_instance)) {
234
+ self::$_instance = new self();
235
+ }
236
+
237
+ return self::$_instance;
238
+ }
239
+
240
+ /**
241
+ *
242
+ * Shortcodes with missing 'params' trigger notice, so don't add TP settings to them
243
+ *
244
+ * @return array of shortcodes to skip
245
+ */
246
+ public function get_skip_sc_array(){
247
+ $skip_sc = array();
248
+ $sc = WPBMap::getAllShortCodes();
249
+ if ( isset( $sc) && is_array($sc) ){
250
+ foreach( $sc as $key => $value ){
251
+ if ( isset($sc[$key] ) && !isset($sc[$key]['params'])){
252
+ $skip_sc[] = $key;
253
+ }
254
+ }
255
+ }
256
+ return $skip_sc;
257
+ }
258
+
259
+ }
260
+
261
+ // Instantiate Plugin Class
262
+ TRP_WPBakery::instance();
includes/compatibility-functions.php CHANGED
@@ -1341,4 +1341,23 @@ function trp_force_search( $bool ){
1341
  $bool = true;
1342
 
1343
  return $bool;
1344
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1341
  $bool = true;
1342
 
1343
  return $bool;
1344
+ }
1345
+
1346
+ /**
1347
+ * Strip tags manually from a problematic string coming from the My Listing theme
1348
+ */
1349
+ add_action('init', 'trp_mylisting_hook_exclude_string' );
1350
+ function trp_mylisting_hook_exclude_string(){
1351
+ if( class_exists( 'MyListing\\App' ) ){
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' )
1359
+ $translation = TRP_Translation_Manager::strip_gettext_tags( $translation );
1360
+
1361
+ return $translation;
1362
+
1363
+ }
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.4
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.5
7
  Author: Cozmoslabs, Razvan Mocanu, Madalin Ungureanu, Cristophor Hurduban
8
  Author URI: https://cozmoslabs.com/
9
  Text Domain: translatepress-multilingual
languages/translatepress-multilingual.catalog.php CHANGED
@@ -328,6 +328,8 @@
328
  <?php __("It disables search indexing the post title in translated languages.<br/>Useful when the title of the post doesn't allow HTML thus breaking the page.", "translatepress-multilingual"); ?>
329
  <?php __("Disable post container tags for post content", "translatepress-multilingual"); ?>
330
  <?php __("It disables search indexing the post content in translated languages.<br/>Useful when the content of the post doesn't allow HTML thus breaking the page.", "translatepress-multilingual"); ?>
 
 
331
  <?php __("Automatically translate slugs", "translatepress-multilingual"); ?>
332
  <?php __("Generate automatic translations of slugs for posts, pages and Custom Post Types.<br/>Requires <a href=\"https://translatepress.com/docs/addons/seo-pack/\" title=\"TranslatePress Add-on SEO Pack documentation\" target=\"_blank\"> SEO Pack Add-on</a> to be installed and activated.", "translatepress-multilingual"); ?>
333
  <?php __("Enable the hreflang x-default tag for language:", "translatepress-multilingual"); ?>
328
  <?php __("It disables search indexing the post title in translated languages.<br/>Useful when the title of the post doesn't allow HTML thus breaking the page.", "translatepress-multilingual"); ?>
329
  <?php __("Disable post container tags for post content", "translatepress-multilingual"); ?>
330
  <?php __("It disables search indexing the post content in translated languages.<br/>Useful when the content of the post doesn't allow HTML thus breaking the page.", "translatepress-multilingual"); ?>
331
+ <?php __("Do not translate certain paths", "translatepress-multilingual"); ?>
332
+ <?php __("Choose what paths can be translated. Supports wildcard at the end of the path.<br>For example, to exclude https://example.com/some/path you can either use the rule /some/path/ or /some/*.<br>Enter each rule on it's own line. To exclude the home page use {{home}}.", "translatepress-multilingual"); ?>
333
  <?php __("Automatically translate slugs", "translatepress-multilingual"); ?>
334
  <?php __("Generate automatic translations of slugs for posts, pages and Custom Post Types.<br/>Requires <a href=\"https://translatepress.com/docs/addons/seo-pack/\" title=\"TranslatePress Add-on SEO Pack documentation\" target=\"_blank\"> SEO Pack Add-on</a> to be installed and activated.", "translatepress-multilingual"); ?>
335
  <?php __("Enable the hreflang x-default tag for language:", "translatepress-multilingual"); ?>
languages/translatepress-multilingual.pot CHANGED
@@ -97,7 +97,7 @@ msgstr ""
97
  msgid "Are you sure you want to remove this language?"
98
  msgstr ""
99
 
100
- #: ../tp-add-on-extra-languages/partials/language-selector-pro.php:43, includes/class-advanced-tab.php:483, includes/class-advanced-tab.php:494, includes/class-advanced-tab.php:582, includes/class-advanced-tab.php:613, partials/main-settings-language-selector.php:40
101
  msgid "Remove"
102
  msgstr ""
103
 
@@ -105,7 +105,7 @@ msgstr ""
105
  msgid "Choose..."
106
  msgstr ""
107
 
108
- #: ../tp-add-on-extra-languages/partials/language-selector-pro.php:58, includes/class-advanced-tab.php:494, includes/class-advanced-tab.php:613, partials/main-settings-language-selector.php:55
109
  msgid "Add"
110
  msgstr ""
111
 
@@ -133,15 +133,15 @@ msgstr ""
133
  msgid "Advanced"
134
  msgstr ""
135
 
136
- #: includes/class-advanced-tab.php:286, includes/class-error-manager.php:155, partials/machine-translation-settings-page.php:13, partials/machine-translation-settings-page.php:78, partials/machine-translation-settings-page.php:111, partials/main-settings-page.php:41, partials/main-settings-page.php:54, partials/main-settings-page.php:67
137
  msgid "Yes"
138
  msgstr ""
139
 
140
- #: includes/class-advanced-tab.php:483, includes/class-advanced-tab.php:494, includes/class-advanced-tab.php:582, includes/class-advanced-tab.php:613
141
  msgid "Are you sure you want to remove this item?"
142
  msgstr ""
143
 
144
- #: includes/class-advanced-tab.php:566, includes/class-advanced-tab.php:600
145
  msgid "Select..."
146
  msgstr ""
147
 
@@ -277,19 +277,19 @@ msgstr ""
277
  msgid "DeepL"
278
  msgstr ""
279
 
280
- #: includes/class-machine-translation-tab.php:147
281
  msgid "Unsupported languages"
282
  msgstr ""
283
 
284
- #: includes/class-machine-translation-tab.php:158
285
  msgid "Recheck supported languages"
286
  msgstr ""
287
 
288
- #: includes/class-machine-translation-tab.php:159
289
  msgid "(last checked on %s)"
290
  msgstr ""
291
 
292
- #: includes/class-machine-translation-tab.php:161
293
  msgid "The selected automatic translation engine does not provide support for these languages.<br>You can still manually translate pages in these languages using the Translation Editor."
294
  msgstr ""
295
 
@@ -1329,6 +1329,14 @@ msgstr ""
1329
  msgid "It disables search indexing the post content in translated languages.<br/>Useful when the content of the post doesn't allow HTML thus breaking the page."
1330
  msgstr ""
1331
 
 
 
 
 
 
 
 
 
1332
  #: includes/advanced-settings/enable-auto-translate-slug.php:8
1333
  msgid "Automatically translate slugs"
1334
  msgstr ""
97
  msgid "Are you sure you want to remove this language?"
98
  msgstr ""
99
 
100
+ #: ../tp-add-on-extra-languages/partials/language-selector-pro.php:43, includes/class-advanced-tab.php:502, includes/class-advanced-tab.php:513, includes/class-advanced-tab.php:601, includes/class-advanced-tab.php:632, partials/main-settings-language-selector.php:40
101
  msgid "Remove"
102
  msgstr ""
103
 
105
  msgid "Choose..."
106
  msgstr ""
107
 
108
+ #: ../tp-add-on-extra-languages/partials/language-selector-pro.php:58, includes/class-advanced-tab.php:513, includes/class-advanced-tab.php:632, partials/main-settings-language-selector.php:55
109
  msgid "Add"
110
  msgstr ""
111
 
133
  msgid "Advanced"
134
  msgstr ""
135
 
136
+ #: includes/class-advanced-tab.php:305, includes/class-error-manager.php:155, partials/machine-translation-settings-page.php:13, partials/machine-translation-settings-page.php:78, partials/machine-translation-settings-page.php:111, partials/main-settings-page.php:41, partials/main-settings-page.php:54, partials/main-settings-page.php:67
137
  msgid "Yes"
138
  msgstr ""
139
 
140
+ #: includes/class-advanced-tab.php:502, includes/class-advanced-tab.php:513, includes/class-advanced-tab.php:601, includes/class-advanced-tab.php:632
141
  msgid "Are you sure you want to remove this item?"
142
  msgstr ""
143
 
144
+ #: includes/class-advanced-tab.php:585, includes/class-advanced-tab.php:619
145
  msgid "Select..."
146
  msgstr ""
147
 
277
  msgid "DeepL"
278
  msgstr ""
279
 
280
+ #: includes/class-machine-translation-tab.php:148
281
  msgid "Unsupported languages"
282
  msgstr ""
283
 
284
+ #: includes/class-machine-translation-tab.php:159
285
  msgid "Recheck supported languages"
286
  msgstr ""
287
 
288
+ #: includes/class-machine-translation-tab.php:160
289
  msgid "(last checked on %s)"
290
  msgstr ""
291
 
292
+ #: includes/class-machine-translation-tab.php:162
293
  msgid "The selected automatic translation engine does not provide support for these languages.<br>You can still manually translate pages in these languages using the Translation Editor."
294
  msgstr ""
295
 
1329
  msgid "It disables search indexing the post content in translated languages.<br/>Useful when the content of the post doesn't allow HTML thus breaking the page."
1330
  msgstr ""
1331
 
1332
+ #: includes/advanced-settings/do-not-translate-certain-paths.php:10
1333
+ msgid "Do not translate certain paths"
1334
+ msgstr ""
1335
+
1336
+ #: includes/advanced-settings/do-not-translate-certain-paths.php:11
1337
+ msgid "Choose what paths can be translated. Supports wildcard at the end of the path.<br>For example, to exclude https://example.com/some/path you can either use the rule /some/path/ or /some/*.<br>Enter each rule on it's own line. To exclude the home page use {{home}}."
1338
+ msgstr ""
1339
+
1340
  #: includes/advanced-settings/enable-auto-translate-slug.php:8
1341
  msgid "Automatically translate slugs"
1342
  msgstr ""
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
7
  Requires PHP: 5.6.20
8
- Stable tag: 1.9.4
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.4 =
142
  * Updated DOM parser to version 1.9.1, this should fix a bunch of broken HTML issues
143
  * Fixed a case in Woocommerce where slugs weren't translated from the seo-pack addon
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
 
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
144
+ * WP Bakery integration that allow to include/exclude blocks for languages
145
+ * Added a compatibility for the MyListing theme.
146
+ * Load unsupported languages section only if an API key is saved.
147
+ * Add support for AIO SEO sitemap detection
148
+
149
  = 1.9.4 =
150
  * Updated DOM parser to version 1.9.1, this should fix a bunch of broken HTML issues
151
  * Fixed a case in Woocommerce where slugs weren't translated from the seo-pack addon