TranslatePress – Translate Multilingual sites - Version 1.0.5

Version Description

  • Added possibility to edit gettext strings from themes and plugins from english to english, without adding another language. Basically, string-replace functionality.
  • We now can translate text input placeholders
  • We have a way of translating emails using the conditional language shortcode [trp_language language="en_US"] English only content [/trp_language]
  • Fixed issues with some elements that contained new lines and \u00a0 at the start of the strings
Download this release

Release Info

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

Code changes from version 1.0.4 to 1.0.5

assets/css/trp-editor-style.css CHANGED
@@ -46,6 +46,16 @@ body{
46
  padding: 12px;
47
  }
48
 
 
 
 
 
 
 
 
 
 
 
49
  #trp-unsaved-changes-warning-message{
50
  color: #dc3232;
51
  }
46
  padding: 12px;
47
  }
48
 
49
+ #trp-upsell-section h3,
50
+ #trp-upsell-section p{
51
+ text-align: center;
52
+ }
53
+
54
+ #trp-upsell-section .button-primary{
55
+ min-width:200px;
56
+ }
57
+
58
+
59
  #trp-unsaved-changes-warning-message{
60
  color: #dc3232;
61
  }
assets/js/trp-editor-script.js CHANGED
@@ -424,20 +424,20 @@ function TRP_Editor(){
424
  * if the edit icon button has a parent with overflow hidden and position relative it won't show so we want to change it's margin to 0 so it will appear inside the element
425
  */
426
  this.maybe_overflow_fix = function( icon ){
427
- if (navigator.userAgent.search("Chrome") >= 0 || navigator.userAgent.search("Firefox") >= 0 || navigator.userAgent.search("Edge") >= 0 ) {
428
  icon.parents().filter( function(){ var overflow = jQuery(this).css('overflow');
429
  return overflow == 'hidden' && !jQuery(this).is('body'); } ).each( function(){
430
  jQuery(this).parent().addClass('trp-overflow-transform-fixer');
431
  return false;
432
  });
433
  }
434
- else{
435
- icon.parents().filter( function(){ var overflow = jQuery(this).css('overflow');
436
  return overflow == 'hidden' && !jQuery(this).is('body'); } ).each( function(){
437
  jQuery(this).addClass('trp-overflow-inside-fixer');
438
  return false;
439
  });
440
- }
441
  };
442
 
443
  /**
@@ -679,14 +679,17 @@ function TRP_String( language, array_index ){
679
  */
680
  this.wrap_special_html_elements = function(){
681
  if( jquery_object.is('button') ){
 
682
  jquery_object.wrap('<trp-highlight data-trp-button="true"></trp-highlight>');
683
  jquery_object = jquery_object.parent();
684
  }
685
  else if ( jquery_object.attr( 'type' ) == 'submit' || jquery_object.attr( 'type' ) == 'button' ) {
 
686
  jquery_object.wrap('<trp-highlight data-trp-attr="value"></trp-highlight>');
687
  jquery_object = jquery_object.parent();
688
  }
689
- else if ( jquery_object.attr( 'type' ) == 'search' ) {
 
690
  jquery_object.wrap('<trp-highlight data-trp-attr="placeholder"></trp-highlight>');
691
  jquery_object = jquery_object.parent();
692
  }
424
  * if the edit icon button has a parent with overflow hidden and position relative it won't show so we want to change it's margin to 0 so it will appear inside the element
425
  */
426
  this.maybe_overflow_fix = function( icon ){
427
+ /*if (navigator.userAgent.search("Chrome") >= 0 || navigator.userAgent.search("Firefox") >= 0 || navigator.userAgent.search("Edge") >= 0 ) {
428
  icon.parents().filter( function(){ var overflow = jQuery(this).css('overflow');
429
  return overflow == 'hidden' && !jQuery(this).is('body'); } ).each( function(){
430
  jQuery(this).parent().addClass('trp-overflow-transform-fixer');
431
  return false;
432
  });
433
  }
434
+ else{*/
435
+ icon.parents().filter( function(index){ if( index > 6 ) return false;var overflow = jQuery(this).css('overflow');
436
  return overflow == 'hidden' && !jQuery(this).is('body'); } ).each( function(){
437
  jQuery(this).addClass('trp-overflow-inside-fixer');
438
  return false;
439
  });
440
+ //}
441
  };
442
 
443
  /**
679
  */
680
  this.wrap_special_html_elements = function(){
681
  if( jquery_object.is('button') ){
682
+ jquery_object.unwrap('trp-highlight');
683
  jquery_object.wrap('<trp-highlight data-trp-button="true"></trp-highlight>');
684
  jquery_object = jquery_object.parent();
685
  }
686
  else if ( jquery_object.attr( 'type' ) == 'submit' || jquery_object.attr( 'type' ) == 'button' ) {
687
+ jquery_object.unwrap('trp-highlight');
688
  jquery_object.wrap('<trp-highlight data-trp-attr="value"></trp-highlight>');
689
  jquery_object = jquery_object.parent();
690
  }
691
+ else if ( ( jquery_object.attr( 'type' ) == 'text' || jquery_object.attr( 'type' ) == 'search' ) && ( typeof jquery_object.attr( 'placeholder' ) != 'undefined' ) ) {
692
+ jquery_object.unwrap('trp-highlight');
693
  jquery_object.wrap('<trp-highlight data-trp-attr="placeholder"></trp-highlight>');
694
  jquery_object = jquery_object.parent();
695
  }
assets/js/trp-translate-dom-changes.js CHANGED
@@ -121,7 +121,7 @@ function TRP_Translator(){
121
  var all_nodes = jQuery( mutation.addedNodes[i]).find( '*').addBack();
122
  var all_strings = all_nodes.contents().filter(function(){
123
  if( this.nodeType === 3 && /\S/.test(this.nodeValue) ){
124
- if ( jQuery(this).parents( '[data-trpgettextoriginal]').length == 0 && jQuery(this).parents( '[data-trp-translate-id]').length == 0 ){
125
  return this;
126
  }
127
  }
@@ -132,7 +132,7 @@ function TRP_Translator(){
132
  var all_strings_length = all_strings.length;
133
  for (var j = 0; j < all_strings_length; j++ ) {
134
  if ( _this.trim( all_strings[j].textContent, except_characters ) != '' ) {
135
- strings.push({node: all_strings[j], original: all_strings[j].textContent});
136
  all_strings[j].textContent = '';
137
  }
138
  }
121
  var all_nodes = jQuery( mutation.addedNodes[i]).find( '*').addBack();
122
  var all_strings = all_nodes.contents().filter(function(){
123
  if( this.nodeType === 3 && /\S/.test(this.nodeValue) ){
124
+ if ( jQuery(this).closest( '[data-trpgettextoriginal]').length == 0 && jQuery(this).closest( '[data-trp-translate-id]').length == 0 ){
125
  return this;
126
  }
127
  }
132
  var all_strings_length = all_strings.length;
133
  for (var j = 0; j < all_strings_length; j++ ) {
134
  if ( _this.trim( all_strings[j].textContent, except_characters ) != '' ) {
135
+ strings.push({node: all_strings[j], original: _this.trim( all_strings[j].textContent, except_characters )});
136
  all_strings[j].textContent = '';
137
  }
138
  }
class-translate-press.php CHANGED
@@ -39,7 +39,7 @@ class TRP_Translate_Press{
39
  define( 'TRP_PLUGIN_DIR', plugin_dir_path( __FILE__ ) );
40
  define( 'TRP_PLUGIN_URL', plugin_dir_url( __FILE__ ) );
41
  define( 'TRP_PLUGIN_SLUG', 'translatepress' );
42
- define( 'TRP_PLUGIN_VERSION', '1.0.4' );
43
 
44
  $this->load_dependencies();
45
  $this->initialize_components();
@@ -173,6 +173,9 @@ class TRP_Translate_Press{
173
  $this->loader->add_action( 'plugins_loaded', $this->query, 'check_for_necessary_updates' );
174
 
175
  $this->loader->add_filter( 'trp_language_name', $this->languages, 'beautify_language_name', 10, 3 );
 
 
 
176
  }
177
 
178
  /**
39
  define( 'TRP_PLUGIN_DIR', plugin_dir_path( __FILE__ ) );
40
  define( 'TRP_PLUGIN_URL', plugin_dir_url( __FILE__ ) );
41
  define( 'TRP_PLUGIN_SLUG', 'translatepress' );
42
+ define( 'TRP_PLUGIN_VERSION', '1.0.5' );
43
 
44
  $this->load_dependencies();
45
  $this->initialize_components();
173
  $this->loader->add_action( 'plugins_loaded', $this->query, 'check_for_necessary_updates' );
174
 
175
  $this->loader->add_filter( 'trp_language_name', $this->languages, 'beautify_language_name', 10, 3 );
176
+
177
+ /* set up wp_mail hooks */
178
+ $this->loader->add_filter( 'wp_mail', $this->translation_render, 'wp_mail_filter', 200 );
179
  }
180
 
181
  /**
includes/class-translation-manager.php CHANGED
@@ -68,7 +68,7 @@ class TRP_Translation_Manager{
68
  wp_enqueue_script( 'trp-select2-lib-js', TRP_PLUGIN_URL . 'assets/lib/select2-lib/dist/js/select2.min.js', array( 'jquery' ), TRP_PLUGIN_VERSION );
69
 
70
  wp_enqueue_script( 'trp-translation-manager-script', TRP_PLUGIN_URL . 'assets/js/trp-editor-script.js', array(), TRP_PLUGIN_VERSION );
71
- wp_enqueue_style( 'trp-translation-manager-style', TRP_PLUGIN_URL . 'assets/css/trp-editor-style.css', array(), TRP_PLUGIN_VERSION );
72
 
73
  wp_enqueue_script( 'trp-translation-overlay', TRP_PLUGIN_URL . 'assets/js/trp-editor-overlay.js', array(), TRP_PLUGIN_VERSION );
74
 
@@ -572,7 +572,7 @@ class TRP_Translation_Manager{
572
  global $TRP_LANGUAGE;
573
 
574
  /* don't do anything if we don't have extra languages on the site */
575
- if( count( $this->settings['publish-languages'] ) <= 1 )
576
  return $translation;
577
 
578
  if( ( isset( $_REQUEST['trp-edit-translation'] ) && $_REQUEST['trp-edit-translation'] == 'true' ) || $domain == TRP_PLUGIN_SLUG )
68
  wp_enqueue_script( 'trp-select2-lib-js', TRP_PLUGIN_URL . 'assets/lib/select2-lib/dist/js/select2.min.js', array( 'jquery' ), TRP_PLUGIN_VERSION );
69
 
70
  wp_enqueue_script( 'trp-translation-manager-script', TRP_PLUGIN_URL . 'assets/js/trp-editor-script.js', array(), TRP_PLUGIN_VERSION );
71
+ wp_enqueue_style( 'trp-translation-manager-style', TRP_PLUGIN_URL . 'assets/css/trp-editor-style.css', array('buttons'), TRP_PLUGIN_VERSION );
72
 
73
  wp_enqueue_script( 'trp-translation-overlay', TRP_PLUGIN_URL . 'assets/js/trp-editor-overlay.js', array(), TRP_PLUGIN_VERSION );
74
 
572
  global $TRP_LANGUAGE;
573
 
574
  /* don't do anything if we don't have extra languages on the site */
575
+ if( count( $this->settings['publish-languages'] ) < 1 )
576
  return $translation;
577
 
578
  if( ( isset( $_REQUEST['trp-edit-translation'] ) && $_REQUEST['trp-edit-translation'] == 'true' ) || $domain == TRP_PLUGIN_SLUG )
includes/class-translation-render.php CHANGED
@@ -47,12 +47,17 @@ class TRP_Translation_Render{
47
  if ( in_array( $TRP_LANGUAGE, $this->settings['translation-languages'] ) ) {
48
  if ( $TRP_LANGUAGE == $this->settings['default-language'] ){
49
  if ( isset( $_REQUEST['trp-edit-translation'] ) && $_REQUEST['trp-edit-translation'] == 'preview' ) {
50
- foreach ($this->settings['translation-languages'] as $language) {
51
- if ($language != $TRP_LANGUAGE) {
52
- // return the first language not default. only used for preview mode
53
- return $language;
 
 
54
  }
55
  }
 
 
 
56
  }
57
  }else {
58
  return $TRP_LANGUAGE;
@@ -68,6 +73,7 @@ class TRP_Translation_Render{
68
  * @return string Trimmed string.
69
  */
70
  public function full_trim( $word ) {
 
71
  $word = trim($word," \t\n\r\0\x0B\xA0�" );
72
  if ( htmlentities( $word ) == "" || strip_tags( $word ) == "" || trim ($word, " \t\n\r\0\x0B\xA0�.,/`~!@#\$€£%^&*():;-_=+[]{}\\|?/<>1234567890'\"" ) == '' ){
73
  $word = '';
@@ -684,4 +690,22 @@ class TRP_Translation_Render{
684
  }
685
  }
686
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
687
  }
47
  if ( in_array( $TRP_LANGUAGE, $this->settings['translation-languages'] ) ) {
48
  if ( $TRP_LANGUAGE == $this->settings['default-language'] ){
49
  if ( isset( $_REQUEST['trp-edit-translation'] ) && $_REQUEST['trp-edit-translation'] == 'preview' ) {
50
+ if( count( $this->settings['publish-languages'] ) > 1 ){
51
+ foreach ($this->settings['translation-languages'] as $language) {
52
+ if ($language != $TRP_LANGUAGE) {
53
+ // return the first language not default. only used for preview mode
54
+ return $language;
55
+ }
56
  }
57
  }
58
+ else{
59
+ return $TRP_LANGUAGE;
60
+ }
61
  }
62
  }else {
63
  return $TRP_LANGUAGE;
73
  * @return string Trimmed string.
74
  */
75
  public function full_trim( $word ) {
76
+ $word = str_replace( chr( 194 ) . chr( 160 ), ' ', $word );
77
  $word = trim($word," \t\n\r\0\x0B\xA0�" );
78
  if ( htmlentities( $word ) == "" || strip_tags( $word ) == "" || trim ($word, " \t\n\r\0\x0B\xA0�.,/`~!@#\$€£%^&*():;-_=+[]{}\\|?/<>1234567890'\"" ) == '' ){
79
  $word = '';
690
  }
691
  }
692
 
693
+
694
+ /**
695
+ * Add a filter on the wp_mail function so we allow shortcode usage and run it through our translate function so it cleans it up nice and maybe even replace some strings
696
+ * @param $args
697
+ * @return array
698
+ */
699
+ public function wp_mail_filter( $args ){
700
+ $trp_wp_mail = array(
701
+ 'to' => $args['to'],
702
+ 'subject' => $this->translate_page( do_shortcode( $args['subject'] ) ),
703
+ 'message' => $this->translate_page( do_shortcode( $args['message'] ) ),
704
+ 'headers' => $args['headers'],
705
+ 'attachments' => $args['attachments'],
706
+ );
707
+
708
+ return $trp_wp_mail;
709
+ }
710
+
711
  }
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, with full support for WooCommerce and site builders.
6
- Version: 1.0.4
7
  Author: Cozmoslabs, Razvan Mocanu, Madalin Ungureanu, Cristophor Hurduban
8
  Author URI: https://cozmoslabs.com/
9
  License: GPL2
3
  Plugin Name: TranslatePress - Multilingual
4
  Plugin URI: https://translatepress.com/
5
  Description: Experience a better way of translating your WordPress site, with full support for WooCommerce and site builders.
6
+ Version: 1.0.5
7
  Author: Cozmoslabs, Razvan Mocanu, Madalin Ungureanu, Cristophor Hurduban
8
  Author URI: https://cozmoslabs.com/
9
  License: GPL2
partials/translation-manager.php CHANGED
@@ -67,21 +67,20 @@
67
  <optgroup id="trp-gettext-strings-optgroup" label="<?php _e( 'Gettext strings', TRP_PLUGIN_SLUG ); ?>"></optgroup>
68
  </select>
69
  </div>
70
- <?php if( count( $trp_settings['translation-languages'] ) > 1 ) { ?>
71
- <div id="trp-next-previous">
72
- <button type="button" id="trp-previous" class="trp-next-previous-buttons"><span>&laquo;</span> <?php _e( 'Previous', TRP_PLUGIN_SLUG ); ?></button>
73
- <button type="button" id="trp-next" class="trp-next-previous-buttons"><?php _e( 'Next', TRP_PLUGIN_SLUG ); ?> <span>&raquo;</span></button>
74
- </div>
75
- <?php } ?>
76
  </div>
77
- <?php if( count( $trp_settings['translation-languages'] ) > 1 ) { ?>
78
- <br class="clear">
79
- <?php } ?>
80
  </div>
81
  <div class="trp-controls-section">
82
  <div id="trp-translation-section" class="trp-controls-section-content">
83
  <div id="trp-unsaved-changes-warning-message" style="display:none"><?php _e( 'You have unsaved changes!', TRP_PLUGIN_SLUG );?></div>
84
- <?php if ( count( $trp_settings['translation-languages'] ) > 1 ){ ?>
85
 
86
  <?php //original strings for gettext textarea ?>
87
  <div id="trp-gettext-original" class="trp-language-text trp-gettext-original-language" style="display:none">
@@ -111,11 +110,39 @@
111
  <div id="trp-hide-all-languages" class="trp-toggle-languages trp-toggle-languages-active"><span>&#11206; <?php echo $other_languages ?></span></div>
112
  <?php } ?>
113
  <?php }?>
114
- <?php } else{ ?>
115
- <div> <?php printf( __( 'No languages set for translation. Please select a translation language from <a href="%s">Settings->TranslatePress</a>', TRP_PLUGIN_SLUG ), admin_url( 'options-general.php?page=translate-press' ) );?></div>
116
- <?php }?>
117
  </div>
118
  </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
119
  </div>
120
  </div>
121
  <div id="trp-preview">
67
  <optgroup id="trp-gettext-strings-optgroup" label="<?php _e( 'Gettext strings', TRP_PLUGIN_SLUG ); ?>"></optgroup>
68
  </select>
69
  </div>
70
+
71
+ <div id="trp-next-previous">
72
+ <button type="button" id="trp-previous" class="trp-next-previous-buttons"><span>&laquo;</span> <?php _e( 'Previous', TRP_PLUGIN_SLUG ); ?></button>
73
+ <button type="button" id="trp-next" class="trp-next-previous-buttons"><?php _e( 'Next', TRP_PLUGIN_SLUG ); ?> <span>&raquo;</span></button>
74
+ </div>
75
+
76
  </div>
77
+ <br class="clear">
78
+
 
79
  </div>
80
  <div class="trp-controls-section">
81
  <div id="trp-translation-section" class="trp-controls-section-content">
82
  <div id="trp-unsaved-changes-warning-message" style="display:none"><?php _e( 'You have unsaved changes!', TRP_PLUGIN_SLUG );?></div>
83
+
84
 
85
  <?php //original strings for gettext textarea ?>
86
  <div id="trp-gettext-original" class="trp-language-text trp-gettext-original-language" style="display:none">
110
  <div id="trp-hide-all-languages" class="trp-toggle-languages trp-toggle-languages-active"><span>&#11206; <?php echo $other_languages ?></span></div>
111
  <?php } ?>
112
  <?php }?>
 
 
 
113
  </div>
114
  </div>
115
+
116
+
117
+ <?php if( count( $trp_settings['translation-languages'] ) == 1 ) { ?>
118
+ <div class="trp-controls-section">
119
+ <div id="trp-translation-section" class="trp-controls-section-content">
120
+ <p><?php printf( __( 'You can add a new language from <a href="%s">Settings->TranslatePress</a>', TRP_PLUGIN_SLUG ), admin_url( 'options-general.php?page=translate-press' ) );?></p>
121
+ <p><?php _e( 'However, you can still use TranslatePress to <strong style="background: #f5fb9d;">modify gettext strings</strong> available in your page.', TRP_PLUGIN_SLUG );?></p>
122
+ <p><?php _e( 'Strings that are user created can\'t be modified, only those from themes and plugins.', TRP_PLUGIN_SLUG );?></p>
123
+ </div>
124
+ </div>
125
+ <?php } ?>
126
+ <?php
127
+ // upsell to PRO from Translation Editor.
128
+ include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
129
+ if ( !( is_plugin_active('tp-add-on-extra-languages/index.php') || is_plugin_active('tp-add-on-seo-pack/index.php') ) ) :
130
+ ?>
131
+ <div class="trp-controls-section wp-core-ui">
132
+ <div id="trp-upsell-section" class="trp-controls-section-content">
133
+ <h3><?php _e('Your Website <br/> Multiple Languages', TRP_PLUGIN_SLUG ); ?></h3>
134
+ <ul>
135
+ <li><?php _e('Support for 221 Languages', TRP_PLUGIN_SLUG ); ?></li>
136
+ <li><?php _e('Publish languages when the translation is done', TRP_PLUGIN_SLUG ); ?></li>
137
+ <li><?php _e('Translate SEO Title and Description', TRP_PLUGIN_SLUG ); ?></li>
138
+ <li><?php _e('Translate SEO Slug', TRP_PLUGIN_SLUG ); ?></li>
139
+ <li><?php _e('Translate Facebook Tags', TRP_PLUGIN_SLUG ); ?></li>
140
+ </ul>
141
+ <p><span style="background: #f5fb9d;"><?php _e('Supported By Real People', TRP_PLUGIN_SLUG ); ?></span></p>
142
+ <p><a class="button-primary" target="_blank" href="https://translatepress.com/pricing/?utm_source=wpbackend&utm_medium=clientsite&utm_content=tpeditor&utm_campaign=tpfree"><?php _e('Learn More', TRP_PLUGIN_SLUG ); ?></a></p>
143
+ </div>
144
+ </div>
145
+ <?php endif; ?>
146
  </div>
147
  </div>
148
  <div id="trp-preview">
readme.txt CHANGED
@@ -4,7 +4,7 @@ Donate link: https://www.cozmoslabs.com/
4
  Tags: translate, translation, multilingual, automatic translation, front-end translation, google translate, bilingual
5
  Requires at least: 3.1.0
6
  Tested up to: 4.8.2
7
- Stable tag: 1.0.4
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
@@ -29,6 +29,7 @@ Built the WordPress way, TranslatePress - Multilingual is a GPL and self hosted
29
  * Place language switchers anywhere using shortcode **[language-switcher]**, WP menu item or as a floating dropdown.
30
  * Editorial control allowing you to publish your language only when all your translations are done
31
  * Conditional display content shortcode based on language [trp_language language="en_EN"] English content only [/trp_language]
 
32
 
33
  Note: this plugin uses the Google Translation API to translate the strings on your site. This feature can be enabled or disabled according to your preferences.
34
 
@@ -106,6 +107,12 @@ For more information please check out [TranslatePress documentation](https://tra
106
 
107
  == Changelog ==
108
 
 
 
 
 
 
 
109
  = 1.0.4 =
110
  * Fixed issues with the pencil select icon in the translation editor not showing up in certain cases on the button element
111
  * Fixed issues with the pencil select icon in the translation editor not showing up in certain cases because of overflow hidden
4
  Tags: translate, translation, multilingual, automatic translation, front-end translation, google translate, bilingual
5
  Requires at least: 3.1.0
6
  Tested up to: 4.8.2
7
+ Stable tag: 1.0.5
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
29
  * Place language switchers anywhere using shortcode **[language-switcher]**, WP menu item or as a floating dropdown.
30
  * Editorial control allowing you to publish your language only when all your translations are done
31
  * Conditional display content shortcode based on language [trp_language language="en_EN"] English content only [/trp_language]
32
+ * Possibility to edit gettext strings from themes and plugins from english to english, without adding another language. Basically a string-replace functionality.
33
 
34
  Note: this plugin uses the Google Translation API to translate the strings on your site. This feature can be enabled or disabled according to your preferences.
35
 
107
 
108
  == Changelog ==
109
 
110
+ = 1.0.5 =
111
+ * Added possibility to edit gettext strings from themes and plugins from english to english, without adding another language. Basically, string-replace functionality.
112
+ * We now can translate text input placeholders
113
+ * We have a way of translating emails using the conditional language shortcode [trp_language language="en_US"] English only content [/trp_language]
114
+ * Fixed issues with some elements that contained new lines and \u00a0 at the start of the strings
115
+
116
  = 1.0.4 =
117
  * Fixed issues with the pencil select icon in the translation editor not showing up in certain cases on the button element
118
  * Fixed issues with the pencil select icon in the translation editor not showing up in certain cases because of overflow hidden