TranslatePress – Translate Multilingual sites - Version 1.0.1

Version Description

  • Fixed incorrect blog prefix name for Multisite subsites on admin_bar gettext hook.
  • Fixed Translate Page admin bar button sometimes not having the correct url for entering TP Editor Mode
  • Skipped dynamic strings that have only numbers and special characters.
  • Fixed order of categories in Editor dropdown. (Meta Information, String List..)
  • Fixed JS error Uncaught Error: Syntax error, unrecognized expression
Download this release

Release Info

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

Code changes from version 1.0.0 to 1.0.1

assets/js/trp-editor-script.js CHANGED
@@ -335,34 +335,6 @@ function TRP_Editor(){
335
  }
336
  };
337
 
338
- /**
339
- * Function that changes the value of a GET parameter
340
- * @param link the url in which we make the change
341
- * @param name the name of the parameter we want to change
342
- * @param value the new value
343
- * @returns {*}
344
- */
345
- this.set_url_param = function( link, name, value ){
346
- if( typeof link == 'undefined' )
347
- return;
348
-
349
- /* check if wh have any get parameters */
350
- if( link.search( "\\?" ) === -1 ){
351
- link = link + '?'+ name + '=' + value;
352
- }
353
- else{
354
- /* check to see if the parameter is already there */
355
- thisParamValue = wppbGetUrlParam( name, link );
356
- if( thisParamValue !== null ){
357
- link = link.replace( name+'='+thisParamValue, name+'='+value );
358
- }
359
- else{
360
- link = link + '&'+ name + '=' + value;
361
- }
362
- }
363
- return link;
364
- };
365
-
366
  /**
367
  * Resizing preview window.
368
  *
@@ -452,8 +424,8 @@ function TRP_Editor(){
452
  */
453
  function format_option(option){
454
  option = jQuery(
455
- '<div>' + option.text + '</div><div class="string-selector-description">' + option.title + '</div>'
456
- );
457
  return option;
458
  }
459
 
@@ -561,6 +533,8 @@ function TRP_Dictionary( language_code ){
561
  */
562
  this.get_categories = function (){
563
  var categorized = [];
 
 
564
  for ( var i in _this.strings ){
565
  if ( categorized[ _this.strings[i].node_type ] == undefined ) {
566
  categorized[ _this.strings[i].node_type ] = [];
@@ -787,7 +761,7 @@ function TRP_Lister( current_dictionary ) {
787
  this.reload_list = function (){
788
  category_array = dictionary.get_categories();
789
  jQuery( "#trp-gettext-strings-optgroup", jquery_string_selector ).prevAll(":not(.default-option)").remove();
790
- /* add the normal strings before the trp-gettext-strings-optgroup optiongroup so it doesn't matter which ajax finishes first */
791
  for ( var category in category_array ){
792
  jQuery( "#trp-gettext-strings-optgroup", jquery_string_selector ).before( jQuery( '<optgroup></optgroup>' ).attr( 'label', _this.format_category_name( category ) ) );
793
  for ( var i in category_array[category] ) {
@@ -1053,7 +1027,7 @@ var gettext_dictionaries = null;
1053
  jQuery(function(){
1054
  /* initial load and populate the dropdown with gettext strings */
1055
  jQuery( "#trp-preview-iframe" ).load(function(){
1056
- /* get the gettext texts ids from the page and pass them to a ajax call to construct the dictonaries */
1057
  var gettext_strings = jQuery( '#trp-preview-iframe').contents().find( '[data-trpgettextoriginal]' );
1058
  gettext_string_ids = [];
1059
  gettext_strings.each( function(){
335
  }
336
  };
337
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
338
  /**
339
  * Resizing preview window.
340
  *
424
  */
425
  function format_option(option){
426
  option = jQuery(
427
+ '<div>' + option.text + '</div><div class="string-selector-description">' + option.title + '</div>'
428
+ );
429
  return option;
430
  }
431
 
533
  */
534
  this.get_categories = function (){
535
  var categorized = [];
536
+ categorized[ 'Meta Information' ] = [];
537
+ categorized[ 'String List' ] = [];
538
  for ( var i in _this.strings ){
539
  if ( categorized[ _this.strings[i].node_type ] == undefined ) {
540
  categorized[ _this.strings[i].node_type ] = [];
761
  this.reload_list = function (){
762
  category_array = dictionary.get_categories();
763
  jQuery( "#trp-gettext-strings-optgroup", jquery_string_selector ).prevAll(":not(.default-option)").remove();
764
+ /* add the normal strings before the trp-gettext-strings-optgroup optiongroup so it doesn't matter which ajax finishes first */
765
  for ( var category in category_array ){
766
  jQuery( "#trp-gettext-strings-optgroup", jquery_string_selector ).before( jQuery( '<optgroup></optgroup>' ).attr( 'label', _this.format_category_name( category ) ) );
767
  for ( var i in category_array[category] ) {
1027
  jQuery(function(){
1028
  /* initial load and populate the dropdown with gettext strings */
1029
  jQuery( "#trp-preview-iframe" ).load(function(){
1030
+ /* get the gettext texts ids from the page and pass them to a ajax call to construct the dictonaries */
1031
  var gettext_strings = jQuery( '#trp-preview-iframe').contents().find( '[data-trpgettextoriginal]' );
1032
  gettext_string_ids = [];
1033
  gettext_strings.each( function(){
assets/js/trp-iframe-preview-script.js CHANGED
@@ -9,16 +9,18 @@ function TRP_Iframe_Preview(){
9
  * Add GET preview parameter for links and forms.
10
  */
11
  this.initialize = function() {
12
- jQuery('a').each(function () {
13
- if (this.action != '' && this.href.indexOf('void(0)') === -1 ) {
14
- if ( is_link_previewable ( this ) ) {
15
- this.href = update_query_string('trp-edit-translation', 'preview', this.href);
16
- }else {
17
- jQuery( this ).on( 'click',
18
- function(event) {
19
- event.preventDefault();
20
- }
21
- );
 
 
22
  }
23
  }
24
  });
9
  * Add GET preview parameter for links and forms.
10
  */
11
  this.initialize = function() {
12
+ jQuery('a').each(function () {
13
+ if( typeof this.href != "undefined" && this.href != '' ) {
14
+ if (this.action != '' && this.href.indexOf('void(0)') === -1) {
15
+ if (is_link_previewable(this) && !this.getAttribute('href').startsWith('#')) {
16
+ this.href = update_query_string('trp-edit-translation', 'preview', this.getAttribute('href'));
17
+ } else {
18
+ jQuery(this).on('click',
19
+ function (event) {
20
+ event.preventDefault();
21
+ }
22
+ );
23
+ }
24
  }
25
  }
26
  });
assets/js/trp-translate-dom-changes.js CHANGED
@@ -10,6 +10,7 @@ function TRP_Translator(){
10
  var ajax_url = trp_data.trp_ajax_url;
11
  var wp_ajax_url = trp_data.trp_wp_ajax_url;
12
  var language_to_query;
 
13
 
14
  /**
15
  * Ajax request to get translations for strings
@@ -90,7 +91,7 @@ function TRP_Translator(){
90
  var strings = [];
91
  mutations.forEach( function (mutation) {
92
  for (var i = 0; i < mutation.addedNodes.length; i++) {
93
- if ( mutation.addedNodes[i].innerText && mutation.addedNodes[i].innerText.trim() != '' ) {
94
  var node = jQuery( mutation.addedNodes[i] );
95
  var attribute = node.attr( 'data-no-translation' );
96
  if ( (typeof attribute !== typeof undefined && attribute !== false) || node.parents( '[data-no-translation]').length > 0 ){
@@ -99,7 +100,7 @@ function TRP_Translator(){
99
 
100
  /* if it is an anchor add the trp-edit-translation=preview parameter to it */
101
  if ( typeof parent.trpEditor !== 'undefined' ) {
102
- jQuery(mutation.addedNodes[i]).find('a').context.href = parent.trpEditor.set_url_param( jQuery(mutation.addedNodes[i]).find('a').context.href, 'trp-edit-translation', 'preview' );
103
  }
104
 
105
  var all_nodes = jQuery( mutation.addedNodes[i]).find( '*').addBack();
@@ -113,8 +114,10 @@ function TRP_Translator(){
113
  }
114
  var all_strings_length = all_strings.length;
115
  for (var j = 0; j < all_strings_length; j++ ) {
116
- strings.push({node: all_strings[j], original: all_strings[j].textContent});
117
- all_strings[j].textContent = '';
 
 
118
  }
119
  }
120
  }
@@ -125,11 +128,48 @@ function TRP_Translator(){
125
  }
126
  };
127
 
128
- //function that cleans the gettext wrappers
129
  this.cleanup_gettext_wrapper = function(){
130
  jQuery('trp-gettext').contents().unwrap();
131
  };
132
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
133
  /**
134
  * Initialize and configure observer.
135
  */
@@ -176,6 +216,70 @@ function TRP_Translator(){
176
  active = false;
177
  };
178
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
179
  _this.initialize();
180
  }
181
 
10
  var ajax_url = trp_data.trp_ajax_url;
11
  var wp_ajax_url = trp_data.trp_wp_ajax_url;
12
  var language_to_query;
13
+ var except_characters = " \t\n\r  �.,/`~!@#$€£%^&*():;-_=+[]{}\\|?/<>1234567890'";
14
 
15
  /**
16
  * Ajax request to get translations for strings
91
  var strings = [];
92
  mutations.forEach( function (mutation) {
93
  for (var i = 0; i < mutation.addedNodes.length; i++) {
94
+ if ( mutation.addedNodes[i].innerText && _this.trim( mutation.addedNodes[i].innerText.trim(), except_characters ) != '' ) {
95
  var node = jQuery( mutation.addedNodes[i] );
96
  var attribute = node.attr( 'data-no-translation' );
97
  if ( (typeof attribute !== typeof undefined && attribute !== false) || node.parents( '[data-no-translation]').length > 0 ){
100
 
101
  /* if it is an anchor add the trp-edit-translation=preview parameter to it */
102
  if ( typeof parent.trpEditor !== 'undefined' ) {
103
+ jQuery(mutation.addedNodes[i]).find('a').context.href = _this.update_query_string('trp-edit-translation', 'preview', jQuery(mutation.addedNodes[i]).find('a').context.href);
104
  }
105
 
106
  var all_nodes = jQuery( mutation.addedNodes[i]).find( '*').addBack();
114
  }
115
  var all_strings_length = all_strings.length;
116
  for (var j = 0; j < all_strings_length; j++ ) {
117
+ if ( _this.trim( all_strings[j].textContent, except_characters ) != '' ) {
118
+ strings.push({node: all_strings[j], original: all_strings[j].textContent});
119
+ all_strings[j].textContent = '';
120
+ }
121
  }
122
  }
123
  }
128
  }
129
  };
130
 
131
+ //function that cleans the gettext wrappers
132
  this.cleanup_gettext_wrapper = function(){
133
  jQuery('trp-gettext').contents().unwrap();
134
  };
135
 
136
+ /**
137
+ * Update url with query string.
138
+ *
139
+ */
140
+ this.update_query_string = function(key, value, url) {
141
+ if (!url) return url;
142
+ if ( url.startsWith('#') ){
143
+ return url;
144
+ }
145
+ var re = new RegExp("([?&])" + key + "=.*?(&|#|$)(.*)", "gi"),
146
+ hash;
147
+
148
+ if (re.test(url)) {
149
+ if (typeof value !== 'undefined' && value !== null)
150
+ return url.replace(re, '$1' + key + "=" + value + '$2$3');
151
+ else {
152
+ hash = url.split('#');
153
+ url = hash[0].replace(re, '$1$3').replace(/(&|\?)$/, '');
154
+ if (typeof hash[1] !== 'undefined' && hash[1] !== null)
155
+ url += '#' + hash[1];
156
+ return url;
157
+ }
158
+ }
159
+ else {
160
+ if (typeof value !== 'undefined' && value !== null ) {
161
+ var separator = url.indexOf('?') !== -1 ? '&' : '?';
162
+ hash = url.split('#');
163
+ url = hash[0] + separator + key + '=' + value;
164
+ if (typeof hash[1] !== 'undefined' && hash[1] !== null)
165
+ url += '#' + hash[1];
166
+ return url;
167
+ }
168
+ else
169
+ return url;
170
+ }
171
+ };
172
+
173
  /**
174
  * Initialize and configure observer.
175
  */
216
  active = false;
217
  };
218
 
219
+ this.trim = function (str, charlist) {
220
+ // discuss at: http://locutus.io/php/trim/
221
+ // original by: Kevin van Zonneveld (http://kvz.io)
222
+ // improved by: mdsjack (http://www.mdsjack.bo.it)
223
+ // improved by: Alexander Ermolaev (http://snippets.dzone.com/user/AlexanderErmolaev)
224
+ // improved by: Kevin van Zonneveld (http://kvz.io)
225
+ // improved by: Steven Levithan (http://blog.stevenlevithan.com)
226
+ // improved by: Jack
227
+ // input by: Erkekjetter
228
+ // input by: DxGx
229
+ // bugfixed by: Onno Marsman (https://twitter.com/onnomarsman)
230
+ // example 1: trim(' Kevin van Zonneveld ')
231
+ // returns 1: 'Kevin van Zonneveld'
232
+ // example 2: trim('Hello World', 'Hdle')
233
+ // returns 2: 'o Wor'
234
+ // example 3: trim(16, 1)
235
+ // returns 3: '6'
236
+ var whitespace = [
237
+ ' ',
238
+ '\n',
239
+ '\r',
240
+ '\t',
241
+ '\f',
242
+ '\x0b',
243
+ '\xa0',
244
+ '\u2000',
245
+ '\u2001',
246
+ '\u2002',
247
+ '\u2003',
248
+ '\u2004',
249
+ '\u2005',
250
+ '\u2006',
251
+ '\u2007',
252
+ '\u2008',
253
+ '\u2009',
254
+ '\u200a',
255
+ '\u200b',
256
+ '\u2028',
257
+ '\u2029',
258
+ '\u3000'
259
+ ].join('');
260
+ var l = 0;
261
+ var i = 0;
262
+ str += '';
263
+ if (charlist) {
264
+ whitespace += (charlist + '').replace(/([[\]().?/*{}+$^:])/g, '$1');
265
+ }
266
+ l = str.length;
267
+ for (i = 0; i < l; i++) {
268
+ if (whitespace.indexOf(str.charAt(i)) === -1) {
269
+ str = str.substring(i);
270
+ break;
271
+ }
272
+ }
273
+ l = str.length;
274
+ for (i = l - 1; i >= 0; i--) {
275
+ if (whitespace.indexOf(str.charAt(i)) === -1) {
276
+ str = str.substring(0, i + 1);
277
+ break;
278
+ }
279
+ }
280
+ return whitespace.indexOf(str.charAt(0)) === -1 ? str : '';
281
+ };
282
+
283
  _this.initialize();
284
  }
285
 
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.0-beta' );
43
 
44
  $this->load_dependencies();
45
  $this->initialize_components();
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.1' );
43
 
44
  $this->load_dependencies();
45
  $this->initialize_components();
includes/class-query.php CHANGED
@@ -336,8 +336,8 @@ class TRP_Query{
336
  }
337
 
338
  protected function get_gettext_table_name( $language_code ){
339
-
340
- return $this->db->prefix . 'trp_gettext_' . strtolower( $language_code );
341
  }
342
 
343
  /**
336
  }
337
 
338
  protected function get_gettext_table_name( $language_code ){
339
+ global $wpdb;
340
+ return $wpdb->get_blog_prefix() . 'trp_gettext_' . strtolower( $language_code );
341
  }
342
 
343
  /**
includes/class-translation-manager.php CHANGED
@@ -405,20 +405,14 @@ class TRP_Translation_Manager{
405
  $title = __( 'Translate Site', TRP_PLUGIN_SLUG );
406
  $url_target = '_blank';
407
  } else {
408
- global $post;
409
 
410
- if( is_object( $post ) && ! is_archive() && ! is_home() && !is_front_page() && ! is_search() ) {
411
- $url = get_permalink( $post );
412
- } else {
413
- if( ! $this->url_converter ) {
414
- $trp = TRP_Translate_Press::get_trp_instance();
415
- $this->url_converter = $trp->get_component( 'url_converter' );
416
- }
417
-
418
- $url = $this->url_converter->cur_page_url();
419
- }
420
 
421
- $url = add_query_arg( 'trp-edit-translation', 'true', $url );
 
422
 
423
  $title = __( 'Translate Page', TRP_PLUGIN_SLUG );
424
  $url_target = '';
405
  $title = __( 'Translate Site', TRP_PLUGIN_SLUG );
406
  $url_target = '_blank';
407
  } else {
 
408
 
409
+ if( ! $this->url_converter ) {
410
+ $trp = TRP_Translate_Press::get_trp_instance();
411
+ $this->url_converter = $trp->get_component( 'url_converter' );
412
+ }
 
 
 
 
 
 
413
 
414
+ $url = $this->url_converter->cur_page_url();
415
+ $url = add_query_arg( 'trp-edit-translation', 'true', $url );
416
 
417
  $title = __( 'Translate Page', TRP_PLUGIN_SLUG );
418
  $url_target = '';
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.0
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.1
7
  Author: Cozmoslabs, Razvan Mocanu, Madalin Ungureanu, Cristophor Hurduban
8
  Author URI: https://cozmoslabs.com/
9
  License: GPL2
partials/main-settings-page.php CHANGED
@@ -72,7 +72,7 @@
72
  <option value="yes" <?php selected( $this->settings['g-translate'], 'yes' ); ?>><?php _e( 'Yes', TRP_PLUGIN_SLUG) ?></option>
73
  </select>
74
  <p class="description">
75
- <?php _e( 'Enable or disable the automatic translation of the site with Google Translate. Existing translations will be not be affected.<br>Note: Not all languages support automatic translation. Please consult the <a href="https://cloud.google.com/translate/docs/languages" target="_blank" title="Automatic translation supported languages.">supported languages list</a>. ', TRP_PLUGIN_SLUG ); ?>
76
  </p>
77
  </td>
78
  </tr>
72
  <option value="yes" <?php selected( $this->settings['g-translate'], 'yes' ); ?>><?php _e( 'Yes', TRP_PLUGIN_SLUG) ?></option>
73
  </select>
74
  <p class="description">
75
+ <?php _e( 'Enable or disable the automatic translation of the site with Google Translate. Only untranslated strings will receive a translation.<br>You can later edit these automatic translations.<br>Note: Not all languages support automatic translation. Please consult the <a href="https://cloud.google.com/translate/docs/languages" target="_blank" title="Automatic translation supported languages.">supported languages list</a>. ', TRP_PLUGIN_SLUG ); ?>
76
  </p>
77
  </td>
78
  </tr>
readme.txt CHANGED
@@ -1,45 +1,51 @@
1
- === TranslatePress - Multilingual ===
2
  Contributors: cozmoslabs, razvan.mo, madalin.ungureanu, cristophor
3
  Donate link: https://www.cozmoslabs.com/
4
- Tags: translate, translation, automatic translation, front-end translation, multilingual
5
  Requires at least: 3.1.0
6
- Tested up to: 4.8.1
7
- Stable tag: 1.0.0
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
11
- Experience a better way of translating your WordPress site, with full support for WooCommerce and site builders.
12
 
13
  == Description ==
14
 
15
- **A WordPress Translation Plugin that anyone can use.**
16
 
17
- **Like this plugin?** Consider leaving a [5 star review](https://wordpress.org/support/view/plugin-reviews/translatepress?filter=5).
18
 
19
- It offers a simpler way to translate WordPress sites, with full support for WooCommerce and site builders.
20
- Built the WordPress way, TranslatePress is a GPL and self hosted plugin, meaning you'll own all your translations, forever.
 
 
 
 
 
 
 
 
 
21
 
22
- Translate your website directly from the front-end, in a friendly user interface.
23
- Live preview of your translated pages, as you edit your translations.
24
- Set up Automatic Translation using your own Google API key.
25
  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.
26
- Place language switchers anywhere using shortcode **[language-switcher]**, WP menu item or as a floating dropdown.
27
 
28
- Users with administrator rights have access to the following features:
29
 
30
- * select Default language of the website and one Translation language.
31
  * choose whether language switcher should display languages in their native names or English name
32
  * force custom links to open in current language
33
  * enable or disable url subdirectory for the default language
 
34
 
35
  = Powerful Add-ons =
36
 
37
- Paid Member Subscriptions has a range of premium [Add-ons](https://translatepress.com/?utm_source=wp.org&utm_medium=tp-description-page&utm_campaign=TPFree) that allow you to extend the power of the translation plugin:
38
 
39
  **Pro Add-ons** (available in the [PRO version](https://translatepress.com/?utm_source=wp.org&utm_medium=tp-description-page&utm_campaign=TPFree) only)
40
 
41
- * [Extra Languages](https://translatepress.com/?utm_source=wp.org&utm_medium=tp-description-page&utm_campaign=TPFree) - allows an unlimited number of translation languages, with the possibility to publish languages later after you complete the translation
42
- * [SEO Pack](https://translatepress.com/?utm_source=wp.org&utm_medium=tp-description-page&utm_campaign=TPFree) - allows translation of meta information, including page title and url slug, for search engine optimization
43
 
44
 
45
  = Website =
@@ -54,6 +60,10 @@ Paid Member Subscriptions has a range of premium [Add-ons](https://translatepres
54
 
55
  [Add-ons](https://translatepress.com/docs/translatepress/?utm_source=wp.org&utm_medium=tp-description-page&utm_campaign=TPFree)
56
 
 
 
 
 
57
  == Installation ==
58
 
59
  1. Upload the translatepress folder to the '/wp-content/plugins/' directory
@@ -67,20 +77,39 @@ Paid Member Subscriptions has a range of premium [Add-ons](https://translatepres
67
 
68
  All the translation are stored locally in your server's database.
69
 
 
 
 
 
 
 
 
 
 
 
 
 
70
  = Where can I find out more information? =
71
 
72
  For more information please check out [TranslatePress documentation](https://translatepress.com/docs/translatepress/?utm_source=wp.org&utm_medium=tp-description-page&utm_campaign=TPFree).
73
 
74
 
75
  == Screenshots ==
76
- 1. Frontend translation editor: screenshot-1.png
77
- 2. Frontend translation editor of a gettext string: screenshot-2.png
78
- 3. Frontend translation editor of the Woocommerce shop page: screenshot-3.png
79
- 4. Settings Page: screenshot-4.png
80
- 5. Floating Language Switcher: screenshot-5.png
81
- 6. Menu Language Switcher: screenshot-6.png
82
 
83
  == Changelog ==
84
 
 
 
 
 
 
 
 
85
  = 1.0.0 =
86
  * Initial release.
1
+ === TranslatePress - Translate Multilingual sites ===
2
  Contributors: cozmoslabs, razvan.mo, madalin.ungureanu, cristophor
3
  Donate link: https://www.cozmoslabs.com/
4
+ Tags: translate, translation, multilingual, automatic translation, front-end translation, google translate
5
  Requires at least: 3.1.0
6
+ Tested up to: 4.8.2
7
+ Stable tag: 1.0.1
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
11
+ Easily translate your entire site and go multilingual, with full support for WooCommerce, complex themes and site builders. Integrates with Google Translate.
12
 
13
  == Description ==
14
 
15
+ **Experience a better way to translate your WordPress site and go multilingual, directly from the front-end using a friendly user interface.**
16
 
17
+ The interface allows you to translate the entire page at once, including output from shortcodes, forms and page builders. It also works out of the box with WooCommerce.
18
 
19
+ Built the WordPress way, TranslatePress - Multilingual is a GPL and self hosted plugin, meaning you'll own all your translations, forever.
20
+
21
+ = Multilingual Features =
22
+
23
+ * Translate all your website content directly from the front-end, in a friendly user interface.
24
+ * Live preview of your translated pages, as you edit your translations.
25
+ * Support for both manual and automatic translation (via Google Translate)
26
+ * Ability to translate dynamic strings (gettext) added by WordPress, plugins and themes.
27
+ * Integrates with Google Translate, allowing you to set up Automatic Translation using your own Google API key.
28
+ * Place language switchers anywhere using shortcode **[language-switcher]**, WP menu item or as a floating dropdown.
29
+ * Editorial control allowing you to publish your language only when all your translations are done
30
 
 
 
 
31
  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.
 
32
 
33
+ Users with administrator rights have access to the following translate settings:
34
 
35
+ * select default language of the website and one translation language.
36
  * choose whether language switcher should display languages in their native names or English name
37
  * force custom links to open in current language
38
  * enable or disable url subdirectory for the default language
39
+ * enable automatic translation via Google Translate
40
 
41
  = Powerful Add-ons =
42
 
43
+ TranslatePress - Multilingual has a range of premium [Add-ons](https://translatepress.com/?utm_source=wp.org&utm_medium=tp-description-page&utm_campaign=TPFree) that allow you to extend the power of the translation plugin:
44
 
45
  **Pro Add-ons** (available in the [PRO version](https://translatepress.com/?utm_source=wp.org&utm_medium=tp-description-page&utm_campaign=TPFree) only)
46
 
47
+ * [Extra Languages](https://translatepress.com/?utm_source=wp.org&utm_medium=tp-description-page&utm_campaign=TPFree) - allows you to add an unlimited number of translation languages, with the possibility to publish languages later after you complete the translation
48
+ * [SEO Pack](https://translatepress.com/?utm_source=wp.org&utm_medium=tp-description-page&utm_campaign=TPFree) - allows you to translate meta information (like page title, description, url slug, image alt tag, Twitter and Facebook Social Graph tags & more) for boosting your website's SEO and increase traffic
49
 
50
 
51
  = Website =
60
 
61
  [Add-ons](https://translatepress.com/docs/translatepress/?utm_source=wp.org&utm_medium=tp-description-page&utm_campaign=TPFree)
62
 
63
+ = Demo Site =
64
+
65
+ You can test out TranslatePress - Multilingual by [visiting our demo site](https://demo.translatepress.com/)
66
+
67
  == Installation ==
68
 
69
  1. Upload the translatepress folder to the '/wp-content/plugins/' directory
77
 
78
  All the translation are stored locally in your server's database.
79
 
80
+ = What types of content can I translate? =
81
+
82
+ TranslatePress - Multilingual works out of the box with WooCommerce, custom post types, complex themes and site builders, so you'll be able to translate any type of content.
83
+
84
+ = How is it different from other multilingual plugins? =
85
+
86
+ TranslatePress is easier to use and more intuitive altogether. No more switching between the editor, string translation interfaces or badly translated plugins. You can now translate the full page content directly from the front-end.
87
+
88
+ = How do I start to translate my site? =
89
+
90
+ After installing the plugin, select your secondary language and click "Translate Site" to start translating your entire site exactly as it looks in the front-end.
91
+
92
  = Where can I find out more information? =
93
 
94
  For more information please check out [TranslatePress documentation](https://translatepress.com/docs/translatepress/?utm_source=wp.org&utm_medium=tp-description-page&utm_campaign=TPFree).
95
 
96
 
97
  == Screenshots ==
98
+ 1. Front-end translation editor used to translate the entire page content
99
+ 2. How to translate a Dynamic String (gettext) using TranslatePress - Multilingual
100
+ 3. Translate Woocommerce Shop Page
101
+ 4. Settings Page for TranslatePress - Multilingual
102
+ 5. Floating Language Switcher added by TranslatePress - Multilingual
103
+ 6. Menu Language Switcher
104
 
105
  == Changelog ==
106
 
107
+ = 1.0.1 =
108
+ * Fixed incorrect blog prefix name for Multisite subsites on admin_bar gettext hook.
109
+ * Fixed Translate Page admin bar button sometimes not having the correct url for entering TP Editor Mode
110
+ * Skipped dynamic strings that have only numbers and special characters.
111
+ * Fixed order of categories in Editor dropdown. (Meta Information, String List..)
112
+ * Fixed JS error Uncaught Error: Syntax error, unrecognized expression
113
+
114
  = 1.0.0 =
115
  * Initial release.