WooCommerce Multilingual – run WooCommerce with WPML - Version 3.8.1

Version Description

  • Fixed one compatibility issue with WooCommerce Ajax Cart: cart quantities were not updating
  • Fixed one compatibility issue with WooCommerce Bookings: incorrect bookings were shown in the backend when toggling between admin languages
  • Fixed one compatibility issue with the Adventure Tours theme
  • Fixed one compatibility issue with the Aurum theme
  • Fixed compatibility issues with the Composite Products plugin
  • Bug fix: auto-generated slugs on the products translation editor were not made unique
  • Bug fix: sometimes prices with decimals were subtracted 0.01
  • Made translation controls on the WooCommerce products page disabled by default
  • Optimized autoloading of PHP classes for better performance
Download this release

Release Info

Developer mihaimihai
Plugin Icon 128x128 WooCommerce Multilingual – run WooCommerce with WPML
Version 3.8.1
Comparing to
See all releases

Code changes from version 3.8.0 to 3.8.1

Files changed (138) hide show
  1. compatibility/class-wcml-adventure-tours.php +5 -1
  2. compatibility/class-wcml-aurum.php +17 -0
  3. compatibility/class-wcml-bookings.php +21 -9
  4. compatibility/class-wcml-composite-products.php +69 -65
  5. compatibility/class-wcml-wc-ajax-cart.php +16 -0
  6. compatibility/res/js/wcml-bookings.js +32 -26
  7. compatibility/res/js/wcml-composite.js +32 -0
  8. embedded/autoload.php +7 -0
  9. embedded/autoload_52.php +7 -0
  10. embedded/composer/ClassLoader.php +413 -0
  11. embedded/composer/ClassLoader52.php +271 -0
  12. embedded/composer/LICENSE +21 -0
  13. embedded/composer/autoload_classmap.php +120 -0
  14. embedded/composer/autoload_namespaces.php +10 -0
  15. embedded/composer/autoload_psr4.php +10 -0
  16. embedded/composer/autoload_real.php +45 -0
  17. embedded/composer/autoload_real_52.php +44 -0
  18. embedded/composer/installed.json +186 -0
  19. embedded/composer/installers/.editorconfig +10 -0
  20. embedded/composer/installers/.travis.yml +21 -0
  21. embedded/composer/installers/LICENSE +19 -0
  22. embedded/composer/installers/README.md +210 -0
  23. embedded/composer/installers/composer.json +85 -0
  24. embedded/composer/installers/phpunit.xml.dist +25 -0
  25. embedded/composer/installers/src/Composer/Installers/AglInstaller.php +21 -0
  26. embedded/composer/installers/src/Composer/Installers/AimeosInstaller.php +9 -0
  27. embedded/composer/installers/src/Composer/Installers/AnnotateCmsInstaller.php +11 -0
  28. embedded/composer/installers/src/Composer/Installers/AsgardInstaller.php +45 -0
  29. embedded/composer/installers/src/Composer/Installers/BaseInstaller.php +136 -0
  30. embedded/composer/installers/src/Composer/Installers/BitrixInstaller.php +123 -0
  31. embedded/composer/installers/src/Composer/Installers/BonefishInstaller.php +9 -0
  32. embedded/composer/installers/src/Composer/Installers/CakePHPInstaller.php +84 -0
  33. embedded/composer/installers/src/Composer/Installers/ChefInstaller.php +11 -0
  34. embedded/composer/installers/src/Composer/Installers/ClanCatsFrameworkInstaller.php +10 -0
  35. embedded/composer/installers/src/Composer/Installers/CodeIgniterInstaller.php +11 -0
  36. embedded/composer/installers/src/Composer/Installers/Concrete5Installer.php +12 -0
  37. embedded/composer/installers/src/Composer/Installers/CraftInstaller.php +35 -0
  38. embedded/composer/installers/src/Composer/Installers/CroogoInstaller.php +21 -0
  39. embedded/composer/installers/src/Composer/Installers/DokuWikiInstaller.php +50 -0
  40. embedded/composer/installers/src/Composer/Installers/DolibarrInstaller.php +16 -0
  41. embedded/composer/installers/src/Composer/Installers/DrupalInstaller.php +16 -0
  42. embedded/composer/installers/src/Composer/Installers/ElggInstaller.php +9 -0
  43. embedded/composer/installers/src/Composer/Installers/FuelInstaller.php +11 -0
  44. embedded/composer/installers/src/Composer/Installers/FuelphpInstaller.php +9 -0
  45. embedded/composer/installers/src/Composer/Installers/GravInstaller.php +30 -0
  46. embedded/composer/installers/src/Composer/Installers/HuradInstaller.php +25 -0
  47. embedded/composer/installers/src/Composer/Installers/ImageCMSInstaller.php +11 -0
  48. embedded/composer/installers/src/Composer/Installers/Installer.php +178 -0
  49. embedded/composer/installers/src/Composer/Installers/JoomlaInstaller.php +15 -0
  50. embedded/composer/installers/src/Composer/Installers/KirbyInstaller.php +11 -0
  51. embedded/composer/installers/src/Composer/Installers/KodiCMSInstaller.php +10 -0
  52. embedded/composer/installers/src/Composer/Installers/KohanaInstaller.php +9 -0
  53. embedded/composer/installers/src/Composer/Installers/LaravelInstaller.php +9 -0
  54. embedded/composer/installers/src/Composer/Installers/LithiumInstaller.php +10 -0
  55. embedded/composer/installers/src/Composer/Installers/MODULEWorkInstaller.php +9 -0
  56. embedded/composer/installers/src/Composer/Installers/MODXEvoInstaller.php +16 -0
  57. embedded/composer/installers/src/Composer/Installers/MagentoInstaller.php +11 -0
  58. embedded/composer/installers/src/Composer/Installers/MakoInstaller.php +9 -0
  59. embedded/composer/installers/src/Composer/Installers/MauticInstaller.php +25 -0
  60. embedded/composer/installers/src/Composer/Installers/MediaWikiInstaller.php +50 -0
  61. embedded/composer/installers/src/Composer/Installers/MicroweberInstaller.php +111 -0
  62. embedded/composer/installers/src/Composer/Installers/MoodleInstaller.php +56 -0
  63. embedded/composer/installers/src/Composer/Installers/OctoberInstaller.php +46 -0
  64. embedded/composer/installers/src/Composer/Installers/OxidInstaller.php +59 -0
  65. embedded/composer/installers/src/Composer/Installers/PPIInstaller.php +9 -0
  66. embedded/composer/installers/src/Composer/Installers/PhpBBInstaller.php +11 -0
  67. embedded/composer/installers/src/Composer/Installers/PimcoreInstaller.php +21 -0
  68. embedded/composer/installers/src/Composer/Installers/PiwikInstaller.php +32 -0
  69. embedded/composer/installers/src/Composer/Installers/Plugin.php +17 -0
  70. embedded/composer/installers/src/Composer/Installers/PrestashopInstaller.php +10 -0
  71. embedded/composer/installers/src/Composer/Installers/PuppetInstaller.php +11 -0
  72. embedded/composer/installers/src/Composer/Installers/RedaxoInstaller.php +10 -0
  73. embedded/composer/installers/src/Composer/Installers/RoundcubeInstaller.php +22 -0
  74. embedded/composer/installers/src/Composer/Installers/SMFInstaller.php +10 -0
  75. embedded/composer/installers/src/Composer/Installers/ShopwareInstaller.php +58 -0
  76. embedded/composer/installers/src/Composer/Installers/SilverStripeInstaller.php +36 -0
  77. embedded/composer/installers/src/Composer/Installers/Symfony1Installer.php +26 -0
  78. embedded/composer/installers/src/Composer/Installers/TYPO3CmsInstaller.php +16 -0
  79. embedded/composer/installers/src/Composer/Installers/TYPO3FlowInstaller.php +38 -0
  80. embedded/composer/installers/src/Composer/Installers/TheliaInstaller.php +12 -0
  81. embedded/composer/installers/src/Composer/Installers/TuskInstaller.php +14 -0
  82. embedded/composer/installers/src/Composer/Installers/WHMCSInstaller.php +10 -0
  83. embedded/composer/installers/src/Composer/Installers/WolfCMSInstaller.php +9 -0
  84. embedded/composer/installers/src/Composer/Installers/WordPressInstaller.php +11 -0
  85. embedded/composer/installers/src/Composer/Installers/ZendInstaller.php +11 -0
  86. embedded/composer/installers/src/Composer/Installers/ZikulaInstaller.php +10 -0
  87. embedded/composer/installers/src/bootstrap.php +13 -0
  88. embedded/installer/changelog.txt +133 -133
  89. embedded/installer/composer.json +30 -30
  90. embedded/installer/includes/class-installer-dependencies.php +278 -278
  91. embedded/installer/includes/class-installer-theme.php +978 -978
  92. embedded/installer/includes/installer-api.php +80 -80
  93. embedded/installer/includes/installer-upgrader-skins.php +36 -36
  94. embedded/installer/includes/installer.class.php +2559 -2559
  95. embedded/installer/includes/translation-service-info.class.php +34 -34
  96. embedded/installer/installer.php +21 -21
  97. embedded/installer/loader.php +150 -150
  98. embedded/installer/locale/orig/installer.po +230 -230
  99. embedded/installer/repositories.xml +13 -13
  100. embedded/installer/res/css/admin.css +185 -185
  101. embedded/installer/res/js/admin.js +402 -402
  102. embedded/installer/res/js/iframeResizer.min.js +10 -10
  103. embedded/installer/res/js/installer_theme_install.js +96 -96
  104. embedded/installer/templates/downloads-list-compact.php +80 -80
  105. embedded/installer/templates/downloads-list.php +85 -85
  106. embedded/installer/templates/products-compact.php +128 -128
  107. embedded/installer/templates/repository-listing.php +178 -178
  108. inc/admin-menus/class-wcml-setup.php +4 -2
  109. inc/class-wcml-cart.php +4 -1
  110. inc/class-wcml-compatibility.php +11 -1
  111. inc/class-wcml-endpoints.php +5 -5
  112. inc/class-wcml-languages-upgrader.php +2 -1
  113. inc/class-wcml-products-screen-options.php +215 -0
  114. inc/class-wcml-products.php +2 -2
  115. inc/class-wcml-resources.php +28 -22
  116. inc/class-wcml-wc-strings.php +4 -8
  117. inc/class-woocommerce-wpml.php +7 -1
  118. inc/constants.php +3 -1
  119. inc/currencies/class-wcml-custom-prices.php +1 -1
  120. inc/currencies/class-wcml-multi-currency-install.php +7 -7
  121. inc/currencies/class-wcml-multi-currency-prices.php +8 -4
  122. inc/currencies/class-wcml-multi-currency-resources.php +2 -1
  123. inc/currencies/class-wcml-multi-currency.php +10 -6
  124. inc/missing-php-functions.php +0 -17
  125. inc/template-classes/class-wcml-custom-files-ui.php +1 -1
  126. inc/translation-editor/class-wcml-downloadable-products.php +1 -1
  127. inc/translation-editor/class-wcml-synchronize-product-data.php +3 -0
  128. inc/translation-editor/class-wcml-translation-editor.php +53 -1
  129. locale/woocommerce-multilingual-ar.po +1214 -0
  130. locale/woocommerce-multilingual-de_DE.po +1214 -0
  131. locale/woocommerce-multilingual-el.po +1214 -0
  132. locale/woocommerce-multilingual-es_ES.po +1214 -0
  133. locale/woocommerce-multilingual-fr_FR.mo +0 -0
  134. locale/woocommerce-multilingual-fr_FR.po +1214 -0
  135. locale/woocommerce-multilingual-he_IL.po +1214 -0
  136. locale/woocommerce-multilingual-it_IT.po +1214 -0
  137. locale/woocommerce-multilingual-ja.po +1214 -0
  138. locale/woocommerce-multilingual-ko_KR.po +508 -0
compatibility/class-wcml-adventure-tours.php CHANGED
@@ -346,8 +346,12 @@ class WCML_Adventure_tours{
346
 
347
  function is_variable_tour( $is_variable, $product_id ){
348
 
349
- if( $is_variable && get_post_meta( $product_id, '_variable_tour', true ) == 'yes' ){
 
 
350
  $is_variable = true;
 
 
351
  }
352
 
353
  return $is_variable;
346
 
347
  function is_variable_tour( $is_variable, $product_id ){
348
 
349
+ $var_tour_meta = get_post_meta( $product_id, '_variable_tour', true );
350
+
351
+ if( $is_variable && $var_tour_meta == 'yes' ){
352
  $is_variable = true;
353
+ }elseif( $var_tour_meta == 'no' ){
354
+ $is_variable = false;
355
  }
356
 
357
  return $is_variable;
compatibility/class-wcml-aurum.php ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class WCML_Aurum{
4
+
5
+ function __construct(){
6
+
7
+ add_filter( 'wcml_multi_currency_is_ajax', array( $this,'add_ajax_action' ) );
8
+ }
9
+
10
+ function add_ajax_action( $actions ){
11
+
12
+ $actions[] = 'lab_wc_add_to_cart';
13
+
14
+ return $actions;
15
+ }
16
+
17
+ }
compatibility/class-wcml-bookings.php CHANGED
@@ -919,7 +919,7 @@ class WCML_Bookings{
919
  function load_assets( ){
920
  global $pagenow, $woocommerce_wpml;
921
 
922
- if( $pagenow == 'post.php' || $pagenow == 'post-new.php' ){
923
 
924
  wp_register_style( 'wcml-bookings-css', WCML_PLUGIN_URL . '/compatibility/res/css/wcml-bookings.css', array(), WCML_VERSION );
925
  wp_enqueue_style( 'wcml-bookings-css' );
@@ -1568,18 +1568,30 @@ class WCML_Bookings{
1568
 
1569
  if ( ( isset( $query->query_vars['post_type'] ) && $query->query_vars['post_type'] == 'wc_booking' ) ) {
1570
 
 
 
1571
  $product_ids = $wpdb->get_col( $wpdb->prepare(
1572
  "SELECT element_id
1573
  FROM {$wpdb->prefix}icl_translations
1574
- WHERE language_code = %s AND element_type = 'post_product'", $sitepress->get_current_language() ) );
1575
 
1576
- $query->query_vars[ 'meta_query' ][] = array(
1577
- array(
1578
- 'key' => '_booking_product_id',
1579
- 'value' => $product_ids,
1580
- 'compare ' => 'IN'
1581
- )
1582
- );
 
 
 
 
 
 
 
 
 
 
1583
  }
1584
  }
1585
 
919
  function load_assets( ){
920
  global $pagenow, $woocommerce_wpml;
921
 
922
+ if( ( $pagenow == 'post.php' && isset( $_GET[ 'post' ] ) && wc_get_product( $_GET[ 'post' ] )->product_type == 'booking' ) || $pagenow == 'post-new.php' ){
923
 
924
  wp_register_style( 'wcml-bookings-css', WCML_PLUGIN_URL . '/compatibility/res/css/wcml-bookings.css', array(), WCML_VERSION );
925
  wp_enqueue_style( 'wcml-bookings-css' );
1568
 
1569
  if ( ( isset( $query->query_vars['post_type'] ) && $query->query_vars['post_type'] == 'wc_booking' ) ) {
1570
 
1571
+ $current_lang = $sitepress->get_current_language();
1572
+
1573
  $product_ids = $wpdb->get_col( $wpdb->prepare(
1574
  "SELECT element_id
1575
  FROM {$wpdb->prefix}icl_translations
1576
+ WHERE language_code = %s AND element_type = 'post_product'", $current_lang ) );
1577
 
1578
+ $product_ids = array_diff( $product_ids, array( NULL ) );
1579
+
1580
+ if( ( !isset( $_GET['lang'] ) || ( isset( $_GET['lang'] ) && $_GET['lang'] != 'all' ) ) ){
1581
+ $query->query_vars[ 'meta_query' ][] = array(
1582
+ 'relation' => 'OR',
1583
+ array(
1584
+ 'key' => '_language_code',
1585
+ 'value' => $current_lang,
1586
+ 'compare ' => '='
1587
+ ),
1588
+ array(
1589
+ 'key' => '_booking_product_id',
1590
+ 'value' => $product_ids,
1591
+ 'compare ' => 'IN'
1592
+ )
1593
+ );
1594
+ }
1595
  }
1596
  }
1597
 
compatibility/class-wcml-composite-products.php CHANGED
@@ -9,13 +9,14 @@ class WCML_Composite_Products extends WCML_Compatibility_Helper{
9
  add_filter( 'woocommerce_composite_component_default_option', array($this, 'woocommerce_composite_component_default_option'), 10, 3 );
10
  add_filter( 'wcml_cart_contents', array($this, 'wpml_composites_compat'), 11, 4 );
11
  add_filter( 'woocommerce_composite_component_options_query_args', array($this, 'wpml_composites_transients_cache_per_language'), 10, 3 );
12
- add_action( 'updated_post_meta', array( $this, 'sync_composite_data_across_translations'), 10, 4 );
13
 
14
  if( is_admin() ){
15
 
16
  add_action( 'wcml_gui_additional_box_html', array( $this, 'custom_box_html' ), 10, 3 );
17
  add_filter( 'wcml_gui_additional_box_data', array( $this, 'custom_box_html_data' ), 10, 4 );
18
  add_action( 'wcml_update_extra_fields', array( $this, 'components_update' ), 10, 3 );
 
19
 
20
  $this->tp = new WPML_Element_Translation_Package();
21
 
@@ -23,7 +24,9 @@ class WCML_Composite_Products extends WCML_Compatibility_Helper{
23
  add_action( 'wpml_translation_job_saved', array( $this, 'save_composite_data_translation' ), 10, 3 );
24
  //lock fields on translations pages
25
  add_filter( 'wcml_js_lock_fields_input_names', array( $this, 'wcml_js_lock_fields_input_names' ) );
26
-
 
 
27
  }
28
  }
29
 
@@ -57,90 +60,58 @@ class WCML_Composite_Products extends WCML_Compatibility_Helper{
57
  return $args;
58
  }
59
 
60
- function sync_composite_data_across_translations( $meta_id, $post_id, $meta_key, $composite_data ){
61
-
62
-
63
- if( $meta_key != '_bto_data' )
64
- return false;
65
-
66
-
67
- global $sitepress, $woocommerce_wpml;
68
-
69
- $post = get_post( $post_id );
70
-
71
- // skip auto-drafts // skip autosave
72
- if ( $post->post_status == 'auto-draft' || isset( $_POST[ 'autosave' ] ) ) {
73
- return;
74
- }
75
-
76
- if( $post->post_type == 'product' ) {
77
-
78
- if( $this->get_product_type( $post_id ) == 'composite' ) {
79
-
80
- remove_action( 'updated_post_meta', array( $this, 'sync_composite_data_across_translations'), 10, 4 );
81
 
82
- if ( $woocommerce_wpml->products->is_original_product( $post_id ) ) {
83
 
84
- $original_product_id = $post_id;
85
-
86
- } else {
87
-
88
- $original_product_language = $woocommerce_wpml->products->get_original_product_language( $post_id );
89
- $original_product_id = apply_filters( 'translate_object_id', $post_id, 'product', true, $original_product_language );
90
 
91
- }
 
92
 
93
- $product = new WC_Product_Composite( $original_product_id );
94
 
95
- $product_trid = $sitepress->get_element_trid( $original_product_id, 'post_product' );
96
- $product_translations = $sitepress->get_element_translations( $product_trid, 'post_product' );
97
 
98
- foreach ( $product_translations as $product_translation ) {
 
99
 
100
- if ( empty($product_translation->original) ) {
101
 
102
- $translated_product = new WC_Product_Composite( $product_translation->element_id );
103
- $translated_composite_data = $translated_product->get_composite_data();
 
104
 
105
- foreach ( $composite_data as $component_id => $component ) {
 
 
106
 
107
- if( isset( $translated_composite_data[$component_id]['title'] ) ){
108
- $composite_data[$component_id]['title'] = $translated_composite_data[$component_id]['title'];
109
- }
110
 
111
- if( isset( $translated_composite_data[$component_id]['description'] ) ){
112
- $composite_data[$component_id]['description'] = $translated_composite_data[$component_id]['description'];
 
113
  }
114
 
115
- if ( $component['query_type'] == 'product_ids' ) {
116
-
117
- foreach ( $component['assigned_ids'] as $idx => $assigned_id ) {
118
- $composite_data[$component_id]['assigned_ids'][$idx] =
119
- apply_filters( 'translate_object_id', $assigned_id, 'product', true, $product_translation->language_code );
120
- }
121
-
122
- } elseif( $component['query_type'] == 'category_ids' ){
123
 
124
- foreach ( $component['assigned_category_ids'] as $idx => $assigned_id ) {
125
- $composite_data[$component_id]['assigned_category_ids'][$idx] =
126
- apply_filters( 'translate_object_id', $assigned_id, 'product_cat', true, $product_translation->language_code );
127
-
128
- }
129
 
130
  }
131
 
132
  }
133
 
134
- update_post_meta( $product_translation->element_id, '_bto_data', $composite_data );
135
-
136
  }
137
 
138
- }
139
 
140
- add_action( 'updated_post_meta', array( $this, 'sync_composite_data_across_translations'), 10, 4 );
141
 
142
  }
143
-
144
  }
145
 
146
  }
@@ -216,7 +187,7 @@ class WCML_Composite_Products extends WCML_Compatibility_Helper{
216
 
217
  function components_update( $original_product_id, $product_id, $data ){
218
 
219
- $product = new WC_Product_Composite( $product_id );
220
 
221
  $composite_data = $product->get_composite_data();
222
 
@@ -330,13 +301,46 @@ class WCML_Composite_Products extends WCML_Compatibility_Helper{
330
 
331
  function wcml_js_lock_fields_input_names( $names ){
332
 
333
- $names[] = '_per_product_pricing_bto';
334
- $names[] = '_per_product_shipping_bto';
335
  $names[] = '_base_regular_price';
336
  $names[] = '_base_sale_price';
 
 
 
 
 
 
 
 
 
337
  $names[] = '_bto_hide_shop_price';
338
 
339
  return $names;
340
  }
341
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
342
  }
9
  add_filter( 'woocommerce_composite_component_default_option', array($this, 'woocommerce_composite_component_default_option'), 10, 3 );
10
  add_filter( 'wcml_cart_contents', array($this, 'wpml_composites_compat'), 11, 4 );
11
  add_filter( 'woocommerce_composite_component_options_query_args', array($this, 'wpml_composites_transients_cache_per_language'), 10, 3 );
12
+ add_action( 'wcml_before_sync_product', array( $this, 'sync_composite_data_across_translations'), 10, 2 );
13
 
14
  if( is_admin() ){
15
 
16
  add_action( 'wcml_gui_additional_box_html', array( $this, 'custom_box_html' ), 10, 3 );
17
  add_filter( 'wcml_gui_additional_box_data', array( $this, 'custom_box_html_data' ), 10, 4 );
18
  add_action( 'wcml_update_extra_fields', array( $this, 'components_update' ), 10, 3 );
19
+ add_filter( 'woocommerce_json_search_found_products', array( $this, 'woocommerce_json_search_found_products' ) );
20
 
21
  $this->tp = new WPML_Element_Translation_Package();
22
 
24
  add_action( 'wpml_translation_job_saved', array( $this, 'save_composite_data_translation' ), 10, 3 );
25
  //lock fields on translations pages
26
  add_filter( 'wcml_js_lock_fields_input_names', array( $this, 'wcml_js_lock_fields_input_names' ) );
27
+ add_filter( 'wcml_js_lock_fields_ids', array( $this, 'wcml_js_lock_fields_ids' ) );
28
+ add_filter( 'wcml_after_load_lock_fields_js', array( $this, 'localize_lock_fields_js' ) );
29
+ add_action( 'init', array( $this, 'load_assets' ) );
30
  }
31
  }
32
 
60
  return $args;
61
  }
62
 
63
+ function sync_composite_data_across_translations( $original_product_id, $current_product_id ){
64
+ global $woocommerce_wpml, $sitepress;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
65
 
66
+ if( $this->get_product_type( $original_product_id ) == 'composite' ){
67
 
68
+ $product = new WC_Product_Composite( $original_product_id );
69
+ $composite_data = $product->get_composite_data();
 
 
 
 
70
 
71
+ $product_trid = $sitepress->get_element_trid( $original_product_id, 'post_product' );
72
+ $product_translations = $sitepress->get_element_translations( $product_trid, 'post_product' );
73
 
74
+ foreach ( $product_translations as $product_translation ) {
75
 
76
+ if ( empty($product_translation->original) ) {
 
77
 
78
+ $translated_product = new WC_Product_Composite( $product_translation->element_id );
79
+ $translated_composite_data = $translated_product->get_composite_data();
80
 
81
+ foreach ( $composite_data as $component_id => $component ) {
82
 
83
+ if( isset( $translated_composite_data[$component_id]['title'] ) ){
84
+ $composite_data[$component_id]['title'] = $translated_composite_data[$component_id]['title'];
85
+ }
86
 
87
+ if( isset( $translated_composite_data[$component_id]['description'] ) ){
88
+ $composite_data[$component_id]['description'] = $translated_composite_data[$component_id]['description'];
89
+ }
90
 
91
+ if ( $component['query_type'] == 'product_ids' ) {
 
 
92
 
93
+ foreach ( $component['assigned_ids'] as $idx => $assigned_id ) {
94
+ $composite_data[$component_id]['assigned_ids'][$idx] =
95
+ apply_filters( 'translate_object_id', $assigned_id, 'product', true, $product_translation->language_code );
96
  }
97
 
98
+ } elseif( $component['query_type'] == 'category_ids' ){
 
 
 
 
 
 
 
99
 
100
+ foreach ( $component['assigned_category_ids'] as $idx => $assigned_id ) {
101
+ $composite_data[$component_id]['assigned_category_ids'][$idx] =
102
+ apply_filters( 'translate_object_id', $assigned_id, 'product_cat', true, $product_translation->language_code );
 
 
103
 
104
  }
105
 
106
  }
107
 
 
 
108
  }
109
 
110
+ update_post_meta( $product_translation->element_id, '_bto_data', $composite_data );
111
 
112
+ }
113
 
114
  }
 
115
  }
116
 
117
  }
187
 
188
  function components_update( $original_product_id, $product_id, $data ){
189
 
190
+ $product = new WC_Product_Composite( $original_product_id );
191
 
192
  $composite_data = $product->get_composite_data();
193
 
301
 
302
  function wcml_js_lock_fields_input_names( $names ){
303
 
 
 
304
  $names[] = '_base_regular_price';
305
  $names[] = '_base_sale_price';
306
+ $names[] = 'bto_style';
307
+
308
+ return $names;
309
+ }
310
+
311
+ function wcml_js_lock_fields_ids( $names ){
312
+
313
+ $names[] = '_per_product_pricing_bto';
314
+ $names[] = '_per_product_shipping_bto';
315
  $names[] = '_bto_hide_shop_price';
316
 
317
  return $names;
318
  }
319
 
320
+ function localize_lock_fields_js(){
321
+ wp_localize_script( 'wcml-composite-js', 'lock_settings' , array( 'lock_fields' => 1 ) );
322
+ }
323
+
324
+ function load_assets( ){
325
+ global $pagenow;
326
+
327
+ if( ( $pagenow == 'post.php' && isset( $_GET[ 'post' ] ) && wc_get_product( $_GET[ 'post' ] )->product_type == 'composite' ) || $pagenow == 'post-new.php' ){
328
+ wp_register_script( 'wcml-composite-js', WCML_PLUGIN_URL . '/compatibility/res/js/wcml-composite.js', array( 'jquery' ), WCML_VERSION );
329
+ wp_enqueue_script( 'wcml-composite-js' );
330
+
331
+ }
332
+
333
+ }
334
+
335
+ function woocommerce_json_search_found_products( $found_products ){
336
+ global $wpml_post_translations, $sitepress;
337
+
338
+ foreach( $found_products as $id => $product_name ){
339
+ if( $wpml_post_translations->get_element_lang_code ( $id ) != $sitepress->get_current_language() ){
340
+ unset( $found_products[ $id ] );
341
+ }
342
+ }
343
+
344
+ return $found_products;
345
+ }
346
  }
compatibility/class-wcml-wc-ajax-cart.php ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class WCML_WC_Ajax_Cart{
4
+
5
+ function __construct() {
6
+ add_filter( 'wcml_calculate_totals_exception', array( $this, 'wac_update_ajax' ), 9 );
7
+ }
8
+
9
+ function wac_update_ajax( $exc ) {
10
+ if ( !empty($_POST['is_wac_ajax'])) {
11
+ return false;
12
+ }
13
+ return $exc;
14
+ }
15
+
16
+ }
compatibility/res/js/wcml-bookings.js CHANGED
@@ -1,5 +1,7 @@
1
  jQuery( document ).ready( function( $ ){
2
 
 
 
3
  if( $( '.wcml_custom_costs_input:checked' ).val() == 1 ){
4
 
5
  $( '.wcml_custom_cost_field' ).show();
@@ -43,43 +45,47 @@ jQuery( document ).ready( function( $ ){
43
 
44
  });
45
 
 
 
 
46
 
47
- //lock fields
48
- if( typeof lock_settings != 'undefined' && typeof lock_settings.lock_fields != 'undefined' && lock_settings.lock_fields == 1 ){
 
 
 
49
 
50
- $('#bookings_pricing input[type="number"],' +
51
- '#accommodation_bookings_rates input[type="number"], ' +
52
- '#bookings_resources input[type="number"], ' +
53
- '#bookings_availability input[type="number"], ' +
54
- '#bookings_availability input[type="time"], ' +
55
 
56
- '#bookings_persons input[type="number"]').each(function(){
57
- $(this).attr('readonly','readonly');
58
- $(this).after($('.wcml_lock_img').clone().removeClass('wcml_lock_img').show());
59
- });
60
 
61
- var buttons = [ 'add_resource', 'add_row','remove_booking_resource','remove_booking_person','add_person' ];
 
 
 
 
 
62
 
63
- for (i = 0; i < buttons.length; i++) {
64
- $('.'+buttons[i]).attr('disabled','disabled');
65
- $('.'+buttons[i]).unbind('click');
66
- $('.'+buttons[i]).after($('.wcml_lock_img').clone().removeClass('wcml_lock_img').show());
67
- }
68
- $('.add_row').removeAttr('data-row');
69
 
70
- $('form#post input[type="submit"]').click(function(){
 
 
71
 
72
- for (i = 0; i < non_standard_fields.ids.length; i++) {
73
- $('#'+non_standard_fields.ids[i]).removeAttr('disabled');
74
- }
75
 
76
- $('#bookings_pricing select, #bookings_resources select, #bookings_availability select,#bookings_persons input[type="checkbox"]').each(function(){
77
- $(this).removeAttr('disabled');
78
  });
79
 
80
- });
81
-
82
 
 
83
  }
 
84
  });
85
 
 
 
1
  jQuery( document ).ready( function( $ ){
2
 
3
+ wcml_lock_bookings_fields();
4
+
5
  if( $( '.wcml_custom_costs_input:checked' ).val() == 1 ){
6
 
7
  $( '.wcml_custom_cost_field' ).show();
45
 
46
  });
47
 
48
+ function wcml_lock_bookings_fields(){
49
+ //lock fields
50
+ if( typeof lock_settings != 'undefined' && typeof lock_settings.lock_fields != 'undefined' && lock_settings.lock_fields == 1 ){
51
 
52
+ $('#bookings_pricing input[type="number"],' +
53
+ '#accommodation_bookings_rates input[type="number"], ' +
54
+ '#bookings_resources input[type="number"], ' +
55
+ '#bookings_availability input[type="number"], ' +
56
+ '#bookings_availability input[type="time"], ' +
57
 
58
+ '#bookings_persons input[type="number"]').each(function(){
59
+ $(this).attr('readonly','readonly');
60
+ $(this).after($('.wcml_lock_img').clone().removeClass('wcml_lock_img').show());
61
+ });
 
62
 
63
+ var buttons = [ 'add_resource', 'add_row','remove_booking_resource','remove_booking_person','add_person' ];
 
 
 
64
 
65
+ for (i = 0; i < buttons.length; i++) {
66
+ $('.'+buttons[i]).attr('disabled','disabled');
67
+ $('.'+buttons[i]).unbind('click');
68
+ $('.'+buttons[i]).after($('.wcml_lock_img').clone().removeClass('wcml_lock_img').show());
69
+ }
70
+ $('.add_row').removeAttr('data-row');
71
 
72
+ $('form#post input[type="submit"]').click(function(){
 
 
 
 
 
73
 
74
+ for (i = 0; i < non_standard_fields.ids.length; i++) {
75
+ $('#'+non_standard_fields.ids[i]).removeAttr('disabled');
76
+ }
77
 
78
+ $('#bookings_pricing select, #bookings_resources select, #bookings_availability select,#bookings_persons input[type="checkbox"]').each(function(){
79
+ $(this).removeAttr('disabled');
80
+ });
81
 
 
 
82
  });
83
 
 
 
84
 
85
+ }
86
  }
87
+
88
  });
89
 
90
+
91
+
compatibility/res/js/wcml-composite.js ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ jQuery( document ).ready( function( $ ){
2
+ //lock fields
3
+ if( typeof lock_settings != 'undefined' && typeof lock_settings.lock_fields != 'undefined' && lock_settings.lock_fields == 1 ) {
4
+
5
+ $('#bto_config_group_inner .remove_row,.add_bto_group,.save_composition').each(function(){
6
+ $(this).attr('disabled','disabled');
7
+ $(this).after($('.wcml_lock_img').clone().removeClass('wcml_lock_img').show());
8
+ });
9
+
10
+ $('#bto_product_data li,#bto_config_group_inner .subsubsub li a').bind({
11
+ click: function(e) {
12
+ return false;
13
+ }
14
+ });
15
+
16
+
17
+ //components fields
18
+ jQuery('input.group_quantity_min,input.group_quantity_max,input.group_discount,.bto_query_type_selector .wc-product-search').each(function(){
19
+ jQuery(this).attr('readonly','readonly');
20
+ jQuery(this).after(jQuery('.wcml_lock_img').clone().removeClass('wcml_lock_img').show());
21
+ });
22
+
23
+ jQuery('select.bto_query_type,.component_options_style select,.group_optional input').each(function(){
24
+ jQuery(this).attr('disabled','disabled');
25
+ jQuery(this).after(jQuery('.wcml_lock_img').clone().removeClass('wcml_lock_img').show());
26
+ });
27
+ }
28
+
29
+ });
30
+
31
+
32
+
embedded/autoload.php ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // autoload.php @generated by Composer
4
+
5
+ require_once __DIR__ . '/composer' . '/autoload_real.php';
6
+
7
+ return ComposerAutoloaderInit655bc99a48b2de2700adf0e1886e5b25::getLoader();
embedded/autoload_52.php ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // autoload_52.php generated by xrstf/composer-php52
4
+
5
+ require_once dirname(__FILE__) . '/composer'.'/autoload_real_52.php';
6
+
7
+ return ComposerAutoloaderInitddf8a94c2f6108e93d177a18dcd16dc9::getLoader();
embedded/composer/ClassLoader.php ADDED
@@ -0,0 +1,413 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of Composer.
5
+ *
6
+ * (c) Nils Adermann <naderman@naderman.de>
7
+ * Jordi Boggiano <j.boggiano@seld.be>
8
+ *
9
+ * For the full copyright and license information, please view the LICENSE
10
+ * file that was distributed with this source code.
11
+ */
12
+
13
+ namespace Composer\Autoload;
14
+
15
+ /**
16
+ * ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
17
+ *
18
+ * $loader = new \Composer\Autoload\ClassLoader();
19
+ *
20
+ * // register classes with namespaces
21
+ * $loader->add('Symfony\Component', __DIR__.'/component');
22
+ * $loader->add('Symfony', __DIR__.'/framework');
23
+ *
24
+ * // activate the autoloader
25
+ * $loader->register();
26
+ *
27
+ * // to enable searching the include path (eg. for PEAR packages)
28
+ * $loader->setUseIncludePath(true);
29
+ *
30
+ * In this example, if you try to use a class in the Symfony\Component
31
+ * namespace or one of its children (Symfony\Component\Console for instance),
32
+ * the autoloader will first look for the class under the component/
33
+ * directory, and it will then fallback to the framework/ directory if not
34
+ * found before giving up.
35
+ *
36
+ * This class is loosely based on the Symfony UniversalClassLoader.
37
+ *
38
+ * @author Fabien Potencier <fabien@symfony.com>
39
+ * @author Jordi Boggiano <j.boggiano@seld.be>
40
+ * @see http://www.php-fig.org/psr/psr-0/
41
+ * @see http://www.php-fig.org/psr/psr-4/
42
+ */
43
+ class ClassLoader
44
+ {
45
+ // PSR-4
46
+ private $prefixLengthsPsr4 = array();
47
+ private $prefixDirsPsr4 = array();
48
+ private $fallbackDirsPsr4 = array();
49
+
50
+ // PSR-0
51
+ private $prefixesPsr0 = array();
52
+ private $fallbackDirsPsr0 = array();
53
+
54
+ private $useIncludePath = false;
55
+ private $classMap = array();
56
+
57
+ private $classMapAuthoritative = false;
58
+
59
+ public function getPrefixes()
60
+ {
61
+ if (!empty($this->prefixesPsr0)) {
62
+ return call_user_func_array('array_merge', $this->prefixesPsr0);
63
+ }
64
+
65
+ return array();
66
+ }
67
+
68
+ public function getPrefixesPsr4()
69
+ {
70
+ return $this->prefixDirsPsr4;
71
+ }
72
+
73
+ public function getFallbackDirs()
74
+ {
75
+ return $this->fallbackDirsPsr0;
76
+ }
77
+
78
+ public function getFallbackDirsPsr4()
79
+ {
80
+ return $this->fallbackDirsPsr4;
81
+ }
82
+
83
+ public function getClassMap()
84
+ {
85
+ return $this->classMap;
86
+ }
87
+
88
+ /**
89
+ * @param array $classMap Class to filename map
90
+ */
91
+ public function addClassMap(array $classMap)
92
+ {
93
+ if ($this->classMap) {
94
+ $this->classMap = array_merge($this->classMap, $classMap);
95
+ } else {
96
+ $this->classMap = $classMap;
97
+ }
98
+ }
99
+
100
+ /**
101
+ * Registers a set of PSR-0 directories for a given prefix, either
102
+ * appending or prepending to the ones previously set for this prefix.
103
+ *
104
+ * @param string $prefix The prefix
105
+ * @param array|string $paths The PSR-0 root directories
106
+ * @param bool $prepend Whether to prepend the directories
107
+ */
108
+ public function add($prefix, $paths, $prepend = false)
109
+ {
110
+ if (!$prefix) {
111
+ if ($prepend) {
112
+ $this->fallbackDirsPsr0 = array_merge(
113
+ (array) $paths,
114
+ $this->fallbackDirsPsr0
115
+ );
116
+ } else {
117
+ $this->fallbackDirsPsr0 = array_merge(
118
+ $this->fallbackDirsPsr0,
119
+ (array) $paths
120
+ );
121
+ }
122
+
123
+ return;
124
+ }
125
+
126
+ $first = $prefix[0];
127
+ if (!isset($this->prefixesPsr0[$first][$prefix])) {
128
+ $this->prefixesPsr0[$first][$prefix] = (array) $paths;
129
+
130
+ return;
131
+ }
132
+ if ($prepend) {
133
+ $this->prefixesPsr0[$first][$prefix] = array_merge(
134
+ (array) $paths,
135
+ $this->prefixesPsr0[$first][$prefix]
136
+ );
137
+ } else {
138
+ $this->prefixesPsr0[$first][$prefix] = array_merge(
139
+ $this->prefixesPsr0[$first][$prefix],
140
+ (array) $paths
141
+ );
142
+ }
143
+ }
144
+
145
+ /**
146
+ * Registers a set of PSR-4 directories for a given namespace, either
147
+ * appending or prepending to the ones previously set for this namespace.
148
+ *
149
+ * @param string $prefix The prefix/namespace, with trailing '\\'
150
+ * @param array|string $paths The PSR-4 base directories
151
+ * @param bool $prepend Whether to prepend the directories
152
+ *
153
+ * @throws \InvalidArgumentException
154
+ */
155
+ public function addPsr4($prefix, $paths, $prepend = false)
156
+ {
157
+ if (!$prefix) {
158
+ // Register directories for the root namespace.
159
+ if ($prepend) {
160
+ $this->fallbackDirsPsr4 = array_merge(
161
+ (array) $paths,
162
+ $this->fallbackDirsPsr4
163
+ );
164
+ } else {
165
+ $this->fallbackDirsPsr4 = array_merge(
166
+ $this->fallbackDirsPsr4,
167
+ (array) $paths
168
+ );
169
+ }
170
+ } elseif (!isset($this->prefixDirsPsr4[$prefix])) {
171
+ // Register directories for a new namespace.
172
+ $length = strlen($prefix);
173
+ if ('\\' !== $prefix[$length - 1]) {
174
+ throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
175
+ }
176
+ $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
177
+ $this->prefixDirsPsr4[$prefix] = (array) $paths;
178
+ } elseif ($prepend) {
179
+ // Prepend directories for an already registered namespace.
180
+ $this->prefixDirsPsr4[$prefix] = array_merge(
181
+ (array) $paths,
182
+ $this->prefixDirsPsr4[$prefix]
183
+ );
184
+ } else {
185
+ // Append directories for an already registered namespace.
186
+ $this->prefixDirsPsr4[$prefix] = array_merge(
187
+ $this->prefixDirsPsr4[$prefix],
188
+ (array) $paths
189
+ );
190
+ }
191
+ }
192
+
193
+ /**
194
+ * Registers a set of PSR-0 directories for a given prefix,
195
+ * replacing any others previously set for this prefix.
196
+ *
197
+ * @param string $prefix The prefix
198
+ * @param array|string $paths The PSR-0 base directories
199
+ */
200
+ public function set($prefix, $paths)
201
+ {
202
+ if (!$prefix) {
203
+ $this->fallbackDirsPsr0 = (array) $paths;
204
+ } else {
205
+ $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
206
+ }
207
+ }
208
+
209
+ /**
210
+ * Registers a set of PSR-4 directories for a given namespace,
211
+ * replacing any others previously set for this namespace.
212
+ *
213
+ * @param string $prefix The prefix/namespace, with trailing '\\'
214
+ * @param array|string $paths The PSR-4 base directories
215
+ *
216
+ * @throws \InvalidArgumentException
217
+ */
218
+ public function setPsr4($prefix, $paths)
219
+ {
220
+ if (!$prefix) {
221
+ $this->fallbackDirsPsr4 = (array) $paths;
222
+ } else {
223
+ $length = strlen($prefix);
224
+ if ('\\' !== $prefix[$length - 1]) {
225
+ throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
226
+ }
227
+ $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
228
+ $this->prefixDirsPsr4[$prefix] = (array) $paths;
229
+ }
230
+ }
231
+
232
+ /**
233
+ * Turns on searching the include path for class files.
234
+ *
235
+ * @param bool $useIncludePath
236
+ */
237
+ public function setUseIncludePath($useIncludePath)
238
+ {
239
+ $this->useIncludePath = $useIncludePath;
240
+ }
241
+
242
+ /**
243
+ * Can be used to check if the autoloader uses the include path to check
244
+ * for classes.
245
+ *
246
+ * @return bool
247
+ */
248
+ public function getUseIncludePath()
249
+ {
250
+ return $this->useIncludePath;
251
+ }
252
+
253
+ /**
254
+ * Turns off searching the prefix and fallback directories for classes
255
+ * that have not been registered with the class map.
256
+ *
257
+ * @param bool $classMapAuthoritative
258
+ */
259
+ public function setClassMapAuthoritative($classMapAuthoritative)
260
+ {
261
+ $this->classMapAuthoritative = $classMapAuthoritative;
262
+ }
263
+
264
+ /**
265
+ * Should class lookup fail if not found in the current class map?
266
+ *
267
+ * @return bool
268
+ */
269
+ public function isClassMapAuthoritative()
270
+ {
271
+ return $this->classMapAuthoritative;
272
+ }
273
+
274
+ /**
275
+ * Registers this instance as an autoloader.
276
+ *
277
+ * @param bool $prepend Whether to prepend the autoloader or not
278
+ */
279
+ public function register($prepend = false)
280
+ {
281
+ spl_autoload_register(array($this, 'loadClass'), true, $prepend);
282
+ }
283
+
284
+ /**
285
+ * Unregisters this instance as an autoloader.
286
+ */
287
+ public function unregister()
288
+ {
289
+ spl_autoload_unregister(array($this, 'loadClass'));
290
+ }
291
+
292
+ /**
293
+ * Loads the given class or interface.
294
+ *
295
+ * @param string $class The name of the class
296
+ * @return bool|null True if loaded, null otherwise
297
+ */
298
+ public function loadClass($class)
299
+ {
300
+ if ($file = $this->findFile($class)) {
301
+ includeFile($file);
302
+
303
+ return true;
304
+ }
305
+ }
306
+
307
+ /**
308
+ * Finds the path to the file where the class is defined.
309
+ *
310
+ * @param string $class The name of the class
311
+ *
312
+ * @return string|false The path if found, false otherwise
313
+ */
314
+ public function findFile($class)
315
+ {
316
+ // work around for PHP 5.3.0 - 5.3.2 https://bugs.php.net/50731
317
+ if ('\\' == $class[0]) {
318
+ $class = substr($class, 1);
319
+ }
320
+
321
+ // class map lookup
322
+ if (isset($this->classMap[$class])) {
323
+ return $this->classMap[$class];
324
+ }
325
+ if ($this->classMapAuthoritative) {
326
+ return false;
327
+ }
328
+
329
+ $file = $this->findFileWithExtension($class, '.php');
330
+
331
+ // Search for Hack files if we are running on HHVM
332
+ if ($file === null && defined('HHVM_VERSION')) {
333
+ $file = $this->findFileWithExtension($class, '.hh');
334
+ }
335
+
336
+ if ($file === null) {
337
+ // Remember that this class does not exist.
338
+ return $this->classMap[$class] = false;
339
+ }
340
+
341
+ return $file;
342
+ }
343
+
344
+ private function findFileWithExtension($class, $ext)
345
+ {
346
+ // PSR-4 lookup
347
+ $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
348
+
349
+ $first = $class[0];
350
+ if (isset($this->prefixLengthsPsr4[$first])) {
351
+ foreach ($this->prefixLengthsPsr4[$first] as $prefix => $length) {
352
+ if (0 === strpos($class, $prefix)) {
353
+ foreach ($this->prefixDirsPsr4[$prefix] as $dir) {
354
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) {
355
+ return $file;
356
+ }
357
+ }
358
+ }
359
+ }
360
+ }
361
+
362
+ // PSR-4 fallback dirs
363
+ foreach ($this->fallbackDirsPsr4 as $dir) {
364
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
365
+ return $file;
366
+ }
367
+ }
368
+
369
+ // PSR-0 lookup
370
+ if (false !== $pos = strrpos($class, '\\')) {
371
+ // namespaced class name
372
+ $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
373
+ . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
374
+ } else {
375
+ // PEAR-like class name
376
+ $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
377
+ }
378
+
379
+ if (isset($this->prefixesPsr0[$first])) {
380
+ foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
381
+ if (0 === strpos($class, $prefix)) {
382
+ foreach ($dirs as $dir) {
383
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
384
+ return $file;
385
+ }
386
+ }
387
+ }
388
+ }
389
+ }
390
+
391
+ // PSR-0 fallback dirs
392
+ foreach ($this->fallbackDirsPsr0 as $dir) {
393
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
394
+ return $file;
395
+ }
396
+ }
397
+
398
+ // PSR-0 include paths.
399
+ if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
400
+ return $file;
401
+ }
402
+ }
403
+ }
404
+
405
+ /**
406
+ * Scope isolated include.
407
+ *
408
+ * Prevents access to $this/self from included files.
409
+ */
410
+ function includeFile($file)
411
+ {
412
+ include $file;
413
+ }
embedded/composer/ClassLoader52.php ADDED
@@ -0,0 +1,271 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Copyright (c) 2013, Christoph Mewes, http://www.xrstf.de
4
+ *
5
+ * This file is released under the terms of the MIT license. You can find the
6
+ * complete text in the attached LICENSE file or online at:
7
+ *
8
+ * http://www.opensource.org/licenses/mit-license.php
9
+ *
10
+ * --------------------------------------------------------------------------
11
+ *
12
+ * 99% of this is copied as-is from the original Composer source code and is
13
+ * released under MIT license as well. Copyright goes to:
14
+ *
15
+ * - Fabien Potencier <fabien@symfony.com>
16
+ * - Jordi Boggiano <j.boggiano@seld.be>
17
+ */
18
+
19
+ class xrstf_Composer52_ClassLoader {
20
+ private $prefixes = array();
21
+ private $fallbackDirs = array();
22
+ private $useIncludePath = false;
23
+ private $classMap = array();
24
+ private $classMapAuthoratative = false;
25
+ private $allowUnderscore = false;
26
+
27
+ /**
28
+ * @param boolean $flag true to allow class names with a leading underscore, false to disable
29
+ */
30
+ public function setAllowUnderscore($flag) {
31
+ $this->allowUnderscore = (boolean) $flag;
32
+ }
33
+
34
+ /**
35
+ * @return array
36
+ */
37
+ public function getPrefixes() {
38
+ return $this->prefixes;
39
+ }
40
+
41
+ /**
42
+ * Turns off searching the prefix and fallback directories for classes
43
+ * that have not been registered with the class map.
44
+ *
45
+ * @param bool $classMapAuthoratative
46
+ */
47
+ public function setClassMapAuthoritative($classMapAuthoratative) {
48
+ $this->classMapAuthoratative = $classMapAuthoratative;
49
+ }
50
+
51
+ /**
52
+ * Should class lookup fail if not found in the current class map?
53
+ *
54
+ * @return bool
55
+ */
56
+ public function getClassMapAuthoratative() {
57
+ return $this->classMapAuthoratative;
58
+ }
59
+
60
+ /**
61
+ * @return array
62
+ */
63
+ public function getFallbackDirs() {
64
+ return $this->fallbackDirs;
65
+ }
66
+
67
+ /**
68
+ * @return array
69
+ */
70
+ public function getClassMap() {
71
+ return $this->classMap;
72
+ }
73
+
74
+ /**
75
+ * @param array $classMap class to filename map
76
+ */
77
+ public function addClassMap(array $classMap) {
78
+ if ($this->classMap) {
79
+ $this->classMap = array_merge($this->classMap, $classMap);
80
+ }
81
+ else {
82
+ $this->classMap = $classMap;
83
+ }
84
+ }
85
+
86
+ /**
87
+ * Registers a set of classes, merging with any others previously set.
88
+ *
89
+ * @param string $prefix the classes prefix
90
+ * @param array|string $paths the location(s) of the classes
91
+ * @param bool $prepend prepend the location(s)
92
+ */
93
+ public function add($prefix, $paths, $prepend = false) {
94
+ if (!$prefix) {
95
+ if ($prepend) {
96
+ $this->fallbackDirs = array_merge(
97
+ (array) $paths,
98
+ $this->fallbackDirs
99
+ );
100
+ }
101
+ else {
102
+ $this->fallbackDirs = array_merge(
103
+ $this->fallbackDirs,
104
+ (array) $paths
105
+ );
106
+ }
107
+
108
+ return;
109
+ }
110
+
111
+ if (!isset($this->prefixes[$prefix])) {
112
+ $this->prefixes[$prefix] = (array) $paths;
113
+ return;
114
+ }
115
+
116
+ if ($prepend) {
117
+ $this->prefixes[$prefix] = array_merge(
118
+ (array) $paths,
119
+ $this->prefixes[$prefix]
120
+ );
121
+ }
122
+ else {
123
+ $this->prefixes[$prefix] = array_merge(
124
+ $this->prefixes[$prefix],
125
+ (array) $paths
126
+ );
127
+ }
128
+ }
129
+
130
+ /**
131
+ * Registers a set of classes, replacing any others previously set.
132
+ *
133
+ * @param string $prefix the classes prefix
134
+ * @param array|string $paths the location(s) of the classes
135
+ */
136
+ public function set($prefix, $paths) {
137
+ if (!$prefix) {
138
+ $this->fallbackDirs = (array) $paths;
139
+ return;
140
+ }
141
+
142
+ $this->prefixes[$prefix] = (array) $paths;
143
+ }
144
+
145
+ /**
146
+ * Turns on searching the include path for class files.
147
+ *
148
+ * @param bool $useIncludePath
149
+ */
150
+ public function setUseIncludePath($useIncludePath) {
151
+ $this->useIncludePath = $useIncludePath;
152
+ }
153
+
154
+ /**
155
+ * Can be used to check if the autoloader uses the include path to check
156
+ * for classes.
157
+ *
158
+ * @return bool
159
+ */
160
+ public function getUseIncludePath() {
161
+ return $this->useIncludePath;
162
+ }
163
+
164
+ /**
165
+ * Registers this instance as an autoloader.
166
+ */
167
+ public function register() {
168
+ spl_autoload_register(array($this, 'loadClass'), true);
169
+ }
170
+
171
+ /**
172
+ * Unregisters this instance as an autoloader.
173
+ */
174
+ public function unregister() {
175
+ spl_autoload_unregister(array($this, 'loadClass'));
176
+ }
177
+
178
+ /**
179
+ * Loads the given class or interface.
180
+ *
181
+ * @param string $class the name of the class
182
+ * @return bool|null true, if loaded
183
+ */
184
+ public function loadClass($class) {
185
+ if ($file = $this->findFile($class)) {
186
+ include $file;
187
+ return true;
188
+ }
189
+ }
190
+
191
+ /**
192
+ * Finds the path to the file where the class is defined.
193
+ *
194
+ * @param string $class the name of the class
195
+ * @return string|null the path, if found
196
+ */
197
+ public function findFile($class) {
198
+ if ('\\' === $class[0]) {
199
+ $class = substr($class, 1);
200
+ }
201
+
202
+ if (isset($this->classMap[$class])) {
203
+ return $this->classMap[$class];
204
+ }
205
+ elseif ($this->classMapAuthoratative) {
206
+ return false;
207
+ }
208
+
209
+ $classPath = $this->getClassPath($class);
210
+
211
+ foreach ($this->prefixes as $prefix => $dirs) {
212
+ if (0 === strpos($class, $prefix)) {
213
+ foreach ($dirs as $dir) {
214
+ if (file_exists($dir.DIRECTORY_SEPARATOR.$classPath)) {
215
+ return $dir.DIRECTORY_SEPARATOR.$classPath;
216
+ }
217
+ }
218
+ }
219
+ }
220
+
221
+ foreach ($this->fallbackDirs as $dir) {
222
+ if (file_exists($dir.DIRECTORY_SEPARATOR.$classPath)) {
223
+ return $dir.DIRECTORY_SEPARATOR.$classPath;
224
+ }
225
+ }
226
+
227
+ if ($this->useIncludePath && $file = self::resolveIncludePath($classPath)) {
228
+ return $file;
229
+ }
230
+
231
+ return $this->classMap[$class] = false;
232
+ }
233
+
234
+ private function getClassPath($class) {
235
+ if (false !== $pos = strrpos($class, '\\')) {
236
+ // namespaced class name
237
+ $classPath = str_replace('\\', DIRECTORY_SEPARATOR, substr($class, 0, $pos)).DIRECTORY_SEPARATOR;
238
+ $className = substr($class, $pos + 1);
239
+ }
240
+ else {
241
+ // PEAR-like class name
242
+ $classPath = null;
243
+ $className = $class;
244
+ }
245
+
246
+ $className = str_replace('_', DIRECTORY_SEPARATOR, $className);
247
+
248
+ // restore the prefix
249
+ if ($this->allowUnderscore && DIRECTORY_SEPARATOR === $className[0]) {
250
+ $className[0] = '_';
251
+ }
252
+
253
+ $classPath .= $className.'.php';
254
+
255
+ return $classPath;
256
+ }
257
+
258
+ public static function resolveIncludePath($classPath) {
259
+ $paths = explode(PATH_SEPARATOR, get_include_path());
260
+
261
+ foreach ($paths as $path) {
262
+ $path = rtrim($path, '/\\');
263
+
264
+ if ($file = file_exists($path.DIRECTORY_SEPARATOR.$file)) {
265
+ return $file;
266
+ }
267
+ }
268
+
269
+ return false;
270
+ }
271
+ }
embedded/composer/LICENSE ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ Copyright (c) 2015 Nils Adermann, Jordi Boggiano
3
+
4
+ Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ of this software and associated documentation files (the "Software"), to deal
6
+ in the Software without restriction, including without limitation the rights
7
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ copies of the Software, and to permit persons to whom the Software is furnished
9
+ to do so, subject to the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be included in all
12
+ copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20
+ THE SOFTWARE.
21
+
embedded/composer/autoload_classmap.php ADDED
@@ -0,0 +1,120 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // autoload_classmap.php @generated by Composer
4
+
5
+ $vendorDir = dirname(dirname(__FILE__));
6
+ $baseDir = dirname($vendorDir);
7
+
8
+ return array(
9
+ 'WCML_Accommodation_Bookings' => $baseDir . '/compatibility/class-wcml-accommodation-bookings.php',
10
+ 'WCML_Admin_Currency_Selector' => $baseDir . '/inc/currencies/class-wcml-admin-currency-selector.php',
11
+ 'WCML_Admin_Menus' => $baseDir . '/inc/admin-menus/class-wcml-admin-menus.php',
12
+ 'WCML_Adventure_tours' => $baseDir . '/compatibility/class-wcml-adventure-tours.php',
13
+ 'WCML_Ajax_Layered_Nav_Widget' => $baseDir . '/compatibility/class-wcml-ajax-layered-nav-widget.php',
14
+ 'WCML_Ajax_Setup' => $baseDir . '/inc/class-wcml-ajax-setup.php',
15
+ 'WCML_Attribute_Translation_UI' => $baseDir . '/inc/template-classes/class-wcml-attribute-translation-ui.php',
16
+ 'WCML_Attributes' => $baseDir . '/inc/class-wcml-attributes.php',
17
+ 'WCML_Aurum' => $baseDir . '/compatibility/class-wcml-aurum.php',
18
+ 'WCML_Bookings' => $baseDir . '/compatibility/class-wcml-bookings.php',
19
+ 'WCML_Bulk_Stock_Management' => $baseDir . '/compatibility/class-wcml-bulk-stock-management.php',
20
+ 'WCML_Capabilities' => $baseDir . '/inc/class-wcml-capabilities.php',
21
+ 'WCML_Cart' => $baseDir . '/inc/class-wcml-cart.php',
22
+ 'WCML_Checkout_Addons' => $baseDir . '/compatibility/class-wcml-checkout-addons.php',
23
+ 'WCML_Checkout_Field_Editor' => $baseDir . '/compatibility/class-wcml-checkout-field-editor.php',
24
+ 'WCML_Compatibility' => $baseDir . '/inc/class-wcml-compatibility.php',
25
+ 'WCML_Compatibility_Helper' => $baseDir . '/compatibility/class-wcml-compatibility-helper.php',
26
+ 'WCML_Composite_Products' => $baseDir . '/compatibility/class-wcml-composite-products.php',
27
+ 'WCML_Coupons' => $baseDir . '/inc/class-wcml-coupons.php',
28
+ 'WCML_Currencies' => $baseDir . '/inc/currencies/class-wcml-currencies.php',
29
+ 'WCML_Currency_Switcher' => $baseDir . '/inc/currencies/class-wcml-currency-switcher.php',
30
+ 'WCML_Currency_Switcher_Widget' => $baseDir . '/inc/currencies/class-wcml-currency-switcher-widget.php',
31
+ 'WCML_Custom_Currency_Options' => $baseDir . '/inc/template-classes/class-wcml-custom-currency-options.php',
32
+ 'WCML_Custom_Files_UI' => $baseDir . '/inc/template-classes/class-wcml-custom-files-ui.php',
33
+ 'WCML_Custom_Prices' => $baseDir . '/inc/currencies/class-wcml-custom-prices.php',
34
+ 'WCML_Custom_Prices_UI' => $baseDir . '/inc/template-classes/class-wcml-custom-prices-ui.php',
35
+ 'WCML_Dependencies' => $baseDir . '/inc/class-wcml-dependencies.php',
36
+ 'WCML_Downloadable_Products' => $baseDir . '/inc/translation-editor/class-wcml-downloadable-products.php',
37
+ 'WCML_Dynamic_Pricing' => $baseDir . '/compatibility/class-wcml-dynamic-pricing.php',
38
+ 'WCML_Editor_Save_Filters' => $baseDir . '/inc/translation-editor/class-wcml-editor-save-filters.php',
39
+ 'WCML_Editor_UI_Product_Job' => $baseDir . '/inc/translation-editor/class-wcml-editor-ui-product-job.php',
40
+ 'WCML_Emails' => $baseDir . '/inc/class-wcml-emails.php',
41
+ 'WCML_Endpoints' => $baseDir . '/inc/class-wcml-endpoints.php',
42
+ 'WCML_Extra_Product_Options' => $baseDir . '/compatibility/class-wcml-extra-product-options.php',
43
+ 'WCML_Flatsome' => $baseDir . '/compatibility/class-wcml-flatsome.php',
44
+ 'WCML_Install' => $baseDir . '/inc/class-wcml-install.php',
45
+ 'WCML_Languages_Upgrade_Notice' => $baseDir . '/inc/template-classes/class-wcml-languages-upgrade-notice.php',
46
+ 'WCML_Languages_Upgrader' => $baseDir . '/inc/class-wcml-languages-upgrader.php',
47
+ 'WCML_Links' => $baseDir . '/inc/admin-menus/class-wcml-links.php',
48
+ 'WCML_Locale' => $baseDir . '/inc/class-wcml-locale.php',
49
+ 'WCML_Media' => $baseDir . '/inc/class-wcml-media.php',
50
+ 'WCML_Menus_Wrap' => $baseDir . '/inc/template-classes/class-wcml-menus-wrap.php',
51
+ 'WCML_Mix_and_Match_Products' => $baseDir . '/compatibility/class-wcml-mix-and-match-products.php',
52
+ 'WCML_Multi_Currency' => $baseDir . '/inc/currencies/class-wcml-multi-currency.php',
53
+ 'WCML_Multi_Currency_Configuration' => $baseDir . '/inc/currencies/class-wcml-multi-currency-configuration.php',
54
+ 'WCML_Multi_Currency_Coupons' => $baseDir . '/inc/currencies/class-wcml-multi-currency-coupons.php',
55
+ 'WCML_Multi_Currency_Install' => $baseDir . '/inc/currencies/class-wcml-multi-currency-install.php',
56
+ 'WCML_Multi_Currency_Orders' => $baseDir . '/inc/currencies/class-wcml-multi-currency-orders.php',
57
+ 'WCML_Multi_Currency_Prices' => $baseDir . '/inc/currencies/class-wcml-multi-currency-prices.php',
58
+ 'WCML_Multi_Currency_Reports' => $baseDir . '/inc/currencies/class-wcml-multi-currency-reports.php',
59
+ 'WCML_Multi_Currency_Resources' => $baseDir . '/inc/currencies/class-wcml-multi-currency-resources.php',
60
+ 'WCML_Multi_Currency_Shipping' => $baseDir . '/inc/currencies/class-wcml-multi-currency-shipping.php',
61
+ 'WCML_Multi_Currency_Table_Rate_Shipping' => $baseDir . '/inc/currencies/class-wcml-multi-currency-table-rate-shipping.php',
62
+ 'WCML_Multi_Currency_UI' => $baseDir . '/inc/template-classes/class-wcml-multi-currency-ui.php',
63
+ 'WCML_Not_Translatable_Attributes' => $baseDir . '/inc/template-classes/class-wcml-not-translatable-attributes.php',
64
+ 'WCML_Orders' => $baseDir . '/inc/class-wcml-orders.php',
65
+ 'WCML_Per_Product_Shipping' => $baseDir . '/compatibility/class-wcml-per-product-shipping.php',
66
+ 'WCML_Plugins_Wrap' => $baseDir . '/inc/template-classes/class-wcml-plugins-wrap.php',
67
+ 'WCML_Product_Addons' => $baseDir . '/compatibility/class-wcml-product-addons.php',
68
+ 'WCML_Product_Bundles' => $baseDir . '/compatibility/class-wcml-product-bundles.php',
69
+ 'WCML_Products' => $baseDir . '/inc/class-wcml-products.php',
70
+ 'WCML_Products_Screen_Options' => $baseDir . '/inc/class-wcml-products-screen-options.php',
71
+ 'WCML_Products_UI' => $baseDir . '/inc/template-classes/class-wcml-products-ui.php',
72
+ 'WCML_Reports' => $baseDir . '/inc/class-wcml-reports.php',
73
+ 'WCML_Requests' => $baseDir . '/inc/class-wcml-requests.php',
74
+ 'WCML_Resources' => $baseDir . '/inc/class-wcml-resources.php',
75
+ 'WCML_Settings_UI' => $baseDir . '/inc/template-classes/class-wcml-settings-ui.php',
76
+ 'WCML_Setup' => $baseDir . '/inc/admin-menus/class-wcml-setup.php',
77
+ 'WCML_Setup_Attributes_UI' => $baseDir . '/inc/template-classes/setup/class-wcml-setup-attributes-ui.php',
78
+ 'WCML_Setup_Introduction_UI' => $baseDir . '/inc/template-classes/setup/class-wcml-setup-introduction-ui.php',
79
+ 'WCML_Setup_Multi_Currency_UI' => $baseDir . '/inc/template-classes/setup/class-wcml-setup-multi-currency-ui.php',
80
+ 'WCML_Setup_Ready_UI' => $baseDir . '/inc/template-classes/setup/class-wcml-setup-ready-ui.php',
81
+ 'WCML_Setup_Store_Pages_UI' => $baseDir . '/inc/template-classes/setup/class-wcml-setup-store-pages-ui.php',
82
+ 'WCML_Setup_Translation_Interface_UI' => $baseDir . '/inc/template-classes/setup/class-wcml-setup-translation-interface-ui.php',
83
+ 'WCML_Status_Config_Warnings_UI' => $baseDir . '/inc/template-classes/status/class-wcml-status-config-warnings-ui.php',
84
+ 'WCML_Status_Status_UI' => $baseDir . '/inc/template-classes/status/class-wcml-status-status-ui.php',
85
+ 'WCML_Status_Store_Pages_UI' => $baseDir . '/inc/template-classes/status/class-wcml-status-store-pages-ui.php',
86
+ 'WCML_Status_Taxonomies_UI' => $baseDir . '/inc/template-classes/status/class-wcml-status-taxonomies-ui.php',
87
+ 'WCML_Status_UI' => $baseDir . '/inc/template-classes/status/class-wcml-status-ui.php',
88
+ 'WCML_Store_Pages' => $baseDir . '/inc/class-wcml-store-pages.php',
89
+ 'WCML_Store_URLs_Edit_Base_UI' => $baseDir . '/inc/template-classes/store-urls/class-wcml-store-urls-edit-base-ui.php',
90
+ 'WCML_Store_URLs_Translation_Statuses_UI' => $baseDir . '/inc/template-classes/store-urls/class-wcml-store-urls-translation-statuses-ui.php',
91
+ 'WCML_Store_URLs_UI' => $baseDir . '/inc/template-classes/store-urls/class-wcml-store-urls-ui.php',
92
+ 'WCML_Sync_Taxonomy' => $baseDir . '/inc/template-classes/class-wcml-sync-taxonomy.php',
93
+ 'WCML_Synchronize_Product_Data' => $baseDir . '/inc/translation-editor/class-wcml-synchronize-product-data.php',
94
+ 'WCML_Synchronize_Variations_Data' => $baseDir . '/inc/translation-editor/class-wcml-synchronize-variations-data.php',
95
+ 'WCML_TP_Support' => $baseDir . '/inc/class-wcml-tp-support.php',
96
+ 'WCML_Tab_Manager' => $baseDir . '/compatibility/class-wcml-tab-manager.php',
97
+ 'WCML_Table_Rate_Shipping' => $baseDir . '/compatibility/class-wcml-table-rate-shipping.php',
98
+ 'WCML_Terms' => $baseDir . '/inc/class-wcml-terms.php',
99
+ 'WCML_Translation_Editor' => $baseDir . '/inc/translation-editor/class-wcml-translation-editor.php',
100
+ 'WCML_Troubleshooting' => $baseDir . '/inc/class-wcml-troubleshooting.php',
101
+ 'WCML_Troubleshooting_UI' => $baseDir . '/inc/template-classes/class-wcml-troubleshooting-ui.php',
102
+ 'WCML_Upgrade' => $baseDir . '/inc/class-wcml-upgrade.php',
103
+ 'WCML_Url_Translation' => $baseDir . '/inc/class-wcml-url-translation.php',
104
+ 'WCML_Variation_Swatches_and_Photos' => $baseDir . '/compatibility/class-wcml-variation-swatches-and-photos.php',
105
+ 'WCML_W3TC_Multi_Currency' => $baseDir . '/inc/currencies/class-wcml-w3tc-multi-currency.php',
106
+ 'WCML_WC_Ajax_Cart' => $baseDir . '/compatibility/class-wcml-wc-ajax-cart.php',
107
+ 'WCML_WC_Gateways' => $baseDir . '/inc/class-wcml-wc-gateways.php',
108
+ 'WCML_WC_Name_Your_Price' => $baseDir . '/compatibility/class-wcml-wc-name-your-price.php',
109
+ 'WCML_WC_Shipping' => $baseDir . '/inc/class-wcml-wc-shipping.php',
110
+ 'WCML_WC_Strings' => $baseDir . '/inc/class-wcml-wc-strings.php',
111
+ 'WCML_WC_Subscriptions' => $baseDir . '/compatibility/class-wcml-wc-subscriptions.php',
112
+ 'WCML_WPSEO' => $baseDir . '/compatibility/class-wcml-wpseo.php',
113
+ 'WCML_WooCommerce_Rest_API_Support' => $baseDir . '/inc/class-wcml-woocommerce-rest-api-support.php',
114
+ 'WCML_gravityforms' => $baseDir . '/compatibility/class-wcml-gravityforms.php',
115
+ 'WCML_sensei' => $baseDir . '/compatibility/class-wcml-sensei.php',
116
+ 'WCML_wcExporter' => $baseDir . '/compatibility/class-wcml-wcexporter.php',
117
+ 'WCML_xDomain_Data' => $baseDir . '/inc/class-wcml-xdomain-data.php',
118
+ 'WPML_Templates_Factory' => $baseDir . '/inc/template-classes/class-wpml-templates-factory.php',
119
+ 'woocommerce_wpml' => $baseDir . '/inc/class-woocommerce-wpml.php',
120
+ );
embedded/composer/autoload_namespaces.php ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // autoload_namespaces.php @generated by Composer
4
+
5
+ $vendorDir = dirname(dirname(__FILE__));
6
+ $baseDir = dirname($vendorDir);
7
+
8
+ return array(
9
+ 'xrstf\\Composer52' => array($vendorDir . '/xrstf/composer-php52/lib'),
10
+ );
embedded/composer/autoload_psr4.php ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // autoload_psr4.php @generated by Composer
4
+
5
+ $vendorDir = dirname(dirname(__FILE__));
6
+ $baseDir = dirname($vendorDir);
7
+
8
+ return array(
9
+ 'Composer\\Installers\\' => array($vendorDir . '/composer/installers/src/Composer/Installers'),
10
+ );
embedded/composer/autoload_real.php ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // autoload_real.php @generated by Composer
4
+
5
+ class ComposerAutoloaderInit655bc99a48b2de2700adf0e1886e5b25
6
+ {
7
+ private static $loader;
8
+
9
+ public static function loadClassLoader($class)
10
+ {
11
+ if ('Composer\Autoload\ClassLoader' === $class) {
12
+ require __DIR__ . '/ClassLoader.php';
13
+ }
14
+ }
15
+
16
+ public static function getLoader()
17
+ {
18
+ if (null !== self::$loader) {
19
+ return self::$loader;
20
+ }
21
+
22
+ spl_autoload_register(array('ComposerAutoloaderInit655bc99a48b2de2700adf0e1886e5b25', 'loadClassLoader'), true, true);
23
+ self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
+ spl_autoload_unregister(array('ComposerAutoloaderInit655bc99a48b2de2700adf0e1886e5b25', 'loadClassLoader'));
25
+
26
+ $map = require __DIR__ . '/autoload_namespaces.php';
27
+ foreach ($map as $namespace => $path) {
28
+ $loader->set($namespace, $path);
29
+ }
30
+
31
+ $map = require __DIR__ . '/autoload_psr4.php';
32
+ foreach ($map as $namespace => $path) {
33
+ $loader->setPsr4($namespace, $path);
34
+ }
35
+
36
+ $classMap = require __DIR__ . '/autoload_classmap.php';
37
+ if ($classMap) {
38
+ $loader->addClassMap($classMap);
39
+ }
40
+
41
+ $loader->register(true);
42
+
43
+ return $loader;
44
+ }
45
+ }
embedded/composer/autoload_real_52.php ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // autoload_real_52.php generated by xrstf/composer-php52
4
+
5
+ class ComposerAutoloaderInitddf8a94c2f6108e93d177a18dcd16dc9 {
6
+ private static $loader;
7
+
8
+ public static function loadClassLoader($class) {
9
+ if ('xrstf_Composer52_ClassLoader' === $class) {
10
+ require dirname(__FILE__).'/ClassLoader52.php';
11
+ }
12
+ }
13
+
14
+ /**
15
+ * @return xrstf_Composer52_ClassLoader
16
+ */
17
+ public static function getLoader() {
18
+ if (null !== self::$loader) {
19
+ return self::$loader;
20
+ }
21
+
22
+ spl_autoload_register(array('ComposerAutoloaderInitddf8a94c2f6108e93d177a18dcd16dc9', 'loadClassLoader'), true /*, true */);
23
+ self::$loader = $loader = new xrstf_Composer52_ClassLoader();
24
+ spl_autoload_unregister(array('ComposerAutoloaderInitddf8a94c2f6108e93d177a18dcd16dc9', 'loadClassLoader'));
25
+
26
+ $vendorDir = dirname(dirname(__FILE__));
27
+ $baseDir = dirname($vendorDir);
28
+ $dir = dirname(__FILE__);
29
+
30
+ $map = require $dir.'/autoload_namespaces.php';
31
+ foreach ($map as $namespace => $path) {
32
+ $loader->add($namespace, $path);
33
+ }
34
+
35
+ $classMap = require $dir.'/autoload_classmap.php';
36
+ if ($classMap) {
37
+ $loader->addClassMap($classMap);
38
+ }
39
+
40
+ $loader->register(true);
41
+
42
+ return $loader;
43
+ }
44
+ }
embedded/composer/installed.json ADDED
@@ -0,0 +1,186 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "name": "composer/installers",
4
+ "version": "v1.0.25",
5
+ "version_normalized": "1.0.25.0",
6
+ "source": {
7
+ "type": "git",
8
+ "url": "https://github.com/composer/installers.git",
9
+ "reference": "36e5b5843203d7f1cf6ffb0305a97e014387bd8e"
10
+ },
11
+ "dist": {
12
+ "type": "zip",
13
+ "url": "https://api.github.com/repos/composer/installers/zipball/36e5b5843203d7f1cf6ffb0305a97e014387bd8e",
14
+ "reference": "36e5b5843203d7f1cf6ffb0305a97e014387bd8e",
15
+ "shasum": ""
16
+ },
17
+ "require": {
18
+ "composer-plugin-api": "^1.0"
19
+ },
20
+ "replace": {
21
+ "roundcube/plugin-installer": "*",
22
+ "shama/baton": "*"
23
+ },
24
+ "require-dev": {
25
+ "composer/composer": "1.0.*@dev",
26
+ "phpunit/phpunit": "4.1.*"
27
+ },
28
+ "time": "2016-04-13 19:46:30",
29
+ "type": "composer-plugin",
30
+ "extra": {
31
+ "class": "Composer\\Installers\\Plugin",
32
+ "branch-alias": {
33
+ "dev-master": "1.0-dev"
34
+ }
35
+ },
36
+ "installation-source": "dist",
37
+ "autoload": {
38
+ "psr-4": {
39
+ "Composer\\Installers\\": "src/Composer/Installers"
40
+ }
41
+ },
42
+ "notification-url": "https://packagist.org/downloads/",
43
+ "license": [
44
+ "MIT"
45
+ ],
46
+ "authors": [
47
+ {
48
+ "name": "Kyle Robinson Young",
49
+ "email": "kyle@dontkry.com",
50
+ "homepage": "https://github.com/shama"
51
+ }
52
+ ],
53
+ "description": "A multi-framework Composer library installer",
54
+ "homepage": "https://composer.github.io/installers/",
55
+ "keywords": [
56
+ "Craft",
57
+ "Dolibarr",
58
+ "Hurad",
59
+ "ImageCMS",
60
+ "MODX Evo",
61
+ "Mautic",
62
+ "OXID",
63
+ "SMF",
64
+ "Thelia",
65
+ "WolfCMS",
66
+ "agl",
67
+ "aimeos",
68
+ "annotatecms",
69
+ "bitrix",
70
+ "cakephp",
71
+ "chef",
72
+ "codeigniter",
73
+ "concrete5",
74
+ "croogo",
75
+ "dokuwiki",
76
+ "drupal",
77
+ "elgg",
78
+ "fuelphp",
79
+ "grav",
80
+ "installer",
81
+ "joomla",
82
+ "kohana",
83
+ "laravel",
84
+ "lithium",
85
+ "magento",
86
+ "mako",
87
+ "mediawiki",
88
+ "modulework",
89
+ "moodle",
90
+ "phpbb",
91
+ "piwik",
92
+ "ppi",
93
+ "puppet",
94
+ "roundcube",
95
+ "shopware",
96
+ "silverstripe",
97
+ "symfony",
98
+ "typo3",
99
+ "wordpress",
100
+ "zend",
101
+ "zikula"
102
+ ]
103
+ },
104
+ {
105
+ "name": "otgs/installer",
106
+ "version": "1.7.8",
107
+ "version_normalized": "1.7.8.0",
108
+ "source": {
109
+ "type": "git",
110
+ "url": "ssh://git@git.onthegosystems.com:10022/installer/installer.git",
111
+ "reference": "4cb8b5d137963fd591fffdbb02357ef95541e66d"
112
+ },
113
+ "require": {
114
+ "composer/installers": "~1.0",
115
+ "php": ">=5.2.0"
116
+ },
117
+ "require-dev": {
118
+ "phpunit/phpunit": "~4.5"
119
+ },
120
+ "time": "2016-05-23 07:48:35",
121
+ "type": "wordpress-plugin",
122
+ "extra": {
123
+ "branch-alias": {
124
+ "dev-master": "1.7.x-dev",
125
+ "dev-develop": "1.7.x-dev"
126
+ }
127
+ },
128
+ "installation-source": "source",
129
+ "scripts": {
130
+ "test": [
131
+ "phpunit"
132
+ ]
133
+ },
134
+ "license": [
135
+ "GPL-2.0"
136
+ ],
137
+ "authors": [
138
+ {
139
+ "name": "Mihai Grigori",
140
+ "email": "mihai@wpml.org",
141
+ "homepage": "http://www.wp-types.com"
142
+ }
143
+ ],
144
+ "description": "Installs and updates WPML and Toolset dependencies automatically",
145
+ "homepage": "https://git.onthegosystems.com/installer/installer",
146
+ "keywords": [
147
+ "install",
148
+ "plugins",
149
+ "update",
150
+ "utils"
151
+ ]
152
+ },
153
+ {
154
+ "name": "xrstf/composer-php52",
155
+ "version": "v1.0.20",
156
+ "version_normalized": "1.0.20.0",
157
+ "source": {
158
+ "type": "git",
159
+ "url": "https://github.com/composer-php52/composer-php52.git",
160
+ "reference": "bd41459d5e27df8d33057842b32377c39e97a5a8"
161
+ },
162
+ "dist": {
163
+ "type": "zip",
164
+ "url": "https://api.github.com/repos/composer-php52/composer-php52/zipball/bd41459d5e27df8d33057842b32377c39e97a5a8",
165
+ "reference": "bd41459d5e27df8d33057842b32377c39e97a5a8",
166
+ "shasum": ""
167
+ },
168
+ "time": "2016-04-16 21:52:24",
169
+ "type": "library",
170
+ "extra": {
171
+ "branch-alias": {
172
+ "dev-default": "1.x-dev"
173
+ }
174
+ },
175
+ "installation-source": "dist",
176
+ "autoload": {
177
+ "psr-0": {
178
+ "xrstf\\Composer52": "lib/"
179
+ }
180
+ },
181
+ "notification-url": "https://packagist.org/downloads/",
182
+ "license": [
183
+ "MIT"
184
+ ]
185
+ }
186
+ ]
embedded/composer/installers/.editorconfig ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ ; top-most EditorConfig file
2
+ root = true
3
+
4
+ ; Unix-style newlines
5
+ [*]
6
+ end_of_line = LF
7
+
8
+ [*.php]
9
+ indent_style = space
10
+ indent_size = 4
embedded/composer/installers/.travis.yml ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ language: php
2
+
3
+ php:
4
+ - 5.3
5
+ - 5.4
6
+ - 5.5
7
+ - 5.6
8
+ - 7.0
9
+ - hhvm
10
+
11
+ matrix:
12
+ fast_finish: true
13
+ allow_failures:
14
+ - php: 7.0
15
+
16
+ before_script:
17
+ - composer self-update
18
+ - composer install
19
+
20
+ script:
21
+ - composer test
embedded/composer/installers/LICENSE ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Copyright (c) 2012 Kyle Robinson Young
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is furnished
8
+ to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
embedded/composer/installers/README.md ADDED
@@ -0,0 +1,210 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # A Multi-Framework [Composer](http://getcomposer.org) Library Installer
2
+
3
+ [![Build Status](http://img.shields.io/travis/composer/installers.svg)](http://travis-ci.org/composer/installers)
4
+
5
+ This is for PHP package authors to require in their `composer.json`. It will
6
+ install their package to the correct location based on the specified package
7
+ type.
8
+
9
+ The goal of `installers` is to be a simple package type to install path map.
10
+ Users can also customize the install path per package and package authors can
11
+ modify the package name upon installing.
12
+
13
+ `installers` isn't intended on replacing all custom installers. If your
14
+ package requires special installation handling then by all means, create a
15
+ custom installer to handle it.
16
+
17
+ **Natively Supported Frameworks**:
18
+
19
+ The following frameworks natively work with Composer and will be
20
+ installed to the default `vendor` directory. `composer/installers`
21
+ is not needed to install packages with these frameworks:
22
+
23
+ * Aura
24
+ * Symfony2
25
+ * Yii
26
+ * Yii2
27
+
28
+ **Current Supported Package Types**:
29
+
30
+ > Stable types are marked as **bold**, this means that installation paths
31
+ > for those type will not be changed. Any adjustment for those types would
32
+ > require creation of brand new type that will cover required changes.
33
+
34
+ | Framework | Types
35
+ | --------- | -----
36
+ | Aimeos | `aimeos-extension`
37
+ | Asgard | `asgard-module`<br>`asgard-theme`
38
+ | AGL | `agl-module`
39
+ | Bonefish | `bonefish-package`
40
+ | AnnotateCms | `annotatecms-module`<br>`annotatecms-component`<br>`annotatecms-service`
41
+ | Bitrix | `bitrix-module`<br>`bitrix-component`<br>`bitrix-theme`
42
+ | CakePHP 2+ | **`cakephp-plugin`**
43
+ | Chef | `chef-cookbook`<br>`chef-role`
44
+ | CCFramework | `ccframework-ship`<br>`ccframework-theme`
45
+ | CodeIgniter | `codeigniter-library`<br>`codeigniter-third-party`<br>`codeigniter-module`
46
+ | concrete5 | `concrete5-block`<br>`concrete5-package`<br>`concrete5-theme`<br>`concrete5-update`
47
+ | Craft | `craft-plugin`
48
+ | Croogo | `croogo-plugin`<br>`croogo-theme`
49
+ | DokuWiki | `dokuwiki-plugin`<br>`dokuwiki-template`
50
+ | Dolibarr | `dolibarr-module`
51
+ | Drupal | <b>`drupal-core`<br>`drupal-module`<br>`drupal-theme`</b><br>`drupal-library`<br>`drupal-profile`<br>`drupal-drush`
52
+ | Elgg | `elgg-plugin`
53
+ | FuelPHP v1.x | `fuel-module`<br>`fuel-package`<br/>`fuel-theme`
54
+ | FuelPHP v2.x | `fuelphp-component`
55
+ | Grav | `grav-plugin`<br>`grav-theme`
56
+ | Hurad | `hurad-plugin`<br>`hurad-theme`
57
+ | ImageCMS | `imagecms-template`<br>`imagecms-module`<br>`imagecms-library`
58
+ | Joomla | `joomla-component`<br>`joomla-module`<br>`joomla-template`<br>`joomla-plugin`<br>`joomla-library`
59
+ | Kirby | **`kirby-plugin`**<br>`kirby-field`<br>`kirby-tag`
60
+ | KodiCMS | `kodicms-plugin`<br>`kodicms-media`
61
+ | Kohana | **`kohana-module`**
62
+ | Laravel | `laravel-library`
63
+ | Lithium | **`lithium-library`<br>`lithium-source`**
64
+ | Magento | `magento-library`<br>`magento-skin`<br>`magento-theme`
65
+ | Mako | `mako-package`
66
+ | Mautic | `mautic-plugin`<br>`mautic-theme`
67
+ | MODX Evo | `modxevo-snippet`<br>`modxevo-plugin`<br>`modxevo-module`<br>`modxevo-template`<br>`modxevo-lib`
68
+ | MediaWiki | `mediawiki-extension`
69
+ | October | **`october-module`<br>`october-plugin`<br>`october-theme`**
70
+ | OXID | `oxid-module`<br>`oxid-theme`<br>`oxid-out`
71
+ | MODULEWork | `modulework-module`
72
+ | Moodle | `moodle-*` (Please [check source](https://raw.githubusercontent.com/composer/installers/master/src/Composer/Installers/MoodleInstaller.php) for all supported types)
73
+ | Piwik | `piwik-plugin`
74
+ | phpBB | `phpbb-extension`<br>`phpbb-style`<br>`phpbb-language`
75
+ | Pimcore | `pimcore-plugin`
76
+ | PPI | **`ppi-module`**
77
+ | Puppet | `puppet-module`
78
+ | REDAXO | `redaxo-addon`
79
+ | Roundcube | `roundcube-plugin`
80
+ | shopware | `shopware-backend-plugin`<br/>`shopware-core-plugin`<br/>`shopware-frontend-plugin`<br/>`shopware-theme`
81
+ | SilverStripe | `silverstripe-module`<br>`silverstripe-theme`
82
+ | SMF | `smf-module`<br>`smf-theme`
83
+ | symfony1 | **`symfony1-plugin`**
84
+ | Tusk | `tusk-task`<br>`tusk-command`<br>`tusk-asset`
85
+ | TYPO3 Flow | `typo3-flow-package`<br>`typo3-flow-framework`<br>`typo3-flow-plugin`<br>`typo3-flow-site`<br>`typo3-flow-boilerplate`<br>`typo3-flow-build`
86
+ | TYPO3 CMS | `typo3-cms-extension` (Deprecated in this package, use the [TYPO3 CMS Installers](https://packagist.org/packages/typo3/cms-composer-installers) instead)
87
+ | Wolf CMS | `wolfcms-plugin`
88
+ | WordPress | <b>`wordpress-plugin`<br>`wordpress-theme`</b><br>`wordpress-muplugin`
89
+ | Zend | `zend-library`<br>`zend-extra`<br>`zend-module`
90
+ | Zikula | `zikula-module`<br>`zikula-theme`
91
+ | Prestashop | `prestashop-module`<br>`prestashop-theme`
92
+
93
+ ## Example `composer.json` File
94
+
95
+ This is an example for a CakePHP plugin. The only important parts to set in your
96
+ composer.json file are `"type": "cakephp-plugin"` which describes what your
97
+ package is and `"require": { "composer/installers": "~1.0" }` which tells composer
98
+ to load the custom installers.
99
+
100
+ ```json
101
+ {
102
+ "name": "you/ftp",
103
+ "type": "cakephp-plugin",
104
+ "require": {
105
+ "composer/installers": "~1.0"
106
+ }
107
+ }
108
+ ```
109
+
110
+ This would install your package to the `Plugin/Ftp/` folder of a CakePHP app
111
+ when a user runs `php composer.phar install`.
112
+
113
+ So submit your packages to [packagist.org](http://packagist.org)!
114
+
115
+ ## Custom Install Paths
116
+
117
+ If you are consuming a package that uses the `composer/installers` you can
118
+ override the install path with the following extra in your `composer.json`:
119
+
120
+ ```json
121
+ {
122
+ "extra": {
123
+ "installer-paths": {
124
+ "your/custom/path/{$name}/": ["shama/ftp", "vendor/package"]
125
+ }
126
+ }
127
+ }
128
+ ```
129
+
130
+ A package type can have a custom installation path with a `type:` prefix.
131
+
132
+ ``` json
133
+ {
134
+ "extra": {
135
+ "installer-paths": {
136
+ "your/custom/path/{$name}/": ["type:wordpress-plugin"]
137
+ }
138
+ }
139
+ }
140
+ ```
141
+
142
+ You can also have the same vendor packages with a custom installation path by
143
+ using the `vendor:` prefix.
144
+
145
+ ``` json
146
+ {
147
+ "extra": {
148
+ "installer-paths": {
149
+ "your/custom/path/{$name}/": ["vendor:my_organization"]
150
+ }
151
+ }
152
+ }
153
+ ```
154
+
155
+ These would use your custom path for each of the listed packages. The available
156
+ variables to use in your paths are: `{$name}`, `{$vendor}`, `{$type}`.
157
+
158
+ ## Custom Install Names
159
+
160
+ If you're a package author and need your package to be named differently when
161
+ installed consider using the `installer-name` extra.
162
+
163
+ For example you have a package named `shama/cakephp-ftp` with the type
164
+ `cakephp-plugin`. Installing with `composer/installers` would install to the
165
+ path `Plugin/CakephpFtp`. Due to the strict naming conventions, you as a
166
+ package author actually need the package to be named and installed to
167
+ `Plugin/Ftp`. Using the following config within your **package** `composer.json`
168
+ will allow this:
169
+
170
+ ```json
171
+ {
172
+ "name": "shama/cakephp-ftp",
173
+ "type": "cakephp-plugin",
174
+ "extra": {
175
+ "installer-name": "Ftp"
176
+ }
177
+ }
178
+ ```
179
+
180
+ Please note the name entered into `installer-name` will be the final and will
181
+ not be inflected.
182
+
183
+ ## Contribute!
184
+
185
+ * [Fork and clone](https://help.github.com/articles/fork-a-repo).
186
+ * Run the command `php composer.phar install` to install the dependencies.
187
+ This will also install the dev dependencies. See [Composer](https://getcomposer.org/doc/03-cli.md#install).
188
+ * Use the command `phpunit` to run the tests. See [PHPUnit](http://phpunit.de).
189
+ * Create a branch, commit, push and send us a
190
+ [pull request](https://help.github.com/articles/using-pull-requests).
191
+
192
+ To ensure a consistent code base, you should make sure the code follows the
193
+ [Coding Standards](http://symfony.com/doc/2.0/contributing/code/standards.html)
194
+ which we borrowed from Symfony.
195
+
196
+ If you would like to help, please take a look at the list of
197
+ [issues](https://github.com/composer/installers/issues).
198
+
199
+ ### Should we allow dynamic package types or paths? No.
200
+ What are they? The ability for a package author to determine where a package
201
+ will be installed either through setting the path directly in their
202
+ `composer.json` or through a dynamic package type: `"type":
203
+ "framework-install-here"`.
204
+
205
+ It has been proposed many times. Even implemented once early on and then
206
+ removed. `installers` won't do this because it would allow a single package
207
+ author to wipe out entire folders without the user's consent. That user would
208
+ then come here to yell at us.
209
+
210
+ Anyone still wanting this capability should consider requiring https://github.com/oomphinc/composer-installers-extender.
embedded/composer/installers/composer.json ADDED
@@ -0,0 +1,85 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "composer/installers",
3
+ "type": "composer-plugin",
4
+ "license": "MIT",
5
+ "description": "A multi-framework Composer library installer",
6
+ "keywords": [
7
+ "installer",
8
+ "Aimeos",
9
+ "AGL",
10
+ "AnnotateCms",
11
+ "Bitrix",
12
+ "CakePHP",
13
+ "Chef",
14
+ "CodeIgniter",
15
+ "concrete5",
16
+ "Craft",
17
+ "Croogo",
18
+ "DokuWiki",
19
+ "Dolibarr",
20
+ "Drupal",
21
+ "Elgg",
22
+ "FuelPHP",
23
+ "Grav",
24
+ "Hurad",
25
+ "ImageCMS",
26
+ "Joomla",
27
+ "Kohana",
28
+ "Laravel",
29
+ "Lithium",
30
+ "Magento",
31
+ "Mako",
32
+ "Mautic",
33
+ "MODX Evo",
34
+ "MediaWiki",
35
+ "OXID",
36
+ "MODULEWork",
37
+ "Moodle",
38
+ "Piwik",
39
+ "phpBB",
40
+ "PPI",
41
+ "Puppet",
42
+ "Roundcube",
43
+ "shopware",
44
+ "SilverStripe",
45
+ "SMF",
46
+ "symfony",
47
+ "Thelia",
48
+ "TYPO3",
49
+ "WolfCMS",
50
+ "WordPress",
51
+ "Zend",
52
+ "Zikula"
53
+ ],
54
+ "homepage": "https://composer.github.io/installers/",
55
+ "authors": [
56
+ {
57
+ "name": "Kyle Robinson Young",
58
+ "email": "kyle@dontkry.com",
59
+ "homepage": "https://github.com/shama"
60
+ }
61
+ ],
62
+ "autoload": {
63
+ "psr-4": { "Composer\\Installers\\": "src/Composer/Installers" }
64
+ },
65
+ "extra": {
66
+ "class": "Composer\\Installers\\Plugin",
67
+ "branch-alias": {
68
+ "dev-master": "1.0-dev"
69
+ }
70
+ },
71
+ "replace": {
72
+ "shama/baton": "*",
73
+ "roundcube/plugin-installer": "*"
74
+ },
75
+ "require": {
76
+ "composer-plugin-api": "^1.0"
77
+ },
78
+ "require-dev": {
79
+ "composer/composer": "1.0.*@dev",
80
+ "phpunit/phpunit": "4.1.*"
81
+ },
82
+ "scripts": {
83
+ "test": "phpunit"
84
+ }
85
+ }
embedded/composer/installers/phpunit.xml.dist ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+
3
+ <phpunit backupGlobals="false"
4
+ backupStaticAttributes="false"
5
+ colors="true"
6
+ convertErrorsToExceptions="true"
7
+ convertNoticesToExceptions="true"
8
+ convertWarningsToExceptions="true"
9
+ processIsolation="false"
10
+ stopOnFailure="false"
11
+ syntaxCheck="false"
12
+ bootstrap="tests/bootstrap.php"
13
+ >
14
+ <testsuites>
15
+ <testsuite name="Installers Test Suite">
16
+ <directory>tests/Composer/Installers</directory>
17
+ </testsuite>
18
+ </testsuites>
19
+
20
+ <filter>
21
+ <whitelist>
22
+ <directory>src/Composer/Installers</directory>
23
+ </whitelist>
24
+ </filter>
25
+ </phpunit>
embedded/composer/installers/src/Composer/Installers/AglInstaller.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ class AglInstaller extends BaseInstaller
5
+ {
6
+ protected $locations = array(
7
+ 'module' => 'More/{$name}/',
8
+ );
9
+
10
+ /**
11
+ * Format package name to CamelCase
12
+ */
13
+ public function inflectPackageVars($vars)
14
+ {
15
+ $vars['name'] = preg_replace_callback('/(?:^|_|-)(.?)/', function ($matches) {
16
+ return strtoupper($matches[1]);
17
+ }, $vars['name']);
18
+
19
+ return $vars;
20
+ }
21
+ }
embedded/composer/installers/src/Composer/Installers/AimeosInstaller.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ class AimeosInstaller extends BaseInstaller
5
+ {
6
+ protected $locations = array(
7
+ 'extension' => 'ext/{$name}/',
8
+ );
9
+ }
embedded/composer/installers/src/Composer/Installers/AnnotateCmsInstaller.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ class AnnotateCmsInstaller extends BaseInstaller
5
+ {
6
+ protected $locations = array(
7
+ 'module' => 'addons/modules/{$name}/',
8
+ 'component' => 'addons/components/{$name}/',
9
+ 'service' => 'addons/services/{$name}/',
10
+ );
11
+ }
embedded/composer/installers/src/Composer/Installers/AsgardInstaller.php ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ class AsgardInstaller extends BaseInstaller
5
+ {
6
+ protected $locations = array(
7
+ 'module' => 'Modules/{$name}/',
8
+ 'theme' => 'Themes/{$name}/'
9
+ );
10
+
11
+ /**
12
+ * Format package name.
13
+ *
14
+ * For package type asgard-module, cut off a trailing '-plugin' if present.
15
+ *
16
+ * For package type asgard-theme, cut off a trailing '-theme' if present.
17
+ *
18
+ */
19
+ public function inflectPackageVars($vars)
20
+ {
21
+ if ($vars['type'] === 'asgard-module') {
22
+ return $this->inflectPluginVars($vars);
23
+ }
24
+
25
+ if ($vars['type'] === 'asgard-theme') {
26
+ return $this->inflectThemeVars($vars);
27
+ }
28
+
29
+ return $vars;
30
+ }
31
+
32
+ protected function inflectPluginVars($vars)
33
+ {
34
+ $vars['name'] = ucfirst(preg_replace('/-module/', '', $vars['name']));
35
+
36
+ return $vars;
37
+ }
38
+
39
+ protected function inflectThemeVars($vars)
40
+ {
41
+ $vars['name'] = ucfirst(preg_replace('/-theme$/', '', $vars['name']));
42
+
43
+ return $vars;
44
+ }
45
+ }
embedded/composer/installers/src/Composer/Installers/BaseInstaller.php ADDED
@@ -0,0 +1,136 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ use Composer\IO\IOInterface;
5
+ use Composer\Composer;
6
+ use Composer\Package\PackageInterface;
7
+
8
+ abstract class BaseInstaller
9
+ {
10
+ protected $locations = array();
11
+ protected $composer;
12
+ protected $package;
13
+ protected $io;
14
+
15
+ /**
16
+ * Initializes base installer.
17
+ *
18
+ * @param PackageInterface $package
19
+ * @param Composer $composer
20
+ * @param IOInterface $io
21
+ */
22
+ public function __construct(PackageInterface $package = null, Composer $composer = null, IOInterface $io = null)
23
+ {
24
+ $this->composer = $composer;
25
+ $this->package = $package;
26
+ $this->io = $io;
27
+ }
28
+
29
+ /**
30
+ * Return the install path based on package type.
31
+ *
32
+ * @param PackageInterface $package
33
+ * @param string $frameworkType
34
+ * @return string
35
+ */
36
+ public function getInstallPath(PackageInterface $package, $frameworkType = '')
37
+ {
38
+ $type = $this->package->getType();
39
+
40
+ $prettyName = $this->package->getPrettyName();
41
+ if (strpos($prettyName, '/') !== false) {
42
+ list($vendor, $name) = explode('/', $prettyName);
43
+ } else {
44
+ $vendor = '';
45
+ $name = $prettyName;
46
+ }
47
+
48
+ $availableVars = $this->inflectPackageVars(compact('name', 'vendor', 'type'));
49
+
50
+ $extra = $package->getExtra();
51
+ if (!empty($extra['installer-name'])) {
52
+ $availableVars['name'] = $extra['installer-name'];
53
+ }
54
+
55
+ if ($this->composer->getPackage()) {
56
+ $extra = $this->composer->getPackage()->getExtra();
57
+ if (!empty($extra['installer-paths'])) {
58
+ $customPath = $this->mapCustomInstallPaths($extra['installer-paths'], $prettyName, $type, $vendor);
59
+ if ($customPath !== false) {
60
+ return $this->templatePath($customPath, $availableVars);
61
+ }
62
+ }
63
+ }
64
+
65
+ $packageType = substr($type, strlen($frameworkType) + 1);
66
+ $locations = $this->getLocations();
67
+ if (!isset($locations[$packageType])) {
68
+ throw new \InvalidArgumentException(sprintf('Package type "%s" is not supported', $type));
69
+ }
70
+
71
+ return $this->templatePath($locations[$packageType], $availableVars);
72
+ }
73
+
74
+ /**
75
+ * For an installer to override to modify the vars per installer.
76
+ *
77
+ * @param array $vars
78
+ * @return array
79
+ */
80
+ public function inflectPackageVars($vars)
81
+ {
82
+ return $vars;
83
+ }
84
+
85
+ /**
86
+ * Gets the installer's locations
87
+ *
88
+ * @return array
89
+ */
90
+ public function getLocations()
91
+ {
92
+ return $this->locations;
93
+ }
94
+
95
+ /**
96
+ * Replace vars in a path
97
+ *
98
+ * @param string $path
99
+ * @param array $vars
100
+ * @return string
101
+ */
102
+ protected function templatePath($path, array $vars = array())
103
+ {
104
+ if (strpos($path, '{') !== false) {
105
+ extract($vars);
106
+ preg_match_all('@\{\$([A-Za-z0-9_]*)\}@i', $path, $matches);
107
+ if (!empty($matches[1])) {
108
+ foreach ($matches[1] as $var) {
109
+ $path = str_replace('{$' . $var . '}', $$var, $path);
110
+ }
111
+ }
112
+ }
113
+
114
+ return $path;
115
+ }
116
+
117
+ /**
118
+ * Search through a passed paths array for a custom install path.
119
+ *
120
+ * @param array $paths
121
+ * @param string $name
122
+ * @param string $type
123
+ * @param string $vendor = NULL
124
+ * @return string
125
+ */
126
+ protected function mapCustomInstallPaths(array $paths, $name, $type, $vendor = NULL)
127
+ {
128
+ foreach ($paths as $path => $names) {
129
+ if (in_array($name, $names) || in_array('type:' . $type, $names) || in_array('vendor:' . $vendor, $names)) {
130
+ return $path;
131
+ }
132
+ }
133
+
134
+ return false;
135
+ }
136
+ }
embedded/composer/installers/src/Composer/Installers/BitrixInstaller.php ADDED
@@ -0,0 +1,123 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Composer\Installers;
4
+
5
+ use Composer\Util\Filesystem;
6
+
7
+ /**
8
+ * Installer for Bitrix Framework. Supported types of extensions:
9
+ * - `bitrix-module` — copy the module to directory `bitrix/modules/` directory.
10
+ * - `bitrix-component` — copy the component to directory `bitrix/components/`.
11
+ * - `bitrix-template` — copy the template to directory `bitrix/templates/`.
12
+ *
13
+ * You can set custom path to directory with Bitrix kernel in `composer.json`:
14
+ *
15
+ * ```json
16
+ * {
17
+ * "extra": {
18
+ * "bitrix-dir": "s1/bitrix"
19
+ * }
20
+ * }
21
+ * ```
22
+ *
23
+ * @author Nik Samokhvalov <nik@samokhvalov.info>
24
+ * @author Denis Kulichkin <onexhovia@gmail.com>
25
+ */
26
+ class BitrixInstaller extends BaseInstaller
27
+ {
28
+ protected $locations = array(
29
+ 'module' => '{$bitrix_dir}/modules/{$name}/',
30
+ 'component' => '{$bitrix_dir}/components/{$name}/',
31
+ 'theme' => '{$bitrix_dir}/templates/{$name}/',
32
+ );
33
+
34
+ /**
35
+ * @var array Storage for informations about duplicates at all the time of installation packages.
36
+ */
37
+ private static $checkedDuplicates = array();
38
+
39
+ /**
40
+ * {@inheritdoc}
41
+ */
42
+ public function inflectPackageVars($vars)
43
+ {
44
+ if ($this->composer->getPackage()) {
45
+ $extra = $this->composer->getPackage()->getExtra();
46
+
47
+ if (isset($extra['bitrix-dir'])) {
48
+ $vars['bitrix_dir'] = $extra['bitrix-dir'];
49
+ }
50
+ }
51
+
52
+ if (!isset($vars['bitrix_dir'])) {
53
+ $vars['bitrix_dir'] = 'bitrix';
54
+ }
55
+
56
+ return parent::inflectPackageVars($vars);
57
+ }
58
+
59
+ /**
60
+ * {@inheritdoc}
61
+ */
62
+ protected function templatePath($path, array $vars = array())
63
+ {
64
+ $templatePath = parent::templatePath($path, $vars);
65
+ $this->checkDuplicates($templatePath, $vars);
66
+
67
+ return $templatePath;
68
+ }
69
+
70
+ /**
71
+ * Duplicates search packages.
72
+ *
73
+ * @param string $path
74
+ * @param array $vars
75
+ */
76
+ protected function checkDuplicates($path, array $vars = array())
77
+ {
78
+ $packageType = substr($vars['type'], strlen('bitrix') + 1);
79
+ $localDir = explode('/', $vars['bitrix_dir']);
80
+ array_pop($localDir);
81
+ $localDir[] = 'local';
82
+ $localDir = implode('/', $localDir);
83
+
84
+ $oldPath = str_replace(
85
+ array('{$bitrix_dir}', '{$name}'),
86
+ array($localDir, $vars['name']),
87
+ $this->locations[$packageType]
88
+ );
89
+
90
+ if (in_array($oldPath, static::$checkedDuplicates)) {
91
+ return;
92
+ }
93
+
94
+ if ($oldPath !== $path && file_exists($oldPath) && $this->io && $this->io->isInteractive()) {
95
+
96
+ $this->io->writeError(' <error>Duplication of packages:</error>');
97
+ $this->io->writeError(' <info>Package ' . $oldPath . ' will be called instead package ' . $path . '</info>');
98
+
99
+ while (true) {
100
+ switch ($this->io->ask(' <info>Delete ' . $oldPath . ' [y,n,?]?</info> ', '?')) {
101
+ case 'y':
102
+ $fs = new Filesystem();
103
+ $fs->removeDirectory($oldPath);
104
+ break 2;
105
+
106
+ case 'n':
107
+ break 2;
108
+
109
+ case '?':
110
+ default:
111
+ $this->io->writeError(array(
112
+ ' y - delete package ' . $oldPath . ' and to continue with the installation',
113
+ ' n - don\'t delete and to continue with the installation',
114
+ ));
115
+ $this->io->writeError(' ? - print help');
116
+ break;
117
+ }
118
+ }
119
+ }
120
+
121
+ static::$checkedDuplicates[] = $oldPath;
122
+ }
123
+ }
embedded/composer/installers/src/Composer/Installers/BonefishInstaller.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ class BonefishInstaller extends BaseInstaller
5
+ {
6
+ protected $locations = array(
7
+ 'package' => 'Packages/{$vendor}/{$name}/'
8
+ );
9
+ }
embedded/composer/installers/src/Composer/Installers/CakePHPInstaller.php ADDED
@@ -0,0 +1,84 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ use Composer\DependencyResolver\Pool;
5
+ use Composer\Package\PackageInterface;
6
+
7
+ class CakePHPInstaller extends BaseInstaller
8
+ {
9
+ protected $locations = array(
10
+ 'plugin' => 'Plugin/{$name}/',
11
+ );
12
+
13
+ /**
14
+ * Format package name to CamelCase
15
+ */
16
+ public function inflectPackageVars($vars)
17
+ {
18
+ if ($this->matchesCakeVersion('>=', '3.0.0')) {
19
+ return $vars;
20
+ }
21
+
22
+ $nameParts = explode('/', $vars['name']);
23
+ foreach ($nameParts as &$value) {
24
+ $value = strtolower(preg_replace('/(?<=\\w)([A-Z])/', '_\\1', $value));
25
+ $value = str_replace(array('-', '_'), ' ', $value);
26
+ $value = str_replace(' ', '', ucwords($value));
27
+ }
28
+ $vars['name'] = implode('/', $nameParts);
29
+
30
+ return $vars;
31
+ }
32
+
33
+ /**
34
+ * Change the default plugin location when cakephp >= 3.0
35
+ */
36
+ public function getLocations()
37
+ {
38
+ if ($this->matchesCakeVersion('>=', '3.0.0')) {
39
+ $this->locations['plugin'] = $this->composer->getConfig()->get('vendor-dir') . '/{$vendor}/{$name}/';
40
+ }
41
+ return $this->locations;
42
+ }
43
+
44
+ /**
45
+ * Check if CakePHP version matches against a version
46
+ *
47
+ * @param string $matcher
48
+ * @param string $version
49
+ * @return bool
50
+ */
51
+ protected function matchesCakeVersion($matcher, $version)
52
+ {
53
+ if (class_exists('Composer\Semver\Constraint\MultiConstraint')) {
54
+ $multiClass = 'Composer\Semver\Constraint\MultiConstraint';
55
+ $constraintClass = 'Composer\Semver\Constraint\Constraint';
56
+ } else {
57
+ $multiClass = 'Composer\Package\LinkConstraint\MultiConstraint';
58
+ $constraintClass = 'Composer\Package\LinkConstraint\VersionConstraint';
59
+ }
60
+
61
+ $repositoryManager = $this->composer->getRepositoryManager();
62
+ if ($repositoryManager) {
63
+ $repos = $repositoryManager->getLocalRepository();
64
+ if (!$repos) {
65
+ return false;
66
+ }
67
+ $cake3 = new $multiClass(array(
68
+ new $constraintClass($matcher, $version),
69
+ new $constraintClass('!=', '9999999-dev'),
70
+ ));
71
+ $pool = new Pool('dev');
72
+ $pool->addRepository($repos);
73
+ $packages = $pool->whatProvides('cakephp/cakephp');
74
+ foreach ($packages as $package) {
75
+ $installed = new $constraintClass('=', $package->getVersion());
76
+ if ($cake3->matches($installed)) {
77
+ return true;
78
+ break;
79
+ }
80
+ }
81
+ }
82
+ return false;
83
+ }
84
+ }
embedded/composer/installers/src/Composer/Installers/ChefInstaller.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ class ChefInstaller extends BaseInstaller
5
+ {
6
+ protected $locations = array(
7
+ 'cookbook' => 'Chef/{$vendor}/{$name}/',
8
+ 'role' => 'Chef/roles/{$name}/',
9
+ );
10
+ }
11
+
embedded/composer/installers/src/Composer/Installers/ClanCatsFrameworkInstaller.php ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ class ClanCatsFrameworkInstaller extends BaseInstaller
5
+ {
6
+ protected $locations = array(
7
+ 'ship' => 'CCF/orbit/{$name}/',
8
+ 'theme' => 'CCF/app/themes/{$name}/',
9
+ );
10
+ }
embedded/composer/installers/src/Composer/Installers/CodeIgniterInstaller.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ class CodeIgniterInstaller extends BaseInstaller
5
+ {
6
+ protected $locations = array(
7
+ 'library' => 'application/libraries/{$name}/',
8
+ 'third-party' => 'application/third_party/{$name}/',
9
+ 'module' => 'application/modules/{$name}/',
10
+ );
11
+ }
embedded/composer/installers/src/Composer/Installers/Concrete5Installer.php ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ class Concrete5Installer extends BaseInstaller
5
+ {
6
+ protected $locations = array(
7
+ 'block' => 'blocks/{$name}/',
8
+ 'package' => 'packages/{$name}/',
9
+ 'theme' => 'themes/{$name}/',
10
+ 'update' => 'updates/{$name}/',
11
+ );
12
+ }
embedded/composer/installers/src/Composer/Installers/CraftInstaller.php ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ /**
5
+ * Installer for Craft Plugins
6
+ */
7
+ class CraftInstaller extends BaseInstaller
8
+ {
9
+ const NAME_PREFIX = 'craft';
10
+ const NAME_SUFFIX = 'plugin';
11
+
12
+ protected $locations = array(
13
+ 'plugin' => 'craft/plugins/{$name}/',
14
+ );
15
+
16
+ /**
17
+ * Strip `craft-` prefix and/or `-plugin` suffix from package names
18
+ *
19
+ * @param array $vars
20
+ *
21
+ * @return array
22
+ */
23
+ final public function inflectPackageVars($vars)
24
+ {
25
+ return $this->inflectPluginVars($vars);
26
+ }
27
+
28
+ private function inflectPluginVars($vars)
29
+ {
30
+ $vars['name'] = preg_replace('/-' . self::NAME_SUFFIX . '$/i', '', $vars['name']);
31
+ $vars['name'] = preg_replace('/^' . self::NAME_PREFIX . '-/i', '', $vars['name']);
32
+
33
+ return $vars;
34
+ }
35
+ }
embedded/composer/installers/src/Composer/Installers/CroogoInstaller.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ class CroogoInstaller extends BaseInstaller
5
+ {
6
+ protected $locations = array(
7
+ 'plugin' => 'Plugin/{$name}/',
8
+ 'theme' => 'View/Themed/{$name}/',
9
+ );
10
+
11
+ /**
12
+ * Format package name to CamelCase
13
+ */
14
+ public function inflectPackageVars($vars)
15
+ {
16
+ $vars['name'] = strtolower(str_replace(array('-', '_'), ' ', $vars['name']));
17
+ $vars['name'] = str_replace(' ', '', ucwords($vars['name']));
18
+
19
+ return $vars;
20
+ }
21
+ }
embedded/composer/installers/src/Composer/Installers/DokuWikiInstaller.php ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ class DokuWikiInstaller extends BaseInstaller
5
+ {
6
+ protected $locations = array(
7
+ 'plugin' => 'lib/plugins/{$name}/',
8
+ 'template' => 'lib/tpl/{$name}/',
9
+ );
10
+
11
+ /**
12
+ * Format package name.
13
+ *
14
+ * For package type dokuwiki-plugin, cut off a trailing '-plugin',
15
+ * or leading dokuwiki_ if present.
16
+ *
17
+ * For package type dokuwiki-template, cut off a trailing '-template' if present.
18
+ *
19
+ */
20
+ public function inflectPackageVars($vars)
21
+ {
22
+
23
+ if ($vars['type'] === 'dokuwiki-plugin') {
24
+ return $this->inflectPluginVars($vars);
25
+ }
26
+
27
+ if ($vars['type'] === 'dokuwiki-template') {
28
+ return $this->inflectTemplateVars($vars);
29
+ }
30
+
31
+ return $vars;
32
+ }
33
+
34
+ protected function inflectPluginVars($vars)
35
+ {
36
+ $vars['name'] = preg_replace('/-plugin$/', '', $vars['name']);
37
+ $vars['name'] = preg_replace('/^dokuwiki_?-?/', '', $vars['name']);
38
+
39
+ return $vars;
40
+ }
41
+
42
+ protected function inflectTemplateVars($vars)
43
+ {
44
+ $vars['name'] = preg_replace('/-template$/', '', $vars['name']);
45
+ $vars['name'] = preg_replace('/^dokuwiki_?-?/', '', $vars['name']);
46
+
47
+ return $vars;
48
+ }
49
+
50
+ }
embedded/composer/installers/src/Composer/Installers/DolibarrInstaller.php ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ /**
5
+ * Class DolibarrInstaller
6
+ *
7
+ * @package Composer\Installers
8
+ * @author Raphaël Doursenaud <rdoursenaud@gpcsolutions.fr>
9
+ */
10
+ class DolibarrInstaller extends BaseInstaller
11
+ {
12
+ //TODO: Add support for scripts and themes
13
+ protected $locations = array(
14
+ 'module' => 'htdocs/custom/{$name}/',
15
+ );
16
+ }
embedded/composer/installers/src/Composer/Installers/DrupalInstaller.php ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ class DrupalInstaller extends BaseInstaller
5
+ {
6
+ protected $locations = array(
7
+ 'core' => 'core/',
8
+ 'module' => 'modules/{$name}/',
9
+ 'theme' => 'themes/{$name}/',
10
+ 'library' => 'libraries/{$name}/',
11
+ 'profile' => 'profiles/{$name}/',
12
+ 'drush' => 'drush/{$name}/',
13
+ 'custom-theme' => 'themes/custom/{$name}/',
14
+ 'custom-module' => 'modules/custom/{$name}',
15
+ );
16
+ }
embedded/composer/installers/src/Composer/Installers/ElggInstaller.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ class ElggInstaller extends BaseInstaller
5
+ {
6
+ protected $locations = array(
7
+ 'plugin' => 'mod/{$name}/',
8
+ );
9
+ }
embedded/composer/installers/src/Composer/Installers/FuelInstaller.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ class FuelInstaller extends BaseInstaller
5
+ {
6
+ protected $locations = array(
7
+ 'module' => 'fuel/app/modules/{$name}/',
8
+ 'package' => 'fuel/packages/{$name}/',
9
+ 'theme' => 'fuel/app/themes/{$name}/',
10
+ );
11
+ }
embedded/composer/installers/src/Composer/Installers/FuelphpInstaller.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ class FuelphpInstaller extends BaseInstaller
5
+ {
6
+ protected $locations = array(
7
+ 'component' => 'components/{$name}/',
8
+ );
9
+ }
embedded/composer/installers/src/Composer/Installers/GravInstaller.php ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ class GravInstaller extends BaseInstaller
5
+ {
6
+ protected $locations = array(
7
+ 'plugin' => 'user/plugins/{$name}/',
8
+ 'theme' => 'user/themes/{$name}/',
9
+ );
10
+
11
+ /**
12
+ * Format package name
13
+ *
14
+ * @param array $vars
15
+ *
16
+ * @return array
17
+ */
18
+ public function inflectPackageVars($vars)
19
+ {
20
+ $restrictedWords = implode('|', array_keys($this->locations));
21
+
22
+ $vars['name'] = strtolower($vars['name']);
23
+ $vars['name'] = preg_replace('/^(?:grav-)?(?:(?:'.$restrictedWords.')-)?(.*?)(?:-(?:'.$restrictedWords.'))?$/ui',
24
+ '$1',
25
+ $vars['name']
26
+ );
27
+
28
+ return $vars;
29
+ }
30
+ }
embedded/composer/installers/src/Composer/Installers/HuradInstaller.php ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ class HuradInstaller extends BaseInstaller
5
+ {
6
+ protected $locations = array(
7
+ 'plugin' => 'plugins/{$name}/',
8
+ 'theme' => 'plugins/{$name}/',
9
+ );
10
+
11
+ /**
12
+ * Format package name to CamelCase
13
+ */
14
+ public function inflectPackageVars($vars)
15
+ {
16
+ $nameParts = explode('/', $vars['name']);
17
+ foreach ($nameParts as &$value) {
18
+ $value = strtolower(preg_replace('/(?<=\\w)([A-Z])/', '_\\1', $value));
19
+ $value = str_replace(array('-', '_'), ' ', $value);
20
+ $value = str_replace(' ', '', ucwords($value));
21
+ }
22
+ $vars['name'] = implode('/', $nameParts);
23
+ return $vars;
24
+ }
25
+ }
embedded/composer/installers/src/Composer/Installers/ImageCMSInstaller.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ class ImageCMSInstaller extends BaseInstaller
5
+ {
6
+ protected $locations = array(
7
+ 'template' => 'templates/{$name}/',
8
+ 'module' => 'application/modules/{$name}/',
9
+ 'library' => 'application/libraries/{$name}/',
10
+ );
11
+ }
embedded/composer/installers/src/Composer/Installers/Installer.php ADDED
@@ -0,0 +1,178 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ use Composer\IO\IOInterface;
5
+ use Composer\Installer\LibraryInstaller;
6
+ use Composer\Package\PackageInterface;
7
+ use Composer\Repository\InstalledRepositoryInterface;
8
+
9
+ class Installer extends LibraryInstaller
10
+ {
11
+ /**
12
+ * Package types to installer class map
13
+ *
14
+ * @var array
15
+ */
16
+ private $supportedTypes = array(
17
+ 'aimeos' => 'AimeosInstaller',
18
+ 'asgard' => 'AsgardInstaller',
19
+ 'agl' => 'AglInstaller',
20
+ 'annotatecms' => 'AnnotateCmsInstaller',
21
+ 'bitrix' => 'BitrixInstaller',
22
+ 'bonefish' => 'BonefishInstaller',
23
+ 'cakephp' => 'CakePHPInstaller',
24
+ 'chef' => 'ChefInstaller',
25
+ 'ccframework' => 'ClanCatsFrameworkInstaller',
26
+ 'codeigniter' => 'CodeIgniterInstaller',
27
+ 'concrete5' => 'Concrete5Installer',
28
+ 'craft' => 'CraftInstaller',
29
+ 'croogo' => 'CroogoInstaller',
30
+ 'dokuwiki' => 'DokuWikiInstaller',
31
+ 'dolibarr' => 'DolibarrInstaller',
32
+ 'drupal' => 'DrupalInstaller',
33
+ 'elgg' => 'ElggInstaller',
34
+ 'fuel' => 'FuelInstaller',
35
+ 'fuelphp' => 'FuelphpInstaller',
36
+ 'grav' => 'GravInstaller',
37
+ 'hurad' => 'HuradInstaller',
38
+ 'imagecms' => 'ImageCMSInstaller',
39
+ 'joomla' => 'JoomlaInstaller',
40
+ 'kirby' => 'KirbyInstaller',
41
+ 'kodicms' => 'KodiCMSInstaller',
42
+ 'kohana' => 'KohanaInstaller',
43
+ 'laravel' => 'LaravelInstaller',
44
+ 'lithium' => 'LithiumInstaller',
45
+ 'magento' => 'MagentoInstaller',
46
+ 'mako' => 'MakoInstaller',
47
+ 'mautic' => 'MauticInstaller',
48
+ 'mediawiki' => 'MediaWikiInstaller',
49
+ 'microweber' => 'MicroweberInstaller',
50
+ 'modulework' => 'MODULEWorkInstaller',
51
+ 'modxevo' => 'MODXEvoInstaller',
52
+ 'moodle' => 'MoodleInstaller',
53
+ 'october' => 'OctoberInstaller',
54
+ 'oxid' => 'OxidInstaller',
55
+ 'phpbb' => 'PhpBBInstaller',
56
+ 'pimcore' => 'PimcoreInstaller',
57
+ 'piwik' => 'PiwikInstaller',
58
+ 'ppi' => 'PPIInstaller',
59
+ 'puppet' => 'PuppetInstaller',
60
+ 'redaxo' => 'RedaxoInstaller',
61
+ 'roundcube' => 'RoundcubeInstaller',
62
+ 'shopware' => 'ShopwareInstaller',
63
+ 'silverstripe' => 'SilverStripeInstaller',
64
+ 'smf' => 'SMFInstaller',
65
+ 'symfony1' => 'Symfony1Installer',
66
+ 'thelia' => 'TheliaInstaller',
67
+ 'tusk' => 'TuskInstaller',
68
+ 'typo3-cms' => 'TYPO3CmsInstaller',
69
+ 'typo3-flow' => 'TYPO3FlowInstaller',
70
+ 'whmcs' => 'WHMCSInstaller',
71
+ 'wolfcms' => 'WolfCMSInstaller',
72
+ 'wordpress' => 'WordPressInstaller',
73
+ 'zend' => 'ZendInstaller',
74
+ 'zikula' => 'ZikulaInstaller',
75
+ 'prestashop' => 'PrestashopInstaller'
76
+ );
77
+
78
+ /**
79
+ * {@inheritDoc}
80
+ */
81
+ public function getInstallPath(PackageInterface $package)
82
+ {
83
+ $type = $package->getType();
84
+ $frameworkType = $this->findFrameworkType($type);
85
+
86
+ if ($frameworkType === false) {
87
+ throw new \InvalidArgumentException(
88
+ 'Sorry the package type of this package is not yet supported.'
89
+ );
90
+ }
91
+
92
+ $class = 'Composer\\Installers\\' . $this->supportedTypes[$frameworkType];
93
+ $installer = new $class($package, $this->composer, $this->getIO());
94
+
95
+ return $installer->getInstallPath($package, $frameworkType);
96
+ }
97
+
98
+ public function uninstall(InstalledRepositoryInterface $repo, PackageInterface $package)
99
+ {
100
+ if (!$repo->hasPackage($package)) {
101
+ throw new \InvalidArgumentException('Package is not installed: '.$package);
102
+ }
103
+
104
+ $repo->removePackage($package);
105
+
106
+ $installPath = $this->getInstallPath($package);
107
+ $this->io->write(sprintf('Deleting %s - %s', $installPath, $this->filesystem->removeDirectory($installPath) ? '<comment>deleted</comment>' : '<error>not deleted</error>'));
108
+ }
109
+
110
+ /**
111
+ * {@inheritDoc}
112
+ */
113
+ public function supports($packageType)
114
+ {
115
+ $frameworkType = $this->findFrameworkType($packageType);
116
+
117
+ if ($frameworkType === false) {
118
+ return false;
119
+ }
120
+
121
+ $locationPattern = $this->getLocationPattern($frameworkType);
122
+
123
+ return preg_match('#' . $frameworkType . '-' . $locationPattern . '#', $packageType, $matches) === 1;
124
+ }
125
+
126
+ /**
127
+ * Finds a supported framework type if it exists and returns it
128
+ *
129
+ * @param string $type
130
+ * @return string
131
+ */
132
+ protected function findFrameworkType($type)
133
+ {
134
+ $frameworkType = false;
135
+
136
+ krsort($this->supportedTypes);
137
+
138
+ foreach ($this->supportedTypes as $key => $val) {
139
+ if ($key === substr($type, 0, strlen($key))) {
140
+ $frameworkType = substr($type, 0, strlen($key));
141
+ break;
142
+ }
143
+ }
144
+
145
+ return $frameworkType;
146
+ }
147
+
148
+ /**
149
+ * Get the second part of the regular expression to check for support of a
150
+ * package type
151
+ *
152
+ * @param string $frameworkType
153
+ * @return string
154
+ */
155
+ protected function getLocationPattern($frameworkType)
156
+ {
157
+ $pattern = false;
158
+ if (!empty($this->supportedTypes[$frameworkType])) {
159
+ $frameworkClass = 'Composer\\Installers\\' . $this->supportedTypes[$frameworkType];
160
+ /** @var BaseInstaller $framework */
161
+ $framework = new $frameworkClass(null, $this->composer, $this->getIO());
162
+ $locations = array_keys($framework->getLocations());
163
+ $pattern = $locations ? '(' . implode('|', $locations) . ')' : false;
164
+ }
165
+
166
+ return $pattern ? : '(\w+)';
167
+ }
168
+
169
+ /**
170
+ * Get I/O object
171
+ *
172
+ * @return IOInterface
173
+ */
174
+ private function getIO()
175
+ {
176
+ return $this->io;
177
+ }
178
+ }
embedded/composer/installers/src/Composer/Installers/JoomlaInstaller.php ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ class JoomlaInstaller extends BaseInstaller
5
+ {
6
+ protected $locations = array(
7
+ 'component' => 'components/{$name}/',
8
+ 'module' => 'modules/{$name}/',
9
+ 'template' => 'templates/{$name}/',
10
+ 'plugin' => 'plugins/{$name}/',
11
+ 'library' => 'libraries/{$name}/',
12
+ );
13
+
14
+ // TODO: Add inflector for mod_ and com_ names
15
+ }
embedded/composer/installers/src/Composer/Installers/KirbyInstaller.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ class KirbyInstaller extends BaseInstaller
5
+ {
6
+ protected $locations = array(
7
+ 'plugin' => 'site/plugins/{$name}/',
8
+ 'field' => 'site/fields/{$name}/',
9
+ 'tag' => 'site/tags/{$name}/'
10
+ );
11
+ }
embedded/composer/installers/src/Composer/Installers/KodiCMSInstaller.php ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ class KodiCMSInstaller extends BaseInstaller
5
+ {
6
+ protected $locations = array(
7
+ 'plugin' => 'cms/plugins/{$name}/',
8
+ 'media' => 'cms/media/vendor/{$name}/'
9
+ );
10
+ }
embedded/composer/installers/src/Composer/Installers/KohanaInstaller.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ class KohanaInstaller extends BaseInstaller
5
+ {
6
+ protected $locations = array(
7
+ 'module' => 'modules/{$name}/',
8
+ );
9
+ }
embedded/composer/installers/src/Composer/Installers/LaravelInstaller.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ class LaravelInstaller extends BaseInstaller
5
+ {
6
+ protected $locations = array(
7
+ 'library' => 'libraries/{$name}/',
8
+ );
9
+ }
embedded/composer/installers/src/Composer/Installers/LithiumInstaller.php ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ class LithiumInstaller extends BaseInstaller
5
+ {
6
+ protected $locations = array(
7
+ 'library' => 'libraries/{$name}/',
8
+ 'source' => 'libraries/_source/{$name}/',
9
+ );
10
+ }
embedded/composer/installers/src/Composer/Installers/MODULEWorkInstaller.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ class MODULEWorkInstaller extends BaseInstaller
5
+ {
6
+ protected $locations = array(
7
+ 'module' => 'modules/{$name}/',
8
+ );
9
+ }
embedded/composer/installers/src/Composer/Installers/MODXEvoInstaller.php ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ /**
5
+ * An installer to handle MODX Evolution specifics when installing packages.
6
+ */
7
+ class MODXEvoInstaller extends BaseInstaller
8
+ {
9
+ protected $locations = array(
10
+ 'snippet' => 'assets/snippets/{$name}/',
11
+ 'plugin' => 'assets/plugins/{$name}/',
12
+ 'module' => 'assets/modules/{$name}/',
13
+ 'template' => 'assets/templates/{$name}/',
14
+ 'lib' => 'assets/lib/{$name}/'
15
+ );
16
+ }
embedded/composer/installers/src/Composer/Installers/MagentoInstaller.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ class MagentoInstaller extends BaseInstaller
5
+ {
6
+ protected $locations = array(
7
+ 'theme' => 'app/design/frontend/{$name}/',
8
+ 'skin' => 'skin/frontend/default/{$name}/',
9
+ 'library' => 'lib/{$name}/',
10
+ );
11
+ }
embedded/composer/installers/src/Composer/Installers/MakoInstaller.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ class MakoInstaller extends BaseInstaller
5
+ {
6
+ protected $locations = array(
7
+ 'package' => 'app/packages/{$name}/',
8
+ );
9
+ }
embedded/composer/installers/src/Composer/Installers/MauticInstaller.php ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ class MauticInstaller extends BaseInstaller
5
+ {
6
+ protected $locations = array(
7
+ 'plugin' => 'plugins/{$name}/',
8
+ 'theme' => 'themes/{$name}/',
9
+ );
10
+
11
+ /**
12
+ * Format package name of mautic-plugins to CamelCase
13
+ */
14
+ public function inflectPackageVars($vars)
15
+ {
16
+ if ($vars['type'] == 'mautic-plugin') {
17
+ $vars['name'] = preg_replace_callback('/(-[a-z])/', function ($matches) {
18
+ return strtoupper($matches[0][1]);
19
+ }, ucfirst($vars['name']));
20
+ }
21
+
22
+ return $vars;
23
+ }
24
+
25
+ }
embedded/composer/installers/src/Composer/Installers/MediaWikiInstaller.php ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ class MediaWikiInstaller extends BaseInstaller
5
+ {
6
+ protected $locations = array(
7
+ 'extension' => 'extensions/{$name}/',
8
+ 'skin' => 'skins/{$name}/',
9
+ );
10
+
11
+ /**
12
+ * Format package name.
13
+ *
14
+ * For package type mediawiki-extension, cut off a trailing '-extension' if present and transform
15
+ * to CamelCase keeping existing uppercase chars.
16
+ *
17
+ * For package type mediawiki-skin, cut off a trailing '-skin' if present.
18
+ *
19
+ */
20
+ public function inflectPackageVars($vars)
21
+ {
22
+
23
+ if ($vars['type'] === 'mediawiki-extension') {
24
+ return $this->inflectExtensionVars($vars);
25
+ }
26
+
27
+ if ($vars['type'] === 'mediawiki-skin') {
28
+ return $this->inflectSkinVars($vars);
29
+ }
30
+
31
+ return $vars;
32
+ }
33
+
34
+ protected function inflectExtensionVars($vars)
35
+ {
36
+ $vars['name'] = preg_replace('/-extension$/', '', $vars['name']);
37
+ $vars['name'] = str_replace('-', ' ', $vars['name']);
38
+ $vars['name'] = str_replace(' ', '', ucwords($vars['name']));
39
+
40
+ return $vars;
41
+ }
42
+
43
+ protected function inflectSkinVars($vars)
44
+ {
45
+ $vars['name'] = preg_replace('/-skin$/', '', $vars['name']);
46
+
47
+ return $vars;
48
+ }
49
+
50
+ }
embedded/composer/installers/src/Composer/Installers/MicroweberInstaller.php ADDED
@@ -0,0 +1,111 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ class MicroweberInstaller extends BaseInstaller
5
+ {
6
+ protected $locations = array(
7
+ 'module' => 'userfiles/modules/{$name}/',
8
+ 'module-skin' => 'userfiles/modules/{$name}/templates/',
9
+ 'template' => 'userfiles/templates/{$name}/',
10
+ 'element' => 'userfiles/elements/{$name}/',
11
+ 'vendor' => 'vendor/{$name}/',
12
+ 'components' => 'components/{$name}/'
13
+ );
14
+
15
+ /**
16
+ * Format package name.
17
+ *
18
+ * For package type microweber-module, cut off a trailing '-module' if present
19
+ *
20
+ * For package type microweber-template, cut off a trailing '-template' if present.
21
+ *
22
+ */
23
+ public function inflectPackageVars($vars)
24
+ {
25
+ if ($vars['type'] === 'microweber-template') {
26
+ return $this->inflectTemplateVars($vars);
27
+ }
28
+ if ($vars['type'] === 'microweber-templates') {
29
+ return $this->inflectTemplatesVars($vars);
30
+ }
31
+ if ($vars['type'] === 'microweber-core') {
32
+ return $this->inflectCoreVars($vars);
33
+ }
34
+ if ($vars['type'] === 'microweber-adapter') {
35
+ return $this->inflectCoreVars($vars);
36
+ }
37
+ if ($vars['type'] === 'microweber-module') {
38
+ return $this->inflectModuleVars($vars);
39
+ }
40
+ if ($vars['type'] === 'microweber-modules') {
41
+ return $this->inflectModulesVars($vars);
42
+ }
43
+ if ($vars['type'] === 'microweber-skin') {
44
+ return $this->inflectSkinVars($vars);
45
+ }
46
+ if ($vars['type'] === 'microweber-element' or $vars['type'] === 'microweber-elements') {
47
+ return $this->inflectElementVars($vars);
48
+ }
49
+
50
+ return $vars;
51
+ }
52
+
53
+ protected function inflectTemplateVars($vars)
54
+ {
55
+ $vars['name'] = preg_replace('/-template$/', '', $vars['name']);
56
+ $vars['name'] = preg_replace('/template-$/', '', $vars['name']);
57
+
58
+ return $vars;
59
+ }
60
+
61
+ protected function inflectTemplatesVars($vars)
62
+ {
63
+ $vars['name'] = preg_replace('/-templates$/', '', $vars['name']);
64
+ $vars['name'] = preg_replace('/templates-$/', '', $vars['name']);
65
+
66
+ return $vars;
67
+ }
68
+
69
+ protected function inflectCoreVars($vars)
70
+ {
71
+ $vars['name'] = preg_replace('/-providers$/', '', $vars['name']);
72
+ $vars['name'] = preg_replace('/-provider$/', '', $vars['name']);
73
+ $vars['name'] = preg_replace('/-adapter$/', '', $vars['name']);
74
+
75
+ return $vars;
76
+ }
77
+
78
+ protected function inflectModuleVars($vars)
79
+ {
80
+ $vars['name'] = preg_replace('/-module$/', '', $vars['name']);
81
+ $vars['name'] = preg_replace('/module-$/', '', $vars['name']);
82
+
83
+ return $vars;
84
+ }
85
+
86
+ protected function inflectModulesVars($vars)
87
+ {
88
+ $vars['name'] = preg_replace('/-modules$/', '', $vars['name']);
89
+ $vars['name'] = preg_replace('/modules-$/', '', $vars['name']);
90
+
91
+ return $vars;
92
+ }
93
+
94
+ protected function inflectSkinVars($vars)
95
+ {
96
+ $vars['name'] = preg_replace('/-skin$/', '', $vars['name']);
97
+ $vars['name'] = preg_replace('/skin-$/', '', $vars['name']);
98
+
99
+ return $vars;
100
+ }
101
+
102
+ protected function inflectElementVars($vars)
103
+ {
104
+ $vars['name'] = preg_replace('/-elements$/', '', $vars['name']);
105
+ $vars['name'] = preg_replace('/elements-$/', '', $vars['name']);
106
+ $vars['name'] = preg_replace('/-element$/', '', $vars['name']);
107
+ $vars['name'] = preg_replace('/element-$/', '', $vars['name']);
108
+
109
+ return $vars;
110
+ }
111
+ }
embedded/composer/installers/src/Composer/Installers/MoodleInstaller.php ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ class MoodleInstaller extends BaseInstaller
5
+ {
6
+ protected $locations = array(
7
+ 'mod' => 'mod/{$name}/',
8
+ 'admin_report' => 'admin/report/{$name}/',
9
+ 'atto' => 'lib/editor/atto/plugins/{$name}/',
10
+ 'tool' => 'admin/tool/{$name}/',
11
+ 'assignment' => 'mod/assignment/type/{$name}/',
12
+ 'assignsubmission' => 'mod/assign/submission/{$name}/',
13
+ 'assignfeedback' => 'mod/assign/feedback/{$name}/',
14
+ 'auth' => 'auth/{$name}/',
15
+ 'availability' => 'availability/condition/{$name}/',
16
+ 'block' => 'blocks/{$name}/',
17
+ 'booktool' => 'mod/book/tool/{$name}/',
18
+ 'cachestore' => 'cache/stores/{$name}/',
19
+ 'cachelock' => 'cache/locks/{$name}/',
20
+ 'calendartype' => 'calendar/type/{$name}/',
21
+ 'format' => 'course/format/{$name}/',
22
+ 'coursereport' => 'course/report/{$name}/',
23
+ 'datafield' => 'mod/data/field/{$name}/',
24
+ 'datapreset' => 'mod/data/preset/{$name}/',
25
+ 'editor' => 'lib/editor/{$name}/',
26
+ 'enrol' => 'enrol/{$name}/',
27
+ 'filter' => 'filter/{$name}/',
28
+ 'gradeexport' => 'grade/export/{$name}/',
29
+ 'gradeimport' => 'grade/import/{$name}/',
30
+ 'gradereport' => 'grade/report/{$name}/',
31
+ 'gradingform' => 'grade/grading/form/{$name}/',
32
+ 'local' => 'local/{$name}/',
33
+ 'logstore' => 'admin/tool/log/store/{$name}/',
34
+ 'ltisource' => 'mod/lti/source/{$name}/',
35
+ 'ltiservice' => 'mod/lti/service/{$name}/',
36
+ 'message' => 'message/output/{$name}/',
37
+ 'mnetservice' => 'mnet/service/{$name}/',
38
+ 'plagiarism' => 'plagiarism/{$name}/',
39
+ 'portfolio' => 'portfolio/{$name}/',
40
+ 'qbehaviour' => 'question/behaviour/{$name}/',
41
+ 'qformat' => 'question/format/{$name}/',
42
+ 'qtype' => 'question/type/{$name}/',
43
+ 'quizaccess' => 'mod/quiz/accessrule/{$name}/',
44
+ 'quiz' => 'mod/quiz/report/{$name}/',
45
+ 'report' => 'report/{$name}/',
46
+ 'repository' => 'repository/{$name}/',
47
+ 'scormreport' => 'mod/scorm/report/{$name}/',
48
+ 'theme' => 'theme/{$name}/',
49
+ 'tinymce' => 'lib/editor/tinymce/plugins/{$name}/',
50
+ 'profilefield' => 'user/profile/field/{$name}/',
51
+ 'webservice' => 'webservice/{$name}/',
52
+ 'workshopallocation' => 'mod/workshop/allocation/{$name}/',
53
+ 'workshopeval' => 'mod/workshop/eval/{$name}/',
54
+ 'workshopform' => 'mod/workshop/form/{$name}/'
55
+ );
56
+ }
embedded/composer/installers/src/Composer/Installers/OctoberInstaller.php ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ class OctoberInstaller extends BaseInstaller
5
+ {
6
+ protected $locations = array(
7
+ 'module' => 'modules/{$name}/',
8
+ 'plugin' => 'plugins/{$vendor}/{$name}/',
9
+ 'theme' => 'themes/{$name}/'
10
+ );
11
+
12
+ /**
13
+ * Format package name.
14
+ *
15
+ * For package type october-plugin, cut off a trailing '-plugin' if present.
16
+ *
17
+ * For package type october-theme, cut off a trailing '-theme' if present.
18
+ *
19
+ */
20
+ public function inflectPackageVars($vars)
21
+ {
22
+ if ($vars['type'] === 'october-plugin') {
23
+ return $this->inflectPluginVars($vars);
24
+ }
25
+
26
+ if ($vars['type'] === 'october-theme') {
27
+ return $this->inflectThemeVars($vars);
28
+ }
29
+
30
+ return $vars;
31
+ }
32
+
33
+ protected function inflectPluginVars($vars)
34
+ {
35
+ $vars['name'] = preg_replace('/-plugin$/', '', $vars['name']);
36
+
37
+ return $vars;
38
+ }
39
+
40
+ protected function inflectThemeVars($vars)
41
+ {
42
+ $vars['name'] = preg_replace('/-theme$/', '', $vars['name']);
43
+
44
+ return $vars;
45
+ }
46
+ }
embedded/composer/installers/src/Composer/Installers/OxidInstaller.php ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ use Composer\Package\PackageInterface;
5
+
6
+ class OxidInstaller extends BaseInstaller
7
+ {
8
+ const VENDOR_PATTERN = '/^modules\/(?P<vendor>.+)\/.+/';
9
+
10
+ protected $locations = array(
11
+ 'module' => 'modules/{$name}/',
12
+ 'theme' => 'application/views/{$name}/',
13
+ 'out' => 'out/{$name}/',
14
+ );
15
+
16
+ /**
17
+ * getInstallPath
18
+ *
19
+ * @param PackageInterface $package
20
+ * @param string $frameworkType
21
+ * @return void
22
+ */
23
+ public function getInstallPath(PackageInterface $package, $frameworkType = '')
24
+ {
25
+ $installPath = parent::getInstallPath($package, $frameworkType);
26
+ $type = $this->package->getType();
27
+ if ($type === 'oxid-module') {
28
+ $this->prepareVendorDirectory($installPath);
29
+ }
30
+ return $installPath;
31
+ }
32
+
33
+ /**
34
+ * prepareVendorDirectory
35
+ *
36
+ * Makes sure there is a vendormetadata.php file inside
37
+ * the vendor folder if there is a vendor folder.
38
+ *
39
+ * @param string $installPath
40
+ * @return void
41
+ */
42
+ protected function prepareVendorDirectory($installPath)
43
+ {
44
+ $matches = '';
45
+ $hasVendorDirectory = preg_match(self::VENDOR_PATTERN, $installPath, $matches);
46
+ if (!$hasVendorDirectory) {
47
+ return;
48
+ }
49
+
50
+ $vendorDirectory = $matches['vendor'];
51
+ $vendorPath = getcwd() . '/modules/' . $vendorDirectory;
52
+ if (!file_exists($vendorPath)) {
53
+ mkdir($vendorPath, 0755, true);
54
+ }
55
+
56
+ $vendorMetaDataPath = $vendorPath . '/vendormetadata.php';
57
+ touch($vendorMetaDataPath);
58
+ }
59
+ }
embedded/composer/installers/src/Composer/Installers/PPIInstaller.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ class PPIInstaller extends BaseInstaller
5
+ {
6
+ protected $locations = array(
7
+ 'module' => 'modules/{$name}/',
8
+ );
9
+ }
embedded/composer/installers/src/Composer/Installers/PhpBBInstaller.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ class PhpBBInstaller extends BaseInstaller
5
+ {
6
+ protected $locations = array(
7
+ 'extension' => 'ext/{$vendor}/{$name}/',
8
+ 'language' => 'language/{$name}/',
9
+ 'style' => 'styles/{$name}/',
10
+ );
11
+ }
embedded/composer/installers/src/Composer/Installers/PimcoreInstaller.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ class PimcoreInstaller extends BaseInstaller
5
+ {
6
+ protected $locations = array(
7
+ 'plugin' => 'plugins/{$name}/',
8
+ );
9
+
10
+ /**
11
+ * Format package name to CamelCase
12
+ */
13
+ public function inflectPackageVars($vars)
14
+ {
15
+ $vars['name'] = strtolower(preg_replace('/(?<=\\w)([A-Z])/', '_\\1', $vars['name']));
16
+ $vars['name'] = str_replace(array('-', '_'), ' ', $vars['name']);
17
+ $vars['name'] = str_replace(' ', '', ucwords($vars['name']));
18
+
19
+ return $vars;
20
+ }
21
+ }
embedded/composer/installers/src/Composer/Installers/PiwikInstaller.php ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ /**
5
+ * Class PiwikInstaller
6
+ *
7
+ * @package Composer\Installers
8
+ */
9
+ class PiwikInstaller extends BaseInstaller
10
+ {
11
+ /**
12
+ * @var array
13
+ */
14
+ protected $locations = array(
15
+ 'plugin' => 'plugins/{$name}/',
16
+ );
17
+
18
+ /**
19
+ * Format package name to CamelCase
20
+ * @param array $vars
21
+ *
22
+ * @return array
23
+ */
24
+ public function inflectPackageVars($vars)
25
+ {
26
+ $vars['name'] = strtolower(preg_replace('/(?<=\\w)([A-Z])/', '_\\1', $vars['name']));
27
+ $vars['name'] = str_replace(array('-', '_'), ' ', $vars['name']);
28
+ $vars['name'] = str_replace(' ', '', ucwords($vars['name']));
29
+
30
+ return $vars;
31
+ }
32
+ }
embedded/composer/installers/src/Composer/Installers/Plugin.php ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Composer\Installers;
4
+
5
+ use Composer\Composer;
6
+ use Composer\IO\IOInterface;
7
+ use Composer\Plugin\PluginInterface;
8
+
9
+ class Plugin implements PluginInterface
10
+ {
11
+
12
+ public function activate(Composer $composer, IOInterface $io)
13
+ {
14
+ $installer = new Installer($io, $composer);
15
+ $composer->getInstallationManager()->addInstaller($installer);
16
+ }
17
+ }
embedded/composer/installers/src/Composer/Installers/PrestashopInstaller.php ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ class PrestashopInstaller extends BaseInstaller
5
+ {
6
+ protected $locations = array(
7
+ 'module' => 'modules/{$name}/',
8
+ 'theme' => 'themes/{$name}/',
9
+ );
10
+ }
embedded/composer/installers/src/Composer/Installers/PuppetInstaller.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Composer\Installers;
4
+
5
+ class PuppetInstaller extends BaseInstaller
6
+ {
7
+
8
+ protected $locations = array(
9
+ 'module' => 'modules/{$name}/',
10
+ );
11
+ }
embedded/composer/installers/src/Composer/Installers/RedaxoInstaller.php ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ class RedaxoInstaller extends BaseInstaller
5
+ {
6
+ protected $locations = array(
7
+ 'addon' => 'redaxo/include/addons/{$name}/',
8
+ 'bestyle-plugin' => 'redaxo/include/addons/be_style/plugins/{$name}/'
9
+ );
10
+ }
embedded/composer/installers/src/Composer/Installers/RoundcubeInstaller.php ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ class RoundcubeInstaller extends BaseInstaller
5
+ {
6
+ protected $locations = array(
7
+ 'plugin' => 'plugins/{$name}/',
8
+ );
9
+
10
+ /**
11
+ * Lowercase name and changes the name to a underscores
12
+ *
13
+ * @param array $vars
14
+ * @return array
15
+ */
16
+ public function inflectPackageVars($vars)
17
+ {
18
+ $vars['name'] = strtolower(str_replace('-', '_', $vars['name']));
19
+
20
+ return $vars;
21
+ }
22
+ }
embedded/composer/installers/src/Composer/Installers/SMFInstaller.php ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ class SMFInstaller extends BaseInstaller
5
+ {
6
+ protected $locations = array(
7
+ 'module' => 'Sources/{$name}/',
8
+ 'theme' => 'Themes/{$name}/',
9
+ );
10
+ }
embedded/composer/installers/src/Composer/Installers/ShopwareInstaller.php ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ /**
5
+ * Plugin/theme installer for shopware
6
+ * @author Benjamin Boit
7
+ */
8
+ class ShopwareInstaller extends BaseInstaller
9
+ {
10
+ protected $locations = array(
11
+ 'backend-plugin' => 'engine/Shopware/Plugins/Local/Backend/{$name}/',
12
+ 'core-plugin' => 'engine/Shopware/Plugins/Local/Core/{$name}/',
13
+ 'frontend-plugin' => 'engine/Shopware/Plugins/Local/Frontend/{$name}/',
14
+ 'theme' => 'templates/{$name}/'
15
+ );
16
+
17
+ /**
18
+ * Transforms the names
19
+ * @param array $vars
20
+ * @return array
21
+ */
22
+ public function inflectPackageVars($vars)
23
+ {
24
+ if ($vars['type'] === 'shopware-theme') {
25
+ return $this->correctThemeName($vars);
26
+ } else {
27
+ return $this->correctPluginName($vars);
28
+ }
29
+ }
30
+
31
+ /**
32
+ * Changes the name to a camelcased combination of vendor and name
33
+ * @param array $vars
34
+ * @return array
35
+ */
36
+ private function correctPluginName($vars)
37
+ {
38
+ $camelCasedName = preg_replace_callback('/(-[a-z])/', function ($matches) {
39
+ return strtoupper($matches[0][1]);
40
+ }, $vars['name']);
41
+
42
+ $vars['name'] = ucfirst($vars['vendor']) . ucfirst($camelCasedName);
43
+
44
+ return $vars;
45
+ }
46
+
47
+ /**
48
+ * Changes the name to a underscore separated name
49
+ * @param array $vars
50
+ * @return array
51
+ */
52
+ private function correctThemeName($vars)
53
+ {
54
+ $vars['name'] = str_replace('-', '_', $vars['name']);
55
+
56
+ return $vars;
57
+ }
58
+ }
embedded/composer/installers/src/Composer/Installers/SilverStripeInstaller.php ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ use Composer\Package\PackageInterface;
5
+
6
+ class SilverStripeInstaller extends BaseInstaller
7
+ {
8
+ protected $locations = array(
9
+ 'module' => '{$name}/',
10
+ 'theme' => 'themes/{$name}/',
11
+ );
12
+
13
+ /**
14
+ * Return the install path based on package type.
15
+ *
16
+ * Relies on built-in BaseInstaller behaviour with one exception: silverstripe/framework
17
+ * must be installed to 'sapphire' and not 'framework' if the version is <3.0.0
18
+ *
19
+ * @param PackageInterface $package
20
+ * @param string $frameworkType
21
+ * @return string
22
+ */
23
+ public function getInstallPath(PackageInterface $package, $frameworkType = '')
24
+ {
25
+ if (
26
+ $package->getName() == 'silverstripe/framework'
27
+ && preg_match('/^\d+\.\d+\.\d+/', $package->getVersion())
28
+ && version_compare($package->getVersion(), '2.999.999') < 0
29
+ ) {
30
+ return $this->templatePath($this->locations['module'], array('name' => 'sapphire'));
31
+ } else {
32
+ return parent::getInstallPath($package, $frameworkType);
33
+ }
34
+
35
+ }
36
+ }
embedded/composer/installers/src/Composer/Installers/Symfony1Installer.php ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ /**
5
+ * Plugin installer for symfony 1.x
6
+ *
7
+ * @author Jérôme Tamarelle <jerome@tamarelle.net>
8
+ */
9
+ class Symfony1Installer extends BaseInstaller
10
+ {
11
+ protected $locations = array(
12
+ 'plugin' => 'plugins/{$name}/',
13
+ );
14
+
15
+ /**
16
+ * Format package name to CamelCase
17
+ */
18
+ public function inflectPackageVars($vars)
19
+ {
20
+ $vars['name'] = preg_replace_callback('/(-[a-z])/', function ($matches) {
21
+ return strtoupper($matches[0][1]);
22
+ }, $vars['name']);
23
+
24
+ return $vars;
25
+ }
26
+ }
embedded/composer/installers/src/Composer/Installers/TYPO3CmsInstaller.php ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ /**
5
+ * Extension installer for TYPO3 CMS
6
+ *
7
+ * @deprecated since 1.0.25, use https://packagist.org/packages/typo3/cms-composer-installers instead
8
+ *
9
+ * @author Sascha Egerer <sascha.egerer@dkd.de>
10
+ */
11
+ class TYPO3CmsInstaller extends BaseInstaller
12
+ {
13
+ protected $locations = array(
14
+ 'extension' => 'typo3conf/ext/{$name}/',
15
+ );
16
+ }
embedded/composer/installers/src/Composer/Installers/TYPO3FlowInstaller.php ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ /**
5
+ * An installer to handle TYPO3 Flow specifics when installing packages.
6
+ */
7
+ class TYPO3FlowInstaller extends BaseInstaller
8
+ {
9
+ protected $locations = array(
10
+ 'package' => 'Packages/Application/{$name}/',
11
+ 'framework' => 'Packages/Framework/{$name}/',
12
+ 'plugin' => 'Packages/Plugins/{$name}/',
13
+ 'site' => 'Packages/Sites/{$name}/',
14
+ 'boilerplate' => 'Packages/Boilerplates/{$name}/',
15
+ 'build' => 'Build/{$name}/',
16
+ );
17
+
18
+ /**
19
+ * Modify the package name to be a TYPO3 Flow style key.
20
+ *
21
+ * @param array $vars
22
+ * @return array
23
+ */
24
+ public function inflectPackageVars($vars)
25
+ {
26
+ $autoload = $this->package->getAutoload();
27
+ if (isset($autoload['psr-0']) && is_array($autoload['psr-0'])) {
28
+ $namespace = key($autoload['psr-0']);
29
+ $vars['name'] = str_replace('\\', '.', $namespace);
30
+ }
31
+ if (isset($autoload['psr-4']) && is_array($autoload['psr-4'])) {
32
+ $namespace = key($autoload['psr-4']);
33
+ $vars['name'] = rtrim(str_replace('\\', '.', $namespace), '.');
34
+ }
35
+
36
+ return $vars;
37
+ }
38
+ }
embedded/composer/installers/src/Composer/Installers/TheliaInstaller.php ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ class TheliaInstaller extends BaseInstaller
5
+ {
6
+ protected $locations = array(
7
+ 'module' => 'local/modules/{$name}/',
8
+ 'frontoffice-template' => 'templates/frontOffice/{$name}/',
9
+ 'backoffice-template' => 'templates/backOffice/{$name}/',
10
+ 'email-template' => 'templates/email/{$name}/',
11
+ );
12
+ }
embedded/composer/installers/src/Composer/Installers/TuskInstaller.php ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+ /**
4
+ * Composer installer for 3rd party Tusk utilities
5
+ * @author Drew Ewing <drew@phenocode.com>
6
+ */
7
+ class TuskInstaller extends BaseInstaller
8
+ {
9
+ protected $locations = array(
10
+ 'task' => '.tusk/tasks/{$name}/',
11
+ 'command' => '.tusk/commands/{$name}/',
12
+ 'asset' => 'assets/tusk/{$name}/',
13
+ );
14
+ }
embedded/composer/installers/src/Composer/Installers/WHMCSInstaller.php ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Composer\Installers;
4
+
5
+ class WHMCSInstaller extends BaseInstaller
6
+ {
7
+ protected $locations = array(
8
+ 'gateway' => 'modules/gateways/{$name}/',
9
+ );
10
+ }
embedded/composer/installers/src/Composer/Installers/WolfCMSInstaller.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ class WolfCMSInstaller extends BaseInstaller
5
+ {
6
+ protected $locations = array(
7
+ 'plugin' => 'wolf/plugins/{$name}/',
8
+ );
9
+ }
embedded/composer/installers/src/Composer/Installers/WordPressInstaller.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ class WordPressInstaller extends BaseInstaller
5
+ {
6
+ protected $locations = array(
7
+ 'plugin' => 'wp-content/plugins/{$name}/',
8
+ 'theme' => 'wp-content/themes/{$name}/',
9
+ 'muplugin' => 'wp-content/mu-plugins/{$name}/',
10
+ );
11
+ }
embedded/composer/installers/src/Composer/Installers/ZendInstaller.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ class ZendInstaller extends BaseInstaller
5
+ {
6
+ protected $locations = array(
7
+ 'library' => 'library/{$name}/',
8
+ 'extra' => 'extras/library/{$name}/',
9
+ 'module' => 'module/{$name}/',
10
+ );
11
+ }
embedded/composer/installers/src/Composer/Installers/ZikulaInstaller.php ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ class ZikulaInstaller extends BaseInstaller
5
+ {
6
+ protected $locations = array(
7
+ 'module' => 'modules/{$vendor}-{$name}/',
8
+ 'theme' => 'themes/{$vendor}-{$name}/'
9
+ );
10
+ }
embedded/composer/installers/src/bootstrap.php ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ function includeIfExists($file)
3
+ {
4
+ if (file_exists($file)) {
5
+ return include $file;
6
+ }
7
+ }
8
+ if ((!$loader = includeIfExists(__DIR__ . '/../vendor/autoload.php')) && (!$loader = includeIfExists(__DIR__ . '/../../../autoload.php'))) {
9
+ die('You must set up the project dependencies, run the following commands:'.PHP_EOL.
10
+ 'curl -s http://getcomposer.org/installer | php'.PHP_EOL.
11
+ 'php composer.phar install'.PHP_EOL);
12
+ }
13
+ return $loader;
embedded/installer/changelog.txt CHANGED
@@ -1,133 +1,133 @@
1
- = 1.7.8 =
2
- * Small fix for hiding the WPML registration notice
3
-
4
- = 1.7.7 =
5
- * Fixed js error showing up during registration
6
- * Styles update for unified WPML messages
7
-
8
- = 1.7.6 =
9
- * Updated error messages when validating site keys and stopped removing site keys in case of communication errors
10
- * Added a note for users who renewed or purchased new subscriptions and who need to revalidate their subscription from their websites
11
- * Fixed a problem with the registrations for multi-site setups when WordPress was installed in a separate folder
12
-
13
- = 1.7.5 =
14
- * Fixed a bug causing registration to not be recognized for the entire network in the multi-site mode
15
-
16
- = 1.7.4 =
17
- * Use https for wp-types API
18
-
19
- = 1.7.3 =
20
- * Added a dependencies class and check for the windows paths length exception
21
- * Bug fix: all downloads showed up twice on the plugins list whe upgrading from WPML 3.3
22
-
23
- = 1.7.2 =
24
- * Added an exception to handle the case when Types embedded is installer from Toolset Installer and its included Installer version overrides the one running the Toolset setup wizard
25
-
26
- = 1.7.1 =
27
- * Added an exception for the case of Types 1.8.9 (Installer 1.7.0) together with older WPML (older Installer)
28
-
29
- = 1.7.0 =
30
- * New format for the products data file.
31
- * Other fixes
32
-
33
- = 1.6.8 =
34
- * Sanitized an input that was a potential security issue
35
-
36
- = 1.6.7 =
37
- * Fixed a bug causing repeated calls to the Toolset api to validate the user subscription
38
- * Use https for API urls
39
-
40
- = 1.6.6 =
41
- * Fixed the 'Call to undefined function get_plugins()' issue
42
-
43
- = 1.6.5 =
44
- * Added configuration file for composer
45
- * Updated how free plugins are shown on the plugins list (commercial tab)
46
- * API calls for manipulating translation service preferences
47
- * Support for hosting custom Installer packages on wpml.org
48
- * Fixed a warning that was showing when using the OTGS_DISABLE_AUTO_UPDATES constant before any product data was downloaded
49
- * Changed the frequency with which product updates are checked automatically (24 hours)
50
- * Improved reporting for version numbers
51
-
52
- = 1.6.4 =
53
- * Enabled the OTGS_DISABLE_AUTO_UPDATES constant for theme update checks
54
- * Fixed a bug that was causing Register links to show for all installed plugins
55
-
56
- = 1.6.3 =
57
- * Fixed performance issue related to themes upgrade logic
58
-
59
- = 1.6 =
60
- * Improved the way plugins are matched: not just by the folder name (slug) but also by name
61
- * Added support for installing and upgrading themes from repositories (currently: Toolset themes)
62
- * Added support for 'alias' plugins on the toolset and wpml repositories (currently: Types)
63
- * Enhanced the progress animation during plugins downloading
64
-
65
- = 1.5.6 =
66
- * Updated the translations
67
- * Fix for WPML 3.2 conditional upgrade logic
68
-
69
- = 1.5.5 =
70
- * Fixed the logic for the high_priority parameter
71
- * Fixed js bug causing a conflict with NextGen
72
- * Fixed bug preventing users to install and upgrade Types when they didn't have a Toolset subscription
73
- * Fixed bug preventing users to upgrade from the embedded Types to the full version
74
-
75
- = 1.5.4 =
76
- * Option to disable auto-updates
77
- * Escaped urls generated with add_query_arg
78
-
79
- = 1.5.3 =
80
- * Fixed bug in WP_Installer::custom_plugins_api_call (filter for plugins_api) causing conflicts with other filters for plugins_api
81
-
82
- = 1.5.2 =
83
- * More meaningful errors when plugin downloads fail
84
- * WordPress 4.2 compatibility
85
- * Performance improvements (will not load in places where it's not needed and not make unnecessary requests to the CDN)
86
- * Support putting deps.xml config file in the theme folder (root)
87
- * Included code for importing data for toolset plugins
88
- * Use CloudFront urls for products list files
89
-
90
- = 1.5.1 =
91
- * Fix for allowing embedded plugins to be updated
92
- * Logic for the migration from embedded plugins to full plugins
93
-
94
- = 1.5 =
95
- * Support for embedded plugins
96
- * Bug fix: When user registers site key with trailing slash, downloads might not work
97
- * Tweak: Set a higher timeout limit for the http requests to CDN and API
98
- * API function: link to specific repository
99
- * API function: get product price
100
- * New method for defining affiliate info (with backwards compatibility)
101
-
102
- = 1.4 =
103
- * Show explicit error in case of connectivity issues while validating a key.
104
- * Bug fix: Downloading plugins in bulk was broken by plugin that had a redirect after activation
105
- * Display friendly error message when WordPress does not have permissions to write to the plugins folder
106
- * Added support for configuration files to auto-download required plugins and theme keys
107
- * Changed the "Update this info" button to "Check for updates" (it refreshes the subscription info and checks for updates)
108
- * Support for high_priority parameter that allows setting priority for an Installer instance when more with the same version number exist.
109
- * Config files from different instances are combined (define repositories in different instances)
110
- * Updated support for conditional updates display for ICL users
111
- * More friendly error reporting and handling when using an invalid site key or the plugins archives are not valid.
112
-
113
-
114
- = 1.3.1 =
115
- * Support for conditional release notification (ICanLocalize)
116
-
117
- = 1.3 =
118
- * Added a new repository: Toolset
119
- * The product packages can be displayed hierarchically and ordered
120
- * The link to automatically create site keys will follow through login on the account site (e.g. wpml.org, wp-types.com)
121
- * Fixed animation issues (not showing in most browsers) when downloading plugins.
122
- * Created an admin screen on the repository end (icl-mpp) to sho registration stats (site keys, site keys usage, components usage etc..).
123
- * Bug fix: Renew and Upgrade buttons were not entirely clickable
124
- * Bug fix: Action buttons (buy, renew, upgrade) were not displayed correctly when WPML was not active (Installer embedded in theme)
125
- * Support for site-wide registration. Products can be registered on the network instead of on each site separately.
126
- * Users are able to add either http or https version for any site urls. There will be one site key that will work with both http and https versions.
127
-
128
- = 1.2 =
129
- * Added pagination for site keys list of Account -> My Sites
130
- * Reversed the order in which the site keys are displayed.
131
- * Fixed problem with WPML registration information (site key) not being saved when the option_value field in the wp_options table used a different charset than the default WordPress charset defined in wp-config.php
132
- * Allow registering new sites by clicking a link in the WordPress admin instead of copying and pasting the site url in the Account -> My Sites section
133
- * Display more detailed debug information related to connectivity issues with the WPML repository
1
+ = 1.7.8 =
2
+ * Small fix for hiding the WPML registration notice
3
+
4
+ = 1.7.7 =
5
+ * Fixed js error showing up during registration
6
+ * Styles update for unified WPML messages
7
+
8
+ = 1.7.6 =
9
+ * Updated error messages when validating site keys and stopped removing site keys in case of communication errors
10
+ * Added a note for users who renewed or purchased new subscriptions and who need to revalidate their subscription from their websites
11
+ * Fixed a problem with the registrations for multi-site setups when WordPress was installed in a separate folder
12
+
13
+ = 1.7.5 =
14
+ * Fixed a bug causing registration to not be recognized for the entire network in the multi-site mode
15
+
16
+ = 1.7.4 =
17
+ * Use https for wp-types API
18
+
19
+ = 1.7.3 =
20
+ * Added a dependencies class and check for the windows paths length exception
21
+ * Bug fix: all downloads showed up twice on the plugins list whe upgrading from WPML 3.3
22
+
23
+ = 1.7.2 =
24
+ * Added an exception to handle the case when Types embedded is installer from Toolset Installer and its included Installer version overrides the one running the Toolset setup wizard
25
+
26
+ = 1.7.1 =
27
+ * Added an exception for the case of Types 1.8.9 (Installer 1.7.0) together with older WPML (older Installer)
28
+
29
+ = 1.7.0 =
30
+ * New format for the products data file.
31
+ * Other fixes
32
+
33
+ = 1.6.8 =
34
+ * Sanitized an input that was a potential security issue
35
+
36
+ = 1.6.7 =
37
+ * Fixed a bug causing repeated calls to the Toolset api to validate the user subscription
38
+ * Use https for API urls
39
+
40
+ = 1.6.6 =
41
+ * Fixed the 'Call to undefined function get_plugins()' issue
42
+
43
+ = 1.6.5 =
44
+ * Added configuration file for composer
45
+ * Updated how free plugins are shown on the plugins list (commercial tab)
46
+ * API calls for manipulating translation service preferences
47
+ * Support for hosting custom Installer packages on wpml.org
48
+ * Fixed a warning that was showing when using the OTGS_DISABLE_AUTO_UPDATES constant before any product data was downloaded
49
+ * Changed the frequency with which product updates are checked automatically (24 hours)
50
+ * Improved reporting for version numbers
51
+
52
+ = 1.6.4 =
53
+ * Enabled the OTGS_DISABLE_AUTO_UPDATES constant for theme update checks
54
+ * Fixed a bug that was causing Register links to show for all installed plugins
55
+
56
+ = 1.6.3 =
57
+ * Fixed performance issue related to themes upgrade logic
58
+
59
+ = 1.6 =
60
+ * Improved the way plugins are matched: not just by the folder name (slug) but also by name
61
+ * Added support for installing and upgrading themes from repositories (currently: Toolset themes)
62
+ * Added support for 'alias' plugins on the toolset and wpml repositories (currently: Types)
63
+ * Enhanced the progress animation during plugins downloading
64
+
65
+ = 1.5.6 =
66
+ * Updated the translations
67
+ * Fix for WPML 3.2 conditional upgrade logic
68
+
69
+ = 1.5.5 =
70
+ * Fixed the logic for the high_priority parameter
71
+ * Fixed js bug causing a conflict with NextGen
72
+ * Fixed bug preventing users to install and upgrade Types when they didn't have a Toolset subscription
73
+ * Fixed bug preventing users to upgrade from the embedded Types to the full version
74
+
75
+ = 1.5.4 =
76
+ * Option to disable auto-updates
77
+ * Escaped urls generated with add_query_arg
78
+
79
+ = 1.5.3 =
80
+ * Fixed bug in WP_Installer::custom_plugins_api_call (filter for plugins_api) causing conflicts with other filters for plugins_api
81
+
82
+ = 1.5.2 =
83
+ * More meaningful errors when plugin downloads fail
84
+ * WordPress 4.2 compatibility
85
+ * Performance improvements (will not load in places where it's not needed and not make unnecessary requests to the CDN)
86
+ * Support putting deps.xml config file in the theme folder (root)
87
+ * Included code for importing data for toolset plugins
88
+ * Use CloudFront urls for products list files
89
+
90
+ = 1.5.1 =
91
+ * Fix for allowing embedded plugins to be updated
92
+ * Logic for the migration from embedded plugins to full plugins
93
+
94
+ = 1.5 =
95
+ * Support for embedded plugins
96
+ * Bug fix: When user registers site key with trailing slash, downloads might not work
97
+ * Tweak: Set a higher timeout limit for the http requests to CDN and API
98
+ * API function: link to specific repository
99
+ * API function: get product price
100
+ * New method for defining affiliate info (with backwards compatibility)
101
+
102
+ = 1.4 =
103
+ * Show explicit error in case of connectivity issues while validating a key.
104
+ * Bug fix: Downloading plugins in bulk was broken by plugin that had a redirect after activation
105
+ * Display friendly error message when WordPress does not have permissions to write to the plugins folder
106
+ * Added support for configuration files to auto-download required plugins and theme keys
107
+ * Changed the "Update this info" button to "Check for updates" (it refreshes the subscription info and checks for updates)
108
+ * Support for high_priority parameter that allows setting priority for an Installer instance when more with the same version number exist.
109
+ * Config files from different instances are combined (define repositories in different instances)
110
+ * Updated support for conditional updates display for ICL users
111
+ * More friendly error reporting and handling when using an invalid site key or the plugins archives are not valid.
112
+
113
+
114
+ = 1.3.1 =
115
+ * Support for conditional release notification (ICanLocalize)
116
+
117
+ = 1.3 =
118
+ * Added a new repository: Toolset
119
+ * The product packages can be displayed hierarchically and ordered
120
+ * The link to automatically create site keys will follow through login on the account site (e.g. wpml.org, wp-types.com)
121
+ * Fixed animation issues (not showing in most browsers) when downloading plugins.
122
+ * Created an admin screen on the repository end (icl-mpp) to sho registration stats (site keys, site keys usage, components usage etc..).
123
+ * Bug fix: Renew and Upgrade buttons were not entirely clickable
124
+ * Bug fix: Action buttons (buy, renew, upgrade) were not displayed correctly when WPML was not active (Installer embedded in theme)
125
+ * Support for site-wide registration. Products can be registered on the network instead of on each site separately.
126
+ * Users are able to add either http or https version for any site urls. There will be one site key that will work with both http and https versions.
127
+
128
+ = 1.2 =
129
+ * Added pagination for site keys list of Account -> My Sites
130
+ * Reversed the order in which the site keys are displayed.
131
+ * Fixed problem with WPML registration information (site key) not being saved when the option_value field in the wp_options table used a different charset than the default WordPress charset defined in wp-config.php
132
+ * Allow registering new sites by clicking a link in the WordPress admin instead of copying and pasting the site url in the Account -> My Sites section
133
+ * Display more detailed debug information related to connectivity issues with the WPML repository
embedded/installer/composer.json CHANGED
@@ -1,31 +1,31 @@
1
- {
2
- "name": "otgs/installer",
3
- "description": "Installs and updates WPML and Toolset dependencies automatically",
4
- "keywords": ["plugins", "install", "utils", "update"],
5
- "homepage": "https://git.onthegosystems.com/installer/installer",
6
- "type": "wordpress-plugin",
7
- "license": "GPL-2.0",
8
- "authors": [
9
- {
10
- "name": "Mihai Grigori",
11
- "email": "mihai@wpml.org",
12
- "homepage": "http://www.wp-types.com"
13
- }
14
- ],
15
- "require": {
16
- "php": ">=5.2.0",
17
- "composer/installers": "~1.0"
18
- },
19
- "require-dev": {
20
- "phpunit/phpunit": "~4.5"
21
- },
22
- "extra": {
23
- "branch-alias": {
24
- "dev-master": "1.7.x-dev",
25
- "dev-develop": "1.7.x-dev"
26
- }
27
- },
28
- "scripts": {
29
- "test": "phpunit"
30
- }
31
  }
1
+ {
2
+ "name": "otgs/installer",
3
+ "description": "Installs and updates WPML and Toolset dependencies automatically",
4
+ "keywords": ["plugins", "install", "utils", "update"],
5
+ "homepage": "https://git.onthegosystems.com/installer/installer",
6
+ "type": "wordpress-plugin",
7
+ "license": "GPL-2.0",
8
+ "authors": [
9
+ {
10
+ "name": "Mihai Grigori",
11
+ "email": "mihai@wpml.org",
12
+ "homepage": "http://www.wp-types.com"
13
+ }
14
+ ],
15
+ "require": {
16
+ "php": ">=5.2.0",
17
+ "composer/installers": "~1.0"
18
+ },
19
+ "require-dev": {
20
+ "phpunit/phpunit": "~4.5"
21
+ },
22
+ "extra": {
23
+ "branch-alias": {
24
+ "dev-master": "1.7.x-dev",
25
+ "dev-develop": "1.7.x-dev"
26
+ }
27
+ },
28
+ "scripts": {
29
+ "test": "phpunit"
30
+ }
31
  }
embedded/installer/includes/class-installer-dependencies.php CHANGED
@@ -1,278 +1,278 @@
1
- <?php
2
-
3
- class Installer_Dependencies{
4
-
5
- private $uploading_allowed = null;
6
- private $is_win_paths_exception = array();
7
-
8
-
9
- function __construct(){
10
-
11
- add_action( 'admin_init', array( $this, 'prevent_plugins_update_on_plugins_page' ), 100);
12
-
13
-
14
-
15
- global $pagenow;
16
- if($pagenow == 'update.php'){
17
- if(isset($_GET['action']) && $_GET['action'] == 'update-selected'){
18
- add_action('admin_head', array($this, 'prevent_plugins_update_on_updates_screen')); //iframe/bulk
19
- }else{
20
- add_action('all_admin_notices', array($this, 'prevent_plugins_update_on_updates_screen')); //regular/singular
21
- }
22
- }
23
- add_action('wp_ajax_update-plugin', array($this, 'prevent_plugins_update_on_updates_screen'), 0); // high priority, before WP
24
-
25
- }
26
-
27
- public function is_win_paths_exception($repository_id){
28
-
29
- if(!isset($this->is_win_paths_exception[$repository_id])) {
30
-
31
- $this->is_win_paths_exception[$repository_id] = false;
32
-
33
- if ( strtoupper( substr( PHP_OS, 0, 3 ) ) === 'WIN' ) {
34
-
35
- $windows_max_path_length = 256;
36
- $longest_path['wpml'] = 109;
37
- $longest_path['toolset'] = 99;
38
-
39
- $margin = 15;
40
-
41
- $upgrade_path_length = strlen( WP_CONTENT_DIR . '/upgrade' );
42
-
43
- $installer_settings = WP_Installer()->settings;
44
-
45
- if ( is_array( $installer_settings['repositories'][$repository_id]['data']['downloads']['plugins'] ) ) {
46
- $a_plugin = current( $installer_settings['repositories'][$repository_id]['data']['downloads']['plugins'] );
47
- $url = WP_Installer()->append_site_key_to_download_url( $a_plugin['url'], 'xxxxxx', $repository_id );
48
- $tmpfname = wp_tempnam( $url );
49
-
50
- $tmpname_length = strlen( basename( $tmpfname ) ) - 4; // -.tmp
51
-
52
- if ( $upgrade_path_length + $tmpname_length + $longest_path[$repository_id] + $margin > $windows_max_path_length ) {
53
-
54
- $this->is_win_paths_exception[$repository_id] = true;
55
-
56
- }
57
-
58
- }
59
-
60
-
61
- }
62
-
63
- }
64
-
65
- return $this->is_win_paths_exception[$repository_id];
66
-
67
- }
68
-
69
- public function is_uploading_allowed(){
70
-
71
- if(!isset($this->uploading_allowed)){
72
- require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
73
- require_once WP_Installer()->plugin_path() . '/includes/installer-upgrader-skins.php';
74
-
75
- $upgrader_skins = new Installer_Upgrader_Skins(); //use our custom (mute) Skin
76
- $upgrader = new Plugin_Upgrader($upgrader_skins);
77
-
78
- ob_start();
79
- $res = $upgrader->fs_connect( array(WP_CONTENT_DIR, WP_PLUGIN_DIR) );
80
- ob_end_clean();
81
-
82
- if ( ! $res || is_wp_error( $res ) ) {
83
- $this->uploading_allowed = false;
84
- }else{
85
- $this->uploading_allowed = true;
86
- }
87
- }
88
-
89
- return $this->uploading_allowed;
90
-
91
- }
92
-
93
- public function cant_download($repository_id){
94
-
95
- return !$this->is_uploading_allowed() || $this->is_win_paths_exception($repository_id);
96
-
97
- }
98
-
99
- public function win_paths_exception_message(){
100
- return __('Downloading is not possible. WordPress cannot create required folders because of the
101
- 256 characters limitation of the current Windows environment.', 'installer');
102
- }
103
-
104
- public function prevent_plugins_update_on_plugins_page(){
105
-
106
- $plugins = get_site_transient( 'update_plugins' );
107
- if ( isset($plugins->response) && is_array($plugins->response) ) {
108
- $plugins_with_updates = array_keys( $plugins->response );
109
- }
110
-
111
- if( !empty($plugins_with_updates) ) {
112
-
113
- $plugins = get_plugins();
114
-
115
- $installer_settings = WP_Installer()->settings;
116
- foreach ($installer_settings['repositories'] as $repository_id => $repository) {
117
-
118
- if ($this->is_win_paths_exception($repository_id)) {
119
-
120
- $repositories_plugins = array();
121
- foreach ($repository['data']['packages'] as $package) {
122
- foreach ($package['products'] as $product) {
123
- foreach ($product['plugins'] as $plugin_slug) {
124
- $download = $installer_settings['repositories'][$repository_id]['data']['downloads']['plugins'][$plugin_slug];
125
- if ( empty($download['free-on-wporg']) ) {
126
- $repositories_plugins[$download['slug']] = $download['name'];
127
- }
128
- }
129
- }
130
- }
131
-
132
- foreach ($plugins as $plugin_id => $plugin) {
133
-
134
- if( in_array( $plugin_id, $plugins_with_updates ) ) {
135
-
136
- $wp_plugin_slug = dirname($plugin_id);
137
- if (empty($wp_plugin_slug)) {
138
- $wp_plugin_slug = basename($plugin_id, '.php');
139
- }
140
-
141
- foreach ($repositories_plugins as $slug => $name) {
142
- if ($wp_plugin_slug == $slug || $name == $plugin['Name'] || $name == $plugin['Title']) { //match order: slug, name, title
143
-
144
- remove_action("after_plugin_row_$plugin_id", 'wp_plugin_update_row', 10, 2);
145
- add_action("after_plugin_row_$plugin_id", array($this, 'wp_plugin_update_row_win_exception'), 10, 2);
146
-
147
- }
148
- }
149
-
150
- }
151
-
152
- }
153
-
154
- }
155
-
156
-
157
- }
158
-
159
- }
160
-
161
- }
162
-
163
- public function wp_plugin_update_row_win_exception(){
164
- $wp_list_table = _get_list_table('WP_Plugins_List_Table');
165
- echo '<tr class="plugin-update-tr">';
166
- echo '<td class="plugin-update colspanchange" colspan="' . esc_attr( $wp_list_table->get_column_count() ) .
167
- '"><div class="update-message">' . $this->win_paths_exception_message() . '</div></td>';
168
- echo '</tr>';
169
- }
170
-
171
- public function prevent_plugins_update_on_updates_screen(){
172
-
173
- if ( isset($_REQUEST['action']) ) {
174
-
175
- $action = isset($_REQUEST['action']) ? $_REQUEST['action'] : '';
176
-
177
- $installer_settings = WP_Installer()->settings;
178
-
179
- //bulk mode
180
- if('update-selected' == $action) {
181
-
182
- global $plugins;
183
-
184
- if(isset($plugins) && is_array($plugins)) {
185
-
186
- foreach ($plugins as $k => $plugin) {
187
-
188
- $wp_plugin_slug = dirname($plugin);
189
-
190
- foreach ($installer_settings['repositories'] as $repository_id => $repository) {
191
-
192
- if( $this->is_win_paths_exception($repository_id) ){
193
-
194
- foreach ($repository['data']['packages'] as $package) {
195
-
196
- foreach ($package['products'] as $product) {
197
-
198
- foreach ($product['plugins'] as $plugin_slug) {
199
-
200
- $download = $installer_settings['repositories'][$repository_id]['data']['downloads']['plugins'][$plugin_slug];
201
-
202
- if ($download['slug'] == $wp_plugin_slug && empty($download['free-on-wporg']) ) {
203
-
204
- echo '<div class="updated error"><p>' . $this->win_paths_exception_message() .
205
- ' <strong>(' . $download['name'] . ')</strong>' . '</p></div>';
206
- unset($plugins[$k]);
207
-
208
- break(3);
209
-
210
- }
211
-
212
- }
213
-
214
- }
215
-
216
- }
217
-
218
-
219
- }
220
-
221
- }
222
-
223
- }
224
-
225
- }
226
-
227
- }
228
-
229
-
230
- if( 'upgrade-plugin' == $action || 'update-plugin' == $action ) {
231
-
232
- $plugin = isset($_REQUEST['plugin']) ? trim($_REQUEST['plugin']) : '';
233
-
234
- $wp_plugin_slug = dirname($plugin);
235
-
236
- foreach($installer_settings['repositories'] as $repository_id => $repository){
237
-
238
- if( $this->is_win_paths_exception( $repository_id ) ) {
239
- foreach ($repository['data']['packages'] as $package) {
240
-
241
- foreach($package['products'] as $product) {
242
-
243
- foreach($product['plugins'] as $plugin_slug) {
244
- $download = $installer_settings['repositories'][$repository_id]['data']['downloads']['plugins'][$plugin_slug];
245
-
246
- //match by folder, will change to match by name and folder
247
- if ( $download['slug'] == $wp_plugin_slug && empty ($download['free-on-wporg'] ) ) {
248
-
249
- echo '<div class="updated error"><p>' . $this->win_paths_exception_message() . '</p></div>';
250
-
251
- echo '<div class="wrap">';
252
- echo '<h2>' . __('Update Plugin') . '</h2>';
253
- echo '<a href="' . admin_url('update-core.php') . '">' . __('Return to the updates page', 'installer') . '</a>';
254
- echo '</div>';
255
- require_once(ABSPATH . 'wp-admin/admin-footer.php');
256
- exit;
257
-
258
- }
259
-
260
- }
261
-
262
- }
263
-
264
- }
265
- }
266
-
267
- }
268
-
269
- }
270
- }
271
-
272
- }
273
-
274
-
275
- }
276
-
277
-
278
-
1
+ <?php
2
+
3
+ class Installer_Dependencies{
4
+
5
+ private $uploading_allowed = null;
6
+ private $is_win_paths_exception = array();
7
+
8
+
9
+ function __construct(){
10
+
11
+ add_action( 'admin_init', array( $this, 'prevent_plugins_update_on_plugins_page' ), 100);
12
+
13
+
14
+
15
+ global $pagenow;
16
+ if($pagenow == 'update.php'){
17
+ if(isset($_GET['action']) && $_GET['action'] == 'update-selected'){
18
+ add_action('admin_head', array($this, 'prevent_plugins_update_on_updates_screen')); //iframe/bulk
19
+ }else{
20
+ add_action('all_admin_notices', array($this, 'prevent_plugins_update_on_updates_screen')); //regular/singular
21
+ }
22
+ }
23
+ add_action('wp_ajax_update-plugin', array($this, 'prevent_plugins_update_on_updates_screen'), 0); // high priority, before WP
24
+
25
+ }
26
+
27
+ public function is_win_paths_exception($repository_id){
28
+
29
+ if(!isset($this->is_win_paths_exception[$repository_id])) {
30
+
31
+ $this->is_win_paths_exception[$repository_id] = false;
32
+
33
+ if ( strtoupper( substr( PHP_OS, 0, 3 ) ) === 'WIN' ) {
34
+
35
+ $windows_max_path_length = 256;
36
+ $longest_path['wpml'] = 109;
37
+ $longest_path['toolset'] = 99;
38
+
39
+ $margin = 15;
40
+
41
+ $upgrade_path_length = strlen( WP_CONTENT_DIR . '/upgrade' );
42
+
43
+ $installer_settings = WP_Installer()->settings;
44
+
45
+ if ( is_array( $installer_settings['repositories'][$repository_id]['data']['downloads']['plugins'] ) ) {
46
+ $a_plugin = current( $installer_settings['repositories'][$repository_id]['data']['downloads']['plugins'] );
47
+ $url = WP_Installer()->append_site_key_to_download_url( $a_plugin['url'], 'xxxxxx', $repository_id );
48
+ $tmpfname = wp_tempnam( $url );
49
+
50
+ $tmpname_length = strlen( basename( $tmpfname ) ) - 4; // -.tmp
51
+
52
+ if ( $upgrade_path_length + $tmpname_length + $longest_path[$repository_id] + $margin > $windows_max_path_length ) {
53
+
54
+ $this->is_win_paths_exception[$repository_id] = true;
55
+
56
+ }
57
+
58
+ }
59
+
60
+
61
+ }
62
+
63
+ }
64
+
65
+ return $this->is_win_paths_exception[$repository_id];
66
+
67
+ }
68
+
69
+ public function is_uploading_allowed(){
70
+
71
+ if(!isset($this->uploading_allowed)){
72
+ require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
73
+ require_once WP_Installer()->plugin_path() . '/includes/installer-upgrader-skins.php';
74
+
75
+ $upgrader_skins = new Installer_Upgrader_Skins(); //use our custom (mute) Skin
76
+ $upgrader = new Plugin_Upgrader($upgrader_skins);
77
+
78
+ ob_start();
79
+ $res = $upgrader->fs_connect( array(WP_CONTENT_DIR, WP_PLUGIN_DIR) );
80
+ ob_end_clean();
81
+
82
+ if ( ! $res || is_wp_error( $res ) ) {
83
+ $this->uploading_allowed = false;
84
+ }else{
85
+ $this->uploading_allowed = true;
86
+ }
87
+ }
88
+
89
+ return $this->uploading_allowed;
90
+
91
+ }
92
+
93
+ public function cant_download($repository_id){
94
+
95
+ return !$this->is_uploading_allowed() || $this->is_win_paths_exception($repository_id);
96
+
97
+ }
98
+
99
+ public function win_paths_exception_message(){
100
+ return __('Downloading is not possible. WordPress cannot create required folders because of the
101
+ 256 characters limitation of the current Windows environment.', 'installer');
102
+ }
103
+
104
+ public function prevent_plugins_update_on_plugins_page(){
105
+
106
+ $plugins = get_site_transient( 'update_plugins' );
107
+ if ( isset($plugins->response) && is_array($plugins->response) ) {
108
+ $plugins_with_updates = array_keys( $plugins->response );
109
+ }
110
+
111
+ if( !empty($plugins_with_updates) ) {
112
+
113
+ $plugins = get_plugins();
114
+
115
+ $installer_settings = WP_Installer()->settings;
116
+ foreach ($installer_settings['repositories'] as $repository_id => $repository) {
117
+
118
+ if ($this->is_win_paths_exception($repository_id)) {
119
+
120
+ $repositories_plugins = array();
121
+ foreach ($repository['data']['packages'] as $package) {
122
+ foreach ($package['products'] as $product) {
123
+ foreach ($product['plugins'] as $plugin_slug) {
124
+ $download = $installer_settings['repositories'][$repository_id]['data']['downloads']['plugins'][$plugin_slug];
125
+ if ( empty($download['free-on-wporg']) ) {
126
+ $repositories_plugins[$download['slug']] = $download['name'];
127
+ }
128
+ }
129
+ }
130
+ }
131
+
132
+ foreach ($plugins as $plugin_id => $plugin) {
133
+
134
+ if( in_array( $plugin_id, $plugins_with_updates ) ) {
135
+
136
+ $wp_plugin_slug = dirname($plugin_id);
137
+ if (empty($wp_plugin_slug)) {
138
+ $wp_plugin_slug = basename($plugin_id, '.php');
139
+ }
140
+
141
+ foreach ($repositories_plugins as $slug => $name) {
142
+ if ($wp_plugin_slug == $slug || $name == $plugin['Name'] || $name == $plugin['Title']) { //match order: slug, name, title
143
+
144
+ remove_action("after_plugin_row_$plugin_id", 'wp_plugin_update_row', 10, 2);
145
+ add_action("after_plugin_row_$plugin_id", array($this, 'wp_plugin_update_row_win_exception'), 10, 2);
146
+
147
+ }
148
+ }
149
+
150
+ }
151
+
152
+ }
153
+
154
+ }
155
+
156
+
157
+ }
158
+
159
+ }
160
+
161
+ }
162
+
163
+ public function wp_plugin_update_row_win_exception(){
164
+ $wp_list_table = _get_list_table('WP_Plugins_List_Table');
165
+ echo '<tr class="plugin-update-tr">';
166
+ echo '<td class="plugin-update colspanchange" colspan="' . esc_attr( $wp_list_table->get_column_count() ) .
167
+ '"><div class="update-message">' . $this->win_paths_exception_message() . '</div></td>';
168
+ echo '</tr>';
169
+ }
170
+
171
+ public function prevent_plugins_update_on_updates_screen(){
172
+
173
+ if ( isset($_REQUEST['action']) ) {
174
+
175
+ $action = isset($_REQUEST['action']) ? $_REQUEST['action'] : '';
176
+
177
+ $installer_settings = WP_Installer()->settings;
178
+
179
+ //bulk mode
180
+ if('update-selected' == $action) {
181
+
182
+ global $plugins;
183
+
184
+ if(isset($plugins) && is_array($plugins)) {
185
+
186
+ foreach ($plugins as $k => $plugin) {
187
+
188
+ $wp_plugin_slug = dirname($plugin);
189
+
190
+ foreach ($installer_settings['repositories'] as $repository_id => $repository) {
191
+
192
+ if( $this->is_win_paths_exception($repository_id) ){
193
+
194
+ foreach ($repository['data']['packages'] as $package) {
195
+
196
+ foreach ($package['products'] as $product) {
197
+
198
+ foreach ($product['plugins'] as $plugin_slug) {
199
+
200
+ $download = $installer_settings['repositories'][$repository_id]['data']['downloads']['plugins'][$plugin_slug];
201
+
202
+ if ($download['slug'] == $wp_plugin_slug && empty($download['free-on-wporg']) ) {
203
+
204
+ echo '<div class="updated error"><p>' . $this->win_paths_exception_message() .
205
+ ' <strong>(' . $download['name'] . ')</strong>' . '</p></div>';
206
+ unset($plugins[$k]);
207
+
208
+ break(3);
209
+
210
+ }
211
+
212
+ }
213
+
214
+ }
215
+
216
+ }
217
+
218
+
219
+ }
220
+
221
+ }
222
+
223
+ }
224
+
225
+ }
226
+
227
+ }
228
+
229
+
230
+ if( 'upgrade-plugin' == $action || 'update-plugin' == $action ) {
231
+
232
+ $plugin = isset($_REQUEST['plugin']) ? trim($_REQUEST['plugin']) : '';
233
+
234
+ $wp_plugin_slug = dirname($plugin);
235
+
236
+ foreach($installer_settings['repositories'] as $repository_id => $repository){
237
+
238
+ if( $this->is_win_paths_exception( $repository_id ) ) {
239
+ foreach ($repository['data']['packages'] as $package) {
240
+
241
+ foreach($package['products'] as $product) {
242
+
243
+ foreach($product['plugins'] as $plugin_slug) {
244
+ $download = $installer_settings['repositories'][$repository_id]['data']['downloads']['plugins'][$plugin_slug];
245
+
246
+ //match by folder, will change to match by name and folder
247
+ if ( $download['slug'] == $wp_plugin_slug && empty ($download['free-on-wporg'] ) ) {
248
+
249
+ echo '<div class="updated error"><p>' . $this->win_paths_exception_message() . '</p></div>';
250
+
251
+ echo '<div class="wrap">';
252
+ echo '<h2>' . __('Update Plugin') . '</h2>';
253
+ echo '<a href="' . admin_url('update-core.php') . '">' . __('Return to the updates page', 'installer') . '</a>';
254
+ echo '</div>';
255
+ require_once(ABSPATH . 'wp-admin/admin-footer.php');
256
+ exit;
257
+
258
+ }
259
+
260
+ }
261
+
262
+ }
263
+
264
+ }
265
+ }
266
+
267
+ }
268
+
269
+ }
270
+ }
271
+
272
+ }
273
+
274
+
275
+ }
276
+
277
+
278
+
embedded/installer/includes/class-installer-theme.php CHANGED
@@ -1,979 +1,979 @@
1
- <?php
2
- /**
3
- * Installer Class for Theme Support
4
- *
5
- * Supports automatic updates and installation of Toolset/WPML Themes
6
- *
7
- * @class Installer_Theme_Class
8
- * @version 1.6
9
- * @category Class
10
- * @author OnTheGoSystems
11
- */
12
-
13
- if ( !defined( 'ABSPATH' ) ) {
14
- exit;
15
- }
16
-
17
- /**
18
- * Installer_Theme_Class
19
- */
20
- class Installer_Theme_Class {
21
-
22
- /** Theme Repository */
23
- private $theme_repo;
24
-
25
- /** Repository API */
26
- private $repository_api;
27
-
28
- /** Repository Theme Products */
29
- private $repository_theme_products;
30
-
31
- /** Site URL */
32
- private $installer_site_url;
33
-
34
- /** Site Key */
35
- private $installer_site_key;
36
-
37
- /** The Themes Option */
38
- protected $installer_themes_option;
39
-
40
- /** Update settings */
41
- protected $installer_themes_available_updates;
42
-
43
- /** The Themes */
44
- protected $installer_themes = array();
45
-
46
- /** Repository with themes */
47
- protected $installer_repo_with_themes;
48
-
49
- /** Active tab */
50
- protected $installer_theme_active_tab;
51
-
52
- /** Theme user registration */
53
- protected $theme_user_registration;
54
-
55
- /** Client active subscription */
56
- protected $installer_theme_subscription_type;
57
-
58
- public function __construct() {
59
-
60
- /** Properties */
61
-
62
- //Get installer repositories
63
- $installer_repositories = WP_Installer()->get_repositories();
64
-
65
- //Get repos with themes
66
- $repos_with_themes = $this->installer_theme_reposities_that_has_themes( $installer_repositories );
67
-
68
- if ( is_array( $repos_with_themes ) ) {
69
- //Assign to property
70
- $this->installer_repo_with_themes = $repos_with_themes;
71
-
72
- //Let's looped through repos with themes
73
- foreach ( $repos_with_themes as $k => $repo ) {
74
-
75
- //$repo could be 'toolset' or 'wpml'
76
- //Assign each repo with theme to property
77
- $this->theme_repo[] = $repo;
78
-
79
- if ( (isset($installer_repositories[$repo]['api-url'])) && (isset($installer_repositories[$repo]['products'])) ) {
80
-
81
- //Define the rest of the properties based on the given repo
82
- $this->repository_api[$repo] = $installer_repositories[$repo]['api-url'];
83
- $this->repository_theme_products[$repo] = $installer_repositories[$repo]['products'];
84
- $this->installer_site_url[$repo] = WP_Installer()->get_installer_site_url( $repo );
85
- $this->installer_site_key[$repo] = WP_Installer()->get_site_key( $repo );
86
- $this->theme_user_registration[$repo] = false;
87
-
88
- if ( WP_Installer()->repository_has_valid_subscription( $repo ) ) {
89
-
90
- $this->installer_theme_subscription_type = WP_Installer()->get_subscription_type_for_repository( $repo );
91
- $this->installer_themes_option[$repo] = 'wp_installer_' . $repo . '_themes';
92
- $this->installer_themes_available_updates[$repo] = 'wp_installer_' . $repo . '_updated_themes';
93
- $this->installer_theme_active_tab = '';
94
-
95
- //We only set themes available to this validated subscription
96
- $this->installer_theme_available( $repo, $this->installer_theme_subscription_type );
97
-
98
- add_action( 'installer_themes_support_set_up', array($this, 'installer_theme_sets_active_tab_on_init'), 10 );
99
- $this->theme_user_registration[$repo] = true;
100
- }
101
-
102
- /** We are ready.. let's initialize .... */
103
- $this->init();
104
- }
105
- }
106
- add_action( 'installer_themes_support_set_up', array($this, 'installer_theme_loaded_hooks') );
107
- }
108
- }
109
-
110
- /** Init */
111
- public function init() {
112
- add_action( 'admin_enqueue_scripts', array($this, 'installer_theme_enqueue_scripts') );
113
- add_filter( 'themes_api', array($this, 'installer_theme_api_override'), 10, 3 );
114
- add_filter( 'themes_api_result', array($this, 'installer_theme_api_override_response'), 10, 3 );
115
- add_filter( 'site_transient_update_themes', array($this, 'installer_theme_upgrade_check'), 10, 1 );
116
- add_action( 'http_api_debug', array($this, 'installer_theme_sync_native_wp_api'), 10, 5 );
117
- add_filter( 'installer_theme_hook_response_theme', array($this, 'installer_theme_add_num_ratings'), 10, 1 );
118
- add_filter( 'themes_update_check_locales', array($this, 'installer_theme_sync_call_wp_theme_api'), 10, 1 );
119
- add_filter( 'admin_url', array($this, 'installer_theme_add_query_arg_tab'), 10, 3 );
120
- add_filter( 'network_admin_url', array($this, 'installer_theme_add_query_arg_tab'), 10, 2 );
121
- add_action( 'wp_ajax_installer_theme_frontend_selected_tab', array($this, 'installer_theme_frontend_selected_tab'), 0 );
122
- add_action( 'wp_loaded', array($this, 'installer_themes_support_set_up_func') );
123
- }
124
-
125
- /** Enqueue scripts */
126
- public function installer_theme_enqueue_scripts() {
127
- $current_screen = $this->installer_theme_current_screen();
128
- $commercial_plugin_screen = $this->installer_theme_is_commercial_plugin_screen( $current_screen );
129
- if ( ('theme-install' == $current_screen) || ($commercial_plugin_screen) || ('theme-install-network' == $current_screen) ) {
130
- $repo_with_themes = $this->installer_repo_with_themes;
131
- $js_array = array();
132
- if ( is_array( $repo_with_themes ) ) {
133
- foreach ( $repo_with_themes as $k => $v ) {
134
-
135
- //Hyperlink text
136
- $theme_repo_name = $this->installer_theme_get_repo_product_name( $v );
137
- $the_hyperlink_text = esc_js( $theme_repo_name );
138
-
139
- if ( is_multisite() ) {
140
- $admin_url_passed = network_admin_url();
141
- } else {
142
- $admin_url_passed = admin_url();
143
- }
144
-
145
- //Define
146
- $js_array[$v] = array(
147
- 'the_hyperlink_text' => $the_hyperlink_text,
148
- 'registration_status' => $this->theme_user_registration[$v],
149
- 'is_commercial_plugin_tab' => $commercial_plugin_screen,
150
- 'registration_url' => $admin_url_passed . 'plugin-install.php?tab=commercial#installer_repo_' . $v
151
- );
152
-
153
- }
154
- }
155
-
156
- if ( !(empty($js_array)) ) {
157
- wp_enqueue_script( 'installer-theme-install', WP_Installer()->res_url() . '/res/js/installer_theme_install.js', array('jquery', 'installer-admin'), WP_Installer()->version() );
158
- $installer_ajax_url = admin_url( 'admin-ajax.php' );
159
-
160
- if ( is_ssl() ) {
161
- $installer_ajax_url = str_replace( 'http://', 'https://', $installer_ajax_url );
162
- } else {
163
- $installer_ajax_url = str_replace( 'https://', 'http://', $installer_ajax_url );
164
- }
165
-
166
- //Case where user is subscribed to a subscription that does not have themes
167
- $subscription_js_check = $this->installer_theme_subscription_does_not_have_theme( $js_array );
168
-
169
- wp_localize_script( 'installer-theme-install', 'installer_theme_install_localize',
170
- array(
171
- 'js_array_installer' => $js_array,
172
- 'ajaxurl' => $installer_ajax_url,
173
- 'no_associated_themes' => $subscription_js_check,
174
- 'installer_theme_frontend_selected_tab_nonce' => wp_create_nonce( 'installer_theme_frontend_selected_tab' )
175
- )
176
- );
177
- }
178
- }
179
- }
180
-
181
- /** Case where user is subscribed to a subscription that does not have themes */
182
- protected function installer_theme_subscription_does_not_have_theme( $js_array ) {
183
-
184
- $any_subscription_has_theme = array();
185
- $number_of_registrations = array();
186
-
187
- //Step1, we looped through JS array
188
- foreach ( $js_array as $repo_slug => $js_details ) {
189
-
190
- //Step2, checked if user is registered
191
- if ( isset($this->theme_user_registration[$repo_slug]) ) {
192
- $registration_status = $this->theme_user_registration[$repo_slug];
193
- if ( $registration_status ) {
194
-
195
- //Registered
196
- $number_of_registrations[] = $repo_slug;
197
-
198
- //Step3, we checked if the $repo_slug has available theme
199
- $themes_available = false;
200
- if ( isset($this->installer_themes[$repo_slug]) ) {
201
- $themes_available = $this->installer_themes[$repo_slug];
202
- if ( !(empty($themes_available)) ) {
203
- //This subscription has theme
204
- $themes_available = true;
205
- }
206
- }
207
-
208
- if ( $themes_available ) {
209
- $any_subscription_has_theme[] = $repo_slug;
210
- }
211
- }
212
- }
213
-
214
- }
215
-
216
- //Step4, we are done looping, check if there are any repos that have themes
217
- if ( empty($registration_status) ) {
218
-
219
- //No registration on any repos
220
- return FALSE;
221
-
222
- } elseif ( !(empty($registration_status)) ) {
223
-
224
- //Has some registration on some repos
225
- //We then checked if this user has any active subscriptions
226
- if ( empty($any_subscription_has_theme) ) {
227
- //No subscription
228
- return TRUE;
229
- } else {
230
- //Has subscription found
231
- return FALSE;
232
- }
233
- }
234
- }
235
-
236
- /** Check if its the commercial plugin screen */
237
- private function installer_theme_is_commercial_plugin_screen( $current_screen ) {
238
- $commercial = false;
239
- if ( ('plugin-install' == $current_screen) || ('plugin-install-network' == $current_screen) ) {
240
- if ( isset($_GET['tab']) ) {
241
- $tab = $_GET['tab'];
242
- if ( 'commercial' == $tab ) {
243
- $commercial = true;
244
- }
245
- }
246
- }
247
- return $commercial;
248
- }
249
-
250
- /** Current screen */
251
- private function installer_theme_current_screen() {
252
-
253
- $current_screen_loaded = false;
254
-
255
- if ( function_exists( 'get_current_screen' ) ) {
256
-
257
- $screen_output = get_current_screen();
258
- $current_screen_loaded = $screen_output->id;
259
-
260
- }
261
-
262
- return $current_screen_loaded;
263
-
264
- }
265
-
266
- /** Override WordPress Themes API */
267
- public function installer_theme_api_override( $api_boolean, $action, $args ) {
268
-
269
- //Let's checked if user is browsing our themes
270
- if ( isset($args->browse) ) {
271
- $browse = $args->browse;
272
- if ( in_array( $browse, $this->theme_repo ) ) {
273
- //Uniquely validated for our Themes
274
- if ( 'query_themes' == $action ) {
275
- //User is querying or asking information about our themes, let's override
276
- $api_boolean = true;
277
- }
278
- }
279
- } elseif ( isset($args->slug) ) {
280
- //We are installing our themes
281
- $theme_to_install = $args->slug;
282
-
283
- //Lets uniquely validate if this belongs to us
284
- //Check if this is OTGS theme
285
- $validate_check = $this->installer_themes_belong_to_us( $theme_to_install );
286
- if ( $validate_check ) {
287
- //Belongs to us
288
- if ( !(empty($theme_to_install)) ) {
289
- $api_boolean = true;
290
- }
291
- }
292
- }
293
-
294
- return $api_boolean;
295
- }
296
-
297
- /** Override WordPress Themes API response with our own themes API*/
298
- public function installer_theme_api_override_response( $res, $action, $args ) {
299
-
300
- if ( true === $res ) {
301
- if ( isset($args->browse) ) {
302
- $browse = $args->browse;
303
- if ( in_array( $browse, $this->theme_repo ) ) {
304
- //Uniquely validated for our themes
305
- if ( 'query_themes' == $action ) {
306
- //Client querying OTGS themes
307
- //Check for registration status
308
- if ( isset($this->theme_user_registration[$browse]) ) {
309
- //Set
310
- if ( !($this->theme_user_registration[$browse]) ) {
311
- //Not registered yet
312
- $res = new stdClass();
313
- $res->info = array();
314
- $res->themes = array();
315
- return $res;
316
- } else {
317
- //Registered
318
- $themes = $this->installer_theme_get_themes( '', $browse );
319
- $res = $this->installer_theme_format_response( $themes, $action );
320
- }
321
- }
322
- }
323
- }
324
- } elseif ( isset($args->slug) ) {
325
- //We are installing theme
326
- //Lets uniquely validate if this belongs to our theme
327
- $theme_to_install = $args->slug;
328
-
329
- //Lets uniquely validate if this belongs to us
330
- //Check if this is OTGS theme
331
- $validate_check = $this->installer_themes_belong_to_us( $theme_to_install );
332
- if ( $validate_check ) {
333
- //Belongs to us
334
- if ( ($res) && ('theme_information' == $action) ) {
335
- $themes = $this->installer_theme_get_themes( '', $this->installer_theme_active_tab );
336
- $res = $this->installer_theme_format_response( $themes, $action, $args->slug );
337
- }
338
- }
339
- }
340
- return $res;
341
- } else {
342
- //Default WP Themes here
343
- $client_side_active_tab = get_option( 'wp_installer_clientside_active_tab' );
344
- if ( $client_side_active_tab ) {
345
- if ( !(in_array( $client_side_active_tab, $this->theme_repo )) ) {
346
- //Not OTGS tab
347
- return $res;
348
- }
349
- }
350
-
351
- }
352
- }
353
-
354
- /** Get Themes */
355
- private function installer_theme_get_themes( $product_url = '', $repo_source = '' ) {
356
-
357
- //Query API
358
- if ( empty($product_url) ) {
359
- //Not set
360
- if ( isset($this->repository_theme_products[$this->installer_theme_active_tab]) ) {
361
- $query_remote_url = $this->repository_theme_products[$this->installer_theme_active_tab];
362
- }
363
-
364
- } else {
365
- $query_remote_url = $product_url;
366
- }
367
-
368
- //Let's retrieved current installer settings so we won't be querying all the time
369
- $current_installer_settings = WP_Installer()->get_settings();
370
-
371
- //Set $themes to FALSE by default
372
- $themes = false;
373
-
374
- if ( (is_array( $current_installer_settings )) && (!(empty($current_installer_settings))) ) {
375
-
376
- //Set and already defined, retrieved $products
377
- if ( isset($current_installer_settings['repositories'][$repo_source]['data']) ) {
378
- $products = $current_installer_settings['repositories'][$repo_source]['data'];
379
- if ( isset($products['downloads']['themes']) ) {
380
- $themes = $products['downloads']['themes'];
381
- }
382
- }
383
-
384
- } else {
385
-
386
- //Call API
387
- $response = wp_remote_get( $query_remote_url );
388
-
389
- if ( is_wp_error( $response ) ) {
390
- //Error detected: http fallback
391
- $query_remote_url = preg_replace( "@^https://@", 'http://', $query_remote_url );
392
- $response = wp_remote_get( $query_remote_url );
393
- }
394
-
395
- if ( !(is_wp_error( $response )) ) {
396
- //Not WP error
397
- //Evaluate response
398
- if ( $response && isset($response['response']['code']) && $response['response']['code'] == 200 ) {
399
- //In this case, response is set and defined, proceed...
400
- $body = wp_remote_retrieve_body( $response );
401
- if ( $body ) {
402
- $products = json_decode( $body, true );
403
- if ( isset($products['downloads']['themes']) ) {
404
- $themes = $products['downloads']['themes'];
405
- }
406
- }
407
-
408
- }
409
- }
410
- }
411
-
412
- //Return themes, can be filtered by user subscription type
413
- return apply_filters( 'installer_theme_get_themes', $themes, $this->installer_theme_active_tab );
414
- }
415
-
416
- /** Format response in compatibility with WordPress Theme API response */
417
- private function installer_theme_format_response( $themes, $action, $slug = '' ) {
418
-
419
- //Let's append download link only when retrieving theme information for installation
420
- if ( ('theme_information' == $action) && (!(empty($slug))) ) {
421
-
422
- //Only return one result -> the theme to be installed
423
- foreach ( $themes as $k => $theme ) {
424
- if ( $slug == $theme['basename'] ) {
425
- $theme['download_link'] = WP_Installer()->append_site_key_to_download_url( $theme['url'], $this->installer_site_key[$this->installer_theme_active_tab], $this->installer_theme_active_tab );
426
- $theme = json_decode( json_encode( $theme ), FALSE );
427
- return $theme;
428
- }
429
- }
430
-
431
- } else {
432
-
433
- $res = new stdClass();
434
- $res->info = array();
435
- $res->themes = array();
436
-
437
- //Define info
438
- $res->info['page'] = 1;
439
- $res->info['pages'] = 10;
440
-
441
- //Let's count available themes ;
442
- $res->info['results'] = count( $themes );
443
-
444
- //Let's saved themes for easy access later on
445
- $this->installer_theme_savethemes_by_slug( $themes );
446
-
447
- //Let's defined available themes
448
- if ( isset($this->installer_theme_subscription_type) ) {
449
- //Has subscription type defined, let's saved what is associated with this subscription
450
- $this->installer_theme_available( $this->installer_theme_active_tab, $this->installer_theme_subscription_type );
451
- } else {
452
- $this->installer_theme_available( $this->installer_theme_active_tab );
453
- }
454
-
455
- //Let's add themes to the overriden WordPress API Theme response
456
- /** Installer 1.7.6: Update to compatible data format response from WP Theme API */
457
- $theme_compatible_array=array();
458
- if ((is_array($themes))) {
459
- foreach ($themes as $k=>$v) {
460
- $theme_compatible_array[]=(object)($v);
461
- }
462
- }
463
- $res->themes = $theme_compatible_array;
464
- $res->themes = apply_filters( 'installer_theme_hook_response_theme', $res->themes );
465
- return $res;
466
- }
467
- }
468
-
469
- /** Let's save all available themes by its slug after any latest API query */
470
- private function installer_theme_savethemes_by_slug( $themes, $doing_query = false ) {
471
-
472
- if ( !($doing_query) ) {
473
- $this->installer_themes[$this->installer_theme_active_tab] = array();
474
- }
475
-
476
- if ( !(empty($themes)) ) {
477
- $themes_for_saving = array();
478
- foreach ( $themes as $k => $theme ) {
479
- if ( !($doing_query) ) {
480
- if ( isset($theme['slug']) ) {
481
- $theme_slug = $theme['slug'];
482
- if ( !(empty($theme_slug)) ) {
483
- $themes_for_saving[] = $theme_slug;
484
- }
485
- }
486
- } else {
487
-
488
- if ( ((isset($theme['slug'])) && (isset($theme['version'])) &&
489
- (isset($theme['theme_page_url']))) && (isset($theme['url']))
490
- ) {
491
- $theme_slug = $theme['slug'];
492
- $theme_version = $theme['version'];
493
- $theme_page_url = $theme['theme_page_url'];
494
- $theme_url = $theme['url'];
495
- if ( (!(empty($theme_slug))) && (!(empty($theme_version))) &&
496
- (!(empty($theme_page_url))) && (!(empty($theme_url)))
497
- ) {
498
- //$theme_slug is unique for every theme
499
- $themes_for_saving[$theme_slug] = array(
500
- 'version' => $theme_version,
501
- 'theme_page_url' => $theme_page_url,
502
- 'url' => $theme_url
503
- );
504
-
505
- }
506
- }
507
- }
508
-
509
- }
510
-
511
- if ( !(empty($themes_for_saving)) ) {
512
- //Has themes for saving
513
- if ( !($doing_query) ) {
514
- //Not doing query
515
- $existing_themes = get_option( $this->installer_themes_option[$this->installer_theme_active_tab] );
516
- if ( !($existing_themes) ) {
517
- //Does not yet exists
518
- delete_option( $this->installer_themes_option[$this->installer_theme_active_tab] );
519
- update_option( $this->installer_themes_option[$this->installer_theme_active_tab], $themes_for_saving );
520
- } else {
521
- //exists, check if we need to update
522
- if ( $existing_themes == $themes_for_saving ) {
523
- //Equal, no need to update here
524
- } else {
525
- //Update
526
- delete_option( $this->installer_themes_option[$this->installer_theme_active_tab] );
527
- update_option( $this->installer_themes_option[$this->installer_theme_active_tab], $themes_for_saving );
528
- }
529
- }
530
- } else {
531
- //Used for query purposes only, don't save anything
532
- return $themes_for_saving;
533
- }
534
- }
535
- }
536
- }
537
-
538
- /** Available themes */
539
- private function installer_theme_available( $repo, $subscription_type = '' ) {
540
-
541
- $subscription_type = intval( $subscription_type );
542
- if ( $subscription_type > 0 ) {
543
-
544
- //Here we have a case of validated subscription
545
- //We need to set themes that is available to this subscription
546
- $themes_associated_with_subscription = $this->installer_themes[$repo] = $this->installer_theme_get_themes_by_subscription( $subscription_type, $repo );
547
- if ( !(empty($themes_associated_with_subscription)) ) {
548
- //Has themes
549
- $this->installer_themes[$repo] = $themes_associated_with_subscription;
550
- }
551
- } else {
552
-
553
- //Get themes
554
- $this->installer_themes[$repo] = get_option( $this->installer_themes_option[$repo] );
555
- }
556
- }
557
-
558
- /** Theme upgrade check */
559
- public function installer_theme_upgrade_check( $the_value ) {
560
-
561
- //Step1: Let's looped through repos with themes and check if we have updates available for them.
562
- if ( (is_array( $this->installer_repo_with_themes )) && (!(empty($this->installer_repo_with_themes))) ) {
563
- foreach ( $this->installer_repo_with_themes as $k => $repo_slug ) {
564
- //Step2: Let's checked if we have update for this theme
565
- $update_available = get_option( $this->installer_themes_available_updates[$repo_slug] );
566
- if ( $update_available ) {
567
- if ( (is_array( $update_available )) && (!(empty($update_available))) ) {
568
- //Has updates available coming from this specific theme repo
569
- //Let's loop through the themes that needs update
570
- foreach ( $update_available as $theme_slug => $v ) {
571
- //Add to response API
572
- $the_value->response [$theme_slug] = array(
573
- 'theme' => $theme_slug,
574
- 'new_version' => $v['new_version'],
575
- 'url' => $v['url'],
576
- 'package' => $v['package']
577
- );
578
- }
579
- }
580
- }
581
- }
582
- }
583
- //Return
584
- return $the_value;
585
- }
586
-
587
- /** Return repositories that has themes */
588
- private function installer_theme_reposities_that_has_themes( $repositories, $ret_value = true, $doing_api_query = false ) {
589
-
590
- $repositories_with_themes = array();
591
-
592
- if ( (is_array( $repositories )) && (!(empty($repositories))) ) {
593
-
594
- //Let's checked if we have something before
595
- $themes = get_option( 'installer_repositories_with_theme' );
596
-
597
- if ( (!($themes)) || ($doing_api_query) ) {
598
- //Not yet defined
599
- //Loop through each repositories and check whether they have themes
600
- foreach ( $repositories as $k => $v ) {
601
- if ( isset($v['products']) ) {
602
- $products_url = $v['products'];
603
- $themes = $this->installer_theme_get_themes( $products_url, $k );
604
- if ( (is_array( $themes )) && (!(empty($themes))) ) {
605
- //Repo has themes
606
- $repositories_with_themes[] = $k;
607
- }
608
- }
609
- }
610
- } else {
611
- //Already set
612
- $repositories_with_themes = $themes;
613
- }
614
-
615
- if ( (((is_array( $repositories_with_themes )) && (!(empty($repositories_with_themes)))) && (!($themes))) || ($doing_api_query) ) {
616
- //Save to db
617
- update_option( 'installer_repositories_with_theme', $repositories_with_themes );
618
- }
619
- }
620
-
621
- if ( $ret_value ) {
622
- return $repositories_with_themes;
623
- }
624
-
625
- }
626
-
627
- /** When WordPress queries its own Themes API, we sync with our own */
628
- public function installer_theme_sync_native_wp_api( $response, $responsetext, $class, $args, $url ) {
629
-
630
- $api_native_string = 'api.wordpress.org/themes/';
631
- if ( (strpos( $url, $api_native_string ) !== false) ) {
632
- //WordPress is querying its own themes API
633
- $installer_repositories = WP_Installer()->get_repositories();
634
-
635
- //Query our own API and update repository values too
636
- $this->installer_theme_reposities_that_has_themes( $installer_repositories, false, true );
637
- }
638
- }
639
-
640
- /** Returns product name by theme repo slug */
641
- private function installer_theme_get_repo_product_name( $theme_repo ) {
642
-
643
- $theme_repo_name = false;
644
-
645
- if ( isset(WP_Installer()->settings['repositories'][$theme_repo]['data']['product-name']) ) {
646
- //Set
647
- $prod_name = WP_Installer()->settings['repositories'][$theme_repo]['data']['product-name'];
648
- if ( !(empty($prod_name)) ) {
649
- $theme_repo_name = $prod_name;
650
- }
651
- } else {
652
- //Not yet
653
- if ( $theme_repo == $this->theme_repo ) {
654
- $result = $this->installer_theme_general_api_query();
655
- if ( isset($result['product-name']) ) {
656
- $product_name = $result['product-name'];
657
- if ( !(empty($product_name)) ) {
658
- $theme_repo_name = $product_name;
659
- }
660
- }
661
- }
662
- }
663
-
664
- return $theme_repo_name;
665
- }
666
-
667
- /** General query API method, returns $products */
668
- private function installer_theme_general_api_query() {
669
- $products = false;
670
- $response = wp_remote_get( $this->repository_theme_products );
671
- if ( !(is_wp_error( $response )) ) {
672
- //Not WP error
673
- //Evaluate response
674
- if ( $response && isset($response['response']['code']) && $response['response']['code'] == 200 ) {
675
- //In this case, response is set and defined, proceed...
676
- $body = wp_remote_retrieve_body( $response );
677
- if ( $body ) {
678
- $result = json_decode( $body, true );
679
- if ( (is_array( $result )) && (!(empty($result))) ) {
680
- $products = $result;
681
- }
682
- }
683
-
684
- }
685
- }
686
-
687
- return $products;
688
- }
689
-
690
- /** General method to check if themes are OTGS themes based on its slug*/
691
- private function installer_themes_belong_to_us( $theme_slug ) {
692
-
693
- $found = false;
694
- $theme_slug = trim( $theme_slug );
695
-
696
- foreach ( $this->installer_themes as $repo_with_theme => $themes ) {
697
- foreach ( $themes as $k => $otgs_theme_slug ) {
698
- if ( $theme_slug == $otgs_theme_slug ) {
699
- //match found! Theme belongs to otgs
700
- return true;
701
- }
702
- }
703
- }
704
- return $found;
705
-
706
- }
707
-
708
- /** Sets active tab on init */
709
- public function installer_theme_sets_active_tab_on_init() {
710
-
711
- if ( isset ($_SERVER ['REQUEST_URI']) ) {
712
- $request_uri = $_SERVER ['REQUEST_URI'];
713
- if ( isset ($_GET ['browse']) ) {
714
- $active_tab = trim( $_GET ['browse'] );
715
- $this->installer_theme_active_tab = $active_tab;
716
- } elseif ( isset ($_POST ['request'] ['browse']) ) {
717
- $active_tab = trim( $_POST ['request'] ['browse'] );
718
- $this->installer_theme_active_tab = $active_tab;
719
- } elseif ( (isset ($_GET ['theme_repo'])) && (isset ($_GET ['action'])) ) {
720
- $theme_repo = trim( $_GET ['theme_repo'] );
721
- $the_action = trim( $_GET ['action'] );
722
- if ( ('install-theme' == $the_action) && (!(empty($theme_repo))) ) {
723
- $this->installer_theme_active_tab = $theme_repo;
724
- }
725
- } elseif ( wp_get_referer() ) {
726
- $referer = wp_get_referer();
727
- $parts = parse_url( $referer );
728
- if ( isset($parts['query']) ) {
729
- parse_str( $parts['query'], $query );
730
- if ( isset($query['browse']) ) {
731
- $this->installer_theme_active_tab = $query['browse'];
732
- }
733
- }
734
- }
735
- }
736
- }
737
-
738
- /** WP Theme API compatibility- added num ratings */
739
- /** Installer 1.7.6+ Added updated 'rating' field */
740
- public function installer_theme_add_num_ratings( $themes ) {
741
-
742
- if ( (is_array( $themes )) && (!(empty($themes))) ) {
743
- foreach ( $themes as $k => $v ) {
744
- if ( !(isset($v->num_ratings)) ) {
745
- $themes[$k]->num_ratings = 100;
746
- }
747
- if ( !(isset($v->rating)) ) {
748
- $themes[$k]->rating = 100;
749
- }
750
- }
751
- }
752
-
753
- return $themes;
754
- }
755
-
756
- /** When WordPress.org makes a call to its repository, let's run our own upgrade checks too */
757
- public function installer_theme_sync_call_wp_theme_api( $locales ) {
758
-
759
- $this->installer_theme_upgrade_theme_check();
760
-
761
- return $locales;
762
- }
763
-
764
- /** Upgrade theme check */
765
- private function installer_theme_upgrade_theme_check() {
766
-
767
- // Step1-> we get all installed themes in clients local themes directory
768
- $installed_themes = wp_get_themes();
769
-
770
- // Step2: We need to loop through each repository with themes
771
- foreach ( $this->installer_repo_with_themes as $k => $repo_slug ) {
772
-
773
- // We then need to retrieved the products URL for each of this repo
774
- $products_url = $this->repository_theme_products [$repo_slug];
775
-
776
- // Step3-> we get all available themes in our repository via API based on this URL
777
- $available_themes = $this->installer_theme_get_themes( $products_url, $repo_slug );
778
-
779
- if ( !($available_themes) ) {
780
-
781
- // API is not available as of the moment, return..
782
- return;
783
- } else {
784
-
785
- // We have available themes here...
786
- // Step4->let's simplify available themes data by slugs
787
- $simplified_available_themes = $this->installer_theme_savethemes_by_slug( $available_themes, true );
788
-
789
- // Step5->Let's loop through installed themes
790
- if ( (is_array( $installed_themes )) && (!(empty ($installed_themes))) ) {
791
- $otgs_theme_updates_available = array();
792
- foreach ( $installed_themes as $theme_slug => $theme_object ) {
793
- if ( array_key_exists( $theme_slug, $simplified_available_themes ) ) {
794
-
795
- // This is our theme
796
- // Step6->Let's get version of the local theme installed
797
- $local_version = $theme_object->get( 'Version' );
798
-
799
- // Step7->Let's get the latest version of this theme, page URL and download URL from our repository
800
- $repository_version = $simplified_available_themes [$theme_slug] ['version'];
801
- $theme_page_url = $simplified_available_themes [$theme_slug] ['theme_page_url'];
802
- $theme_download_url = $simplified_available_themes [$theme_slug] ['url'];
803
-
804
- // Step8->Let's compare the version
805
- if ( version_compare( $repository_version, $local_version, '>' ) ) {
806
-
807
- // Update available for this theme
808
- // Step9-> Define download URL with site key
809
- $package_url = WP_Installer()->append_site_key_to_download_url( $theme_download_url, $this->installer_site_key [$repo_slug], $repo_slug );
810
-
811
- //Step10-> Assign to updates array for later accessing.
812
- $otgs_theme_updates_available[$theme_slug] = array(
813
- 'theme' => $theme_slug,
814
- 'new_version' => $repository_version,
815
- 'url' => $theme_page_url,
816
- 'package' => $package_url
817
- );
818
- }
819
- }
820
- }
821
- //Exited the upgrade loop for this specific theme repository
822
- if ( !(empty($otgs_theme_updates_available)) ) {
823
- //Has updates
824
- update_option( $this->installer_themes_available_updates[$repo_slug], $otgs_theme_updates_available );
825
- } else {
826
- //No updates
827
- delete_option( $this->installer_themes_available_updates[$repo_slug] );
828
- }
829
-
830
- }
831
- }
832
- }
833
- }
834
-
835
- /** When the user is on Themes install page OTG themes repository, let's the currently selected tab */
836
- public function installer_theme_add_query_arg_tab( $url, $path, $blog_id = null ) {
837
-
838
- $wp_install_string = 'update.php?action=install-theme';
839
- if ( $path == $wp_install_string ) {
840
- if ( isset($this->installer_theme_active_tab) ) {
841
- if ( !(empty($this->installer_theme_active_tab)) ) {
842
- $url = add_query_arg( array(
843
- 'theme_repo' => $this->installer_theme_active_tab
844
- ), $url );
845
- }
846
- }
847
- }
848
- return $url;
849
- }
850
-
851
- /** Save frontend theme tab selected */
852
- public function installer_theme_frontend_selected_tab() {
853
- if ( isset($_POST["frontend_tab_selected"]) ) {
854
- check_ajax_referer( 'installer_theme_frontend_selected_tab', 'installer_theme_frontend_selected_tab_nonce' );
855
-
856
- //Client_side_active_tab
857
- $frontend_tab_selected = filter_input( INPUT_POST, 'frontend_tab_selected', FILTER_SANITIZE_FULL_SPECIAL_CHARS, FILTER_NULL_ON_FAILURE );
858
- if ( !(empty($frontend_tab_selected)) ) {
859
- //Front end tab selected
860
- update_option( 'wp_installer_clientside_active_tab', $frontend_tab_selected, false );
861
-
862
- //Check for registration status
863
- if ( isset($this->theme_user_registration[$frontend_tab_selected]) ) {
864
- //Set
865
- if ( !($this->theme_user_registration[$frontend_tab_selected]) ) {
866
- //Not registered yet
867
-
868
- if ( is_multisite() ) {
869
- $admin_url_passed = network_admin_url();
870
- } else {
871
- $admin_url_passed = admin_url();
872
- }
873
-
874
- $registration_url = $admin_url_passed . 'plugin-install.php?tab=commercial#installer_repo_' . $frontend_tab_selected;
875
-
876
- //Message and link
877
- $theme_repo_name = $this->installer_theme_get_repo_product_name( $frontend_tab_selected );;
878
- $response['unregistered_messages'] = sprintf( __( 'To install and update %s, please %sregister%s %s for this site.', 'installer' ),
879
- $theme_repo_name, '<a href="' . $registration_url . '">', '</a>', $theme_repo_name );
880
-
881
- }
882
- }
883
-
884
- $response['output'] = $frontend_tab_selected;
885
- echo json_encode( $response );
886
- }
887
- die();
888
- }
889
- die();
890
- }
891
-
892
- /** Installer loaded aux hooks */
893
- public function installer_theme_loaded_hooks() {
894
-
895
- if ( isset($this->installer_theme_subscription_type) ) {
896
- $subscription_type = intval( $this->installer_theme_subscription_type );
897
- if ( $subscription_type > 0 ) {
898
- //Client is subscribed
899
- add_filter( 'installer_theme_get_themes', array($this, 'installer_theme_filter_themes_by_subscription'), 10, 2 );
900
- }
901
- }
902
-
903
- }
904
-
905
- /** Get themes by subscription type */
906
- protected function installer_theme_get_themes_by_subscription( $subscription_type, $repo ) {
907
-
908
- $themes_associated_with_subscription = array();
909
- if ( isset(WP_Installer()->settings['repositories'][$repo]['data']['packages']) ) {
910
- //Set
911
- $packages = WP_Installer()->settings['repositories'][$repo]['data']['packages'];
912
- $available_themes_subscription = array();
913
- foreach ( $packages as $package_id => $package_details ) {
914
- if ( isset($package_details['products']) ) {
915
- $the_products = $package_details['products'];
916
- foreach ( $the_products as $product_slug => $product_details ) {
917
- if ( isset($product_details['subscription_type']) ) {
918
- $subscription_type_from_settings = intval( $product_details['subscription_type'] );
919
- if ( $subscription_type_from_settings == $subscription_type ) {
920
- //We found the subscription
921
- if ( isset($product_details['themes']) ) {
922
- $themes_associated_with_subscription = $product_details['themes'];
923
- return $themes_associated_with_subscription;
924
- }
925
- }
926
- }
927
-
928
- }
929
- }
930
- }
931
- }
932
- return $themes_associated_with_subscription;
933
- }
934
-
935
- /** Filter API theme response according to user subscription */
936
- public function installer_theme_filter_themes_by_subscription( $themes, $active_tab ) {
937
-
938
- //Step1, we only filter OTGS themes
939
- $orig = count( $themes );
940
- if ( in_array( $active_tab, $this->theme_repo ) ) {
941
- //OTGS Theme
942
- //Step2, we retrieved the available themes based on client subscription
943
- if ( isset($this->installer_themes[$active_tab]) ) {
944
- $available_themes = $this->installer_themes[$active_tab];
945
- //Step3, we filter $themes based on this info
946
- if ( (is_array( $themes )) && (!(empty($themes))) ) {
947
- foreach ( $themes as $k => $theme ) {
948
- //Step4, get theme slug
949
- if ( isset($theme['slug']) ) {
950
- $theme_slug = $theme['slug'];
951
- if ( !(empty($theme_slug)) ) {
952
- if ( !(in_array( $theme_slug, $available_themes )) ) {
953
- //This theme is not in available themes
954
- unset($themes[$k]);
955
- }
956
- }
957
- }
958
- }
959
- }
960
- }
961
- }
962
- $new = count( $themes );
963
- if ( $orig != $new ) {
964
- //It is filtered
965
- $themes = array_values( $themes );
966
- }
967
-
968
- return $themes;
969
- }
970
-
971
- /** Hook to wp_loaded, fires when all Installer theme class is ready */
972
- public function installer_themes_support_set_up_func() {
973
- do_action( 'installer_themes_support_set_up' );
974
- }
975
-
976
- }
977
-
978
- /** Instantiate Installer Theme Class */
979
  new Installer_Theme_Class;
1
+ <?php
2
+ /**
3
+ * Installer Class for Theme Support
4
+ *
5
+ * Supports automatic updates and installation of Toolset/WPML Themes
6
+ *
7
+ * @class Installer_Theme_Class
8
+ * @version 1.6
9
+ * @category Class
10
+ * @author OnTheGoSystems
11
+ */
12
+
13
+ if ( !defined( 'ABSPATH' ) ) {
14
+ exit;
15
+ }
16
+
17
+ /**
18
+ * Installer_Theme_Class
19
+ */
20
+ class Installer_Theme_Class {
21
+
22
+ /** Theme Repository */
23
+ private $theme_repo;
24
+
25
+ /** Repository API */
26
+ private $repository_api;
27
+
28
+ /** Repository Theme Products */
29
+ private $repository_theme_products;
30
+
31
+ /** Site URL */
32
+ private $installer_site_url;
33
+
34
+ /** Site Key */
35
+ private $installer_site_key;
36
+
37
+ /** The Themes Option */
38
+ protected $installer_themes_option;
39
+
40
+ /** Update settings */
41
+ protected $installer_themes_available_updates;
42
+
43
+ /** The Themes */
44
+ protected $installer_themes = array();
45
+
46
+ /** Repository with themes */
47
+ protected $installer_repo_with_themes;
48
+
49
+ /** Active tab */
50
+ protected $installer_theme_active_tab;
51
+
52
+ /** Theme user registration */
53
+ protected $theme_user_registration;
54
+
55
+ /** Client active subscription */
56
+ protected $installer_theme_subscription_type;
57
+
58
+ public function __construct() {
59
+
60
+ /** Properties */
61
+
62
+ //Get installer repositories
63
+ $installer_repositories = WP_Installer()->get_repositories();
64
+
65
+ //Get repos with themes
66
+ $repos_with_themes = $this->installer_theme_reposities_that_has_themes( $installer_repositories );
67
+
68
+ if ( is_array( $repos_with_themes ) ) {
69
+ //Assign to property
70
+ $this->installer_repo_with_themes = $repos_with_themes;
71
+
72
+ //Let's looped through repos with themes
73
+ foreach ( $repos_with_themes as $k => $repo ) {
74
+
75
+ //$repo could be 'toolset' or 'wpml'
76
+ //Assign each repo with theme to property
77
+ $this->theme_repo[] = $repo;
78
+
79
+ if ( (isset($installer_repositories[$repo]['api-url'])) && (isset($installer_repositories[$repo]['products'])) ) {
80
+
81
+ //Define the rest of the properties based on the given repo
82
+ $this->repository_api[$repo] = $installer_repositories[$repo]['api-url'];
83
+ $this->repository_theme_products[$repo] = $installer_repositories[$repo]['products'];
84
+ $this->installer_site_url[$repo] = WP_Installer()->get_installer_site_url( $repo );
85
+ $this->installer_site_key[$repo] = WP_Installer()->get_site_key( $repo );
86
+ $this->theme_user_registration[$repo] = false;
87
+
88
+ if ( WP_Installer()->repository_has_valid_subscription( $repo ) ) {
89
+
90
+ $this->installer_theme_subscription_type = WP_Installer()->get_subscription_type_for_repository( $repo );
91
+ $this->installer_themes_option[$repo] = 'wp_installer_' . $repo . '_themes';
92
+ $this->installer_themes_available_updates[$repo] = 'wp_installer_' . $repo . '_updated_themes';
93
+ $this->installer_theme_active_tab = '';
94
+
95
+ //We only set themes available to this validated subscription
96
+ $this->installer_theme_available( $repo, $this->installer_theme_subscription_type );
97
+
98
+ add_action( 'installer_themes_support_set_up', array($this, 'installer_theme_sets_active_tab_on_init'), 10 );
99
+ $this->theme_user_registration[$repo] = true;
100
+ }
101
+
102
+ /** We are ready.. let's initialize .... */
103
+ $this->init();
104
+ }
105
+ }
106
+ add_action( 'installer_themes_support_set_up', array($this, 'installer_theme_loaded_hooks') );
107
+ }
108
+ }
109
+
110
+ /** Init */
111
+ public function init() {
112
+ add_action( 'admin_enqueue_scripts', array($this, 'installer_theme_enqueue_scripts') );
113
+ add_filter( 'themes_api', array($this, 'installer_theme_api_override'), 10, 3 );
114
+ add_filter( 'themes_api_result', array($this, 'installer_theme_api_override_response'), 10, 3 );
115
+ add_filter( 'site_transient_update_themes', array($this, 'installer_theme_upgrade_check'), 10, 1 );
116
+ add_action( 'http_api_debug', array($this, 'installer_theme_sync_native_wp_api'), 10, 5 );
117
+ add_filter( 'installer_theme_hook_response_theme', array($this, 'installer_theme_add_num_ratings'), 10, 1 );
118
+ add_filter( 'themes_update_check_locales', array($this, 'installer_theme_sync_call_wp_theme_api'), 10, 1 );
119
+ add_filter( 'admin_url', array($this, 'installer_theme_add_query_arg_tab'), 10, 3 );
120
+ add_filter( 'network_admin_url', array($this, 'installer_theme_add_query_arg_tab'), 10, 2 );
121
+ add_action( 'wp_ajax_installer_theme_frontend_selected_tab', array($this, 'installer_theme_frontend_selected_tab'), 0 );
122
+ add_action( 'wp_loaded', array($this, 'installer_themes_support_set_up_func') );
123
+ }
124
+
125
+ /** Enqueue scripts */
126
+ public function installer_theme_enqueue_scripts() {
127
+ $current_screen = $this->installer_theme_current_screen();
128
+ $commercial_plugin_screen = $this->installer_theme_is_commercial_plugin_screen( $current_screen );
129
+ if ( ('theme-install' == $current_screen) || ($commercial_plugin_screen) || ('theme-install-network' == $current_screen) ) {
130
+ $repo_with_themes = $this->installer_repo_with_themes;
131
+ $js_array = array();
132
+ if ( is_array( $repo_with_themes ) ) {
133
+ foreach ( $repo_with_themes as $k => $v ) {
134
+
135
+ //Hyperlink text
136
+ $theme_repo_name = $this->installer_theme_get_repo_product_name( $v );
137
+ $the_hyperlink_text = esc_js( $theme_repo_name );
138
+
139
+ if ( is_multisite() ) {
140
+ $admin_url_passed = network_admin_url();
141
+ } else {
142
+ $admin_url_passed = admin_url();
143
+ }
144
+
145
+ //Define
146
+ $js_array[$v] = array(
147
+ 'the_hyperlink_text' => $the_hyperlink_text,
148
+ 'registration_status' => $this->theme_user_registration[$v],
149
+ 'is_commercial_plugin_tab' => $commercial_plugin_screen,
150
+ 'registration_url' => $admin_url_passed . 'plugin-install.php?tab=commercial#installer_repo_' . $v
151
+ );
152
+
153
+ }
154
+ }
155
+
156
+ if ( !(empty($js_array)) ) {
157
+ wp_enqueue_script( 'installer-theme-install', WP_Installer()->res_url() . '/res/js/installer_theme_install.js', array('jquery', 'installer-admin'), WP_Installer()->version() );
158
+ $installer_ajax_url = admin_url( 'admin-ajax.php' );
159
+
160
+ if ( is_ssl() ) {
161
+ $installer_ajax_url = str_replace( 'http://', 'https://', $installer_ajax_url );
162
+ } else {
163
+ $installer_ajax_url = str_replace( 'https://', 'http://', $installer_ajax_url );
164
+ }
165
+
166
+ //Case where user is subscribed to a subscription that does not have themes
167
+ $subscription_js_check = $this->installer_theme_subscription_does_not_have_theme( $js_array );
168
+
169
+ wp_localize_script( 'installer-theme-install', 'installer_theme_install_localize',
170
+ array(
171
+ 'js_array_installer' => $js_array,
172
+ 'ajaxurl' => $installer_ajax_url,
173
+ 'no_associated_themes' => $subscription_js_check,
174
+ 'installer_theme_frontend_selected_tab_nonce' => wp_create_nonce( 'installer_theme_frontend_selected_tab' )
175
+ )
176
+ );
177
+ }
178
+ }
179
+ }
180
+
181
+ /** Case where user is subscribed to a subscription that does not have themes */
182
+ protected function installer_theme_subscription_does_not_have_theme( $js_array ) {
183
+
184
+ $any_subscription_has_theme = array();
185
+ $number_of_registrations = array();
186
+
187
+ //Step1, we looped through JS array
188
+ foreach ( $js_array as $repo_slug => $js_details ) {
189
+
190
+ //Step2, checked if user is registered
191
+ if ( isset($this->theme_user_registration[$repo_slug]) ) {
192
+ $registration_status = $this->theme_user_registration[$repo_slug];
193
+ if ( $registration_status ) {
194
+
195
+ //Registered
196
+ $number_of_registrations[] = $repo_slug;
197
+
198
+ //Step3, we checked if the $repo_slug has available theme
199
+ $themes_available = false;
200
+ if ( isset($this->installer_themes[$repo_slug]) ) {
201
+ $themes_available = $this->installer_themes[$repo_slug];
202
+ if ( !(empty($themes_available)) ) {
203
+ //This subscription has theme
204
+ $themes_available = true;
205
+ }
206
+ }
207
+
208
+ if ( $themes_available ) {
209
+ $any_subscription_has_theme[] = $repo_slug;
210
+ }
211
+ }
212
+ }
213
+
214
+ }
215
+
216
+ //Step4, we are done looping, check if there are any repos that have themes
217
+ if ( empty($registration_status) ) {
218
+
219
+ //No registration on any repos
220
+ return FALSE;
221
+
222
+ } elseif ( !(empty($registration_status)) ) {
223
+
224
+ //Has some registration on some repos
225
+ //We then checked if this user has any active subscriptions
226
+ if ( empty($any_subscription_has_theme) ) {
227
+ //No subscription
228
+ return TRUE;
229
+ } else {
230
+ //Has subscription found
231
+ return FALSE;
232
+ }
233
+ }
234
+ }
235
+
236
+ /** Check if its the commercial plugin screen */
237
+ private function installer_theme_is_commercial_plugin_screen( $current_screen ) {
238
+ $commercial = false;
239
+ if ( ('plugin-install' == $current_screen) || ('plugin-install-network' == $current_screen) ) {
240
+ if ( isset($_GET['tab']) ) {
241
+ $tab = $_GET['tab'];
242
+ if ( 'commercial' == $tab ) {
243
+ $commercial = true;
244
+ }
245
+ }
246
+ }
247
+ return $commercial;
248
+ }
249
+
250
+ /** Current screen */
251
+ private function installer_theme_current_screen() {
252
+
253
+ $current_screen_loaded = false;
254
+
255
+ if ( function_exists( 'get_current_screen' ) ) {
256
+
257
+ $screen_output = get_current_screen();
258
+ $current_screen_loaded = $screen_output->id;
259
+
260
+ }
261
+
262
+ return $current_screen_loaded;
263
+
264
+ }
265
+
266
+ /** Override WordPress Themes API */
267
+ public function installer_theme_api_override( $api_boolean, $action, $args ) {
268
+
269
+ //Let's checked if user is browsing our themes
270
+ if ( isset($args->browse) ) {
271
+ $browse = $args->browse;
272
+ if ( in_array( $browse, $this->theme_repo ) ) {
273
+ //Uniquely validated for our Themes
274
+ if ( 'query_themes' == $action ) {
275
+ //User is querying or asking information about our themes, let's override
276
+ $api_boolean = true;
277
+ }
278
+ }
279
+ } elseif ( isset($args->slug) ) {
280
+ //We are installing our themes
281
+ $theme_to_install = $args->slug;
282
+
283
+ //Lets uniquely validate if this belongs to us
284
+ //Check if this is OTGS theme
285
+ $validate_check = $this->installer_themes_belong_to_us( $theme_to_install );
286
+ if ( $validate_check ) {
287
+ //Belongs to us
288
+ if ( !(empty($theme_to_install)) ) {
289
+ $api_boolean = true;
290
+ }
291
+ }
292
+ }
293
+
294
+ return $api_boolean;
295
+ }
296
+
297
+ /** Override WordPress Themes API response with our own themes API*/
298
+ public function installer_theme_api_override_response( $res, $action, $args ) {
299
+
300
+ if ( true === $res ) {
301
+ if ( isset($args->browse) ) {
302
+ $browse = $args->browse;
303
+ if ( in_array( $browse, $this->theme_repo ) ) {
304
+ //Uniquely validated for our themes
305
+ if ( 'query_themes' == $action ) {
306
+ //Client querying OTGS themes
307
+ //Check for registration status
308
+ if ( isset($this->theme_user_registration[$browse]) ) {
309
+ //Set
310
+ if ( !($this->theme_user_registration[$browse]) ) {
311
+ //Not registered yet
312
+ $res = new stdClass();
313
+ $res->info = array();
314
+ $res->themes = array();
315
+ return $res;
316
+ } else {
317
+ //Registered
318
+ $themes = $this->installer_theme_get_themes( '', $browse );
319
+ $res = $this->installer_theme_format_response( $themes, $action );
320
+ }
321
+ }
322
+ }
323
+ }
324
+ } elseif ( isset($args->slug) ) {
325
+ //We are installing theme
326
+ //Lets uniquely validate if this belongs to our theme
327
+ $theme_to_install = $args->slug;
328
+
329
+ //Lets uniquely validate if this belongs to us
330
+ //Check if this is OTGS theme
331
+ $validate_check = $this->installer_themes_belong_to_us( $theme_to_install );
332
+ if ( $validate_check ) {
333
+ //Belongs to us
334
+ if ( ($res) && ('theme_information' == $action) ) {
335
+ $themes = $this->installer_theme_get_themes( '', $this->installer_theme_active_tab );
336
+ $res = $this->installer_theme_format_response( $themes, $action, $args->slug );
337
+ }
338
+ }
339
+ }
340
+ return $res;
341
+ } else {
342
+ //Default WP Themes here
343
+ $client_side_active_tab = get_option( 'wp_installer_clientside_active_tab' );
344
+ if ( $client_side_active_tab ) {
345
+ if ( !(in_array( $client_side_active_tab, $this->theme_repo )) ) {
346
+ //Not OTGS tab
347
+ return $res;
348
+ }
349
+ }
350
+
351
+ }
352
+ }
353
+
354
+ /** Get Themes */
355
+ private function installer_theme_get_themes( $product_url = '', $repo_source = '' ) {
356
+
357
+ //Query API
358
+ if ( empty($product_url) ) {
359
+ //Not set
360
+ if ( isset($this->repository_theme_products[$this->installer_theme_active_tab]) ) {
361
+ $query_remote_url = $this->repository_theme_products[$this->installer_theme_active_tab];
362
+ }
363
+
364
+ } else {
365
+ $query_remote_url = $product_url;
366
+ }
367
+
368
+ //Let's retrieved current installer settings so we won't be querying all the time
369
+ $current_installer_settings = WP_Installer()->get_settings();
370
+
371
+ //Set $themes to FALSE by default
372
+ $themes = false;
373
+
374
+ if ( (is_array( $current_installer_settings )) && (!(empty($current_installer_settings))) ) {
375
+
376
+ //Set and already defined, retrieved $products
377
+ if ( isset($current_installer_settings['repositories'][$repo_source]['data']) ) {
378
+ $products = $current_installer_settings['repositories'][$repo_source]['data'];
379
+ if ( isset($products['downloads']['themes']) ) {
380
+ $themes = $products['downloads']['themes'];
381
+ }
382
+ }
383
+
384
+ } else {
385
+
386
+ //Call API
387
+ $response = wp_remote_get( $query_remote_url );
388
+
389
+ if ( is_wp_error( $response ) ) {
390
+ //Error detected: http fallback
391
+ $query_remote_url = preg_replace( "@^https://@", 'http://', $query_remote_url );
392
+ $response = wp_remote_get( $query_remote_url );
393
+ }
394
+
395
+ if ( !(is_wp_error( $response )) ) {
396
+ //Not WP error
397
+ //Evaluate response
398
+ if ( $response && isset($response['response']['code']) && $response['response']['code'] == 200 ) {
399
+ //In this case, response is set and defined, proceed...
400
+ $body = wp_remote_retrieve_body( $response );
401
+ if ( $body ) {
402
+ $products = json_decode( $body, true );
403
+ if ( isset($products['downloads']['themes']) ) {
404
+ $themes = $products['downloads']['themes'];
405
+ }
406
+ }
407
+
408
+ }
409
+ }
410
+ }
411
+
412
+ //Return themes, can be filtered by user subscription type
413
+ return apply_filters( 'installer_theme_get_themes', $themes, $this->installer_theme_active_tab );
414
+ }
415
+
416
+ /** Format response in compatibility with WordPress Theme API response */
417
+ private function installer_theme_format_response( $themes, $action, $slug = '' ) {
418
+
419
+ //Let's append download link only when retrieving theme information for installation
420
+ if ( ('theme_information' == $action) && (!(empty($slug))) ) {
421
+
422
+ //Only return one result -> the theme to be installed
423
+ foreach ( $themes as $k => $theme ) {
424
+ if ( $slug == $theme['basename'] ) {
425
+ $theme['download_link'] = WP_Installer()->append_site_key_to_download_url( $theme['url'], $this->installer_site_key[$this->installer_theme_active_tab], $this->installer_theme_active_tab );
426
+ $theme = json_decode( json_encode( $theme ), FALSE );
427
+ return $theme;
428
+ }
429
+ }
430
+
431
+ } else {
432
+
433
+ $res = new stdClass();
434
+ $res->info = array();
435
+ $res->themes = array();
436
+
437
+ //Define info
438
+ $res->info['page'] = 1;
439
+ $res->info['pages'] = 10;
440
+
441
+ //Let's count available themes ;
442
+ $res->info['results'] = count( $themes );
443
+
444
+ //Let's saved themes for easy access later on
445
+ $this->installer_theme_savethemes_by_slug( $themes );
446
+
447
+ //Let's defined available themes
448
+ if ( isset($this->installer_theme_subscription_type) ) {
449
+ //Has subscription type defined, let's saved what is associated with this subscription
450
+ $this->installer_theme_available( $this->installer_theme_active_tab, $this->installer_theme_subscription_type );
451
+ } else {
452
+ $this->installer_theme_available( $this->installer_theme_active_tab );
453
+ }
454
+
455
+ //Let's add themes to the overriden WordPress API Theme response
456
+ /** Installer 1.7.6: Update to compatible data format response from WP Theme API */
457
+ $theme_compatible_array=array();
458
+ if ((is_array($themes))) {
459
+ foreach ($themes as $k=>$v) {
460
+ $theme_compatible_array[]=(object)($v);
461
+ }
462
+ }
463
+ $res->themes = $theme_compatible_array;
464
+ $res->themes = apply_filters( 'installer_theme_hook_response_theme', $res->themes );
465
+ return $res;
466
+ }
467
+ }
468
+
469
+ /** Let's save all available themes by its slug after any latest API query */
470
+ private function installer_theme_savethemes_by_slug( $themes, $doing_query = false ) {
471
+
472
+ if ( !($doing_query) ) {
473
+ $this->installer_themes[$this->installer_theme_active_tab] = array();
474
+ }
475
+
476
+ if ( !(empty($themes)) ) {
477
+ $themes_for_saving = array();
478
+ foreach ( $themes as $k => $theme ) {
479
+ if ( !($doing_query) ) {
480
+ if ( isset($theme['slug']) ) {
481
+ $theme_slug = $theme['slug'];
482
+ if ( !(empty($theme_slug)) ) {
483
+ $themes_for_saving[] = $theme_slug;
484
+ }
485
+ }
486
+ } else {
487
+
488
+ if ( ((isset($theme['slug'])) && (isset($theme['version'])) &&
489
+ (isset($theme['theme_page_url']))) && (isset($theme['url']))
490
+ ) {
491
+ $theme_slug = $theme['slug'];
492
+ $theme_version = $theme['version'];
493
+ $theme_page_url = $theme['theme_page_url'];
494
+ $theme_url = $theme['url'];
495
+ if ( (!(empty($theme_slug))) && (!(empty($theme_version))) &&
496
+ (!(empty($theme_page_url))) && (!(empty($theme_url)))
497
+ ) {
498
+ //$theme_slug is unique for every theme
499
+ $themes_for_saving[$theme_slug] = array(
500
+ 'version' => $theme_version,
501
+ 'theme_page_url' => $theme_page_url,
502
+ 'url' => $theme_url
503
+ );
504
+
505
+ }
506
+ }
507
+ }
508
+
509
+ }
510
+
511
+ if ( !(empty($themes_for_saving)) ) {
512
+ //Has themes for saving
513
+ if ( !($doing_query) ) {
514
+ //Not doing query
515
+ $existing_themes = get_option( $this->installer_themes_option[$this->installer_theme_active_tab] );
516
+ if ( !($existing_themes) ) {
517
+ //Does not yet exists
518
+ delete_option( $this->installer_themes_option[$this->installer_theme_active_tab] );
519
+ update_option( $this->installer_themes_option[$this->installer_theme_active_tab], $themes_for_saving );
520
+ } else {
521
+ //exists, check if we need to update
522
+ if ( $existing_themes == $themes_for_saving ) {
523
+ //Equal, no need to update here
524
+ } else {
525
+ //Update
526
+ delete_option( $this->installer_themes_option[$this->installer_theme_active_tab] );
527
+ update_option( $this->installer_themes_option[$this->installer_theme_active_tab], $themes_for_saving );
528
+ }
529
+ }
530
+ } else {
531
+ //Used for query purposes only, don't save anything
532
+ return $themes_for_saving;
533
+ }
534
+ }
535
+ }
536
+ }
537
+
538
+ /** Available themes */
539
+ private function installer_theme_available( $repo, $subscription_type = '' ) {
540
+
541
+ $subscription_type = intval( $subscription_type );
542
+ if ( $subscription_type > 0 ) {
543
+
544
+ //Here we have a case of validated subscription
545
+ //We need to set themes that is available to this subscription
546
+ $themes_associated_with_subscription = $this->installer_themes[$repo] = $this->installer_theme_get_themes_by_subscription( $subscription_type, $repo );
547
+ if ( !(empty($themes_associated_with_subscription)) ) {
548
+ //Has themes
549
+ $this->installer_themes[$repo] = $themes_associated_with_subscription;
550
+ }
551
+ } else {
552
+
553
+ //Get themes
554
+ $this->installer_themes[$repo] = get_option( $this->installer_themes_option[$repo] );
555
+ }
556
+ }
557
+
558
+ /** Theme upgrade check */
559
+ public function installer_theme_upgrade_check( $the_value ) {
560
+
561
+ //Step1: Let's looped through repos with themes and check if we have updates available for them.
562
+ if ( (is_array( $this->installer_repo_with_themes )) && (!(empty($this->installer_repo_with_themes))) ) {
563
+ foreach ( $this->installer_repo_with_themes as $k => $repo_slug ) {
564
+ //Step2: Let's checked if we have update for this theme
565
+ $update_available = get_option( $this->installer_themes_available_updates[$repo_slug] );
566
+ if ( $update_available ) {
567
+ if ( (is_array( $update_available )) && (!(empty($update_available))) ) {
568
+ //Has updates available coming from this specific theme repo
569
+ //Let's loop through the themes that needs update
570
+ foreach ( $update_available as $theme_slug => $v ) {
571
+ //Add to response API
572
+ $the_value->response [$theme_slug] = array(
573
+ 'theme' => $theme_slug,
574
+ 'new_version' => $v['new_version'],
575
+ 'url' => $v['url'],
576
+ 'package' => $v['package']
577
+ );
578
+ }
579
+ }
580
+ }
581
+ }
582
+ }
583
+ //Return
584
+ return $the_value;
585
+ }
586
+
587
+ /** Return repositories that has themes */
588
+ private function installer_theme_reposities_that_has_themes( $repositories, $ret_value = true, $doing_api_query = false ) {
589
+
590
+ $repositories_with_themes = array();
591
+
592
+ if ( (is_array( $repositories )) && (!(empty($repositories))) ) {
593
+
594
+ //Let's checked if we have something before
595
+ $themes = get_option( 'installer_repositories_with_theme' );
596
+
597
+ if ( (!($themes)) || ($doing_api_query) ) {
598
+ //Not yet defined
599
+ //Loop through each repositories and check whether they have themes
600
+ foreach ( $repositories as $k => $v ) {
601
+ if ( isset($v['products']) ) {
602
+ $products_url = $v['products'];
603
+ $themes = $this->installer_theme_get_themes( $products_url, $k );
604
+ if ( (is_array( $themes )) && (!(empty($themes))) ) {
605
+ //Repo has themes
606
+ $repositories_with_themes[] = $k;
607
+ }
608
+ }
609
+ }
610
+ } else {
611
+ //Already set
612
+ $repositories_with_themes = $themes;
613
+ }
614
+
615
+ if ( (((is_array( $repositories_with_themes )) && (!(empty($repositories_with_themes)))) && (!($themes))) || ($doing_api_query) ) {
616
+ //Save to db
617
+ update_option( 'installer_repositories_with_theme', $repositories_with_themes );
618
+ }
619
+ }
620
+
621
+ if ( $ret_value ) {
622
+ return $repositories_with_themes;
623
+ }
624
+
625
+ }
626
+
627
+ /** When WordPress queries its own Themes API, we sync with our own */
628
+ public function installer_theme_sync_native_wp_api( $response, $responsetext, $class, $args, $url ) {
629
+
630
+ $api_native_string = 'api.wordpress.org/themes/';
631
+ if ( (strpos( $url, $api_native_string ) !== false) ) {
632
+ //WordPress is querying its own themes API
633
+ $installer_repositories = WP_Installer()->get_repositories();
634
+
635
+ //Query our own API and update repository values too
636
+ $this->installer_theme_reposities_that_has_themes( $installer_repositories, false, true );
637
+ }
638
+ }
639
+
640
+ /** Returns product name by theme repo slug */
641
+ private function installer_theme_get_repo_product_name( $theme_repo ) {
642
+
643
+ $theme_repo_name = false;
644
+
645
+ if ( isset(WP_Installer()->settings['repositories'][$theme_repo]['data']['product-name']) ) {
646
+ //Set
647
+ $prod_name = WP_Installer()->settings['repositories'][$theme_repo]['data']['product-name'];
648
+ if ( !(empty($prod_name)) ) {
649
+ $theme_repo_name = $prod_name;
650
+ }
651
+ } else {
652
+ //Not yet
653
+ if ( $theme_repo == $this->theme_repo ) {
654
+ $result = $this->installer_theme_general_api_query();
655
+ if ( isset($result['product-name']) ) {
656
+ $product_name = $result['product-name'];
657
+ if ( !(empty($product_name)) ) {
658
+ $theme_repo_name = $product_name;
659
+ }
660
+ }
661
+ }
662
+ }
663
+
664
+ return $theme_repo_name;
665
+ }
666
+
667
+ /** General query API method, returns $products */
668
+ private function installer_theme_general_api_query() {
669
+ $products = false;
670
+ $response = wp_remote_get( $this->repository_theme_products );
671
+ if ( !(is_wp_error( $response )) ) {
672
+ //Not WP error
673
+ //Evaluate response
674
+ if ( $response && isset($response['response']['code']) && $response['response']['code'] == 200 ) {
675
+ //In this case, response is set and defined, proceed...
676
+ $body = wp_remote_retrieve_body( $response );
677
+ if ( $body ) {
678
+ $result = json_decode( $body, true );
679
+ if ( (is_array( $result )) && (!(empty($result))) ) {
680
+ $products = $result;
681
+ }
682
+ }
683
+
684
+ }
685
+ }
686
+
687
+ return $products;
688
+ }
689
+
690
+ /** General method to check if themes are OTGS themes based on its slug*/
691
+ private function installer_themes_belong_to_us( $theme_slug ) {
692
+
693
+ $found = false;
694
+ $theme_slug = trim( $theme_slug );
695
+
696
+ foreach ( $this->installer_themes as $repo_with_theme => $themes ) {
697
+ foreach ( $themes as $k => $otgs_theme_slug ) {
698
+ if ( $theme_slug == $otgs_theme_slug ) {
699
+ //match found! Theme belongs to otgs
700
+ return true;
701
+ }
702
+ }
703
+ }
704
+ return $found;
705
+
706
+ }
707
+
708
+ /** Sets active tab on init */
709
+ public function installer_theme_sets_active_tab_on_init() {
710
+
711
+ if ( isset ($_SERVER ['REQUEST_URI']) ) {
712
+ $request_uri = $_SERVER ['REQUEST_URI'];
713
+ if ( isset ($_GET ['browse']) ) {
714
+ $active_tab = trim( $_GET ['browse'] );
715
+ $this->installer_theme_active_tab = $active_tab;
716
+ } elseif ( isset ($_POST ['request'] ['browse']) ) {
717
+ $active_tab = trim( $_POST ['request'] ['browse'] );
718
+ $this->installer_theme_active_tab = $active_tab;
719
+ } elseif ( (isset ($_GET ['theme_repo'])) && (isset ($_GET ['action'])) ) {
720
+ $theme_repo = trim( $_GET ['theme_repo'] );
721
+ $the_action = trim( $_GET ['action'] );
722
+ if ( ('install-theme' == $the_action) && (!(empty($theme_repo))) ) {
723
+ $this->installer_theme_active_tab = $theme_repo;
724
+ }
725
+ } elseif ( wp_get_referer() ) {
726
+ $referer = wp_get_referer();
727
+ $parts = parse_url( $referer );
728
+ if ( isset($parts['query']) ) {
729
+ parse_str( $parts['query'], $query );
730
+ if ( isset($query['browse']) ) {
731
+ $this->installer_theme_active_tab = $query['browse'];
732
+ }
733
+ }
734
+ }
735
+ }
736
+ }
737
+
738
+ /** WP Theme API compatibility- added num ratings */
739
+ /** Installer 1.7.6+ Added updated 'rating' field */
740
+ public function installer_theme_add_num_ratings( $themes ) {
741
+
742
+ if ( (is_array( $themes )) && (!(empty($themes))) ) {
743
+ foreach ( $themes as $k => $v ) {
744
+ if ( !(isset($v->num_ratings)) ) {
745
+ $themes[$k]->num_ratings = 100;
746
+ }
747
+ if ( !(isset($v->rating)) ) {
748
+ $themes[$k]->rating = 100;
749
+ }
750
+ }
751
+ }
752
+
753
+ return $themes;
754
+ }
755
+
756
+ /** When WordPress.org makes a call to its repository, let's run our own upgrade checks too */
757
+ public function installer_theme_sync_call_wp_theme_api( $locales ) {
758
+
759
+ $this->installer_theme_upgrade_theme_check();
760
+
761
+ return $locales;
762
+ }
763
+
764
+ /** Upgrade theme check */
765
+ private function installer_theme_upgrade_theme_check() {
766
+
767
+ // Step1-> we get all installed themes in clients local themes directory
768
+ $installed_themes = wp_get_themes();
769
+
770
+ // Step2: We need to loop through each repository with themes
771
+ foreach ( $this->installer_repo_with_themes as $k => $repo_slug ) {
772
+
773
+ // We then need to retrieved the products URL for each of this repo
774
+ $products_url = $this->repository_theme_products [$repo_slug];
775
+
776
+ // Step3-> we get all available themes in our repository via API based on this URL
777
+ $available_themes = $this->installer_theme_get_themes( $products_url, $repo_slug );
778
+
779
+ if ( !($available_themes) ) {
780
+
781
+ // API is not available as of the moment, return..
782
+ return;
783
+ } else {
784
+
785
+ // We have available themes here...
786
+ // Step4->let's simplify available themes data by slugs
787
+ $simplified_available_themes = $this->installer_theme_savethemes_by_slug( $available_themes, true );
788
+
789
+ // Step5->Let's loop through installed themes
790
+ if ( (is_array( $installed_themes )) && (!(empty ($installed_themes))) ) {
791
+ $otgs_theme_updates_available = array();
792
+ foreach ( $installed_themes as $theme_slug => $theme_object ) {
793
+ if ( array_key_exists( $theme_slug, $simplified_available_themes ) ) {
794
+
795
+ // This is our theme
796
+ // Step6->Let's get version of the local theme installed
797
+ $local_version = $theme_object->get( 'Version' );
798
+
799
+ // Step7->Let's get the latest version of this theme, page URL and download URL from our repository
800
+ $repository_version = $simplified_available_themes [$theme_slug] ['version'];
801
+ $theme_page_url = $simplified_available_themes [$theme_slug] ['theme_page_url'];
802
+ $theme_download_url = $simplified_available_themes [$theme_slug] ['url'];
803
+
804
+ // Step8->Let's compare the version
805
+ if ( version_compare( $repository_version, $local_version, '>' ) ) {
806
+
807
+ // Update available for this theme
808
+ // Step9-> Define download URL with site key
809
+ $package_url = WP_Installer()->append_site_key_to_download_url( $theme_download_url, $this->installer_site_key [$repo_slug], $repo_slug );
810
+
811
+ //Step10-> Assign to updates array for later accessing.
812
+ $otgs_theme_updates_available[$theme_slug] = array(
813
+ 'theme' => $theme_slug,
814
+ 'new_version' => $repository_version,
815
+ 'url' => $theme_page_url,
816
+ 'package' => $package_url
817
+ );
818
+ }
819
+ }
820
+ }
821
+ //Exited the upgrade loop for this specific theme repository
822
+ if ( !(empty($otgs_theme_updates_available)) ) {
823
+ //Has updates
824
+ update_option( $this->installer_themes_available_updates[$repo_slug], $otgs_theme_updates_available );
825
+ } else {
826
+ //No updates
827
+ delete_option( $this->installer_themes_available_updates[$repo_slug] );
828
+ }
829
+
830
+ }
831
+ }
832
+ }
833
+ }
834
+
835
+ /** When the user is on Themes install page OTG themes repository, let's the currently selected tab */
836
+ public function installer_theme_add_query_arg_tab( $url, $path, $blog_id = null ) {
837
+
838
+ $wp_install_string = 'update.php?action=install-theme';
839
+ if ( $path == $wp_install_string ) {
840
+ if ( isset($this->installer_theme_active_tab) ) {
841
+ if ( !(empty($this->installer_theme_active_tab)) ) {
842
+ $url = add_query_arg( array(
843
+ 'theme_repo' => $this->installer_theme_active_tab
844
+ ), $url );
845
+ }
846
+ }
847
+ }
848
+ return $url;
849
+ }
850
+
851
+ /** Save frontend theme tab selected */
852
+ public function installer_theme_frontend_selected_tab() {
853
+ if ( isset($_POST["frontend_tab_selected"]) ) {
854
+ check_ajax_referer( 'installer_theme_frontend_selected_tab', 'installer_theme_frontend_selected_tab_nonce' );
855
+
856
+ //Client_side_active_tab
857
+ $frontend_tab_selected = filter_input( INPUT_POST, 'frontend_tab_selected', FILTER_SANITIZE_FULL_SPECIAL_CHARS, FILTER_NULL_ON_FAILURE );
858
+ if ( !(empty($frontend_tab_selected)) ) {
859
+ //Front end tab selected
860
+ update_option( 'wp_installer_clientside_active_tab', $frontend_tab_selected, false );
861
+
862
+ //Check for registration status
863
+ if ( isset($this->theme_user_registration[$frontend_tab_selected]) ) {
864
+ //Set
865
+ if ( !($this->theme_user_registration[$frontend_tab_selected]) ) {
866
+ //Not registered yet
867
+
868
+ if ( is_multisite() ) {
869
+ $admin_url_passed = network_admin_url();
870
+ } else {
871
+ $admin_url_passed = admin_url();
872
+ }
873
+
874
+ $registration_url = $admin_url_passed . 'plugin-install.php?tab=commercial#installer_repo_' . $frontend_tab_selected;
875
+
876
+ //Message and link
877
+ $theme_repo_name = $this->installer_theme_get_repo_product_name( $frontend_tab_selected );;
878
+ $response['unregistered_messages'] = sprintf( __( 'To install and update %s, please %sregister%s %s for this site.', 'installer' ),
879
+ $theme_repo_name, '<a href="' . $registration_url . '">', '</a>', $theme_repo_name );
880
+
881
+ }
882
+ }
883
+
884
+ $response['output'] = $frontend_tab_selected;
885
+ echo json_encode( $response );
886
+ }
887
+ die();
888
+ }
889
+ die();
890
+ }
891
+
892
+ /** Installer loaded aux hooks */
893
+ public function installer_theme_loaded_hooks() {
894
+
895
+ if ( isset($this->installer_theme_subscription_type) ) {
896
+ $subscription_type = intval( $this->installer_theme_subscription_type );
897
+ if ( $subscription_type > 0 ) {
898
+ //Client is subscribed
899
+ add_filter( 'installer_theme_get_themes', array($this, 'installer_theme_filter_themes_by_subscription'), 10, 2 );
900
+ }
901
+ }
902
+
903
+ }
904
+
905
+ /** Get themes by subscription type */
906
+ protected function installer_theme_get_themes_by_subscription( $subscription_type, $repo ) {
907
+
908
+ $themes_associated_with_subscription = array();
909
+ if ( isset(WP_Installer()->settings['repositories'][$repo]['data']['packages']) ) {
910
+ //Set
911
+ $packages = WP_Installer()->settings['repositories'][$repo]['data']['packages'];
912
+ $available_themes_subscription = array();
913
+ foreach ( $packages as $package_id => $package_details ) {
914
+ if ( isset($package_details['products']) ) {
915
+ $the_products = $package_details['products'];
916
+ foreach ( $the_products as $product_slug => $product_details ) {
917
+ if ( isset($product_details['subscription_type']) ) {
918
+ $subscription_type_from_settings = intval( $product_details['subscription_type'] );
919
+ if ( $subscription_type_from_settings == $subscription_type ) {
920
+ //We found the subscription
921
+ if ( isset($product_details['themes']) ) {
922
+ $themes_associated_with_subscription = $product_details['themes'];
923
+ return $themes_associated_with_subscription;
924
+ }
925
+ }
926
+ }
927
+
928
+ }
929
+ }
930
+ }
931
+ }
932
+ return $themes_associated_with_subscription;
933
+ }
934
+
935
+ /** Filter API theme response according to user subscription */
936
+ public function installer_theme_filter_themes_by_subscription( $themes, $active_tab ) {
937
+
938
+ //Step1, we only filter OTGS themes
939
+ $orig = count( $themes );
940
+ if ( in_array( $active_tab, $this->theme_repo ) ) {
941
+ //OTGS Theme
942
+ //Step2, we retrieved the available themes based on client subscription
943
+ if ( isset($this->installer_themes[$active_tab]) ) {
944
+ $available_themes = $this->installer_themes[$active_tab];
945
+ //Step3, we filter $themes based on this info
946
+ if ( (is_array( $themes )) && (!(empty($themes))) ) {
947
+ foreach ( $themes as $k => $theme ) {
948
+ //Step4, get theme slug
949
+ if ( isset($theme['slug']) ) {
950
+ $theme_slug = $theme['slug'];
951
+ if ( !(empty($theme_slug)) ) {
952
+ if ( !(in_array( $theme_slug, $available_themes )) ) {
953
+ //This theme is not in available themes
954
+ unset($themes[$k]);
955
+ }
956
+ }
957
+ }
958
+ }
959
+ }
960
+ }
961
+ }
962
+ $new = count( $themes );
963
+ if ( $orig != $new ) {
964
+ //It is filtered
965
+ $themes = array_values( $themes );
966
+ }
967
+
968
+ return $themes;
969
+ }
970
+
971
+ /** Hook to wp_loaded, fires when all Installer theme class is ready */
972
+ public function installer_themes_support_set_up_func() {
973
+ do_action( 'installer_themes_support_set_up' );
974
+ }
975
+
976
+ }
977
+
978
+ /** Instantiate Installer Theme Class */
979
  new Installer_Theme_Class;
embedded/installer/includes/installer-api.php CHANGED
@@ -1,81 +1,81 @@
1
- <?php
2
-
3
- class WP_Installer_API{
4
-
5
- public static function get_product_installer_link($repository_id, $package_id = false){
6
-
7
- $menu_url = WP_Installer()->menu_url();
8
-
9
- $url = $menu_url . '#' . $repository_id;
10
- if($package_id){
11
- $url .= '/' . $package_id;
12
- }
13
-
14
- return $url;
15
-
16
- }
17
-
18
- public static function get_product_price($repository_id, $package_id, $product_id, $incl_discount = false){
19
-
20
- $price = WP_Installer()->get_product_price($repository_id, $package_id, $product_id, $incl_discount);
21
-
22
- return $price;
23
- }
24
-
25
- /**
26
- * Retrieve the preferred translation service.
27
- *
28
- * @since 1.6.5
29
- *
30
- * @param string The repository id (e.g. wpml)
31
- * @return string The translation service id
32
- */
33
- public static function get_preferred_ts($repository_id = 'wpml'){
34
-
35
- if(isset(WP_Installer()->settings['repositories'][$repository_id]['ts_info']['preferred'])){
36
- return WP_Installer()->settings['repositories'][$repository_id]['ts_info']['preferred'];
37
- }
38
-
39
- return false;
40
-
41
- }
42
-
43
- /**
44
- * Set the preferred translation service.
45
- *
46
- * @since 1.6.5
47
- *
48
- * @param string The translation service id
49
- * @param string The repository id (e.g. wpml)
50
- */
51
- public static function set_preferred_ts( $value, $repository_id = 'wpml' ){
52
-
53
- if( isset( WP_Installer()->settings['repositories'][$repository_id]['ts_info']['preferred'] ) ){
54
-
55
- WP_Installer()->settings['repositories'][$repository_id]['ts_info']['preferred'] = $value;
56
-
57
- WP_Installer()->save_settings();
58
-
59
- }
60
-
61
- }
62
-
63
- /**
64
- * Retrieve the referring translation service (if any)
65
- *
66
- * @since 1.6.5
67
- *
68
- * @param string The repository id (e.g. wpml)
69
- * @return string The translation service id or false
70
- */
71
- public static function get_ts_referal($repository_id = 'wpml'){
72
-
73
- if(isset(WP_Installer()->settings['repositories'][$repository_id]['ts_info']['referal'])){
74
- return WP_Installer()->settings['repositories'][$repository_id]['ts_info']['referal'];
75
- }
76
-
77
- return false;
78
-
79
- }
80
-
81
  }
1
+ <?php
2
+
3
+ class WP_Installer_API{
4
+
5
+ public static function get_product_installer_link($repository_id, $package_id = false){
6
+
7
+ $menu_url = WP_Installer()->menu_url();
8
+
9
+ $url = $menu_url . '#' . $repository_id;
10
+ if($package_id){
11
+ $url .= '/' . $package_id;
12
+ }
13
+
14
+ return $url;
15
+
16
+ }
17
+
18
+ public static function get_product_price($repository_id, $package_id, $product_id, $incl_discount = false){
19
+
20
+ $price = WP_Installer()->get_product_price($repository_id, $package_id, $product_id, $incl_discount);
21
+
22
+ return $price;
23
+ }
24
+
25
+ /**
26
+ * Retrieve the preferred translation service.
27
+ *
28
+ * @since 1.6.5
29
+ *
30
+ * @param string The repository id (e.g. wpml)
31
+ * @return string The translation service id
32
+ */
33
+ public static function get_preferred_ts($repository_id = 'wpml'){
34
+
35
+ if(isset(WP_Installer()->settings['repositories'][$repository_id]['ts_info']['preferred'])){
36
+ return WP_Installer()->settings['repositories'][$repository_id]['ts_info']['preferred'];
37
+ }
38
+
39
+ return false;
40
+
41
+ }
42
+
43
+ /**
44
+ * Set the preferred translation service.
45
+ *
46
+ * @since 1.6.5
47
+ *
48
+ * @param string The translation service id
49
+ * @param string The repository id (e.g. wpml)
50
+ */
51
+ public static function set_preferred_ts( $value, $repository_id = 'wpml' ){
52
+
53
+ if( isset( WP_Installer()->settings['repositories'][$repository_id]['ts_info']['preferred'] ) ){
54
+
55
+ WP_Installer()->settings['repositories'][$repository_id]['ts_info']['preferred'] = $value;
56
+
57
+ WP_Installer()->save_settings();
58
+
59
+ }
60
+
61
+ }
62
+
63
+ /**
64
+ * Retrieve the referring translation service (if any)
65
+ *
66
+ * @since 1.6.5
67
+ *
68
+ * @param string The repository id (e.g. wpml)
69
+ * @return string The translation service id or false
70
+ */
71
+ public static function get_ts_referal($repository_id = 'wpml'){
72
+
73
+ if(isset(WP_Installer()->settings['repositories'][$repository_id]['ts_info']['referal'])){
74
+ return WP_Installer()->settings['repositories'][$repository_id]['ts_info']['referal'];
75
+ }
76
+
77
+ return false;
78
+
79
+ }
80
+
81
  }
embedded/installer/includes/installer-upgrader-skins.php CHANGED
@@ -1,37 +1,37 @@
1
- <?php
2
- class Installer_Upgrader_Skins extends WP_Upgrader_Skin{
3
-
4
- function __construct($args = array()){
5
- $defaults = array( 'url' => '', 'nonce' => '', 'title' => '', 'context' => false );
6
- $this->options = wp_parse_args($args, $defaults);
7
- }
8
-
9
- function header(){
10
-
11
- }
12
-
13
- function footer(){
14
-
15
- }
16
-
17
- function error($error){
18
- $this->installer_error = $error;
19
- }
20
-
21
- function add_strings(){
22
-
23
- }
24
-
25
- function feedback($string){
26
-
27
- }
28
-
29
- function before(){
30
-
31
- }
32
-
33
- function after(){
34
-
35
- }
36
-
37
  }
1
+ <?php
2
+ class Installer_Upgrader_Skins extends WP_Upgrader_Skin{
3
+
4
+ function __construct($args = array()){
5
+ $defaults = array( 'url' => '', 'nonce' => '', 'title' => '', 'context' => false );
6
+ $this->options = wp_parse_args($args, $defaults);
7
+ }
8
+
9
+ function header(){
10
+
11
+ }
12
+
13
+ function footer(){
14
+
15
+ }
16
+
17
+ function error($error){
18
+ $this->installer_error = $error;
19
+ }
20
+
21
+ function add_strings(){
22
+
23
+ }
24
+
25
+ function feedback($string){
26
+
27
+ }
28
+
29
+ function before(){
30
+
31
+ }
32
+
33
+ function after(){
34
+
35
+ }
36
+
37
  }
embedded/installer/includes/installer.class.php CHANGED
@@ -1,2559 +1,2559 @@
1
- <?php
2
-
3
- final class WP_Installer{
4
- protected static $_instance = null;
5
-
6
- public $settings = array();
7
-
8
- private $repositories = array();
9
-
10
- protected $api_debug = '';
11
-
12
- private $config = array();
13
-
14
- protected $_plugins_renew_warnings = array();
15
-
16
- protected $_gz_on = false;
17
-
18
- private $admin_messages = array();
19
-
20
- private $_using_icl = false;
21
- private $_wpml_version = false;
22
-
23
- private $package_source = array();
24
-
25
- const SITE_KEY_VALIDATION_SOURCE_OTHER = 0;
26
- const SITE_KEY_VALIDATION_SOURCE_DOWNLOAD_SPECIFIC = 1;
27
- const SITE_KEY_VALIDATION_SOURCE_DOWNLOAD_REPORT = 2;
28
- const SITE_KEY_VALIDATION_SOURCE_REGISTRATION = 3;
29
- const SITE_KEY_VALIDATION_SOURCE_REVALIDATION = 4;
30
- const SITE_KEY_VALIDATION_SOURCE_UPDATES_CHECK = 5;
31
-
32
- public $dependencies;
33
-
34
- public static function instance() {
35
-
36
- if ( is_null( self::$_instance ) ) {
37
- self::$_instance = new self();
38
- }
39
-
40
- return self::$_instance;
41
- }
42
-
43
- public function __construct(){
44
-
45
- if(!is_admin() || !is_user_logged_in()) return; //Only for admin
46
-
47
- $this->_gz_on = function_exists('gzuncompress') && function_exists('gzcompress');
48
- $this->settings = $this->get_settings();
49
-
50
- add_action('admin_notices', array($this, 'show_site_key_nags'));
51
-
52
- add_action('admin_notices', array($this, 'show_admin_messages'));
53
-
54
- add_action('admin_init', array($this, 'load_embedded_plugins'), 0);
55
-
56
- add_action('admin_menu', array($this, 'menu_setup'));
57
- add_action('network_admin_menu', array($this, 'menu_setup'));
58
-
59
- if(defined('DOING_AJAX') && isset($_POST['action']) && $_POST['action'] == 'installer_download_plugin'){
60
- add_filter( 'site_transient_update_plugins', array( $this, 'plugins_upgrade_check') );
61
- }
62
- add_filter('plugins_api', array( $this, 'custom_plugins_api_call'), 10, 3);
63
- add_filter('pre_set_site_transient_update_plugins', array( $this, 'plugins_upgrade_check'));
64
-
65
- // register repositories
66
- $this->load_repositories_list();
67
-
68
- if( empty($this->settings['last_repositories_update']) || time() - $this->settings['last_repositories_update'] > 86400
69
- || ( isset($_GET['force-check']) && $_GET['force-check'] == 1 ) ){
70
- $this->refresh_repositories_data();
71
- }
72
-
73
- // default config
74
- $this->config['plugins_install_tab'] = false;
75
-
76
- add_action('init', array($this, 'init'));
77
-
78
- //add_filter('wp_installer_buy_url', array($this, 'append_parameters_to_buy_url'));
79
-
80
- add_action('init', array($this,'load_locale'));
81
-
82
- }
83
-
84
- public function get_repositories() {
85
-
86
- return $this->repositories;
87
-
88
- }
89
-
90
- public function set_config($key, $value){
91
-
92
- $this->config[$key] = $value;
93
-
94
- }
95
-
96
- public function init(){
97
- global $pagenow;
98
-
99
- $this->dependencies = new Installer_Dependencies;
100
-
101
- if(empty($this->settings['_pre_1_0_clean_up'])) {
102
- $this->_pre_1_0_clean_up();
103
- }
104
-
105
- $this->settings = $this->_old_products_format_backwards_compatibility($this->settings);
106
-
107
- if ( !function_exists( 'get_plugins' ) ) {
108
- require_once ABSPATH . 'wp-admin/includes/plugin.php';
109
- }
110
-
111
- $this->_using_icl = function_exists('wpml_site_uses_icl') && wpml_site_uses_icl();
112
- $this->_wpml_version = defined('ICL_SITEPRESS_VERSION') ? ICL_SITEPRESS_VERSION : '';
113
-
114
- wp_enqueue_script('installer-admin', $this->res_url() . '/res/js/admin.js', array('jquery'), $this->version());
115
- wp_enqueue_style('installer-admin', $this->res_url() . '/res/css/admin.css', array(), $this->version());
116
-
117
- $translation_array = array(
118
- 'installing' => __( 'Installing %s', 'installer' ),
119
- 'updating' => __( 'Updating %s', 'installer' ),
120
- 'activating' => __( 'Activating %s', 'installer' )
121
- );
122
-
123
- wp_localize_script( 'installer-admin', 'installer_strings', $translation_array );
124
-
125
- if($pagenow == 'plugins.php'){
126
- add_action('admin_notices', array($this, 'setup_plugins_page_notices'));
127
- add_action('admin_notices', array($this, 'setup_plugins_renew_warnings'), 10);
128
- add_action('admin_notices', array($this, 'queue_plugins_renew_warnings'), 20);
129
-
130
- add_action('admin_init', array($this, 'setup_plugins_action_links'));
131
-
132
- }
133
-
134
- if($this->is_repositories_page()){
135
- add_action('admin_init', array($this, 'validate_repository_subscription'));
136
- }
137
-
138
- if(defined('DOING_AJAX')){
139
- add_action('wp_ajax_save_site_key', array($this, 'save_site_key'));
140
- add_action('wp_ajax_remove_site_key', array($this, 'remove_site_key'));
141
- add_action('wp_ajax_update_site_key', array($this, 'update_site_key'));
142
-
143
- add_action('wp_ajax_installer_download_plugin', array($this, 'download_plugin_ajax_handler'));
144
- add_action('wp_ajax_installer_activate_plugin', array($this, 'activate_plugin'));
145
-
146
- add_action('wp_ajax_installer_dismiss_nag', array($this, 'dismiss_nag'));
147
- }
148
-
149
- if($pagenow == 'update.php'){
150
- if(isset($_GET['action']) && $_GET['action'] == 'update-selected'){
151
- add_action('admin_head', array($this, 'plugin_upgrade_custom_errors')); //iframe/bulk
152
- }else{
153
- add_action('all_admin_notices', array($this, 'plugin_upgrade_custom_errors')); //regular/singular
154
- }
155
- }
156
-
157
- // WP 4.2
158
- if(defined('DOING_AJAX')){
159
- add_action('wp_ajax_update-plugin', array($this, 'plugin_upgrade_custom_errors'), 0); // high priority, before WP
160
- }
161
-
162
- //Include theme support
163
- include_once $this->plugin_path() . '/includes/class-installer-theme.php';
164
-
165
- // Extra information about the source of Installer
166
- $package_source_file = $this->plugin_path() . '/installer-source.json';
167
- if( file_exists( $package_source_file ) ){
168
- $this->package_source = json_decode( file_get_contents( $package_source_file ) );
169
- }
170
- }
171
-
172
- protected function log($message){
173
- if( defined('WPML_INSTALLER_LOGGING') && WPML_INSTALLER_LOGGING ){
174
- if($fh = @fopen( $this->plugin_path() . '/installer.log', 'a' )){
175
- fwrite($fh, current_time( 'mysql' ) . "\t" . $message . "\n");
176
- }
177
- }
178
- }
179
-
180
- public function register_admin_message($text, $type = 'updated'){
181
- $this->admin_messages[] = array('text' => $text, 'type' => $type);
182
- }
183
-
184
- public function show_admin_messages(){
185
- if(!empty($this->admin_messages)){
186
- $types = array( 'error', 'updated', 'notice' );
187
- foreach($this->admin_messages as $message){
188
- $class = in_array( $message['type'], $types ) ? $message['type'] : 'updated';
189
- ?>
190
- <div class="<?php echo $class ?>">
191
- <p>
192
- <?php echo $message['text'] ?>
193
- </p>
194
- </div>
195
- <?php
196
- }
197
- }
198
- }
199
-
200
- public function load_locale(){
201
- $locale = get_locale();
202
- $locale = apply_filters( 'plugin_locale', $locale, 'installer' );
203
- $mo_file = $this->plugin_path() . '/locale/installer-' . $locale . '.mo';
204
- if(file_exists($mo_file)){
205
- load_textdomain( 'installer', $mo_file );
206
- }
207
- }
208
-
209
- public function load_embedded_plugins(){
210
- if(file_exists($this->plugin_path() . '/embedded-plugins' )) {
211
- include_once $this->plugin_path() . '/embedded-plugins/embedded-plugins.class.php';
212
- $this->installer_embedded_plugins = new Installer_Embedded_Plugins();
213
- }
214
- }
215
-
216
- public function menu_setup(){
217
- global $pagenow;
218
-
219
- if(is_multisite() && !is_network_admin()){
220
- $this->menu_multisite_redirect();
221
- add_options_page(__('Installer', 'installer'), __('Installer', 'installer'), 'manage_options', 'installer', array($this, 'show_products')) ;
222
- }else{
223
- if($this->config['plugins_install_tab'] && is_admin() && $pagenow == 'plugin-install.php'){
224
- // Default GUI, under Plugins -> Install
225
- add_filter('install_plugins_tabs', array($this, 'add_install_plugins_tab'));
226
- add_action('install_plugins_commercial', array($this, 'show_products'));
227
- }
228
- }
229
-
230
- }
231
-
232
- public function menu_url(){
233
- if(is_multisite()){
234
- if(is_network_admin()){
235
- $url = network_admin_url('plugin-install.php?tab=commercial');
236
- }else{
237
- $url = admin_url('options-general.php?page=installer');
238
- }
239
- }else{
240
- $url = admin_url('plugin-install.php?tab=commercial');
241
- }
242
- return $url;
243
- }
244
-
245
- private function menu_multisite_redirect(){
246
- global $pagenow;
247
-
248
- if($pagenow == 'plugin-install.php' && isset($_GET['tab']) && $_GET['tab'] == 'commercial'){
249
- wp_redirect($this->menu_url());
250
- exit;
251
- }
252
-
253
- }
254
-
255
- private function _pre_1_0_clean_up(){
256
- global $wpdb;
257
-
258
- if(!defined('WPRC_VERSION')){
259
- $old_tables = array(
260
- $wpdb->prefix . 'wprc_cached_requests',
261
- $wpdb->prefix . 'wprc_extension_types',
262
- $wpdb->prefix . 'wprc_extensions',
263
- $wpdb->prefix . 'wprc_repositories',
264
- $wpdb->prefix . 'wprc_repositories_relationships',
265
- );
266
-
267
- foreach($old_tables as $table){
268
- $wpdb->query(sprintf("DROP TABLE IF EXISTS %s", $table));
269
- }
270
-
271
- }
272
-
273
- $this->settings['_pre_1_0_clean_up'] = true;
274
- $this->save_settings();
275
- }
276
-
277
- public function setup_plugins_action_links(){
278
-
279
- $plugins = get_plugins();
280
-
281
- $repositories_plugins = array();
282
-
283
- if( !empty($this->settings['repositories']) ) {
284
-
285
- foreach ( $this->settings['repositories'] as $repository_id => $repository ) {
286
-
287
- foreach ( $repository['data']['packages'] as $package ) {
288
-
289
- foreach ( $package['products'] as $product ) {
290
-
291
- foreach ( $product['plugins'] as $plugin_slug ) {
292
-
293
- $download = $this->settings['repositories'][$repository_id]['data']['downloads']['plugins'][$plugin_slug];
294
-
295
- if ( !isset($repositories_plugins[$repository_id][$download['slug']]) ) {
296
- $repositories_plugins[$repository_id][$download['slug']] = array(
297
- 'name' => $download['name'],
298
- 'registered' => $this->plugin_is_registered( $repository_id, $download['slug'] ) ? 1 : 0
299
- );
300
- }
301
-
302
- }
303
-
304
- }
305
-
306
- }
307
-
308
- foreach ( $plugins as $plugin_id => $plugin ) {
309
-
310
- $wp_plugin_slug = dirname( $plugin_id );
311
- if ( empty($wp_plugin_slug) ) {
312
- $wp_plugin_slug = basename( $plugin_id, '.php' );
313
- }
314
-
315
- foreach ( $repositories_plugins as $repository_id => $r_plugins ) {
316
-
317
- foreach ( $r_plugins as $slug => $r_plugin ) {
318
-
319
- if ( $wp_plugin_slug == $slug || $r_plugin['name'] == $plugin['Name'] || $r_plugin['name'] == $plugin['Title'] ) { //match order: slug, name, title
320
-
321
- if ( $r_plugin['registered'] ) {
322
- add_filter( 'plugin_action_links_' . $plugin_id, array($this, 'plugins_action_links_registered') );
323
- } else {
324
- add_filter( 'plugin_action_links_' . $plugin_id, array($this, 'plugins_action_links_not_registered') );
325
- }
326
-
327
- }
328
-
329
- }
330
-
331
- }
332
-
333
-
334
- }
335
-
336
- }
337
- }
338
-
339
- }
340
-
341
- public function plugins_action_links_registered($links){
342
- $links[] = '<a href="' . $this->menu_url() . '">' . __('Registered', 'installer') . '</a>';
343
- return $links;
344
- }
345
-
346
- public function plugins_action_links_not_registered($links){
347
- $links[] = '<a href="' . $this->menu_url() . '">' . __('Register', 'installer') . '</a>';
348
- return $links;
349
- }
350
-
351
- public function plugin_is_registered($repository_id, $slug){
352
-
353
- $registered = false;
354
-
355
- if( $this->repository_has_valid_subscription($repository_id) ){
356
-
357
- $subscription_type = $this->get_subscription_type_for_repository($repository_id);
358
- $r_plugins = array();
359
-
360
- foreach($this->settings['repositories'][$repository_id]['data']['packages'] as $package){
361
-
362
- foreach($package['products'] as $product){
363
-
364
- if( $product['subscription_type'] == $subscription_type || $this->have_superior_subscription($subscription_type, $product) ) {
365
-
366
- foreach ($product['plugins'] as $plugin_slug) {
367
-
368
- $download = $this->settings['repositories'][$repository_id]['data']['downloads']['plugins'][$plugin_slug];
369
-
370
- if (!isset($rep_plugins[$download['slug']])) {
371
- $r_plugins[$download['slug']] = $download['slug'];
372
- }
373
-
374
- }
375
-
376
- }
377
-
378
- }
379
-
380
- }
381
-
382
- $registered = isset($r_plugins[$slug]);
383
-
384
- }
385
-
386
-
387
- return $registered;
388
-
389
- }
390
-
391
- public function version(){
392
- return WP_INSTALLER_VERSION;
393
- }
394
-
395
- public function plugin_path() {
396
- return untrailingslashit( plugin_dir_path( dirname(__FILE__) ) );
397
- }
398
-
399
- public function plugin_url() {
400
- if(isset($this->config['in_theme_folder']) && !empty($this->config['in_theme_folder'])){
401
- $url = untrailingslashit(get_template_directory_uri() . '/' . $this->config['in_theme_folder']);
402
- }else{
403
- $url = untrailingslashit( plugins_url( '/', dirname(__FILE__) ) );
404
- }
405
-
406
- return $url;
407
- }
408
-
409
- public function is_repositories_page(){
410
- global $pagenow;
411
-
412
- return $pagenow == 'plugin-install.php' && isset($_GET['tab']) && $_GET['tab'] == 'commercial';
413
- }
414
-
415
- public function res_url(){
416
- if(isset($this->config['in_theme_folder']) && !empty($this->config['in_theme_folder'])){
417
- $url = untrailingslashit(get_template_directory_uri() . '/' . $this->config['in_theme_folder']);
418
- }else{
419
- $url = $this->plugin_url();
420
- }
421
- return $url;
422
- }
423
-
424
- public function save_settings(){
425
-
426
- $_settings = serialize($this->settings);
427
- if($this->_gz_on){
428
- $_settings = gzcompress($_settings);
429
- }
430
- $_settings = base64_encode($_settings);
431
-
432
- update_option( 'wp_installer_settings', $_settings );
433
-
434
- if( is_multisite() && is_main_site() && isset($this->settings['repositories']) ){
435
- $network_settings = array();
436
-
437
- foreach( $this->settings['repositories'] as $rep_id => $repository ){
438
- if( isset($repository['subscription']) )
439
- $network_settings[$rep_id] = $repository['subscription'];
440
- }
441
-
442
- update_site_option( 'wp_installer_network', $network_settings );
443
-
444
-
445
- }
446
-
447
- }
448
-
449
- public function get_settings($refresh = false){
450
-
451
- if($refresh || empty($this->settings)){
452
-
453
- $_settings = get_option('wp_installer_settings');
454
-
455
-
456
- if (is_array($_settings) || empty($_settings)) { //backward compatibility 1.1
457
- $this->settings = $_settings;
458
-
459
- } else {
460
- $_settings = base64_decode($_settings);
461
- if ($this->_gz_on) {
462
- $_settings = gzuncompress($_settings);
463
- }
464
- $this->settings = unserialize($_settings);
465
- }
466
-
467
- if (is_multisite() && isset($this->settings['repositories'])) {
468
- $network_settings = maybe_unserialize(get_site_option('wp_installer_network'));
469
- if ($network_settings) {
470
- foreach ($this->settings['repositories'] as $rep_id => $repository) {
471
- if (isset($network_settings[$rep_id])) {
472
- $this->settings['repositories'][$rep_id]['subscription'] = $network_settings[$rep_id];
473
- }
474
- }
475
- }
476
- }
477
-
478
-
479
- $this->settings = $this->_pre_1_6_backwards_compatibility($this->settings);
480
-
481
- $this->settings = $this->_old_products_format_backwards_compatibility($this->settings);
482
-
483
- }
484
-
485
-
486
- return $this->settings;
487
- }
488
-
489
- //backward compatibility, will remove 'basename' in version 1.8
490
- private function _pre_1_6_backwards_compatibility($settings){
491
-
492
- if( version_compare($this->version(), '1.8', '<') && !empty($settings['repositories']) ){
493
-
494
- foreach ($settings['repositories'] as $repository_id => $repository) {
495
-
496
- foreach ($repository['data']['downloads']['plugins'] as $slug => $download) {
497
-
498
- $settings['repositories'][$repository_id]['data']['downloads']['plugins'][$slug]['slug'] = $download['basename'];
499
-
500
- }
501
- }
502
-
503
- }
504
-
505
- return $settings;
506
-
507
- }
508
-
509
- //backward compatibility - support old products list format (downloads under products instead of global downloads list)
510
- private function _old_products_format_backwards_compatibility($settings){
511
-
512
- if( version_compare($this->version(), '1.8', '<') && !empty($settings['repositories']) && empty($this->_old_products_format_backwards_compatibility) ) {
513
-
514
- foreach ($settings['repositories'] as $repository_id => $repository) {
515
-
516
- $populate_downloads = false;
517
-
518
- foreach ($repository['data']['packages'] as $package_id => $package) {
519
-
520
- foreach ($package['products'] as $product_id => $product) {
521
-
522
- if (!isset($product['plugins'])) {
523
-
524
- $populate_downloads = true;
525
-
526
- foreach ($product['downloads'] as $download_id => $download) {
527
-
528
- $settings['repositories'][$repository_id]['data']['packages'][$package_id]['products'][$product_id]['plugins'][] = $download['slug'];
529
-
530
- }
531
-
532
- }
533
-
534
- }
535
-
536
- }
537
-
538
- if ($populate_downloads) {
539
-
540
- // Add downloads branch
541
- foreach ($repository['data']['packages'] as $package_id => $package) {
542
-
543
- foreach ($package['products'] as $product_id => $product) {
544
-
545
- foreach ($product['downloads'] as $download_id => $download) {
546
-
547
- if (!isset($settings['repositories'][$repository_id]['data']['downloads']['plugins'][$download['slug']])) {
548
- $settings['repositories'][$repository_id]['data']['downloads']['plugins'][$download['slug']] = $download;
549
- }
550
-
551
- $settings['repositories'][$repository_id]['data']['packages'][$package_id]['products'][$product_id]['plugins'][] = $download['slug'];
552
- }
553
-
554
- unset($settings['repositories'][$repository_id]['data']['packages'][$package_id]['products'][$product_id]['downloads']);
555
-
556
- }
557
-
558
- }
559
-
560
- }
561
-
562
- }
563
-
564
- $this->_old_products_format_backwards_compatibility = true;
565
-
566
- }
567
-
568
- return $settings;
569
-
570
- }
571
-
572
- public function get_installer_site_url( $repository_id = false ){
573
- global $current_site;
574
-
575
- $site_url = get_site_url();
576
-
577
- if( $repository_id && is_multisite() && isset( $this->settings['repositories'] ) ){
578
- $network_settings = maybe_unserialize( get_site_option('wp_installer_network') );
579
-
580
- if ( isset( $network_settings[$repository_id] ) ) {
581
- $site_url = get_site_url( $current_site->blog_id );
582
- }
583
-
584
- }
585
-
586
- return $site_url;
587
- }
588
-
589
- public function show_site_key_nags(){
590
- $screen = get_current_screen();
591
-
592
- if($screen->base == 'settings_page_installer' || ($screen->base == 'plugin-install' && isset($_GET['tab']) && $_GET['tab'] == 'commercial')){
593
- return;
594
- }
595
-
596
- if(!empty($this->config['site_key_nags'])){
597
-
598
- foreach($this->config['site_key_nags'] as $nag){
599
-
600
- if(!$this->repository_has_subscription($nag['repository_id'] )){
601
- $show = true;
602
- if(!empty($nag['condition_cb'])){
603
- $show = call_user_func($nag['condition_cb']);
604
- }
605
-
606
- if(empty($this->settings['dismissed_nags'][$nag['repository_id']]) && $show){
607
- echo '<div class="updated error otgs-is-dismissible"><p>';
608
- printf(__("To get automatic updates, you need to register %s for this site. %sRegister %s%s", 'sitepress'),
609
- $nag['product_name'], '<a class="button-primary" href="' . $this->menu_url() . '">', $nag['product_name'], '</a>');
610
-
611
- echo '</p>';
612
- echo '<span class="installer-dismiss-nag notice-dismiss" data-repository="' . $nag['repository_id'] . '"><span class="screen-reader-text">' . __('Dismiss', 'sitepress') . '</span></span>';
613
- echo '</div>';
614
- }
615
- }
616
-
617
- }
618
-
619
- }
620
-
621
- }
622
-
623
- public function dismiss_nag(){
624
- $this->settings['dismissed_nags'][$_POST['repository']] = 1;
625
-
626
- $this->save_settings();
627
-
628
- echo json_encode(array());
629
- exit;
630
- }
631
-
632
- public function add_install_plugins_tab($tabs){
633
-
634
- $tabs['commercial'] = __('Commercial', 'installer');
635
-
636
- return $tabs;
637
- }
638
-
639
- public function load_repositories_list(){
640
- global $wp_installer_instances;
641
-
642
- foreach ($wp_installer_instances as $instance) {
643
-
644
- if (file_exists(dirname($instance['bootfile']) . '/repositories.xml')) {
645
- $config_file = dirname($instance['bootfile']) . '/repositories.xml';
646
-
647
- if (file_exists(dirname($instance['bootfile']) . '/repositories.sandbox.xml')) {
648
- $config_file = dirname($instance['bootfile']) . '/repositories.sandbox.xml';
649
- add_filter('https_ssl_verify', '__return_false');
650
- }
651
-
652
- $repos = simplexml_load_file($config_file);
653
-
654
- if($repos) {
655
- foreach ($repos as $repo) {
656
- $id = strval($repo->id);
657
-
658
- $data['api-url'] = strval($repo->apiurl);
659
- $data['products'] = strval($repo->products);
660
-
661
- // excludes rule;
662
- if (isset($this->config['repositories_exclude']) && in_array($id, $this->config['repositories_exclude'])) {
663
- continue;
664
- }
665
-
666
- // includes rule;
667
- if (isset($this->config['repositories_include']) && !in_array($id, $this->config['repositories_include'])) {
668
- continue;
669
- }
670
-
671
- $this->repositories[$id] = $data;
672
-
673
- }
674
- }
675
-
676
- }
677
- }
678
-
679
- }
680
-
681
- public function filter_repositories_list(){
682
-
683
- if(!empty($this->settings['repositories'])) {
684
- foreach ($this->settings['repositories'] as $id => $repo_data) {
685
-
686
- // excludes rule;
687
- if (isset($this->config['repositories_exclude']) && in_array($id, $this->config['repositories_exclude'])) {
688
- unset($this->settings['repositories'][$id]);
689
- }
690
-
691
- // includes rule;
692
- if (isset($this->config['repositories_include']) && !in_array($id, $this->config['repositories_include'])) {
693
- unset($this->settings['repositories'][$id]);
694
- }
695
-
696
-
697
- }
698
- }
699
-
700
-
701
- }
702
-
703
- public function refresh_repositories_data(){
704
- static $checked = false;
705
-
706
- if( defined('OTGS_DISABLE_AUTO_UPDATES') && OTGS_DISABLE_AUTO_UPDATES && empty($_GET['force-check']) || $checked ){
707
-
708
- if(empty($this->settings['repositories']) && $this->is_repositories_page()){
709
-
710
- foreach($this->repositories as $id => $data) {
711
- $repository_names[] = $id;
712
-
713
- }
714
-
715
- $error = sprintf(__("Installer cannot display the products information because the automatic updating for %s was explicitly disabled with the configuration below (usually in wp-config.php):", 'installer'), strtoupper( join(', ', $repository_names) ));
716
- $error .= '<br /><br /><code>define("OTGS_DISABLE_AUTO_UPDATES", true);</code><br /><br />';
717
- $error .= sprintf(__("In order to see the products information, please run the %smanual updates check%s to initialize the products list or (temporarily) remove the above code.", 'installer'), '<a href="' . admin_url('update-core.php') . '">', '</a>');
718
-
719
- $this->register_admin_message($error, 'error');
720
-
721
-
722
- }
723
-
724
- return;
725
- }
726
-
727
- $checked = true;
728
-
729
- foreach($this->repositories as $id => $data){
730
-
731
- $response = wp_remote_get($data['products']);
732
-
733
- if(is_wp_error($response)){
734
- // http fallback
735
- $data['products'] = preg_replace("@^https://@", 'http://', $data['products']);
736
- $response = wp_remote_get($data['products']);
737
- }
738
-
739
- if(is_wp_error($response)){
740
-
741
- $error = sprintf(__("Installer cannot contact our updates server to get information about the available products and check for new versions. If you are seeing this message for the first time, you can ignore it, as it may be a temporary communication problem. If the problem persists and your WordPress admin is slowing down, you can disable automated version checks. Add the following line to your wp-config.php file:", 'installer'), strtoupper($id));
742
- $error .= '<br /><br /><code>define("OTGS_DISABLE_AUTO_UPDATES", true);</code>';
743
-
744
- $this->register_admin_message($error, 'error');
745
-
746
- continue;
747
- }
748
-
749
- if($response && isset($response['response']['code']) && $response['response']['code'] == 200){
750
- $body = wp_remote_retrieve_body($response);
751
- if($body){
752
- $products = json_decode($body, true);
753
-
754
- if(is_array($products)){
755
- $this->settings['repositories'][$id]['data'] = $products;
756
- $this->settings = $this->_pre_1_6_backwards_compatibility($this->settings);
757
- }
758
- }
759
-
760
- }
761
-
762
- $this->log( sprintf("Checked for %s updates: %s", $id, $data['products']) );
763
-
764
-
765
- }
766
-
767
- // cleanup
768
- if(empty($this->settings['repositories'])){
769
- $this->settings['repositories'] = array();
770
- }
771
- foreach($this->settings['repositories'] as $id => $data){
772
- if(!in_array($id, array_keys($this->repositories))){
773
- unset($this->settings['repositories'][$id]);
774
- }
775
- }
776
-
777
- $this->settings['last_repositories_update']= time();
778
-
779
- $this->save_settings();
780
-
781
- }
782
-
783
- public function show_products($args = array()){
784
-
785
- $screen = get_current_screen();
786
-
787
- if($screen->base == 'settings_page_installer'){ // settings page
788
- echo '<div class="wrap">';
789
- echo '<h2>' . __('Installer', 'installer') . '</h2>';
790
- echo '<br />';
791
- }
792
-
793
- if(!is_array($args)) $args = array();
794
- if(empty($args['template'])) $args['template'] = 'default';
795
-
796
- $this->filter_repositories_list();
797
-
798
- if(!empty($this->settings['repositories'])){
799
-
800
- $this->localize_strings();
801
- $this->set_filtered_prices($args);
802
- $this->set_hierarchy_and_order();
803
-
804
- foreach($this->settings['repositories'] as $repository_id => $repository){
805
-
806
- if($args['template'] == 'compact'){
807
-
808
- if(isset($args['repository']) && $args['repository'] == $repository_id){
809
- include $this->plugin_path() . '/templates/products-compact.php';
810
- }
811
-
812
- }else{
813
-
814
- include $this->plugin_path() . '/templates/repository-listing.php';
815
-
816
- }
817
-
818
- unset($site_key, $subscription_type, $expired, $upgrade_options, $products_avaliable);
819
-
820
- }
821
-
822
- }else{
823
-
824
- echo '<center>' . __('No repositories defined.', 'installer') . '</center>';
825
-
826
- }
827
-
828
- if($screen->base == 'settings_page_installer'){ // settings page
829
- echo '</div>';
830
- }
831
-
832
-
833
- }
834
-
835
- public function get_product_price($repository_id, $package_id, $product_id, $incl_discount = false){
836
-
837
- $price = false;
838
-
839
- foreach($this->settings['repositories'][$repository_id]['data']['packages'] as $package ){
840
-
841
- if($package['id'] == $package_id){
842
- if(isset($package['products'][$product_id])){
843
- if($incl_discount && isset($package['products'][$product_id]['price_disc'])){
844
- $price = $package['products'][$product_id]['price_disc'];
845
- }elseif(isset($package['products'][$product_id]['price'])){
846
- $price = $package['products'][$product_id]['price'];
847
- }
848
- }
849
- break;
850
- }
851
- }
852
-
853
- return $price;
854
- }
855
-
856
- private function _render_product_packages($packages, $subscription_type, $expired, $upgrade_options, $repository_id){
857
-
858
- $data = array();
859
-
860
- foreach($packages as $package_id => $package){
861
-
862
- $row = array('products' => array(), 'downloads' => array());
863
- foreach($package['products'] as $product){
864
-
865
- // filter out free subscriptions from being displayed as buying options
866
- if( empty($product['price']) && (empty($subscription_type) || $expired) ){
867
- continue;
868
- }
869
-
870
- // buy base
871
- if(empty($subscription_type) || $expired) {
872
-
873
- $p['url'] = $this->append_parameters_to_buy_url($product['url'], $repository_id);
874
- if (!empty($product['price_disc'])) {
875
- $p['label'] = $product['call2action'] . ' - ' . sprintf('$%s %s$%d%s (USD)', $product['price_disc'], '&nbsp;&nbsp;<del>', $product['price'], '</del>');
876
- } else {
877
- $p['label'] = $product['call2action'] . ' - ' . sprintf('$%d (USD)', $product['price']);
878
- }
879
- $row['products'][] = $p;
880
-
881
- // renew
882
- } elseif(isset($subscription_type) && $product['subscription_type'] == $subscription_type){
883
-
884
- if($product['renewals']) {
885
- foreach ($product['renewals'] as $renewal) {
886
- $p['url'] = $this->append_parameters_to_buy_url($renewal['url'], $repository_id);
887
- $p['label'] = $renewal['call2action'] . ' - ' . sprintf('$%d (USD)', $renewal['price']);
888
- }
889
-
890
- $row['products'][] = $p;
891
- }
892
-
893
- }
894
-
895
- // upgrades
896
- if(!empty($upgrade_options[$product['subscription_type']])){
897
-
898
- foreach($upgrade_options[$product['subscription_type']] as $stype => $upgrade){
899
- if($stype != $subscription_type) continue;
900
-
901
- $p['url'] = $this->append_parameters_to_buy_url($upgrade['url'], $repository_id);
902
- if (!empty($upgrade['price_disc'])) {
903
- $p['label'] = $upgrade['call2action'] . ' - ' . sprintf('$%s %s$%d%s (USD)', $upgrade['price_disc'], '&nbsp;&nbsp;<del>', $upgrade['price'], '</del>');
904
- } else {
905
- $p['label'] = $upgrade['call2action'] . ' - ' . sprintf('$%d (USD)', $upgrade['price']);
906
- }
907
- $row['products'][] = $p;
908
-
909
- }
910
-
911
- }
912
-
913
- // downloads
914
- if(isset($subscription_type) && !$expired && $product['subscription_type'] == $subscription_type){
915
- foreach($product['plugins'] as $plugin_slug){
916
-
917
- $row['downloads'][] = $this->settings['repositories'][$repository_id]['data']['downloads']['plugins'][$plugin_slug];
918
-
919
- }
920
-
921
- }
922
-
923
- //subpackages
924
- if(!empty($package['sub-packages'])){
925
- $row['sub-packages'] = $package['sub-packages'];
926
- }
927
-
928
- }
929
-
930
- $row['id'] = $package['id'];
931
- $row['image_url'] = $package['image_url'];
932
- $row['name'] = $package['name'];
933
- $row['description'] = $package['description'];
934
-
935
- if(!empty($row['products']) || !empty($row['downloads']) || !empty($row['sub-packages'])){
936
- $data[] = $row;
937
- }
938
-
939
-
940
- }
941
-
942
- return $data;
943
-
944
- }
945
-
946
- public function get_extra_url_parameters(){
947
-
948
- $parameters = array();
949
-
950
- if(!empty($this->package_source)){
951
- foreach($this->package_source as $key => $val){
952
- $parameters[$key] = $val;
953
- }
954
- }
955
-
956
- $parameters['installer_version'] = WP_INSTALLER_VERSION;
957
- $parameters['theme'] = wp_get_theme()->get( 'Name' );
958
- $parameters['site_name'] = get_bloginfo( 'name' );
959
-
960
- return $parameters;
961
- }
962
-
963
- public function append_parameters_to_buy_url($url, $repository_id, $args = array()){
964
-
965
- $url = add_query_arg( array('icl_site_url' => $this->get_installer_site_url( $repository_id ) ), $url );
966
-
967
- $affiliate_id = false;
968
- $affiliate_key = false;
969
-
970
- // Add extra parameters for custom Installer packages
971
- if( !empty($this->package_source) ){
972
- $extra = $this->get_extra_url_parameters();
973
-
974
- if( !empty($extra['repository']) && $extra['repository'] == $repository_id ) {
975
-
976
- if( !empty($extra['affiliate_key']) && !empty($extra['user_id']) ){
977
- $this->config['affiliate_id:' . $repository_id] = $extra['user_id'];
978
- $this->config['affiliate_key:' . $repository_id] = $extra['affiliate_key'];
979
- unset($extra['affiliate_key'], $extra['user_id'], $extra['repository']); // no need to include these ones
980
- }
981
-
982
- $url = add_query_arg($extra, $url);
983
- }
984
-
985
- }
986
-
987
- if(isset($this->config['affiliate_id:' . $repository_id]) && isset($this->config['affiliate_key:' . $repository_id])){
988
-
989
- $affiliate_id = $this->config['affiliate_id:' . $repository_id];
990
- $affiliate_key = $this->config['affiliate_key:' . $repository_id];
991
-
992
- }elseif(isset($args['affiliate_id:' . $repository_id]) && isset($args['affiliate_key:' . $repository_id])){
993
-
994
- $affiliate_id = $args['affiliate_id:' . $repository_id];
995
- $affiliate_key = $args['affiliate_key:' . $repository_id];
996
-
997
- }elseif(defined('ICL_AFFILIATE_ID') && defined('ICL_AFFILIATE_KEY')){ //support for 1 repo
998
-
999
- $affiliate_id = ICL_AFFILIATE_ID;
1000
- $affiliate_key = ICL_AFFILIATE_KEY;
1001
-
1002
- }elseif(isset($this->config['affiliate_id']) && isset($this->config['affiliate_key'])) {
1003
- // BACKWARDS COMPATIBILITY
1004
- $affiliate_id = $this->config['affiliate_id'];
1005
- $affiliate_key = $this->config['affiliate_key'];
1006
- }
1007
-
1008
- if($affiliate_id && $affiliate_key){
1009
- $url = add_query_arg(array('aid' => $affiliate_id, 'affiliate_key' => $affiliate_key), $url);
1010
- }
1011
-
1012
- if($repository_id == 'wpml'){
1013
- $url = add_query_arg(array('using_icl' => $this->_using_icl, 'wpml_version' => $this->_wpml_version), $url);
1014
- }
1015
-
1016
- $url = apply_filters('wp_installer_buy_url', $url);
1017
-
1018
- $url = esc_url($url);
1019
-
1020
- return $url;
1021
-
1022
- }
1023
-
1024
- public function save_site_key($args = array()){
1025
-
1026
- $error = '';
1027
-
1028
- $repository_id = isset($args['repository_id']) ? $args['repository_id'] : (isset($_POST['repository_id']) ? $_POST['repository_id'] : false);
1029
- $nonce = isset($args['nonce']) ? $args['nonce'] : (isset($_POST['nonce']) ? $_POST['nonce'] : '');
1030
- $site_key = isset($args['site_key']) ? $args['site_key'] : $_POST['site_key_' . $repository_id];
1031
-
1032
- $site_key = preg_replace("/[^A-Za-z0-9]/", '', $site_key);
1033
-
1034
- if($repository_id && $nonce && wp_create_nonce('save_site_key_' . $repository_id) == $nonce){
1035
-
1036
- try {
1037
- $subscription_data = $this->fetch_subscription_data( $repository_id, $site_key, self::SITE_KEY_VALIDATION_SOURCE_REGISTRATION );
1038
-
1039
- if ( $subscription_data ) {
1040
- $this->settings['repositories'][$repository_id]['subscription'] = array('key' => $site_key, 'data' => $subscription_data);
1041
- $this->save_settings();
1042
- } else {
1043
- $error = __( 'Invalid site key for the current site.', 'installer' );
1044
- }
1045
-
1046
- } catch (Exception $e ){
1047
- $error = $e->getMessage();
1048
- if( preg_match('#Could not resolve host: (.*)#', $error, $matches) || preg_match('#Couldn\'t resolve host \'(.*)\'#', $error, $matches) ){
1049
- $error = sprintf(__("%s cannot access %s to register. Try again to see if it's a temporary problem. If the problem continues, make sure that this site has access to the Internet. You can still use the plugin without registration, but you will not receive automated updates.", 'installer'),
1050
- '<strong><i>' . $this->get_generic_product_name($repository_id) . '</i></strong>',
1051
- '<strong><i>' . $matches[1]. '</i></strong>'
1052
- ) ;
1053
- }
1054
- }
1055
-
1056
- }
1057
-
1058
- $return = array('error' => $error);
1059
-
1060
- if($this->api_debug){
1061
- $return['debug'] = $this->api_debug;
1062
- }
1063
-
1064
- if(!empty($args['return'])){
1065
- return $return;
1066
- }else{
1067
- echo json_encode($return);
1068
- exit;
1069
- }
1070
-
1071
- }
1072
-
1073
- public function get_site_key($repository_id){
1074
-
1075
- if(isset($this->settings['repositories'][$repository_id]['subscription'])){
1076
- $site_key = $this->settings['repositories'][$repository_id]['subscription']['key'];
1077
- }else{
1078
- $site_key = false;
1079
- }
1080
-
1081
- return $site_key;
1082
- }
1083
-
1084
- public function remove_site_key(){
1085
- if($_POST['nonce'] == wp_create_nonce('remove_site_key_' . $_POST['repository_id'])){
1086
- unset($this->settings['repositories'][$_POST['repository_id']]['subscription']);
1087
- $this->save_settings();
1088
-
1089
- $this->refresh_repositories_data();
1090
- }
1091
- exit;
1092
- }
1093
-
1094
- public function validate_repository_subscription(){
1095
- $repository_id = isset($_GET['validate_repository']) ? $_GET['validate_repository'] : false;
1096
- if($repository_id){
1097
-
1098
- $site_key = $this->get_site_key($repository_id);
1099
- if($site_key) {
1100
- $subscription_data = $this->fetch_subscription_data( $repository_id, $site_key, self::SITE_KEY_VALIDATION_SOURCE_REVALIDATION);
1101
- if(empty($subscription_data)){
1102
- unset($this->settings['repositories'][$repository_id]['subscription']);
1103
- delete_site_transient('update_plugins');
1104
- $this->save_settings();
1105
- }
1106
- }
1107
-
1108
- wp_redirect($this->menu_url() . '#repository-' . $repository_id);
1109
- exit;
1110
-
1111
- }
1112
-
1113
- }
1114
-
1115
- public function update_site_key(){
1116
-
1117
- $error = '';
1118
-
1119
- if($_POST['nonce'] == wp_create_nonce('update_site_key_' . $_POST['repository_id'])){
1120
-
1121
- $repository_id = $_POST['repository_id'];
1122
- $site_key = $this->get_site_key($_POST['repository_id']);
1123
-
1124
- if($site_key){
1125
- try {
1126
- $subscription_data = $this->fetch_subscription_data( $repository_id, $site_key, self::SITE_KEY_VALIDATION_SOURCE_UPDATES_CHECK );
1127
-
1128
- if ( $subscription_data ) {
1129
- $this->settings['repositories'][$repository_id]['subscription'] = array('key' => $site_key, 'data' => $subscription_data);
1130
-
1131
- //also refresh products information
1132
- $this->refresh_repositories_data();
1133
-
1134
- $this->save_settings();
1135
-
1136
- } else {
1137
- unset($this->settings['repositories'][$repository_id]['subscription']);
1138
- $error = __( 'Invalid site key for the current site. If the error persists, try to unregister first and then register again with the same site key.', 'installer' );
1139
- }
1140
-
1141
-
1142
- } catch (Exception $e ){
1143
- $error = $e->getMessage();
1144
- if( preg_match('#Could not resolve host: (.*)#', $error, $matches) || preg_match('#Couldn\'t resolve host \'(.*)\'#', $error, $matches) ){
1145
- $error = sprintf(__("%s cannot access %s to register. Try again to see if it's a temporary problem. If the problem continues, make sure that this site has access to the Internet. You can still use the plugin without registration, but you will not receive automated updates.", 'installer'),
1146
- '<strong><i>' . $this->get_generic_product_name($repository_id) . '</i></strong>',
1147
- '<strong><i>' . $matches[1]. '</i></strong>'
1148
- ) ;
1149
- }
1150
- }
1151
-
1152
- }
1153
-
1154
- }
1155
-
1156
- echo json_encode(array('error' => $error));
1157
-
1158
- exit;
1159
- }
1160
-
1161
- public function api_debug_log($text){
1162
-
1163
- if(defined('WPML_DEBUG_INSTALLER') && WPML_DEBUG_INSTALLER){
1164
-
1165
- if(!is_scalar($text)){
1166
- $text = print_r($text, 1);
1167
- }
1168
-
1169
- $this->api_debug .= $text . "\n";
1170
-
1171
- }
1172
-
1173
- }
1174
-
1175
- public function fetch_subscription_data( $repository_id, $site_key, $source = self::SITE_KEY_VALIDATION_SOURCE_OTHER ){
1176
-
1177
- $subscription_data = false;
1178
-
1179
- $args['body'] = array(
1180
- 'action' => 'site_key_validation',
1181
- 'site_key' => $site_key,
1182
- 'site_url' => $this->get_installer_site_url( $repository_id ),
1183
- 'source' => $source
1184
- );
1185
-
1186
- if($repository_id == 'wpml'){
1187
- $args['body']['using_icl'] = $this->_using_icl;
1188
- $args['body']['wpml_version'] = $this->_wpml_version;
1189
- }
1190
-
1191
- $args['body']['installer_version'] = WP_INSTALLER_VERSION;
1192
- $args['body']['theme'] = wp_get_theme()->get( 'Name' );
1193
- $args['body']['site_name'] = get_bloginfo( 'name' );
1194
-
1195
- $args['body']['versions'] = $this->get_local_product_versions( $repository_id );
1196
-
1197
- $args['timeout'] = 45;
1198
-
1199
- // Add extra parameters for custom Installer packages
1200
- if( !empty($this->package_source) ){
1201
- $extra = $this->get_extra_url_parameters();
1202
- if( !empty($extra['repository']) && $extra['repository'] == $repository_id ) {
1203
- unset($extra['repository']);
1204
- foreach($extra as $key => $val){
1205
- $args['body'][$key] = $val;
1206
- }
1207
- }
1208
- }
1209
-
1210
- $response = wp_remote_post($this->repositories[$repository_id]['api-url'], $args);
1211
-
1212
- $this->api_debug_log("POST {$this->repositories[$repository_id]['api-url']}");
1213
- $this->api_debug_log($args);
1214
-
1215
- $this->log("POST {$this->repositories[$repository_id]['api-url']} - fetch subscription data");
1216
-
1217
- if( !is_wp_error($response) ){
1218
- $datas = wp_remote_retrieve_body($response);
1219
-
1220
- if(is_serialized($datas)){
1221
- $data = unserialize($datas);
1222
- $this->api_debug_log($data);
1223
- }else{
1224
- $this->api_debug_log($datas);
1225
- }
1226
-
1227
- if(!empty($data->subscription_data)){
1228
- $subscription_data = $data->subscription_data;
1229
- }
1230
-
1231
- do_action( 'installer_fetched_subscription_data', $data, $repository_id);
1232
-
1233
- }else{
1234
-
1235
- $this->api_debug_log($response);
1236
- throw new Exception( $response->get_error_message() );
1237
- }
1238
-
1239
- return $subscription_data;
1240
-
1241
- }
1242
-
1243
- function get_local_product_versions( $repository_id ){
1244
-
1245
- $versions = array();
1246
-
1247
- foreach( $this->settings['repositories'][$repository_id]['data']['packages'] as $package_id => $package ){
1248
-
1249
- foreach( $package['products'] as $product_id => $product ){
1250
-
1251
- foreach( $product['plugins'] as $plugin_slug ){
1252
-
1253
- $download = $this->settings['repositories'][$repository_id]['data']['downloads']['plugins'][$plugin_slug];
1254
-
1255
- if( empty( $versions[$download['slug']] ) ) {
1256
- $v = $this->get_plugin_installed_version($download['name'], $download['slug']);
1257
- if($v){
1258
- $versions[$download['slug']] = $v;
1259
- }
1260
- }
1261
-
1262
- }
1263
-
1264
- }
1265
-
1266
- }
1267
-
1268
- return $versions;
1269
- }
1270
-
1271
- public function get_repository_site_key($repository_id){
1272
- $site_key = false;
1273
-
1274
- if(!empty($this->settings['repositories'][$repository_id]['subscription']['key'])){
1275
- $site_key = $this->settings['repositories'][$repository_id]['subscription']['key'];
1276
- }
1277
-
1278
- return $site_key;
1279
- }
1280
-
1281
- public function repository_has_valid_subscription($repository_id){
1282
-
1283
- $valid = false;
1284
-
1285
- if(!empty($this->settings['repositories'][$repository_id]['subscription'])){
1286
-
1287
- $subscription = $this->settings['repositories'][$repository_id]['subscription']['data'];
1288
- $valid = ( $subscription->status == 1 && (strtotime($subscription->expires) > time() || empty($subscription->expires)) ) || $subscription->status == 4;
1289
-
1290
- }
1291
- return $valid;
1292
-
1293
- }
1294
-
1295
- public function repository_has_subscription($repository_id){
1296
- $key = false;
1297
- if(!empty($this->settings['repositories'][$repository_id]['subscription']['key'])){
1298
- $key = $this->settings['repositories'][$repository_id]['subscription']['key'];
1299
- }
1300
-
1301
- return $key;
1302
-
1303
- }
1304
-
1305
- public function repository_has_expired_subscription($repository_id){
1306
-
1307
- return $this->repository_has_subscription($repository_id) && !$this->repository_has_valid_subscription($repository_id);
1308
-
1309
- }
1310
-
1311
- public function get_generic_product_name($repository_id){
1312
-
1313
- return $this->settings['repositories'][$repository_id]['data']['product-name'];
1314
-
1315
- }
1316
-
1317
- public function show_subscription_renew_warning($repository_id, $subscription_id){
1318
-
1319
- $show = false;
1320
-
1321
- $data = $this->settings['repositories'][$repository_id]['data'];
1322
- if(!empty($data['subscriptions_meta'])){
1323
- if(isset($data['subscriptions_meta']['expiration'])){
1324
-
1325
- if(!empty($data['subscriptions_meta']['expiration'][$subscription_id])){
1326
-
1327
- $days = $data['subscriptions_meta']['expiration'][$subscription_id]['days_warning'];
1328
- $message = $data['subscriptions_meta']['expiration'][$subscription_id]['warning_message'];
1329
-
1330
- }else{
1331
-
1332
- //defaults
1333
- $days = 30;
1334
- $message = __('You will have to renew your subscription in order to continue getting the updates and support.', 'installer');
1335
-
1336
- }
1337
-
1338
- if(!empty($this->settings['repositories'][$repository_id]['subscription'])){
1339
- $subscription = $this->settings['repositories'][$repository_id]['subscription'];
1340
-
1341
- if($subscription['data']->subscription_type == $subscription_id && !empty($subscription['data']->expires)){
1342
-
1343
- if(strtotime($subscription['data']->expires) < strtotime(sprintf("+%d day", $days))){
1344
-
1345
- $days_to_expiration = ceil((strtotime($subscription['data']->expires) - time()) / 86400);
1346
-
1347
- echo '<div><p class="installer-warn-box">' .
1348
- sprintf(_n('Your subscription expires in %d day.', 'Your subscription expires in %d days.', $days_to_expiration, 'installer'), $days_to_expiration) .
1349
- '<br />' . $message .
1350
- '</p></div>';
1351
-
1352
- $show = true;
1353
-
1354
- }
1355
-
1356
- }
1357
-
1358
- }
1359
-
1360
-
1361
- }
1362
- }
1363
-
1364
-
1365
- return $show;
1366
-
1367
- }
1368
-
1369
- public function setup_plugins_renew_warnings(){
1370
-
1371
- $plugins = get_plugins();
1372
-
1373
- $subscriptions_with_warnings = array();
1374
- foreach($this->settings['repositories'] as $repository_id => $repository){
1375
-
1376
- if($this->repository_has_valid_subscription($repository_id)){
1377
- $subscription_type = $this->settings['repositories'][$repository_id]['subscription']['data']->subscription_type;
1378
- $expires = $this->settings['repositories'][$repository_id]['subscription']['data']->expires;
1379
-
1380
- $never_expires = isset($this->settings['repositories'][$repository_id]['subscription'])
1381
- && empty($this->settings['repositories'][$repository_id]['subscription']['data']->expires)
1382
- && (
1383
- $this->settings['repositories'][$repository_id]['subscription']['data']->status == 4 ||
1384
- $this->settings['repositories'][$repository_id]['subscription']['data']->status == 1
1385
- );
1386
-
1387
- if(!$never_expires){
1388
- if(isset($this->settings['repositories'][$repository_id]['data']['subscriptions_meta']['expiration'][$subscription_type])){
1389
-
1390
- $days_warning = $this->settings['repositories'][$repository_id]['data']['subscriptions_meta']['expiration'][$subscription_type]['days_warning'];
1391
- $custom_message = $this->settings['repositories'][$repository_id]['data']['subscriptions_meta']['expiration'][$subscription_type]['warning_message'];
1392
-
1393
- }else{
1394
- //defaults
1395
- $days_warning = 30;
1396
- $custom_message = __('You will have to renew your subscription in order to continue getting the updates and support.', 'installer');
1397
- }
1398
-
1399
- if(strtotime($expires) < strtotime(sprintf('+%d day', $days_warning)) ){
1400
-
1401
- $days_to_expiration = ceil((strtotime($expires) - time()) / 86400);
1402
-
1403
- $message = sprintf(_n('Your subscription expires in %d day.', 'Your subscription expires in %d days.', $days_to_expiration, 'installer'), $days_to_expiration);
1404
- $subscriptions_with_warnings[$subscription_type] = $message . ' ' . $custom_message;
1405
-
1406
- }
1407
- }
1408
-
1409
- }
1410
-
1411
- }
1412
-
1413
-
1414
-
1415
- foreach($plugins as $plugin_id => $plugin){
1416
-
1417
- $slug = dirname($plugin_id);
1418
- if(empty($slug)) continue;
1419
-
1420
- foreach($this->settings['repositories'] as $repository_id => $repository){
1421
-
1422
- if($this->repository_has_valid_subscription($repository_id)){
1423
-
1424
- foreach($repository['data']['packages'] as $package){
1425
-
1426
- foreach($package['products'] as $product){
1427
-
1428
- foreach($product['plugins'] as $plugin_slug){
1429
-
1430
- $download = $this->settings['repositories'][$repository_id]['data']['downloads']['plugins'][$plugin_slug];
1431
-
1432
- if($download['slug'] == $slug || $download['name'] == $plugin['Name'] || $download['name'] == $plugin['Title']){ //match order: slug, name, title
1433
-
1434
- if(isset($subscriptions_with_warnings[$product['subscription_type']])){
1435
-
1436
- $this->_plugins_renew_warnings[$plugin_id] = $subscriptions_with_warnings[$product['subscription_type']];
1437
-
1438
- }
1439
-
1440
- }
1441
-
1442
- }
1443
-
1444
- }
1445
-
1446
- }
1447
-
1448
- }
1449
-
1450
- }
1451
-
1452
- }
1453
-
1454
- }
1455
-
1456
- public function queue_plugins_renew_warnings() {
1457
-
1458
- if(!empty($this->_plugins_renew_warnings)){
1459
-
1460
- foreach($this->_plugins_renew_warnings as $plugin_id => $message){
1461
-
1462
- add_action( "after_plugin_row_" . $plugin_id, array($this, 'plugins_renew_warning'), 10, 3 );
1463
- }
1464
-
1465
- }
1466
-
1467
- }
1468
-
1469
- public function plugins_renew_warning($plugin_file, $plugin_data, $status){
1470
-
1471
- if(empty($this->_plugins_renew_warnings[$plugin_file])) return;
1472
-
1473
- $wp_list_table = _get_list_table('WP_Plugins_List_Table');
1474
- ?>
1475
-
1476
- <tr class="plugin-update-tr"><td colspan="<?php echo $wp_list_table->get_column_count(); ?>" class="plugin-update colspanchange">
1477
- <div class="update-message">
1478
- <?php
1479
- echo $this->_plugins_renew_warnings[$plugin_file]. ' ';
1480
- printf(__('%sRenew here%s.', 'installer'),
1481
- '<a href="' . $this->menu_url() . '">', '</a>');
1482
- ?>
1483
- </div>
1484
- </tr>
1485
-
1486
- <?php
1487
-
1488
- }
1489
-
1490
- public function get_subscription_type_for_repository($repository_id){
1491
-
1492
- $subscription_type = false;
1493
-
1494
- if(!empty($this->settings['repositories'][$repository_id]['subscription'])){
1495
- $subscription_type = $this->settings['repositories'][$repository_id]['subscription']['data']->subscription_type;
1496
- }
1497
-
1498
- return $subscription_type;
1499
-
1500
- }
1501
-
1502
- public function have_superior_subscription($subscription_type, $product){
1503
-
1504
- $have = false;
1505
-
1506
- if(is_array($product['upgrades'])){
1507
- foreach($product['upgrades'] as $u){
1508
- if($u['subscription_type'] == $subscription_type){
1509
- $have = true;
1510
- break;
1511
- }
1512
- }
1513
- }
1514
-
1515
- return $have;
1516
- }
1517
-
1518
- public function is_product_available_for_download($product_name, $repository_id){
1519
-
1520
- $available = false;
1521
-
1522
- $subscription_type = $this->get_subscription_type_for_repository($repository_id);
1523
- $expired = $this->repository_has_expired_subscription($repository_id);
1524
-
1525
- if($this->repository_has_subscription($repository_id) && !$expired){
1526
-
1527
- $this->set_hierarchy_and_order();
1528
-
1529
- foreach($this->settings['repositories'][$repository_id]['data']['packages'] as $package_id => $package){
1530
-
1531
- $has_top_package = false;
1532
-
1533
- foreach($package['products'] as $product){
1534
-
1535
- if($subscription_type == $product['subscription_type']){
1536
- $has_top_package = true;
1537
- if($product['name'] == $product_name){
1538
- return $available = true;
1539
- }
1540
- }
1541
-
1542
- }
1543
-
1544
- if(!empty($package['sub-packages'])){
1545
- foreach($package['sub-packages'] as $sub_package){
1546
- foreach($sub_package['products'] as $product){
1547
- if($product['name'] == $product_name && ($subscription_type == $product['subscription_type'] || $has_top_package)){
1548
- return $available = true;
1549
- }
1550
- }
1551
- }
1552
- }
1553
-
1554
- }
1555
- }
1556
-
1557
- return $available;
1558
-
1559
- }
1560
-
1561
- public function get_upgrade_options($repository_id){
1562
- $all_upgrades = array();
1563
-
1564
- //get all products: packages and subpackages
1565
- $all_products = array();
1566
- foreach($this->settings['repositories'][$repository_id]['data']['packages'] as $package){
1567
- foreach($package['products'] as $product) {
1568
- $all_products[] = $product;
1569
- }
1570
- if(!empty($package['sub-packages'])){
1571
- foreach($package['sub-packages'] as $subpackage){
1572
- foreach($subpackage['products'] as $product) {
1573
- $all_products[] = $product;
1574
- }
1575
-
1576
- }
1577
-
1578
- }
1579
-
1580
- }
1581
-
1582
- foreach($all_products as $product) {
1583
- if ($product['upgrades']) {
1584
- foreach ($product['upgrades'] as $upgrade) {
1585
- if ($this->repository_has_valid_subscription($repository_id) || ($this->repository_has_subscription($repository_id) && $upgrade['including_expired'])) {
1586
- $all_upgrades[$upgrade['subscription_type']][$product['subscription_type']] = $upgrade;
1587
- }
1588
- }
1589
- }
1590
- }
1591
-
1592
- return $all_upgrades;
1593
-
1594
- }
1595
-
1596
- public function append_site_key_to_download_url($url, $key, $repository_id){
1597
-
1598
- $url_params['site_key'] = $key;
1599
- $url_params['site_url'] = $this->get_installer_site_url( $repository_id );
1600
-
1601
-
1602
- // Add extra parameters for custom Installer packages
1603
- if( !empty($this->package_source) ){
1604
- $extra = $this->get_extra_url_parameters();
1605
- if( !empty($extra['repository']) && $extra['repository'] == $repository_id ) {
1606
- unset($extra['repository']);
1607
- foreach($extra as $key => $val){
1608
- $url_params[$key] = $val;
1609
- }
1610
- }
1611
- }
1612
-
1613
- $url = add_query_arg($url_params, $url);
1614
-
1615
- if($repository_id == 'wpml'){
1616
- $url = add_query_arg(array('using_icl' => $this->_using_icl, 'wpml_version' => $this->_wpml_version), $url);
1617
- }
1618
-
1619
- return $url;
1620
-
1621
- }
1622
-
1623
- public function plugin_is_installed($name, $slug, $version = null){
1624
-
1625
- $is = false;
1626
-
1627
- $plugins = get_plugins();
1628
-
1629
- foreach($plugins as $plugin_id => $plugin){
1630
-
1631
- $wp_plugin_slug = dirname($plugin_id);
1632
-
1633
- // Exception: embedded plugins
1634
- if( $wp_plugin_slug == $slug || $plugin['Name'] == $name || $plugin['Title'] == $name || ( $wp_plugin_slug == $slug . '-embedded' || $plugin['Name'] == $name . ' Embedded' ) ){
1635
- if($version){
1636
- if(version_compare($plugin['Version'], $version, '>=')){
1637
- $is = $plugin['Version'];
1638
- }
1639
- }else{
1640
- $is = $plugin['Version'];
1641
- }
1642
-
1643
- break;
1644
- }
1645
-
1646
- }
1647
-
1648
- //exception: Types name difference
1649
- if(!$is && $name == 'Types'){
1650
- return $this->plugin_is_installed('Types - Complete Solution for Custom Fields and Types', $slug, $version);
1651
- }
1652
-
1653
- return $is;
1654
- }
1655
-
1656
- public function plugin_is_embedded_version($name, $slug){
1657
- $is = false;
1658
-
1659
- $plugins = get_plugins();
1660
-
1661
- //false if teh full version is also installed
1662
- $is_full_installed = false;
1663
- foreach($plugins as $plugin_id => $plugin){
1664
-
1665
- if(($plugin['Name'] == $name && !preg_match("#-embedded$#", $slug)) ){
1666
- $is_full_installed = true;
1667
- break;
1668
- }
1669
-
1670
- }
1671
-
1672
- if($is_full_installed){
1673
- return false;
1674
- }
1675
-
1676
- foreach($plugins as $plugin_id => $plugin){
1677
-
1678
- // TBD
1679
- $wp_plugin_slug = dirname($plugin_id);
1680
- if( $wp_plugin_slug == $slug . '-embedded' && $plugin['Name'] == $name . ' Embedded'){
1681
- $is = true;
1682
- break;
1683
- }
1684
-
1685
- }
1686
-
1687
- return $is;
1688
-
1689
- }
1690
-
1691
- //Alias for plugin_is_installed
1692
- public function get_plugin_installed_version($name, $slug){
1693
-
1694
- return $this->plugin_is_installed($name, $slug);
1695
-
1696
- }
1697
-
1698
- public function get_plugin_repository_version($repository_id, $slug){
1699
- $version = false;
1700
-
1701
- if(!empty($this->settings['repositories'][$repository_id]['data']['packages'])){
1702
- foreach($this->settings['repositories'][$repository_id]['data']['packages'] as $package){
1703
- foreach($package['products'] as $product) {
1704
-
1705
- foreach($product['plugins'] as $plugin_slug){
1706
-
1707
- $download = $this->settings['repositories'][$repository_id]['data']['downloads']['plugins'][$plugin_slug];
1708
-
1709
- if($download['slug'] == $slug){
1710
- $version = $download['version'];
1711
- break (3);
1712
- }
1713
-
1714
- }
1715
-
1716
- }
1717
- }
1718
- }
1719
-
1720
- return $version;
1721
- }
1722
-
1723
- public function is_uploading_allowed(){
1724
-
1725
- //_deprecated_function ( __FUNCTION__, '1.7.3', 'Installer_Dependencies::' . __FUNCTION__ );
1726
- return $this->dependencies->is_uploading_allowed();
1727
-
1728
- }
1729
-
1730
- public function download_plugin_ajax_handler(){
1731
-
1732
- require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
1733
- require_once $this->plugin_path() . '/includes/installer-upgrader-skins.php';
1734
-
1735
- if(isset($_POST['data'])){
1736
-
1737
- $data = json_decode( base64_decode( $_POST['data'] ), true );
1738
-
1739
- }
1740
-
1741
- $ret = false;
1742
- $plugin_id = false;
1743
- $message = '';
1744
-
1745
- //validate subscription
1746
- $site_key = $this->get_repository_site_key($data['repository_id']);
1747
- $subscription_data = $this->fetch_subscription_data( $data['repository_id'], $site_key , self::SITE_KEY_VALIDATION_SOURCE_DOWNLOAD_REPORT);
1748
-
1749
- if($subscription_data && !is_wp_error($subscription_data) && $this->repository_has_valid_subscription($data['repository_id'])){
1750
-
1751
- if($data['nonce'] == wp_create_nonce('install_plugin_' . $data['url'])){
1752
-
1753
- $upgrader_skins = new Installer_Upgrader_Skins(); //use our custom (mute) Skin
1754
- $upgrader = new Plugin_Upgrader($upgrader_skins);
1755
-
1756
- remove_action( 'upgrader_process_complete', array( 'Language_Pack_Upgrader', 'async_upgrade' ), 20 );
1757
-
1758
- $plugins = get_plugins();
1759
-
1760
- //upgrade or install?
1761
- foreach($plugins as $id => $plugin){
1762
- $wp_plugin_slug = dirname($id);
1763
- $is_embedded = $this->plugin_is_embedded_version(preg_replace('/ Embedded$/', '', $plugin['Name']), preg_replace('/-embedded$/', '', $wp_plugin_slug));
1764
-
1765
- if($wp_plugin_slug == $data['slug'] || $is_embedded && preg_replace('/-embedded$/', '', $wp_plugin_slug) == $data['slug']){
1766
- $plugin_id = $id;
1767
- break;
1768
- }
1769
- }
1770
-
1771
- if($plugin_id && empty($is_embedded)){ //upgrade
1772
- $response['upgrade'] = 1;
1773
-
1774
- $plugin_is_active = is_plugin_active($plugin_id);
1775
-
1776
- $ret = $upgrader->upgrade($plugin_id);
1777
-
1778
- if(!$ret && !empty($upgrader->skin->installer_error)){
1779
- if(is_wp_error($upgrader->skin->installer_error)){
1780
- $message = $upgrader->skin->installer_error->get_error_message() .
1781
- ' (' . $upgrader->skin->installer_error->get_error_data() . ')';
1782
- }
1783
- }
1784
-
1785
- if($plugin_is_active){
1786
- //prevent redirects
1787
- add_filter('wp_redirect', '__return_false');
1788
- activate_plugin($plugin_id);
1789
- }
1790
-
1791
- }else{ //install
1792
-
1793
- if($is_embedded){
1794
- delete_plugins(array($plugin_id));
1795
- }
1796
-
1797
- $response['install'] = 1;
1798
- $ret = $upgrader->install($data['url']);
1799
- if(!$ret && !empty($upgrader->skin->installer_error)){
1800
- if(is_wp_error($upgrader->skin->installer_error)){
1801
- $message = $upgrader->skin->installer_error->get_error_message() .
1802
- ' (' . $upgrader->skin->installer_error->get_error_data() . ')';
1803
- }
1804
- }
1805
- }
1806
-
1807
- $plugins = get_plugins(); //read again
1808
-
1809
- if($ret && !empty($_POST['activate'])){
1810
- foreach($plugins as $id => $plugin){
1811
- $wp_plugin_slug = dirname($id);
1812
- if($wp_plugin_slug == $data['slug']){
1813
- $plugin_version = $plugin['Version'];
1814
- $plugin_id = $id;
1815
- break;
1816
- }
1817
- }
1818
-
1819
- }
1820
-
1821
- }
1822
-
1823
- } else { //subscription not valid
1824
-
1825
- $ret = false;
1826
- $message = __('Your subscription appears to no longer be valid. Please try to register again using a valid site key.', 'installer');
1827
- }
1828
-
1829
- $response['version'] = isset($plugin_version) ? $plugin_version : 0;
1830
- $response['plugin_id'] = $plugin_id;
1831
- $response['nonce'] = wp_create_nonce('activate_' . $plugin_id);
1832
- $response['success'] = $ret;
1833
- $response['message'] = $message;
1834
-
1835
- echo json_encode( $response );
1836
- exit;
1837
-
1838
- }
1839
-
1840
- public function download_plugin($slug, $url){
1841
-
1842
- require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
1843
- require_once $this->plugin_path() . '/includes/installer-upgrader-skins.php';
1844
-
1845
- $upgrader_skins = new Installer_Upgrader_Skins(); //use our custom (mute) Skin
1846
- $upgrader = new Plugin_Upgrader($upgrader_skins);
1847
-
1848
- remove_action( 'upgrader_process_complete', array( 'Language_Pack_Upgrader', 'async_upgrade' ), 20 );
1849
-
1850
- $plugins = get_plugins();
1851
-
1852
- $plugin_id = false;
1853
-
1854
- //upgrade or install?
1855
- foreach($plugins as $id => $plugin){
1856
- $wp_plugin_slug = dirname($id);
1857
- if($wp_plugin_slug == $slug){
1858
- $plugin_id = $id;
1859
- break;
1860
- }
1861
- }
1862
-
1863
- if($plugin_id){ //upgrade
1864
-
1865
- $plugin_is_active = is_plugin_active($plugin_id);
1866
-
1867
- $ret = $upgrader->upgrade($plugin_id);
1868
-
1869
- if($plugin_is_active){
1870
- activate_plugin($plugin_id);
1871
- }
1872
-
1873
- }else{ //install
1874
- $ret = $upgrader->install($url);
1875
- }
1876
-
1877
- return $ret;
1878
-
1879
- }
1880
-
1881
- public function activate_plugin(){
1882
-
1883
- $error = '';
1884
-
1885
- if(isset($_POST['nonce']) && isset($_POST['plugin_id']) && $_POST['nonce'] == wp_create_nonce('activate_' . $_POST['plugin_id'])){
1886
-
1887
- $plugin_id = $_POST['plugin_id'];
1888
-
1889
- // Deactivate any embedded version
1890
- $plugin_slug = dirname($plugin_id);
1891
- $active_plugins = get_option('active_plugins');
1892
- foreach($active_plugins as $plugin){
1893
- $wp_plugin_slug = dirname($plugin);
1894
- if($wp_plugin_slug == $plugin_slug . '-embedded'){
1895
- deactivate_plugins(array($plugin));
1896
- break;
1897
- }
1898
- }
1899
-
1900
- //prevent redirects
1901
- add_filter('wp_redirect', '__return_false', 10000);
1902
-
1903
- $return = activate_plugin($plugin_id);
1904
-
1905
- if(is_wp_error($return)){
1906
- $error = $return->get_error_message();
1907
- }
1908
-
1909
- }else{
1910
- $error = 'error';
1911
- }
1912
-
1913
- $ret = array('error' => $error);
1914
-
1915
- echo json_encode($ret);
1916
- exit;
1917
-
1918
- }
1919
-
1920
- public function custom_plugins_api_call($false, $action, $args){
1921
-
1922
- if($action == 'plugin_information'){
1923
-
1924
- $slug = $args->slug;
1925
-
1926
- foreach($this->settings['repositories'] as $repository_id => $repository){
1927
-
1928
- if(!$this->repository_has_valid_subscription($repository_id)){
1929
- $site_key = false;
1930
- }else{
1931
- $site_key = $repository['subscription']['key'];
1932
- }
1933
-
1934
- foreach($repository['data']['packages'] as $package){
1935
-
1936
- foreach($package['products'] as $product){
1937
-
1938
- foreach($product['plugins'] as $plugin_slug){
1939
-
1940
- $download = $this->settings['repositories'][$repository_id]['data']['downloads']['plugins'][$plugin_slug];
1941
-
1942
- if($download['slug'] == $slug){
1943
-
1944
- $res = new stdClass();
1945
- $res->external = true;
1946
-
1947
- $res->name = $download['name'];
1948
- $res->slug = $slug;
1949
- $res->version = $download['version'];
1950
- $res->author = '';
1951
- $res->author_profile = '';
1952
- $res->last_updated = $download['date'];
1953
- //$res->homepage = $download['url'];
1954
-
1955
- if($site_key){
1956
- $res->download_link = $this->append_site_key_to_download_url($download['url'], $site_key, $repository_id);
1957
- }else{
1958
- // if(!empty($download['free-on-wporg'])
1959
- return false; //try somewhere else. e.g. wordpress.org
1960
- }
1961
-
1962
- $res->homepage = $repository['data']['url'];
1963
- $res->sections = array('Description' => $download['description'], 'Changelog' => $download['changelog']);
1964
-
1965
- return $res;
1966
-
1967
- }
1968
-
1969
- }
1970
-
1971
- }
1972
-
1973
- }
1974
-
1975
- }
1976
-
1977
- }
1978
-
1979
- return $false;
1980
-
1981
- }
1982
-
1983
- public function plugins_upgrade_check($update_plugins){
1984
-
1985
- if(!empty($this->settings['repositories'])){
1986
-
1987
- $plugins = get_plugins();
1988
-
1989
- foreach($plugins as $plugin_id => $plugin){
1990
-
1991
- $slug = dirname($plugin_id);
1992
- if(empty($slug)) continue;
1993
-
1994
- $version = $plugin['Version'];
1995
- $name = $plugin['Name'];
1996
-
1997
- foreach($this->settings['repositories'] as $repository_id => $repository){
1998
-
1999
-
2000
- if(!$this->repository_has_valid_subscription($repository_id)){
2001
- $site_key = false;
2002
- }else{
2003
- $site_key = $repository['subscription']['key'];
2004
- //$subscription_type = $this->get_subscription_type_for_repository($repository_id);
2005
- }
2006
-
2007
- foreach($repository['data']['packages'] as $package){
2008
-
2009
- foreach($package['products'] as $product){
2010
-
2011
- foreach($product['plugins'] as $plugin_slug){
2012
-
2013
- $download = $this->settings['repositories'][$repository_id]['data']['downloads']['plugins'][$plugin_slug];
2014
-
2015
- if(!empty($download['free-on-wporg'])) {
2016
- continue;
2017
- }
2018
-
2019
- if(empty($update_plugins->response[$plugin_id]) && ($download['slug'] == $slug || $download['name'] == $name ) && version_compare($download['version'], $version, '>')){
2020
-
2021
- $response = new stdClass();
2022
- $response->id = 0;
2023
- $response->slug = $slug;
2024
- $response->plugin = $plugin_id;
2025
- $response->new_version = $download['version'];
2026
- $response->upgrade_notice = '';
2027
- $response->url = $download['url'];
2028
- if($site_key){
2029
- $response->package = $this->append_site_key_to_download_url($download['url'], $site_key, $repository_id);
2030
- }
2031
- $update_plugins->checked[$plugin_id] = $version;
2032
- $update_plugins->response[$plugin_id] = $response;
2033
-
2034
- }
2035
-
2036
- }
2037
-
2038
- }
2039
-
2040
- }
2041
-
2042
- }
2043
-
2044
- }
2045
-
2046
- }
2047
-
2048
- return $update_plugins;
2049
-
2050
- }
2051
-
2052
- public function setup_plugins_page_notices(){
2053
-
2054
- $plugins = get_plugins();
2055
-
2056
- foreach($plugins as $plugin_id => $plugin){
2057
-
2058
- $slug = dirname($plugin_id);
2059
- if(empty($slug)) continue;
2060
-
2061
- $name = $plugin['Name'];
2062
-
2063
- foreach($this->settings['repositories'] as $repository_id => $repository){
2064
-
2065
- if(!$this->repository_has_valid_subscription($repository_id)){
2066
- $site_key = false;
2067
- }else{
2068
- $site_key = $repository['subscription']['key'];
2069
- }
2070
-
2071
- foreach($repository['data']['packages'] as $package){
2072
-
2073
- foreach($package['products'] as $product){
2074
-
2075
- foreach($product['plugins'] as $plugin_slug){
2076
-
2077
- $download = $this->settings['repositories'][$repository_id]['data']['downloads']['plugins'][$plugin_slug];
2078
-
2079
- if(!empty($download['free-on-wporg'])) {
2080
- continue;
2081
- }
2082
-
2083
- if( $download['slug'] == $slug || $download['name'] == $name ){
2084
-
2085
- if( !$site_key || !$this->plugin_is_registered($repository_id, $download['slug']) ){
2086
- add_action( "after_plugin_row_" . $plugin_id, array($this, 'show_purchase_notice_under_plugin'), 10, 3 );
2087
- }
2088
-
2089
- }
2090
-
2091
- }
2092
-
2093
- }
2094
-
2095
- }
2096
-
2097
- }
2098
-
2099
- }
2100
-
2101
- }
2102
-
2103
- public function show_purchase_notice_under_plugin($plugin_file, $plugin_data, $status){
2104
-
2105
- $wp_list_table = _get_list_table('WP_Plugins_List_Table');
2106
- ?>
2107
-
2108
- <tr class="plugin-update-tr"><td colspan="<?php echo $wp_list_table->get_column_count(); ?>" class="plugin-update colspanchange">
2109
- <div class="update-message installer-q-icon">
2110
- <?php
2111
- printf(__('You need to have a valid subscription in order to get upgrades or support for this plugin. %sPurchase a subscription or enter an existing site key%s.', 'installer'),
2112
- '<a href="' . $this->menu_url() . '">', '</a>');
2113
- ?>
2114
- </div>
2115
- </tr>
2116
-
2117
- <?php
2118
-
2119
- }
2120
-
2121
- public function localize_strings(){
2122
-
2123
- if(!empty($this->settings['repositories'])){
2124
- foreach($this->settings['repositories'] as $repository_id => $repository){
2125
- //set name as call2action when don't have any
2126
- //products
2127
- foreach($repository['data']['packages'] as $package_id => $package){
2128
- foreach($package['products'] as $product_id => $product){
2129
- if(empty($product['call2action'])){
2130
- $this->settings['repositories'][$repository_id]['data']['packages'][$package_id]['products'][$product_id]['call2action'] = $product['name'];
2131
- }
2132
-
2133
- foreach($product['upgrades'] as $idx => $upg){
2134
- if(empty($upg['call2action'])){
2135
- $this->settings['repositories'][$repository_id]['data']['packages'][$package_id]['products'][$product_id]['upgrades'][$idx]['call2action'] = $upg['name'];
2136
- }
2137
- }
2138
-
2139
- foreach($product['renewals'] as $idx => $rnw){
2140
- if(empty($rnw['call2action'])){
2141
- $this->settings['repositories'][$repository_id]['data']['packages'][$package_id]['products'][$product_id]['renewals'][$idx]['call2action'] = $rnw['name'];
2142
- }
2143
-
2144
- }
2145
-
2146
- }
2147
- }
2148
- }
2149
- }
2150
-
2151
- global $sitepress;
2152
- if(is_null($sitepress)){
2153
- return;
2154
- }
2155
-
2156
- // default strings are always in English
2157
- $user_admin_language = $sitepress->get_admin_language();
2158
-
2159
- if($user_admin_language != 'en'){
2160
- foreach($this->settings['repositories'] as $repository_id => $repository){
2161
-
2162
- $localization = $repository['data']['localization'];
2163
-
2164
- //packages
2165
- foreach($repository['data']['packages'] as $package_id => $package){
2166
-
2167
- if( isset($localization['packages'][$package_id]['name'][$user_admin_language]) ){
2168
- $this->settings['repositories'][$repository_id]['data']['packages'][$package_id]['name'] = $localization['packages'][$package_id]['name'][$user_admin_language];
2169
- }
2170
- if( isset($localization['packages'][$package_id]['description'][$user_admin_language]) ){
2171
- $this->settings['repositories'][$repository_id]['data']['packages'][$package_id]['description'] = $localization['packages'][$package_id]['description'][$user_admin_language];
2172
- }
2173
-
2174
- }
2175
-
2176
- //products
2177
- foreach($repository['data']['packages'] as $package_id => $package){
2178
- foreach($package['products'] as $product_id => $product){
2179
-
2180
- if( isset($localization['products'][$product_id]['name'][$user_admin_language]) ){
2181
- $this->settings['repositories'][$repository_id]['data']['packages'][$package_id]['products'][$product_id]['name']
2182
- = $localization['products'][$product_id]['name'][$user_admin_language];
2183
- }
2184
- if( isset($localization['products'][$product_id]['description'][$user_admin_language]) ){
2185
- $this->settings['repositories'][$repository_id]['data']['packages'][$package_id]['products'][$product_id]['description']
2186
- = $localization['products'][$product_id]['description'][$user_admin_language];
2187
- }
2188
- if( isset($localization['products'][$product_id]['call2action'][$user_admin_language]) ){
2189
- $this->settings['repositories'][$repository_id]['data']['packages'][$package_id]['products'][$product_id]['name']
2190
- = $localization['products'][$product_id]['call2action'][$user_admin_language];
2191
- }
2192
-
2193
-
2194
- }
2195
- }
2196
-
2197
- //subscription info
2198
- if(isset($repository['data']['subscriptions_meta']['expiration'])){
2199
- foreach($repository['data']['subscriptions_meta']['expiration'] as $subscription_id => $note){
2200
- if(isset($localization['subscriptions-notes'][$subscription_id]['expiration-warning'][$user_admin_language])){
2201
- $this->settings['repositories'][$repository_id]['data']['subscriptions_meta']['expiration'][$subscription_id]['warning_message']
2202
- = $localization['subscriptions-notes'][$subscription_id]['expiration-warning'][$user_admin_language];
2203
- }
2204
- }
2205
- }
2206
-
2207
- }
2208
- }
2209
-
2210
- }
2211
-
2212
- public function get_matching_cp($repository, $args = array()){
2213
- $match = false;
2214
-
2215
-
2216
- $cp_name = $cp_author = false;
2217
-
2218
- if(isset($this->config['src_name']) && isset($this->config['src_author'])){
2219
-
2220
- $cp_name = $this->config['src_name'];
2221
- $cp_author = $this->config['src_author'];
2222
-
2223
- }elseif(isset($args['src_name']) && isset($args['src_author'])){
2224
-
2225
- $cp_name = $args['src_name'];
2226
- $cp_author = $args['src_author'];
2227
-
2228
- }
2229
-
2230
- if(isset($repository['data']['marketing_cp'])){
2231
-
2232
- foreach($repository['data']['marketing_cp'] as $cp){
2233
-
2234
- if(!empty($cp['exp']) && time() > $cp['exp']){
2235
- continue;
2236
- }
2237
-
2238
- //Use theme_name for plugins too
2239
- if(!empty($cp['theme_name'])){
2240
- if($cp['author_name'] == $cp_author && $cp['theme_name'] == $cp_name){
2241
- $match = $cp;
2242
- continue;
2243
- }
2244
- }else{
2245
- if($cp['author_name'] == $cp_author){
2246
- $match = $cp;
2247
- continue;
2248
- }
2249
- }
2250
-
2251
- }
2252
-
2253
- }
2254
-
2255
- return $match;
2256
- }
2257
-
2258
- public function set_filtered_prices($args = array()){
2259
-
2260
- foreach($this->settings['repositories'] as $repository_id => $repository){
2261
-
2262
- $match = $this->get_matching_cp($repository, $args);
2263
-
2264
- if(empty($match)) continue;
2265
-
2266
- foreach($repository['data']['packages'] as $package_id => $package){
2267
-
2268
- foreach($package['products'] as $product_id => $product){
2269
-
2270
- if($match['dtp'] == '%'){
2271
- $fprice = round( $product['price'] * (1 - $match['amt']/100), 2 );
2272
- $fprice = $fprice != round($fprice) ? sprintf('%.2f', $fprice) : round($fprice, 0);
2273
- }elseif($match['dtp'] == '-'){
2274
- $fprice = $product['price'] - $match['amt'];
2275
- }else{
2276
- $fprice = $product['price'];
2277
- }
2278
-
2279
- if($fprice){
2280
- $this->settings['repositories'][$repository_id]['data']['packages'][$package_id]['products'][$product_id]['price_disc'] = $fprice;
2281
-
2282
- $url_glue = false !== strpos($this->settings['repositories'][$repository_id]['data']['packages'][$package_id]['products'][$product_id]['url'], '?') ? '&' : '?';
2283
- $cpndata = base64_encode(json_encode(array('theme_author' => $match['author_name'], 'theme_name' => $match['theme_name'], 'vlc' => $match['vlc'])));
2284
- $this->settings['repositories'][$repository_id]['data']['packages'][$package_id]['products'][$product_id]['url'] .= $url_glue . 'cpn=' . $cpndata;
2285
-
2286
- foreach($product['upgrades'] as $upgrade_id => $upgrade){
2287
-
2288
- $fprice = false;
2289
- if($match['dtp'] == '%'){
2290
- $fprice = round( $upgrade['price'] * (1 - $match['amt']/100), 2 );
2291
- $fprice = $fprice != round($fprice) ? sprintf('%.2f', $fprice) : round($fprice, 0);
2292
- }elseif($match['dtp'] == '-'){
2293
- $fprice = $upgrade['price'] - $match['amt'];
2294
- }
2295
- if($fprice){
2296
- $this->settings['repositories'][$repository_id]['data']['packages'][$package_id]['products'][$product_id]['upgrades'][$upgrade_id]['price_disc'] = $fprice;
2297
- $this->settings['repositories'][$repository_id]['data']['packages'][$package_id]['products'][$product_id]['upgrades'][$upgrade_id]['url'] .= $url_glue . 'cpn=' . $cpndata;
2298
- }
2299
-
2300
-
2301
- }
2302
-
2303
- }
2304
-
2305
- }
2306
-
2307
- }
2308
-
2309
- }
2310
-
2311
- }
2312
-
2313
- public function set_hierarchy_and_order(){
2314
-
2315
- //2 levels
2316
- if(!empty($this->settings['repositories'])) {
2317
- foreach ($this->settings['repositories'] as $repository_id => $repository) {
2318
-
2319
- if( empty( $repository['data']['packages'] ) ) continue;
2320
-
2321
- $all_packages = $repository['data']['packages'];
2322
- $ordered_packages = array();
2323
-
2324
- //backward compatibility - 'order'
2325
- foreach($all_packages as $k => $v){
2326
- if(!isset($v['order'])){
2327
- $all_packages[$k]['order'] = 0;
2328
- }
2329
- }
2330
-
2331
- //select parents
2332
- foreach ($all_packages as $package_id => $package) {
2333
- if(empty($package['parent'])){
2334
- $ordered_packages[$package_id] = $package;
2335
- }
2336
- }
2337
-
2338
- //add sub-packages
2339
- foreach($all_packages as $package_id => $package){
2340
- if(!empty($package['parent'])) {
2341
- if(isset($ordered_packages[$package['parent']])){
2342
- $ordered_packages[$package['parent']]['sub-packages'][$package_id] = $package;
2343
- }
2344
- }
2345
- }
2346
-
2347
- // order parents
2348
- usort($ordered_packages, array($this, '_order_packages_callback'));
2349
- //order sub-packages
2350
- foreach($ordered_packages as $package_id => $package){
2351
- if(!empty($package['sub-packages'])) {
2352
- usort($ordered_packages[$package_id]['sub-packages'], create_function('$a, $b', 'return $a[\'order\'] > $b[\'order\'];'));
2353
- }
2354
- }
2355
-
2356
- $this->settings['repositories'][$repository_id]['data']['packages'] = $ordered_packages;
2357
-
2358
-
2359
- }
2360
- }
2361
-
2362
-
2363
- }
2364
-
2365
- public function _order_packages_callback($a, $b){
2366
- return $a['order'] > $b['order'];
2367
- }
2368
-
2369
- public function get_support_tag_by_name( $name, $repository ){
2370
-
2371
- if( is_array($this->settings['repositories'][$repository]['data']['support_tags'] )){
2372
- foreach( $this->settings['repositories'][$repository]['data']['support_tags'] as $support_tag){
2373
- if( $support_tag['name'] == $name ){
2374
- return $support_tag['url'];
2375
- }
2376
- }
2377
- }
2378
-
2379
- return false;
2380
- }
2381
-
2382
- public function plugin_upgrade_custom_errors(){
2383
-
2384
- if ( isset($_REQUEST['action']) ) {
2385
-
2386
- $action = isset($_REQUEST['action']) ? $_REQUEST['action'] : '';
2387
-
2388
- //bulk mode
2389
- if('update-selected' == $action) {
2390
-
2391
- global $plugins;
2392
-
2393
- if(isset($plugins) && is_array($plugins)) {
2394
-
2395
- foreach ($plugins as $k => $plugin) {
2396
- $plugin_repository = false;
2397
-
2398
- $wp_plugin_slug = dirname($plugin);
2399
-
2400
- foreach ($this->settings['repositories'] as $repository_id => $repository) {
2401
-
2402
- foreach ($repository['data']['packages'] as $package) {
2403
-
2404
- foreach ($package['products'] as $product) {
2405
-
2406
- foreach ($product['plugins'] as $plugin_slug) {
2407
-
2408
- $download = $this->settings['repositories'][$repository_id]['data']['downloads']['plugins'][$plugin_slug];
2409
-
2410
- if ($download['slug'] == $wp_plugin_slug) {
2411
- $plugin_repository = $repository_id;
2412
- $product_name = $repository['data']['product-name'];
2413
- $plugin_name = $download['name'];
2414
- $free_on_wporg = !empty($download['free-on-wporg']);
2415
- break;
2416
- }
2417
-
2418
- }
2419
-
2420
- }
2421
-
2422
- }
2423
-
2424
- }
2425
-
2426
- if ($plugin_repository) {
2427
-
2428
- //validate subscription
2429
- static $sub_cache = array();
2430
-
2431
- if(empty($sub_cache[$plugin_repository])){
2432
- $site_key = $this->get_repository_site_key($plugin_repository);
2433
- if ($site_key) {
2434
- $subscription_data = $this->fetch_subscription_data( $plugin_repository, $site_key, self::SITE_KEY_VALIDATION_SOURCE_REVALIDATION );
2435
- }
2436
-
2437
- $sub_cache[$plugin_repository]['site_key'] = $site_key;
2438
- $sub_cache[$plugin_repository]['subscription_data'] = isset($subscription_data) ? $subscription_data : false;
2439
- }else{
2440
-
2441
- $site_key = $sub_cache[$plugin_repository]['site_key'];
2442
- $subscription_data = $sub_cache[$plugin_repository]['subscription_data'];
2443
-
2444
- }
2445
-
2446
- if(!$site_key && !empty($free_on_wporg)){ // allow the download from wp.org
2447
- continue;
2448
- }
2449
-
2450
- if (empty($site_key) || empty($subscription_data)) {
2451
-
2452
-
2453
- $error_message = sprintf(__("%s cannot update because your site's registration is not valid. Please %sregister %s%s again for this site first.", 'installer'),
2454
- '<strong>' . $plugin_name . '</strong>', '<a target="_top" href="' . $this->menu_url() . '&validate_repository=' . $plugin_repository .
2455
- '#repository-' . $plugin_repository . '">', $product_name, '</a>');
2456
-
2457
- echo '<div class="updated error"><p>' . $error_message . '</p></div>';
2458
-
2459
- unset($plugins[$k]);
2460
-
2461
-
2462
- }
2463
-
2464
- }
2465
-
2466
- }
2467
-
2468
- }
2469
-
2470
- }
2471
-
2472
-
2473
- if( 'upgrade-plugin' == $action || 'update-plugin' == $action ) {
2474
-
2475
- $plugin = isset($_REQUEST['plugin']) ? trim($_REQUEST['plugin']) : '';
2476
-
2477
- $wp_plugin_slug = dirname($plugin);
2478
-
2479
- $plugin_repository = false;
2480
-
2481
- foreach($this->settings['repositories'] as $repository_id => $repository){
2482
-
2483
- foreach($repository['data']['packages'] as $package){
2484
-
2485
- foreach($package['products'] as $product){
2486
-
2487
- foreach($product['plugins'] as $plugin_slug){
2488
- $download = $this->settings['repositories'][$repository_id]['data']['downloads']['plugins'][$plugin_slug];
2489
-
2490
- //match by folder, will change to match by name and folder
2491
- if($download['slug'] == $wp_plugin_slug) {
2492
- $plugin_repository = $repository_id;
2493
- $product_name = $repository['data']['product-name'];
2494
- $plugin_name = $download['name'];
2495
- $free_on_wporg = !empty($download['free-on-wporg']);
2496
- break;
2497
- }
2498
-
2499
- }
2500
-
2501
- }
2502
-
2503
- }
2504
-
2505
- }
2506
-
2507
- if($plugin_repository) {
2508
-
2509
- //validate subscription
2510
- $site_key = $this->get_repository_site_key($plugin_repository);
2511
- if ($site_key) {
2512
- $subscription_data = $this->fetch_subscription_data( $plugin_repository, $site_key, self::SITE_KEY_VALIDATION_SOURCE_REVALIDATION );
2513
- }
2514
-
2515
- if ( (empty($site_key) || empty($subscription_data)) && empty($free_on_wporg)) {
2516
-
2517
- $error_message = sprintf(__("%s cannot update because your site's registration is not valid. Please %sregister %s%s again for this site first.", 'installer'),
2518
- '<strong>'.$plugin_name . '</strong>', '<a href="' . $this->menu_url() . '&validate_repository=' . $plugin_repository .
2519
- '#repository-' . $plugin_repository . '">', $product_name, '</a>');
2520
-
2521
- if(defined('DOING_AJAX')){ //WP 4.2
2522
-
2523
- $status = array(
2524
- 'update' => 'plugin',
2525
- 'plugin' => $plugin,
2526
- 'slug' => sanitize_key( $_POST['slug'] ),
2527
- 'oldVersion' => '',
2528
- 'newVersion' => '',
2529
- );
2530
-
2531
- $status['errorCode'] = 'wp_installer_invalid_subscription';
2532
- $status['error'] = $error_message;
2533
-
2534
- wp_send_json_error( $status );
2535
-
2536
- } else { // WP 4.1.1
2537
- echo '<div class="updated error"><p>' . $error_message . '</p></div>';
2538
-
2539
-
2540
- echo '<div class="wrap">';
2541
- echo '<h2>' . __('Update Plugin') . '</h2>';
2542
- echo '<a href="' . admin_url('plugins.php') . '">' . __('Return to the plugins page') . '</a>';
2543
- echo '</div>';
2544
- require_once(ABSPATH . 'wp-admin/admin-footer.php');
2545
- exit;
2546
-
2547
- }
2548
-
2549
- }
2550
-
2551
-
2552
- }
2553
-
2554
- }
2555
- }
2556
-
2557
- }
2558
-
2559
- }
1
+ <?php
2
+
3
+ final class WP_Installer{
4
+ protected static $_instance = null;
5
+
6
+ public $settings = array();
7
+
8
+ private $repositories = array();
9
+
10
+ protected $api_debug = '';
11
+
12
+ private $config = array();
13
+
14
+ protected $_plugins_renew_warnings = array();
15
+
16
+ protected $_gz_on = false;
17
+
18
+ private $admin_messages = array();
19
+
20
+ private $_using_icl = false;
21
+ private $_wpml_version = false;
22
+
23
+ private $package_source = array();
24
+
25
+ const SITE_KEY_VALIDATION_SOURCE_OTHER = 0;
26
+ const SITE_KEY_VALIDATION_SOURCE_DOWNLOAD_SPECIFIC = 1;
27
+ const SITE_KEY_VALIDATION_SOURCE_DOWNLOAD_REPORT = 2;
28
+ const SITE_KEY_VALIDATION_SOURCE_REGISTRATION = 3;
29
+ const SITE_KEY_VALIDATION_SOURCE_REVALIDATION = 4;
30
+ const SITE_KEY_VALIDATION_SOURCE_UPDATES_CHECK = 5;
31
+
32
+ public $dependencies;
33
+
34
+ public static function instance() {
35
+
36
+ if ( is_null( self::$_instance ) ) {
37
+ self::$_instance = new self();
38
+ }
39
+
40
+ return self::$_instance;
41
+ }
42
+
43
+ public function __construct(){
44
+
45
+ if(!is_admin() || !is_user_logged_in()) return; //Only for admin
46
+
47
+ $this->_gz_on = function_exists('gzuncompress') && function_exists('gzcompress');
48
+ $this->settings = $this->get_settings();
49
+
50
+ add_action('admin_notices', array($this, 'show_site_key_nags'));
51
+
52
+ add_action('admin_notices', array($this, 'show_admin_messages'));
53
+
54
+ add_action('admin_init', array($this, 'load_embedded_plugins'), 0);
55
+
56
+ add_action('admin_menu', array($this, 'menu_setup'));
57
+ add_action('network_admin_menu', array($this, 'menu_setup'));
58
+
59
+ if(defined('DOING_AJAX') && isset($_POST['action']) && $_POST['action'] == 'installer_download_plugin'){
60
+ add_filter( 'site_transient_update_plugins', array( $this, 'plugins_upgrade_check') );
61
+ }
62
+ add_filter('plugins_api', array( $this, 'custom_plugins_api_call'), 10, 3);
63
+ add_filter('pre_set_site_transient_update_plugins', array( $this, 'plugins_upgrade_check'));
64
+
65
+ // register repositories
66
+ $this->load_repositories_list();
67
+
68
+ if( empty($this->settings['last_repositories_update']) || time() - $this->settings['last_repositories_update'] > 86400
69
+ || ( isset($_GET['force-check']) && $_GET['force-check'] == 1 ) ){
70
+ $this->refresh_repositories_data();
71
+ }
72
+
73
+ // default config
74
+ $this->config['plugins_install_tab'] = false;
75
+
76
+ add_action('init', array($this, 'init'));
77
+
78
+ //add_filter('wp_installer_buy_url', array($this, 'append_parameters_to_buy_url'));
79
+
80
+ add_action('init', array($this,'load_locale'));
81
+
82
+ }
83
+
84
+ public function get_repositories() {
85
+
86
+ return $this->repositories;
87
+
88
+ }
89
+
90
+ public function set_config($key, $value){
91
+
92
+ $this->config[$key] = $value;
93
+
94
+ }
95
+
96
+ public function init(){
97
+ global $pagenow;
98
+
99
+ $this->dependencies = new Installer_Dependencies;
100
+
101
+ if(empty($this->settings['_pre_1_0_clean_up'])) {
102
+ $this->_pre_1_0_clean_up();
103
+ }
104
+
105
+ $this->settings = $this->_old_products_format_backwards_compatibility($this->settings);
106
+
107
+ if ( !function_exists( 'get_plugins' ) ) {
108
+ require_once ABSPATH . 'wp-admin/includes/plugin.php';
109
+ }
110
+
111
+ $this->_using_icl = function_exists('wpml_site_uses_icl') && wpml_site_uses_icl();
112
+ $this->_wpml_version = defined('ICL_SITEPRESS_VERSION') ? ICL_SITEPRESS_VERSION : '';
113
+
114
+ wp_enqueue_script('installer-admin', $this->res_url() . '/res/js/admin.js', array('jquery'), $this->version());
115
+ wp_enqueue_style('installer-admin', $this->res_url() . '/res/css/admin.css', array(), $this->version());
116
+
117
+ $translation_array = array(
118
+ 'installing' => __( 'Installing %s', 'installer' ),
119
+ 'updating' => __( 'Updating %s', 'installer' ),
120
+ 'activating' => __( 'Activating %s', 'installer' )
121
+ );
122
+
123
+ wp_localize_script( 'installer-admin', 'installer_strings', $translation_array );
124
+
125
+ if($pagenow == 'plugins.php'){
126
+ add_action('admin_notices', array($this, 'setup_plugins_page_notices'));
127
+ add_action('admin_notices', array($this, 'setup_plugins_renew_warnings'), 10);
128
+ add_action('admin_notices', array($this, 'queue_plugins_renew_warnings'), 20);
129
+
130
+ add_action('admin_init', array($this, 'setup_plugins_action_links'));
131
+
132
+ }
133
+
134
+ if($this->is_repositories_page()){
135
+ add_action('admin_init', array($this, 'validate_repository_subscription'));
136
+ }
137
+
138
+ if(defined('DOING_AJAX')){
139
+ add_action('wp_ajax_save_site_key', array($this, 'save_site_key'));
140
+ add_action('wp_ajax_remove_site_key', array($this, 'remove_site_key'));
141
+ add_action('wp_ajax_update_site_key', array($this, 'update_site_key'));
142
+
143
+ add_action('wp_ajax_installer_download_plugin', array($this, 'download_plugin_ajax_handler'));
144
+ add_action('wp_ajax_installer_activate_plugin', array($this, 'activate_plugin'));
145
+
146
+ add_action('wp_ajax_installer_dismiss_nag', array($this, 'dismiss_nag'));
147
+ }
148
+
149
+ if($pagenow == 'update.php'){
150
+ if(isset($_GET['action']) && $_GET['action'] == 'update-selected'){
151
+ add_action('admin_head', array($this, 'plugin_upgrade_custom_errors')); //iframe/bulk
152
+ }else{
153
+ add_action('all_admin_notices', array($this, 'plugin_upgrade_custom_errors')); //regular/singular
154
+ }
155
+ }
156
+
157
+ // WP 4.2
158
+ if(defined('DOING_AJAX')){
159
+ add_action('wp_ajax_update-plugin', array($this, 'plugin_upgrade_custom_errors'), 0); // high priority, before WP
160
+ }
161
+
162
+ //Include theme support
163
+ include_once $this->plugin_path() . '/includes/class-installer-theme.php';
164
+
165
+ // Extra information about the source of Installer
166
+ $package_source_file = $this->plugin_path() . '/installer-source.json';
167
+ if( file_exists( $package_source_file ) ){
168
+ $this->package_source = json_decode( file_get_contents( $package_source_file ) );
169
+ }
170
+ }
171
+
172
+ protected function log($message){
173
+ if( defined('WPML_INSTALLER_LOGGING') && WPML_INSTALLER_LOGGING ){
174
+ if($fh = @fopen( $this->plugin_path() . '/installer.log', 'a' )){
175
+ fwrite($fh, current_time( 'mysql' ) . "\t" . $message . "\n");
176
+ }
177
+ }
178
+ }
179
+
180
+ public function register_admin_message($text, $type = 'updated'){
181
+ $this->admin_messages[] = array('text' => $text, 'type' => $type);
182
+ }
183
+
184
+ public function show_admin_messages(){
185
+ if(!empty($this->admin_messages)){
186
+ $types = array( 'error', 'updated', 'notice' );
187
+ foreach($this->admin_messages as $message){
188
+ $class = in_array( $message['type'], $types ) ? $message['type'] : 'updated';
189
+ ?>
190
+ <div class="<?php echo $class ?>">
191
+ <p>
192
+ <?php echo $message['text'] ?>
193
+ </p>
194
+ </div>
195
+ <?php
196
+ }
197
+ }
198
+ }
199
+
200
+ public function load_locale(){
201
+ $locale = get_locale();
202
+ $locale = apply_filters( 'plugin_locale', $locale, 'installer' );
203
+ $mo_file = $this->plugin_path() . '/locale/installer-' . $locale . '.mo';
204
+ if(file_exists($mo_file)){
205
+ load_textdomain( 'installer', $mo_file );
206
+ }
207
+ }
208
+
209
+ public function load_embedded_plugins(){
210
+ if(file_exists($this->plugin_path() . '/embedded-plugins' )) {
211
+ include_once $this->plugin_path() . '/embedded-plugins/embedded-plugins.class.php';
212
+ $this->installer_embedded_plugins = new Installer_Embedded_Plugins();
213
+ }
214
+ }
215
+
216
+ public function menu_setup(){
217
+ global $pagenow;
218
+
219
+ if(is_multisite() && !is_network_admin()){
220
+ $this->menu_multisite_redirect();
221
+ add_options_page(__('Installer', 'installer'), __('Installer', 'installer'), 'manage_options', 'installer', array($this, 'show_products')) ;
222
+ }else{
223
+ if($this->config['plugins_install_tab'] && is_admin() && $pagenow == 'plugin-install.php'){
224
+ // Default GUI, under Plugins -> Install
225
+ add_filter('install_plugins_tabs', array($this, 'add_install_plugins_tab'));
226
+ add_action('install_plugins_commercial', array($this, 'show_products'));
227
+ }
228
+ }
229
+
230
+ }
231
+
232
+ public function menu_url(){
233
+ if(is_multisite()){
234
+ if(is_network_admin()){
235
+ $url = network_admin_url('plugin-install.php?tab=commercial');
236
+ }else{
237
+ $url = admin_url('options-general.php?page=installer');
238
+ }
239
+ }else{
240
+ $url = admin_url('plugin-install.php?tab=commercial');
241
+ }
242
+ return $url;
243
+ }
244
+
245
+ private function menu_multisite_redirect(){
246
+ global $pagenow;
247
+
248
+ if($pagenow == 'plugin-install.php' && isset($_GET['tab']) && $_GET['tab'] == 'commercial'){
249
+ wp_redirect($this->menu_url());
250
+ exit;
251
+ }
252
+
253
+ }
254
+
255
+ private function _pre_1_0_clean_up(){
256
+ global $wpdb;
257
+
258
+ if(!defined('WPRC_VERSION')){
259
+ $old_tables = array(
260
+ $wpdb->prefix . 'wprc_cached_requests',
261
+ $wpdb->prefix . 'wprc_extension_types',
262
+ $wpdb->prefix . 'wprc_extensions',
263
+ $wpdb->prefix . 'wprc_repositories',
264
+ $wpdb->prefix . 'wprc_repositories_relationships',
265
+ );
266
+
267
+ foreach($old_tables as $table){
268
+ $wpdb->query(sprintf("DROP TABLE IF EXISTS %s", $table));
269
+ }
270
+
271
+ }
272
+
273
+ $this->settings['_pre_1_0_clean_up'] = true;
274
+ $this->save_settings();
275
+ }
276
+
277
+ public function setup_plugins_action_links(){
278
+
279
+ $plugins = get_plugins();
280
+
281
+ $repositories_plugins = array();
282
+
283
+ if( !empty($this->settings['repositories']) ) {
284
+
285
+ foreach ( $this->settings['repositories'] as $repository_id => $repository ) {
286
+
287
+ foreach ( $repository['data']['packages'] as $package ) {
288
+
289
+ foreach ( $package['products'] as $product ) {
290
+
291
+ foreach ( $product['plugins'] as $plugin_slug ) {
292
+
293
+ $download = $this->settings['repositories'][$repository_id]['data']['downloads']['plugins'][$plugin_slug];
294
+
295
+ if ( !isset($repositories_plugins[$repository_id][$download['slug']]) ) {
296
+ $repositories_plugins[$repository_id][$download['slug']] = array(
297
+ 'name' => $download['name'],
298
+ 'registered' => $this->plugin_is_registered( $repository_id, $download['slug'] ) ? 1 : 0
299
+ );
300
+ }
301
+
302
+ }
303
+
304
+ }
305
+
306
+ }
307
+
308
+ foreach ( $plugins as $plugin_id => $plugin ) {
309
+
310
+ $wp_plugin_slug = dirname( $plugin_id );
311
+ if ( empty($wp_plugin_slug) ) {
312
+ $wp_plugin_slug = basename( $plugin_id, '.php' );
313
+ }
314
+
315
+ foreach ( $repositories_plugins as $repository_id => $r_plugins ) {
316
+
317
+ foreach ( $r_plugins as $slug => $r_plugin ) {
318
+
319
+ if ( $wp_plugin_slug == $slug || $r_plugin['name'] == $plugin['Name'] || $r_plugin['name'] == $plugin['Title'] ) { //match order: slug, name, title
320
+
321
+ if ( $r_plugin['registered'] ) {
322
+ add_filter( 'plugin_action_links_' . $plugin_id, array($this, 'plugins_action_links_registered') );
323
+ } else {
324
+ add_filter( 'plugin_action_links_' . $plugin_id, array($this, 'plugins_action_links_not_registered') );
325
+ }
326
+
327
+ }
328
+
329
+ }
330
+
331
+ }
332
+
333
+
334
+ }
335
+
336
+ }
337
+ }
338
+
339
+ }
340
+
341
+ public function plugins_action_links_registered($links){
342
+ $links[] = '<a href="' . $this->menu_url() . '">' . __('Registered', 'installer') . '</a>';
343
+ return $links;
344
+ }
345
+
346
+ public function plugins_action_links_not_registered($links){
347
+ $links[] = '<a href="' . $this->menu_url() . '">' . __('Register', 'installer') . '</a>';
348
+ return $links;
349
+ }
350
+
351
+ public function plugin_is_registered($repository_id, $slug){
352
+
353
+ $registered = false;
354
+
355
+ if( $this->repository_has_valid_subscription($repository_id) ){
356
+
357
+ $subscription_type = $this->get_subscription_type_for_repository($repository_id);
358
+ $r_plugins = array();
359
+
360
+ foreach($this->settings['repositories'][$repository_id]['data']['packages'] as $package){
361
+
362
+ foreach($package['products'] as $product){
363
+
364
+ if( $product['subscription_type'] == $subscription_type || $this->have_superior_subscription($subscription_type, $product) ) {
365
+
366
+ foreach ($product['plugins'] as $plugin_slug) {
367
+
368
+ $download = $this->settings['repositories'][$repository_id]['data']['downloads']['plugins'][$plugin_slug];
369
+
370
+ if (!isset($rep_plugins[$download['slug']])) {
371
+ $r_plugins[$download['slug']] = $download['slug'];
372
+ }
373
+
374
+ }
375
+
376
+ }
377
+
378
+ }
379
+
380
+ }
381
+
382
+ $registered = isset($r_plugins[$slug]);
383
+
384
+ }
385
+
386
+
387
+ return $registered;
388
+
389
+ }
390
+
391
+ public function version(){
392
+ return WP_INSTALLER_VERSION;
393
+ }
394
+
395
+ public function plugin_path() {
396
+ return untrailingslashit( plugin_dir_path( dirname(__FILE__) ) );
397
+ }
398
+
399
+ public function plugin_url() {
400
+ if(isset($this->config['in_theme_folder']) && !empty($this->config['in_theme_folder'])){
401
+ $url = untrailingslashit(get_template_directory_uri() . '/' . $this->config['in_theme_folder']);
402
+ }else{
403
+ $url = untrailingslashit( plugins_url( '/', dirname(__FILE__) ) );
404
+ }
405
+
406
+ return $url;
407
+ }
408
+
409
+ public function is_repositories_page(){
410
+ global $pagenow;
411
+
412
+ return $pagenow == 'plugin-install.php' && isset($_GET['tab']) && $_GET['tab'] == 'commercial';
413
+ }
414
+
415
+ public function res_url(){
416
+ if(isset($this->config['in_theme_folder']) && !empty($this->config['in_theme_folder'])){
417
+ $url = untrailingslashit(get_template_directory_uri() . '/' . $this->config['in_theme_folder']);
418
+ }else{
419
+ $url = $this->plugin_url();
420
+ }
421
+ return $url;
422
+ }
423
+
424
+ public function save_settings(){
425
+
426
+ $_settings = serialize($this->settings);
427
+ if($this->_gz_on){
428
+ $_settings = gzcompress($_settings);
429
+ }
430
+ $_settings = base64_encode($_settings);
431
+
432
+ update_option( 'wp_installer_settings', $_settings );
433
+
434
+ if( is_multisite() && is_main_site() && isset($this->settings['repositories']) ){
435
+ $network_settings = array();
436
+
437
+ foreach( $this->settings['repositories'] as $rep_id => $repository ){
438
+ if( isset($repository['subscription']) )
439
+ $network_settings[$rep_id] = $repository['subscription'];
440
+ }
441
+
442
+ update_site_option( 'wp_installer_network', $network_settings );
443
+
444
+
445
+ }
446
+
447
+ }
448
+
449
+ public function get_settings($refresh = false){
450
+
451
+ if($refresh || empty($this->settings)){
452
+
453
+ $_settings = get_option('wp_installer_settings');
454
+
455
+
456
+ if (is_array($_settings) || empty($_settings)) { //backward compatibility 1.1
457
+ $this->settings = $_settings;
458
+
459
+ } else {
460
+ $_settings = base64_decode($_settings);
461
+ if ($this->_gz_on) {
462
+ $_settings = gzuncompress($_settings);
463
+ }
464
+ $this->settings = unserialize($_settings);
465
+ }
466
+
467
+ if (is_multisite() && isset($this->settings['repositories'])) {
468
+ $network_settings = maybe_unserialize(get_site_option('wp_installer_network'));
469
+ if ($network_settings) {
470
+ foreach ($this->settings['repositories'] as $rep_id => $repository) {
471
+ if (isset($network_settings[$rep_id])) {
472
+ $this->settings['repositories'][$rep_id]['subscription'] = $network_settings[$rep_id];
473
+ }
474
+ }
475
+ }
476
+ }
477
+
478
+
479
+ $this->settings = $this->_pre_1_6_backwards_compatibility($this->settings);
480
+
481
+ $this->settings = $this->_old_products_format_backwards_compatibility($this->settings);
482
+
483
+ }
484
+
485
+
486
+ return $this->settings;
487
+ }
488
+
489
+ //backward compatibility, will remove 'basename' in version 1.8
490
+ private function _pre_1_6_backwards_compatibility($settings){
491
+
492
+ if( version_compare($this->version(), '1.8', '<') && !empty($settings['repositories']) ){
493
+
494
+ foreach ($settings['repositories'] as $repository_id => $repository) {
495
+
496
+ foreach ($repository['data']['downloads']['plugins'] as $slug => $download) {
497
+
498
+ $settings['repositories'][$repository_id]['data']['downloads']['plugins'][$slug]['slug'] = $download['basename'];
499
+
500
+ }
501
+ }
502
+
503
+ }
504
+
505
+ return $settings;
506
+
507
+ }
508
+
509
+ //backward compatibility - support old products list format (downloads under products instead of global downloads list)
510
+ private function _old_products_format_backwards_compatibility($settings){
511
+
512
+ if( version_compare($this->version(), '1.8', '<') && !empty($settings['repositories']) && empty($this->_old_products_format_backwards_compatibility) ) {
513
+
514
+ foreach ($settings['repositories'] as $repository_id => $repository) {
515
+
516
+ $populate_downloads = false;
517
+
518
+ foreach ($repository['data']['packages'] as $package_id => $package) {
519
+
520
+ foreach ($package['products'] as $product_id => $product) {
521
+
522
+ if (!isset($product['plugins'])) {
523
+
524
+ $populate_downloads = true;
525
+
526
+ foreach ($product['downloads'] as $download_id => $download) {
527
+
528
+ $settings['repositories'][$repository_id]['data']['packages'][$package_id]['products'][$product_id]['plugins'][] = $download['slug'];
529
+
530
+ }
531
+
532
+ }
533
+
534
+ }
535
+
536
+ }
537
+
538
+ if ($populate_downloads) {
539
+
540
+ // Add downloads branch
541
+ foreach ($repository['data']['packages'] as $package_id => $package) {
542
+
543
+ foreach ($package['products'] as $product_id => $product) {
544
+
545
+ foreach ($product['downloads'] as $download_id => $download) {
546
+
547
+ if (!isset($settings['repositories'][$repository_id]['data']['downloads']['plugins'][$download['slug']])) {
548
+ $settings['repositories'][$repository_id]['data']['downloads']['plugins'][$download['slug']] = $download;
549
+ }
550
+
551
+ $settings['repositories'][$repository_id]['data']['packages'][$package_id]['products'][$product_id]['plugins'][] = $download['slug'];
552
+ }
553
+
554
+ unset($settings['repositories'][$repository_id]['data']['packages'][$package_id]['products'][$product_id]['downloads']);
555
+
556
+ }
557
+
558
+ }
559
+
560
+ }
561
+
562
+ }
563
+
564
+ $this->_old_products_format_backwards_compatibility = true;
565
+
566
+ }
567
+
568
+ return $settings;
569
+
570
+ }
571
+
572
+ public function get_installer_site_url( $repository_id = false ){
573
+ global $current_site;
574
+
575
+ $site_url = get_site_url();
576
+
577
+ if( $repository_id && is_multisite() && isset( $this->settings['repositories'] ) ){
578
+ $network_settings = maybe_unserialize( get_site_option('wp_installer_network') );
579
+
580
+ if ( isset( $network_settings[$repository_id] ) ) {
581
+ $site_url = get_site_url( $current_site->blog_id );
582
+ }
583
+
584
+ }
585
+
586
+ return $site_url;
587
+ }
588
+
589
+ public function show_site_key_nags(){
590
+ $screen = get_current_screen();
591
+
592
+ if($screen->base == 'settings_page_installer' || ($screen->base == 'plugin-install' && isset($_GET['tab']) && $_GET['tab'] == 'commercial')){
593
+ return;
594
+ }
595
+
596
+ if(!empty($this->config['site_key_nags'])){
597
+
598
+ foreach($this->config['site_key_nags'] as $nag){
599
+
600
+ if(!$this->repository_has_subscription($nag['repository_id'] )){
601
+ $show = true;
602
+ if(!empty($nag['condition_cb'])){
603
+ $show = call_user_func($nag['condition_cb']);
604
+ }
605
+
606
+ if(empty($this->settings['dismissed_nags'][$nag['repository_id']]) && $show){
607
+ echo '<div class="updated error otgs-is-dismissible"><p>';
608
+ printf(__("To get automatic updates, you need to register %s for this site. %sRegister %s%s", 'sitepress'),
609
+ $nag['product_name'], '<a class="button-primary" href="' . $this->menu_url() . '">', $nag['product_name'], '</a>');
610
+
611
+ echo '</p>';
612
+ echo '<span class="installer-dismiss-nag notice-dismiss" data-repository="' . $nag['repository_id'] . '"><span class="screen-reader-text">' . __('Dismiss', 'sitepress') . '</span></span>';
613
+ echo '</div>';
614
+ }
615
+ }
616
+
617
+ }
618
+
619
+ }
620
+
621
+ }
622
+
623
+ public function dismiss_nag(){
624
+ $this->settings['dismissed_nags'][$_POST['repository']] = 1;
625
+
626
+ $this->save_settings();
627
+
628
+ echo json_encode(array());
629
+ exit;
630
+ }
631
+
632
+ public function add_install_plugins_tab($tabs){
633
+
634
+ $tabs['commercial'] = __('Commercial', 'installer');
635
+
636
+ return $tabs;
637
+ }
638
+
639
+ public function load_repositories_list(){
640
+ global $wp_installer_instances;
641
+
642
+ foreach ($wp_installer_instances as $instance) {
643
+
644
+ if (file_exists(dirname($instance['bootfile']) . '/repositories.xml')) {
645
+ $config_file = dirname($instance['bootfile']) . '/repositories.xml';
646
+
647
+ if (file_exists(dirname($instance['bootfile']) . '/repositories.sandbox.xml')) {
648
+ $config_file = dirname($instance['bootfile']) . '/repositories.sandbox.xml';
649
+ add_filter('https_ssl_verify', '__return_false');
650
+ }
651
+
652
+ $repos = simplexml_load_file($config_file);
653
+
654
+ if($repos) {
655
+ foreach ($repos as $repo) {
656
+ $id = strval($repo->id);
657
+
658
+ $data['api-url'] = strval($repo->apiurl);
659
+ $data['products'] = strval($repo->products);
660
+
661
+ // excludes rule;
662
+ if (isset($this->config['repositories_exclude']) && in_array($id, $this->config['repositories_exclude'])) {
663
+ continue;
664
+ }
665
+
666
+ // includes rule;
667
+ if (isset($this->config['repositories_include']) && !in_array($id, $this->config['repositories_include'])) {
668
+ continue;
669
+ }
670
+
671
+ $this->repositories[$id] = $data;
672
+
673
+ }
674
+ }
675
+
676
+ }
677
+ }
678
+
679
+ }
680
+
681
+ public function filter_repositories_list(){
682
+
683
+ if(!empty($this->settings['repositories'])) {
684
+ foreach ($this->settings['repositories'] as $id => $repo_data) {
685
+
686
+ // excludes rule;
687
+ if (isset($this->config['repositories_exclude']) && in_array($id, $this->config['repositories_exclude'])) {
688
+ unset($this->settings['repositories'][$id]);
689
+ }
690
+
691
+ // includes rule;
692
+ if (isset($this->config['repositories_include']) && !in_array($id, $this->config['repositories_include'])) {
693
+ unset($this->settings['repositories'][$id]);
694
+ }
695
+
696
+
697
+ }
698
+ }
699
+
700
+
701
+ }
702
+
703
+ public function refresh_repositories_data(){
704
+ static $checked = false;
705
+
706
+ if( defined('OTGS_DISABLE_AUTO_UPDATES') && OTGS_DISABLE_AUTO_UPDATES && empty($_GET['force-check']) || $checked ){
707
+
708
+ if(empty($this->settings['repositories']) && $this->is_repositories_page()){
709
+
710
+ foreach($this->repositories as $id => $data) {
711
+ $repository_names[] = $id;
712
+
713
+ }
714
+
715
+ $error = sprintf(__("Installer cannot display the products information because the automatic updating for %s was explicitly disabled with the configuration below (usually in wp-config.php):", 'installer'), strtoupper( join(', ', $repository_names) ));
716
+ $error .= '<br /><br /><code>define("OTGS_DISABLE_AUTO_UPDATES", true);</code><br /><br />';
717
+ $error .= sprintf(__("In order to see the products information, please run the %smanual updates check%s to initialize the products list or (temporarily) remove the above code.", 'installer'), '<a href="' . admin_url('update-core.php') . '">', '</a>');
718
+
719
+ $this->register_admin_message($error, 'error');
720
+
721
+
722
+ }
723
+
724
+ return;
725
+ }
726
+
727
+ $checked = true;
728
+
729
+ foreach($this->repositories as $id => $data){
730
+
731
+ $response = wp_remote_get($data['products']);
732
+
733
+ if(is_wp_error($response)){
734
+ // http fallback
735
+ $data['products'] = preg_replace("@^https://@", 'http://', $data['products']);
736
+ $response = wp_remote_get($data['products']);
737
+ }
738
+
739
+ if(is_wp_error($response)){
740
+
741
+ $error = sprintf(__("Installer cannot contact our updates server to get information about the available products and check for new versions. If you are seeing this message for the first time, you can ignore it, as it may be a temporary communication problem. If the problem persists and your WordPress admin is slowing down, you can disable automated version checks. Add the following line to your wp-config.php file:", 'installer'), strtoupper($id));
742
+ $error .= '<br /><br /><code>define("OTGS_DISABLE_AUTO_UPDATES", true);</code>';
743
+
744
+ $this->register_admin_message($error, 'error');
745
+
746
+ continue;
747
+ }
748
+
749
+ if($response && isset($response['response']['code']) && $response['response']['code'] == 200){
750
+ $body = wp_remote_retrieve_body($response);
751
+ if($body){
752
+ $products = json_decode($body, true);
753
+
754
+ if(is_array($products)){
755
+ $this->settings['repositories'][$id]['data'] = $products;
756
+ $this->settings = $this->_pre_1_6_backwards_compatibility($this->settings);
757
+ }
758
+ }
759
+
760
+ }
761
+
762
+ $this->log( sprintf("Checked for %s updates: %s", $id, $data['products']) );
763
+
764
+
765
+ }
766
+
767
+ // cleanup
768
+ if(empty($this->settings['repositories'])){
769
+ $this->settings['repositories'] = array();
770
+ }
771
+ foreach($this->settings['repositories'] as $id => $data){
772
+ if(!in_array($id, array_keys($this->repositories))){
773
+ unset($this->settings['repositories'][$id]);
774
+ }
775
+ }
776
+
777
+ $this->settings['last_repositories_update']= time();
778
+
779
+ $this->save_settings();
780
+
781
+ }
782
+
783
+ public function show_products($args = array()){
784
+
785
+ $screen = get_current_screen();
786
+
787
+ if($screen->base == 'settings_page_installer'){ // settings page
788
+ echo '<div class="wrap">';
789
+ echo '<h2>' . __('Installer', 'installer') . '</h2>';
790
+ echo '<br />';
791
+ }
792
+
793
+ if(!is_array($args)) $args = array();
794
+ if(empty($args['template'])) $args['template'] = 'default';
795
+
796
+ $this->filter_repositories_list();
797
+
798
+ if(!empty($this->settings['repositories'])){
799
+
800
+ $this->localize_strings();
801
+ $this->set_filtered_prices($args);
802
+ $this->set_hierarchy_and_order();
803
+
804
+ foreach($this->settings['repositories'] as $repository_id => $repository){
805
+
806
+ if($args['template'] == 'compact'){
807
+
808
+ if(isset($args['repository']) && $args['repository'] == $repository_id){
809
+ include $this->plugin_path() . '/templates/products-compact.php';
810
+ }
811
+
812
+ }else{
813
+
814
+ include $this->plugin_path() . '/templates/repository-listing.php';
815
+
816
+ }
817
+
818
+ unset($site_key, $subscription_type, $expired, $upgrade_options, $products_avaliable);
819
+
820
+ }
821
+
822
+ }else{
823
+
824
+ echo '<center>' . __('No repositories defined.', 'installer') . '</center>';
825
+
826
+ }
827
+
828
+ if($screen->base == 'settings_page_installer'){ // settings page
829
+ echo '</div>';
830
+ }
831
+
832
+
833
+ }
834
+
835
+ public function get_product_price($repository_id, $package_id, $product_id, $incl_discount = false){
836
+
837
+ $price = false;
838
+
839
+ foreach($this->settings['repositories'][$repository_id]['data']['packages'] as $package ){
840
+
841
+ if($package['id'] == $package_id){
842
+ if(isset($package['products'][$product_id])){
843
+ if($incl_discount && isset($package['products'][$product_id]['price_disc'])){
844
+ $price = $package['products'][$product_id]['price_disc'];
845
+ }elseif(isset($package['products'][$product_id]['price'])){
846
+ $price = $package['products'][$product_id]['price'];
847
+ }
848
+ }
849
+ break;
850
+ }
851
+ }
852
+
853
+ return $price;
854
+ }
855
+
856
+ private function _render_product_packages($packages, $subscription_type, $expired, $upgrade_options, $repository_id){
857
+
858
+ $data = array();
859
+
860
+ foreach($packages as $package_id => $package){
861
+
862
+ $row = array('products' => array(), 'downloads' => array());
863
+ foreach($package['products'] as $product){
864
+
865
+ // filter out free subscriptions from being displayed as buying options
866
+ if( empty($product['price']) && (empty($subscription_type) || $expired) ){
867
+ continue;
868
+ }
869
+
870
+ // buy base
871
+ if(empty($subscription_type) || $expired) {
872
+
873
+ $p['url'] = $this->append_parameters_to_buy_url($product['url'], $repository_id);
874
+ if (!empty($product['price_disc'])) {
875
+ $p['label'] = $product['call2action'] . ' - ' . sprintf('$%s %s$%d%s (USD)', $product['price_disc'], '&nbsp;&nbsp;<del>', $product['price'], '</del>');
876
+ } else {
877
+ $p['label'] = $product['call2action'] . ' - ' . sprintf('$%d (USD)', $product['price']);
878
+ }
879
+ $row['products'][] = $p;
880
+
881
+ // renew
882
+ } elseif(isset($subscription_type) && $product['subscription_type'] == $subscription_type){
883
+
884
+ if($product['renewals']) {
885
+ foreach ($product['renewals'] as $renewal) {
886
+ $p['url'] = $this->append_parameters_to_buy_url($renewal['url'], $repository_id);
887
+ $p['label'] = $renewal['call2action'] . ' - ' . sprintf('$%d (USD)', $renewal['price']);
888
+ }
889
+
890
+ $row['products'][] = $p;
891
+ }
892
+
893
+ }
894
+
895
+ // upgrades
896
+ if(!empty($upgrade_options[$product['subscription_type']])){
897
+
898
+ foreach($upgrade_options[$product['subscription_type']] as $stype => $upgrade){
899
+ if($stype != $subscription_type) continue;
900
+
901
+ $p['url'] = $this->append_parameters_to_buy_url($upgrade['url'], $repository_id);
902
+ if (!empty($upgrade['price_disc'])) {
903
+ $p['label'] = $upgrade['call2action'] . ' - ' . sprintf('$%s %s$%d%s (USD)', $upgrade['price_disc'], '&nbsp;&nbsp;<del>', $upgrade['price'], '</del>');
904
+ } else {
905
+ $p['label'] = $upgrade['call2action'] . ' - ' . sprintf('$%d (USD)', $upgrade['price']);
906
+ }
907
+ $row['products'][] = $p;
908
+
909
+ }
910
+
911
+ }
912
+
913
+ // downloads
914
+ if(isset($subscription_type) && !$expired && $product['subscription_type'] == $subscription_type){
915
+ foreach($product['plugins'] as $plugin_slug){
916
+
917
+ $row['downloads'][] = $this->settings['repositories'][$repository_id]['data']['downloads']['plugins'][$plugin_slug];
918
+
919
+ }
920
+
921
+ }
922
+
923
+ //subpackages
924
+ if(!empty($package['sub-packages'])){
925
+ $row['sub-packages'] = $package['sub-packages'];
926
+ }
927
+
928
+ }
929
+
930
+ $row['id'] = $package['id'];
931
+ $row['image_url'] = $package['image_url'];
932
+ $row['name'] = $package['name'];
933
+ $row['description'] = $package['description'];
934
+
935
+ if(!empty($row['products']) || !empty($row['downloads']) || !empty($row['sub-packages'])){
936
+ $data[] = $row;
937
+ }
938
+
939
+
940
+ }
941
+
942
+ return $data;
943
+
944
+ }
945
+
946
+ public function get_extra_url_parameters(){
947
+
948
+ $parameters = array();
949
+
950
+ if(!empty($this->package_source)){
951
+ foreach($this->package_source as $key => $val){
952
+ $parameters[$key] = $val;
953
+ }
954
+ }
955
+
956
+ $parameters['installer_version'] = WP_INSTALLER_VERSION;
957
+ $parameters['theme'] = wp_get_theme()->get( 'Name' );
958
+ $parameters['site_name'] = get_bloginfo( 'name' );
959
+
960
+ return $parameters;
961
+ }
962
+
963
+ public function append_parameters_to_buy_url($url, $repository_id, $args = array()){
964
+
965
+ $url = add_query_arg( array('icl_site_url' => $this->get_installer_site_url( $repository_id ) ), $url );
966
+
967
+ $affiliate_id = false;
968
+ $affiliate_key = false;
969
+
970
+ // Add extra parameters for custom Installer packages
971
+ if( !empty($this->package_source) ){
972
+ $extra = $this->get_extra_url_parameters();
973
+
974
+ if( !empty($extra['repository']) && $extra['repository'] == $repository_id ) {
975
+
976
+ if( !empty($extra['affiliate_key']) && !empty($extra['user_id']) ){
977
+ $this->config['affiliate_id:' . $repository_id] = $extra['user_id'];
978
+ $this->config['affiliate_key:' . $repository_id] = $extra['affiliate_key'];
979
+ unset($extra['affiliate_key'], $extra['user_id'], $extra['repository']); // no need to include these ones
980
+ }
981
+
982
+ $url = add_query_arg($extra, $url);
983
+ }
984
+
985
+ }
986
+
987
+ if(isset($this->config['affiliate_id:' . $repository_id]) && isset($this->config['affiliate_key:' . $repository_id])){
988
+
989
+ $affiliate_id = $this->config['affiliate_id:' . $repository_id];
990
+ $affiliate_key = $this->config['affiliate_key:' . $repository_id];
991
+
992
+ }elseif(isset($args['affiliate_id:' . $repository_id]) && isset($args['affiliate_key:' . $repository_id])){
993
+
994
+ $affiliate_id = $args['affiliate_id:' . $repository_id];
995
+ $affiliate_key = $args['affiliate_key:' . $repository_id];
996
+
997
+ }elseif(defined('ICL_AFFILIATE_ID') && defined('ICL_AFFILIATE_KEY')){ //support for 1 repo
998
+
999
+ $affiliate_id = ICL_AFFILIATE_ID;
1000
+ $affiliate_key = ICL_AFFILIATE_KEY;
1001
+
1002
+ }elseif(isset($this->config['affiliate_id']) && isset($this->config['affiliate_key'])) {
1003
+ // BACKWARDS COMPATIBILITY
1004
+ $affiliate_id = $this->config['affiliate_id'];
1005
+ $affiliate_key = $this->config['affiliate_key'];
1006
+ }
1007
+
1008
+ if($affiliate_id && $affiliate_key){
1009
+ $url = add_query_arg(array('aid' => $affiliate_id, 'affiliate_key' => $affiliate_key), $url);
1010
+ }
1011
+
1012
+ if($repository_id == 'wpml'){
1013
+ $url = add_query_arg(array('using_icl' => $this->_using_icl, 'wpml_version' => $this->_wpml_version), $url);
1014
+ }
1015
+
1016
+ $url = apply_filters('wp_installer_buy_url', $url);
1017
+
1018
+ $url = esc_url($url);
1019
+
1020
+ return $url;
1021
+
1022
+ }
1023
+
1024
+ public function save_site_key($args = array()){
1025
+
1026
+ $error = '';
1027
+
1028
+ $repository_id = isset($args['repository_id']) ? $args['repository_id'] : (isset($_POST['repository_id']) ? $_POST['repository_id'] : false);
1029
+ $nonce = isset($args['nonce']) ? $args['nonce'] : (isset($_POST['nonce']) ? $_POST['nonce'] : '');
1030
+ $site_key = isset($args['site_key']) ? $args['site_key'] : $_POST['site_key_' . $repository_id];
1031
+
1032
+ $site_key = preg_replace("/[^A-Za-z0-9]/", '', $site_key);
1033
+
1034
+ if($repository_id && $nonce && wp_create_nonce('save_site_key_' . $repository_id) == $nonce){
1035
+
1036
+ try {
1037
+ $subscription_data = $this->fetch_subscription_data( $repository_id, $site_key, self::SITE_KEY_VALIDATION_SOURCE_REGISTRATION );
1038
+
1039
+ if ( $subscription_data ) {
1040
+ $this->settings['repositories'][$repository_id]['subscription'] = array('key' => $site_key, 'data' => $subscription_data);
1041
+ $this->save_settings();
1042
+ } else {
1043
+ $error = __( 'Invalid site key for the current site.', 'installer' );
1044
+ }
1045
+
1046
+ } catch (Exception $e ){
1047
+ $error = $e->getMessage();
1048
+ if( preg_match('#Could not resolve host: (.*)#', $error, $matches) || preg_match('#Couldn\'t resolve host \'(.*)\'#', $error, $matches) ){
1049
+ $error = sprintf(__("%s cannot access %s to register. Try again to see if it's a temporary problem. If the problem continues, make sure that this site has access to the Internet. You can still use the plugin without registration, but you will not receive automated updates.", 'installer'),
1050
+ '<strong><i>' . $this->get_generic_product_name($repository_id) . '</i></strong>',
1051
+ '<strong><i>' . $matches[1]. '</i></strong>'
1052
+ ) ;
1053
+ }
1054
+ }
1055
+
1056
+ }
1057
+
1058
+ $return = array('error' => $error);
1059
+
1060
+ if($this->api_debug){
1061
+ $return['debug'] = $this->api_debug;
1062
+ }
1063
+
1064
+ if(!empty($args['return'])){
1065
+ return $return;
1066
+ }else{
1067
+ echo json_encode($return);
1068
+ exit;
1069
+ }
1070
+
1071
+ }
1072
+
1073
+ public function get_site_key($repository_id){
1074
+
1075
+ if(isset($this->settings['repositories'][$repository_id]['subscription'])){
1076
+ $site_key = $this->settings['repositories'][$repository_id]['subscription']['key'];
1077
+ }else{
1078
+ $site_key = false;
1079
+ }
1080
+
1081
+ return $site_key;
1082
+ }
1083
+
1084
+ public function remove_site_key(){
1085
+ if($_POST['nonce'] == wp_create_nonce('remove_site_key_' . $_POST['repository_id'])){
1086
+ unset($this->settings['repositories'][$_POST['repository_id']]['subscription']);
1087
+ $this->save_settings();
1088
+
1089
+ $this->refresh_repositories_data();
1090
+ }
1091
+ exit;
1092
+ }
1093
+
1094
+ public function validate_repository_subscription(){
1095
+ $repository_id = isset($_GET['validate_repository']) ? $_GET['validate_repository'] : false;
1096
+ if($repository_id){
1097
+
1098
+ $site_key = $this->get_site_key($repository_id);
1099
+ if($site_key) {
1100
+ $subscription_data = $this->fetch_subscription_data( $repository_id, $site_key, self::SITE_KEY_VALIDATION_SOURCE_REVALIDATION);
1101
+ if(empty($subscription_data)){
1102
+ unset($this->settings['repositories'][$repository_id]['subscription']);
1103
+ delete_site_transient('update_plugins');
1104
+ $this->save_settings();
1105
+ }
1106
+ }
1107
+
1108
+ wp_redirect($this->menu_url() . '#repository-' . $repository_id);
1109
+ exit;
1110
+
1111
+ }
1112
+
1113
+ }
1114
+
1115
+ public function update_site_key(){
1116
+
1117
+ $error = '';
1118
+
1119
+ if($_POST['nonce'] == wp_create_nonce('update_site_key_' . $_POST['repository_id'])){
1120
+
1121
+ $repository_id = $_POST['repository_id'];
1122
+ $site_key = $this->get_site_key($_POST['repository_id']);
1123
+
1124
+ if($site_key){
1125
+ try {
1126
+ $subscription_data = $this->fetch_subscription_data( $repository_id, $site_key, self::SITE_KEY_VALIDATION_SOURCE_UPDATES_CHECK );
1127
+
1128
+ if ( $subscription_data ) {
1129
+ $this->settings['repositories'][$repository_id]['subscription'] = array('key' => $site_key, 'data' => $subscription_data);
1130
+
1131
+ //also refresh products information
1132
+ $this->refresh_repositories_data();
1133
+
1134
+ $this->save_settings();
1135
+
1136
+ } else {
1137
+ unset($this->settings['repositories'][$repository_id]['subscription']);
1138
+ $error = __( 'Invalid site key for the current site. If the error persists, try to unregister first and then register again with the same site key.', 'installer' );
1139
+ }
1140
+
1141
+
1142
+ } catch (Exception $e ){
1143
+ $error = $e->getMessage();
1144
+ if( preg_match('#Could not resolve host: (.*)#', $error, $matches) || preg_match('#Couldn\'t resolve host \'(.*)\'#', $error, $matches) ){
1145
+ $error = sprintf(__("%s cannot access %s to register. Try again to see if it's a temporary problem. If the problem continues, make sure that this site has access to the Internet. You can still use the plugin without registration, but you will not receive automated updates.", 'installer'),
1146
+ '<strong><i>' . $this->get_generic_product_name($repository_id) . '</i></strong>',
1147
+ '<strong><i>' . $matches[1]. '</i></strong>'
1148
+ ) ;
1149
+ }
1150
+ }
1151
+
1152
+ }
1153
+
1154
+ }
1155
+
1156
+ echo json_encode(array('error' => $error));
1157
+
1158
+ exit;
1159
+ }
1160
+
1161
+ public function api_debug_log($text){
1162
+
1163
+ if(defined('WPML_DEBUG_INSTALLER') && WPML_DEBUG_INSTALLER){
1164
+
1165
+ if(!is_scalar($text)){
1166
+ $text = print_r($text, 1);
1167
+ }
1168
+
1169
+ $this->api_debug .= $text . "\n";
1170
+
1171
+ }
1172
+
1173
+ }
1174
+
1175
+ public function fetch_subscription_data( $repository_id, $site_key, $source = self::SITE_KEY_VALIDATION_SOURCE_OTHER ){
1176
+
1177
+ $subscription_data = false;
1178
+
1179
+ $args['body'] = array(
1180
+ 'action' => 'site_key_validation',
1181
+ 'site_key' => $site_key,
1182
+ 'site_url' => $this->get_installer_site_url( $repository_id ),
1183
+ 'source' => $source
1184
+ );
1185
+
1186
+ if($repository_id == 'wpml'){
1187
+ $args['body']['using_icl'] = $this->_using_icl;
1188
+ $args['body']['wpml_version'] = $this->_wpml_version;
1189
+ }
1190
+
1191
+ $args['body']['installer_version'] = WP_INSTALLER_VERSION;
1192
+ $args['body']['theme'] = wp_get_theme()->get( 'Name' );
1193
+ $args['body']['site_name'] = get_bloginfo( 'name' );
1194
+
1195
+ $args['body']['versions'] = $this->get_local_product_versions( $repository_id );
1196
+
1197
+ $args['timeout'] = 45;
1198
+
1199
+ // Add extra parameters for custom Installer packages
1200
+ if( !empty($this->package_source) ){
1201
+ $extra = $this->get_extra_url_parameters();
1202
+ if( !empty($extra['repository']) && $extra['repository'] == $repository_id ) {
1203
+ unset($extra['repository']);
1204
+ foreach($extra as $key => $val){
1205
+ $args['body'][$key] = $val;
1206
+ }
1207
+ }
1208
+ }
1209
+
1210
+ $response = wp_remote_post($this->repositories[$repository_id]['api-url'], $args);
1211
+
1212
+ $this->api_debug_log("POST {$this->repositories[$repository_id]['api-url']}");
1213
+ $this->api_debug_log($args);
1214
+
1215
+ $this->log("POST {$this->repositories[$repository_id]['api-url']} - fetch subscription data");
1216
+
1217
+ if( !is_wp_error($response) ){
1218
+ $datas = wp_remote_retrieve_body($response);
1219
+
1220
+ if(is_serialized($datas)){
1221
+ $data = unserialize($datas);
1222
+ $this->api_debug_log($data);
1223
+ }else{
1224
+ $this->api_debug_log($datas);
1225
+ }
1226
+
1227
+ if(!empty($data->subscription_data)){
1228
+ $subscription_data = $data->subscription_data;
1229
+ }
1230
+
1231
+ do_action( 'installer_fetched_subscription_data', $data, $repository_id);
1232
+
1233
+ }else{
1234
+
1235
+ $this->api_debug_log($response);
1236
+ throw new Exception( $response->get_error_message() );
1237
+ }
1238
+
1239
+ return $subscription_data;
1240
+
1241
+ }
1242
+
1243
+ function get_local_product_versions( $repository_id ){
1244
+
1245
+ $versions = array();
1246
+
1247
+ foreach( $this->settings['repositories'][$repository_id]['data']['packages'] as $package_id => $package ){
1248
+
1249
+ foreach( $package['products'] as $product_id => $product ){
1250
+
1251
+ foreach( $product['plugins'] as $plugin_slug ){
1252
+
1253
+ $download = $this->settings['repositories'][$repository_id]['data']['downloads']['plugins'][$plugin_slug];
1254
+
1255
+ if( empty( $versions[$download['slug']] ) ) {
1256
+ $v = $this->get_plugin_installed_version($download['name'], $download['slug']);
1257
+ if($v){
1258
+ $versions[$download['slug']] = $v;
1259
+ }
1260
+ }
1261
+
1262
+ }
1263
+
1264
+ }
1265
+
1266
+ }
1267
+
1268
+ return $versions;
1269
+ }
1270
+
1271
+ public function get_repository_site_key($repository_id){
1272
+ $site_key = false;
1273
+
1274
+ if(!empty($this->settings['repositories'][$repository_id]['subscription']['key'])){
1275
+ $site_key = $this->settings['repositories'][$repository_id]['subscription']['key'];
1276
+ }
1277
+
1278
+ return $site_key;
1279
+ }
1280
+
1281
+ public function repository_has_valid_subscription($repository_id){
1282
+
1283
+ $valid = false;
1284
+
1285
+ if(!empty($this->settings['repositories'][$repository_id]['subscription'])){
1286
+
1287
+ $subscription = $this->settings['repositories'][$repository_id]['subscription']['data'];
1288
+ $valid = ( $subscription->status == 1 && (strtotime($subscription->expires) > time() || empty($subscription->expires)) ) || $subscription->status == 4;
1289
+
1290
+ }
1291
+ return $valid;
1292
+
1293
+ }
1294
+
1295
+ public function repository_has_subscription($repository_id){
1296
+ $key = false;
1297
+ if(!empty($this->settings['repositories'][$repository_id]['subscription']['key'])){
1298
+ $key = $this->settings['repositories'][$repository_id]['subscription']['key'];
1299
+ }
1300
+
1301
+ return $key;
1302
+
1303
+ }
1304
+
1305
+ public function repository_has_expired_subscription($repository_id){
1306
+
1307
+ return $this->repository_has_subscription($repository_id) && !$this->repository_has_valid_subscription($repository_id);
1308
+
1309
+ }
1310
+
1311
+ public function get_generic_product_name($repository_id){
1312
+
1313
+ return $this->settings['repositories'][$repository_id]['data']['product-name'];
1314
+
1315
+ }
1316
+
1317
+ public function show_subscription_renew_warning($repository_id, $subscription_id){
1318
+
1319
+ $show = false;
1320
+
1321
+ $data = $this->settings['repositories'][$repository_id]['data'];
1322
+ if(!empty($data['subscriptions_meta'])){
1323
+ if(isset($data['subscriptions_meta']['expiration'])){
1324
+
1325
+ if(!empty($data['subscriptions_meta']['expiration'][$subscription_id])){
1326
+
1327
+ $days = $data['subscriptions_meta']['expiration'][$subscription_id]['days_warning'];
1328
+ $message = $data['subscriptions_meta']['expiration'][$subscription_id]['warning_message'];
1329
+
1330
+ }else{
1331
+
1332
+ //defaults
1333
+ $days = 30;
1334
+ $message = __('You will have to renew your subscription in order to continue getting the updates and support.', 'installer');
1335
+
1336
+ }
1337
+
1338
+ if(!empty($this->settings['repositories'][$repository_id]['subscription'])){
1339
+ $subscription = $this->settings['repositories'][$repository_id]['subscription'];
1340
+
1341
+ if($subscription['data']->subscription_type == $subscription_id && !empty($subscription['data']->expires)){
1342
+
1343
+ if(strtotime($subscription['data']->expires) < strtotime(sprintf("+%d day", $days))){
1344
+
1345
+ $days_to_expiration = ceil((strtotime($subscription['data']->expires) - time()) / 86400);
1346
+
1347
+ echo '<div><p class="installer-warn-box">' .
1348
+ sprintf(_n('Your subscription expires in %d day.', 'Your subscription expires in %d days.', $days_to_expiration, 'installer'), $days_to_expiration) .
1349
+ '<br />' . $message .
1350
+ '</p></div>';
1351
+
1352
+ $show = true;
1353
+
1354
+ }
1355
+
1356
+ }
1357
+
1358
+ }
1359
+
1360
+
1361
+ }
1362
+ }
1363
+
1364
+
1365
+ return $show;
1366
+
1367
+ }
1368
+
1369
+ public function setup_plugins_renew_warnings(){
1370
+
1371
+ $plugins = get_plugins();
1372
+
1373
+ $subscriptions_with_warnings = array();
1374
+ foreach($this->settings['repositories'] as $repository_id => $repository){
1375
+
1376
+ if($this->repository_has_valid_subscription($repository_id)){
1377
+ $subscription_type = $this->settings['repositories'][$repository_id]['subscription']['data']->subscription_type;
1378
+ $expires = $this->settings['repositories'][$repository_id]['subscription']['data']->expires;
1379
+
1380
+ $never_expires = isset($this->settings['repositories'][$repository_id]['subscription'])
1381
+ && empty($this->settings['repositories'][$repository_id]['subscription']['data']->expires)
1382
+ && (
1383
+ $this->settings['repositories'][$repository_id]['subscription']['data']->status == 4 ||
1384
+ $this->settings['repositories'][$repository_id]['subscription']['data']->status == 1
1385
+ );
1386
+
1387
+ if(!$never_expires){
1388
+ if(isset($this->settings['repositories'][$repository_id]['data']['subscriptions_meta']['expiration'][$subscription_type])){
1389
+
1390
+ $days_warning = $this->settings['repositories'][$repository_id]['data']['subscriptions_meta']['expiration'][$subscription_type]['days_warning'];
1391
+ $custom_message = $this->settings['repositories'][$repository_id]['data']['subscriptions_meta']['expiration'][$subscription_type]['warning_message'];
1392
+
1393
+ }else{
1394
+ //defaults
1395
+ $days_warning = 30;
1396
+ $custom_message = __('You will have to renew your subscription in order to continue getting the updates and support.', 'installer');
1397
+ }
1398
+
1399
+ if(strtotime($expires) < strtotime(sprintf('+%d day', $days_warning)) ){
1400
+
1401
+ $days_to_expiration = ceil((strtotime($expires) - time()) / 86400);
1402
+
1403
+ $message = sprintf(_n('Your subscription expires in %d day.', 'Your subscription expires in %d days.', $days_to_expiration, 'installer'), $days_to_expiration);
1404
+ $subscriptions_with_warnings[$subscription_type] = $message . ' ' . $custom_message;
1405
+
1406
+ }
1407
+ }
1408
+
1409
+ }
1410
+
1411
+ }
1412
+
1413
+
1414
+
1415
+ foreach($plugins as $plugin_id => $plugin){
1416
+
1417
+ $slug = dirname($plugin_id);
1418
+ if(empty($slug)) continue;
1419
+
1420
+ foreach($this->settings['repositories'] as $repository_id => $repository){
1421
+
1422
+ if($this->repository_has_valid_subscription($repository_id)){
1423
+
1424
+ foreach($repository['data']['packages'] as $package){
1425
+
1426
+ foreach($package['products'] as $product){
1427
+
1428
+ foreach($product['plugins'] as $plugin_slug){
1429
+
1430
+ $download = $this->settings['repositories'][$repository_id]['data']['downloads']['plugins'][$plugin_slug];
1431
+
1432
+ if($download['slug'] == $slug || $download['name'] == $plugin['Name'] || $download['name'] == $plugin['Title']){ //match order: slug, name, title
1433
+
1434
+ if(isset($subscriptions_with_warnings[$product['subscription_type']])){
1435
+
1436
+ $this->_plugins_renew_warnings[$plugin_id] = $subscriptions_with_warnings[$product['subscription_type']];
1437
+
1438
+ }
1439
+
1440
+ }
1441
+
1442
+ }
1443
+
1444
+ }
1445
+
1446
+ }
1447
+
1448
+ }
1449
+
1450
+ }
1451
+
1452
+ }
1453
+
1454
+ }
1455
+
1456
+ public function queue_plugins_renew_warnings() {
1457
+
1458
+ if(!empty($this->_plugins_renew_warnings)){
1459
+
1460
+ foreach($this->_plugins_renew_warnings as $plugin_id => $message){
1461
+
1462
+ add_action( "after_plugin_row_" . $plugin_id, array($this, 'plugins_renew_warning'), 10, 3 );
1463
+ }
1464
+
1465
+ }
1466
+
1467
+ }
1468
+
1469
+ public function plugins_renew_warning($plugin_file, $plugin_data, $status){
1470
+
1471
+ if(empty($this->_plugins_renew_warnings[$plugin_file])) return;
1472
+
1473
+ $wp_list_table = _get_list_table('WP_Plugins_List_Table');
1474
+ ?>
1475
+
1476
+ <tr class="plugin-update-tr"><td colspan="<?php echo $wp_list_table->get_column_count(); ?>" class="plugin-update colspanchange">
1477
+ <div class="update-message">
1478
+ <?php
1479
+ echo $this->_plugins_renew_warnings[$plugin_file]. ' ';
1480
+ printf(__('%sRenew here%s.', 'installer'),
1481
+ '<a href="' . $this->menu_url() . '">', '</a>');
1482
+ ?>
1483
+ </div>
1484
+ </tr>
1485
+
1486
+ <?php
1487
+
1488
+ }
1489
+
1490
+ public function get_subscription_type_for_repository($repository_id){
1491
+
1492
+ $subscription_type = false;
1493
+
1494
+ if(!empty($this->settings['repositories'][$repository_id]['subscription'])){
1495
+ $subscription_type = $this->settings['repositories'][$repository_id]['subscription']['data']->subscription_type;
1496
+ }
1497
+
1498
+ return $subscription_type;
1499
+
1500
+ }
1501
+
1502
+ public function have_superior_subscription($subscription_type, $product){
1503
+
1504
+ $have = false;
1505
+
1506
+ if(is_array($product['upgrades'])){
1507
+ foreach($product['upgrades'] as $u){
1508
+ if($u['subscription_type'] == $subscription_type){
1509
+ $have = true;
1510
+ break;
1511
+ }
1512
+ }
1513
+ }
1514
+
1515
+ return $have;
1516
+ }
1517
+
1518
+ public function is_product_available_for_download($product_name, $repository_id){
1519
+
1520
+ $available = false;
1521
+
1522
+ $subscription_type = $this->get_subscription_type_for_repository($repository_id);
1523
+ $expired = $this->repository_has_expired_subscription($repository_id);
1524
+
1525
+ if($this->repository_has_subscription($repository_id) && !$expired){
1526
+
1527
+ $this->set_hierarchy_and_order();
1528
+
1529
+ foreach($this->settings['repositories'][$repository_id]['data']['packages'] as $package_id => $package){
1530
+
1531
+ $has_top_package = false;
1532
+
1533
+ foreach($package['products'] as $product){
1534
+
1535
+ if($subscription_type == $product['subscription_type']){
1536
+ $has_top_package = true;
1537
+ if($product['name'] == $product_name){
1538
+ return $available = true;
1539
+ }
1540
+ }
1541
+
1542
+ }
1543
+
1544
+ if(!empty($package['sub-packages'])){
1545
+ foreach($package['sub-packages'] as $sub_package){
1546
+ foreach($sub_package['products'] as $product){
1547
+ if($product['name'] == $product_name && ($subscription_type == $product['subscription_type'] || $has_top_package)){
1548
+ return $available = true;
1549
+ }
1550
+ }
1551
+ }
1552
+ }
1553
+
1554
+ }
1555
+ }
1556
+
1557
+ return $available;
1558
+
1559
+ }
1560
+
1561
+ public function get_upgrade_options($repository_id){
1562
+ $all_upgrades = array();
1563
+
1564
+ //get all products: packages and subpackages
1565
+ $all_products = array();
1566
+ foreach($this->settings['repositories'][$repository_id]['data']['packages'] as $package){
1567
+ foreach($package['products'] as $product) {
1568
+ $all_products[] = $product;
1569
+ }
1570
+ if(!empty($package['sub-packages'])){
1571
+ foreach($package['sub-packages'] as $subpackage){
1572
+ foreach($subpackage['products'] as $product) {
1573
+ $all_products[] = $product;
1574
+ }
1575
+
1576
+ }
1577
+
1578
+ }
1579
+
1580
+ }
1581
+
1582
+ foreach($all_products as $product) {
1583
+ if ($product['upgrades']) {
1584
+ foreach ($product['upgrades'] as $upgrade) {
1585
+ if ($this->repository_has_valid_subscription($repository_id) || ($this->repository_has_subscription($repository_id) && $upgrade['including_expired'])) {
1586
+ $all_upgrades[$upgrade['subscription_type']][$product['subscription_type']] = $upgrade;
1587
+ }
1588
+ }
1589
+ }
1590
+ }
1591
+
1592
+ return $all_upgrades;
1593
+
1594
+ }
1595
+
1596
+ public function append_site_key_to_download_url($url, $key, $repository_id){
1597
+
1598
+ $url_params['site_key'] = $key;
1599
+ $url_params['site_url'] = $this->get_installer_site_url( $repository_id );
1600
+
1601
+
1602
+ // Add extra parameters for custom Installer packages
1603
+ if( !empty($this->package_source) ){
1604
+ $extra = $this->get_extra_url_parameters();
1605
+ if( !empty($extra['repository']) && $extra['repository'] == $repository_id ) {
1606
+ unset($extra['repository']);
1607
+ foreach($extra as $key => $val){
1608
+ $url_params[$key] = $val;
1609
+ }
1610
+ }
1611
+ }
1612
+
1613
+ $url = add_query_arg($url_params, $url);
1614
+
1615
+ if($repository_id == 'wpml'){
1616
+ $url = add_query_arg(array('using_icl' => $this->_using_icl, 'wpml_version' => $this->_wpml_version), $url);
1617
+ }
1618
+
1619
+ return $url;
1620
+
1621
+ }
1622
+
1623
+ public function plugin_is_installed($name, $slug, $version = null){
1624
+
1625
+ $is = false;
1626
+
1627
+ $plugins = get_plugins();
1628
+
1629
+ foreach($plugins as $plugin_id => $plugin){
1630
+
1631
+ $wp_plugin_slug = dirname($plugin_id);
1632
+
1633
+ // Exception: embedded plugins
1634
+ if( $wp_plugin_slug == $slug || $plugin['Name'] == $name || $plugin['Title'] == $name || ( $wp_plugin_slug == $slug . '-embedded' || $plugin['Name'] == $name . ' Embedded' ) ){
1635
+ if($version){
1636
+ if(version_compare($plugin['Version'], $version, '>=')){
1637
+ $is = $plugin['Version'];
1638
+ }
1639
+ }else{
1640
+ $is = $plugin['Version'];
1641
+ }
1642
+
1643
+ break;
1644
+ }
1645
+
1646
+ }
1647
+
1648
+ //exception: Types name difference
1649
+ if(!$is && $name == 'Types'){
1650
+ return $this->plugin_is_installed('Types - Complete Solution for Custom Fields and Types', $slug, $version);
1651
+ }
1652
+
1653
+ return $is;
1654
+ }
1655
+
1656
+ public function plugin_is_embedded_version($name, $slug){
1657
+ $is = false;
1658
+
1659
+ $plugins = get_plugins();
1660
+
1661
+ //false if teh full version is also installed
1662
+ $is_full_installed = false;
1663
+ foreach($plugins as $plugin_id => $plugin){
1664
+
1665
+ if(($plugin['Name'] == $name && !preg_match("#-embedded$#", $slug)) ){
1666
+ $is_full_installed = true;
1667
+ break;
1668
+ }
1669
+
1670
+ }
1671
+
1672
+ if($is_full_installed){
1673
+ return false;
1674
+ }
1675
+
1676
+ foreach($plugins as $plugin_id => $plugin){
1677
+
1678
+ // TBD
1679
+ $wp_plugin_slug = dirname($plugin_id);
1680
+ if( $wp_plugin_slug == $slug . '-embedded' && $plugin['Name'] == $name . ' Embedded'){
1681
+ $is = true;
1682
+ break;
1683
+ }
1684
+
1685
+ }
1686
+
1687
+ return $is;
1688
+
1689
+ }
1690
+
1691
+ //Alias for plugin_is_installed
1692
+ public function get_plugin_installed_version($name, $slug){
1693
+
1694
+ return $this->plugin_is_installed($name, $slug);
1695
+
1696
+ }
1697
+
1698
+ public function get_plugin_repository_version($repository_id, $slug){
1699
+ $version = false;
1700
+
1701
+ if(!empty($this->settings['repositories'][$repository_id]['data']['packages'])){
1702
+ foreach($this->settings['repositories'][$repository_id]['data']['packages'] as $package){
1703
+ foreach($package['products'] as $product) {
1704
+
1705
+ foreach($product['plugins'] as $plugin_slug){
1706
+
1707
+ $download = $this->settings['repositories'][$repository_id]['data']['downloads']['plugins'][$plugin_slug];
1708
+
1709
+ if($download['slug'] == $slug){
1710
+ $version = $download['version'];
1711
+ break (3);
1712
+ }
1713
+
1714
+ }
1715
+
1716
+ }
1717
+ }
1718
+ }
1719
+
1720
+ return $version;
1721
+ }
1722
+
1723
+ public function is_uploading_allowed(){
1724
+
1725
+ //_deprecated_function ( __FUNCTION__, '1.7.3', 'Installer_Dependencies::' . __FUNCTION__ );
1726
+ return $this->dependencies->is_uploading_allowed();
1727
+
1728
+ }
1729
+
1730
+ public function download_plugin_ajax_handler(){
1731
+
1732
+ require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
1733
+ require_once $this->plugin_path() . '/includes/installer-upgrader-skins.php';
1734
+
1735
+ if(isset($_POST['data'])){
1736
+
1737
+ $data = json_decode( base64_decode( $_POST['data'] ), true );
1738
+
1739
+ }
1740
+
1741
+ $ret = false;
1742
+ $plugin_id = false;
1743
+ $message = '';
1744
+
1745
+ //validate subscription
1746
+ $site_key = $this->get_repository_site_key($data['repository_id']);
1747
+ $subscription_data = $this->fetch_subscription_data( $data['repository_id'], $site_key , self::SITE_KEY_VALIDATION_SOURCE_DOWNLOAD_REPORT);
1748
+
1749
+ if($subscription_data && !is_wp_error($subscription_data) && $this->repository_has_valid_subscription($data['repository_id'])){
1750
+
1751
+ if($data['nonce'] == wp_create_nonce('install_plugin_' . $data['url'])){
1752
+
1753
+ $upgrader_skins = new Installer_Upgrader_Skins(); //use our custom (mute) Skin
1754
+ $upgrader = new Plugin_Upgrader($upgrader_skins);
1755
+
1756
+ remove_action( 'upgrader_process_complete', array( 'Language_Pack_Upgrader', 'async_upgrade' ), 20 );
1757
+
1758
+ $plugins = get_plugins();
1759
+
1760
+ //upgrade or install?
1761
+ foreach($plugins as $id => $plugin){
1762
+ $wp_plugin_slug = dirname($id);
1763
+ $is_embedded = $this->plugin_is_embedded_version(preg_replace('/ Embedded$/', '', $plugin['Name']), preg_replace('/-embedded$/', '', $wp_plugin_slug));
1764
+
1765
+ if($wp_plugin_slug == $data['slug'] || $is_embedded && preg_replace('/-embedded$/', '', $wp_plugin_slug) == $data['slug']){
1766
+ $plugin_id = $id;
1767
+ break;
1768
+ }
1769
+ }
1770
+
1771
+ if($plugin_id && empty($is_embedded)){ //upgrade
1772
+ $response['upgrade'] = 1;
1773
+
1774
+ $plugin_is_active = is_plugin_active($plugin_id);
1775
+
1776
+ $ret = $upgrader->upgrade($plugin_id);
1777
+
1778
+ if(!$ret && !empty($upgrader->skin->installer_error)){
1779
+ if(is_wp_error($upgrader->skin->installer_error)){
1780
+ $message = $upgrader->skin->installer_error->get_error_message() .
1781
+ ' (' . $upgrader->skin->installer_error->get_error_data() . ')';
1782
+ }
1783
+ }
1784
+
1785
+ if($plugin_is_active){
1786
+ //prevent redirects
1787
+ add_filter('wp_redirect', '__return_false');
1788
+ activate_plugin($plugin_id);
1789
+ }
1790
+
1791
+ }else{ //install
1792
+
1793
+ if($is_embedded){
1794
+ delete_plugins(array($plugin_id));
1795
+ }
1796
+
1797
+ $response['install'] = 1;
1798
+ $ret = $upgrader->install($data['url']);
1799
+ if(!$ret && !empty($upgrader->skin->installer_error)){
1800
+ if(is_wp_error($upgrader->skin->installer_error)){
1801
+ $message = $upgrader->skin->installer_error->get_error_message() .
1802
+ ' (' . $upgrader->skin->installer_error->get_error_data() . ')';
1803
+ }
1804
+ }
1805
+ }
1806
+
1807
+ $plugins = get_plugins(); //read again
1808
+
1809
+ if($ret && !empty($_POST['activate'])){
1810
+ foreach($plugins as $id => $plugin){
1811
+ $wp_plugin_slug = dirname($id);
1812
+ if($wp_plugin_slug == $data['slug']){
1813
+ $plugin_version = $plugin['Version'];
1814
+ $plugin_id = $id;
1815
+ break;
1816
+ }
1817
+ }
1818
+
1819
+ }
1820
+
1821
+ }
1822
+
1823
+ } else { //subscription not valid
1824
+
1825
+ $ret = false;
1826
+ $message = __('Your subscription appears to no longer be valid. Please try to register again using a valid site key.', 'installer');
1827
+ }
1828
+
1829
+ $response['version'] = isset($plugin_version) ? $plugin_version : 0;
1830
+ $response['plugin_id'] = $plugin_id;
1831
+ $response['nonce'] = wp_create_nonce('activate_' . $plugin_id);
1832
+ $response['success'] = $ret;
1833
+ $response['message'] = $message;
1834
+
1835
+ echo json_encode( $response );
1836
+ exit;
1837
+
1838
+ }
1839
+
1840
+ public function download_plugin($slug, $url){
1841
+
1842
+ require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
1843
+ require_once $this->plugin_path() . '/includes/installer-upgrader-skins.php';
1844
+
1845
+ $upgrader_skins = new Installer_Upgrader_Skins(); //use our custom (mute) Skin
1846
+ $upgrader = new Plugin_Upgrader($upgrader_skins);
1847
+
1848
+ remove_action( 'upgrader_process_complete', array( 'Language_Pack_Upgrader', 'async_upgrade' ), 20 );
1849
+
1850
+ $plugins = get_plugins();
1851
+
1852
+ $plugin_id = false;
1853
+
1854
+ //upgrade or install?
1855
+ foreach($plugins as $id => $plugin){
1856
+ $wp_plugin_slug = dirname($id);
1857
+ if($wp_plugin_slug == $slug){
1858
+ $plugin_id = $id;
1859
+ break;
1860
+ }
1861
+ }
1862
+
1863
+ if($plugin_id){ //upgrade
1864
+
1865
+ $plugin_is_active = is_plugin_active($plugin_id);
1866
+
1867
+ $ret = $upgrader->upgrade($plugin_id);
1868
+
1869
+ if($plugin_is_active){
1870
+ activate_plugin($plugin_id);
1871
+ }
1872
+
1873
+ }else{ //install
1874
+ $ret = $upgrader->install($url);
1875
+ }
1876
+
1877
+ return $ret;
1878
+
1879
+ }
1880
+
1881
+ public function activate_plugin(){
1882
+
1883
+ $error = '';
1884
+
1885
+ if(isset($_POST['nonce']) && isset($_POST['plugin_id']) && $_POST['nonce'] == wp_create_nonce('activate_' . $_POST['plugin_id'])){
1886
+
1887
+ $plugin_id = $_POST['plugin_id'];
1888
+
1889
+ // Deactivate any embedded version
1890
+ $plugin_slug = dirname($plugin_id);
1891
+ $active_plugins = get_option('active_plugins');
1892
+ foreach($active_plugins as $plugin){
1893
+ $wp_plugin_slug = dirname($plugin);
1894
+ if($wp_plugin_slug == $plugin_slug . '-embedded'){
1895
+ deactivate_plugins(array($plugin));
1896
+ break;
1897
+ }
1898
+ }
1899
+
1900
+ //prevent redirects
1901
+ add_filter('wp_redirect', '__return_false', 10000);
1902
+
1903
+ $return = activate_plugin($plugin_id);
1904
+
1905
+ if(is_wp_error($return)){
1906
+ $error = $return->get_error_message();
1907
+ }
1908
+
1909
+ }else{
1910
+ $error = 'error';
1911
+ }
1912
+
1913
+ $ret = array('error' => $error);
1914
+
1915
+ echo json_encode($ret);
1916
+ exit;
1917
+
1918
+ }
1919
+
1920
+ public function custom_plugins_api_call($false, $action, $args){
1921
+
1922
+ if($action == 'plugin_information'){
1923
+
1924
+ $slug = $args->slug;
1925
+
1926
+ foreach($this->settings['repositories'] as $repository_id => $repository){
1927
+
1928
+ if(!$this->repository_has_valid_subscription($repository_id)){
1929
+ $site_key = false;
1930
+ }else{
1931
+ $site_key = $repository['subscription']['key'];
1932
+ }
1933
+
1934
+ foreach($repository['data']['packages'] as $package){
1935
+
1936
+ foreach($package['products'] as $product){
1937
+
1938
+ foreach($product['plugins'] as $plugin_slug){
1939
+
1940
+ $download = $this->settings['repositories'][$repository_id]['data']['downloads']['plugins'][$plugin_slug];
1941
+
1942
+ if($download['slug'] == $slug){
1943
+
1944
+ $res = new stdClass();
1945
+ $res->external = true;
1946
+
1947
+ $res->name = $download['name'];
1948
+ $res->slug = $slug;
1949
+ $res->version = $download['version'];
1950
+ $res->author = '';
1951
+ $res->author_profile = '';
1952
+ $res->last_updated = $download['date'];
1953
+ //$res->homepage = $download['url'];
1954
+
1955
+ if($site_key){
1956
+ $res->download_link = $this->append_site_key_to_download_url($download['url'], $site_key, $repository_id);
1957
+ }else{
1958
+ // if(!empty($download['free-on-wporg'])
1959
+ return false; //try somewhere else. e.g. wordpress.org
1960
+ }
1961
+
1962
+ $res->homepage = $repository['data']['url'];
1963
+ $res->sections = array('Description' => $download['description'], 'Changelog' => $download['changelog']);
1964
+
1965
+ return $res;
1966
+
1967
+ }
1968
+
1969
+ }
1970
+
1971
+ }
1972
+
1973
+ }
1974
+
1975
+ }
1976
+
1977
+ }
1978
+
1979
+ return $false;
1980
+
1981
+ }
1982
+
1983
+ public function plugins_upgrade_check($update_plugins){
1984
+
1985
+ if(!empty($this->settings['repositories'])){
1986
+
1987
+ $plugins = get_plugins();
1988
+
1989
+ foreach($plugins as $plugin_id => $plugin){
1990
+
1991
+ $slug = dirname($plugin_id);
1992
+ if(empty($slug)) continue;
1993
+
1994
+ $version = $plugin['Version'];
1995
+ $name = $plugin['Name'];
1996
+
1997
+ foreach($this->settings['repositories'] as $repository_id => $repository){
1998
+
1999
+
2000
+ if(!$this->repository_has_valid_subscription($repository_id)){
2001
+ $site_key = false;
2002
+ }else{
2003
+ $site_key = $repository['subscription']['key'];
2004
+ //$subscription_type = $this->get_subscription_type_for_repository($repository_id);
2005
+ }
2006
+
2007
+ foreach($repository['data']['packages'] as $package){
2008
+
2009
+ foreach($package['products'] as $product){
2010
+
2011
+ foreach($product['plugins'] as $plugin_slug){
2012
+
2013
+ $download = $this->settings['repositories'][$repository_id]['data']['downloads']['plugins'][$plugin_slug];
2014
+
2015
+ if(!empty($download['free-on-wporg'])) {
2016
+ continue;
2017
+ }
2018
+
2019
+ if(empty($update_plugins->response[$plugin_id]) && ($download['slug'] == $slug || $download['name'] == $name ) && version_compare($download['version'], $version, '>')){
2020
+
2021
+ $response = new stdClass();
2022
+ $response->id = 0;
2023
+ $response->slug = $slug;
2024
+ $response->plugin = $plugin_id;
2025
+ $response->new_version = $download['version'];
2026
+ $response->upgrade_notice = '';
2027
+ $response->url = $download['url'];
2028
+ if($site_key){
2029
+ $response->package = $this->append_site_key_to_download_url($download['url'], $site_key, $repository_id);
2030
+ }
2031
+ $update_plugins->checked[$plugin_id] = $version;
2032
+ $update_plugins->response[$plugin_id] = $response;
2033
+
2034
+ }
2035
+
2036
+ }
2037
+
2038
+ }
2039
+
2040
+ }
2041
+
2042
+ }
2043
+
2044
+ }
2045
+
2046
+ }
2047
+
2048
+ return $update_plugins;
2049
+
2050
+ }
2051
+
2052
+ public function setup_plugins_page_notices(){
2053
+
2054
+ $plugins = get_plugins();
2055
+
2056
+ foreach($plugins as $plugin_id => $plugin){
2057
+
2058
+ $slug = dirname($plugin_id);
2059
+ if(empty($slug)) continue;
2060
+
2061
+ $name = $plugin['Name'];
2062
+
2063
+ foreach($this->settings['repositories'] as $repository_id => $repository){
2064
+
2065
+ if(!$this->repository_has_valid_subscription($repository_id)){
2066
+ $site_key = false;
2067
+ }else{
2068
+ $site_key = $repository['subscription']['key'];
2069
+ }
2070
+
2071
+ foreach($repository['data']['packages'] as $package){
2072
+
2073
+ foreach($package['products'] as $product){
2074
+
2075
+ foreach($product['plugins'] as $plugin_slug){
2076
+
2077
+ $download = $this->settings['repositories'][$repository_id]['data']['downloads']['plugins'][$plugin_slug];
2078
+
2079
+ if(!empty($download['free-on-wporg'])) {
2080
+ continue;
2081
+ }
2082
+
2083
+ if( $download['slug'] == $slug || $download['name'] == $name ){
2084
+
2085
+ if( !$site_key || !$this->plugin_is_registered($repository_id, $download['slug']) ){
2086
+ add_action( "after_plugin_row_" . $plugin_id, array($this, 'show_purchase_notice_under_plugin'), 10, 3 );
2087
+ }
2088
+
2089
+ }
2090
+
2091
+ }
2092
+
2093
+ }
2094
+
2095
+ }
2096
+
2097
+ }
2098
+
2099
+ }
2100
+
2101
+ }
2102
+
2103
+ public function show_purchase_notice_under_plugin($plugin_file, $plugin_data, $status){
2104
+
2105
+ $wp_list_table = _get_list_table('WP_Plugins_List_Table');
2106
+ ?>
2107
+
2108
+ <tr class="plugin-update-tr"><td colspan="<?php echo $wp_list_table->get_column_count(); ?>" class="plugin-update colspanchange">
2109
+ <div class="update-message installer-q-icon">
2110
+ <?php
2111
+ printf(__('You need to have a valid subscription in order to get upgrades or support for this plugin. %sPurchase a subscription or enter an existing site key%s.', 'installer'),
2112
+ '<a href="' . $this->menu_url() . '">', '</a>');
2113
+ ?>
2114
+ </div>
2115
+ </tr>
2116
+
2117
+ <?php
2118
+
2119
+ }
2120
+
2121
+ public function localize_strings(){
2122
+
2123
+ if(!empty($this->settings['repositories'])){
2124
+ foreach($this->settings['repositories'] as $repository_id => $repository){
2125
+ //set name as call2action when don't have any
2126
+ //products
2127
+ foreach($repository['data']['packages'] as $package_id => $package){
2128
+ foreach($package['products'] as $product_id => $product){
2129
+ if(empty($product['call2action'])){
2130
+ $this->settings['repositories'][$repository_id]['data']['packages'][$package_id]['products'][$product_id]['call2action'] = $product['name'];
2131
+ }
2132
+
2133
+ foreach($product['upgrades'] as $idx => $upg){
2134
+ if(empty($upg['call2action'])){
2135
+ $this->settings['repositories'][$repository_id]['data']['packages'][$package_id]['products'][$product_id]['upgrades'][$idx]['call2action'] = $upg['name'];
2136
+ }
2137
+ }
2138
+
2139
+ foreach($product['renewals'] as $idx => $rnw){
2140
+ if(empty($rnw['call2action'])){
2141
+ $this->settings['repositories'][$repository_id]['data']['packages'][$package_id]['products'][$product_id]['renewals'][$idx]['call2action'] = $rnw['name'];
2142
+ }
2143
+
2144
+ }
2145
+
2146
+ }
2147
+ }
2148
+ }
2149
+ }
2150
+
2151
+ global $sitepress;
2152
+ if(is_null($sitepress)){
2153
+ return;
2154
+ }
2155
+
2156
+ // default strings are always in English
2157
+ $user_admin_language = $sitepress->get_admin_language();
2158
+
2159
+ if($user_admin_language != 'en'){
2160
+ foreach($this->settings['repositories'] as $repository_id => $repository){
2161
+
2162
+ $localization = $repository['data']['localization'];
2163
+
2164
+ //packages
2165
+ foreach($repository['data']['packages'] as $package_id => $package){
2166
+
2167
+ if( isset($localization['packages'][$package_id]['name'][$user_admin_language]) ){
2168
+ $this->settings['repositories'][$repository_id]['data']['packages'][$package_id]['name'] = $localization['packages'][$package_id]['name'][$user_admin_language];
2169
+ }
2170
+ if( isset($localization['packages'][$package_id]['description'][$user_admin_language]) ){
2171
+ $this->settings['repositories'][$repository_id]['data']['packages'][$package_id]['description'] = $localization['packages'][$package_id]['description'][$user_admin_language];
2172
+ }
2173
+
2174
+ }
2175
+
2176
+ //products
2177
+ foreach($repository['data']['packages'] as $package_id => $package){
2178
+ foreach($package['products'] as $product_id => $product){
2179
+
2180
+ if( isset($localization['products'][$product_id]['name'][$user_admin_language]) ){
2181
+ $this->settings['repositories'][$repository_id]['data']['packages'][$package_id]['products'][$product_id]['name']
2182
+ = $localization['products'][$product_id]['name'][$user_admin_language];
2183
+ }
2184
+ if( isset($localization['products'][$product_id]['description'][$user_admin_language]) ){
2185
+ $this->settings['repositories'][$repository_id]['data']['packages'][$package_id]['products'][$product_id]['description']
2186
+ = $localization['products'][$product_id]['description'][$user_admin_language];
2187
+ }
2188
+ if( isset($localization['products'][$product_id]['call2action'][$user_admin_language]) ){
2189
+ $this->settings['repositories'][$repository_id]['data']['packages'][$package_id]['products'][$product_id]['name']
2190
+ = $localization['products'][$product_id]['call2action'][$user_admin_language];
2191
+ }
2192
+
2193
+
2194
+ }
2195
+ }
2196
+
2197
+ //subscription info
2198
+ if(isset($repository['data']['subscriptions_meta']['expiration'])){
2199
+ foreach($repository['data']['subscriptions_meta']['expiration'] as $subscription_id => $note){
2200
+ if(isset($localization['subscriptions-notes'][$subscription_id]['expiration-warning'][$user_admin_language])){
2201
+ $this->settings['repositories'][$repository_id]['data']['subscriptions_meta']['expiration'][$subscription_id]['warning_message']
2202
+ = $localization['subscriptions-notes'][$subscription_id]['expiration-warning'][$user_admin_language];
2203
+ }
2204
+ }
2205
+ }
2206
+
2207
+ }
2208
+ }
2209
+
2210
+ }
2211
+
2212
+ public function get_matching_cp($repository, $args = array()){
2213
+ $match = false;
2214
+
2215
+
2216
+ $cp_name = $cp_author = false;
2217
+
2218
+ if(isset($this->config['src_name']) && isset($this->config['src_author'])){
2219
+
2220
+ $cp_name = $this->config['src_name'];
2221
+ $cp_author = $this->config['src_author'];
2222
+
2223
+ }elseif(isset($args['src_name']) && isset($args['src_author'])){
2224
+
2225
+ $cp_name = $args['src_name'];
2226
+ $cp_author = $args['src_author'];
2227
+
2228
+ }
2229
+
2230
+ if(isset($repository['data']['marketing_cp'])){
2231
+
2232
+ foreach($repository['data']['marketing_cp'] as $cp){
2233
+
2234
+ if(!empty($cp['exp']) && time() > $cp['exp']){
2235
+ continue;
2236
+ }
2237
+
2238
+ //Use theme_name for plugins too
2239
+ if(!empty($cp['theme_name'])){
2240
+ if($cp['author_name'] == $cp_author && $cp['theme_name'] == $cp_name){
2241
+ $match = $cp;
2242
+ continue;
2243
+ }
2244
+ }else{
2245
+ if($cp['author_name'] == $cp_author){
2246
+ $match = $cp;
2247
+ continue;
2248
+ }
2249
+ }
2250
+
2251
+ }
2252
+
2253
+ }
2254
+
2255
+ return $match;
2256
+ }
2257
+
2258
+ public function set_filtered_prices($args = array()){
2259
+
2260
+ foreach($this->settings['repositories'] as $repository_id => $repository){
2261
+
2262
+ $match = $this->get_matching_cp($repository, $args);
2263
+
2264
+ if(empty($match)) continue;
2265
+
2266
+ foreach($repository['data']['packages'] as $package_id => $package){
2267
+
2268
+ foreach($package['products'] as $product_id => $product){
2269
+
2270
+ if($match['dtp'] == '%'){
2271
+ $fprice = round( $product['price'] * (1 - $match['amt']/100), 2 );
2272
+ $fprice = $fprice != round($fprice) ? sprintf('%.2f', $fprice) : round($fprice, 0);
2273
+ }elseif($match['dtp'] == '-'){
2274
+ $fprice = $product['price'] - $match['amt'];
2275
+ }else{
2276
+ $fprice = $product['price'];
2277
+ }
2278
+
2279
+ if($fprice){
2280
+ $this->settings['repositories'][$repository_id]['data']['packages'][$package_id]['products'][$product_id]['price_disc'] = $fprice;
2281
+
2282
+ $url_glue = false !== strpos($this->settings['repositories'][$repository_id]['data']['packages'][$package_id]['products'][$product_id]['url'], '?') ? '&' : '?';
2283
+ $cpndata = base64_encode(json_encode(array('theme_author' => $match['author_name'], 'theme_name' => $match['theme_name'], 'vlc' => $match['vlc'])));
2284
+ $this->settings['repositories'][$repository_id]['data']['packages'][$package_id]['products'][$product_id]['url'] .= $url_glue . 'cpn=' . $cpndata;
2285
+
2286
+ foreach($product['upgrades'] as $upgrade_id => $upgrade){
2287
+
2288
+ $fprice = false;
2289
+ if($match['dtp'] == '%'){
2290
+ $fprice = round( $upgrade['price'] * (1 - $match['amt']/100), 2 );
2291
+ $fprice = $fprice != round($fprice) ? sprintf('%.2f', $fprice) : round($fprice, 0);
2292
+ }elseif($match['dtp'] == '-'){
2293
+ $fprice = $upgrade['price'] - $match['amt'];
2294
+ }
2295
+ if($fprice){
2296
+ $this->settings['repositories'][$repository_id]['data']['packages'][$package_id]['products'][$product_id]['upgrades'][$upgrade_id]['price_disc'] = $fprice;
2297
+ $this->settings['repositories'][$repository_id]['data']['packages'][$package_id]['products'][$product_id]['upgrades'][$upgrade_id]['url'] .= $url_glue . 'cpn=' . $cpndata;
2298
+ }
2299
+
2300
+
2301
+ }
2302
+
2303
+ }
2304
+
2305
+ }
2306
+
2307
+ }
2308
+
2309
+ }
2310
+
2311
+ }
2312
+
2313
+ public function set_hierarchy_and_order(){
2314
+
2315
+ //2 levels
2316
+ if(!empty($this->settings['repositories'])) {
2317
+ foreach ($this->settings['repositories'] as $repository_id => $repository) {
2318
+
2319
+ if( empty( $repository['data']['packages'] ) ) continue;
2320
+
2321
+ $all_packages = $repository['data']['packages'];
2322
+ $ordered_packages = array();
2323
+
2324
+ //backward compatibility - 'order'
2325
+ foreach($all_packages as $k => $v){
2326
+ if(!isset($v['order'])){
2327
+ $all_packages[$k]['order'] = 0;
2328
+ }
2329
+ }
2330
+
2331
+ //select parents
2332
+ foreach ($all_packages as $package_id => $package) {
2333
+ if(empty($package['parent'])){
2334
+ $ordered_packages[$package_id] = $package;
2335
+ }
2336
+ }
2337
+
2338
+ //add sub-packages
2339
+ foreach($all_packages as $package_id => $package){
2340
+ if(!empty($package['parent'])) {
2341
+ if(isset($ordered_packages[$package['parent']])){
2342
+ $ordered_packages[$package['parent']]['sub-packages'][$package_id] = $package;
2343
+ }
2344
+ }
2345
+ }
2346
+
2347
+ // order parents
2348
+ usort($ordered_packages, array($this, '_order_packages_callback'));
2349
+ //order sub-packages
2350
+ foreach($ordered_packages as $package_id => $package){
2351
+ if(!empty($package['sub-packages'])) {
2352
+ usort($ordered_packages[$package_id]['sub-packages'], create_function('$a, $b', 'return $a[\'order\'] > $b[\'order\'];'));
2353
+ }
2354
+ }
2355
+
2356
+ $this->settings['repositories'][$repository_id]['data']['packages'] = $ordered_packages;
2357
+
2358
+
2359
+ }
2360
+ }
2361
+
2362
+
2363
+ }
2364
+
2365
+ public function _order_packages_callback($a, $b){
2366
+ return $a['order'] > $b['order'];
2367
+ }
2368
+
2369
+ public function get_support_tag_by_name( $name, $repository ){
2370
+
2371
+ if( is_array($this->settings['repositories'][$repository]['data']['support_tags'] )){
2372
+ foreach( $this->settings['repositories'][$repository]['data']['support_tags'] as $support_tag){
2373
+ if( $support_tag['name'] == $name ){
2374
+ return $support_tag['url'];
2375
+ }
2376
+ }
2377
+ }
2378
+
2379
+ return false;
2380
+ }
2381
+
2382
+ public function plugin_upgrade_custom_errors(){
2383
+
2384
+ if ( isset($_REQUEST['action']) ) {
2385
+
2386
+ $action = isset($_REQUEST['action']) ? $_REQUEST['action'] : '';
2387
+
2388
+ //bulk mode
2389
+ if('update-selected' == $action) {
2390
+
2391
+ global $plugins;
2392
+
2393
+ if(isset($plugins) && is_array($plugins)) {
2394
+
2395
+ foreach ($plugins as $k => $plugin) {
2396
+ $plugin_repository = false;
2397
+
2398
+ $wp_plugin_slug = dirname($plugin);
2399
+
2400
+ foreach ($this->settings['repositories'] as $repository_id => $repository) {
2401
+
2402
+ foreach ($repository['data']['packages'] as $package) {
2403
+
2404
+ foreach ($package['products'] as $product) {
2405
+
2406
+ foreach ($product['plugins'] as $plugin_slug) {
2407
+
2408
+ $download = $this->settings['repositories'][$repository_id]['data']['downloads']['plugins'][$plugin_slug];
2409
+
2410
+ if ($download['slug'] == $wp_plugin_slug) {
2411
+ $plugin_repository = $repository_id;
2412
+ $product_name = $repository['data']['product-name'];
2413
+ $plugin_name = $download['name'];
2414
+ $free_on_wporg = !empty($download['free-on-wporg']);
2415
+ break;
2416
+ }
2417
+
2418
+ }
2419
+
2420
+ }
2421
+
2422
+ }
2423
+
2424
+ }
2425
+
2426
+ if ($plugin_repository) {
2427
+
2428
+ //validate subscription
2429
+ static $sub_cache = array();
2430
+
2431
+ if(empty($sub_cache[$plugin_repository])){
2432
+ $site_key = $this->get_repository_site_key($plugin_repository);
2433
+ if ($site_key) {
2434
+ $subscription_data = $this->fetch_subscription_data( $plugin_repository, $site_key, self::SITE_KEY_VALIDATION_SOURCE_REVALIDATION );
2435
+ }
2436
+
2437
+ $sub_cache[$plugin_repository]['site_key'] = $site_key;
2438
+ $sub_cache[$plugin_repository]['subscription_data'] = isset($subscription_data) ? $subscription_data : false;
2439
+ }else{
2440
+
2441
+ $site_key = $sub_cache[$plugin_repository]['site_key'];
2442
+ $subscription_data = $sub_cache[$plugin_repository]['subscription_data'];
2443
+
2444
+ }
2445
+
2446
+ if(!$site_key && !empty($free_on_wporg)){ // allow the download from wp.org
2447
+ continue;
2448
+ }
2449
+
2450
+ if (empty($site_key) || empty($subscription_data)) {
2451
+
2452
+
2453
+ $error_message = sprintf(__("%s cannot update because your site's registration is not valid. Please %sregister %s%s again for this site first.", 'installer'),
2454
+ '<strong>' . $plugin_name . '</strong>', '<a target="_top" href="' . $this->menu_url() . '&validate_repository=' . $plugin_repository .
2455
+ '#repository-' . $plugin_repository . '">', $product_name, '</a>');
2456
+
2457
+ echo '<div class="updated error"><p>' . $error_message . '</p></div>';
2458
+
2459
+ unset($plugins[$k]);
2460
+
2461
+
2462
+ }
2463
+
2464
+ }
2465
+
2466
+ }
2467
+
2468
+ }
2469
+
2470
+ }
2471
+
2472
+
2473
+ if( 'upgrade-plugin' == $action || 'update-plugin' == $action ) {
2474
+
2475
+ $plugin = isset($_REQUEST['plugin']) ? trim($_REQUEST['plugin']) : '';
2476
+
2477
+ $wp_plugin_slug = dirname($plugin);
2478
+
2479
+ $plugin_repository = false;
2480
+
2481
+ foreach($this->settings['repositories'] as $repository_id => $repository){
2482
+
2483
+ foreach($repository['data']['packages'] as $package){
2484
+
2485
+ foreach($package['products'] as $product){
2486
+
2487
+ foreach($product['plugins'] as $plugin_slug){
2488
+ $download = $this->settings['repositories'][$repository_id]['data']['downloads']['plugins'][$plugin_slug];
2489
+
2490
+ //match by folder, will change to match by name and folder
2491
+ if($download['slug'] == $wp_plugin_slug) {
2492
+ $plugin_repository = $repository_id;
2493
+ $product_name = $repository['data']['product-name'];
2494
+ $plugin_name = $download['name'];
2495
+ $free_on_wporg = !empty($download['free-on-wporg']);
2496
+ break;
2497
+ }
2498
+
2499
+ }
2500
+
2501
+ }
2502
+
2503
+ }
2504
+
2505
+ }
2506
+
2507
+ if($plugin_repository) {
2508
+
2509
+ //validate subscription
2510
+ $site_key = $this->get_repository_site_key($plugin_repository);
2511
+ if ($site_key) {
2512
+ $subscription_data = $this->fetch_subscription_data( $plugin_repository, $site_key, self::SITE_KEY_VALIDATION_SOURCE_REVALIDATION );
2513
+ }
2514
+
2515
+ if ( (empty($site_key) || empty($subscription_data)) && empty($free_on_wporg)) {
2516
+
2517
+ $error_message = sprintf(__("%s cannot update because your site's registration is not valid. Please %sregister %s%s again for this site first.", 'installer'),
2518
+ '<strong>'.$plugin_name . '</strong>', '<a href="' . $this->menu_url() . '&validate_repository=' . $plugin_repository .
2519
+ '#repository-' . $plugin_repository . '">', $product_name, '</a>');
2520
+
2521
+ if(defined('DOING_AJAX')){ //WP 4.2
2522
+
2523
+ $status = array(
2524
+ 'update' => 'plugin',
2525
+ 'plugin' => $plugin,
2526
+ 'slug' => sanitize_key( $_POST['slug'] ),
2527
+ 'oldVersion' => '',
2528
+ 'newVersion' => '',
2529
+ );
2530
+
2531
+ $status['errorCode'] = 'wp_installer_invalid_subscription';
2532
+ $status['error'] = $error_message;
2533
+
2534
+ wp_send_json_error( $status );
2535
+
2536
+ } else { // WP 4.1.1
2537
+ echo '<div class="updated error"><p>' . $error_message . '</p></div>';
2538
+
2539
+
2540
+ echo '<div class="wrap">';
2541
+ echo '<h2>' . __('Update Plugin') . '</h2>';
2542
+ echo '<a href="' . admin_url('plugins.php') . '">' . __('Return to the plugins page') . '</a>';
2543
+ echo '</div>';
2544
+ require_once(ABSPATH . 'wp-admin/admin-footer.php');
2545
+ exit;
2546
+
2547
+ }
2548
+
2549
+ }
2550
+
2551
+
2552
+ }
2553
+
2554
+ }
2555
+ }
2556
+
2557
+ }
2558
+
2559
+ }
embedded/installer/includes/translation-service-info.class.php CHANGED
@@ -1,35 +1,35 @@
1
- <?php
2
-
3
- class TranslationServiceInfo{
4
-
5
- function __construct(){
6
-
7
- add_action('installer_fetched_subscription_data',array($this, 'save_info'), 10, 2);
8
-
9
- }
10
-
11
- function save_info($data, $repository_id) {
12
-
13
- $ts_info = isset( WP_Installer()->settings['repositories'][$repository_id]['ts_info'] ) ?
14
- WP_Installer()->settings['repositories'][$repository_id]['ts_info'] : false;
15
-
16
- $save_settings = false;
17
- if(isset($data->ts_info['preferred']) && empty($ts_info['preferred'])){
18
- WP_Installer()->settings['repositories'][$repository_id]['ts_info']['preferred'] = $data->ts_info['preferred'];
19
- $save_settings = true;
20
- }
21
-
22
- if(isset($data->ts_info['referal']) && empty($ts_info['referal'])){
23
- WP_Installer()->settings['repositories'][$repository_id]['ts_info']['referal'] = $data->ts_info['referal'];
24
- $save_settings = true;
25
- }
26
-
27
- if($save_settings){
28
- WP_Installer()->save_settings();
29
- }
30
-
31
- }
32
-
33
- }
34
-
35
  new TranslationServiceInfo();
1
+ <?php
2
+
3
+ class TranslationServiceInfo{
4
+
5
+ function __construct(){
6
+
7
+ add_action('installer_fetched_subscription_data',array($this, 'save_info'), 10, 2);
8
+
9
+ }
10
+
11
+ function save_info($data, $repository_id) {
12
+
13
+ $ts_info = isset( WP_Installer()->settings['repositories'][$repository_id]['ts_info'] ) ?
14
+ WP_Installer()->settings['repositories'][$repository_id]['ts_info'] : false;
15
+
16
+ $save_settings = false;
17
+ if(isset($data->ts_info['preferred']) && empty($ts_info['preferred'])){
18
+ WP_Installer()->settings['repositories'][$repository_id]['ts_info']['preferred'] = $data->ts_info['preferred'];
19
+ $save_settings = true;
20
+ }
21
+
22
+ if(isset($data->ts_info['referal']) && empty($ts_info['referal'])){
23
+ WP_Installer()->settings['repositories'][$repository_id]['ts_info']['referal'] = $data->ts_info['referal'];
24
+ $save_settings = true;
25
+ }
26
+
27
+ if($save_settings){
28
+ WP_Installer()->save_settings();
29
+ }
30
+
31
+ }
32
+
33
+ }
34
+
35
  new TranslationServiceInfo();
embedded/installer/installer.php CHANGED
@@ -1,22 +1,22 @@
1
- <?php
2
- define('WP_INSTALLER_VERSION', '1.7.8');
3
-
4
- include_once dirname(__FILE__) . '/includes/installer.class.php';
5
-
6
- function WP_Installer() {
7
- return WP_Installer::instance();
8
- }
9
-
10
-
11
- WP_Installer();
12
-
13
- include_once WP_Installer()->plugin_path() . '/includes/installer-api.php';
14
- include_once WP_Installer()->plugin_path() . '/includes/translation-service-info.class.php';
15
- include_once WP_Installer()->plugin_path() . '/includes/class-installer-dependencies.php';
16
-
17
- // Ext function
18
- function WP_Installer_Show_Products($args = array()){
19
-
20
- WP_Installer()->show_products($args);
21
-
22
  }
1
+ <?php
2
+ define('WP_INSTALLER_VERSION', '1.7.8');
3
+
4
+ include_once dirname(__FILE__) . '/includes/installer.class.php';
5
+
6
+ function WP_Installer() {
7
+ return WP_Installer::instance();
8
+ }
9
+
10
+
11
+ WP_Installer();
12
+
13
+ include_once WP_Installer()->plugin_path() . '/includes/installer-api.php';
14
+ include_once WP_Installer()->plugin_path() . '/includes/translation-service-info.class.php';
15
+ include_once WP_Installer()->plugin_path() . '/includes/class-installer-dependencies.php';
16
+
17
+ // Ext function
18
+ function WP_Installer_Show_Products($args = array()){
19
+
20
+ WP_Installer()->show_products($args);
21
+
22
  }
embedded/installer/loader.php CHANGED
@@ -1,151 +1,151 @@
1
- <?php
2
-
3
- if ( ! defined( 'ABSPATH' ) ) {
4
- exit; // Exit if accessed directly
5
- }
6
-
7
- //It should only be loaded on the admin side
8
- if( !is_admin() ){
9
- if(!function_exists('WP_Installer_Setup')){ function WP_Installer_Setup(){} }
10
- $wp_installer_instance = null;
11
- return;
12
- }
13
-
14
-
15
- $wp_installer_instance = dirname(__FILE__) . '/installer.php';
16
-
17
-
18
- // Global stack of instances
19
- global $wp_installer_instances;
20
- $wp_installer_instances[$wp_installer_instance] = array(
21
- 'bootfile' => $wp_installer_instance,
22
- 'version' => '1.7.8'
23
- );
24
-
25
-
26
- /* EXCEPTIONS ********************************************************************************************/
27
- // Exception: When WPML prior 3.2 is used, that instance must be used regardless of another newer instance
28
- // Case 1: WPML loaded before Types - eliminate other instances
29
- if( defined('ICL_SITEPRESS_VERSION') && version_compare(ICL_SITEPRESS_VERSION, '3.2', '<') ) {
30
- foreach($wp_installer_instances as $key => $instance) {
31
- if(isset($instance['args']['site_key_nags'])){
32
- $wp_installer_instances[$key]['version'] = '9.9';
33
- }else{
34
- $wp_installer_instances[$key]['version'] = '0';
35
- }
36
- }
37
- }
38
-
39
- // Exception: Types 1.8.9 (Installer 1.7.0) with WPML before 3.3 (Installer before 1.7.0)
40
- // New products file http://d2salfytceyqoe.cloudfront.net/wpml-products33.json overrides the old one
41
- // while the WPML's instance is being used
42
- // => Force using the new Installer Instance
43
- if( defined('ICL_SITEPRESS_VERSION') && version_compare(ICL_SITEPRESS_VERSION, '3.3.1', '<') ) {
44
-
45
- // if Installer 1.7.0+ is present, unregister Installer from old WPML
46
- // Force Installer 1.7.0+ being used over older Installer versions
47
- $installer_171_plus_on = false;
48
- foreach($wp_installer_instances as $key => $instance) {
49
- if( version_compare( $instance['version'], '1.7.1', '>=' ) ){
50
- $installer_171_plus_on = true;
51
- break;
52
- }
53
- }
54
-
55
- if( $installer_171_plus_on ){
56
- foreach($wp_installer_instances as $key => $instance) {
57
-
58
- if( version_compare( $instance['version'], '1.7.0', '<' ) ){
59
- unset( $wp_installer_instances[$key] );
60
- }
61
-
62
- }
63
- }
64
-
65
- }
66
-
67
- // Exception: When using the embedded plugins module allow the set up to run completely with the
68
- // Installer instance that triggers it
69
- if( isset( $_POST['installer_instance'] ) && isset( $wp_installer_instances[$_POST['installer_instance']] ) ){
70
- $wp_installer_instances[$_POST['installer_instance']]['version'] = '999';
71
- }
72
- /* EXCEPTIONS ********************************************************************************************/
73
-
74
-
75
- // Only one of these in the end
76
- remove_action('after_setup_theme', 'wpml_installer_instance_delegator', 1);
77
- add_action('after_setup_theme', 'wpml_installer_instance_delegator', 1);
78
-
79
- // When all plugins load pick the newest version
80
- if(!function_exists('wpml_installer_instance_delegator')){
81
- function wpml_installer_instance_delegator(){
82
- global $wp_installer_instances;
83
-
84
- // version based election
85
- foreach($wp_installer_instances as $instance){
86
-
87
- if(!isset($delegate)){
88
- $delegate = $instance;
89
- continue;
90
- }
91
-
92
- if(version_compare($instance['version'], $delegate['version'], '>')){
93
- $delegate = $instance;
94
- }
95
- }
96
-
97
- // priority based election
98
- $highest_priority = null;
99
- foreach($wp_installer_instances as $instance) {
100
- if(isset($instance['args']['high_priority'])){
101
- if(is_null($highest_priority) || $instance['args']['high_priority'] <= $highest_priority){
102
- $highest_priority = $instance['args']['high_priority'];
103
- $delegate = $instance;
104
- }
105
- }
106
- }
107
-
108
- // Exception: When WPML prior 3.2 is used, that instance must be used regardless of another newer instance
109
- // Case 2: WPML loaded after Types
110
- if( defined('ICL_SITEPRESS_VERSION') && version_compare(ICL_SITEPRESS_VERSION, '3.2', '<') ) {
111
- foreach($wp_installer_instances as $key => $instance) {
112
- if(isset($instance['args']['site_key_nags'])){
113
- $delegate = $instance;
114
- $wp_installer_instances = array($key => $delegate); //Eliminate other instances
115
- break;
116
- }
117
- }
118
- }
119
-
120
- include_once $delegate['bootfile'];
121
-
122
- // set configuration
123
- if(strpos(realpath($delegate['bootfile']), realpath(TEMPLATEPATH)) === 0){
124
- $delegate['args']['in_theme_folder'] = dirname(ltrim(str_replace(realpath(TEMPLATEPATH), '', realpath($delegate['bootfile'])), '\\/'));
125
- }
126
- if(isset($delegate['args']) && is_array($delegate['args'])){
127
- foreach($delegate['args'] as $key => $value){
128
- WP_Installer()->set_config($key, $value);
129
- }
130
- }
131
-
132
- }
133
- }
134
-
135
- if(!function_exists('WP_Installer_Setup')){
136
-
137
- // $args:
138
- // plugins_install_tab = true|false (default: true)
139
- // repositories_include = array() (default: all)
140
- // repositories_exclude = array() (default: none)
141
- // template = name (default: default)
142
- //
143
- // Ext function
144
- function WP_Installer_Setup($wp_installer_instance, $args = array()){
145
- global $wp_installer_instances;
146
-
147
- $wp_installer_instances[$wp_installer_instance]['args'] = $args;
148
-
149
- }
150
-
151
  }
1
+ <?php
2
+
3
+ if ( ! defined( 'ABSPATH' ) ) {
4
+ exit; // Exit if accessed directly
5
+ }
6
+
7
+ //It should only be loaded on the admin side
8
+ if( !is_admin() ){
9
+ if(!function_exists('WP_Installer_Setup')){ function WP_Installer_Setup(){} }
10
+ $wp_installer_instance = null;
11
+ return;
12
+ }
13
+
14
+
15
+ $wp_installer_instance = dirname(__FILE__) . '/installer.php';
16
+
17
+
18
+ // Global stack of instances
19
+ global $wp_installer_instances;
20
+ $wp_installer_instances[$wp_installer_instance] = array(
21
+ 'bootfile' => $wp_installer_instance,
22
+ 'version' => '1.7.8'
23
+ );
24
+
25
+
26
+ /* EXCEPTIONS ********************************************************************************************/
27
+ // Exception: When WPML prior 3.2 is used, that instance must be used regardless of another newer instance
28
+ // Case 1: WPML loaded before Types - eliminate other instances
29
+ if( defined('ICL_SITEPRESS_VERSION') && version_compare(ICL_SITEPRESS_VERSION, '3.2', '<') ) {
30
+ foreach($wp_installer_instances as $key => $instance) {
31
+ if(isset($instance['args']['site_key_nags'])){
32
+ $wp_installer_instances[$key]['version'] = '9.9';
33
+ }else{
34
+ $wp_installer_instances[$key]['version'] = '0';
35
+ }
36
+ }
37
+ }
38
+
39
+ // Exception: Types 1.8.9 (Installer 1.7.0) with WPML before 3.3 (Installer before 1.7.0)
40
+ // New products file http://d2salfytceyqoe.cloudfront.net/wpml-products33.json overrides the old one
41
+ // while the WPML's instance is being used
42
+ // => Force using the new Installer Instance
43
+ if( defined('ICL_SITEPRESS_VERSION') && version_compare(ICL_SITEPRESS_VERSION, '3.3.1', '<') ) {
44
+
45
+ // if Installer 1.7.0+ is present, unregister Installer from old WPML
46
+ // Force Installer 1.7.0+ being used over older Installer versions
47
+ $installer_171_plus_on = false;
48
+ foreach($wp_installer_instances as $key => $instance) {
49
+ if( version_compare( $instance['version'], '1.7.1', '>=' ) ){
50
+ $installer_171_plus_on = true;
51
+ break;
52
+ }
53
+ }
54
+
55
+ if( $installer_171_plus_on ){
56
+ foreach($wp_installer_instances as $key => $instance) {
57
+
58
+ if( version_compare( $instance['version'], '1.7.0', '<' ) ){
59
+ unset( $wp_installer_instances[$key] );
60
+ }
61
+
62
+ }
63
+ }
64
+
65
+ }
66
+
67
+ // Exception: When using the embedded plugins module allow the set up to run completely with the
68
+ // Installer instance that triggers it
69
+ if( isset( $_POST['installer_instance'] ) && isset( $wp_installer_instances[$_POST['installer_instance']] ) ){
70
+ $wp_installer_instances[$_POST['installer_instance']]['version'] = '999';
71
+ }
72
+ /* EXCEPTIONS ********************************************************************************************/
73
+
74
+
75
+ // Only one of these in the end
76
+ remove_action('after_setup_theme', 'wpml_installer_instance_delegator', 1);
77
+ add_action('after_setup_theme', 'wpml_installer_instance_delegator', 1);
78
+
79
+ // When all plugins load pick the newest version
80
+ if(!function_exists('wpml_installer_instance_delegator')){
81
+ function wpml_installer_instance_delegator(){
82
+ global $wp_installer_instances;
83
+
84
+ // version based election
85
+ foreach($wp_installer_instances as $instance){
86
+
87
+ if(!isset($delegate)){
88
+ $delegate = $instance;
89
+ continue;
90
+ }
91
+
92
+ if(version_compare($instance['version'], $delegate['version'], '>')){
93
+ $delegate = $instance;
94
+ }
95
+ }
96
+
97
+ // priority based election
98
+ $highest_priority = null;
99
+ foreach($wp_installer_instances as $instance) {
100
+ if(isset($instance['args']['high_priority'])){
101
+ if(is_null($highest_priority) || $instance['args']['high_priority'] <= $highest_priority){
102
+ $highest_priority = $instance['args']['high_priority'];
103
+ $delegate = $instance;
104
+ }
105
+ }
106
+ }
107
+
108
+ // Exception: When WPML prior 3.2 is used, that instance must be used regardless of another newer instance
109
+ // Case 2: WPML loaded after Types
110
+ if( defined('ICL_SITEPRESS_VERSION') && version_compare(ICL_SITEPRESS_VERSION, '3.2', '<') ) {
111
+ foreach($wp_installer_instances as $key => $instance) {
112
+ if(isset($instance['args']['site_key_nags'])){
113
+ $delegate = $instance;
114
+ $wp_installer_instances = array($key => $delegate); //Eliminate other instances
115
+ break;
116
+ }
117
+ }
118
+ }
119
+
120
+ include_once $delegate['bootfile'];
121
+
122
+ // set configuration
123
+ if(strpos(realpath($delegate['bootfile']), realpath(TEMPLATEPATH)) === 0){
124
+ $delegate['args']['in_theme_folder'] = dirname(ltrim(str_replace(realpath(TEMPLATEPATH), '', realpath($delegate['bootfile'])), '\\/'));
125
+ }
126
+ if(isset($delegate['args']) && is_array($delegate['args'])){
127
+ foreach($delegate['args'] as $key => $value){
128
+ WP_Installer()->set_config($key, $value);
129
+ }
130
+ }
131
+
132
+ }
133
+ }
134
+
135
+ if(!function_exists('WP_Installer_Setup')){
136
+
137
+ // $args:
138
+ // plugins_install_tab = true|false (default: true)
139
+ // repositories_include = array() (default: all)
140
+ // repositories_exclude = array() (default: none)
141
+ // template = name (default: default)
142
+ //
143
+ // Ext function
144
+ function WP_Installer_Setup($wp_installer_instance, $args = array()){
145
+ global $wp_installer_instances;
146
+
147
+ $wp_installer_instances[$wp_installer_instance]['args'] = $args;
148
+
149
+ }
150
+
151
  }
embedded/installer/locale/orig/installer.po CHANGED
@@ -1,230 +1,230 @@
1
- # This file was generated by WPML
2
- # WPML is a WordPress plugin that can turn any WordPress site into a full featured multilingual content management system.
3
- # https://wpml.org
4
- msgid ""
5
- msgstr ""
6
- "Content-Type: text/plain; charset=utf-8\n"
7
- "Content-Transfer-Encoding: 8bit\n"
8
- "Project-Id-Version:WPML_EXPORT\n"
9
- "POT-Creation-Date: \n"
10
- "PO-Revision-Date: \n"
11
- "Last-Translator: \n"
12
- "Language-Team: \n"
13
- "Language:en\n"
14
- "MIME-Version: 1.0\n"
15
-
16
- msgid "Installer"
17
- msgstr ""
18
-
19
- msgid "Registered"
20
- msgstr ""
21
-
22
- msgid "Register"
23
- msgstr ""
24
-
25
- msgid "To get automatic updates, you need to register %s for this site. %sRegister %s%s"
26
- msgstr ""
27
-
28
- msgid "Dismiss"
29
- msgstr ""
30
-
31
- msgid "Commercial"
32
- msgstr ""
33
-
34
- msgid "Installer cannot contact our updates server to get information about the available products and check for new versions. If you are seeing this message for the first time, you can ignore it, as it may be a temporary communication problem. If the problem persists and your WordPress admin is slowing down, you can disable automated version checks. Add the following line to your wp-config.php file:"
35
- msgstr ""
36
-
37
- msgid "No repositories defined."
38
- msgstr ""
39
-
40
- msgid "%s cannot access %s to register. Try again to see if it's a temporary problem. If the problem continues, make sure that this site has access to the Internet. You can still use the plugin without registration, but you will not receive automated updates."
41
- msgstr ""
42
-
43
- msgid "Invalid site key for the current site."
44
- msgstr ""
45
-
46
- msgid "You will have to renew your subscription in order to continue getting the updates and support."
47
- msgstr ""
48
-
49
- msgid "%sRenew here%s."
50
- msgstr ""
51
-
52
- msgid "Your subscription appears to no longer be valid. Please try to register again using a valid site key."
53
- msgstr ""
54
-
55
- msgid "You need to have a valid subscription in order to get upgrades or support for this plugin. %sPurchase a subscription or enter an existing site key%s."
56
- msgstr ""
57
-
58
- msgid "%s cannot update because your site's registration is not valid. Please %sregister %s%s again for this site first."
59
- msgstr ""
60
-
61
- msgid "Update Plugin"
62
- msgstr ""
63
-
64
- msgid "Return to the plugins page"
65
- msgstr ""
66
-
67
- msgid "Your subscription expires in %d day."
68
- msgstr ""
69
-
70
- msgid "Your subscription expires in %d days."
71
- msgstr ""
72
-
73
- msgid "Downloading is not possible because WordPress cannot write into the plugins folder. %sHow to fix%s."
74
- msgstr ""
75
-
76
- msgid "Plugin"
77
- msgstr ""
78
-
79
- msgid "downloading..."
80
- msgstr ""
81
-
82
- msgid "failed!"
83
- msgstr ""
84
-
85
- msgid "downloaded"
86
- msgstr ""
87
-
88
- msgid "activating"
89
- msgstr ""
90
-
91
- msgid "activated"
92
- msgstr ""
93
-
94
- msgid "Activate after download"
95
- msgstr ""
96
-
97
- msgid "Operation complete!"
98
- msgstr ""
99
-
100
- msgid "Download failed!\n\nClick OK to revalidate your subscription or CANCEL to try again."
101
- msgstr ""
102
-
103
- msgid "Available"
104
- msgstr ""
105
-
106
- msgid "Installed"
107
- msgstr ""
108
-
109
- msgid "Downloading"
110
- msgstr ""
111
-
112
- msgid "Activate"
113
- msgstr ""
114
-
115
- msgid "Download"
116
- msgstr ""
117
-
118
- msgid "Downloads:"
119
- msgstr ""
120
-
121
- msgid "Current version"
122
- msgstr ""
123
-
124
- msgid "Released"
125
- msgstr ""
126
-
127
- msgid "Installed version"
128
- msgstr ""
129
-
130
- msgid "(embedded)"
131
- msgstr ""
132
-
133
- msgid "installing..."
134
- msgstr ""
135
-
136
- msgid "updating..."
137
- msgstr ""
138
-
139
- msgid "installed"
140
- msgstr ""
141
-
142
- msgid "updated"
143
- msgstr ""
144
-
145
- msgid "Download failed!\n\nPlease refresh the page and try again."
146
- msgstr ""
147
-
148
- msgid "Incorrect setup"
149
- msgstr ""
150
-
151
- msgid "Invalid product"
152
- msgstr ""
153
-
154
- msgid "Unknown repository"
155
- msgstr ""
156
-
157
- msgid " Your current site key (%s) does not match the selected product (%s)."
158
- msgstr ""
159
-
160
- msgid "Buy %s"
161
- msgstr ""
162
-
163
- msgid "Already bought %s?"
164
- msgstr ""
165
-
166
- msgid "Renew %s"
167
- msgstr ""
168
-
169
- msgid "Remove current site key (%s)"
170
- msgstr ""
171
-
172
- msgid "%s support on wpml.org"
173
- msgstr ""
174
-
175
- msgid "Enter site key"
176
- msgstr ""
177
-
178
- msgid "Subscription is expired."
179
- msgstr ""
180
-
181
- msgid "Add"
182
- msgstr ""
183
-
184
- msgid "Are you sure you want to remove this site key?"
185
- msgstr ""
186
-
187
- msgid "Register %s"
188
- msgstr ""
189
-
190
- msgid "1. Go to your %s%s account%s and add this site URL: %s"
191
- msgstr ""
192
-
193
- msgid "Unregister %s from this site"
194
- msgstr ""
195
-
196
- msgid "%s is registered on this site. You will receive automatic updates until %s"
197
- msgstr ""
198
-
199
- msgid "%s is registered on this site. Your Lifetime account gives you updates for life."
200
- msgstr ""
201
-
202
- msgid "This page lets you install plugins and update existing plugins. To remove any of these plugins, go to the %splugins%s page and if you have the permission to remove plugins you should be able to do this."
203
- msgstr ""
204
-
205
- msgid "Already bought?"
206
- msgstr ""
207
-
208
- msgid "2. Enter your site key"
209
- msgstr ""
210
-
211
- msgid "Subscription is expired. You need to either purchase a new subscription or upgrade if available."
212
- msgstr ""
213
-
214
- msgid "Check for updates"
215
- msgstr ""
216
-
217
- msgid "Individual components"
218
- msgstr ""
219
-
220
- msgid "OK"
221
- msgstr ""
222
-
223
- msgid "Cancel"
224
- msgstr ""
225
-
226
- msgid "Are you sure you want to unregister?"
227
- msgstr ""
228
-
229
- msgid "Click to see individual components options."
230
- msgstr ""
1
+ # This file was generated by WPML
2
+ # WPML is a WordPress plugin that can turn any WordPress site into a full featured multilingual content management system.
3
+ # https://wpml.org
4
+ msgid ""
5
+ msgstr ""
6
+ "Content-Type: text/plain; charset=utf-8\n"
7
+ "Content-Transfer-Encoding: 8bit\n"
8
+ "Project-Id-Version:WPML_EXPORT\n"
9
+ "POT-Creation-Date: \n"
10
+ "PO-Revision-Date: \n"
11
+ "Last-Translator: \n"
12
+ "Language-Team: \n"
13
+ "Language:en\n"
14
+ "MIME-Version: 1.0\n"
15
+
16
+ msgid "Installer"
17
+ msgstr ""
18
+
19
+ msgid "Registered"
20
+ msgstr ""
21
+
22
+ msgid "Register"
23
+ msgstr ""
24
+
25
+ msgid "To get automatic updates, you need to register %s for this site. %sRegister %s%s"
26
+ msgstr ""
27
+
28
+ msgid "Dismiss"
29
+ msgstr ""
30
+
31
+ msgid "Commercial"
32
+ msgstr ""
33
+
34
+ msgid "Installer cannot contact our updates server to get information about the available products and check for new versions. If you are seeing this message for the first time, you can ignore it, as it may be a temporary communication problem. If the problem persists and your WordPress admin is slowing down, you can disable automated version checks. Add the following line to your wp-config.php file:"
35
+ msgstr ""
36
+
37
+ msgid "No repositories defined."
38
+ msgstr ""
39
+
40
+ msgid "%s cannot access %s to register. Try again to see if it's a temporary problem. If the problem continues, make sure that this site has access to the Internet. You can still use the plugin without registration, but you will not receive automated updates."
41
+ msgstr ""
42
+
43
+ msgid "Invalid site key for the current site."
44
+ msgstr ""
45
+
46
+ msgid "You will have to renew your subscription in order to continue getting the updates and support."
47
+ msgstr ""
48
+
49
+ msgid "%sRenew here%s."
50
+ msgstr ""
51
+
52
+ msgid "Your subscription appears to no longer be valid. Please try to register again using a valid site key."
53
+ msgstr ""
54
+
55
+ msgid "You need to have a valid subscription in order to get upgrades or support for this plugin. %sPurchase a subscription or enter an existing site key%s."
56
+ msgstr ""
57
+
58
+ msgid "%s cannot update because your site's registration is not valid. Please %sregister %s%s again for this site first."
59
+ msgstr ""
60
+
61
+ msgid "Update Plugin"
62
+ msgstr ""
63
+
64
+ msgid "Return to the plugins page"
65
+ msgstr ""
66
+
67
+ msgid "Your subscription expires in %d day."
68
+ msgstr ""
69
+
70
+ msgid "Your subscription expires in %d days."
71
+ msgstr ""
72
+
73
+ msgid "Downloading is not possible because WordPress cannot write into the plugins folder. %sHow to fix%s."
74
+ msgstr ""
75
+
76
+ msgid "Plugin"
77
+ msgstr ""
78
+
79
+ msgid "downloading..."
80
+ msgstr ""
81
+
82
+ msgid "failed!"
83
+ msgstr ""
84
+
85
+ msgid "downloaded"
86
+ msgstr ""
87
+
88
+ msgid "activating"
89
+ msgstr ""
90
+
91
+ msgid "activated"
92
+ msgstr ""
93
+
94
+ msgid "Activate after download"
95
+ msgstr ""
96
+
97
+ msgid "Operation complete!"
98
+ msgstr ""
99
+
100
+ msgid "Download failed!\n\nClick OK to revalidate your subscription or CANCEL to try again."
101
+ msgstr ""
102
+
103
+ msgid "Available"
104
+ msgstr ""
105
+
106
+ msgid "Installed"
107
+ msgstr ""
108
+
109
+ msgid "Downloading"
110
+ msgstr ""
111
+
112
+ msgid "Activate"
113
+ msgstr ""
114
+
115
+ msgid "Download"
116
+ msgstr ""
117
+
118
+ msgid "Downloads:"
119
+ msgstr ""
120
+
121
+ msgid "Current version"
122
+ msgstr ""
123
+
124
+ msgid "Released"
125
+ msgstr ""
126
+
127
+ msgid "Installed version"
128
+ msgstr ""
129
+
130
+ msgid "(embedded)"
131
+ msgstr ""
132
+
133
+ msgid "installing..."
134
+ msgstr ""
135
+
136
+ msgid "updating..."
137
+ msgstr ""
138
+
139
+ msgid "installed"
140
+ msgstr ""
141
+
142
+ msgid "updated"
143
+ msgstr ""
144
+
145
+ msgid "Download failed!\n\nPlease refresh the page and try again."
146
+ msgstr ""
147
+
148
+ msgid "Incorrect setup"
149
+ msgstr ""
150
+
151
+ msgid "Invalid product"
152
+ msgstr ""
153
+
154
+ msgid "Unknown repository"
155
+ msgstr ""
156
+
157
+ msgid " Your current site key (%s) does not match the selected product (%s)."
158
+ msgstr ""
159
+
160
+ msgid "Buy %s"
161
+ msgstr ""
162
+
163
+ msgid "Already bought %s?"
164
+ msgstr ""
165
+
166
+ msgid "Renew %s"
167
+ msgstr ""
168
+
169
+ msgid "Remove current site key (%s)"
170
+ msgstr ""
171
+
172
+ msgid "%s support on wpml.org"
173
+ msgstr ""
174
+
175
+ msgid "Enter site key"
176
+ msgstr ""
177
+
178
+ msgid "Subscription is expired."
179
+ msgstr ""
180
+
181
+ msgid "Add"
182
+ msgstr ""
183
+
184
+ msgid "Are you sure you want to remove this site key?"
185
+ msgstr ""
186
+
187
+ msgid "Register %s"
188
+ msgstr ""
189
+
190
+ msgid "1. Go to your %s%s account%s and add this site URL: %s"
191
+ msgstr ""
192
+
193
+ msgid "Unregister %s from this site"
194
+ msgstr ""
195
+
196
+ msgid "%s is registered on this site. You will receive automatic updates until %s"
197
+ msgstr ""
198
+
199
+ msgid "%s is registered on this site. Your Lifetime account gives you updates for life."
200
+ msgstr ""
201
+
202
+ msgid "This page lets you install plugins and update existing plugins. To remove any of these plugins, go to the %splugins%s page and if you have the permission to remove plugins you should be able to do this."
203
+ msgstr ""
204
+
205
+ msgid "Already bought?"
206
+ msgstr ""
207
+
208
+ msgid "2. Enter your site key"
209
+ msgstr ""
210
+
211
+ msgid "Subscription is expired. You need to either purchase a new subscription or upgrade if available."
212
+ msgstr ""
213
+
214
+ msgid "Check for updates"
215
+ msgstr ""
216
+
217
+ msgid "Individual components"
218
+ msgstr ""
219
+
220
+ msgid "OK"
221
+ msgstr ""
222
+
223
+ msgid "Cancel"
224
+ msgstr ""
225
+
226
+ msgid "Are you sure you want to unregister?"
227
+ msgstr ""
228
+
229
+ msgid "Click to see individual components options."
230
+ msgstr ""
embedded/installer/repositories.xml CHANGED
@@ -1,13 +1,13 @@
1
- <?xml version="1.0" encoding="utf-8"?>
2
- <repositories>
3
- <repository>
4
- <id>wpml</id>
5
- <apiurl>https://api.wpml.org/</apiurl>
6
- <products>http://d2salfytceyqoe.cloudfront.net/wpml33-products.json</products>
7
- </repository>
8
- <repository>
9
- <id>toolset</id>
10
- <apiurl>https://api.wp-types.com/</apiurl>
11
- <products>http://d7j863fr5jhrr.cloudfront.net/toolset33-products.json</products>
12
- </repository>
13
- </repositories>
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <repositories>
3
+ <repository>
4
+ <id>wpml</id>
5
+ <apiurl>https://api.wpml.org/</apiurl>
6
+ <products>http://d2salfytceyqoe.cloudfront.net/wpml33-products.json</products>
7
+ </repository>
8
+ <repository>
9
+ <id>toolset</id>
10
+ <apiurl>https://api.wp-types.com/</apiurl>
11
+ <products>http://d7j863fr5jhrr.cloudfront.net/toolset33-products.json</products>
12
+ </repository>
13
+ </repositories>
embedded/installer/res/css/admin.css CHANGED
@@ -1,186 +1,186 @@
1
- .otgsi_site_key_form{
2
- display:none;
3
- /*display:inline;*/
4
- }
5
-
6
- .installer-status-installing, .installer-status-installed, .installer-status-updating, .installer-status-updated, .installer-status-activating, .installer-status-activated, .installer-status-success{
7
- display: none;
8
- }
9
- .installer-status-installing{color: #FF9900; }
10
- .installer-status-installed{color: #003300; font-weight: bold; }
11
- .installer-status-updating{color: #FF9900; }
12
- .installer-status-updated{color: #003300; font-weight: bold; }
13
-
14
- .installer-status-activating{color: #996666 }
15
- .installer-status-activated{color: #333366; font-weight: bold; }
16
-
17
- .js-status-success p{
18
- color: #FF9900;
19
- padding: 4px;
20
- }
21
-
22
- .installer-green-text{
23
- color:#006600;
24
- font-weight:bold;
25
- }
26
-
27
- .installer-red-text{
28
- color:#b22121;
29
- font-weight:bold;
30
- }
31
-
32
- .installer-products-list li{
33
- display: inline;
34
- margin-right: 20px;
35
- }
36
-
37
- .otgs_wp_installer_table a.disabled{
38
- color:#888;
39
- }
40
-
41
- .otgs_wp_installer_subtable{
42
- clear: both;
43
- margin-left:-20px;
44
- }
45
- .otgs_wp_installer_subtable td p{
46
- font-size: 92%;
47
- }
48
-
49
- .installer-status-error{
50
- color: #f00;
51
- }
52
-
53
- .installer-status-note{
54
- color: #6F6E6D;
55
- font-style: italic;
56
- }
57
-
58
- .installer-warn-box{
59
- -webkit-border-radius: 5px;-moz-border-radius: 5px;border-radius: 5px;border:1px solid #962722;background-color:#F5C8C6;
60
- color: #333;
61
- padding: 5px;
62
- }
63
- .installer-warn-box span.details{
64
- font-style: italic;
65
- color:#777;
66
- }
67
-
68
- .installer-error-box{
69
- color:#962722;
70
- margin-top: 10px;
71
- }
72
- .installer-error-box p{
73
- margin: 10px 0 10px 0;
74
- -webkit-border-radius: 5px;-moz-border-radius: 5px;border-radius: 5px;border:1px solid #962722;background-color:#F5C8C6;
75
- color: #333;
76
- padding: 5px;
77
- text-align: center;
78
- }
79
-
80
- .spinner-inline{
81
- float: none;
82
- display: inline-block;
83
- visibility: visible;
84
- }
85
-
86
- .installer-q-icon:before{
87
- content: '\f223' !important;
88
- }
89
-
90
- .otgsi_yellow_bg{
91
- background-color: #f2f46b;
92
- }
93
-
94
- .otgs_wp_installer_table_compact{
95
- width:480px;
96
- border: solid 1px #999;
97
- padding:10px;
98
- border-radius: 5px;
99
- }
100
-
101
- .installer-plugins-list-compact{
102
- background-color: #fff;
103
- border-collapse: collapse;
104
- border:solid 1px #C1DAD7;
105
- width:100%;
106
- }
107
-
108
- .installer-plugins-list-compact tr th{
109
- padding-top:3px;
110
- background-color: #ccc;
111
- }
112
-
113
- .installer-plugins-list-compact tr{
114
- background-color: #ddd;
115
- }
116
-
117
- .installer-plugins-list-compact tr.even{
118
- background-color: #eee;
119
- }
120
-
121
- .installer-plugins-list-compact td{
122
- padding:2px 5px 2px 5px;
123
- border-right: 1px solid #C1DAD7;
124
- border-bottom: 1px solid #C1DAD7;
125
- }
126
-
127
- .installer-plugins-list-compact td.twelve{
128
- width:16px;
129
- }
130
-
131
- .otgs_wp_installer_table_compact .installer-status-downloading,
132
- .otgs_wp_installer_table_compact .installer-status-downloaded,
133
- .otgs_wp_installer_table_compact .installer-status-activating,
134
- .otgs_wp_installer_table_compact .installer-status-activated{
135
- display: none;
136
- color:transparent; width: 12px; padding:2px;
137
- }
138
-
139
- .otgs_wp_installer_table_compact .installer-status-success,
140
- .otgs_wp_installer_table_compact .installer-status-fail{
141
- display: none;
142
- }
143
-
144
- .installer-status-success{
145
- float: right;
146
- color: #006600;
147
- }
148
-
149
- .otgs_wp_installer_table_compact .installer-status-downloading{background: url(../img/dn.gif) no-repeat center; }
150
- .otgs_wp_installer_table_compact .installer-status-downloaded{background: url(../img/complete.png) no-repeat center;}
151
- .otgs_wp_installer_table_compact .installer-status-activating{background: url(../img/dn.gif) no-repeat center; }
152
- .otgs_wp_installer_table_compact .installer-status-activated{background: url(../img/complete.png) no-repeat center; }
153
- .otgs_wp_installer_table_compact .installer-status-error{background: url(../img/icon_error.gif) no-repeat center; }
154
-
155
- .installer_highlight{
156
- color:#c5510b;
157
- }
158
-
159
- .installer_highlight_package{
160
- background-color: #fff9c0;
161
- }
162
-
163
- .plugin_progress{
164
- font-style: italic;
165
- color: #777
166
- }
167
-
168
- .installer-download-progress-status{
169
- display: none;
170
- float:right;
171
- color: #006600;
172
- font-style: italic;
173
- background: url('../img/spinner.gif') no-repeat;
174
- padding-left:24px;
175
- }
176
-
177
- .otgs-is-dismissible {
178
- position: relative;
179
- padding-right: 38px;
180
- }
181
- .otgs-is-dismissible .notice-dismiss {
182
- text-decoration: none;
183
- }
184
- .otgs-is-dismissible p [class*="button-"] {
185
- margin: -5px 5px;
186
  }
1
+ .otgsi_site_key_form{
2
+ display:none;
3
+ /*display:inline;*/
4
+ }
5
+
6
+ .installer-status-installing, .installer-status-installed, .installer-status-updating, .installer-status-updated, .installer-status-activating, .installer-status-activated, .installer-status-success{
7
+ display: none;
8
+ }
9
+ .installer-status-installing{color: #FF9900; }
10
+ .installer-status-installed{color: #003300; font-weight: bold; }
11
+ .installer-status-updating{color: #FF9900; }
12
+ .installer-status-updated{color: #003300; font-weight: bold; }
13
+
14
+ .installer-status-activating{color: #996666 }
15
+ .installer-status-activated{color: #333366; font-weight: bold; }
16
+
17
+ .js-status-success p{
18
+ color: #FF9900;
19
+ padding: 4px;
20
+ }
21
+
22
+ .installer-green-text{
23
+ color:#006600;
24
+ font-weight:bold;
25
+ }
26
+
27
+ .installer-red-text{
28
+ color:#b22121;
29
+ font-weight:bold;
30
+ }
31
+
32
+ .installer-products-list li{
33
+ display: inline;
34
+ margin-right: 20px;
35
+ }
36
+
37
+ .otgs_wp_installer_table a.disabled{
38
+ color:#888;
39
+ }
40
+
41
+ .otgs_wp_installer_subtable{
42
+ clear: both;
43
+ margin-left:-20px;
44
+ }
45
+ .otgs_wp_installer_subtable td p{
46
+ font-size: 92%;
47
+ }
48
+
49
+ .installer-status-error{
50
+ color: #f00;
51
+ }
52
+
53
+ .installer-status-note{
54
+ color: #6F6E6D;
55
+ font-style: italic;
56
+ }
57
+
58
+ .installer-warn-box{
59
+ -webkit-border-radius: 5px;-moz-border-radius: 5px;border-radius: 5px;border:1px solid #962722;background-color:#F5C8C6;
60
+ color: #333;
61
+ padding: 5px;
62
+ }
63
+ .installer-warn-box span.details{
64
+ font-style: italic;
65
+ color:#777;
66
+ }
67
+
68
+ .installer-error-box{
69
+ color:#962722;
70
+ margin-top: 10px;
71
+ }
72
+ .installer-error-box p{
73
+ margin: 10px 0 10px 0;
74
+ -webkit-border-radius: 5px;-moz-border-radius: 5px;border-radius: 5px;border:1px solid #962722;background-color:#F5C8C6;
75
+ color: #333;
76
+ padding: 5px;
77
+ text-align: center;
78
+ }
79
+
80
+ .spinner-inline{
81
+ float: none;
82
+ display: inline-block;
83
+ visibility: visible;
84
+ }
85
+
86
+ .installer-q-icon:before{
87
+ content: '\f223' !important;
88
+ }
89
+
90
+ .otgsi_yellow_bg{
91
+ background-color: #f2f46b;
92
+ }
93
+
94
+ .otgs_wp_installer_table_compact{
95
+ width:480px;
96
+ border: solid 1px #999;
97
+ padding:10px;
98
+ border-radius: 5px;
99
+ }
100
+
101
+ .installer-plugins-list-compact{
102
+ background-color: #fff;
103
+ border-collapse: collapse;
104
+ border:solid 1px #C1DAD7;
105
+ width:100%;
106
+ }
107
+
108
+ .installer-plugins-list-compact tr th{
109
+ padding-top:3px;
110
+ background-color: #ccc;
111
+ }
112
+
113
+ .installer-plugins-list-compact tr{
114
+ background-color: #ddd;
115
+ }
116
+
117
+ .installer-plugins-list-compact tr.even{
118
+ background-color: #eee;
119
+ }
120
+
121
+ .installer-plugins-list-compact td{
122
+ padding:2px 5px 2px 5px;
123
+ border-right: 1px solid #C1DAD7;
124
+ border-bottom: 1px solid #C1DAD7;
125
+ }
126
+
127
+ .installer-plugins-list-compact td.twelve{
128
+ width:16px;
129
+ }
130
+
131
+ .otgs_wp_installer_table_compact .installer-status-downloading,
132
+ .otgs_wp_installer_table_compact .installer-status-downloaded,
133
+ .otgs_wp_installer_table_compact .installer-status-activating,
134
+ .otgs_wp_installer_table_compact .installer-status-activated{
135
+ display: none;
136
+ color:transparent; width: 12px; padding:2px;
137
+ }
138
+
139
+ .otgs_wp_installer_table_compact .installer-status-success,
140
+ .otgs_wp_installer_table_compact .installer-status-fail{
141
+ display: none;
142
+ }
143
+
144
+ .installer-status-success{
145
+ float: right;
146
+ color: #006600;
147
+ }
148
+
149
+ .otgs_wp_installer_table_compact .installer-status-downloading{background: url(../img/dn.gif) no-repeat center; }
150
+ .otgs_wp_installer_table_compact .installer-status-downloaded{background: url(../img/complete.png) no-repeat center;}
151
+ .otgs_wp_installer_table_compact .installer-status-activating{background: url(../img/dn.gif) no-repeat center; }
152
+ .otgs_wp_installer_table_compact .installer-status-activated{background: url(../img/complete.png) no-repeat center; }
153
+ .otgs_wp_installer_table_compact .installer-status-error{background: url(../img/icon_error.gif) no-repeat center; }
154
+
155
+ .installer_highlight{
156
+ color:#c5510b;
157
+ }
158
+
159
+ .installer_highlight_package{
160
+ background-color: #fff9c0;
161
+ }
162
+
163
+ .plugin_progress{
164
+ font-style: italic;
165
+ color: #777
166
+ }
167
+
168
+ .installer-download-progress-status{
169
+ display: none;
170
+ float:right;
171
+ color: #006600;
172
+ font-style: italic;
173
+ background: url('../img/spinner.gif') no-repeat;
174
+ padding-left:24px;
175
+ }
176
+
177
+ .otgs-is-dismissible {
178
+ position: relative;
179
+ padding-right: 38px;
180
+ }
181
+ .otgs-is-dismissible .notice-dismiss {
182
+ text-decoration: none;
183
+ }
184
+ .otgs-is-dismissible p [class*="button-"] {
185
+ margin: -5px 5px;
186
  }
embedded/installer/res/js/admin.js CHANGED
@@ -1,403 +1,403 @@
1
- var otgs_wp_installer = {
2
-
3
- init: function(){
4
-
5
- jQuery('.otgs_wp_installer_table').on('click', '.enter_site_key_js', otgs_wp_installer.show_site_key_form);
6
- jQuery('.otgs_wp_installer_table').on('click', '.cancel_site_key_js', otgs_wp_installer.hide_site_key_form);
7
-
8
- jQuery('.otgs_wp_installer_table').on('click', '.remove_site_key_js', otgs_wp_installer.remove_site_key);
9
- jQuery('.otgs_wp_installer_table').on('click', '.update_site_key_js', otgs_wp_installer.update_site_key);
10
-
11
- jQuery('.otgs_wp_installer_table').on('submit', '.otgsi_site_key_form', otgs_wp_installer.save_site_key);
12
- jQuery('.otgs_wp_installer_table').on('submit', '.otgsi_downloads_form', otgs_wp_installer.download_downloads);
13
- jQuery('.otgs_wp_installer_table').on('change', '.otgsi_downloads_form :checkbox[name="downloads[]"]', otgs_wp_installer.update_downloads_form);
14
-
15
- jQuery('.installer-dismiss-nag').click(otgs_wp_installer.dismiss_nag);
16
-
17
- jQuery('.otgs_wp_installer_table').on('click', '.installer_expand_button', otgs_wp_installer.toggle_subpackages);
18
-
19
- otgs_wp_installer.scroll_to_repository();
20
-
21
- if( typeof pagenow != 'undefined' && pagenow == 'plugins'){
22
-
23
- jQuery(document).ajaxSuccess(function(event, xhr, settings) {
24
- var data = otgs_wp_installer.getQueryParameters(settings.data);
25
- if(typeof data.action != 'undefined' && data.action == 'update-plugin'){
26
- response = xhr.responseJSON.data;
27
- console.log(typeof response.error);
28
- if(typeof response.error != 'undefined'){
29
- var default_error = jQuery('#' + response.slug + '-update .update-message').html();
30
- jQuery('#' + response.slug + '-update .update-message').html(default_error + ' &raquo;<span class="installer-red-text"> ' + response.error + '</span>');
31
- }
32
- }
33
- return false;
34
- });
35
-
36
- }
37
-
38
- },
39
-
40
- getQueryParameters : function(str) {
41
- return (str || document.location.search).replace(/(^\?)/,'').split("&").map(function(n){return n = n.split("="),this[n[0]] = n[1],this}.bind({}))[0];
42
- },
43
-
44
- reset_errors: function(){
45
- jQuery('.installer-error-box').html('').hide();
46
- },
47
-
48
- show_error: function(repo, text){
49
- jQuery('#installer_repo_' + repo).find('.installer-error-box').html(text).show();
50
- },
51
-
52
- show_site_key_form: function(){
53
- otgs_wp_installer.reset_errors();
54
-
55
- var form = jQuery(this).parent().find('form.otgsi_site_key_form');
56
- jQuery(this).prev().hide();
57
- jQuery(this).hide();
58
- form.css('display', 'inline');
59
- form.find('input[name^=site_key_]').focus().val('');
60
- form.find('input').removeAttr('disabled');
61
-
62
- form.closest('.otgsi_register_product_wrap').addClass('otgsi_yellow_bg');
63
-
64
- return false;
65
- },
66
-
67
- hide_site_key_form: function(){
68
- var form = jQuery(this).closest('form');
69
- form.hide();
70
- form.parent().find('.enter_site_key_js').show();
71
- form.parent().find('.enter_site_key_js').prev().show();
72
-
73
- form.closest('.otgsi_register_product_wrap').removeClass('otgsi_yellow_bg');
74
- otgs_wp_installer.reset_errors();
75
- return false;
76
- },
77
-
78
- save_site_key: function(){
79
-
80
- var thisf = jQuery(this);
81
- var data = jQuery(this).serialize();
82
- jQuery(this).find('input').attr('disabled', 'disabled');
83
-
84
- var spinner = jQuery('<span class="spinner"></span>');
85
- spinner.css({display: 'inline-block', float: 'none'}).prependTo(jQuery(this));
86
-
87
- otgs_wp_installer.reset_errors();
88
-
89
- jQuery.ajax({url: ajaxurl, type: 'POST', dataType:'json', data: data, success:
90
- function(ret){
91
- if(!ret.error){
92
- otgs_wp_installer.saved_site_key();
93
- }else{
94
- otgs_wp_installer.show_error(thisf.find('[name=repository_id]').val(), ret.error);
95
- thisf.find('input').removeAttr('disabled');
96
- }
97
-
98
- if(typeof ret.debug != 'undefined'){
99
- thisf.append('<textarea style="width:100%" rows="20">' + ret.debug + '</textarea>');
100
- }
101
-
102
- spinner.remove();
103
- }
104
- });
105
-
106
- return false;
107
-
108
- },
109
-
110
- saved_site_key: function(){
111
- location.reload();
112
- },
113
-
114
- remove_site_key: function(){
115
-
116
- if(confirm(jQuery(this).data('confirmation'))){
117
-
118
- jQuery('<span class="spinner"></span>').css({visibility: 'visible', float: 'none'}).prependTo(jQuery(this).parent());
119
- data = {action: 'remove_site_key', repository_id: jQuery(this).data('repository'), nonce: jQuery(this).data('nonce')}
120
- jQuery.ajax({url: ajaxurl, type: 'POST', data: data, success: otgs_wp_installer.removed_site_key});
121
- }
122
-
123
- return false;
124
- },
125
-
126
- removed_site_key: function(){
127
- location.reload();
128
- },
129
-
130
- update_site_key: function(){
131
- var error_wrap = jQuery(this).closest('.otgsi_register_product_wrap').find('.installer-error-box');
132
- error_wrap.html('');
133
-
134
- var spinner = jQuery('<span class="spinner"></span>');
135
-
136
- spinner.css({visibility: 'visible', float: 'none'}).prependTo(jQuery(this).parent());
137
- data = {action: 'update_site_key', repository_id: jQuery(this).data('repository'), nonce: jQuery(this).data('nonce')}
138
- jQuery.ajax({
139
- url: ajaxurl,
140
- type: 'POST',
141
- data: data,
142
- dataType: 'json',
143
- complete: function( event, xhr, settings ){
144
- var error = '';
145
- if(xhr == 'success') {
146
- var ret = event.responseJSON;
147
- if(ret.error){
148
- error = ret.error;
149
- }else{
150
- otgs_wp_installer.updated_site_key(ret);
151
- }
152
- }else{
153
- error = 'Error processing request (' + xhr + '). Please try again!';
154
- }
155
-
156
- if( error ){
157
- error_wrap.html('<p>' + error + '</p>').show();
158
- spinner.remove();
159
- }
160
-
161
- }
162
- });
163
-
164
- return false;
165
-
166
- },
167
-
168
- updated_site_key: function(ret){
169
- location.reload();
170
- },
171
-
172
- update_downloads_form: function(){
173
-
174
- var checked = jQuery('.otgsi_downloads_form :checkbox:checked[name="downloads[]"]').length;
175
-
176
- if(checked){
177
- jQuery(this).closest('form').find(':submit, :checkbox[name=activate]').removeAttr('disabled');
178
- }else{
179
- jQuery(this).closest('form').find(':submit, :checkbox[name=activate]').attr('disabled', 'disabled');
180
- }
181
-
182
-
183
- },
184
-
185
- download_downloads: function(){
186
-
187
- var activate = jQuery(this).find(":checkbox:checked[name=activate]").val(),
188
- action_button = jQuery(this).find('input[type="submit"]');
189
- downloads_form = jQuery(this),
190
- idx = 0,
191
- checkboxes = [];
192
-
193
- jQuery(this).find(':checkbox:checked[name="downloads[]"]').each(function(){
194
- if(jQuery(this).attr('disabled')) return;
195
- checkboxes[idx] = jQuery(this);
196
- idx++;
197
- jQuery(this).attr('disabled', 'disabled');
198
- });
199
-
200
- idx = 0;
201
-
202
- if( typeof checkboxes[idx] != 'undefined' ){
203
- download_and_activate( checkboxes[idx] );
204
- action_button.attr('disabled', 'disabled');
205
- }
206
-
207
- function download_and_activate( elem ){
208
-
209
- var this_tr = elem.closest('tr');
210
- var is_update = this_tr.find('.installer-red-text').length;
211
- if(is_update){
212
- var installing = this_tr.find('.installer-status-updating');
213
- var installed = this_tr.find('.installer-status-updated');
214
- }else{
215
- var installing = this_tr.find('.installer-status-installing');
216
- var installed = this_tr.find('.installer-status-installed');
217
-
218
- }
219
- if(activate){
220
- var activating = this_tr.find('.installer-status-activating');
221
- var activated = this_tr.find('.installer-status-activated');
222
- }
223
-
224
- if( this_tr.find('.for_spinner_js .spinner').length > 0 ){
225
- var spinner = this_tr.find('.for_spinner_js .spinner');
226
- }else{
227
- var spinner = this_tr.find('.installer-status-downloading');
228
- }
229
-
230
- otgs_wp_installer.reset_errors();
231
- downloads_form.find('div.installer-status-success').hide();
232
- spinner.css('visibility', 'visible');
233
- installing.show();
234
-
235
- var plugin_name = this_tr.find('.installer_plugin_name').html();
236
- if(is_update){
237
- otgs_wp_installer.show_download_progress_status(downloads_form, installer_strings.updating.replace('%s', plugin_name));
238
- }else{
239
- otgs_wp_installer.show_download_progress_status(downloads_form, installer_strings.installing.replace('%s', plugin_name));
240
- }
241
-
242
-
243
- data = {action: 'installer_download_plugin', data: elem.val(), activate: activate}
244
-
245
- jQuery.ajax({
246
- url: ajaxurl,
247
- type: 'POST',
248
- dataType: 'json',
249
- data: data,
250
- success: function(ret){
251
- installing.hide();
252
-
253
- if(!ret.success){
254
- installed.addClass('installer-status-error');
255
- installed.html(installed.data('fail'));
256
-
257
- if(ret.message){
258
- installed.closest('.otgs_wp_installer_table').find('.installer-error-box').html('<p>' + ret.message + '</p>').show();
259
- }else{
260
- installed.closest('.otgs_wp_installer_table').find('.installer-error-box').html('<p>' + downloads_form.find('.installer-revalidate-message').html() + '</p>').show();
261
- }
262
-
263
-
264
- }
265
-
266
- installed.show();
267
- spinner.fadeOut();
268
-
269
- if(ret.version){
270
- this_tr.find('.installer_version_installed').html('<span class="installer-green-text">' + ret.version + '</span>');
271
- }
272
-
273
- if(ret.success && activate){
274
-
275
- otgs_wp_installer.show_download_progress_status(downloads_form, installer_strings.activating.replace('%s', plugin_name));
276
- activating.show();
277
- spinner.show();
278
- this_tr.find('.installer-red-text').removeClass('installer-red-text').addClass('installer-green-text').html(ret.version);
279
-
280
- jQuery.ajax({
281
- url: ajaxurl,
282
- type: 'POST',
283
- dataType: 'json',
284
- data: {action: 'installer_activate_plugin', plugin_id: ret.plugin_id, nonce: ret.nonce},
285
- success: function(ret){
286
- activating.hide();
287
- if(!ret.error ){
288
- activated.show();
289
- }
290
-
291
- spinner.fadeOut();
292
-
293
- idx++;
294
- if( typeof checkboxes[idx] != 'undefined' ){
295
- download_and_activate( checkboxes[idx] );
296
- }else{
297
- otgs_wp_installer.hide_download_progress_status(downloads_form);
298
- downloads_form.find('div.installer-status-success').show();
299
- action_button.removeAttr('disabled');
300
- }
301
- }
302
- });
303
- }else{
304
- idx++;
305
- if( typeof checkboxes[idx] != 'undefined' ){
306
- download_and_activate( checkboxes[idx] );
307
- }else{
308
- otgs_wp_installer.hide_download_progress_status(downloads_form);
309
- downloads_form.find('div.installer-status-success').show();
310
- action_button.removeAttr('disabled');
311
- }
312
- }
313
- }
314
-
315
- });
316
-
317
- };
318
-
319
- return false;
320
- },
321
-
322
-
323
- show_download_progress_status: function(downloads_form, text){
324
-
325
- downloads_form.find('.installer-download-progress-status').html(text).fadeIn();
326
-
327
- },
328
-
329
- hide_download_progress_status: function(downloads_form){
330
-
331
- downloads_form.find('.installer-download-progress-status').html('').fadeOut();
332
-
333
- },
334
-
335
- dismiss_nag: function(){
336
-
337
- var thisa = jQuery(this);
338
-
339
- data = {action: 'installer_dismiss_nag', repository: jQuery(this).data('repository')}
340
-
341
- jQuery.ajax({url: ajaxurl, type: 'POST', dataType:'json', data: data, success:
342
- function(ret){
343
- thisa.closest('.otgs-is-dismissible').remove();
344
- }
345
- });
346
-
347
- return false;
348
- },
349
-
350
- toggle_subpackages: function(){
351
- var list = jQuery(this).closest('td').find('.otgs_wp_installer_subtable');
352
-
353
- if(list.is(':visible')){
354
- list.slideUp('fast');
355
- }else{
356
- list.slideDown('fast');
357
- }
358
-
359
-
360
- return false;
361
-
362
- },
363
-
364
- scroll_to_repository: function(){
365
-
366
- var ref = window.location.hash.replace('#', '');
367
-
368
- if(ref) {
369
- var split = ref.split('/');
370
- var repo = split[0];
371
-
372
- if(typeof split[1] != 'undefined'){
373
- var package = split[1];
374
- var repo_element = jQuery('#repository-' + repo);
375
-
376
-
377
-
378
- if(repo_element.length){
379
-
380
- jQuery('html, body').animate({
381
- scrollTop: repo_element.offset().top
382
- }, 1000);
383
-
384
- var package_element = jQuery('#repository-' + repo +'_' + package);
385
-
386
- if(package_element.length && !package_element.is(':visible')){
387
- package_element.parents('.otgs_wp_installer_subtable').slideDown();
388
- package_element.addClass('installer_highlight_package');
389
- }
390
-
391
- package_element.find('.button-secondary').removeClass('button-secondary').addClass('button-primary');
392
- }
393
- }
394
-
395
- }
396
-
397
- }
398
-
399
-
400
- }
401
-
402
-
403
  jQuery(document).ready(otgs_wp_installer.init);
1
+ var otgs_wp_installer = {
2
+
3
+ init: function(){
4
+
5
+ jQuery('.otgs_wp_installer_table').on('click', '.enter_site_key_js', otgs_wp_installer.show_site_key_form);
6
+ jQuery('.otgs_wp_installer_table').on('click', '.cancel_site_key_js', otgs_wp_installer.hide_site_key_form);
7
+
8
+ jQuery('.otgs_wp_installer_table').on('click', '.remove_site_key_js', otgs_wp_installer.remove_site_key);
9
+ jQuery('.otgs_wp_installer_table').on('click', '.update_site_key_js', otgs_wp_installer.update_site_key);
10
+
11
+ jQuery('.otgs_wp_installer_table').on('submit', '.otgsi_site_key_form', otgs_wp_installer.save_site_key);
12
+ jQuery('.otgs_wp_installer_table').on('submit', '.otgsi_downloads_form', otgs_wp_installer.download_downloads);
13
+ jQuery('.otgs_wp_installer_table').on('change', '.otgsi_downloads_form :checkbox[name="downloads[]"]', otgs_wp_installer.update_downloads_form);
14
+
15
+ jQuery('.installer-dismiss-nag').click(otgs_wp_installer.dismiss_nag);
16
+
17
+ jQuery('.otgs_wp_installer_table').on('click', '.installer_expand_button', otgs_wp_installer.toggle_subpackages);
18
+
19
+ otgs_wp_installer.scroll_to_repository();
20
+
21
+ if( typeof pagenow != 'undefined' && pagenow == 'plugins'){
22
+
23
+ jQuery(document).ajaxSuccess(function(event, xhr, settings) {
24
+ var data = otgs_wp_installer.getQueryParameters(settings.data);
25
+ if(typeof data.action != 'undefined' && data.action == 'update-plugin'){
26
+ response = xhr.responseJSON.data;
27
+ console.log(typeof response.error);
28
+ if(typeof response.error != 'undefined'){
29
+ var default_error = jQuery('#' + response.slug + '-update .update-message').html();
30
+ jQuery('#' + response.slug + '-update .update-message').html(default_error + ' &raquo;<span class="installer-red-text"> ' + response.error + '</span>');
31
+ }
32
+ }
33
+ return false;
34
+ });
35
+
36
+ }
37
+
38
+ },
39
+
40
+ getQueryParameters : function(str) {
41
+ return (str || document.location.search).replace(/(^\?)/,'').split("&").map(function(n){return n = n.split("="),this[n[0]] = n[1],this}.bind({}))[0];
42
+ },
43
+
44
+ reset_errors: function(){
45
+ jQuery('.installer-error-box').html('').hide();
46
+ },
47
+
48
+ show_error: function(repo, text){
49
+ jQuery('#installer_repo_' + repo).find('.installer-error-box').html(text).show();
50
+ },
51
+
52
+ show_site_key_form: function(){
53
+ otgs_wp_installer.reset_errors();
54
+
55
+ var form = jQuery(this).parent().find('form.otgsi_site_key_form');
56
+ jQuery(this).prev().hide();
57
+ jQuery(this).hide();
58
+ form.css('display', 'inline');
59
+ form.find('input[name^=site_key_]').focus().val('');
60
+ form.find('input').removeAttr('disabled');
61
+
62
+ form.closest('.otgsi_register_product_wrap').addClass('otgsi_yellow_bg');
63
+
64
+ return false;
65
+ },
66
+
67
+ hide_site_key_form: function(){
68
+ var form = jQuery(this).closest('form');
69
+ form.hide();
70
+ form.parent().find('.enter_site_key_js').show();
71
+ form.parent().find('.enter_site_key_js').prev().show();
72
+
73
+ form.closest('.otgsi_register_product_wrap').removeClass('otgsi_yellow_bg');
74
+ otgs_wp_installer.reset_errors();
75
+ return false;
76
+ },
77
+
78
+ save_site_key: function(){
79
+
80
+ var thisf = jQuery(this);
81
+ var data = jQuery(this).serialize();
82
+ jQuery(this).find('input').attr('disabled', 'disabled');
83
+
84
+ var spinner = jQuery('<span class="spinner"></span>');
85
+ spinner.css({display: 'inline-block', float: 'none'}).prependTo(jQuery(this));
86
+
87
+ otgs_wp_installer.reset_errors();
88
+
89
+ jQuery.ajax({url: ajaxurl, type: 'POST', dataType:'json', data: data, success:
90
+ function(ret){
91
+ if(!ret.error){
92
+ otgs_wp_installer.saved_site_key();
93
+ }else{
94
+ otgs_wp_installer.show_error(thisf.find('[name=repository_id]').val(), ret.error);
95
+ thisf.find('input').removeAttr('disabled');
96
+ }
97
+
98
+ if(typeof ret.debug != 'undefined'){
99
+ thisf.append('<textarea style="width:100%" rows="20">' + ret.debug + '</textarea>');
100
+ }
101
+
102
+ spinner.remove();
103
+ }
104
+ });
105
+
106
+ return false;
107
+
108
+ },
109
+
110
+ saved_site_key: function(){
111
+ location.reload();
112
+ },
113
+
114
+ remove_site_key: function(){
115
+
116
+ if(confirm(jQuery(this).data('confirmation'))){
117
+
118
+ jQuery('<span class="spinner"></span>').css({visibility: 'visible', float: 'none'}).prependTo(jQuery(this).parent());
119
+ data = {action: 'remove_site_key', repository_id: jQuery(this).data('repository'), nonce: jQuery(this).data('nonce')}
120
+ jQuery.ajax({url: ajaxurl, type: 'POST', data: data, success: otgs_wp_installer.removed_site_key});
121
+ }
122
+
123
+ return false;
124
+ },
125
+
126
+ removed_site_key: function(){
127
+ location.reload();
128
+ },
129
+
130
+ update_site_key: function(){
131
+ var error_wrap = jQuery(this).closest('.otgsi_register_product_wrap').find('.installer-error-box');
132
+ error_wrap.html('');
133
+
134
+ var spinner = jQuery('<span class="spinner"></span>');
135
+
136
+ spinner.css({visibility: 'visible', float: 'none'}).prependTo(jQuery(this).parent());
137
+ data = {action: 'update_site_key', repository_id: jQuery(this).data('repository'), nonce: jQuery(this).data('nonce')}
138
+ jQuery.ajax({
139
+ url: ajaxurl,
140
+ type: 'POST',
141
+ data: data,
142
+ dataType: 'json',
143
+ complete: function( event, xhr, settings ){
144
+ var error = '';
145
+ if(xhr == 'success') {
146
+ var ret = event.responseJSON;
147
+ if(ret.error){
148
+ error = ret.error;
149
+ }else{
150
+ otgs_wp_installer.updated_site_key(ret);
151
+ }
152
+ }else{
153
+ error = 'Error processing request (' + xhr + '). Please try again!';
154
+ }
155
+
156
+ if( error ){
157
+ error_wrap.html('<p>' + error + '</p>').show();
158
+ spinner.remove();
159
+ }
160
+
161
+ }
162
+ });
163
+
164
+ return false;
165
+
166
+ },
167
+
168
+ updated_site_key: function(ret){
169
+ location.reload();
170
+ },
171
+
172
+ update_downloads_form: function(){
173
+
174
+ var checked = jQuery('.otgsi_downloads_form :checkbox:checked[name="downloads[]"]').length;
175
+
176
+ if(checked){
177
+ jQuery(this).closest('form').find(':submit, :checkbox[name=activate]').removeAttr('disabled');
178
+ }else{
179
+ jQuery(this).closest('form').find(':submit, :checkbox[name=activate]').attr('disabled', 'disabled');
180
+ }
181
+
182
+
183
+ },
184
+
185
+ download_downloads: function(){
186
+
187
+ var activate = jQuery(this).find(":checkbox:checked[name=activate]").val(),
188
+ action_button = jQuery(this).find('input[type="submit"]');
189
+ downloads_form = jQuery(this),
190
+ idx = 0,
191
+ checkboxes = [];
192
+
193
+ jQuery(this).find(':checkbox:checked[name="downloads[]"]').each(function(){
194
+ if(jQuery(this).attr('disabled')) return;
195
+ checkboxes[idx] = jQuery(this);
196
+ idx++;
197
+ jQuery(this).attr('disabled', 'disabled');
198
+ });
199
+
200
+ idx = 0;
201
+
202
+ if( typeof checkboxes[idx] != 'undefined' ){
203
+ download_and_activate( checkboxes[idx] );
204
+ action_button.attr('disabled', 'disabled');
205
+ }
206
+
207
+ function download_and_activate( elem ){
208
+
209
+ var this_tr = elem.closest('tr');
210
+ var is_update = this_tr.find('.installer-red-text').length;
211
+ if(is_update){
212
+ var installing = this_tr.find('.installer-status-updating');
213
+ var installed = this_tr.find('.installer-status-updated');
214
+ }else{
215
+ var installing = this_tr.find('.installer-status-installing');
216
+ var installed = this_tr.find('.installer-status-installed');
217
+
218
+ }
219
+ if(activate){
220
+ var activating = this_tr.find('.installer-status-activating');
221
+ var activated = this_tr.find('.installer-status-activated');
222
+ }
223
+
224
+ if( this_tr.find('.for_spinner_js .spinner').length > 0 ){
225
+ var spinner = this_tr.find('.for_spinner_js .spinner');
226
+ }else{
227
+ var spinner = this_tr.find('.installer-status-downloading');
228
+ }
229
+
230
+ otgs_wp_installer.reset_errors();
231
+ downloads_form.find('div.installer-status-success').hide();
232
+ spinner.css('visibility', 'visible');
233
+ installing.show();
234
+
235
+ var plugin_name = this_tr.find('.installer_plugin_name').html();
236
+ if(is_update){
237
+ otgs_wp_installer.show_download_progress_status(downloads_form, installer_strings.updating.replace('%s', plugin_name));
238
+ }else{
239
+ otgs_wp_installer.show_download_progress_status(downloads_form, installer_strings.installing.replace('%s', plugin_name));
240
+ }
241
+
242
+
243
+ data = {action: 'installer_download_plugin', data: elem.val(), activate: activate}
244
+
245
+ jQuery.ajax({
246
+ url: ajaxurl,
247
+ type: 'POST',
248
+ dataType: 'json',
249
+ data: data,
250
+ success: function(ret){
251
+ installing.hide();
252
+
253
+ if(!ret.success){
254
+ installed.addClass('installer-status-error');
255
+ installed.html(installed.data('fail'));
256
+
257
+ if(ret.message){
258
+ installed.closest('.otgs_wp_installer_table').find('.installer-error-box').html('<p>' + ret.message + '</p>').show();
259
+ }else{
260
+ installed.closest('.otgs_wp_installer_table').find('.installer-error-box').html('<p>' + downloads_form.find('.installer-revalidate-message').html() + '</p>').show();
261
+ }
262
+
263
+
264
+ }
265
+
266
+ installed.show();
267
+ spinner.fadeOut();
268
+
269
+ if(ret.version){
270
+ this_tr.find('.installer_version_installed').html('<span class="installer-green-text">' + ret.version + '</span>');
271
+ }
272
+
273
+ if(ret.success && activate){
274
+
275
+ otgs_wp_installer.show_download_progress_status(downloads_form, installer_strings.activating.replace('%s', plugin_name));
276
+ activating.show();
277
+ spinner.show();
278
+ this_tr.find('.installer-red-text').removeClass('installer-red-text').addClass('installer-green-text').html(ret.version);
279
+
280
+ jQuery.ajax({
281
+ url: ajaxurl,
282
+ type: 'POST',
283
+ dataType: 'json',
284
+ data: {action: 'installer_activate_plugin', plugin_id: ret.plugin_id, nonce: ret.nonce},
285
+ success: function(ret){
286
+ activating.hide();
287
+ if(!ret.error ){
288
+ activated.show();
289
+ }
290
+
291
+ spinner.fadeOut();
292
+
293
+ idx++;
294
+ if( typeof checkboxes[idx] != 'undefined' ){
295
+ download_and_activate( checkboxes[idx] );
296
+ }else{
297
+ otgs_wp_installer.hide_download_progress_status(downloads_form);
298
+ downloads_form.find('div.installer-status-success').show();
299
+ action_button.removeAttr('disabled');
300
+ }
301
+ }
302
+ });
303
+ }else{
304
+ idx++;
305
+ if( typeof checkboxes[idx] != 'undefined' ){
306
+ download_and_activate( checkboxes[idx] );
307
+ }else{
308
+ otgs_wp_installer.hide_download_progress_status(downloads_form);
309
+ downloads_form.find('div.installer-status-success').show();
310
+ action_button.removeAttr('disabled');
311
+ }
312
+ }
313
+ }
314
+
315
+ });
316
+
317
+ };
318
+
319
+ return false;
320
+ },
321
+
322
+
323
+ show_download_progress_status: function(downloads_form, text){
324
+
325
+ downloads_form.find('.installer-download-progress-status').html(text).fadeIn();
326
+
327
+ },
328
+
329
+ hide_download_progress_status: function(downloads_form){
330
+
331
+ downloads_form.find('.installer-download-progress-status').html('').fadeOut();
332
+
333
+ },
334
+
335
+ dismiss_nag: function(){
336
+
337
+ var thisa = jQuery(this);
338
+
339
+ data = {action: 'installer_dismiss_nag', repository: jQuery(this).data('repository')}
340
+
341
+ jQuery.ajax({url: ajaxurl, type: 'POST', dataType:'json', data: data, success:
342
+ function(ret){
343
+ thisa.closest('.otgs-is-dismissible').remove();
344
+ }
345
+ });
346
+
347
+ return false;
348
+ },
349
+
350
+ toggle_subpackages: function(){
351
+ var list = jQuery(this).closest('td').find('.otgs_wp_installer_subtable');
352
+
353
+ if(list.is(':visible')){
354
+ list.slideUp('fast');
355
+ }else{
356
+ list.slideDown('fast');
357
+ }
358
+
359
+
360
+ return false;
361
+
362
+ },
363
+
364
+ scroll_to_repository: function(){
365
+
366
+ var ref = window.location.hash.replace('#', '');
367
+
368
+ if(ref) {
369
+ var split = ref.split('/');
370
+ var repo = split[0];
371
+
372
+ if(typeof split[1] != 'undefined'){
373
+ var package = split[1];
374
+ var repo_element = jQuery('#repository-' + repo);
375
+
376
+
377
+
378
+ if(repo_element.length){
379
+
380
+ jQuery('html, body').animate({
381
+ scrollTop: repo_element.offset().top
382
+ }, 1000);
383
+
384
+ var package_element = jQuery('#repository-' + repo +'_' + package);
385
+
386
+ if(package_element.length && !package_element.is(':visible')){
387
+ package_element.parents('.otgs_wp_installer_subtable').slideDown();
388
+ package_element.addClass('installer_highlight_package');
389
+ }
390
+
391
+ package_element.find('.button-secondary').removeClass('button-secondary').addClass('button-primary');
392
+ }
393
+ }
394
+
395
+ }
396
+
397
+ }
398
+
399
+
400
+ }
401
+
402
+
403
  jQuery(document).ready(otgs_wp_installer.init);
embedded/installer/res/js/iframeResizer.min.js CHANGED
@@ -1,10 +1,10 @@
1
- /*! iFrame Resizer (iframeSizer.min.js ) - v2.6.1 - 2014-09-03
2
- * Desc: Force cross domain iframes to size to content.
3
- * Requires: iframeResizer.contentWindow.min.js to be loaded into the target frame.
4
- * Copyright: (c) 2014 David J. Bradshaw - dave@bradshaw.net
5
- * License: MIT
6
- */
7
-
8
- !function(){"use strict";function a(a,b,c){"addEventListener"in window?a.addEventListener(b,c,!1):"attachEvent"in window&&a.attachEvent("on"+b,c)}function b(){var a,b=["moz","webkit","o","ms"];for(a=0;a<b.length&&!w;a+=1)w=window[b[a]+"RequestAnimationFrame"];w||c(" RequestAnimationFrame not supported")}function c(a){y.log&&"object"==typeof console&&console.log(s+"[Host page"+u+"]"+a)}function d(a){function b(){function a(){h(z),f(),y.resizedCallback(z)}i(a,z,"resetPage")}function d(a){var b=a.id;c(" Removing iFrame: "+b),a.parentNode.removeChild(a),y.closedCallback(b),c(" --")}function e(){var a=x.substr(t).split(":");return{iframe:document.getElementById(a[0]),id:a[0],height:a[1],width:a[2],type:a[3]}}function j(a){var b=Number(y["max"+a]),d=Number(y["min"+a]),e=a.toLowerCase(),f=Number(z[e]);if(d>b)throw new Error("Value for min"+a+" can not be greater than max"+a);c(" Checking "+e+" is in range "+d+"-"+b),d>f&&(f=d,c(" Set "+e+" to min value")),f>b&&(f=b,c(" Set "+e+" to max value")),z[e]=""+f}function k(){var b=a.origin,d=z.iframe.src.split("/").slice(0,3).join("/");if(y.checkOrigin&&(c(" Checking connection is from: "+d),""+b!="null"&&b!==d))throw new Error("Unexpected message received from: "+b+" for "+z.iframe.id+". Message was: "+a.data+". This error can be disabled by adding the checkOrigin: false option.");return!0}function l(){return s===(""+x).substr(0,t)}function m(){var a=z.type in{"true":1,"false":1};return a&&c(" Ignoring init message from meta parent page"),a}function n(){var a=x.substr(x.indexOf(":")+r+6);c(" MessageCallback passed: {iframe: "+z.iframe.id+", message: "+a+"}"),y.messageCallback({iframe:z.iframe,message:a}),c(" --")}function o(){if(null===z.iframe)throw new Error("iFrame ("+z.id+") does not exist on "+u);return!0}function q(){c(" Reposition requested from iFrame"),v={x:z.width,y:z.height},f()}function w(){switch(z.type){case"close":d(z.iframe),y.resizedCallback(z);break;case"message":n();break;case"scrollTo":q();break;case"reset":g(z);break;case"init":b(),y.initCallback(z.iframe);break;default:b()}}var x=a.data,z={};l()&&(c(" Received: "+x),z=e(),j("Height"),j("Width"),!m()&&o()&&k()&&(w(),p=!1))}function e(){null===v&&(v={x:void 0!==window.pageXOffset?window.pageXOffset:document.documentElement.scrollLeft,y:void 0!==window.pageYOffset?window.pageYOffset:document.documentElement.scrollTop},c(" Get position: "+v.x+","+v.y))}function f(){null!==v&&(window.scrollTo(v.x,v.y),c(" Set position: "+v.x+","+v.y),v=null)}function g(a){function b(){h(a),j("reset","reset",a.iframe)}c(" Size reset requested by "+("init"===a.type?"host page":"iFrame")),e(),i(b,a,"init")}function h(a){function b(b){a.iframe.style[b]=a[b]+"px",c(" IFrame ("+a.iframe.id+") "+b+" set to "+a[b]+"px")}y.sizeHeight&&b("height"),y.sizeWidth&&b("width")}function i(a,b,d){d!==b.type&&w?(c(" Requesting animation frame"),w(a)):a()}function j(a,b,d){c("["+a+"] Sending msg to iframe ("+b+")"),d.contentWindow.postMessage(s+b,"*")}function k(){function b(){function a(a){1/0!==y[a]&&0!==y[a]&&(k.style[a]=y[a]+"px",c(" Set "+a+" = "+y[a]+"px"))}a("maxHeight"),a("minHeight"),a("maxWidth"),a("minWidth")}function d(a){return""===a&&(k.id=a="iFrameResizer"+o++,c(" Added missing iframe ID: "+a+" ("+k.src+")")),a}function e(){c(" IFrame scrolling "+(y.scrolling?"enabled":"disabled")+" for "+l),k.style.overflow=!1===y.scrolling?"hidden":"auto",k.scrolling=!1===y.scrolling?"no":"yes"}function f(){("number"==typeof y.bodyMargin||"0"===y.bodyMargin)&&(y.bodyMarginV1=y.bodyMargin,y.bodyMargin=""+y.bodyMargin+"px")}function h(){return l+":"+y.bodyMarginV1+":"+y.sizeWidth+":"+y.log+":"+y.interval+":"+y.enablePublicMethods+":"+y.autoResize+":"+y.bodyMargin+":"+y.heightCalculationMethod+":"+y.bodyBackground+":"+y.bodyPadding+":"+y.tolerance}function i(b){a(k,"load",function(){var a=p;j("iFrame.onload",b,k),!a&&y.heightCalculationMethod in x&&g({iframe:k,height:0,width:0,type:"init"})}),j("init",b,k)}var k=this,l=d(k.id);e(),b(),f(),i(h())}function l(a){if("object"!=typeof a)throw new TypeError("Options is not an object.")}function m(){function a(a){if("IFRAME"!==a.tagName.toUpperCase())throw new TypeError("Expected <IFRAME> tag, found <"+a.tagName+">.");k.call(a)}function b(a){a=a||{},l(a);for(var b in z)z.hasOwnProperty(b)&&(y[b]=a.hasOwnProperty(b)?a[b]:z[b])}return function(c,d){b(c),Array.prototype.forEach.call(document.querySelectorAll(d||"iframe"),a)}}function n(a){a.fn.iFrameResize=function(b){return b=b||{},l(b),y=a.extend({},z,b),this.filter("iframe").each(k).end()}}var o=0,p=!0,q="message",r=q.length,s="[iFrameSizer]",t=s.length,u="",v=null,w=window.requestAnimationFrame,x={max:1,scroll:1,bodyScroll:1,documentElementScroll:1},y={},z={autoResize:!0,bodyBackground:null,bodyMargin:null,bodyMarginV1:8,bodyPadding:null,checkOrigin:!0,enablePublicMethods:!1,heightCalculationMethod:"offset",interval:32,log:!1,maxHeight:1/0,maxWidth:1/0,minHeight:0,minWidth:0,scrolling:!1,sizeHeight:!0,sizeWidth:!1,tolerance:0,closedCallback:function(){},initCallback:function(){},messageCallback:function(){},resizedCallback:function(){}};b(),a(window,"message",d),"jQuery"in window&&n(jQuery),"function"==typeof define&&define.amd?define(function(){return m()}):window.iFrameResize=m()}();
9
- //# sourceMappingURL=../src/iframeResizer.map
10
-
1
+ /*! iFrame Resizer (iframeSizer.min.js ) - v2.6.1 - 2014-09-03
2
+ * Desc: Force cross domain iframes to size to content.
3
+ * Requires: iframeResizer.contentWindow.min.js to be loaded into the target frame.
4
+ * Copyright: (c) 2014 David J. Bradshaw - dave@bradshaw.net
5
+ * License: MIT
6
+ */
7
+
8
+ !function(){"use strict";function a(a,b,c){"addEventListener"in window?a.addEventListener(b,c,!1):"attachEvent"in window&&a.attachEvent("on"+b,c)}function b(){var a,b=["moz","webkit","o","ms"];for(a=0;a<b.length&&!w;a+=1)w=window[b[a]+"RequestAnimationFrame"];w||c(" RequestAnimationFrame not supported")}function c(a){y.log&&"object"==typeof console&&console.log(s+"[Host page"+u+"]"+a)}function d(a){function b(){function a(){h(z),f(),y.resizedCallback(z)}i(a,z,"resetPage")}function d(a){var b=a.id;c(" Removing iFrame: "+b),a.parentNode.removeChild(a),y.closedCallback(b),c(" --")}function e(){var a=x.substr(t).split(":");return{iframe:document.getElementById(a[0]),id:a[0],height:a[1],width:a[2],type:a[3]}}function j(a){var b=Number(y["max"+a]),d=Number(y["min"+a]),e=a.toLowerCase(),f=Number(z[e]);if(d>b)throw new Error("Value for min"+a+" can not be greater than max"+a);c(" Checking "+e+" is in range "+d+"-"+b),d>f&&(f=d,c(" Set "+e+" to min value")),f>b&&(f=b,c(" Set "+e+" to max value")),z[e]=""+f}function k(){var b=a.origin,d=z.iframe.src.split("/").slice(0,3).join("/");if(y.checkOrigin&&(c(" Checking connection is from: "+d),""+b!="null"&&b!==d))throw new Error("Unexpected message received from: "+b+" for "+z.iframe.id+". Message was: "+a.data+". This error can be disabled by adding the checkOrigin: false option.");return!0}function l(){return s===(""+x).substr(0,t)}function m(){var a=z.type in{"true":1,"false":1};return a&&c(" Ignoring init message from meta parent page"),a}function n(){var a=x.substr(x.indexOf(":")+r+6);c(" MessageCallback passed: {iframe: "+z.iframe.id+", message: "+a+"}"),y.messageCallback({iframe:z.iframe,message:a}),c(" --")}function o(){if(null===z.iframe)throw new Error("iFrame ("+z.id+") does not exist on "+u);return!0}function q(){c(" Reposition requested from iFrame"),v={x:z.width,y:z.height},f()}function w(){switch(z.type){case"close":d(z.iframe),y.resizedCallback(z);break;case"message":n();break;case"scrollTo":q();break;case"reset":g(z);break;case"init":b(),y.initCallback(z.iframe);break;default:b()}}var x=a.data,z={};l()&&(c(" Received: "+x),z=e(),j("Height"),j("Width"),!m()&&o()&&k()&&(w(),p=!1))}function e(){null===v&&(v={x:void 0!==window.pageXOffset?window.pageXOffset:document.documentElement.scrollLeft,y:void 0!==window.pageYOffset?window.pageYOffset:document.documentElement.scrollTop},c(" Get position: "+v.x+","+v.y))}function f(){null!==v&&(window.scrollTo(v.x,v.y),c(" Set position: "+v.x+","+v.y),v=null)}function g(a){function b(){h(a),j("reset","reset",a.iframe)}c(" Size reset requested by "+("init"===a.type?"host page":"iFrame")),e(),i(b,a,"init")}function h(a){function b(b){a.iframe.style[b]=a[b]+"px",c(" IFrame ("+a.iframe.id+") "+b+" set to "+a[b]+"px")}y.sizeHeight&&b("height"),y.sizeWidth&&b("width")}function i(a,b,d){d!==b.type&&w?(c(" Requesting animation frame"),w(a)):a()}function j(a,b,d){c("["+a+"] Sending msg to iframe ("+b+")"),d.contentWindow.postMessage(s+b,"*")}function k(){function b(){function a(a){1/0!==y[a]&&0!==y[a]&&(k.style[a]=y[a]+"px",c(" Set "+a+" = "+y[a]+"px"))}a("maxHeight"),a("minHeight"),a("maxWidth"),a("minWidth")}function d(a){return""===a&&(k.id=a="iFrameResizer"+o++,c(" Added missing iframe ID: "+a+" ("+k.src+")")),a}function e(){c(" IFrame scrolling "+(y.scrolling?"enabled":"disabled")+" for "+l),k.style.overflow=!1===y.scrolling?"hidden":"auto",k.scrolling=!1===y.scrolling?"no":"yes"}function f(){("number"==typeof y.bodyMargin||"0"===y.bodyMargin)&&(y.bodyMarginV1=y.bodyMargin,y.bodyMargin=""+y.bodyMargin+"px")}function h(){return l+":"+y.bodyMarginV1+":"+y.sizeWidth+":"+y.log+":"+y.interval+":"+y.enablePublicMethods+":"+y.autoResize+":"+y.bodyMargin+":"+y.heightCalculationMethod+":"+y.bodyBackground+":"+y.bodyPadding+":"+y.tolerance}function i(b){a(k,"load",function(){var a=p;j("iFrame.onload",b,k),!a&&y.heightCalculationMethod in x&&g({iframe:k,height:0,width:0,type:"init"})}),j("init",b,k)}var k=this,l=d(k.id);e(),b(),f(),i(h())}function l(a){if("object"!=typeof a)throw new TypeError("Options is not an object.")}function m(){function a(a){if("IFRAME"!==a.tagName.toUpperCase())throw new TypeError("Expected <IFRAME> tag, found <"+a.tagName+">.");k.call(a)}function b(a){a=a||{},l(a);for(var b in z)z.hasOwnProperty(b)&&(y[b]=a.hasOwnProperty(b)?a[b]:z[b])}return function(c,d){b(c),Array.prototype.forEach.call(document.querySelectorAll(d||"iframe"),a)}}function n(a){a.fn.iFrameResize=function(b){return b=b||{},l(b),y=a.extend({},z,b),this.filter("iframe").each(k).end()}}var o=0,p=!0,q="message",r=q.length,s="[iFrameSizer]",t=s.length,u="",v=null,w=window.requestAnimationFrame,x={max:1,scroll:1,bodyScroll:1,documentElementScroll:1},y={},z={autoResize:!0,bodyBackground:null,bodyMargin:null,bodyMarginV1:8,bodyPadding:null,checkOrigin:!0,enablePublicMethods:!1,heightCalculationMethod:"offset",interval:32,log:!1,maxHeight:1/0,maxWidth:1/0,minHeight:0,minWidth:0,scrolling:!1,sizeHeight:!0,sizeWidth:!1,tolerance:0,closedCallback:function(){},initCallback:function(){},messageCallback:function(){},resizedCallback:function(){}};b(),a(window,"message",d),"jQuery"in window&&n(jQuery),"function"==typeof define&&define.amd?define(function(){return m()}):window.iFrameResize=m()}();
9
+ //# sourceMappingURL=../src/iframeResizer.map
10
+
embedded/installer/res/js/installer_theme_install.js CHANGED
@@ -1,97 +1,97 @@
1
- jQuery( document ).ready( function( $ ) {
2
-
3
- /** Append OTGS Theme tab */
4
- var js_array= installer_theme_install_localize.js_array_installer;
5
-
6
- if (!($.isEmptyObject(js_array))) {
7
- //Unempty
8
- for(var key in js_array) {
9
- //Dont append if we are on commercial plugins tab page and if there are no themes
10
- if ((!(js_array[key]['is_commercial_plugin_tab'])) && (!(installer_theme_install_localize.no_associated_themes))) {
11
- $('div.wp-filter ul.filter-links').append('<li><a data-sort="'+key+'" href="#">'+ js_array[key]['the_hyperlink_text'] +'</a></li>');
12
- }
13
- }
14
- }
15
-
16
- /** Page load event tab selected identifier */
17
- var loaded_browsing_tab=installer_theme_extended_object.getParameterByName('browse');
18
- if (loaded_browsing_tab.length > 0) {
19
-
20
- var frontend_tab_selected_tab = loaded_browsing_tab;
21
-
22
- } else if (0 == loaded_browsing_tab.length){
23
-
24
- //WordPress defaults to 'Featured' when theme install is loaded without the browse parameter
25
- var frontend_tab_selected_tab = 'featured';
26
- }
27
-
28
- /** Prepare data on page load event for AJAX */
29
- var data = {
30
- action: 'installer_theme_frontend_selected_tab',
31
- installer_theme_frontend_selected_tab_nonce: installer_theme_install_localize.installer_theme_frontend_selected_tab_nonce,
32
- frontend_tab_selected :frontend_tab_selected_tab
33
- };
34
-
35
- //Call AJAX
36
- installer_theme_extended_object.doAJAX(data,frontend_tab_selected_tab,js_array);
37
-
38
- /** When user clicks on any tab */
39
- $(document).on('click','.filter-links li > a',function () {
40
-
41
- //Get data_sort
42
- var data_sort =$(this).attr('data-sort');
43
-
44
- if (data_sort) {
45
- //data_sort is set, prepare data
46
- var data = {
47
- action: 'installer_theme_frontend_selected_tab',
48
- installer_theme_frontend_selected_tab_nonce: installer_theme_install_localize.installer_theme_frontend_selected_tab_nonce,
49
- frontend_tab_selected : data_sort
50
- };
51
-
52
- //Call AJAX
53
- installer_theme_extended_object.doAJAX(data,data_sort,js_array);
54
-
55
- }
56
- });
57
-
58
- var fullhash = window.location.hash;
59
- if (fullhash.length > 0) {
60
- var product_selector=fullhash+' '+'.enter_site_key_js';
61
- if ($(product_selector).length ) {
62
- $(product_selector).click();
63
- }
64
- }
65
- });
66
-
67
- //Installer theme extended JS object for methods
68
- var installer_theme_extended_object = {
69
-
70
- getParameterByName: function(name) {
71
- name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
72
- var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
73
- results = regex.exec(location.search);
74
- return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
75
- },
76
-
77
- doAJAX: function(data,data_sort,js_array) {
78
-
79
- //We only want to post to AJAX if its an OTGS tab
80
- jQuery.post(installer_theme_install_localize.ajaxurl, data, function(response) {
81
- //AJAX response
82
- var myObject = jQuery.parseJSON(response);
83
- if (typeof myObject != "undefined") {
84
- if(myObject.hasOwnProperty("output")){
85
- var tab_selected= myObject.output;
86
- if (data_sort in js_array) {
87
- if (!(installer_theme_install_localize.js_array_installer[tab_selected]['registration_status'])) {
88
- //Not registered, no theme response
89
- var unregistered_message= myObject.unregistered_messages;
90
- jQuery('.no-themes').html(unregistered_message);
91
- }
92
- }
93
- }
94
- }
95
- });
96
- }
97
  };
1
+ jQuery( document ).ready( function( $ ) {
2
+
3
+ /** Append OTGS Theme tab */
4
+ var js_array= installer_theme_install_localize.js_array_installer;
5
+
6
+ if (!($.isEmptyObject(js_array))) {
7
+ //Unempty
8
+ for(var key in js_array) {
9
+ //Dont append if we are on commercial plugins tab page and if there are no themes
10
+ if ((!(js_array[key]['is_commercial_plugin_tab'])) && (!(installer_theme_install_localize.no_associated_themes))) {
11
+ $('div.wp-filter ul.filter-links').append('<li><a data-sort="'+key+'" href="#">'+ js_array[key]['the_hyperlink_text'] +'</a></li>');
12
+ }
13
+ }
14
+ }
15
+
16
+ /** Page load event tab selected identifier */
17
+ var loaded_browsing_tab=installer_theme_extended_object.getParameterByName('browse');
18
+ if (loaded_browsing_tab.length > 0) {
19
+
20
+ var frontend_tab_selected_tab = loaded_browsing_tab;
21
+
22
+ } else if (0 == loaded_browsing_tab.length){
23
+
24
+ //WordPress defaults to 'Featured' when theme install is loaded without the browse parameter
25
+ var frontend_tab_selected_tab = 'featured';
26
+ }
27
+
28
+ /** Prepare data on page load event for AJAX */
29
+ var data = {
30
+ action: 'installer_theme_frontend_selected_tab',
31
+ installer_theme_frontend_selected_tab_nonce: installer_theme_install_localize.installer_theme_frontend_selected_tab_nonce,
32
+ frontend_tab_selected :frontend_tab_selected_tab
33
+ };
34
+
35
+ //Call AJAX
36
+ installer_theme_extended_object.doAJAX(data,frontend_tab_selected_tab,js_array);
37
+
38
+ /** When user clicks on any tab */
39
+ $(document).on('click','.filter-links li > a',function () {
40
+
41
+ //Get data_sort
42
+ var data_sort =$(this).attr('data-sort');
43
+
44
+ if (data_sort) {
45
+ //data_sort is set, prepare data
46
+ var data = {
47
+ action: 'installer_theme_frontend_selected_tab',
48
+ installer_theme_frontend_selected_tab_nonce: installer_theme_install_localize.installer_theme_frontend_selected_tab_nonce,
49
+ frontend_tab_selected : data_sort
50
+ };
51
+
52
+ //Call AJAX
53
+ installer_theme_extended_object.doAJAX(data,data_sort,js_array);
54
+
55
+ }
56
+ });
57
+
58
+ var fullhash = window.location.hash;
59
+ if (fullhash.length > 0) {
60
+ var product_selector=fullhash+' '+'.enter_site_key_js';
61
+ if ($(product_selector).length ) {
62
+ $(product_selector).click();
63
+ }
64
+ }
65
+ });
66
+
67
+ //Installer theme extended JS object for methods
68
+ var installer_theme_extended_object = {
69
+
70
+ getParameterByName: function(name) {
71
+ name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
72
+ var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
73
+ results = regex.exec(location.search);
74
+ return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
75
+ },
76
+
77
+ doAJAX: function(data,data_sort,js_array) {
78
+
79
+ //We only want to post to AJAX if its an OTGS tab
80
+ jQuery.post(installer_theme_install_localize.ajaxurl, data, function(response) {
81
+ //AJAX response
82
+ var myObject = jQuery.parseJSON(response);
83
+ if (typeof myObject != "undefined") {
84
+ if(myObject.hasOwnProperty("output")){
85
+ var tab_selected= myObject.output;
86
+ if (data_sort in js_array) {
87
+ if (!(installer_theme_install_localize.js_array_installer[tab_selected]['registration_status'])) {
88
+ //Not registered, no theme response
89
+ var unregistered_message= myObject.unregistered_messages;
90
+ jQuery('.no-themes').html(unregistered_message);
91
+ }
92
+ }
93
+ }
94
+ }
95
+ });
96
+ }
97
  };
embedded/installer/templates/downloads-list-compact.php CHANGED
@@ -1,80 +1,80 @@
1
-
2
- <form method="post" class="otgsi_downloads_form">
3
-
4
- <table class="installer-plugins-list-compact">
5
- <thead>
6
- <tr>
7
- <th>&nbsp;</th>
8
- <th><?php _e('Plugin', 'installer') ?></th>
9
- <th><img src="<?php echo $this->plugin_url() ?>/res/img/globe.png" alt="<?php esc_attr_e('Available', 'installer') ?>" width="16" height="16"></th>
10
- <th><img src="<?php echo $this->plugin_url() ?>/res/img/computer.png" alt="<?php esc_attr_e('Installed', 'installer') ?>" width="16" height="16"></th>
11
- <th><img src="<?php echo $this->plugin_url() ?>/res/img/dn2.gif" alt="<?php esc_attr_e('Downloading', 'installer') ?>" width="16" height="16"></th>
12
- <th><img src="<?php echo $this->plugin_url() ?>/res/img/on.png" alt="<?php esc_attr_e('Activate', 'installer') ?>" width="16" height="16"></th>
13
- </tr>
14
- </thead>
15
- <tbody>
16
- <?php foreach($product['downloads'] as $download): ?>
17
- <?php if(empty($tr_oddeven) || $tr_oddeven == 'even') $tr_oddeven = 'odd'; else $tr_oddeven = 'even'; ?>
18
- <tr class="<?php echo $tr_oddeven ?>">
19
- <td>
20
- <label>
21
- <?php
22
- $url = $this->append_site_key_to_download_url($download['url'], $site_key, $repository_id );
23
-
24
- $download_data = array(
25
- 'url' => $url,
26
- 'slug' => $download['slug'],
27
- 'nonce' => wp_create_nonce('install_plugin_' . $url),
28
- 'repository_id' => $repository_id
29
- );
30
-
31
- $disabled = $expired ||
32
- (
33
- $this->plugin_is_installed($download['name'], $download['slug'], $download['version']) &&
34
- !$this->plugin_is_embedded_version($download['name'], $download['slug'])
35
- ) || WP_Installer()->dependencies->cant_download( $repository_id );
36
-
37
- ?>
38
- <input type="checkbox" name="downloads[]" value="<?php echo base64_encode(json_encode($download_data)); ?>" <?php
39
- if($disabled): ?>disabled="disabled"<?php endif; ?> />&nbsp;
40
-
41
- </label>
42
- </td>
43
- <td class="installer_plugin_name"><?php echo $download['name'] ?></td>
44
- <td><?php echo $download['version'] ?></td>
45
- <td class="installer_version_installed">
46
- <?php if($v = $this->plugin_is_installed($download['name'], $download['slug'])):
47
- $class = version_compare($v, $download['version'], '>=') ? 'installer-green-text' : 'installer-red-text'; ?>
48
- <span class="<?php echo $class ?>"><?php echo $v; ?></span>
49
- <?php endif; ?>
50
- </td>
51
- <td class="twelve">
52
- <div class="installer-status-downloading"><?php _e('downloading...', 'installer') ?></div>
53
- <div class="installer-status-downloaded" data-fail="<?php _e('failed!', 'installer') ?>"><?php _e('downloaded', 'installer') ?></div>
54
- </td>
55
- <td class="twelve">
56
- <div class="installer-status-activating"><?php _e('activating', 'installer') ?></div>
57
- <div class="installer-status-activated"><?php _e('activated', 'installer') ?></div>
58
- </td>
59
- </tr>
60
- <?php endforeach; ?>
61
- </tbody>
62
- </table>
63
-
64
- <?php if( !WP_Installer()->dependencies->is_uploading_allowed() ): ?>
65
- <p class="installer-error-box"><?php printf(__('Downloading is not possible because WordPress cannot write into the plugins folder. %sHow to fix%s.', 'installer'),
66
- '<a href="http://codex.wordpress.org/Changing_File_Permissions">', '</a>') ?></p>
67
- <?php elseif( WP_Installer()->dependencies->is_win_paths_exception($repository_id) ): ?>
68
- <p><?php echo WP_Installer()->dependencies->win_paths_exception_message() ?></p>
69
- <?php endif;?>
70
-
71
- <br />
72
- <input type="submit" class="button-secondary" value="<?php esc_attr_e('Download', 'installer') ?>" disabled="disabled" />
73
- &nbsp;
74
- <label><input name="activate" type="checkbox" value="1" disabled="disabled" />&nbsp;<?php _e('Activate after download', 'installer') ?></label>
75
-
76
- <div class="installer-download-progress-status"></div>
77
- <div class="installer-status-success"><?php _e('Operation complete!', 'installer') ?></div>
78
-
79
- <span class="installer-revalidate-message hidden"><?php _e("Download failed!\n\nClick OK to revalidate your subscription or CANCEL to try again.", 'installer') ?></span>
80
- </form>
1
+
2
+ <form method="post" class="otgsi_downloads_form">
3
+
4
+ <table class="installer-plugins-list-compact">
5
+ <thead>
6
+ <tr>
7
+ <th>&nbsp;</th>
8
+ <th><?php _e('Plugin', 'installer') ?></th>
9
+ <th><img src="<?php echo $this->plugin_url() ?>/res/img/globe.png" alt="<?php esc_attr_e('Available', 'installer') ?>" width="16" height="16"></th>
10
+ <th><img src="<?php echo $this->plugin_url() ?>/res/img/computer.png" alt="<?php esc_attr_e('Installed', 'installer') ?>" width="16" height="16"></th>
11
+ <th><img src="<?php echo $this->plugin_url() ?>/res/img/dn2.gif" alt="<?php esc_attr_e('Downloading', 'installer') ?>" width="16" height="16"></th>
12
+ <th><img src="<?php echo $this->plugin_url() ?>/res/img/on.png" alt="<?php esc_attr_e('Activate', 'installer') ?>" width="16" height="16"></th>
13
+ </tr>
14
+ </thead>
15
+ <tbody>
16
+ <?php foreach($product['downloads'] as $download): ?>
17
+ <?php if(empty($tr_oddeven) || $tr_oddeven == 'even') $tr_oddeven = 'odd'; else $tr_oddeven = 'even'; ?>
18
+ <tr class="<?php echo $tr_oddeven ?>">
19
+ <td>
20
+ <label>
21
+ <?php
22
+ $url = $this->append_site_key_to_download_url($download['url'], $site_key, $repository_id );
23
+
24
+ $download_data = array(
25
+ 'url' => $url,
26
+ 'slug' => $download['slug'],
27
+ 'nonce' => wp_create_nonce('install_plugin_' . $url),
28
+ 'repository_id' => $repository_id
29
+ );
30
+
31
+ $disabled = $expired ||
32
+ (
33
+ $this->plugin_is_installed($download['name'], $download['slug'], $download['version']) &&
34
+ !$this->plugin_is_embedded_version($download['name'], $download['slug'])
35
+ ) || WP_Installer()->dependencies->cant_download( $repository_id );
36
+
37
+ ?>
38
+ <input type="checkbox" name="downloads[]" value="<?php echo base64_encode(json_encode($download_data)); ?>" <?php
39
+ if($disabled): ?>disabled="disabled"<?php endif; ?> />&nbsp;
40
+
41
+ </label>
42
+ </td>
43
+ <td class="installer_plugin_name"><?php echo $download['name'] ?></td>
44
+ <td><?php echo $download['version'] ?></td>
45
+ <td class="installer_version_installed">
46
+ <?php if($v = $this->plugin_is_installed($download['name'], $download['slug'])):
47
+ $class = version_compare($v, $download['version'], '>=') ? 'installer-green-text' : 'installer-red-text'; ?>
48
+ <span class="<?php echo $class ?>"><?php echo $v; ?></span>
49
+ <?php endif; ?>
50
+ </td>
51
+ <td class="twelve">
52
+ <div class="installer-status-downloading"><?php _e('downloading...', 'installer') ?></div>
53
+ <div class="installer-status-downloaded" data-fail="<?php _e('failed!', 'installer') ?>"><?php _e('downloaded', 'installer') ?></div>
54
+ </td>
55
+ <td class="twelve">
56
+ <div class="installer-status-activating"><?php _e('activating', 'installer') ?></div>
57
+ <div class="installer-status-activated"><?php _e('activated', 'installer') ?></div>
58
+ </td>
59
+ </tr>
60
+ <?php endforeach; ?>
61
+ </tbody>
62
+ </table>
63
+
64
+ <?php if( !WP_Installer()->dependencies->is_uploading_allowed() ): ?>
65
+ <p class="installer-error-box"><?php printf(__('Downloading is not possible because WordPress cannot write into the plugins folder. %sHow to fix%s.', 'installer'),
66
+ '<a href="http://codex.wordpress.org/Changing_File_Permissions">', '</a>') ?></p>
67
+ <?php elseif( WP_Installer()->dependencies->is_win_paths_exception($repository_id) ): ?>
68
+ <p><?php echo WP_Installer()->dependencies->win_paths_exception_message() ?></p>
69
+ <?php endif;?>
70
+
71
+ <br />
72
+ <input type="submit" class="button-secondary" value="<?php esc_attr_e('Download', 'installer') ?>" disabled="disabled" />
73
+ &nbsp;
74
+ <label><input name="activate" type="checkbox" value="1" disabled="disabled" />&nbsp;<?php _e('Activate after download', 'installer') ?></label>
75
+
76
+ <div class="installer-download-progress-status"></div>
77
+ <div class="installer-status-success"><?php _e('Operation complete!', 'installer') ?></div>
78
+
79
+ <span class="installer-revalidate-message hidden"><?php _e("Download failed!\n\nClick OK to revalidate your subscription or CANCEL to try again.", 'installer') ?></span>
80
+ </form>
embedded/installer/templates/downloads-list.php CHANGED
@@ -1,85 +1,85 @@
1
- <br clear="all" /><br />
2
- <strong><?php _e('Downloads:', 'installer') ?></strong>
3
-
4
- <form method="post" class="otgsi_downloads_form">
5
-
6
- <table class="widefat">
7
- <thead>
8
- <tr>
9
- <th>&nbsp;</th>
10
- <th><?php _e('Plugin', 'installer') ?></th>
11
- <th><?php _e('Current version', 'installer') ?></th>
12
- <th><?php _e('Released', 'installer') ?></th>
13
- <th><?php _e('Installed version', 'installer') ?></th>
14
- <th>&nbsp;</th>
15
- <th>&nbsp;</th>
16
- <th>&nbsp;</th>
17
- </tr>
18
- </thead>
19
- <tbody>
20
- <?php
21
- foreach($package['downloads'] as $download): ?>
22
- <tr>
23
- <td>
24
- <label>
25
- <?php
26
- $url = $this->append_site_key_to_download_url($download['url'], $site_key, $repository_id);
27
-
28
- $download_data = array(
29
- 'url' => $url,
30
- 'slug' => $download['slug'],
31
- 'nonce' => wp_create_nonce('install_plugin_' . $url),
32
- 'repository_id' => $repository_id
33
- );
34
- ?>
35
- <input type="checkbox" name="downloads[]" value="<?php echo base64_encode(json_encode($download_data)); ?>" <?php
36
- if($this->plugin_is_installed($download['name'], $download['slug'], $download['version']) && !$this->plugin_is_embedded_version($download['name'], $download['slug']) || WP_Installer()->dependencies->cant_download($repository_id) ): ?>disabled="disabled"<?php endif; ?> />&nbsp;
37
-
38
- </label>
39
- </td>
40
- <td class="installer_plugin_name"><?php echo $download['name'] ?></td>
41
- <td><?php echo $download['version'] ?></td>
42
- <td><?php echo date_i18n('F j, Y', strtotime($download['date'])) ?></td>
43
- <td class="installer_version_installed">
44
- <?php if($v = $this->plugin_is_installed($download['name'], $download['slug'])): $class = version_compare($v, $download['version'], '>=') ? 'installer-green-text' : 'installer-red-text'; ?>
45
- <span class="<?php echo $class ?>"><?php echo $v; ?></span>
46
- <?php if($this->plugin_is_embedded_version($download['name'], $download['slug'])): ?>&nbsp;<?php _e('(embedded)', 'installer'); ?><?php endif; ?>
47
- <?php endif; ?>
48
- </td>
49
- <td>
50
- <span class="installer-status-installing"><?php _e('installing...', 'installer') ?></span>
51
- <span class="installer-status-updating"><?php _e('updating...', 'installer') ?></span>
52
- <span class="installer-status-installed" data-fail="<?php _e('failed!', 'installer') ?>"><?php _e('installed', 'installer') ?></span>
53
- <span class="installer-status-updated" data-fail="<?php _e('failed!', 'installer') ?>"><?php _e('updated', 'installer') ?></span>
54
- </td>
55
- <td>
56
- <span class="installer-status-activating"><?php _e('activating', 'installer') ?></span>
57
- <span class="installer-status-activated"><?php _e('activated', 'installer') ?></span>
58
- </td>
59
- <td class="for_spinner_js"><span class="spinner"></span></td>
60
- </tr>
61
- <?php endforeach; ?>
62
- </tbody>
63
- </table>
64
-
65
- <br />
66
-
67
- <div class="installer-error-box">
68
- <?php if( !WP_Installer()->dependencies->is_uploading_allowed() ): ?>
69
- <p><?php printf(__('Downloading is not possible because WordPress cannot write into the plugins folder. %sHow to fix%s.', 'installer'),
70
- '<a href="http://codex.wordpress.org/Changing_File_Permissions">', '</a>') ?></p>
71
- <?php elseif( WP_Installer()->dependencies->is_win_paths_exception($repository_id) ): ?>
72
- <p><?php echo WP_Installer()->dependencies->win_paths_exception_message() ?></p>
73
- <?php endif; ?>
74
- </div>
75
-
76
- <input type="submit" class="button-secondary" value="<?php esc_attr_e('Download', 'installer') ?>" disabled="disabled" />
77
- &nbsp;
78
- <label><input name="activate" type="checkbox" value="1" disabled="disabled" />&nbsp;<?php _e('Activate after download', 'installer') ?></label>
79
-
80
- <div class="installer-download-progress-status"></div>
81
-
82
- <div class="installer-status-success"><?php _e('Operation complete!', 'installer') ?></div>
83
-
84
- <span class="installer-revalidate-message hidden"><?php _e("Download failed!\n\nPlease refresh the page and try again.", 'installer') ?></span>
85
- </form>
1
+ <br clear="all" /><br />
2
+ <strong><?php _e('Downloads:', 'installer') ?></strong>
3
+
4
+ <form method="post" class="otgsi_downloads_form">
5
+
6
+ <table class="widefat">
7
+ <thead>
8
+ <tr>
9
+ <th>&nbsp;</th>
10
+ <th><?php _e('Plugin', 'installer') ?></th>
11
+ <th><?php _e('Current version', 'installer') ?></th>
12
+ <th><?php _e('Released', 'installer') ?></th>
13
+ <th><?php _e('Installed version', 'installer') ?></th>
14
+ <th>&nbsp;</th>
15
+ <th>&nbsp;</th>
16
+ <th>&nbsp;</th>
17
+ </tr>
18
+ </thead>
19
+ <tbody>
20
+ <?php
21
+ foreach($package['downloads'] as $download): ?>
22
+ <tr>
23
+ <td>
24
+ <label>
25
+ <?php
26
+ $url = $this->append_site_key_to_download_url($download['url'], $site_key, $repository_id);
27
+
28
+ $download_data = array(
29
+ 'url' => $url,
30
+ 'slug' => $download['slug'],
31
+ 'nonce' => wp_create_nonce('install_plugin_' . $url),
32
+ 'repository_id' => $repository_id
33
+ );
34
+ ?>
35
+ <input type="checkbox" name="downloads[]" value="<?php echo base64_encode(json_encode($download_data)); ?>" <?php
36
+ if($this->plugin_is_installed($download['name'], $download['slug'], $download['version']) && !$this->plugin_is_embedded_version($download['name'], $download['slug']) || WP_Installer()->dependencies->cant_download($repository_id) ): ?>disabled="disabled"<?php endif; ?> />&nbsp;
37
+
38
+ </label>
39
+ </td>
40
+ <td class="installer_plugin_name"><?php echo $download['name'] ?></td>
41
+ <td><?php echo $download['version'] ?></td>
42
+ <td><?php echo date_i18n('F j, Y', strtotime($download['date'])) ?></td>
43
+ <td class="installer_version_installed">
44
+ <?php if($v = $this->plugin_is_installed($download['name'], $download['slug'])): $class = version_compare($v, $download['version'], '>=') ? 'installer-green-text' : 'installer-red-text'; ?>
45
+ <span class="<?php echo $class ?>"><?php echo $v; ?></span>
46
+ <?php if($this->plugin_is_embedded_version($download['name'], $download['slug'])): ?>&nbsp;<?php _e('(embedded)', 'installer'); ?><?php endif; ?>
47
+ <?php endif; ?>
48
+ </td>
49
+ <td>
50
+ <span class="installer-status-installing"><?php _e('installing...', 'installer') ?></span>
51
+ <span class="installer-status-updating"><?php _e('updating...', 'installer') ?></span>
52
+ <span class="installer-status-installed" data-fail="<?php _e('failed!', 'installer') ?>"><?php _e('installed', 'installer') ?></span>
53
+ <span class="installer-status-updated" data-fail="<?php _e('failed!', 'installer') ?>"><?php _e('updated', 'installer') ?></span>
54
+ </td>
55
+ <td>
56
+ <span class="installer-status-activating"><?php _e('activating', 'installer') ?></span>
57
+ <span class="installer-status-activated"><?php _e('activated', 'installer') ?></span>
58
+ </td>
59
+ <td class="for_spinner_js"><span class="spinner"></span></td>
60
+ </tr>
61
+ <?php endforeach; ?>
62
+ </tbody>
63
+ </table>
64
+
65
+ <br />
66
+
67
+ <div class="installer-error-box">
68
+ <?php if( !WP_Installer()->dependencies->is_uploading_allowed() ): ?>
69
+ <p><?php printf(__('Downloading is not possible because WordPress cannot write into the plugins folder. %sHow to fix%s.', 'installer'),
70
+ '<a href="http://codex.wordpress.org/Changing_File_Permissions">', '</a>') ?></p>
71
+ <?php elseif( WP_Installer()->dependencies->is_win_paths_exception($repository_id) ): ?>
72
+ <p><?php echo WP_Installer()->dependencies->win_paths_exception_message() ?></p>
73
+ <?php endif; ?>
74
+ </div>
75
+
76
+ <input type="submit" class="button-secondary" value="<?php esc_attr_e('Download', 'installer') ?>" disabled="disabled" />
77
+ &nbsp;
78
+ <label><input name="activate" type="checkbox" value="1" disabled="disabled" />&nbsp;<?php _e('Activate after download', 'installer') ?></label>
79
+
80
+ <div class="installer-download-progress-status"></div>
81
+
82
+ <div class="installer-status-success"><?php _e('Operation complete!', 'installer') ?></div>
83
+
84
+ <span class="installer-revalidate-message hidden"><?php _e("Download failed!\n\nPlease refresh the page and try again.", 'installer') ?></span>
85
+ </form>
embedded/installer/templates/products-compact.php CHANGED
@@ -1,129 +1,129 @@
1
- <h3><?php echo $args['box_title'] ?></h3>
2
-
3
- <?php
4
- if(empty($args['repository']) || empty($args['package']) || empty($args['product'])){
5
- echo __('Incorrect setup', 'installer');
6
- return;
7
- }
8
-
9
- $product = false;
10
- foreach($this->settings['repositories'][$repository_id]['data']['packages'] as $package_idx => $package){
11
-
12
- //pre 1.3 backwardds compatibility
13
- if(!isset($package['id'])){
14
- $package['id'] = sanitize_title_with_dashes($package['name']);
15
- }
16
-
17
- if($package['id'] == $args['package']){
18
- $product = $this->settings['repositories'][$repository_id]['data']['packages'][$package_idx]['products'][$args['product']];
19
- break;
20
- }
21
- }
22
-
23
-
24
- if(!$product){
25
- echo __('Invalid product', 'installer');
26
- return;
27
- }
28
-
29
- if(isset($this->settings['repositories'][$repository_id])){
30
- if(isset($this->settings['repositories'][$repository_id]['subscription']['key'])){
31
- $site_key = $this->settings['repositories'][$repository_id]['subscription']['key'];
32
- }else{
33
- $site_key = false;
34
- }
35
- }else{
36
- echo __('Unknown repository', 'installer');
37
- return;
38
- }
39
-
40
- $subscription_type = $this->get_subscription_type_for_repository($repository_id);
41
- $expired = false;
42
-
43
- if($subscription_type != $product['subscription_type'] && !$this->have_superior_subscription($subscription_type, $product) && $site_key){
44
- $subscription_no_match = sprintf(__(' Your current site key (%s) does not match the selected product (%s).', 'installer'), $site_key, $product['name']);
45
- }
46
-
47
- if(!isset($args['product_name'])) $args['product_name'] = $product['name'];
48
-
49
- ?>
50
-
51
- <div class="otgs_wp_installer_table otgs_wp_installer_table_compact">
52
-
53
- <p><?php echo $args['box_description'] ?></p>
54
-
55
-
56
- <?php if(!$this->repository_has_subscription($repository_id) || !empty($subscription_no_match)): ?>
57
-
58
- <?php if(!empty($subscription_no_match)): ?>
59
- <div class="installer-warn-box">
60
- <?php echo $subscription_no_match; ?>
61
- </div>
62
- <br />
63
- <?php endif; ?>
64
-
65
- <a class="button-primary" href="<?php echo $this->append_parameters_to_buy_url($product['url'], $repository_id, $args) ?>"><?php printf(__('Buy %s', 'installer'), $args['product_name']) ?></a>
66
-
67
- <div>
68
- <br />
69
- <?php printf(__('Already bought %s?', 'installer'), $args['product_name']) ?>
70
- <a class="enter_site_key_js" href="#"><?php _e('Enter site key', 'installer') ?></a>&nbsp;&nbsp;
71
-
72
- <form class="otgsi_site_key_form" method="post">
73
- <input type="hidden" name="action" value="save_site_key" />
74
- <input type="hidden" name="nonce" value="<?php echo wp_create_nonce('save_site_key_' . $repository_id) ?>" />
75
- <input type="hidden" name="repository_id" value="<?php echo $repository_id ?>">
76
- <input type="text" size="10" name="site_key_<?php echo $repository_id ?>" />
77
- <input class="button-secondary" type="submit" value="<?php esc_attr_e('Add', 'installer') ?>" />
78
- </form>
79
- <div class="installer-error-box hidden" style="margin-top:10px;"></div>
80
- </div>
81
-
82
- <?php else: ?>
83
-
84
- <?php if($this->repository_has_expired_subscription($repository_id)): $expired = true; ?>
85
-
86
- <div><p class="installer-warn-box"><?php _e('Subscription is expired.', 'installer') ?></p></div>
87
-
88
- <?php else: ?>
89
-
90
- <?php if($this->show_subscription_renew_warning($repository_id, $subscription_type)): ?>
91
-
92
- <ul class="installer-products-list">
93
- <?php foreach($product['renewals'] as $renewal): ?>
94
- <li>
95
- <a href="<?php echo $this->append_parameters_to_buy_url($renewal['url'], $repository_id, $args) ?>"><?php printf(__('Renew %s', 'installer'), $args['product_name']) ?></a>
96
- </li>
97
- <?php endforeach; ?>
98
- </ul>
99
-
100
- <?php endif; ?>
101
-
102
- <?php endif; ?>
103
-
104
- <center>
105
- <a class="remove_site_key_js" href="#" data-repository=<?php echo $repository_id ?> data-confirmation="<?php esc_attr_e('Are you sure you want to remove this site key?', 'installer') ?>" data-nonce="<?php echo wp_create_nonce('remove_site_key_' . $repository_id) ?>"><?php printf(__("Remove current site key (%s)", 'installer'), $site_key) ?></a>
106
- </center>
107
- <br />
108
-
109
- <?php include $this->plugin_path() . '/templates/downloads-list-compact.php'; ?>
110
-
111
-
112
-
113
- <?php endif; ?>
114
-
115
- <?php
116
- if( isset( $args[ 'name' ] ) ):
117
- $support_link = $this->get_support_tag_by_name($args['name'], $args['repository']); ?>
118
-
119
- <?php if($support_link): ?>
120
- <p><a href="<?php echo $support_link ?>" target="_blank"><?php printf(__('%s support on wpml.org', 'installer'), $args['name'] ) ?></a></p>
121
-
122
- <?php endif; ?>
123
- <?php
124
- // compatibility for installer 1.1
125
- elseif( isset( $args[ 'support_link' ] ) ): ?>
126
- <p><?php echo $args[ 'support_link' ]; ?></p>
127
- <?php endif; ?>
128
-
129
  </div>
1
+ <h3><?php echo $args['box_title'] ?></h3>
2
+
3
+ <?php
4
+ if(empty($args['repository']) || empty($args['package']) || empty($args['product'])){
5
+ echo __('Incorrect setup', 'installer');
6
+ return;
7
+ }
8
+
9
+ $product = false;
10
+ foreach($this->settings['repositories'][$repository_id]['data']['packages'] as $package_idx => $package){
11
+
12
+ //pre 1.3 backwardds compatibility
13
+ if(!isset($package['id'])){
14
+ $package['id'] = sanitize_title_with_dashes($package['name']);
15
+ }
16
+
17
+ if($package['id'] == $args['package']){
18
+ $product = $this->settings['repositories'][$repository_id]['data']['packages'][$package_idx]['products'][$args['product']];
19
+ break;
20
+ }
21
+ }
22
+
23
+
24
+ if(!$product){
25
+ echo __('Invalid product', 'installer');
26
+ return;
27
+ }
28
+
29
+ if(isset($this->settings['repositories'][$repository_id])){
30
+ if(isset($this->settings['repositories'][$repository_id]['subscription']['key'])){
31
+ $site_key = $this->settings['repositories'][$repository_id]['subscription']['key'];
32
+ }else{
33
+ $site_key = false;
34
+ }
35
+ }else{
36
+ echo __('Unknown repository', 'installer');
37
+ return;
38
+ }
39
+
40
+ $subscription_type = $this->get_subscription_type_for_repository($repository_id);
41
+ $expired = false;
42
+
43
+ if($subscription_type != $product['subscription_type'] && !$this->have_superior_subscription($subscription_type, $product) && $site_key){
44
+ $subscription_no_match = sprintf(__(' Your current site key (%s) does not match the selected product (%s).', 'installer'), $site_key, $product['name']);
45
+ }
46
+
47
+ if(!isset($args['product_name'])) $args['product_name'] = $product['name'];
48
+
49
+ ?>
50
+
51
+ <div class="otgs_wp_installer_table otgs_wp_installer_table_compact">
52
+
53
+ <p><?php echo $args['box_description'] ?></p>
54
+
55
+
56
+ <?php if(!$this->repository_has_subscription($repository_id) || !empty($subscription_no_match)): ?>
57
+
58
+ <?php if(!empty($subscription_no_match)): ?>
59
+ <div class="installer-warn-box">
60
+ <?php echo $subscription_no_match; ?>
61
+ </div>
62
+ <br />
63
+ <?php endif; ?>
64
+
65
+ <a class="button-primary" href="<?php echo $this->append_parameters_to_buy_url($product['url'], $repository_id, $args) ?>"><?php printf(__('Buy %s', 'installer'), $args['product_name']) ?></a>
66
+
67
+ <div>
68
+ <br />
69
+ <?php printf(__('Already bought %s?', 'installer'), $args['product_name']) ?>
70
+ <a class="enter_site_key_js" href="#"><?php _e('Enter site key', 'installer') ?></a>&nbsp;&nbsp;
71
+
72
+ <form class="otgsi_site_key_form" method="post">
73
+ <input type="hidden" name="action" value="save_site_key" />
74
+ <input type="hidden" name="nonce" value="<?php echo wp_create_nonce('save_site_key_' . $repository_id) ?>" />
75
+ <input type="hidden" name="repository_id" value="<?php echo $repository_id ?>">
76
+ <input type="text" size="10" name="site_key_<?php echo $repository_id ?>" />
77
+ <input class="button-secondary" type="submit" value="<?php esc_attr_e('Add', 'installer') ?>" />
78
+ </form>
79
+ <div class="installer-error-box hidden" style="margin-top:10px;"></div>
80
+ </div>
81
+
82
+ <?php else: ?>
83
+
84
+ <?php if($this->repository_has_expired_subscription($repository_id)): $expired = true; ?>
85
+
86
+ <div><p class="installer-warn-box"><?php _e('Subscription is expired.', 'installer') ?></p></div>
87
+
88
+ <?php else: ?>
89
+
90
+ <?php if($this->show_subscription_renew_warning($repository_id, $subscription_type)): ?>
91
+
92
+ <ul class="installer-products-list">
93
+ <?php foreach($product['renewals'] as $renewal): ?>
94
+ <li>
95
+ <a href="<?php echo $this->append_parameters_to_buy_url($renewal['url'], $repository_id, $args) ?>"><?php printf(__('Renew %s', 'installer'), $args['product_name']) ?></a>
96
+ </li>
97
+ <?php endforeach; ?>
98
+ </ul>
99
+
100
+ <?php endif; ?>
101
+
102
+ <?php endif; ?>
103
+
104
+ <center>
105
+ <a class="remove_site_key_js" href="#" data-repository=<?php echo $repository_id ?> data-confirmation="<?php esc_attr_e('Are you sure you want to remove this site key?', 'installer') ?>" data-nonce="<?php echo wp_create_nonce('remove_site_key_' . $repository_id) ?>"><?php printf(__("Remove current site key (%s)", 'installer'), $site_key) ?></a>
106
+ </center>
107
+ <br />
108
+
109
+ <?php include $this->plugin_path() . '/templates/downloads-list-compact.php'; ?>
110
+
111
+
112
+
113
+ <?php endif; ?>
114
+
115
+ <?php
116
+ if( isset( $args[ 'name' ] ) ):
117
+ $support_link = $this->get_support_tag_by_name($args['name'], $args['repository']); ?>
118
+
119
+ <?php if($support_link): ?>
120
+ <p><a href="<?php echo $support_link ?>" target="_blank"><?php printf(__('%s support on wpml.org', 'installer'), $args['name'] ) ?></a></p>
121
+
122
+ <?php endif; ?>
123
+ <?php
124
+ // compatibility for installer 1.1
125
+ elseif( isset( $args[ 'support_link' ] ) ): ?>
126
+ <p><?php echo $args[ 'support_link' ]; ?></p>
127
+ <?php endif; ?>
128
+
129
  </div>
embedded/installer/templates/repository-listing.php CHANGED
@@ -1,179 +1,179 @@
1
- <?php if((!$this->repository_has_subscription($repository_id) && $match = $this->get_matching_cp($repository)) && $match['exp']): ?>
2
- <p class="alignright installer_highlight"><strong><?php printf('Price offers available until %s', date_i18n(get_option( 'date_format' ), $match['exp'])) ?></strong></p>
3
- <?php endif; ?>
4
-
5
- <h3 id="repository-<?php echo $repository_id ?>"><?php echo $repository['data']['name'] ?></h3>
6
- <?php
7
- $generic_product_name = $this->settings['repositories'][$repository_id]['data']['product-name'];
8
- ?>
9
- <table class="widefat otgs_wp_installer_table" id="installer_repo_<?php echo $repository_id ?>">
10
-
11
- <tr>
12
- <td>&nbsp;</td>
13
- <td class="otgsi_register_product_wrap" align="center" valign="top">
14
- <?php // IF NO SUBSCRIPTION ?>
15
- <?php if(!$this->repository_has_subscription($repository_id)): ?>
16
-
17
- <div style="text-align: right;">
18
- <span><?php _e('Already bought?', 'installer'); ?>&nbsp;</span>
19
- <a class="enter_site_key_js button-primary" href="#"><?php printf(__('Register %s', 'installer'), $generic_product_name); ?></a>&nbsp;&nbsp;
20
- <form class="otgsi_site_key_form" method="post">
21
- <input type="hidden" name="action" value="save_site_key" />
22
- <input type="hidden" name="nonce" value="<?php echo wp_create_nonce('save_site_key_' . $repository_id) ?>" />
23
- <input type="hidden" name="repository_id" value="<?php echo $repository_id ?>">
24
- <?php _e('2. Enter your site key', 'installer'); ?>
25
- <input type="text" size="10" name="site_key_<?php echo $repository_id ?>" placeholder="<?php echo esc_attr('site key') ?>" />
26
- <input class="button-primary" type="submit" value="<?php esc_attr_e('OK', 'installer') ?>" />
27
- <input class="button-secondary cancel_site_key_js" type="button" value="<?php esc_attr_e('Cancel', 'installer') ?>" />
28
-
29
- <div class="alignleft" style="margin-top:6px;"><?php printf(__('1. Go to your %s%s account%s and add this site URL: %s', 'installer'),
30
- '<a href="' . $this->settings['repositories'][$repository_id]['data']['site_keys_management_url'] . '?add='.urlencode($this->get_installer_site_url( $repository_id )).'">',
31
- $generic_product_name, '</a>', $this->get_installer_site_url( $repository_id )); ?></div>
32
- </form>
33
-
34
-
35
- </div>
36
-
37
- <?php
38
- $site_key = false;
39
-
40
- // IF SUBSCRIPTION
41
- else:
42
-
43
- $site_key = $this->settings['repositories'][$repository_id]['subscription']['key'];
44
- $subscription_type = $this->get_subscription_type_for_repository($repository_id);
45
-
46
- $upgrade_options = $this->get_upgrade_options($repository_id);
47
- $expired = false;
48
-
49
- ?>
50
-
51
- <?php if($this->repository_has_expired_subscription($repository_id)): $expired = true; ?>
52
- <div>
53
- <p class="installer-warn-box">
54
- <?php _e('Subscription expired. You need to either purchase a new subscription or upgrade if available.', 'installer') ?>
55
- <span class="alignright">
56
- <a class="update_site_key_js button-secondary" href="#" data-repository=<?php echo $repository_id ?> data-nonce="<?php echo wp_create_nonce('update_site_key_' . $repository_id) ?>">
57
- <?php _e('Revalidate subscription', 'installer'); ?>
58
- </a>
59
- </span>
60
- <br />
61
- <span class="details"><?php _e("If you have already purchased or renewed your subscription and you can still see this message, please revalidate your subscription", 'installer') ?></span>
62
- </p>
63
- </div>
64
- <?php else: ?>
65
- <?php $this->show_subscription_renew_warning($repository_id, $subscription_type); ?>
66
- <?php endif; ?>
67
-
68
- <div class="alignright">
69
- <a class="remove_site_key_js button-secondary" href="#" data-repository=<?php echo $repository_id ?> data-confirmation="<?php esc_attr_e('Are you sure you want to unregister?', 'installer') ?>" data-nonce="<?php echo wp_create_nonce('remove_site_key_' . $repository_id) ?>"><?php printf(__("Unregister %s from this site", 'installer'), $generic_product_name) ?></a>&nbsp;
70
- <a class="update_site_key_js button-secondary" href="#" data-repository=<?php echo $repository_id ?> data-nonce="<?php echo wp_create_nonce('update_site_key_' . $repository_id) ?>">
71
- <?php _e('Check for updates', 'installer'); ?>
72
- </a>
73
- </div>
74
-
75
- <?php if(empty($expired)): ?>
76
- <div class="alignleft">
77
- <?php if($expires = $this->settings['repositories'][$repository_id]['subscription']['data']->expires): ?>
78
- <?php printf(__('%s is registered on this site. You will receive automatic updates until %s', 'installer'), $generic_product_name, date_i18n('F j, Y', strtotime($expires))); ?>
79
- <?php else: ?>
80
- <?php printf(__('%s is registered on this site. Your Lifetime account gives you updates for life.', 'installer'), $generic_product_name); ?>
81
- <?php endif; ?>
82
- </div>
83
- <?php endif; //if(empty($expired)) ?>
84
-
85
- <?php endif; // if(!repository_has_subscription) ?>
86
- <br clear="all" />
87
- <div class="installer-error-box hidden"></div>
88
-
89
- </td>
90
- </tr>
91
-
92
- <?php
93
-
94
- $subscription_type = isset($subscription_type) ? $subscription_type : null;
95
- $expired = isset($expired) ? $expired : null;
96
- $upgrade_options = isset($upgrade_options) ? $upgrade_options : null;
97
- $packages = $this->_render_product_packages($repository['data']['packages'], $subscription_type, $expired, $upgrade_options, $repository_id);
98
- if(empty($subscription_type) || $expired){
99
- $subpackages_expandable = true;
100
- }else{
101
- $subpackages_expandable = false;
102
- }
103
-
104
- ?>
105
-
106
- <?php foreach($packages as $package): ?>
107
- <tr id="repository-<?php echo $repository_id ?>_<?php echo $package['id'] ?>">
108
- <td><img width="140" height="140" src="<?php echo $package['image_url'] ?>" /></td>
109
- <td>
110
- <p><strong><?php echo $package['name'] ?></strong></p>
111
- <p><?php echo $package['description'] ?></p>
112
-
113
- <?php if($package['products']): ?>
114
- <?php foreach($package['products'] as $product): ?>
115
- <ul class="installer-products-list" style="display:inline">
116
- <li>
117
- <a class="button-secondary" href="<?php echo $product['url'] ?>"><?php echo $product['label'] ?></a>
118
- </li>
119
- </ul>
120
- <?php endforeach; ?>
121
- <?php endif; ?>
122
-
123
- <?php if($package['downloads']): ?>
124
- <?php include $this->plugin_path() . '/templates/downloads-list.php'; ?>
125
- <?php endif; ?>
126
-
127
- <?php if(!empty($package['sub-packages'])): ?>
128
-
129
- <?php $subpackages = $this->_render_product_packages($package['sub-packages'], $subscription_type, $expired, $upgrade_options, $repository_id); ?>
130
-
131
- <?php if($subpackages): ?>
132
-
133
- <?php if($subpackages_expandable): ?>
134
- <h5><a class="installer_expand_button" href="#" title="<?php esc_attr_e('Click to see individual components options.', 'installer') ?>"><?php _e('Individual components', 'installer') ?></a></h5>
135
- <?php endif; ?>
136
-
137
- <table class="otgs_wp_installer_subtable" style="<?php if($subpackages_expandable) echo 'display:none' ?>">
138
- <?php foreach($subpackages as $package): ?>
139
- <tr id="repository-<?php echo $repository_id ?>_<?php echo $package['id'] ?>">
140
- <td><img width="70" height="70" src="<?php echo $package['image_url'] ?>" /></td>
141
- <td>
142
- <p><strong><?php echo $package['name'] ?></strong></p>
143
- <p><?php echo $package['description'] ?></p>
144
-
145
- <?php if($package['products']): ?>
146
- <?php foreach($package['products'] as $product): ?>
147
- <ul class="installer-products-list" style="display:inline">
148
- <li>
149
- <a class="button-secondary" href="<?php echo $product['url'] ?>"><?php echo $product['label'] ?></a>
150
- </li>
151
- </ul>
152
- <?php endforeach; ?>
153
- <?php endif; ?>
154
-
155
- <?php if($package['downloads']): ?>
156
- <?php include $this->plugin_path() . '/templates/downloads-list.php'; ?>
157
- <?php endif; ?>
158
- </td>
159
- </tr>
160
- <?php endforeach; ?>
161
- </table>
162
- <?php endif; ?>
163
-
164
- <?php endif; ?>
165
-
166
-
167
- </td>
168
- </tr>
169
-
170
- <?php endforeach; ?>
171
-
172
- </table>
173
-
174
-
175
- <p><i><?php printf(__('This page lets you install plugins and update existing plugins. To remove any of these plugins, go to the %splugins%s page and if you have the permission to remove plugins you should be able to do this.', 'installer'), '<a href="' . admin_url('plugins.php') . '">' , '</a>'); ?></i></p>
176
-
177
-
178
-
179
  <br />
1
+ <?php if((!$this->repository_has_subscription($repository_id) && $match = $this->get_matching_cp($repository)) && $match['exp']): ?>
2
+ <p class="alignright installer_highlight"><strong><?php printf('Price offers available until %s', date_i18n(get_option( 'date_format' ), $match['exp'])) ?></strong></p>
3
+ <?php endif; ?>
4
+
5
+ <h3 id="repository-<?php echo $repository_id ?>"><?php echo $repository['data']['name'] ?></h3>
6
+ <?php
7
+ $generic_product_name = $this->settings['repositories'][$repository_id]['data']['product-name'];
8
+ ?>
9
+ <table class="widefat otgs_wp_installer_table" id="installer_repo_<?php echo $repository_id ?>">
10
+
11
+ <tr>
12
+ <td>&nbsp;</td>
13
+ <td class="otgsi_register_product_wrap" align="center" valign="top">
14
+ <?php // IF NO SUBSCRIPTION ?>
15
+ <?php if(!$this->repository_has_subscription($repository_id)): ?>
16
+
17
+ <div style="text-align: right;">
18
+ <span><?php _e('Already bought?', 'installer'); ?>&nbsp;</span>
19
+ <a class="enter_site_key_js button-primary" href="#"><?php printf(__('Register %s', 'installer'), $generic_product_name); ?></a>&nbsp;&nbsp;
20
+ <form class="otgsi_site_key_form" method="post">
21
+ <input type="hidden" name="action" value="save_site_key" />
22
+ <input type="hidden" name="nonce" value="<?php echo wp_create_nonce('save_site_key_' . $repository_id) ?>" />
23
+ <input type="hidden" name="repository_id" value="<?php echo $repository_id ?>">
24
+ <?php _e('2. Enter your site key', 'installer'); ?>
25
+ <input type="text" size="10" name="site_key_<?php echo $repository_id ?>" placeholder="<?php echo esc_attr('site key') ?>" />
26
+ <input class="button-primary" type="submit" value="<?php esc_attr_e('OK', 'installer') ?>" />
27
+ <input class="button-secondary cancel_site_key_js" type="button" value="<?php esc_attr_e('Cancel', 'installer') ?>" />
28
+
29
+ <div class="alignleft" style="margin-top:6px;"><?php printf(__('1. Go to your %s%s account%s and add this site URL: %s', 'installer'),
30
+ '<a href="' . $this->settings['repositories'][$repository_id]['data']['site_keys_management_url'] . '?add='.urlencode($this->get_installer_site_url( $repository_id )).'">',
31
+ $generic_product_name, '</a>', $this->get_installer_site_url( $repository_id )); ?></div>
32
+ </form>
33
+
34
+
35
+ </div>
36
+
37
+ <?php
38
+ $site_key = false;
39
+
40
+ // IF SUBSCRIPTION
41
+ else:
42
+
43
+ $site_key = $this->settings['repositories'][$repository_id]['subscription']['key'];
44
+ $subscription_type = $this->get_subscription_type_for_repository($repository_id);
45
+
46
+ $upgrade_options = $this->get_upgrade_options($repository_id);
47
+ $expired = false;
48
+
49
+ ?>
50
+
51
+ <?php if($this->repository_has_expired_subscription($repository_id)): $expired = true; ?>
52
+ <div>
53
+ <p class="installer-warn-box">
54
+ <?php _e('Subscription expired. You need to either purchase a new subscription or upgrade if available.', 'installer') ?>
55
+ <span class="alignright">
56
+ <a class="update_site_key_js button-secondary" href="#" data-repository=<?php echo $repository_id ?> data-nonce="<?php echo wp_create_nonce('update_site_key_' . $repository_id) ?>">
57
+ <?php _e('Revalidate subscription', 'installer'); ?>
58
+ </a>
59
+ </span>
60
+ <br />
61
+ <span class="details"><?php _e("If you have already purchased or renewed your subscription and you can still see this message, please revalidate your subscription", 'installer') ?></span>
62
+ </p>
63
+ </div>
64
+ <?php else: ?>
65
+ <?php $this->show_subscription_renew_warning($repository_id, $subscription_type); ?>
66
+ <?php endif; ?>
67
+
68
+ <div class="alignright">
69
+ <a class="remove_site_key_js button-secondary" href="#" data-repository=<?php echo $repository_id ?> data-confirmation="<?php esc_attr_e('Are you sure you want to unregister?', 'installer') ?>" data-nonce="<?php echo wp_create_nonce('remove_site_key_' . $repository_id) ?>"><?php printf(__("Unregister %s from this site", 'installer'), $generic_product_name) ?></a>&nbsp;
70
+ <a class="update_site_key_js button-secondary" href="#" data-repository=<?php echo $repository_id ?> data-nonce="<?php echo wp_create_nonce('update_site_key_' . $repository_id) ?>">
71
+ <?php _e('Check for updates', 'installer'); ?>
72
+ </a>
73
+ </div>
74
+
75
+ <?php if(empty($expired)): ?>
76
+ <div class="alignleft">
77
+ <?php if($expires = $this->settings['repositories'][$repository_id]['subscription']['data']->expires): ?>
78
+ <?php printf(__('%s is registered on this site. You will receive automatic updates until %s', 'installer'), $generic_product_name, date_i18n('F j, Y', strtotime($expires))); ?>
79
+ <?php else: ?>
80
+ <?php printf(__('%s is registered on this site. Your Lifetime account gives you updates for life.', 'installer'), $generic_product_name); ?>
81
+ <?php endif; ?>
82
+ </div>
83
+ <?php endif; //if(empty($expired)) ?>
84
+
85
+ <?php endif; // if(!repository_has_subscription) ?>
86
+ <br clear="all" />
87
+ <div class="installer-error-box hidden"></div>
88
+
89
+ </td>
90
+ </tr>
91
+
92
+ <?php
93
+
94
+ $subscription_type = isset($subscription_type) ? $subscription_type : null;
95
+ $expired = isset($expired) ? $expired : null;
96
+ $upgrade_options = isset($upgrade_options) ? $upgrade_options : null;
97
+ $packages = $this->_render_product_packages($repository['data']['packages'], $subscription_type, $expired, $upgrade_options, $repository_id);
98
+ if(empty($subscription_type) || $expired){
99
+ $subpackages_expandable = true;
100
+ }else{
101
+ $subpackages_expandable = false;
102
+ }
103
+
104
+ ?>
105
+
106
+ <?php foreach($packages as $package): ?>
107
+ <tr id="repository-<?php echo $repository_id ?>_<?php echo $package['id'] ?>">
108
+ <td><img width="140" height="140" src="<?php echo $package['image_url'] ?>" /></td>
109
+ <td>
110
+ <p><strong><?php echo $package['name'] ?></strong></p>
111
+ <p><?php echo $package['description'] ?></p>
112
+
113
+ <?php if($package['products']): ?>
114
+ <?php foreach($package['products'] as $product): ?>
115
+ <ul class="installer-products-list" style="display:inline">
116
+ <li>
117
+ <a class="button-secondary" href="<?php echo $product['url'] ?>"><?php echo $product['label'] ?></a>
118
+ </li>
119
+ </ul>
120
+ <?php endforeach; ?>
121
+ <?php endif; ?>
122
+
123
+ <?php if($package['downloads']): ?>
124
+ <?php include $this->plugin_path() . '/templates/downloads-list.php'; ?>
125
+ <?php endif; ?>
126
+
127
+ <?php if(!empty($package['sub-packages'])): ?>
128
+
129
+ <?php $subpackages = $this->_render_product_packages($package['sub-packages'], $subscription_type, $expired, $upgrade_options, $repository_id); ?>
130
+
131
+ <?php if($subpackages): ?>
132
+
133
+ <?php if($subpackages_expandable): ?>
134
+ <h5><a class="installer_expand_button" href="#" title="<?php esc_attr_e('Click to see individual components options.', 'installer') ?>"><?php _e('Individual components', 'installer') ?></a></h5>
135
+ <?php endif; ?>
136
+
137
+ <table class="otgs_wp_installer_subtable" style="<?php if($subpackages_expandable) echo 'display:none' ?>">
138
+ <?php foreach($subpackages as $package): ?>
139
+ <tr id="repository-<?php echo $repository_id ?>_<?php echo $package['id'] ?>">
140
+ <td><img width="70" height="70" src="<?php echo $package['image_url'] ?>" /></td>
141
+ <td>
142
+ <p><strong><?php echo $package['name'] ?></strong></p>
143
+ <p><?php echo $package['description'] ?></p>
144
+
145
+ <?php if($package['products']): ?>
146
+ <?php foreach($package['products'] as $product): ?>
147
+ <ul class="installer-products-list" style="display:inline">
148
+ <li>
149
+ <a class="button-secondary" href="<?php echo $product['url'] ?>"><?php echo $product['label'] ?></a>
150
+ </li>
151
+ </ul>
152
+ <?php endforeach; ?>
153
+ <?php endif; ?>
154
+
155
+ <?php if($package['downloads']): ?>
156
+ <?php include $this->plugin_path() . '/templates/downloads-list.php'; ?>
157
+ <?php endif; ?>
158
+ </td>
159
+ </tr>
160
+ <?php endforeach; ?>
161
+ </table>
162
+ <?php endif; ?>
163
+
164
+ <?php endif; ?>
165
+
166
+
167
+ </td>
168
+ </tr>
169
+
170
+ <?php endforeach; ?>
171
+
172
+ </table>
173
+
174
+
175
+ <p><i><?php printf(__('This page lets you install plugins and update existing plugins. To remove any of these plugins, go to the %splugins%s page and if you have the permission to remove plugins you should be able to do this.', 'installer'), '<a href="' . admin_url('plugins.php') . '">' , '</a>'); ?></i></p>
176
+
177
+
178
+
179
  <br />
inc/admin-menus/class-wcml-setup.php CHANGED
@@ -47,7 +47,9 @@ class WCML_Setup {
47
  );
48
 
49
  if( current_user_can( 'manage_options' ) ) {
50
- add_action( 'admin_menu', array($this, 'admin_menus') );
 
 
51
  add_action( 'admin_init', array($this, 'setup_wizard') );
52
 
53
  add_action( 'admin_init', array($this, 'handle_steps'), 0 );
@@ -235,7 +237,7 @@ class WCML_Setup {
235
  }
236
 
237
  public function setup_translation_interface(){
238
- $ui = new WCML_Setup_Translation_interface_UI( $this->woocommerce_wpml, $this->next_step_url() );
239
  echo $ui->get_view();
240
  }
241
 
47
  );
48
 
49
  if( current_user_can( 'manage_options' ) ) {
50
+ if ( isset( $_GET['page'] ) && $_GET['page'] === 'wcml-setup' ) {
51
+ add_action( 'admin_menu', array( $this, 'admin_menus' ) );
52
+ }
53
  add_action( 'admin_init', array($this, 'setup_wizard') );
54
 
55
  add_action( 'admin_init', array($this, 'handle_steps'), 0 );
237
  }
238
 
239
  public function setup_translation_interface(){
240
+ $ui = new WCML_Setup_Translation_Interface_UI( $this->woocommerce_wpml, $this->next_step_url() );
241
  echo $ui->get_view();
242
  }
243
 
inc/class-wcml-cart.php CHANGED
@@ -189,7 +189,10 @@ class WCML_Cart
189
  if ( apply_filters( 'translate_cart_subtotal_exception', false, $cart ) ){
190
  return;
191
  }
192
- $cart->calculate_totals();
 
 
 
193
  }
194
 
195
  // refresh cart total to return correct price from WC object
189
  if ( apply_filters( 'translate_cart_subtotal_exception', false, $cart ) ){
190
  return;
191
  }
192
+ if( apply_filters( 'wcml_calculate_totals_exception', true ) ){
193
+ $cart->calculate_totals();
194
+ }
195
+
196
  }
197
 
198
  // refresh cart total to return correct price from WC object
inc/class-wcml-compatibility.php CHANGED
@@ -100,7 +100,11 @@ class WCML_Compatibility {
100
  if ( is_plugin_active( 'woocommerce-ajax-layered-nav/ajax_layered_nav-widget.php' ) ) {
101
  $this->wc_ajax_layered_nav_widget = new WCML_Ajax_Layered_Nav_Widget();
102
  }
103
-
 
 
 
 
104
  // woocommerce composite products
105
  if ( isset( $GLOBALS[ 'woocommerce_composite_products' ] ) ) {
106
  $this->wc_composite_products = new WCML_Composite_Products();
@@ -128,6 +132,12 @@ class WCML_Compatibility {
128
  if( function_exists( 'adventure_tours_check' ) ){
129
  $this->adventure_tours = new WCML_Adventure_tours();
130
  }
 
 
 
 
 
 
131
  }
132
 
133
  }
100
  if ( is_plugin_active( 'woocommerce-ajax-layered-nav/ajax_layered_nav-widget.php' ) ) {
101
  $this->wc_ajax_layered_nav_widget = new WCML_Ajax_Layered_Nav_Widget();
102
  }
103
+
104
+ if ( is_plugin_active( 'woocommerce-ajax-cart/wooajaxcart.php' ) ) {
105
+ $this->wc_ajax_cart = new WCML_WC_Ajax_Cart();
106
+ }
107
+
108
  // woocommerce composite products
109
  if ( isset( $GLOBALS[ 'woocommerce_composite_products' ] ) ) {
110
  $this->wc_composite_products = new WCML_Composite_Products();
132
  if( function_exists( 'adventure_tours_check' ) ){
133
  $this->adventure_tours = new WCML_Adventure_tours();
134
  }
135
+
136
+ //Aurum Theme
137
+ if( wp_get_theme() == 'Aurum' ){
138
+ new WCML_Aurum();
139
+ }
140
+
141
  }
142
 
143
  }
inc/class-wcml-endpoints.php CHANGED
@@ -6,22 +6,22 @@ class WCML_Endpoints{
6
 
7
  function __construct(){
8
 
9
- //endpoints hooks
10
- $this->register_endpoints_translations();
11
- $this->maybe_flush_rules();
12
  add_action( 'icl_ajx_custom_call', array( $this, 'rewrite_rule_endpoints' ), 11, 2 );
13
  add_action( 'woocommerce_update_options', array( $this, 'add_endpoints' ) );
14
  add_filter( 'pre_update_option_rewrite_rules', array( $this, 'update_rewrite_rules' ), 100, 2 );
15
 
16
  add_filter( 'page_link', array( $this, 'endpoint_permalink_filter' ), 10, 2 ); //after WPML
17
 
18
- if(!is_admin()){
 
 
 
 
19
  add_filter('pre_get_posts', array($this, 'check_if_endpoint_exists'));
20
  }
21
 
22
  add_filter( 'woocommerce_get_endpoint_url', array( $this, 'filter_get_endpoint_url' ), 10, 4 );
23
 
24
-
25
  }
26
 
27
 
6
 
7
  function __construct(){
8
 
 
 
 
9
  add_action( 'icl_ajx_custom_call', array( $this, 'rewrite_rule_endpoints' ), 11, 2 );
10
  add_action( 'woocommerce_update_options', array( $this, 'add_endpoints' ) );
11
  add_filter( 'pre_update_option_rewrite_rules', array( $this, 'update_rewrite_rules' ), 100, 2 );
12
 
13
  add_filter( 'page_link', array( $this, 'endpoint_permalink_filter' ), 10, 2 ); //after WPML
14
 
15
+ if( !is_admin() ){
16
+ //endpoints hooks
17
+ $this->register_endpoints_translations();
18
+ $this->maybe_flush_rules();
19
+
20
  add_filter('pre_get_posts', array($this, 'check_if_endpoint_exists'));
21
  }
22
 
23
  add_filter( 'woocommerce_get_endpoint_url', array( $this, 'filter_get_endpoint_url' ), 10, 4 );
24
 
 
25
  }
26
 
27
 
inc/class-wcml-languages-upgrader.php CHANGED
@@ -251,13 +251,14 @@ class WCML_Languages_Upgrader{
251
  * Display Translations upgrade notice message
252
  */
253
  function translation_upgrade_notice(){
 
254
 
255
  $screen = get_current_screen();
256
  $notices = maybe_unserialize( get_option( 'wcml_translations_upgrade_notice' ) );
257
 
258
  if ( 'update-core' !== $screen->id && !empty ( $notices ) && !get_option( 'hide_wcml_translations_message' ) ) {
259
 
260
- wp_register_script( 'wcml-lang-notice', WCML_PLUGIN_URL . '/res/js/languages_notice.js', array( 'jquery' ), WCML_VERSION );
261
  wp_enqueue_script( 'wcml-lang-notice');
262
 
263
  $lang_notices = new WCML_Languages_Upgrade_Notice( $notices );
251
  * Display Translations upgrade notice message
252
  */
253
  function translation_upgrade_notice(){
254
+ global $woocommerce_wpml;
255
 
256
  $screen = get_current_screen();
257
  $notices = maybe_unserialize( get_option( 'wcml_translations_upgrade_notice' ) );
258
 
259
  if ( 'update-core' !== $screen->id && !empty ( $notices ) && !get_option( 'hide_wcml_translations_message' ) ) {
260
 
261
+ wp_register_script( 'wcml-lang-notice', WCML_PLUGIN_URL . '/res/js/languages_notice' . WCML_JS_MIN . '.js', array( 'jquery' ), WCML_VERSION );
262
  wp_enqueue_script( 'wcml-lang-notice');
263
 
264
  $lang_notices = new WCML_Languages_Upgrade_Notice( $notices );
inc/class-wcml-products-screen-options.php ADDED
@@ -0,0 +1,215 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Class WCML_Screen_Options
5
+ */
6
+ class WCML_Products_Screen_Options extends WPML_Templates_Factory {
7
+
8
+ /**
9
+ * @var SitePress
10
+ */
11
+ private $sitepress;
12
+
13
+ /**
14
+ * WCML_Screen_Options constructor.
15
+ *
16
+ * @param $sitepress
17
+ */
18
+ public function __construct( &$sitepress ) {
19
+ parent::__construct();
20
+ $this->sitepress = $sitepress;
21
+ }
22
+
23
+ /**
24
+ * Setup hooks.
25
+ */
26
+ public function init() {
27
+ add_filter( 'default_hidden_columns', array( $this, 'filter_screen_options' ), 10, 2 );
28
+ add_filter( 'wpml_hide_management_column', array( $this, 'sitepress_screen_option_filter' ), 10, 2 );
29
+ add_action( 'admin_init', array( $this, 'save_translation_controls' ), 10, 1 );
30
+ add_action( 'admin_notices', array( $this, 'product_page_admin_notices' ), 10 );
31
+ add_action( 'wp_ajax_dismiss-notice', array( $this, 'dismiss_notice_permanently' ), 10 );
32
+ add_action( 'wp_ajax_hidden-columns', array( $this, 'dismiss_notice_on_screen_option_change' ), 0 );
33
+ }
34
+
35
+ /**
36
+ * Hide management column by default for products.
37
+ *
38
+ * @param $is_visible
39
+ * @param $post_type
40
+ *
41
+ * @return bool
42
+ */
43
+ public function sitepress_screen_option_filter( $is_visible, $post_type ) {
44
+ if ( 'product' === $post_type ) {
45
+ $is_visible = false;
46
+ }
47
+
48
+ return $is_visible;
49
+ }
50
+
51
+ /**
52
+ * Set default option for translations management column.
53
+ *
54
+ * @param $hidden
55
+ * @param $screen
56
+ *
57
+ * @return array
58
+ */
59
+ public function filter_screen_options( $hidden, $screen ) {
60
+ if ( 'edit-product' === $screen->id ) {
61
+ $hidden[] = 'icl_translations';
62
+ }
63
+ return $hidden;
64
+ }
65
+
66
+ /**
67
+ * Save user options for management column.
68
+ */
69
+ public function save_translation_controls() {
70
+ if ( isset( $_GET['translation_controls'] )
71
+ && isset( $_GET['nonce'] )
72
+ && wp_verify_nonce( $_GET['nonce'], 'enable_translation_controls' )
73
+ ) {
74
+ $user = get_current_user_id();
75
+ $hidden_columns = get_user_meta( $user, 'manageedit-productcolumnshidden', true );
76
+ if ( ! is_array( $hidden_columns ) ) {
77
+ $hidden_columns = array();
78
+ }
79
+ if ( 0 === (int) $_GET['translation_controls'] ) {
80
+ $hidden_columns[] = 'icl_translations';
81
+ } else {
82
+ $tr_control_index = array_search( 'icl_translations', $hidden_columns );
83
+ if ( false !== $tr_control_index ) {
84
+ unset( $hidden_columns[ $tr_control_index ] );
85
+ }
86
+ }
87
+
88
+ update_user_meta( $user, 'manageedit-productcolumnshidden', $hidden_columns );
89
+ $this->sitepress->get_wp_api()->wp_safe_redirect( admin_url( 'edit.php?post_type=product' ), 301 );
90
+ }
91
+ }
92
+
93
+ /**
94
+ * Display admin notice for translation management column.
95
+ */
96
+ public function product_page_admin_notices() {
97
+ $current_screen = get_current_screen();
98
+ if ( 'edit-product' === $current_screen->id && $this->has_products() ) {
99
+ $this->show();
100
+ }
101
+ }
102
+
103
+ /**
104
+ * Get model for view.
105
+ *
106
+ * @return array
107
+ */
108
+ public function get_model() {
109
+ $translate_url = esc_url_raw( admin_url( 'admin.php?page=wpml-wcml' ) );
110
+ $nonce = wp_create_nonce( 'enable_translation_controls' );
111
+ $button_url = esc_url_raw( admin_url( 'edit.php?post_type=product&translation_controls=0&nonce=' . $nonce ) );
112
+ $button_text = __( 'Disable translation controls', 'woocommerce-multilingual' );
113
+ $first_line = __( 'Translation controls are enabled.', 'woocommerce-multilingual' );
114
+ $second_line = sprintf( __( "Disabling the translation controls will make this page load faster.\nThe best place to translate products is in WPML-&gt;WooCommerce Multilingual %sproducts translation dashboard%s.", 'woocommerce-multilingual' ), '<a href="' . $translate_url . '">', '</a>' );
115
+ $show_notice = ( 1 === (int) get_user_meta( get_current_user_id(), 'screen-option-enabled-notice-dismissed', true ) ) ? false : true;
116
+ $div_id = 'enabled';
117
+ if ( method_exists( $this->sitepress, 'show_management_column_content' ) && false === $this->sitepress->show_management_column_content( 'product' ) ) {
118
+ $button_url = admin_url( 'edit.php?post_type=product&translation_controls=1&nonce=' . $nonce );
119
+ $button_text = __( 'Enable translation controls anyway', 'woocommerce-multilingual' );
120
+ $first_line = __( 'Translation controls are disabled.', 'woocommerce-multilingual' );
121
+ $second_line = sprintf( __( "Enabling the translation controls in this page can increase the load time for this admin screen.\n The best place to translate products is in WPML-&gt;WooCommerce Multilingual %sproducts translation dashboard%s.", 'woocommerce-multilingual' ), '<a href="' . $translate_url . '">', '</a>' );
122
+ $show_notice = ( 1 === (int) get_user_meta( get_current_user_id(), 'screen-option-disabled-notice-dismissed', true ) ) ? false : true;
123
+ $div_id = 'disabled';
124
+ }
125
+ $model = array(
126
+ 'first_line' => $first_line,
127
+ 'second_line' => $second_line,
128
+ 'button_url' => $button_url,
129
+ 'button_text' => $button_text,
130
+ 'show_notice' => $show_notice,
131
+ 'div_id' => $div_id,
132
+ );
133
+
134
+ return $model;
135
+ }
136
+
137
+ /**
138
+ * Get template directory path.
139
+ */
140
+ protected function init_template_base_dir() {
141
+ $this->template_paths = array(
142
+ WCML_PLUGIN_PATH . '/templates/products-list/',
143
+ );
144
+ }
145
+
146
+ /**
147
+ * Get template file name.
148
+ *
149
+ * @return string
150
+ */
151
+ public function get_template() {
152
+ return 'admin-notice.twig';
153
+ }
154
+
155
+ public function dismiss_notice_permanently() {
156
+ if ( defined( 'DOING_AJAX' )
157
+ && DOING_AJAX
158
+ && isset( $_POST['nonce'] )
159
+ && wp_verify_nonce( $_POST['nonce'], 'products-screen-option-action' )
160
+ && isset( $_POST['dismiss_notice'] )
161
+ ) {
162
+ $user = get_current_user_id();
163
+ if ( 'enabled' === $_POST['dismiss_notice'] ) {
164
+ update_user_meta( $user, 'screen-option-enabled-notice-dismissed', 1 );
165
+ }
166
+
167
+ if ( 'disabled' === $_POST['dismiss_notice'] ) {
168
+ update_user_meta( $user, 'screen-option-disabled-notice-dismissed', 1 );
169
+ }
170
+ }
171
+ }
172
+
173
+ /**
174
+ * Dismiss notices when screen option is updated manually.`
175
+ */
176
+ public function dismiss_notice_on_screen_option_change() {
177
+ if ( defined( 'DOING_AJAX' )
178
+ && DOING_AJAX
179
+ && isset( $_POST['page'] )
180
+ && 'edit-product' === $_POST['page']
181
+ && check_ajax_referer( 'screen-options-nonce', 'screenoptionnonce' )
182
+ && isset( $_POST['hidden'] )
183
+ && '' === $_POST['hidden']
184
+ ) {
185
+ $user = get_current_user_id();
186
+ update_user_meta( $user, 'screen-option-enabled-notice-dismissed', 1 );
187
+ update_user_meta( $user, 'screen-option-disabled-notice-dismissed', 1 );
188
+ }
189
+ }
190
+
191
+ /**
192
+ * Check if there is at least on product added.
193
+ *
194
+ * @return bool
195
+ */
196
+ public function has_products() {
197
+ $has_products = false;
198
+ $args = array(
199
+ 'post_type' => 'product',
200
+ 'posts_per_page' => 1,
201
+ 'no_found_rows' => true,
202
+ 'fields' => 'ids',
203
+ 'update_post_meta_cache' => false,
204
+ 'update_post_term_cache' => false,
205
+ 'suppress_filters' => false,
206
+ );
207
+ $query = new WP_Query( $args );
208
+ if ( $query->have_posts() ) {
209
+ $has_products = true;
210
+ }
211
+ wp_reset_postdata();
212
+
213
+ return $has_products;
214
+ }
215
+ }
inc/class-wcml-products.php CHANGED
@@ -289,7 +289,7 @@ class WCML_Products{
289
  }
290
 
291
  public function woocommerce_json_search_found_products( $found_products ){
292
- $new_found_products = array();
293
  foreach( $found_products as $post => $formatted_product_name ) {
294
  $parent = wp_get_post_parent_id( $post );
295
  if( ( isset( $_COOKIE [ '_wcml_dashboard_order_language' ] )
@@ -307,7 +307,7 @@ class WCML_Products{
307
  }
308
  }
309
 
310
- return $new_found_products;
311
  }
312
 
313
  //update menu_order fro translations after ordering original products
289
  }
290
 
291
  public function woocommerce_json_search_found_products( $found_products ){
292
+
293
  foreach( $found_products as $post => $formatted_product_name ) {
294
  $parent = wp_get_post_parent_id( $post );
295
  if( ( isset( $_COOKIE [ '_wcml_dashboard_order_language' ] )
307
  }
308
  }
309
 
310
+ return isset ( $new_found_products ) ? $new_found_products : $found_products ;
311
  }
312
 
313
  //update menu_order fro translations after ordering original products
inc/class-wcml-resources.php CHANGED
@@ -7,12 +7,12 @@ class WCML_Resources {
7
  private static $is_wpml_wcml_page;
8
  private static $pagenow;
9
 
10
- private static $woocommerce_wcml;
11
 
12
- public static function set_up_resources( &$woocommerce_wcml ) {
13
  global $pagenow;
14
 
15
- self::$woocommerce_wcml =& $woocommerce_wcml;
16
 
17
  self::$page = isset($_GET['page']) ? $_GET['page'] : null;
18
  self::$tab = isset($_GET['tab']) ? $_GET['tab'] : null;
@@ -23,10 +23,10 @@ class WCML_Resources {
23
  self::load_js();
24
 
25
  $is_edit_product = self::$pagenow == 'post.php' && isset($_GET['post']) && get_post_type( $_GET['post'] ) == 'product';
26
- $is_original_product = isset( $_GET['post'] ) && !is_array( $_GET['post'] ) && self::$woocommerce_wcml->products->is_original_product( $_GET['post'] );
27
  $is_new_product = self::$pagenow == 'post-new.php' && isset($_GET['source_lang']) && isset($_GET['post_type']) && $_GET['post_type'] == 'product';
28
 
29
- if ( ($is_edit_product && !$is_original_product) || $is_new_product && !self::$woocommerce_wcml->settings['trnsl_interface'] ) {
30
  add_action( 'init', array(__CLASS__, 'load_lock_fields_js') );
31
  add_action( 'admin_footer', array(__CLASS__, 'hidden_label') );
32
  }
@@ -58,7 +58,7 @@ class WCML_Resources {
58
 
59
  private static function load_js() {
60
 
61
- wp_register_script( 'wcml-scripts', WCML_PLUGIN_URL . '/res/js/scripts.js', array(
62
  'jquery',
63
  'jquery-ui-core',
64
  'jquery-ui-resizable'
@@ -66,9 +66,9 @@ class WCML_Resources {
66
 
67
  if ( self::$is_wpml_wcml_page ) {
68
 
69
- wp_register_script( 'jquery-cookie', WCML_PLUGIN_URL . '/res/js/jquery.cookie.js', array('jquery'), WCML_VERSION );
70
- wp_register_script( 'wcml-dialogs', WCML_PLUGIN_URL . '/res/js/dialogs.js', array('jquery', 'jquery-ui-core', 'jquery-ui-dialog'), WCML_VERSION );
71
- wp_register_script( 'wcml-troubleshooting', WCML_PLUGIN_URL . '/res/js/troubleshooting.js', array('jquery'), WCML_VERSION );
72
 
73
  wp_enqueue_script( 'wcml-dialogs' );
74
  wp_enqueue_script( 'wcml-scripts' );
@@ -85,39 +85,39 @@ class WCML_Resources {
85
  }
86
 
87
  if ( self::$page == WPML_TM_FOLDER . '/menu/main.php' ) {
88
- wp_register_script( 'wpml_tm', WCML_PLUGIN_URL . '/res/js/wpml_tm.js', array('jquery'), WCML_VERSION );
89
  wp_enqueue_script( 'wpml_tm' );
90
  }
91
 
92
  if ( self::$page == 'wpml-wcml' && self::$tab == 'multi-currency' ) {
93
- wp_register_script( 'multi-currency', WCML_PLUGIN_URL . '/res/js/multi-currency.js', array('jquery', 'jquery-ui-sortable'), WCML_VERSION, true );
94
  wp_enqueue_script( 'multi-currency' );
95
  }
96
 
97
  if ( self::$page == 'wpml-wcml' && self::$tab == 'product-attributes' ) {
98
- wp_register_script( 'product-attributes', WCML_PLUGIN_URL . '/res/js/product-attributes.js', array('jquery'), WCML_VERSION, true );
99
  wp_enqueue_script( 'product-attributes' );
100
  }
101
 
102
  if ( !is_admin() ) {
103
- wp_register_script( 'cart-widget', WCML_PLUGIN_URL . '/res/js/cart_widget.js', array('jquery'), WCML_VERSION );
104
  wp_enqueue_script( 'cart-widget' );
105
  } else {
106
- wp_register_script( 'wcml-messages', WCML_PLUGIN_URL . '/res/js/wcml-messages.js', array('jquery'), WCML_VERSION );
107
  wp_enqueue_script( 'wcml-messages' );
108
  }
109
 
110
  $is_attr_page = apply_filters( 'wcml_is_attributes_page', self::$page == 'product_attributes' && isset( $_GET[ 'post_type' ] ) && $_GET[ 'post_type' ] == 'product' );
111
 
112
  if( $is_attr_page ){
113
- wp_register_script( 'wcml-attributes', WCML_PLUGIN_URL . '/res/js/wcml-attributes.js', array( 'jquery' ), WCML_VERSION );
114
  wp_enqueue_script( 'wcml-attributes' );
115
  }
116
 
117
  if( self::$page == WPML_TM_FOLDER . '/menu/translations-queue.php' ) {
118
  self::load_tooltip_resources();
119
  wp_enqueue_media();
120
- wp_register_script( 'wcml-editor', WCML_PLUGIN_URL . '/res/js/wcml-translation-editor.js', array('jquery', 'jquery-ui-core'), WCML_VERSION);
121
  wp_enqueue_script( 'wcml-editor' );
122
  wp_localize_script( 'wcml-editor', 'strings',
123
  array(
@@ -128,13 +128,19 @@ class WCML_Resources {
128
  );
129
  }
130
 
 
 
 
 
 
 
131
  }
132
 
133
  public static function load_tooltip_resources() {
134
 
135
  if ( class_exists( 'woocommerce' ) ) {
136
  wp_register_script( 'jquery-tiptip', WC()->plugin_url() . '/assets/js/jquery-tiptip/jquery.tipTip.min.js', array('jquery'), WC_VERSION, true );
137
- wp_register_script( 'wcml-tooltip-init', WCML_PLUGIN_URL . '/res/js/tooltip_init.js', array('jquery'), WCML_VERSION );
138
  wp_enqueue_script( 'jquery-tiptip' );
139
  wp_enqueue_script( 'wcml-tooltip-init' );
140
  wp_enqueue_style( 'woocommerce_admin_styles', WC()->plugin_url() . '/assets/css/admin.css', array(), WC_VERSION );
@@ -144,12 +150,12 @@ class WCML_Resources {
144
 
145
  public static function load_lock_fields_js() {
146
 
147
- wp_register_script( 'wcml-lock-script', WCML_PLUGIN_URL . '/res/js/lock_fields.js', array('jquery'), WCML_VERSION );
148
  wp_enqueue_script( 'wcml-lock-script' );
149
 
150
- $file_path_sync = self::$woocommerce_wcml->settings['file_path_sync'];
151
  if( isset( $_GET[ 'post' ] ) ){
152
- $original_language = self::$woocommerce_wcml->products->get_original_product_language( $_GET[ 'post' ] );
153
  $original_id = apply_filters( 'translate_object_id', $_GET[ 'post' ], 'product', true, $original_language );
154
  $custom_product_sync = get_post_meta( $original_id, 'wcml_sync_files', true );
155
  if( $custom_product_sync && $custom_product_sync == 'self' ) {
@@ -160,7 +166,7 @@ class WCML_Resources {
160
  }
161
 
162
  wp_localize_script( 'wcml-lock-script', 'unlock_fields', array(
163
- 'menu_order' => self::$woocommerce_wcml->settings['products_sync_order'],
164
  'file_paths' => $file_path_sync
165
  )
166
  );
@@ -183,7 +189,7 @@ class WCML_Resources {
183
  '" style="display: none;position:relative;left:2px;top:2px;">';
184
 
185
  if ( isset($_GET['post']) ) {
186
- $original_language = self::$woocommerce_wcml->products->get_original_product_language( $_GET['post'] );
187
  $original_id = apply_filters( 'translate_object_id', $_GET['post'], 'product', true, $original_language );
188
  } elseif ( isset($_GET['trid']) ) {
189
  $original_id = $sitepress->get_original_element_id_by_trid( $_GET['trid'] );
7
  private static $is_wpml_wcml_page;
8
  private static $pagenow;
9
 
10
+ private static $woocommerce_wpml;
11
 
12
+ public static function set_up_resources( &$woocommerce_wpml ) {
13
  global $pagenow;
14
 
15
+ self::$woocommerce_wpml =& $woocommerce_wpml;
16
 
17
  self::$page = isset($_GET['page']) ? $_GET['page'] : null;
18
  self::$tab = isset($_GET['tab']) ? $_GET['tab'] : null;
23
  self::load_js();
24
 
25
  $is_edit_product = self::$pagenow == 'post.php' && isset($_GET['post']) && get_post_type( $_GET['post'] ) == 'product';
26
+ $is_original_product = isset( $_GET['post'] ) && !is_array( $_GET['post'] ) && self::$woocommerce_wpml->products->is_original_product( $_GET['post'] );
27
  $is_new_product = self::$pagenow == 'post-new.php' && isset($_GET['source_lang']) && isset($_GET['post_type']) && $_GET['post_type'] == 'product';
28
 
29
+ if ( ($is_edit_product && !$is_original_product) || $is_new_product && !self::$woocommerce_wpml->settings['trnsl_interface'] ) {
30
  add_action( 'init', array(__CLASS__, 'load_lock_fields_js') );
31
  add_action( 'admin_footer', array(__CLASS__, 'hidden_label') );
32
  }
58
 
59
  private static function load_js() {
60
 
61
+ wp_register_script( 'wcml-scripts', WCML_PLUGIN_URL . '/res/js/scripts' . WCML_JS_MIN . '.js', array(
62
  'jquery',
63
  'jquery-ui-core',
64
  'jquery-ui-resizable'
66
 
67
  if ( self::$is_wpml_wcml_page ) {
68
 
69
+ wp_register_script( 'jquery-cookie', WCML_PLUGIN_URL . '/res/js/jquery.cookie' . WCML_JS_MIN . '.js', array('jquery'), WCML_VERSION );
70
+ wp_register_script( 'wcml-dialogs', WCML_PLUGIN_URL . '/res/js/dialogs' . WCML_JS_MIN . '.js', array('jquery', 'jquery-ui-core', 'jquery-ui-dialog'), WCML_VERSION );
71
+ wp_register_script( 'wcml-troubleshooting', WCML_PLUGIN_URL . '/res/js/troubleshooting' . WCML_JS_MIN . '.js', array('jquery'), WCML_VERSION );
72
 
73
  wp_enqueue_script( 'wcml-dialogs' );
74
  wp_enqueue_script( 'wcml-scripts' );
85
  }
86
 
87
  if ( self::$page == WPML_TM_FOLDER . '/menu/main.php' ) {
88
+ wp_register_script( 'wpml_tm', WCML_PLUGIN_URL . '/res/js/wpml_tm' . WCML_JS_MIN . '.js', array('jquery'), WCML_VERSION );
89
  wp_enqueue_script( 'wpml_tm' );
90
  }
91
 
92
  if ( self::$page == 'wpml-wcml' && self::$tab == 'multi-currency' ) {
93
+ wp_register_script( 'multi-currency', WCML_PLUGIN_URL . '/res/js/multi-currency' . WCML_JS_MIN . '.js', array('jquery', 'jquery-ui-sortable'), WCML_VERSION, true );
94
  wp_enqueue_script( 'multi-currency' );
95
  }
96
 
97
  if ( self::$page == 'wpml-wcml' && self::$tab == 'product-attributes' ) {
98
+ wp_register_script( 'product-attributes', WCML_PLUGIN_URL . '/res/js/product-attributes' . WCML_JS_MIN . '.js', array('jquery'), WCML_VERSION, true );
99
  wp_enqueue_script( 'product-attributes' );
100
  }
101
 
102
  if ( !is_admin() ) {
103
+ wp_register_script( 'cart-widget', WCML_PLUGIN_URL . '/res/js/cart_widget' . WCML_JS_MIN . '.js', array('jquery'), WCML_VERSION );
104
  wp_enqueue_script( 'cart-widget' );
105
  } else {
106
+ wp_register_script( 'wcml-messages', WCML_PLUGIN_URL . '/res/js/wcml-messages' . WCML_JS_MIN . '.js', array('jquery'), WCML_VERSION );
107
  wp_enqueue_script( 'wcml-messages' );
108
  }
109
 
110
  $is_attr_page = apply_filters( 'wcml_is_attributes_page', self::$page == 'product_attributes' && isset( $_GET[ 'post_type' ] ) && $_GET[ 'post_type' ] == 'product' );
111
 
112
  if( $is_attr_page ){
113
+ wp_register_script( 'wcml-attributes', WCML_PLUGIN_URL . '/res/js/wcml-attributes' . WCML_JS_MIN . '.js', array( 'jquery' ), WCML_VERSION );
114
  wp_enqueue_script( 'wcml-attributes' );
115
  }
116
 
117
  if( self::$page == WPML_TM_FOLDER . '/menu/translations-queue.php' ) {
118
  self::load_tooltip_resources();
119
  wp_enqueue_media();
120
+ wp_register_script( 'wcml-editor', WCML_PLUGIN_URL . '/res/js/wcml-translation-editor' . WCML_JS_MIN . '.js', array('jquery', 'jquery-ui-core'), WCML_VERSION);
121
  wp_enqueue_script( 'wcml-editor' );
122
  wp_localize_script( 'wcml-editor', 'strings',
123
  array(
128
  );
129
  }
130
 
131
+
132
+ if ( isset( $_GET['post_type'] ) && 'product' === $_GET['post_type'] && 'edit.php' === self::$pagenow ) {
133
+ self::load_tooltip_resources();
134
+ wp_enqueue_script( 'products-screen-options', WCML_PLUGIN_URL . '/res/js/products-screen-option.js', array( 'jquery', 'wcml-tooltip-init' ), WCML_VERSION );
135
+ wp_localize_script( 'products-screen-options', 'products_screen_option', array( 'nonce' => wp_create_nonce( 'products-screen-option-action' ) ) );
136
+ }
137
  }
138
 
139
  public static function load_tooltip_resources() {
140
 
141
  if ( class_exists( 'woocommerce' ) ) {
142
  wp_register_script( 'jquery-tiptip', WC()->plugin_url() . '/assets/js/jquery-tiptip/jquery.tipTip.min.js', array('jquery'), WC_VERSION, true );
143
+ wp_register_script( 'wcml-tooltip-init', WCML_PLUGIN_URL . '/res/js/tooltip_init' . WCML_JS_MIN . '.js', array('jquery'), WCML_VERSION );
144
  wp_enqueue_script( 'jquery-tiptip' );
145
  wp_enqueue_script( 'wcml-tooltip-init' );
146
  wp_enqueue_style( 'woocommerce_admin_styles', WC()->plugin_url() . '/assets/css/admin.css', array(), WC_VERSION );
150
 
151
  public static function load_lock_fields_js() {
152
 
153
+ wp_register_script( 'wcml-lock-script', WCML_PLUGIN_URL . '/res/js/lock_fields' . WCML_JS_MIN . '.js', array('jquery'), WCML_VERSION );
154
  wp_enqueue_script( 'wcml-lock-script' );
155
 
156
+ $file_path_sync = self::$woocommerce_wpml->settings['file_path_sync'];
157
  if( isset( $_GET[ 'post' ] ) ){
158
+ $original_language = self::$woocommerce_wpml->products->get_original_product_language( $_GET[ 'post' ] );
159
  $original_id = apply_filters( 'translate_object_id', $_GET[ 'post' ], 'product', true, $original_language );
160
  $custom_product_sync = get_post_meta( $original_id, 'wcml_sync_files', true );
161
  if( $custom_product_sync && $custom_product_sync == 'self' ) {
166
  }
167
 
168
  wp_localize_script( 'wcml-lock-script', 'unlock_fields', array(
169
+ 'menu_order' => self::$woocommerce_wpml->settings['products_sync_order'],
170
  'file_paths' => $file_path_sync
171
  )
172
  );
189
  '" style="display: none;position:relative;left:2px;top:2px;">';
190
 
191
  if ( isset($_GET['post']) ) {
192
+ $original_language = self::$woocommerce_wpml->products->get_original_product_language( $_GET['post'] );
193
  $original_id = apply_filters( 'translate_object_id', $_GET['post'], 'product', true, $original_language );
194
  } elseif ( isset($_GET['trid']) ) {
195
  $original_id = $sitepress->get_original_element_id_by_trid( $_GET['trid'] );
inc/class-wcml-wc-strings.php CHANGED
@@ -14,8 +14,6 @@ class WCML_WC_Strings{
14
  add_action( 'registered_taxonomy', array ( $this, 'translate_attributes_label_in_wp_taxonomies' ), 100, 3 );
15
  }
16
 
17
-
18
-
19
  function init(){
20
  global $pagenow, $sitepress;
21
 
@@ -24,25 +22,23 @@ class WCML_WC_Strings{
24
  $this->current_language = $sitepress->get_default_language();
25
  }
26
 
27
-
28
-
29
  //translate attribute label
30
  add_filter('woocommerce_attribute_label',array($this,'translated_attribute_label'),10,3);
31
  add_filter('woocommerce_cart_item_name',array($this,'translated_cart_item_name'),10,3);
32
  add_filter('woocommerce_checkout_product_title',array($this,'translated_checkout_product_title'),10,2);
33
 
34
- if(is_admin() && $pagenow == 'options-permalink.php'){
35
  add_filter( 'gettext_with_context', array( $this, 'category_base_in_strings_language' ), 99, 3 );
36
  add_action( 'admin_footer', array( $this, 'show_custom_url_base_translation_links' ) );
37
  add_action('admin_footer', array($this, 'show_custom_url_base_language_requirement'));
38
  }
39
  add_action( 'woocommerce_product_options_attributes', array ( $this, 'notice_after_woocommerce_product_options_attributes' ) );
40
 
41
- add_filter( 'woocommerce_attribute_taxonomies', array( $this, 'translate_attribute_taxonomies_labels') );
 
 
42
 
43
  add_filter('woocommerce_get_breadcrumb', array($this, 'filter_woocommerce_breadcrumbs' ), 10, 2 );
44
-
45
-
46
  }
47
 
48
  function translated_attribute_label($label, $name, $product_obj = false){
14
  add_action( 'registered_taxonomy', array ( $this, 'translate_attributes_label_in_wp_taxonomies' ), 100, 3 );
15
  }
16
 
 
 
17
  function init(){
18
  global $pagenow, $sitepress;
19
 
22
  $this->current_language = $sitepress->get_default_language();
23
  }
24
 
 
 
25
  //translate attribute label
26
  add_filter('woocommerce_attribute_label',array($this,'translated_attribute_label'),10,3);
27
  add_filter('woocommerce_cart_item_name',array($this,'translated_cart_item_name'),10,3);
28
  add_filter('woocommerce_checkout_product_title',array($this,'translated_checkout_product_title'),10,2);
29
 
30
+ if( is_admin() && $pagenow == 'options-permalink.php' ){
31
  add_filter( 'gettext_with_context', array( $this, 'category_base_in_strings_language' ), 99, 3 );
32
  add_action( 'admin_footer', array( $this, 'show_custom_url_base_translation_links' ) );
33
  add_action('admin_footer', array($this, 'show_custom_url_base_language_requirement'));
34
  }
35
  add_action( 'woocommerce_product_options_attributes', array ( $this, 'notice_after_woocommerce_product_options_attributes' ) );
36
 
37
+ if( !is_admin() ){
38
+ add_filter( 'woocommerce_attribute_taxonomies', array( $this, 'translate_attribute_taxonomies_labels') );
39
+ }
40
 
41
  add_filter('woocommerce_get_breadcrumb', array($this, 'filter_woocommerce_breadcrumbs' ), 10, 2 );
 
 
42
  }
43
 
44
  function translated_attribute_label($label, $name, $product_obj = false){
inc/class-woocommerce-wpml.php CHANGED
@@ -61,6 +61,11 @@ class woocommerce_wpml {
61
  /** @var WCML_WooCommerce_Rest_API_Support */
62
  private $wc_rest_api;
63
 
 
 
 
 
 
64
 
65
  public function __construct(){
66
 
@@ -155,6 +160,8 @@ class woocommerce_wpml {
155
  $this->media = new WCML_Media( $this, $sitepress, $wpdb );
156
  $this->downloadable = new WCML_Downloadable_Products( $this, $sitepress );
157
  $this->reports = new WCML_Reports;
 
 
158
 
159
  new WCML_Ajax_Setup;
160
 
@@ -264,5 +271,4 @@ class woocommerce_wpml {
264
  }
265
 
266
  }
267
-
268
  }
61
  /** @var WCML_WooCommerce_Rest_API_Support */
62
  private $wc_rest_api;
63
 
64
+ /**
65
+ * @var WCML_Screen_Options
66
+ */
67
+ private $wcml_products_screen;
68
+
69
 
70
  public function __construct(){
71
 
160
  $this->media = new WCML_Media( $this, $sitepress, $wpdb );
161
  $this->downloadable = new WCML_Downloadable_Products( $this, $sitepress );
162
  $this->reports = new WCML_Reports;
163
+ $this->wcml_products_screen = new WCML_Products_Screen_Options( $sitepress );
164
+ $this->wcml_products_screen->init();
165
 
166
  new WCML_Ajax_Setup;
167
 
271
  }
272
 
273
  }
 
274
  }
inc/constants.php CHANGED
@@ -5,4 +5,6 @@ define('WCML_MULTI_CURRENCIES_PER_LANGUAGE', 1); //obsolete - migrate to 2
5
  define('WCML_MULTI_CURRENCIES_INDEPENDENT', 2);
6
 
7
  define( 'WCML_TRANSLATION_METHOD_MANUAL', 0);
8
- define( 'WCML_TRANSLATION_METHOD_EDITOR', 1);
 
 
5
  define('WCML_MULTI_CURRENCIES_INDEPENDENT', 2);
6
 
7
  define( 'WCML_TRANSLATION_METHOD_MANUAL', 0);
8
+ define( 'WCML_TRANSLATION_METHOD_EDITOR', 1);
9
+
10
+ define( 'WCML_JS_MIN', defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min');
inc/currencies/class-wcml-custom-prices.php CHANGED
@@ -269,7 +269,7 @@ class WCML_Custom_Prices{
269
 
270
  private function load_custom_prices_js_css(){
271
  wp_register_style( 'wpml-wcml-prices', WCML_PLUGIN_URL . '/res/css/wcml-prices.css', null, WCML_VERSION );
272
- wp_register_script( 'wcml-tm-scripts-prices', WCML_PLUGIN_URL . '/res/js/prices.js', array( 'jquery' ), WCML_VERSION );
273
 
274
  wp_enqueue_style('wpml-wcml-prices');
275
  wp_enqueue_script('wcml-tm-scripts-prices');
269
 
270
  private function load_custom_prices_js_css(){
271
  wp_register_style( 'wpml-wcml-prices', WCML_PLUGIN_URL . '/res/css/wcml-prices.css', null, WCML_VERSION );
272
+ wp_register_script( 'wcml-tm-scripts-prices', WCML_PLUGIN_URL . '/res/js/prices' . WCML_JS_MIN . '.js', array( 'jquery' ), WCML_VERSION );
273
 
274
  wp_enqueue_style('wpml-wcml-prices');
275
  wp_enqueue_script('wcml-tm-scripts-prices');
inc/currencies/class-wcml-multi-currency-install.php CHANGED
@@ -2,16 +2,16 @@
2
 
3
  class WCML_Multi_Currency_Install{
4
  static $multi_currency;
5
- static $woocommerce_wcml;
6
 
7
  public static function set_up( &$multi_currency, &$woocommerce_wpml ){
8
 
9
  self::$multi_currency =& $multi_currency;
10
- self::$woocommerce_wcml =& $woocommerce_wpml;
11
 
12
- if(empty(self::$woocommerce_wcml->settings['multi_currency']['set_up'])){
13
- self::$woocommerce_wcml->settings['multi_currency']['set_up'] = 1;
14
- self::$woocommerce_wcml->update_settings();
15
 
16
  self::set_default_currencies_languages();
17
  }
@@ -22,7 +22,7 @@ class WCML_Multi_Currency_Install{
22
  public static function set_default_currencies_languages( $old_value = false, $new_value = false ){
23
  global $sitepress;
24
 
25
- $settings = self::$woocommerce_wcml->get_settings();
26
  $active_languages = $sitepress->get_active_languages();
27
  $wc_currency = $new_value ? $new_value : get_option('woocommerce_currency');
28
 
@@ -45,7 +45,7 @@ class WCML_Multi_Currency_Install{
45
  }
46
  }
47
 
48
- self::$woocommerce_wcml->update_settings( $settings );
49
 
50
  }
51
 
2
 
3
  class WCML_Multi_Currency_Install{
4
  static $multi_currency;
5
+ static $woocommerce_wpml;
6
 
7
  public static function set_up( &$multi_currency, &$woocommerce_wpml ){
8
 
9
  self::$multi_currency =& $multi_currency;
10
+ self::$woocommerce_wpml =& $woocommerce_wpml;
11
 
12
+ if(empty(self::$woocommerce_wpml->settings['multi_currency']['set_up'])){
13
+ self::$woocommerce_wpml->settings['multi_currency']['set_up'] = 1;
14
+ self::$woocommerce_wpml->update_settings();
15
 
16
  self::set_default_currencies_languages();
17
  }
22
  public static function set_default_currencies_languages( $old_value = false, $new_value = false ){
23
  global $sitepress;
24
 
25
+ $settings = self::$woocommerce_wpml->get_settings();
26
  $active_languages = $sitepress->get_active_languages();
27
  $wc_currency = $new_value ? $new_value : get_option('woocommerce_currency');
28
 
45
  }
46
  }
47
 
48
+ self::$woocommerce_wpml->update_settings( $settings );
49
 
50
  }
51
 
inc/currencies/class-wcml-multi-currency-prices.php CHANGED
@@ -269,11 +269,13 @@ class WCML_Multi_Currency_Prices{
269
 
270
  public function apply_rounding_rules($price, $currency = false ){
271
 
272
- if( !$currency )
273
  $currency = $this->multi_currency->get_client_currency();
 
 
274
  $currency_options = $this->woocommerce_wpml->settings['currency_options'][$currency];
275
 
276
- if($currency_options['rounding'] != 'disabled'){
277
 
278
  if($currency_options['rounding_increment'] > 1){
279
  $price = $price / $currency_options['rounding_increment'];
@@ -314,7 +316,7 @@ class WCML_Multi_Currency_Prices{
314
  } else {
315
 
316
  // Use configured number of decimals
317
- $price = floor( $price * pow( 10, $currency_options['num_decimals']) ) / pow( 10, $currency_options['num_decimals'] );
318
 
319
  }
320
 
@@ -426,7 +428,9 @@ class WCML_Multi_Currency_Prices{
426
  public function filter_woocommerce_cart_subtotal( $cart_subtotal, $compound, $obj ){
427
  global $woocommerce;
428
  remove_filter( 'woocommerce_cart_subtotal', array( $this, 'filter_woocommerce_cart_subtotal'), 100, 3 );
429
- $woocommerce->cart->calculate_totals();
 
 
430
  $cart_subtotal = $woocommerce->cart->get_cart_subtotal( $compound );
431
  add_filter( 'woocommerce_cart_subtotal', array( $this, 'filter_woocommerce_cart_subtotal'), 100, 3 );
432
 
269
 
270
  public function apply_rounding_rules($price, $currency = false ){
271
 
272
+ if( !$currency ){
273
  $currency = $this->multi_currency->get_client_currency();
274
+ }
275
+
276
  $currency_options = $this->woocommerce_wpml->settings['currency_options'][$currency];
277
 
278
+ if( $currency_options['rounding'] != 'disabled' ){
279
 
280
  if($currency_options['rounding_increment'] > 1){
281
  $price = $price / $currency_options['rounding_increment'];
316
  } else {
317
 
318
  // Use configured number of decimals
319
+ $price = floor( $price * pow( 10, $currency_options['num_decimals']) + 0.0001 ) / pow( 10, $currency_options['num_decimals'] );
320
 
321
  }
322
 
428
  public function filter_woocommerce_cart_subtotal( $cart_subtotal, $compound, $obj ){
429
  global $woocommerce;
430
  remove_filter( 'woocommerce_cart_subtotal', array( $this, 'filter_woocommerce_cart_subtotal'), 100, 3 );
431
+ if( apply_filters( 'wcml_calculate_totals_exception', true ) ) {
432
+ $woocommerce->cart->calculate_totals();
433
+ }
434
  $cart_subtotal = $woocommerce->cart->get_cart_subtotal( $compound );
435
  add_filter( 'woocommerce_cart_subtotal', array( $this, 'filter_woocommerce_cart_subtotal'), 100, 3 );
436
 
inc/currencies/class-wcml-multi-currency-resources.php CHANGED
@@ -22,8 +22,9 @@ class WCML_Multi_Currency_Resources{
22
  }
23
 
24
  private static function load_inline_js(){
 
25
 
26
- wp_register_script('wcml-mc-scripts', WCML_PLUGIN_URL . '/res/js/wcml-multi-currency.js', array('jquery'), WCML_VERSION, true);
27
 
28
  wp_enqueue_script('wcml-mc-scripts');
29
 
22
  }
23
 
24
  private static function load_inline_js(){
25
+ global $woocommerce_wpml;
26
 
27
+ wp_register_script('wcml-mc-scripts', WCML_PLUGIN_URL . '/res/js/wcml-multi-currency' . WCML_JS_MIN . '.js', array('jquery'), WCML_VERSION, true);
28
 
29
  wp_enqueue_script('wcml-mc-scripts');
30
 
inc/currencies/class-wcml-multi-currency.php CHANGED
@@ -64,6 +64,8 @@ class WCML_Multi_Currency{
64
 
65
  WCML_Multi_Currency_Install::set_up( $this, $woocommerce_wpml );
66
 
 
 
67
  if( $this->_load_filters()) {
68
  $this->prices = new WCML_Multi_Currency_Prices( $this );
69
  $this->coupons = new WCML_Multi_Currency_Coupons();
@@ -83,8 +85,6 @@ class WCML_Multi_Currency{
83
  WCML_Multi_Currency_Resources::set_up( $this );
84
  WCML_Multi_Currency_Configuration::set_up( $this, $woocommerce_wpml );
85
 
86
- $this->init_currencies();
87
-
88
  add_filter('init', array($this, 'init'), 5);
89
 
90
  if( is_ajax() ){
@@ -320,7 +320,12 @@ class WCML_Multi_Currency{
320
  $this->client_currency = $_COOKIE['_wcml_order_currency'];
321
  }
322
 
323
- if( is_null($this->client_currency) && isset($default_currencies[$current_language]) && $default_currencies[$current_language] && !empty($woocommerce->session) && $current_language != $woocommerce->session->get('client_currency_language') ){
 
 
 
 
 
324
  $this->client_currency = $default_currencies[$current_language];
325
  }
326
 
@@ -336,15 +341,14 @@ class WCML_Multi_Currency{
336
  }
337
 
338
  // client currency in general / if enabled for this language
339
- if(is_null($this->client_currency) && !empty($woocommerce->session) ){
340
  $session_currency = $woocommerce->session->get('client_currency');
341
  if($session_currency && !empty($this->currencies[$session_currency]['languages'][$current_language])){
342
  $this->client_currency = $woocommerce->session->get('client_currency');
343
  }
344
-
345
  }
346
 
347
- if(is_null($this->client_currency)){
348
  $woocommerce_currency = get_option('woocommerce_currency');
349
 
350
  // fall on WC currency if enabled for this language
64
 
65
  WCML_Multi_Currency_Install::set_up( $this, $woocommerce_wpml );
66
 
67
+ $this->init_currencies();
68
+
69
  if( $this->_load_filters()) {
70
  $this->prices = new WCML_Multi_Currency_Prices( $this );
71
  $this->coupons = new WCML_Multi_Currency_Coupons();
85
  WCML_Multi_Currency_Resources::set_up( $this );
86
  WCML_Multi_Currency_Configuration::set_up( $this, $woocommerce_wpml );
87
 
 
 
88
  add_filter('init', array($this, 'init'), 5);
89
 
90
  if( is_ajax() ){
320
  $this->client_currency = $_COOKIE['_wcml_order_currency'];
321
  }
322
 
323
+ if( is_null($this->client_currency) &&
324
+ isset($default_currencies[$current_language]) &&
325
+ $default_currencies[$current_language] &&
326
+ !empty($woocommerce->session) &&
327
+ $current_language != $woocommerce->session->get('client_currency_language') )
328
+ {
329
  $this->client_currency = $default_currencies[$current_language];
330
  }
331
 
341
  }
342
 
343
  // client currency in general / if enabled for this language
344
+ if( is_null( $this->client_currency ) && !empty( $woocommerce->session ) ){
345
  $session_currency = $woocommerce->session->get('client_currency');
346
  if($session_currency && !empty($this->currencies[$session_currency]['languages'][$current_language])){
347
  $this->client_currency = $woocommerce->session->get('client_currency');
348
  }
 
349
  }
350
 
351
+ if( is_null( $this->client_currency ) ){
352
  $woocommerce_currency = get_option('woocommerce_currency');
353
 
354
  // fall on WC currency if enabled for this language
inc/missing-php-functions.php CHANGED
@@ -33,23 +33,6 @@ if (get_magic_quotes_gpc()) {
33
  $_COOKIE = array_map('stripslashes_deep', $_COOKIE);
34
  }
35
  /* PHP 5.3 - end */
36
-
37
- //WPML
38
- if(!function_exists('wpml_filter_include_url')) {
39
- function wpml_filter_include_url( $result ) {
40
- if ( isset( $_SERVER[ 'HTTP_HOST' ] ) ) {
41
- $http_host_parts = explode( ':', $_SERVER[ 'HTTP_HOST' ] );
42
- unset( $http_host_parts[ 1 ] );
43
- $http_host_without_port = implode( $http_host_parts );
44
- $path = str_replace( parse_url( $result, PHP_URL_HOST ), $http_host_without_port, $result );
45
- } else {
46
- $path = '';
47
- }
48
-
49
- return $path;
50
- }
51
- }
52
-
53
 
54
  add_action('plugins_loaded', 'wcml_check_wpml_functions');
55
 
33
  $_COOKIE = array_map('stripslashes_deep', $_COOKIE);
34
  }
35
  /* PHP 5.3 - end */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
36
 
37
  add_action('plugins_loaded', 'wcml_check_wpml_functions');
38
 
inc/template-classes/class-wcml-custom-files-ui.php CHANGED
@@ -16,7 +16,7 @@ class WCML_Custom_Files_UI extends WPML_Templates_Factory {
16
  * @param int $product_id
17
  * @param bool $is_variation
18
  */
19
- function __construct( &$woocommerce_wpml, $product_id, $is_variation = false ){
20
  parent::__construct();
21
 
22
  $this->woocommerce_wpml = &$woocommerce_wpml;
16
  * @param int $product_id
17
  * @param bool $is_variation
18
  */
19
+ function __construct( &$woocommerce_wpml, $product_id, $is_variation = false ) {
20
  parent::__construct();
21
 
22
  $this->woocommerce_wpml = &$woocommerce_wpml;
inc/translation-editor/class-wcml-downloadable-products.php CHANGED
@@ -55,7 +55,7 @@ class WCML_Downloadable_Products{
55
 
56
  public function load_custom_files_js_css(){
57
  wp_register_style( 'wpml-wcml-files', WCML_PLUGIN_URL . '/res/css/wcml-files.css', null, WCML_VERSION );
58
- wp_register_script( 'wcml-scripts-files', WCML_PLUGIN_URL . '/res/js/files.js', array( 'jquery' ), WCML_VERSION );
59
 
60
  wp_enqueue_style('wpml-wcml-files');
61
  wp_enqueue_script('wcml-scripts-files');
55
 
56
  public function load_custom_files_js_css(){
57
  wp_register_style( 'wpml-wcml-files', WCML_PLUGIN_URL . '/res/css/wcml-files.css', null, WCML_VERSION );
58
+ wp_register_script( 'wcml-scripts-files', WCML_PLUGIN_URL . '/res/js/files' . WCML_JS_MIN . '.js', array( 'jquery' ), WCML_VERSION );
59
 
60
  wp_enqueue_style('wpml-wcml-files');
61
  wp_enqueue_script('wcml-scripts-files');
inc/translation-editor/class-wcml-synchronize-product-data.php CHANGED
@@ -310,6 +310,7 @@ class WCML_Synchronize_Product_Data{
310
  $args = array();
311
  $args[ 'post_parent' ] = is_null( $tr_parent_id )? 0 : $tr_parent_id;
312
  //sync product date
 
313
  if( !empty( $this->woocommerce_wpml->settings[ 'products_sync_date' ] ) ){
314
  $args[ 'post_date' ] = $orig_product->post_date;
315
  }
@@ -387,9 +388,11 @@ class WCML_Synchronize_Product_Data{
387
  if( $is_original ){
388
  if( !$translation->original ){
389
  $this->sync_product_data( $product->id, $translation->element_id, $translation->language_code );
 
390
  }
391
  }elseif( $translation->original ){
392
  $this->sync_product_data( $translation->element_id, $product->id, $this->sitepress->get_language_for_element( $product->id, 'post_product' ) );
 
393
  }
394
  }
395
  }
310
  $args = array();
311
  $args[ 'post_parent' ] = is_null( $tr_parent_id )? 0 : $tr_parent_id;
312
  //sync product date
313
+
314
  if( !empty( $this->woocommerce_wpml->settings[ 'products_sync_date' ] ) ){
315
  $args[ 'post_date' ] = $orig_product->post_date;
316
  }
388
  if( $is_original ){
389
  if( !$translation->original ){
390
  $this->sync_product_data( $product->id, $translation->element_id, $translation->language_code );
391
+ $this->sync_date_and_parent( $product->id, $translation->element_id, $translation->language_code );
392
  }
393
  }elseif( $translation->original ){
394
  $this->sync_product_data( $translation->element_id, $product->id, $this->sitepress->get_language_for_element( $product->id, 'post_product' ) );
395
+ $this->sync_date_and_parent( $translation->element_id, $product->id, $this->sitepress->get_language_for_element( $product->id, 'post_product' ) );
396
  }
397
  }
398
  }
inc/translation-editor/class-wcml-translation-editor.php CHANGED
@@ -2,6 +2,9 @@
2
 
3
  class WCML_Translation_Editor{
4
 
 
 
 
5
  private $woocommerce_wpml;
6
  /**
7
  * @var SitePress
@@ -257,10 +260,59 @@ class WCML_Translation_Editor{
257
  }
258
 
259
  public function auto_generate_slug(){
 
 
260
  $title = filter_input( INPUT_POST, 'title');
261
 
262
  $post_name = urldecode( sanitize_title( $title ) );
263
- $slug = wp_unique_post_slug( $post_name, 0, 'draft', 'product', 0);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
264
 
265
  echo json_encode( array('slug' => $slug) );
266
  exit;
2
 
3
  class WCML_Translation_Editor{
4
 
5
+ /**
6
+ * @var woocommerce_wpml
7
+ */
8
  private $woocommerce_wpml;
9
  /**
10
  * @var SitePress
260
  }
261
 
262
  public function auto_generate_slug(){
263
+ global $wpdb;
264
+
265
  $title = filter_input( INPUT_POST, 'title');
266
 
267
  $post_name = urldecode( sanitize_title( $title ) );
268
+ $job_id = intval( $_POST['job_id'] );
269
+
270
+ $post_id_sql = "
271
+ SELECT t.element_id
272
+ FROM {$wpdb->prefix}icl_translations t
273
+ LEFT JOIN {$wpdb->prefix}icl_translation_status s ON t.translation_id = s.translation_id
274
+ LEFT JOIN {$wpdb->prefix}icl_translate_job j ON s.rid = j.rid
275
+ WHERE j.job_id = %d
276
+ ";
277
+ $post_id = $wpdb->get_var( $wpdb->prepare( $post_id_sql, $job_id ) );
278
+
279
+ if( $post_id ) {
280
+ $slug = wp_unique_post_slug( $post_name, $post_id, 'publish', 'product', 0 );
281
+ }else{
282
+ // handle the special case when the post for this slug has not been created yet
283
+ $lang_sql = "
284
+ SELECT t.language_code
285
+ FROM {$wpdb->prefix}icl_translations t
286
+ LEFT JOIN {$wpdb->prefix}icl_translation_status s ON t.translation_id = s.translation_id
287
+ LEFT JOIN {$wpdb->prefix}icl_translate_job j ON s.rid = j.rid
288
+ WHERE j.job_id = %d
289
+ ";
290
+ $lang = $wpdb->get_var( $wpdb->prepare( $lang_sql, $job_id ) );
291
+
292
+ $check_sql = "
293
+ SELECT p.post_name
294
+ FROM {$wpdb->posts} p
295
+ LEFT JOIN {$wpdb->prefix}icl_translations t
296
+ ON t.element_id = p.ID AND t.element_type='post_product'
297
+ WHERE p.post_name = %s AND t.language_code = %s LIMIT 1
298
+ ";
299
+ $post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql, $post_name, $lang) );
300
+
301
+ if( $post_name_check ) {
302
+ $suffix = 2;
303
+ do {
304
+
305
+ $alt_post_name = _truncate_post_slug( $post_name, 200 - ( strlen( $suffix ) + 1 ) ) . "-$suffix";
306
+ $post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql, $alt_post_name, $lang ) );
307
+ $suffix++;
308
+
309
+ } while ( $post_name_check );
310
+ $slug = $alt_post_name;
311
+ } else{
312
+ $slug = $post_name;
313
+ }
314
+
315
+ }
316
 
317
  echo json_encode( array('slug' => $slug) );
318
  exit;
locale/woocommerce-multilingual-ar.po ADDED
@@ -0,0 +1,1214 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # This file was generated by WPML
2
+ # WPML is a WordPress plugin that can turn any WordPress site into a full featured multilingual content management system.
3
+ # https://wpml.org
4
+ msgid ""
5
+ msgstr "Content-Type: text/plain; charset=utf-8\nContent-Transfer-Encoding: 8bit\nProject-Id-Version:WPML_EXPORT\nPOT-Creation-Date: \nPO-Revision-Date: \nLast-Translator: \nLanguage-Team: \nLanguage:en\nMIME-Version: 1.0\n"
6
+
7
+ msgid "Introduction"
8
+ msgstr "مقدمة"
9
+
10
+ msgid "Store Pages"
11
+ msgstr "صفحات المتجر"
12
+
13
+ msgid "Global Attributes"
14
+ msgstr "السمات الشاملة"
15
+
16
+ msgid "Multiple Currencies"
17
+ msgstr "عملات متعددة"
18
+
19
+ msgid "Translation Interface"
20
+ msgstr "واجهة الترجمة"
21
+
22
+ msgid "Ready!"
23
+ msgstr "مستعد!"
24
+
25
+ msgid "Welcome to %sWooCommerce Multilingual!%s Please take a moment to configure the main settings and then you are ready to start translating your products."
26
+ msgstr "مرحبًا بك مع %sWooCommerce متعدد اللغات!%s برجاء تكوين الإعدادات الأساسية، وبعدها ستكون جاهزًا للبدء في ترجمة منتجاتك."
27
+
28
+ msgid "Action failed. Please refresh the page and retry."
29
+ msgstr "فشل الإجراء. برجاء إعادة تحميل الصفحة وإعادة المحاولة."
30
+
31
+ msgid "Cheatin&#8217; huh?"
32
+ msgstr "أتغش&#8217; حقًا؟"
33
+
34
+ msgid "Run the Setup Wizard"
35
+ msgstr "بدء معالج الإعداد"
36
+
37
+ msgid "Skip Setup"
38
+ msgstr "تخطي الإعداد"
39
+
40
+ msgid "WooCommerce Multilingual &rsaquo; Setup Wizard"
41
+ msgstr "WooCommerce متعدد اللغات &rsaquo; معالج الإعداد"
42
+
43
+ msgid "WooCommerce Multilingual"
44
+ msgstr "WooCommerce متعدد اللغات"
45
+
46
+ msgid "How to translate products"
47
+ msgstr "كيفية ترجمة المنتجات"
48
+
49
+ msgid "Quick edit is disabled for product translations. It's recommended to use the %s for editing products translations. %s"
50
+ msgstr "التحرير السريع معطل لترجمات المنتج. من الموصى به استخدام %s لتحرير ترجمات المنتجات. %s"
51
+
52
+ msgid "WooCommerce Multilingual products editor"
53
+ msgstr "محرر منتجات WooCommerce متعدد اللغات"
54
+
55
+ msgid "Edit this product translation"
56
+ msgstr "تحرير ترجمة المنتج هذه"
57
+
58
+ msgid "How to translate attributes"
59
+ msgstr "كيفية ترجمة السمات"
60
+
61
+ msgid "How to translate product categories"
62
+ msgstr "كيفية ترجمة فئات المنتج"
63
+
64
+ msgid "The recommended way to translate WooCommerce products is using the\n %sWooCommerce Multilingual products translation%s page.\n Please use this page only for translating elements that are not available in the WooCommerce Multilingual products translation table."
65
+ msgstr "الطريقة الموصى بها لترجمة منتجات WooCommerce تكون باستخدم صفحة\n %sترجمة منتجات WooCommerce متعدد اللغات%s.\n برجاء استخدام هذه الصفحة فقط لترجمة العناصر غير المتاحة في جدول ترجمة منتجات WooCommerce متعدد اللغات."
66
+
67
+ msgid "In order to edit custom attributes you need to use the <a href=\"%s\">custom product translation editor</a>"
68
+ msgstr "كي يمكنك تحرير السمات المخصصة، فأنت في حاجة إلى استخدام <a href=\"%s\">المحرر المخصص لترجمة المنتجات</a>"
69
+
70
+ msgid "You are using the same value as for the regular category base. This is known to create conflicts resulting in urls not working properly."
71
+ msgstr "أنت تستخدم نفس القيمة التي تستخدمها لقاعدة الفئة العادية. هذا معروف لإنشاء التعارضات الناتجة في المسارات التي لا تعمل كما ينبغي."
72
+
73
+ msgid "translations"
74
+ msgstr "ترجمات"
75
+
76
+ msgid "product"
77
+ msgstr "منتج"
78
+
79
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">WPML</a> versions prior %s."
80
+ msgstr "WooCommerce Multilingual ممكّن ولكنه غير مفعّل. غير متوافق مع إصدارات <a href=\"%s\">WPML</a> السابقة لـ %s."
81
+
82
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">Woocommerce</a> versions prior %s."
83
+ msgstr "WooCommerce متعدد اللغات مُمكّن ولكنه غير فعال. فهو غير متوافق مع إصدارات <a href=\"%s\">Woocommerce</a> التي تسبق %s."
84
+
85
+ msgid "You are using WooCommerce Multilingual %s. This version includes an important UI redesign for the configuration screens and it requires <a href=\"%s\">WPML %s</a> or higher. Everything still works on the front end now but, in order to configure options for WooCommerce Multilingual, you need to upgrade WPML."
86
+ msgstr "أنت تستخدم WooCommerce متعدد اللغات %s. هذه الإصدار يشتمل على إعادة تصميم هامة لواجهة المستخدم لشاشات التكوين، وهو ما يتطلب الإصدار <a href=\"%s\">WPML %s</a> أو أعلى. كل شيء ما زال يعمل على الواجهة الأمامية الآن، ولكن لتكوين الخيارات لـ WooCommerce متعدد اللغات، فأنت في حاجة إلى ترقية WPML."
87
+
88
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">WPML Translation Management</a> versions prior %s."
89
+ msgstr "WooCommerce Multilingual ممكّن ولكنه غير مفعّل. غير متوافق مع إصدارات <a href=\"%s\">إدارة ترجمة WPML</a> السابقة لـ %s."
90
+
91
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">WPML String Translation</a> versions prior %s."
92
+ msgstr "WooCommerce Multilingual ممكّن ولكنه غير مفعّل. غير متوافق مع إصدارات <a href=\"%s\">ترجمة متسلسلات WPML</a> السابقة لـ %s."
93
+
94
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">WPML Media</a> versions prior %s."
95
+ msgstr "WooCommerce Multilingual ممكّن ولكنه غير مفعّل. غير متوافق مع إصدارات <a href=\"%s\">WPML ميديا</a> السابقة لـ %s."
96
+
97
+ msgid "and"
98
+ msgstr "و"
99
+
100
+ msgid "WooCommerce Multilingual is enabled but not effective. It requires %s in order to work."
101
+ msgstr "WooCommerce Multilingual ممكّن ولكن غير فعّال. يحتاج إلى %s ليعمل."
102
+
103
+ msgid "Permalink settings"
104
+ msgstr "إعدادات الرابط الثابت"
105
+
106
+ msgid "Configure products slug translation"
107
+ msgstr "تهيئة ترجمة الارتباط الثابت للمنتجات"
108
+
109
+ msgid "If you want different slugs for shop pages (%s/%s), you need to disable the shop prefix for products in <a href=\"%s\">WooCommerce Settings</a>"
110
+ msgstr "إذا كنت ترغب في روابط لطيفة مختلفة لصفحات السوق (%s/%s)، فأنت في حاجة لتعطيل بادئة السوق للمنتجات في <a href=\"%s\">إعدادات WooCommerce</a>"
111
+
112
+ msgid "Finished! You can visit the %sstrings translation%s screen to translate the strings now."
113
+ msgstr "تم الإنجاز! يمكنك زيارة شاشة %sترجمة المتسلسلات%s لترجمة المتسلسلات الآن."
114
+
115
+ msgid "wpml-config.xml file missing from WooCommerce Multilingual folder."
116
+ msgstr "ملف wpml-config.xml مفقود من مجلد WooCommerce متعدد اللغات."
117
+
118
+ msgid "Custom field %s configuration from wpml-config.xml file was altered!"
119
+ msgstr "تم تغيير تهيئة الحقل المخصص %s من الملف wpml-config.xml!"
120
+
121
+ msgid "Custom type %s configuration from wpml-config.xml file was altered!"
122
+ msgstr "تم تغيير تهيئة النوع المخصص %s من الملف wpml-config.xml!"
123
+
124
+ msgid "Custom taxonomy %s configuration from wpml-config.xml file was altered!"
125
+ msgstr "تم تغيير تهيئة التصنيف المخصص %s من الملف wpml-config.xml!"
126
+
127
+ msgid "Upgrade WPML"
128
+ msgstr "ترقية WPML"
129
+
130
+ msgid "Invalid language parameter: %s"
131
+ msgstr "معيار لغة غير صالح: %s"
132
+
133
+ msgid "Source product id not found: %s"
134
+ msgstr "لم يتم العثور على معرف هوية المنتج الأساسي: %s"
135
+
136
+ msgid "Product Base"
137
+ msgstr "قاعدة المنتج"
138
+
139
+ msgid "Product Tag Base"
140
+ msgstr "قاعدة علامة المنتج"
141
+
142
+ msgid "Product Category Base"
143
+ msgstr "قاعدة فئة المنتج"
144
+
145
+ msgid "Product Attribute Base"
146
+ msgstr "قاعدة سمة المنتج"
147
+
148
+ msgid "Endpoint: %s"
149
+ msgstr "نقطة النهاية: %s"
150
+
151
+ msgid "product-category"
152
+ msgstr "product-category"
153
+
154
+ msgid "product-tag"
155
+ msgstr "product-tag"
156
+
157
+ msgid "Original language"
158
+ msgstr "اللغة الأصلية"
159
+
160
+ msgid "Take this and edit"
161
+ msgstr "قبول هذا والتحرير"
162
+
163
+ msgid "Add translation"
164
+ msgstr "إضافة ترجمة"
165
+
166
+ msgid "Update translation"
167
+ msgstr "تحديث الترجمة"
168
+
169
+ msgid "Finish translating"
170
+ msgstr "إنهاء الترجمة"
171
+
172
+ msgid "Edit translation"
173
+ msgstr "تحرير الترجمة"
174
+
175
+ msgid "Edit this item inline"
176
+ msgstr "تحرير هذا العنصر بشكلٍ مضمن"
177
+
178
+ msgid "Quick Edit"
179
+ msgstr "التحرير السريع"
180
+
181
+ msgid "Translation in progress"
182
+ msgstr "الترجمة قيد التنفيذ"
183
+
184
+ msgid "Invalid nonce"
185
+ msgstr "nonce غير صالح"
186
+
187
+ msgid "Currency - no orders found"
188
+ msgstr "العملة - لم يتم العثور على أي طلبات"
189
+
190
+ msgid "Currencies order updated"
191
+ msgstr "تم تحديث ترتيب العملات"
192
+
193
+ msgid "Currency switcher"
194
+ msgstr "محوّل العملة"
195
+
196
+ msgid "Configure options"
197
+ msgstr "تهيئة الخيارات"
198
+
199
+ msgid "Settings saved!"
200
+ msgstr "تم حفظ الإعدادات!"
201
+
202
+ msgid "Add new currency"
203
+ msgstr "إضافة عملة جديدة"
204
+
205
+ msgid "Update currency"
206
+ msgstr "تحديث العملة"
207
+
208
+ msgid "Update settings for %s"
209
+ msgstr "تحديث الإعدادات لـ %s"
210
+
211
+ msgid "The default currency was changed. In order to show accurate prices in all currencies, you need to update the exchange rates under the %sMulti-currency%s configuration."
212
+ msgstr "لقد تغيرت العملة الافتراضية. لعرض الأسعار الدقيقة بجميع العملات، فأنت في حاجة إلى تحدث أسعار الصرف في قائمة التكوين %sالعملات المتعددة%s."
213
+
214
+ msgid "All the products will be removed from the current order in order to change the currency"
215
+ msgstr "ستتم إزالة جميع المنتجات من الطلب الحالي كي يتم تغيير العملة"
216
+
217
+ msgid "Show all currencies"
218
+ msgstr "عرض جميع العملات"
219
+
220
+ msgid "Order currency:"
221
+ msgstr "عملة الطلب:"
222
+
223
+ msgid "Cart"
224
+ msgstr "سلة الشراء"
225
+
226
+ msgid "Checkout"
227
+ msgstr "المعاينة"
228
+
229
+ msgid "Checkout &rarr; Pay"
230
+ msgstr "المعاينة &rarr; الدفع"
231
+
232
+ msgid "Order Received"
233
+ msgstr "تم استلام طلب الشراء"
234
+
235
+ msgid "My Account"
236
+ msgstr "حسابي"
237
+
238
+ msgid "Change Password"
239
+ msgstr "تغيير كلمة المرور"
240
+
241
+ msgid "Edit My Address"
242
+ msgstr "تعديل عنواني"
243
+
244
+ msgid "Logout"
245
+ msgstr "تسجيل الخروج"
246
+
247
+ msgid "Lost Password"
248
+ msgstr "كلمة المرور مفقودة"
249
+
250
+ msgid "View Order"
251
+ msgstr "عرض طلب الشراء"
252
+
253
+ msgid "Shop"
254
+ msgstr "السوق"
255
+
256
+ msgid "All the products will be removed from the current order in order to change the language"
257
+ msgstr "ستتم إزالة جميع المنتجات من الطلب الحالي كي يتم تغيير اللغة"
258
+
259
+ msgid "Order language:"
260
+ msgstr "لغة الطلب:"
261
+
262
+ msgid "Choose a file"
263
+ msgstr "اختر ملف"
264
+
265
+ msgid "At least one of these fields is required: title, content or excerpt"
266
+ msgstr "هناك حقل واحد على الأقل مطلوب من هذه الحقول: العنوان، أو المحتوى، أو الاقتباس"
267
+
268
+ msgid "This translation job will no longer be assigned to you. Other translators will be able take it and continue the translation."
269
+ msgstr "لن يتم تعيين مهمة الترجمة هذه إليك بعد الآن. سيكون بمقدور المترجمين الآخرين التقدم لها ومتابعة الترجمة."
270
+
271
+ msgid "This field is locked for editing because WPML will copy its value from the original language."
272
+ msgstr "هذا الحقل ممنوع من التحرير لأن WPML سيقوم بنسخ قيمته من اللغة الأصلية."
273
+
274
+ msgid "This is a translation of %s. Some of the fields are not editable. It's recommended to use the %s for translating products."
275
+ msgstr "هذه ترجمة لـ %s. بعض الحقول غير قابلة للتحرير. من الموصى به استخدام %s لترجمة المنتجات."
276
+
277
+ msgid "WooCommerce Multilingual products translator"
278
+ msgstr "مترجم منتجات WooCommerce متعدد اللغات"
279
+
280
+ msgid "Looks like you are upgrading from a previous version of WooCommerce Multilingual. Would you like to automatically create translated variations and images?"
281
+ msgstr "يبدو أنك في مرحلة الترقية من نسخة قديمة لـ WooCommerce متعدد اللغات. هل ترغب في القيام تلقائيًا بإنشاء أنواع وصور مترجمة؟"
282
+
283
+ msgid "Yes, go to the troubleshooting page"
284
+ msgstr "نعم، اذهب إلى صفحة استكشاف الأخطاء وإصلاحها"
285
+
286
+ msgid "No - dismiss"
287
+ msgstr "لا - تجاهل"
288
+
289
+ msgid "You've successfully installed %sWooCommerce Multilingual%s. Would you like to see a quick overview?"
290
+ msgstr "لقد قمت بتثبيت %sWooCommerce متعدد اللغات%s بنجاح. هل ترغب في مشاهدة معاينة سريعة؟"
291
+
292
+ msgid "Learn how to turn your e-commerce site multilingual"
293
+ msgstr "تعرف على كيفية تحويل موقع التجارة الإلكترونية الخاص بك إلى متعدد اللغات"
294
+
295
+ msgid "Dismiss"
296
+ msgstr "رفض"
297
+
298
+ msgid "To translate %s please use the %s translation%s page, inside the %sWooCommerce Multilingual admin%s."
299
+ msgstr "لترجمة %s برجاء استخدام صفحة %s الترجمة%s، داخل %sلوحة مدير WooCommerce متعددة اللغات%s."
300
+
301
+ msgid "%s do not require translation."
302
+ msgstr "%s لا يحتاج لترجمة."
303
+
304
+ msgid "Include to translation"
305
+ msgstr "الإدراج للترجمة"
306
+
307
+ msgid "%d %s are missing translations."
308
+ msgstr "%d %s تفتقر إلى الترجمات."
309
+
310
+ msgid "Translate %s"
311
+ msgstr "ترجم %s"
312
+
313
+ msgid "Exclude from translation"
314
+ msgstr "الاستثناء من الترجمة"
315
+
316
+ msgid "All %s are translated."
317
+ msgstr "جميع %s مترجمة."
318
+
319
+ msgid "Currently, there are %s variations that need to be created."
320
+ msgstr "حاليًا، هناك %s نوعًا تحتاج للإنشاء."
321
+
322
+ msgid "%d products left"
323
+ msgstr "%d منتجات باقية"
324
+
325
+ msgid "Synchronization complete!"
326
+ msgstr "اكتملت المزامنة!"
327
+
328
+ msgid "Invalid taxonomy %s"
329
+ msgstr "تصنيف غير صالح %s"
330
+
331
+ msgid "Some translated %s have different %s assignments."
332
+ msgstr "بعض %s المترجمة بها مهام %s مختلفة."
333
+
334
+ msgid "Update %s for all translated %s"
335
+ msgstr "تحديث %s لجميع %s المترجمة"
336
+
337
+ msgid "All %s have the same %s assignments."
338
+ msgstr "جميع %s لها نفس مهام %s."
339
+
340
+ msgid "Successfully updated %s for all translated %s."
341
+ msgstr "تم تحديث %s بنجاح لجميع %s المترجمة."
342
+
343
+ msgid "Synchronize attributes and update product variations"
344
+ msgstr "مزامنة السمات وتحديث أنواع المنتج"
345
+
346
+ msgid "Image"
347
+ msgstr "صورة"
348
+
349
+ msgid "Product"
350
+ msgstr "المنتج"
351
+
352
+ msgid "Type"
353
+ msgstr "نوع"
354
+
355
+ msgid "Date"
356
+ msgstr "تاريخ"
357
+
358
+ msgid "Categories"
359
+ msgstr "فئات"
360
+
361
+ msgid "No products found"
362
+ msgstr "لم يتم العثور على منتجات"
363
+
364
+ msgid "Draft"
365
+ msgstr "مسودة"
366
+
367
+ msgid "Private"
368
+ msgstr "خاص"
369
+
370
+ msgid "Pending"
371
+ msgstr "معلّق"
372
+
373
+ msgid "Scheduled"
374
+ msgstr "مجدول"
375
+
376
+ msgid "Parent product: %s"
377
+ msgstr "المنتج الرئيسي: %s"
378
+
379
+ msgid "Edit this item"
380
+ msgstr "تحرير هذا العنصر"
381
+
382
+ msgid "Edit"
383
+ msgstr "تحرير"
384
+
385
+ msgid "View \"%s\""
386
+ msgstr "عرض \"%s\""
387
+
388
+ msgid "View"
389
+ msgstr "استعرض"
390
+
391
+ msgid "Published"
392
+ msgstr "نُشر"
393
+
394
+ msgid "Last Modified"
395
+ msgstr "آخر تعديل"
396
+
397
+ msgid "All languages"
398
+ msgstr "جميع اللغات"
399
+
400
+ msgid "All categories"
401
+ msgstr "كل الفئات"
402
+
403
+ msgid "All translation statuses"
404
+ msgstr "كل حالات الترجمة"
405
+
406
+ msgid "Not translated or needs updating"
407
+ msgstr "لم تُترجم أو تحتاج إلى تحديث"
408
+
409
+ msgid "Needs updating"
410
+ msgstr "يحتاج للتحديث"
411
+
412
+ msgid "Translation complete"
413
+ msgstr "الترجمة اكتملت"
414
+
415
+ msgid "All statuses"
416
+ msgstr "جميع الحالات"
417
+
418
+ msgid "Filter"
419
+ msgstr "تصفية"
420
+
421
+ msgid "Reset"
422
+ msgstr "إعادة ضبط"
423
+
424
+ msgid "Search"
425
+ msgstr "بحث"
426
+
427
+ msgid "%d items"
428
+ msgstr "%d عناصر"
429
+
430
+ msgid "Go to the first page"
431
+ msgstr "الذهاب إلى الصفحة الأولى"
432
+
433
+ msgid "Go to the previous page"
434
+ msgstr "الذهاب إلى الصفحة السابقة"
435
+
436
+ msgid "Select Page"
437
+ msgstr "حدد الصفحة"
438
+
439
+ msgid "Current page"
440
+ msgstr "الصفحة الحالية"
441
+
442
+ msgid "of"
443
+ msgstr "من"
444
+
445
+ msgid "Go to the next page"
446
+ msgstr "الذهاب إلى الصفحة التالية"
447
+
448
+ msgid "Go to the last page"
449
+ msgstr "الذهاب إلى الصفحة الأخيرة"
450
+
451
+ msgid "Translatable?"
452
+ msgstr "قابل للترجمة؟"
453
+
454
+ msgid "Enable this if you want to translate attribute values with Woocommerce Multilingual"
455
+ msgstr "قم بتمكين هذا إذا كنت ترغب في ترجمة قيم السمة باستخدام Woocommerce متعدد اللغات"
456
+
457
+ msgid "Existing translations and variations associated will be deleted."
458
+ msgstr "سيتم حذف الترجمات والمتغيرات الحالية ذات الصلة."
459
+
460
+ msgid "Product Translation Interface"
461
+ msgstr "واجهة ترجمة المنتج"
462
+
463
+ msgid "The recommended way is using the WPML Translation Editor. It is streamlined for making the translation process much easier while also providing a much better integration with various WooCommerce extensions."
464
+ msgstr "الطريقة الموصى بها هي استخدام محرر WPML للترجمة. فهو انسيابي لجعل عملية الترجمة أكثر سهولة، بالإضافة إلى توفير تكامل أفضل بكثير مع امتدادات WooCommerce المتعددة."
465
+
466
+ msgid "WPML Translation Editor"
467
+ msgstr "محرر WPML للترجمة"
468
+
469
+ msgid "Native WooCommerce product editing screen"
470
+ msgstr "شاشة تحرير منتج WooCommerce الأصلية"
471
+
472
+ msgid "Products synchronization"
473
+ msgstr "مزامنة المنتجات"
474
+
475
+ msgid "Configure specific product properties that should be synced to translations."
476
+ msgstr "تهيئة الخصائص المحددة للمنتج والتي تجب مزامنتها إلى الترجمات."
477
+
478
+ msgid "Sync publishing date for translated products."
479
+ msgstr "مزامنة تاريخ النشر للمنتجات المترجمة."
480
+
481
+ msgid "Sync products and product taxonomies order."
482
+ msgstr "مزامنة ترتيب المنتجات وتصانيف المنتج."
483
+
484
+ msgid "Products Download Files"
485
+ msgstr "ملفات تنزيل المنتجات"
486
+
487
+ msgid "If you are using downloadable products, you can choose to have their paths\n synchronized, or seperate for each language."
488
+ msgstr "إذا كنت تستخدم منتجات قابلة للتنزيل، يمكنك اختيار مزامنة\n مساراتهم، أو فصلها لكل لغة."
489
+
490
+ msgid "Use the same files for translations"
491
+ msgstr "استخدم نفس الملفات للترجمات"
492
+
493
+ msgid "Add separate download files for translations"
494
+ msgstr "إضافة ملفات تنزيل منفصلة للترجمات"
495
+
496
+ msgid "Save changes"
497
+ msgstr "حفظ التغييرات"
498
+
499
+ msgid "Troubleshooting page"
500
+ msgstr "صفحة استكشاف الأخطاء وإصلاحها"
501
+
502
+ msgid "Update Translation"
503
+ msgstr "تحديث الترجمة"
504
+
505
+ msgid "Hide This Message"
506
+ msgstr "إخفاء هذه الرسالة"
507
+
508
+ msgid "<strong>WooCommerce Translation Available</strong> &#8211; Install or update your <code>%s</code> translations to version <code>%s</code>."
509
+ msgstr "<strong>ترجمة WooCommerce متاح</strong> &#8211; تثبيت أو تحديث ترجمات <code>%s</code> الخاصة بك إلى الإصدار <code>%s</code>."
510
+
511
+ msgid "This will automatically generate variations for translated products corresponding to recently translated attributes."
512
+ msgstr "سيقوم هذا تلقائيًا بإنشاء متغيرات للمنتجات المترجمة المتوافقة مع السمات المترجمة مؤخرًا."
513
+
514
+ msgid "Synchronize %s assignment in content"
515
+ msgstr "مزامنة مهمة %s في المحتوى"
516
+
517
+ msgid "This action lets you automatically apply the %s taxonomy to your content in different languages. It will scan the original content and apply the same taxonomy to translated content."
518
+ msgstr "يسمح لك هذا الإجراء بتطبيق تصنيف %s تلقائيًا إلى محتوياتك في لغاتك المختلفة. سيقوم بعمل استكشاف للمحتوى الأصلي وتطبيق نفس التصنيف إلى المحتوى المترجم."
519
+
520
+ msgid "You have untranslated terms!"
521
+ msgstr "لديك مصطلحات غير مترجمة!"
522
+
523
+ msgid "Select currency"
524
+ msgstr "حدد العملة"
525
+
526
+ msgid "Exchange Rate"
527
+ msgstr "أسعار صرف العملات"
528
+
529
+ msgid "Only numeric"
530
+ msgstr "رقمي فقط"
531
+
532
+ msgid "Set on %s"
533
+ msgstr "ضبط على %s"
534
+
535
+ msgid "Currency Preview"
536
+ msgstr "معاينة العملة"
537
+
538
+ msgid "Currency Position"
539
+ msgstr "وضع العملة"
540
+
541
+ msgid "Left"
542
+ msgstr "يسار"
543
+
544
+ msgid "Right"
545
+ msgstr "يمين"
546
+
547
+ msgid "Left with space"
548
+ msgstr "يسار مع مسافة"
549
+
550
+ msgid "Right with space"
551
+ msgstr "يمين مع مسافة"
552
+
553
+ msgid "Thousand Separator"
554
+ msgstr "فاصل الآلاف"
555
+
556
+ msgid "Decimal Separator"
557
+ msgstr "فاصل الكسور العشرية"
558
+
559
+ msgid "Number of Decimals"
560
+ msgstr "عدد الكسور العشرية"
561
+
562
+ msgid "Rounding to the nearest integer"
563
+ msgstr "التقريب حتى أقرب عدد صحيح"
564
+
565
+ msgid "Disabled"
566
+ msgstr "معطل"
567
+
568
+ msgid "Up"
569
+ msgstr "أعلى"
570
+
571
+ msgid "Down"
572
+ msgstr "أسفل"
573
+
574
+ msgid "Nearest"
575
+ msgstr "الأقرب"
576
+
577
+ msgid "Increment for nearest integer"
578
+ msgstr "الإضافة حتى أقرب عدد صحيح"
579
+
580
+ msgid "Autosubtract amount"
581
+ msgstr "قيمة الطرح التلقائي"
582
+
583
+ msgid "Cancel"
584
+ msgstr "الغ"
585
+
586
+ msgid "Save"
587
+ msgstr "حفظ"
588
+
589
+ msgid "Products"
590
+ msgstr "المنتجات"
591
+
592
+ msgid "Tags"
593
+ msgstr "روابط ذكية"
594
+
595
+ msgid "Attributes"
596
+ msgstr "السمات"
597
+
598
+ msgid "Shipping Classes"
599
+ msgstr "أصناف الشحن"
600
+
601
+ msgid "Settings"
602
+ msgstr "إعدادات"
603
+
604
+ msgid "Multi-currency"
605
+ msgstr "العملات المتعددة"
606
+
607
+ msgid "Store URLs"
608
+ msgstr "مسارات المتجر"
609
+
610
+ msgid "Status"
611
+ msgstr "الحالة"
612
+
613
+ msgid "Troubleshooting"
614
+ msgstr "حل المشكلات"
615
+
616
+ msgid "Thank you for using %sWooCommerce Multilingual%s! You can express your love and\n support by %s rating our plugin and saying that %sit works%s for you."
617
+ msgstr "شكرًا لاستخدامك %sملحق WooCommerce متعدد اللغات %s! يمكنك التعبير عن حبك\n ودعمك عن طريق %sتقييم ملحقاتنا والتعبير عن %sعملها%s معك."
618
+
619
+ msgid "Hide"
620
+ msgstr "إخفاء"
621
+
622
+ msgid "Loading ..."
623
+ msgstr "قيد التحميل..."
624
+
625
+ msgid "Regular Price"
626
+ msgstr "السعر العادي"
627
+
628
+ msgid "Sale Price"
629
+ msgstr "سعر البيع"
630
+
631
+ msgid "Multi-currency is enabled but no secondary currencies have been set. %sAdd secondary currencies%s."
632
+ msgstr "العملات المتعددة مُمكّنة، ولكن لم يتم تعيين عملات ثانوية. %sإضافة العملات الثانوية%s."
633
+
634
+ msgid "Calculate prices in other currencies automatically"
635
+ msgstr "حساب الأسعار بالعملات الأخرى تلقائيًا"
636
+
637
+ msgid "Click to see the prices in the other currencies as they are currently shown on the front end."
638
+ msgstr "انقر لاستعراض الأسعار بالعملات الأخرى كما هي معروضة حاليًا على الواجهة الأمامية."
639
+
640
+ msgid "Show"
641
+ msgstr "عرض"
642
+
643
+ msgid "Set prices in other currencies manually"
644
+ msgstr "ضبط الأسعار بالعملات الأخرى يدويًا"
645
+
646
+ msgid "Enter prices in other currencies"
647
+ msgstr "إدخال الأسعار بالعملات الأخرى"
648
+
649
+ msgid "Hide prices in other currencies"
650
+ msgstr "إخفاء الأسعار بالعملات الأخرى"
651
+
652
+ msgid "Determined automatically based on exchange rate"
653
+ msgstr "تحديد تلقائي وفقًا لأسعار الصرف"
654
+
655
+ msgid "Schedule"
656
+ msgstr "جدول الأعمال"
657
+
658
+ msgid "Same as default currency"
659
+ msgstr "مثل العملة الافتراضية"
660
+
661
+ msgid "Set dates"
662
+ msgstr "ضبط التواريخ"
663
+
664
+ msgid "Collapse"
665
+ msgstr "طي"
666
+
667
+ msgid "From&hellip;"
668
+ msgstr "من&hellip;"
669
+
670
+ msgid "To&hellip;"
671
+ msgstr "إلى&hellip;"
672
+
673
+ msgid "Please enter in a value less than the regular price"
674
+ msgstr "برجاء إدخال قيمة أقل من السعر المعتاد"
675
+
676
+ msgid "Required plugins"
677
+ msgstr "الملحقات المطلوبة"
678
+
679
+ msgid "Plugins Status"
680
+ msgstr "حالة الملحقات"
681
+
682
+ msgid "WooCommerce Multilingual depends on several plugins to work. If any required plugin is missing, you should install and activate it."
683
+ msgstr "يعتمد WooCommerce متعدد اللغات على العديد من الملحقات لكي يعمل. إذا كان أحد هذه الملحقات غير موجود، فيجب عليك تثبيته وتفعيله."
684
+
685
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">WPML</a> versions prior 2.0.5."
686
+ msgstr "WooCommerce Multilingual ممكّن ولكن غير فعّال. غير متوافق مع نسخ <a href=\"%s\">WPML</a> الأقدم من 2.0.5."
687
+
688
+ msgid "Update WPML"
689
+ msgstr "تحديث WPML"
690
+
691
+ msgid "Get WPML"
692
+ msgstr "احصل على WPML"
693
+
694
+ msgid "Get WPML Media"
695
+ msgstr "احصل على WPML Media"
696
+
697
+ msgid "Get WPML Translation Management"
698
+ msgstr "احصل على إدارة ترجمة WPML"
699
+
700
+ msgid "Get WPML String Translation"
701
+ msgstr "احصل على WPML String Translation"
702
+
703
+ msgid "%s is installed and active."
704
+ msgstr "%s مثبت ونشط."
705
+
706
+ msgid "%s is set up."
707
+ msgstr "%s تم إعداده."
708
+
709
+ msgid "%s is not set up."
710
+ msgstr "%s لم يتم إعداده."
711
+
712
+ msgid "%s is either not installed or not active."
713
+ msgstr "%s إما أنه غير مثبت أو غير نشط."
714
+
715
+ msgid "%1$s is installed, but with incorrect version. You need %1$s %2$s or higher. "
716
+ msgstr "%1$s مثبت، ولكن بنسخة خاطئة. تحتاج إلى نسخة %1$s %2$s أو أعلى."
717
+
718
+ msgid "Download WooCommerce"
719
+ msgstr "تحميل WooCommerce"
720
+
721
+ msgid "The WordPress Multilingual Plugin"
722
+ msgstr "ملحق WordPress متعدد اللغات"
723
+
724
+ msgid "This page allows you to translate all strings that are being used by WooCommerce in building different type of urls. Translating them enables you to have fully localized urls that match the language of the pages."
725
+ msgstr "تسمح لك هذه الصفحة بترجمة جميع النصوص التي تستخدم بواسطة WooCommerce في بناء الأنواع المختلفة من المسارات. ترجمتهم ستجعلك تمتلك مسارات مترجمة بالكامل تتوافق مع لغة الصفحات."
726
+
727
+ msgid "You can enter or edit your default values on the %sPermalinks settings%s page or, for the endpoints, on the WooCommerce %sAccount settings%s page."
728
+ msgstr "يمكنك إدخال أو تحرير قيمك الافتراضية في صفحة %sإعدادات الروابط الثابتة%s، أو بالنسبة لنقاط النهاية في صفحة %sإعدادات حساب%s WooCommerce."
729
+
730
+ msgid "permalinks settings"
731
+ msgstr "إعدادات الارتباطات الثابتة"
732
+
733
+ msgid "Account settings"
734
+ msgstr "إعدادات الحساب"
735
+
736
+ msgid "Slug type"
737
+ msgstr "نوع الارتباط الثابت"
738
+
739
+ msgid "Original Slug"
740
+ msgstr "الارتباط الثابت الأصلي"
741
+
742
+ msgid "Shop page"
743
+ msgstr "صفحة المتجر"
744
+
745
+ msgid "Product base"
746
+ msgstr "قاعدة المنتج"
747
+
748
+ msgid "Product category base"
749
+ msgstr "قاعدة فئة المنتج"
750
+
751
+ msgid "Product tag base"
752
+ msgstr "قاعدة علامة المنتج"
753
+
754
+ msgid "Product attribute base"
755
+ msgstr "قاعدة سمة المنتج"
756
+
757
+ msgid "Original"
758
+ msgstr "الأصل"
759
+
760
+ msgid "Translation to"
761
+ msgstr "الترجمة إلى"
762
+
763
+ msgid "Product Shop Base"
764
+ msgstr "قاعدة متجر المنتج"
765
+
766
+ msgid "Welcome to WooCommerce Multilingual!"
767
+ msgstr "مرحبًا بك مع WooCommerce متعدد اللغات!"
768
+
769
+ msgid "Configure the multilingual support for your e-commerce site in just a couple of minutes."
770
+ msgstr "قم بتكوين الدعم متعدد اللغات لموقع التجارة الإلكترونية الخاص بك في عدة دقائق فقط."
771
+
772
+ msgid "By default, the products are translatable just like product categories, product tags and attributes. So you can start translating these right away."
773
+ msgstr "بشكلٍ افتراضي، المنتجات قابلة للترجمة مثل فئات المنتج، وعلامات المنتج، والسمات. بحيث يمكنك البدء في ترجمتها على الفور."
774
+
775
+ msgid "You can configure, however, which attributes you want to translate, install the translated shop pages or enable the multi-currency mode."
776
+ msgstr "مع ذلك، يمكنك تكوين السمات التي ترغب في ترجمتها، أو تثبيت صفحات المتجر المترجمة، تمكين وضع العملات المتعددة."
777
+
778
+ msgid "Start"
779
+ msgstr "بداية"
780
+
781
+ msgid "No, thanks. I'll do it later."
782
+ msgstr "لا، شكرًا. سأفعل ذلك لاحقًا."
783
+
784
+ msgid "Select translatable attributes"
785
+ msgstr "حدد السمات القابلة للترجمة"
786
+
787
+ msgid "There are no attributes defined"
788
+ msgstr "لم يتم تعيين سمات"
789
+
790
+ msgid "Continue"
791
+ msgstr "استمر"
792
+
793
+ msgid "Later"
794
+ msgstr "لاحقًا"
795
+
796
+ msgid "One or more WooCommerce pages have not been created"
797
+ msgstr "لم يتم إنشاء صفحة أو عدة صفحات من WooCommerce"
798
+
799
+ msgid "Install missing WooCommerce pages and create translations."
800
+ msgstr "تثبيت صفحات WooCommerce المفقودة وإنشاء الترجمات."
801
+
802
+ msgid "Translate Store Pages"
803
+ msgstr "ترجمة صفحات المتجر"
804
+
805
+ msgid "All store pages must be translated in the languages configured on the site."
806
+ msgstr "ينبغي ترجمة جميع صفحات المتجر باللغات التي تم تكوينها على الموقع."
807
+
808
+ msgid "Select the translation interface"
809
+ msgstr "حدد واجهة الترجمة"
810
+
811
+ msgid "Enable multiple currencies"
812
+ msgstr "تمكين العملات المتعددة"
813
+
814
+ msgid "This will allow you to set prices for products in different currencies. The prices can be determined based on a given exchange rate or set explicitly for specific products."
815
+ msgstr "سيسمح لك ذلك بتعيين الأسعار للمنتجات بعملات مختلفة. يمكن تحديد الأسعار بحسب سعر الصرف المدخل أو المحدد بوضوح لمنتجات بعينها."
816
+
817
+ msgid "Enable the multi-currency mode"
818
+ msgstr "تمكين وضع العملات المتعددة"
819
+
820
+ msgid "Further actions that are necessary for making your existing content multilingual, are listed below."
821
+ msgstr "ستجد الإجراءات الأخرى اللازمة لجعل محتواك الحالي متعدد اللغات مدرجة أدناه."
822
+
823
+ msgid "Start translating products"
824
+ msgstr "بدء ترجمة المنتجات"
825
+
826
+ msgid "Add secondary currencies on the %smulti-currency configuration%s page"
827
+ msgstr "أضف العملات الثانوية في صفحة %sتكوين العملات المتعددة%s"
828
+
829
+ msgid "Translate existing terms for these %sproduct attributes%s: %s"
830
+ msgstr "ترجم المصطلحات الحالية %sلسمات المنتج%s هذه: %s"
831
+
832
+ msgid "Translate existing %sproduct categories%s"
833
+ msgstr "ترجمة %sفئات المنتج%s الحالية"
834
+
835
+ msgid "Translate existing %sproduct tags%s"
836
+ msgstr "ترجمة %sعلامات المنتج%s الحالية"
837
+
838
+ msgid "%sAdd missing translations%s for shipping classes"
839
+ msgstr "%sإضافة الترجمات المفقودة%s لفئات الشحن"
840
+
841
+ msgid "Translate %sURL slugs%s to create multilingual store and product urls"
842
+ msgstr "ترجمة %sالارتباطات الثابتة للمسارات%s لإنشاء متجر متعدد اللغات ومسارات للمنتج"
843
+
844
+ msgid "Use custom settings for translations download files"
845
+ msgstr "استخدام الإعدادات المخصصة لملفات تنزيل الترجمات"
846
+
847
+ msgid "WooCommerce Store Pages"
848
+ msgstr "صفحات متجر WooCommerce"
849
+
850
+ msgid "To run a multilingual e-commerce site, you need to have the WooCommerce shop pages translated to all the site's languages. Once all the pages are installed you can add the translations for them from this menu."
851
+ msgstr "لتشغيل موقع تجارة إلكترونية متعدد اللغات، فأنت في حاجة إلى ترجمة صفحات متجر WooCommerce إلى جميع لغات الموقع. ما أن يتم تثبيت جميع الصفحات، يمكنك إضافة الترجمات لهم من هذه القائمة."
852
+
853
+ msgid "One or more WooCommerce pages have not been created."
854
+ msgstr "لم يتم إنشاء صفحة WooCommerce أو أكثر."
855
+
856
+ msgid "Install WooCommerce Pages"
857
+ msgstr "تثبيت صفحات WooCommerce"
858
+
859
+ msgid "WooCommerce store pages do not exist for these languages:"
860
+ msgstr "صفحات متجر WooCommerce غير موجودة لهذه اللغات:"
861
+
862
+ msgid "Create missing translations"
863
+ msgstr "إنشاء الترجمات المفقودة"
864
+
865
+ msgid "These pages are currently being translated by translators via WPML: "
866
+ msgstr "هذه الصفحات يتم ترجمتها حاليًا بواسطة مترجمين عبر WPML:"
867
+
868
+ msgid "WooCommerce store pages are translated to all the site's languages."
869
+ msgstr "صفحات متجر WooCommerce مترجمة لجميع لغات الموقع."
870
+
871
+ msgid "Configuration warnings"
872
+ msgstr "تحذيرات التهيئة"
873
+
874
+ msgid "Reporting miscelaneous configuration issues that can make WooCommerce Multilingual not run normally"
875
+ msgstr "الإبلاغ عن مسائل التهيئة المتنوعة التي قد تجعل WooCommerce Multilingual يعمل بشكلٍ غير طبيعي"
876
+
877
+ msgid "Your product permalink base is not translated to:"
878
+ msgstr "قاعدة الارتباط الثابت لمنتجك غير مترجمة إلى:"
879
+
880
+ msgid "Translate URLs"
881
+ msgstr "ترجمة المسارات"
882
+
883
+ msgid "Your site's default language is not English and the strings language is also not English."
884
+ msgstr "اللغة الافتراضية لموقعك ليست اللغة الإنجليزية، ولغة النصوص أيضًا ليست اللغة الإنجليزية."
885
+
886
+ msgid "Running WooCommerce multilingual with default language other than English."
887
+ msgstr "جارٍ تشغيل WooCommerce متعدد اللغات بلغة افتراضية غير اللغة الإنجليزية."
888
+
889
+ msgid "This may cause problems with URLs in different languages."
890
+ msgstr "قد يتسبب هذا في مشاكل مع المسارات بلغات مختلفة."
891
+
892
+ msgid "Change default language"
893
+ msgstr "تغيير اللغة الافتراضية"
894
+
895
+ msgid "Your site's default language is not English."
896
+ msgstr "اللغة الافتراضية لموقعك ليست اللغة الإنجليزية."
897
+
898
+ msgid "There are some settings that require careful attention."
899
+ msgstr "هناك بعض الإعدادات التي تحتاج إلى انتباه تام."
900
+
901
+ msgid "Some settings from the WooCommerce Multilingual wpml-config.xml file have been overwritten."
902
+ msgstr "تم استبدال بعض الإعدادات من ملف wpml-config.xml الخاص بـ WooCommerce متعدد اللغات."
903
+
904
+ msgid "You should check WPML configuration files added by other plugins or manual settings on the %s section."
905
+ msgstr "ينبغي عليك التحقق من ملفات تكوين WPML المضافة بواسطة الملحقات الأخرى أو الإعدادات اليدوية في قسم %s."
906
+
907
+ msgid "Multilingual Content Setup"
908
+ msgstr "إعداد محتوى متعدد اللغات"
909
+
910
+ msgid "Taxonomies missing translations"
911
+ msgstr "تصانيف الترجمات المفقودة"
912
+
913
+ msgid "To run a fully translated site, you should translate all taxonomy terms. Some store elements, such as variations, depend on taxonomy translation."
914
+ msgstr "لتشغيل موقع مترجم بالكامل، يجب عليك ترجمة جميع مصطلحات التصنيف. تعتمد بعض عناصر المتجر مثل أنواع المنتج على ترجمة التصنيف."
915
+
916
+ msgid "This taxonomy requires translation."
917
+ msgstr "هذا التصنيف يحتاج لترجمة."
918
+
919
+ msgid "Include in translation"
920
+ msgstr "التضمين في الترجمة"
921
+
922
+ msgid "This taxonomy does not require translation."
923
+ msgstr "هذا التصنيف لا يحتاج لترجمة."
924
+
925
+ msgid "Right now, there are no taxonomy terms needing translation."
926
+ msgstr "حاليًا، لا توجد مصطلحات تصنيف في حاجة للترجمة."
927
+
928
+ msgid "There are no translatable product attributes defined"
929
+ msgstr "لا توجد سمات منتج قابلة للترجمة تم تحديدها"
930
+
931
+ msgid "Select the attribute to translate: "
932
+ msgstr "حدد السمة المراد ترجمتها:"
933
+
934
+ msgid "Please make a backup of your database before you start the synchronization"
935
+ msgstr "برجاء عمل نسخة احتياطية من قاعدة البيانات الخاصة بك قبل بدء المزامنة"
936
+
937
+ msgid "Sync variables products"
938
+ msgstr "مزامنة منتجات المتغيرات"
939
+
940
+ msgid "Update products count:"
941
+ msgstr "تحديث عدد المنتجات:"
942
+
943
+ msgid "products with variations"
944
+ msgstr "منتجات ذات أنواع"
945
+
946
+ msgid "Sync products variations:"
947
+ msgstr "مزامنة أنواع المنتجات:"
948
+
949
+ msgid "left"
950
+ msgstr "باقٍ"
951
+
952
+ msgid "Sync products \"gallery images\":"
953
+ msgstr "مزامنة \"صور معرض\" المنتجات:"
954
+
955
+ msgid "Sync products categories (display type, thumbnail):"
956
+ msgstr "مزامنة فئات المنتج (عرض النوع، صورة مصغرة):"
957
+
958
+ msgid "Duplicate terms ( please select attribute ):"
959
+ msgstr "تكرار المصطلحات (برجاء تحديد سمة):"
960
+
961
+ msgid "none"
962
+ msgstr "لا"
963
+
964
+ msgid "Enable/disable"
965
+ msgstr "تمكين/تعطيل"
966
+
967
+ msgid "Currencies"
968
+ msgstr "العملات"
969
+
970
+ msgid "Add currency"
971
+ msgstr "إضافة عملة"
972
+
973
+ msgid "Currency"
974
+ msgstr "العملة"
975
+
976
+ msgid "Rate"
977
+ msgstr "السعر"
978
+
979
+ msgid "default"
980
+ msgstr "افتراضي"
981
+
982
+ msgid "Default currency"
983
+ msgstr "العملة الافتراضية"
984
+
985
+ msgid "Switch to this currency when switching language in the front-end"
986
+ msgstr "حوّل إلى هذه العملة عند تغيير اللغة في الواجهة الأمامية"
987
+
988
+ msgid "Keep"
989
+ msgstr "ثبات القيمة"
990
+
991
+ msgid "Delete"
992
+ msgstr "حذف"
993
+
994
+ msgid " (%s)"
995
+ msgstr "(%s)"
996
+
997
+ msgid "The multi-currency mode cannot be enabled as a specific currency was not set. Go to the %sWooCommerce settings%s page and select the default currency for your store."
998
+ msgstr "لا يمكن تمكين وضع العملات المتعددة حيث أنه لم يتم تعيين عملة معينة. اذهب إلى صفحة %sإعدادات WooCommerce%s وحدد العملة الافتراضية لمتجرك."
999
+
1000
+ msgid "Learn more"
1001
+ msgstr "تعلم المزيد"
1002
+
1003
+ msgid "Show only products with custom prices in secondary currencies"
1004
+ msgstr "عرض المنتجات المصحوبة بأسعار مخصصة فقط في العملات الفرعية"
1005
+
1006
+ msgid "When this option is on, when you switch to a secondary currency on the front end, only the products with custom prices in that currency are being displayed. Products with prices determined based on the exchange rate are hidden."
1007
+ msgstr "عند تفعيل هذا الخيار، فعند تحويلك إلى عملة فرعية على الواجهة الأمامية، فلن يتم عرض سوى المنتجات المصحوبة بأسعار مخصصة في تلك العملة. يتم إخفاء المنتجات المصحوبة بأسعار محددة وفقًا لسعر الصرف."
1008
+
1009
+ msgid "The changes you made will be lost if you navigate away from this page."
1010
+ msgstr "ستفقد التغييرات التي أجريتها إذا غادرت هذه الصفحة."
1011
+
1012
+ msgid "At least one currency must be enabled for this language!"
1013
+ msgstr "ينبغي تمكين عملة واحدة على الأقل لهذه اللغة!"
1014
+
1015
+ msgid "Currency switcher options"
1016
+ msgstr "خيارات محوّل العملة"
1017
+
1018
+ msgid "Currency switcher style"
1019
+ msgstr "نمط محوّل العملة"
1020
+
1021
+ msgid "Currency order"
1022
+ msgstr "ترتيب العملات"
1023
+
1024
+ msgid "Available parameters"
1025
+ msgstr "المعايير المتاحة"
1026
+
1027
+ msgid "Template for currency switcher"
1028
+ msgstr "نموذج لمحوّل العملة"
1029
+
1030
+ msgid "Visibility"
1031
+ msgstr "الظهور"
1032
+
1033
+ msgid "Currency switcher preview"
1034
+ msgstr "استعراض محوّل العملة"
1035
+
1036
+ msgid "Drop-down menu"
1037
+ msgstr "قائمة منزلقة"
1038
+
1039
+ msgid "List of currencies"
1040
+ msgstr "قائمة العملات"
1041
+
1042
+ msgid "Vertical"
1043
+ msgstr "رأسي"
1044
+
1045
+ msgid "Horizontal"
1046
+ msgstr "أفقي"
1047
+
1048
+ msgid "Drag the currencies to change their order"
1049
+ msgstr "قم بسحب العملات وتركها لتغيير ترتيبها"
1050
+
1051
+ msgid "%name%, %symbol%, %code%"
1052
+ msgstr "%name%, %symbol%, %code%"
1053
+
1054
+ msgid "Default: %name% (%symbol%) - %code%"
1055
+ msgstr "الافتراضي: %name% (%symbol%) - %code%"
1056
+
1057
+ msgid "Show a currency selector on the product page template"
1058
+ msgstr "عرض محدد العملة على قالب صفحة المنتج"
1059
+
1060
+ msgid "To configure how the %sWooCommerce products%s are translated, visit the WooCommerce Multiligual %ssettings%s page."
1061
+ msgstr "لتكوين طريقة ترجمة %sمنتجات WooCommerce%s، قم بزيارة صفحة %sإعدادات%s WooCommerce متعدد اللغات."
1062
+
1063
+ msgid "Title"
1064
+ msgstr "عنوان"
1065
+
1066
+ msgid "Slug"
1067
+ msgstr "الرابط اللطيف"
1068
+
1069
+ msgid "Content / Description"
1070
+ msgstr "المحتوى/الوصف"
1071
+
1072
+ msgid "Excerpt"
1073
+ msgstr "اقتباس"
1074
+
1075
+ msgid "Purchase note"
1076
+ msgstr "ملاحظة الشراء"
1077
+
1078
+ msgid "Images"
1079
+ msgstr "الصور"
1080
+
1081
+ msgid "Custom Product attributes"
1082
+ msgstr "سمات المنتج المخصصة"
1083
+
1084
+ msgid "Name"
1085
+ msgstr "الاسم"
1086
+
1087
+ msgid "Value(s)"
1088
+ msgstr "القيمة (القيم)"
1089
+
1090
+ msgid "Custom Fields"
1091
+ msgstr "الحقول المخصصة"
1092
+
1093
+ msgid "Variations data"
1094
+ msgstr "بيانات المتغيرات"
1095
+
1096
+ msgid "Download Files for Variation #%s"
1097
+ msgstr "ملفات التنزيل للمتغير #%s"
1098
+
1099
+ msgid "Download Files"
1100
+ msgstr "ملفات التنزيل"
1101
+
1102
+ msgid "File URL"
1103
+ msgstr "مسار الملف"
1104
+
1105
+ msgid "Content, title, and excerpt are empty."
1106
+ msgstr "المحتوى والعنوان والاقتباس فارغون."
1107
+
1108
+ msgid "Search %s"
1109
+ msgstr "البحث عن %s"
1110
+
1111
+ msgid "All %s"
1112
+ msgstr "جميع %s"
1113
+
1114
+ msgid "Parent %s"
1115
+ msgstr "%s الرئيسي"
1116
+
1117
+ msgid "Parent %s:"
1118
+ msgstr "%s الرئيسي:"
1119
+
1120
+ msgid "Edit %s"
1121
+ msgstr "تحرير %s"
1122
+
1123
+ msgid "Update %s"
1124
+ msgstr "تحديث %s"
1125
+
1126
+ msgid "Add New %s"
1127
+ msgstr "إضافة %s جديد"
1128
+
1129
+ msgid "New %s"
1130
+ msgstr "%s جديد"
1131
+
1132
+ msgid "To translate Add-ons strings please save Add-ons and go to the <b><a href=\"%s\">String Translation interface</a></b>"
1133
+ msgstr "لترجمة متسلسلات الملحقات، برجاء حفظ الملحقات والذهاب إلى <b><a href=\"%s\">واجهة ترجمة المتسلسلات</a></b>"
1134
+
1135
+ msgid "Product Add-ons Group \"%s\""
1136
+ msgstr "مجموعة ملحقات المنتج \"%s\""
1137
+
1138
+ msgid "Description"
1139
+ msgstr "وصف"
1140
+
1141
+ msgid "Options"
1142
+ msgstr "خيارات"
1143
+
1144
+ msgid "Label"
1145
+ msgstr "علامة"
1146
+
1147
+ msgid "To translate Extra Options strings please save %s and go to the <b><a href=\"%s\">String Translation interface</a></b>"
1148
+ msgstr "لترجمة متسلسلات الخيارات الإضافية، برجاء حفظ %s والذهاب إلى <b><a href=\"%s\">واجهة ترجمة المتسلسلات</a></b>"
1149
+
1150
+ msgid "Language"
1151
+ msgstr "لغة"
1152
+
1153
+ msgid "Translation of"
1154
+ msgstr "ترجمة"
1155
+
1156
+ msgid "Subscription Price"
1157
+ msgstr "سعر الاشتراك"
1158
+
1159
+ msgid "Sign-up Fee"
1160
+ msgstr "رسم التسجيل"
1161
+
1162
+ msgid "Calculate costs in other currencies automatically"
1163
+ msgstr "احتساب التكاليف بعملات أخرى تلقائيًا"
1164
+
1165
+ msgid "Set costs in other currencies manually"
1166
+ msgstr "تعيين التكاليف بعملات أخرى يدويًا"
1167
+
1168
+ msgid "This is the cost per block booked. All other costs (for resources and persons) are added to this."
1169
+ msgstr "هذه هي التكلفة لكل كتلة محجوزة. تتم إضافة جميع التكاليف الأخرى (للموارد والأشخاص) إلى هذه."
1170
+
1171
+ msgid "Product tabs"
1172
+ msgstr "علامات تبويب المنتج"
1173
+
1174
+ msgid "Heading"
1175
+ msgstr "رأس الصفحة"
1176
+
1177
+ msgid "Tour Data"
1178
+ msgstr "بيانات الجولة"
1179
+
1180
+ msgid "Content"
1181
+ msgstr "المحتوى"
1182
+
1183
+ msgid "Composite Products"
1184
+ msgstr "المنتجات المركبة"
1185
+
1186
+ msgid "Product Bundles"
1187
+ msgstr "حزم المنتج"
1188
+
1189
+ msgid "One-off cost for the booking as a whole."
1190
+ msgstr "تكلفة إجمالية تدفعها لمرة واحدة مقابل الحجز بأكمله."
1191
+
1192
+ msgid "The cost is displayed to the user on the frontend. Leave blank to have it calculated for you. If a booking has varying costs, this will be prefixed with the word \"from:\"."
1193
+ msgstr "يتم عرض التكلفة للمستخدم على الواجهة الأمامية. اترك الحقل فارغًا كي يتم احتسابها لك. إذا كان هناك حجز له تكاليف مختلفة، فسيتم وضع كلمة \"بدءًا من:\" أمامه."
1194
+
1195
+ msgid "Bookings"
1196
+ msgstr "الحجوزات"
1197
+
1198
+ msgid "Resources Label"
1199
+ msgstr "علامة الموارد"
1200
+
1201
+ msgid "Resources"
1202
+ msgstr "الموارد"
1203
+
1204
+ msgid "Person Types"
1205
+ msgstr "أنواع الشخص"
1206
+
1207
+ msgid "Person Type Name"
1208
+ msgstr "اسم نوع الشخص"
1209
+
1210
+ msgid "Resources label"
1211
+ msgstr "ملصق الموارد"
1212
+
1213
+ msgid "Booking currency"
1214
+ msgstr "عملة الحجز"
locale/woocommerce-multilingual-de_DE.po ADDED
@@ -0,0 +1,1214 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # This file was generated by WPML
2
+ # WPML is a WordPress plugin that can turn any WordPress site into a full featured multilingual content management system.
3
+ # https://wpml.org
4
+ msgid ""
5
+ msgstr "Content-Type: text/plain; charset=utf-8\nContent-Transfer-Encoding: 8bit\nProject-Id-Version:WPML_EXPORT\nPOT-Creation-Date: \nPO-Revision-Date: \nLast-Translator: \nLanguage-Team: \nLanguage:en\nMIME-Version: 1.0\n"
6
+
7
+ msgid "Introduction"
8
+ msgstr "Einleitung"
9
+
10
+ msgid "Store Pages"
11
+ msgstr "Store-Seiten"
12
+
13
+ msgid "Global Attributes"
14
+ msgstr "Globale Attribute"
15
+
16
+ msgid "Multiple Currencies"
17
+ msgstr "Mehrere Währungen"
18
+
19
+ msgid "Translation Interface"
20
+ msgstr "Übersetzungsoberfläche"
21
+
22
+ msgid "Ready!"
23
+ msgstr "Fertig!"
24
+
25
+ msgid "Welcome to %sWooCommerce Multilingual!%s Please take a moment to configure the main settings and then you are ready to start translating your products."
26
+ msgstr ""
27
+
28
+ msgid "Action failed. Please refresh the page and retry."
29
+ msgstr "Aktion fehlgeschlagen. Bitte aktualisieren Sie die Seite und versuchen Sie es erneut."
30
+
31
+ msgid "Cheatin&#8217; huh?"
32
+ msgstr "Wollen Sie etwa schummeln?"
33
+
34
+ msgid "Run the Setup Wizard"
35
+ msgstr "Einrichtungsassistent starten"
36
+
37
+ msgid "Skip Setup"
38
+ msgstr "Einrichtung überspringen"
39
+
40
+ msgid "WooCommerce Multilingual &rsaquo; Setup Wizard"
41
+ msgstr "WooCommerce Multilingual &rsaquo; Einrichtungsassistent"
42
+
43
+ msgid "WooCommerce Multilingual"
44
+ msgstr "WooCommerce Multilingual"
45
+
46
+ msgid "How to translate products"
47
+ msgstr "So übersetzen Sie Produkte"
48
+
49
+ msgid "Quick edit is disabled for product translations. It's recommended to use the %s for editing products translations. %s"
50
+ msgstr "Schnellbearbeitung ist für Produktübersetzungen deaktiviert. Wir empfehlen, für die Bearbeitung von Produktübersetzungen %s zu verwenden. %s"
51
+
52
+ msgid "WooCommerce Multilingual products editor"
53
+ msgstr "WooCommerce Multilingual-Produkteditor"
54
+
55
+ msgid "Edit this product translation"
56
+ msgstr "Diese Produktübersetzung bearbeiten"
57
+
58
+ msgid "How to translate attributes"
59
+ msgstr "So übersetzen Sie Attribute"
60
+
61
+ msgid "How to translate product categories"
62
+ msgstr "Sie übersetzen Sie Produktkategorien"
63
+
64
+ msgid "The recommended way to translate WooCommerce products is using the\n %sWooCommerce Multilingual products translation%s page.\n Please use this page only for translating elements that are not available in the WooCommerce Multilingual products translation table."
65
+ msgstr ""
66
+
67
+ msgid "In order to edit custom attributes you need to use the <a href=\"%s\">custom product translation editor</a>"
68
+ msgstr "Um benutzerdefinierte Attribute zu bearbeiten, müssen Sie den <a href=\"%s\">Übersetzungseditor für benutzerdefinierte</a> Produkte verwenden."
69
+
70
+ msgid "You are using the same value as for the regular category base. This is known to create conflicts resulting in urls not working properly."
71
+ msgstr "Sie benutzen denselben Wert wie für die reguläre Kategoriebasis. Dabei können Konflikte entstehen, die zu Funktionsfehlern in URLs führen."
72
+
73
+ msgid "translations"
74
+ msgstr "Übersetzungen"
75
+
76
+ msgid "product"
77
+ msgstr "Produkt"
78
+
79
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">WPML</a> versions prior %s."
80
+ msgstr "WooCommerce Multilingual ist effektiv, funktioniert aber nicht. Es ist nicht kompatibel mit früheren <a href=\"%s\">WPML</a>-Versionen als %s."
81
+
82
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">Woocommerce</a> versions prior %s."
83
+ msgstr "WooCommerce Multilingual ist aktiviert, funktioniert aber nicht. Es ist nicht mit <a href=\"%s\">Woocommerce</a>-Versionen vor %s kompatibel."
84
+
85
+ msgid "You are using WooCommerce Multilingual %s. This version includes an important UI redesign for the configuration screens and it requires <a href=\"%s\">WPML %s</a> or higher. Everything still works on the front end now but, in order to configure options for WooCommerce Multilingual, you need to upgrade WPML."
86
+ msgstr "Sie verwenden WooCommerce Multilingual %s. Diese Version enthält eine wichtige Umgestaltung der Benutzeroberfläche für die Konfigurationsbildschirme und erfordert <a href=\"%s\">WPML %s</a> oder höher. Im Front-End funktioniert noch immer alles, aber um Optionen für WooCommerce Multilingual zu konfigurieren, müssen Sie WPML upgraden."
87
+
88
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">WPML Translation Management</a> versions prior %s."
89
+ msgstr "WooCommerce Multilingual ist aktiviert, funktioniert aber nicht. Es ist nicht kompatibel mit früheren Version von <a href=\"%s\">WPML Übersetzungsmanagement</a> als %s."
90
+
91
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">WPML String Translation</a> versions prior %s."
92
+ msgstr "WooCommerce Multilingual ist aktiviert, funktioniert aber nicht. Es ist nicht kompatibel mit früheren Versionen von <a href=\"%s\">WPML String Translation</a> als %s."
93
+
94
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">WPML Media</a> versions prior %s."
95
+ msgstr "WooCommerce Multilingual ist aktiviert, funktioniert aber nicht. Es ist nicht kompatibel mit früheren Version von <a href=\"%s\">WPML Media</a> als %s."
96
+
97
+ msgid "and"
98
+ msgstr "und"
99
+
100
+ msgid "WooCommerce Multilingual is enabled but not effective. It requires %s in order to work."
101
+ msgstr "WooCommerce Multilingual ist aktiviert, aber nicht aktiv. Es benötigt %s, um zu funktionieren."
102
+
103
+ msgid "Permalink settings"
104
+ msgstr "Permalink-Einstellungen"
105
+
106
+ msgid "Configure products slug translation"
107
+ msgstr "Produkt-Slug-Übersetzung konfigurieren"
108
+
109
+ msgid "If you want different slugs for shop pages (%s/%s), you need to disable the shop prefix for products in <a href=\"%s\">WooCommerce Settings</a>"
110
+ msgstr "Wenn Sie andere Slugs für Shop-Seiten haben wollen, (%s/%s), müssen Sie den Shop-Präfix für Produkte in den <a href=\"%s\">WooCommerce-Einstellungen</a> deaktivieren."
111
+
112
+ msgid "Finished! You can visit the %sstrings translation%s screen to translate the strings now."
113
+ msgstr "Fertig! Sie können jetzt den Bildschirm %sString-Übersetzung%s aufrufen, um die Strings zu übersetzen."
114
+
115
+ msgid "wpml-config.xml file missing from WooCommerce Multilingual folder."
116
+ msgstr "Die Datei wpml-config.xml fehlt im Ordner WooCommerce Multilingual."
117
+
118
+ msgid "Custom field %s configuration from wpml-config.xml file was altered!"
119
+ msgstr "Konfiguration des benutzerdefinierten Felds %s aus der Datei wpml-config.xml wurde geändert!"
120
+
121
+ msgid "Custom type %s configuration from wpml-config.xml file was altered!"
122
+ msgstr "Konfiguration des benutzerdefinierten Typs %s aus der Datei wpml-config.xml wurde geändert!"
123
+
124
+ msgid "Custom taxonomy %s configuration from wpml-config.xml file was altered!"
125
+ msgstr "Konfiguration der benutzerdefinierten Taxonomie %s aus der Datei wpml-config.xml wurde geändert!"
126
+
127
+ msgid "Upgrade WPML"
128
+ msgstr "WPML upgraden"
129
+
130
+ msgid "Invalid language parameter: %s"
131
+ msgstr "Ungültiger Sprachparameter: %s"
132
+
133
+ msgid "Source product id not found: %s"
134
+ msgstr "Quellprodukt-ID nicht gefunden: %s"
135
+
136
+ msgid "Product Base"
137
+ msgstr "Produktbasis"
138
+
139
+ msgid "Product Tag Base"
140
+ msgstr "Produkt-Tag-Basis"
141
+
142
+ msgid "Product Category Base"
143
+ msgstr "Produktkategoriebasis"
144
+
145
+ msgid "Product Attribute Base"
146
+ msgstr "Produktattributbasis"
147
+
148
+ msgid "Endpoint: %s"
149
+ msgstr "Endpunkt: %s"
150
+
151
+ msgid "product-category"
152
+ msgstr "Produktkategorie"
153
+
154
+ msgid "product-tag"
155
+ msgstr "Produkt-Tag"
156
+
157
+ msgid "Original language"
158
+ msgstr "Ausgangssprache"
159
+
160
+ msgid "Take this and edit"
161
+ msgstr "Annehmen und bearbeiten"
162
+
163
+ msgid "Add translation"
164
+ msgstr "Übersetzung hinzufügen"
165
+
166
+ msgid "Update translation"
167
+ msgstr "Übersetzung aktualisieren"
168
+
169
+ msgid "Finish translating"
170
+ msgstr "Übersetzung beenden"
171
+
172
+ msgid "Edit translation"
173
+ msgstr "Übersetzung bearbeiten"
174
+
175
+ msgid "Edit this item inline"
176
+ msgstr "Dieses Objekt inline bearbeiten"
177
+
178
+ msgid "Quick Edit"
179
+ msgstr "Schnellbearbeitung"
180
+
181
+ msgid "Translation in progress"
182
+ msgstr "Übersetzung wird ausgeführt"
183
+
184
+ msgid "Invalid nonce"
185
+ msgstr "Nonce ungültig"
186
+
187
+ msgid "Currency - no orders found"
188
+ msgstr "Währung - keine Reihenfolgen gefunden"
189
+
190
+ msgid "Currencies order updated"
191
+ msgstr "Währungsreihenfolge wurde aktualisiert"
192
+
193
+ msgid "Currency switcher"
194
+ msgstr "Währungsumschalter"
195
+
196
+ msgid "Configure options"
197
+ msgstr "Optionen konfigurieren"
198
+
199
+ msgid "Settings saved!"
200
+ msgstr "Einstellungen gespeichert!"
201
+
202
+ msgid "Add new currency"
203
+ msgstr "Neue Währung hinzufügen"
204
+
205
+ msgid "Update currency"
206
+ msgstr "Währung aktualisieren"
207
+
208
+ msgid "Update settings for %s"
209
+ msgstr "Einstellungen für %s aktualisieren"
210
+
211
+ msgid "The default currency was changed. In order to show accurate prices in all currencies, you need to update the exchange rates under the %sMulti-currency%s configuration."
212
+ msgstr "Die Standardwährung wurde geändert. Um in allen Währungen präzise Preise anzuzeigen, müssen Sie die Wechselkurse unter der Konfiguration %sMehrere Währungen%s aktualisieren."
213
+
214
+ msgid "All the products will be removed from the current order in order to change the currency"
215
+ msgstr "Alle Produkte werden aus dem aktuellen Ordner gelöscht, um die Währung zu ändern."
216
+
217
+ msgid "Show all currencies"
218
+ msgstr "Alle Währungen anzeigen"
219
+
220
+ msgid "Order currency:"
221
+ msgstr "Währungsreihenfolge:"
222
+
223
+ msgid "Cart"
224
+ msgstr "Einkaufswagen"
225
+
226
+ msgid "Checkout"
227
+ msgstr "Zur Kasse"
228
+
229
+ msgid "Checkout &rarr; Pay"
230
+ msgstr "Zur Kasse &rarr; zahlen"
231
+
232
+ msgid "Order Received"
233
+ msgstr "Auftrag erhalten"
234
+
235
+ msgid "My Account"
236
+ msgstr "Mein Account"
237
+
238
+ msgid "Change Password"
239
+ msgstr "Passwort ändern"
240
+
241
+ msgid "Edit My Address"
242
+ msgstr "Meine Adresse bearbeiten"
243
+
244
+ msgid "Logout"
245
+ msgstr "Ausloggen"
246
+
247
+ msgid "Lost Password"
248
+ msgstr "Passwort vergessen"
249
+
250
+ msgid "View Order"
251
+ msgstr "Auftrag anzeigen"
252
+
253
+ msgid "Shop"
254
+ msgstr "Shop"
255
+
256
+ msgid "All the products will be removed from the current order in order to change the language"
257
+ msgstr "Alle Produkte werden aus dem aktuellen Ordner entfernt, um die Sprache zu ändern"
258
+
259
+ msgid "Order language:"
260
+ msgstr "Sprachreihenfolge:"
261
+
262
+ msgid "Choose a file"
263
+ msgstr "Datei wählen"
264
+
265
+ msgid "At least one of these fields is required: title, content or excerpt"
266
+ msgstr "Mindestens eines dieser Felder muss ausgefüllt werden: Titel, Inhalt oder Auszug"
267
+
268
+ msgid "This translation job will no longer be assigned to you. Other translators will be able take it and continue the translation."
269
+ msgstr "Dieser Übersetzungsauftrag wird Ihnen nicht mehr zugeteilt. Andere Übersetzer werden ihn annehmen und die Übersetzung fortführen können."
270
+
271
+ msgid "This field is locked for editing because WPML will copy its value from the original language."
272
+ msgstr "Dieses Feld ist für die Bearbeitung gesperrt, da WPML seinen Wert aus der Originalsprache kopieren wird."
273
+
274
+ msgid "This is a translation of %s. Some of the fields are not editable. It's recommended to use the %s for translating products."
275
+ msgstr "Dies ist eine Übersetzung von %s. Einige der Felder sind nicht bearbeitbar. Wir empfehlen, für die Übersetzung der Produkte %s zu verwenden."
276
+
277
+ msgid "WooCommerce Multilingual products translator"
278
+ msgstr "WooCommerce Multilingual-Produktübersetzer"
279
+
280
+ msgid "Looks like you are upgrading from a previous version of WooCommerce Multilingual. Would you like to automatically create translated variations and images?"
281
+ msgstr "Scheinbar upgraden Sie von einer früheren Version von WooCommerce Multilingual. Möchten Sie automatisch übersetzte Variationen und Bilder erstellen?"
282
+
283
+ msgid "Yes, go to the troubleshooting page"
284
+ msgstr "Ja, zur Fehlerbehebungs-Seite gehen"
285
+
286
+ msgid "No - dismiss"
287
+ msgstr "Nein - verwerfen"
288
+
289
+ msgid "You've successfully installed %sWooCommerce Multilingual%s. Would you like to see a quick overview?"
290
+ msgstr "Sie haben erfolgreich %sWooCommerce Multilingual%s. installiert. Möchten Sie eine kurze Übersicht sehen?"
291
+
292
+ msgid "Learn how to turn your e-commerce site multilingual"
293
+ msgstr "Lernen Sie, wie Sie Ihre E-Commerce-Seite mehrsprachig machen"
294
+
295
+ msgid "Dismiss"
296
+ msgstr "Ausblenden"
297
+
298
+ msgid "To translate %s please use the %s translation%s page, inside the %sWooCommerce Multilingual admin%s."
299
+ msgstr "Um %s zu übersetzen, benutzen Sie bitte die %sÜbersetzungs-%s-Seite im %sWooCommerce Multilingual-Adminbereich%s."
300
+
301
+ msgid "%s do not require translation."
302
+ msgstr "%s erfordern keine Übersetzung."
303
+
304
+ msgid "Include to translation"
305
+ msgstr "In die Übersetzung einbeziehen"
306
+
307
+ msgid "%d %s are missing translations."
308
+ msgstr "In %d %s fehlen Übersetzungen."
309
+
310
+ msgid "Translate %s"
311
+ msgstr "%s übersetzen"
312
+
313
+ msgid "Exclude from translation"
314
+ msgstr "Aus der Übersetzung ausschließen"
315
+
316
+ msgid "All %s are translated."
317
+ msgstr "Alle %s sind übersetzt."
318
+
319
+ msgid "Currently, there are %s variations that need to be created."
320
+ msgstr "Aktuell müssen %s-Variationen erstellt werden."
321
+
322
+ msgid "%d products left"
323
+ msgstr "noch %d Produkte"
324
+
325
+ msgid "Synchronization complete!"
326
+ msgstr "Synchronisierung abgeschlossen!"
327
+
328
+ msgid "Invalid taxonomy %s"
329
+ msgstr "Ungültige Taxonomie %s"
330
+
331
+ msgid "Some translated %s have different %s assignments."
332
+ msgstr "Einige übersetzte %s haben verschiedene %s-Zuteilungen."
333
+
334
+ msgid "Update %s for all translated %s"
335
+ msgstr "%s für alle übersetzten %s aktualisieren"
336
+
337
+ msgid "All %s have the same %s assignments."
338
+ msgstr "%s haben die gleichen %s-Zuteilungen."
339
+
340
+ msgid "Successfully updated %s for all translated %s."
341
+ msgstr "%s für alle übersetzten %s erfolgreich aktualisiert."
342
+
343
+ msgid "Synchronize attributes and update product variations"
344
+ msgstr "Attribute synchronisieren und Produkt-Variationen aktualisieren"
345
+
346
+ msgid "Image"
347
+ msgstr "Bild"
348
+
349
+ msgid "Product"
350
+ msgstr "Produkt"
351
+
352
+ msgid "Type"
353
+ msgstr "Typ"
354
+
355
+ msgid "Date"
356
+ msgstr "Datum"
357
+
358
+ msgid "Categories"
359
+ msgstr "Kategorien"
360
+
361
+ msgid "No products found"
362
+ msgstr "Keine Produkte gefunden"
363
+
364
+ msgid "Draft"
365
+ msgstr "Entwurf"
366
+
367
+ msgid "Private"
368
+ msgstr "Privat"
369
+
370
+ msgid "Pending"
371
+ msgstr ""
372
+
373
+ msgid "Scheduled"
374
+ msgstr "Geplant"
375
+
376
+ msgid "Parent product: %s"
377
+ msgstr "Übergeordnetes Produkt: %s"
378
+
379
+ msgid "Edit this item"
380
+ msgstr "Dieses Objekt bearbeiten"
381
+
382
+ msgid "Edit"
383
+ msgstr "Bearbeiten"
384
+
385
+ msgid "View \"%s\""
386
+ msgstr "\"%s\" anzeigen"
387
+
388
+ msgid "View"
389
+ msgstr "Anzeigen"
390
+
391
+ msgid "Published"
392
+ msgstr "Veröffentlicht"
393
+
394
+ msgid "Last Modified"
395
+ msgstr "Datum der letzten Änderung"
396
+
397
+ msgid "All languages"
398
+ msgstr "Alle Sprachen"
399
+
400
+ msgid "All categories"
401
+ msgstr "Alle Kategorien"
402
+
403
+ msgid "All translation statuses"
404
+ msgstr "Alle Übersetzungsstatus"
405
+
406
+ msgid "Not translated or needs updating"
407
+ msgstr "Nicht übersetzt oder bedarf eines Updates"
408
+
409
+ msgid "Needs updating"
410
+ msgstr "Aktualisierung erforderlich"
411
+
412
+ msgid "Translation complete"
413
+ msgstr "Übersetzung abgeschlossen"
414
+
415
+ msgid "All statuses"
416
+ msgstr "Alle Statusanzeigen"
417
+
418
+ msgid "Filter"
419
+ msgstr "Filter"
420
+
421
+ msgid "Reset"
422
+ msgstr "Zurücksetzen"
423
+
424
+ msgid "Search"
425
+ msgstr "Suche"
426
+
427
+ msgid "%d items"
428
+ msgstr "%d Objekte"
429
+
430
+ msgid "Go to the first page"
431
+ msgstr "Zur ersten Seite gehen"
432
+
433
+ msgid "Go to the previous page"
434
+ msgstr "Zur vorherigen Seite gehen"
435
+
436
+ msgid "Select Page"
437
+ msgstr "Seite auswählen"
438
+
439
+ msgid "Current page"
440
+ msgstr "Aktuelle Seite"
441
+
442
+ msgid "of"
443
+ msgstr "von"
444
+
445
+ msgid "Go to the next page"
446
+ msgstr "Zur nächsten Seite gehen"
447
+
448
+ msgid "Go to the last page"
449
+ msgstr "Zur letzten Seite gehen"
450
+
451
+ msgid "Translatable?"
452
+ msgstr "Übersetzbar?"
453
+
454
+ msgid "Enable this if you want to translate attribute values with Woocommerce Multilingual"
455
+ msgstr "Aktivieren Sie dies, wenn Sie Attributwerte mit WooCommerce Multilingual übersetzen möchten."
456
+
457
+ msgid "Existing translations and variations associated will be deleted."
458
+ msgstr "Vorhandene Übersetzungen und damit verbundene Variationen werden gelöscht."
459
+
460
+ msgid "Product Translation Interface"
461
+ msgstr "Produkt-Übersetzungsoberfläche"
462
+
463
+ msgid "The recommended way is using the WPML Translation Editor. It is streamlined for making the translation process much easier while also providing a much better integration with various WooCommerce extensions."
464
+ msgstr "Die empfohlene Methode ist der Einsatz des WPML Translation Editor. Dieser ist so optimiert, dass er den Übersetzungsvoggang vereinfacht und zugleich bessere Integration in mehrere WooCommerce-Erweiterungen bietet."
465
+
466
+ msgid "WPML Translation Editor"
467
+ msgstr "WPML Translation Editor"
468
+
469
+ msgid "Native WooCommerce product editing screen"
470
+ msgstr "Nativer WooCommerce-Produktbearbeitungsbildschirm"
471
+
472
+ msgid "Products synchronization"
473
+ msgstr "Produkte-Synchronisierung"
474
+
475
+ msgid "Configure specific product properties that should be synced to translations."
476
+ msgstr "Konfigurieren Sie bestimmte Produktattribute, die in den Übersetzungen nicht synchronisiert werden sollen."
477
+
478
+ msgid "Sync publishing date for translated products."
479
+ msgstr "Veröffentlichungsdatum für übersetzte Produkte synchronisieren."
480
+
481
+ msgid "Sync products and product taxonomies order."
482
+ msgstr "Produkte und Produkt-Taxonomie-Reihenfolge synchronisieren."
483
+
484
+ msgid "Products Download Files"
485
+ msgstr "Produkte-Download-Dateien"
486
+
487
+ msgid "If you are using downloadable products, you can choose to have their paths\n synchronized, or seperate for each language."
488
+ msgstr "Wenn Sie heruntergeladene Produkte benutzen, können Sie die Pfade\n wahlweise synchronisieren oder für jede Sprache trennen."
489
+
490
+ msgid "Use the same files for translations"
491
+ msgstr "Dieselben Dateien für Übersetzungen benutzen"
492
+
493
+ msgid "Add separate download files for translations"
494
+ msgstr "Separate Download-Dateien für Übersetzungen hinzufügen"
495
+
496
+ msgid "Save changes"
497
+ msgstr "Änderungen speichern"
498
+
499
+ msgid "Troubleshooting page"
500
+ msgstr "Fehlerbehebungsseite"
501
+
502
+ msgid "Update Translation"
503
+ msgstr "Übersetzung aktualisieren"
504
+
505
+ msgid "Hide This Message"
506
+ msgstr "Diese Meldung ausblenden"
507
+
508
+ msgid "<strong>WooCommerce Translation Available</strong> &#8211; Install or update your <code>%s</code> translations to version <code>%s</code>."
509
+ msgstr "<strong>WooCommerce-Übersetzung verfügbar</strong> &#8211; Installieren oder aktualisieren Sie Ihre <code>%s</code> Übersetzungen auf die Version <code>%s</code>."
510
+
511
+ msgid "This will automatically generate variations for translated products corresponding to recently translated attributes."
512
+ msgstr "Dies wird automatisch Variationen für übersetzte Produkte erstellen, die den vor Kurzem übersetzten Attributen entsprechen."
513
+
514
+ msgid "Synchronize %s assignment in content"
515
+ msgstr "%s-Zuteilung im Inhalt synchronisieren"
516
+
517
+ msgid "This action lets you automatically apply the %s taxonomy to your content in different languages. It will scan the original content and apply the same taxonomy to translated content."
518
+ msgstr "Mit dieser Aktion können Sie die %s-Taxonomie automatisch auf Ihren Inhalt in verschiedenen Sprachen anwenden. Sie wird den Originalinhalt durchsuchen und die gleiche Taxonomie auf den übersetzten Inhalt anwenden."
519
+
520
+ msgid "You have untranslated terms!"
521
+ msgstr "Sie haben unübersetzte Begriffe!"
522
+
523
+ msgid "Select currency"
524
+ msgstr "Währung auswählen"
525
+
526
+ msgid "Exchange Rate"
527
+ msgstr "Wechselkurs"
528
+
529
+ msgid "Only numeric"
530
+ msgstr "Nur numerisch"
531
+
532
+ msgid "Set on %s"
533
+ msgstr "Einstellen auf %s"
534
+
535
+ msgid "Currency Preview"
536
+ msgstr "Währungsvorschau"
537
+
538
+ msgid "Currency Position"
539
+ msgstr "Währungsposition"
540
+
541
+ msgid "Left"
542
+ msgstr "Links"
543
+
544
+ msgid "Right"
545
+ msgstr "Rechts"
546
+
547
+ msgid "Left with space"
548
+ msgstr "Links mit Abstand "
549
+
550
+ msgid "Right with space"
551
+ msgstr "Rechts mit Abstand"
552
+
553
+ msgid "Thousand Separator"
554
+ msgstr "Tausenderpunkt"
555
+
556
+ msgid "Decimal Separator"
557
+ msgstr "Dezimaltrenner"
558
+
559
+ msgid "Number of Decimals"
560
+ msgstr "Anzahl der Dezimalstellen"
561
+
562
+ msgid "Rounding to the nearest integer"
563
+ msgstr "Rundung auf die nächste ganze Zahl"
564
+
565
+ msgid "Disabled"
566
+ msgstr "Deaktiviert"
567
+
568
+ msgid "Up"
569
+ msgstr "Hoch"
570
+
571
+ msgid "Down"
572
+ msgstr "Runter"
573
+
574
+ msgid "Nearest"
575
+ msgstr "Nächste"
576
+
577
+ msgid "Increment for nearest integer"
578
+ msgstr "Schrittweite bis zur nächsten ganzen Zahl"
579
+
580
+ msgid "Autosubtract amount"
581
+ msgstr "Betrag automatisch abziehen"
582
+
583
+ msgid "Cancel"
584
+ msgstr "Abbrechen"
585
+
586
+ msgid "Save"
587
+ msgstr "Speichern"
588
+
589
+ msgid "Products"
590
+ msgstr "Produkte"
591
+
592
+ msgid "Tags"
593
+ msgstr "Tags"
594
+
595
+ msgid "Attributes"
596
+ msgstr "Attribute"
597
+
598
+ msgid "Shipping Classes"
599
+ msgstr "Versandklassen"
600
+
601
+ msgid "Settings"
602
+ msgstr "Einstellungen"
603
+
604
+ msgid "Multi-currency"
605
+ msgstr "Mehrere Währungen"
606
+
607
+ msgid "Store URLs"
608
+ msgstr "Shop-URLs"
609
+
610
+ msgid "Status"
611
+ msgstr "Status"
612
+
613
+ msgid "Troubleshooting"
614
+ msgstr "Fehlerbehebung"
615
+
616
+ msgid "Thank you for using %sWooCommerce Multilingual%s! You can express your love and\n support by %s rating our plugin and saying that %sit works%s for you."
617
+ msgstr "Danke, dass Sie %sWooCommerce Multilingual%s benutzen! Ihre Begeisterung und Unterstützung können\n Sie immer ausdrücken,%s indem Sie unser Plugin bewerten und erzählen, dass %ses bei Ihnen funktioniert.%s"
618
+
619
+ msgid "Hide"
620
+ msgstr "Ausblenden"
621
+
622
+ msgid "Loading ..."
623
+ msgstr "Ladevorgang ..."
624
+
625
+ msgid "Regular Price"
626
+ msgstr "Regulärer Preis"
627
+
628
+ msgid "Sale Price"
629
+ msgstr "Verkaufspreis"
630
+
631
+ msgid "Multi-currency is enabled but no secondary currencies have been set. %sAdd secondary currencies%s."
632
+ msgstr ""
633
+
634
+ msgid "Calculate prices in other currencies automatically"
635
+ msgstr "Berechnet Preise in anderen Währungen automatisch"
636
+
637
+ msgid "Click to see the prices in the other currencies as they are currently shown on the front end."
638
+ msgstr "Klicken Sie, um die Preise in den anderen Währungen zu sehen, wie sie aktuell im Frontend angezeigt werden."
639
+
640
+ msgid "Show"
641
+ msgstr "Anzeigen"
642
+
643
+ msgid "Set prices in other currencies manually"
644
+ msgstr "Preise in anderen Währungen manuell festlegen"
645
+
646
+ msgid "Enter prices in other currencies"
647
+ msgstr "Geben Sie Preise in anderen Währungen ein"
648
+
649
+ msgid "Hide prices in other currencies"
650
+ msgstr "Preise in anderen Währungen ausblenden"
651
+
652
+ msgid "Determined automatically based on exchange rate"
653
+ msgstr "Wird auf Basis des Wechselkurses automatisch bestimmt"
654
+
655
+ msgid "Schedule"
656
+ msgstr "Zeitplan"
657
+
658
+ msgid "Same as default currency"
659
+ msgstr "Gleich wie die Standardwährung"
660
+
661
+ msgid "Set dates"
662
+ msgstr "Termine festlegen"
663
+
664
+ msgid "Collapse"
665
+ msgstr "Einklappen"
666
+
667
+ msgid "From&hellip;"
668
+ msgstr "Von&hellip;"
669
+
670
+ msgid "To&hellip;"
671
+ msgstr "An&hellip;"
672
+
673
+ msgid "Please enter in a value less than the regular price"
674
+ msgstr "Bitte geben Sie einen Wert ein, der geringer als der normale Preis ist"
675
+
676
+ msgid "Required plugins"
677
+ msgstr "Erforderliche Plugins"
678
+
679
+ msgid "Plugins Status"
680
+ msgstr "Plugins-Status"
681
+
682
+ msgid "WooCommerce Multilingual depends on several plugins to work. If any required plugin is missing, you should install and activate it."
683
+ msgstr "WooCommerce Multilingual benötigt mehrere Plugins, um zu funktionieren. Wenn ein erforderliches Plugin fehlt, sollten Sie es installieren und aktivieren."
684
+
685
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">WPML</a> versions prior 2.0.5."
686
+ msgstr "WooCommerce Multilingual ist aktiviert, funktioniert aber nicht. Es ist nicht mit <a href=\"%s\">WPML</a>-Versionen vor 2.0.5 kompatibel."
687
+
688
+ msgid "Update WPML"
689
+ msgstr "WPML aktualisieren"
690
+
691
+ msgid "Get WPML"
692
+ msgstr "WPML herunterladen"
693
+
694
+ msgid "Get WPML Media"
695
+ msgstr "WPML Media herunterladen"
696
+
697
+ msgid "Get WPML Translation Management"
698
+ msgstr "WPML Übersetzungsmanagement herunterladen"
699
+
700
+ msgid "Get WPML String Translation"
701
+ msgstr "WPML String Translation herunterladen"
702
+
703
+ msgid "%s is installed and active."
704
+ msgstr "%s ist installiert und aktiv."
705
+
706
+ msgid "%s is set up."
707
+ msgstr "%s ist eingerichtet."
708
+
709
+ msgid "%s is not set up."
710
+ msgstr "%s ist nicht eingerichtet."
711
+
712
+ msgid "%s is either not installed or not active."
713
+ msgstr "%s ist entweder nicht installiert oder nicht aktiv."
714
+
715
+ msgid "%1$s is installed, but with incorrect version. You need %1$s %2$s or higher. "
716
+ msgstr "%1$s ist installiert, aber in der falschen Version. Sie brauchen %1$s %2$s oder höher."
717
+
718
+ msgid "Download WooCommerce"
719
+ msgstr "WooCommerce herunterladen"
720
+
721
+ msgid "The WordPress Multilingual Plugin"
722
+ msgstr "Das WordPress Multilingual-Plugin"
723
+
724
+ msgid "This page allows you to translate all strings that are being used by WooCommerce in building different type of urls. Translating them enables you to have fully localized urls that match the language of the pages."
725
+ msgstr "Diese Seite ermöglicht es Ihnen, alle Strings zu übersetzen, die von WooCommerce zur Erstellung verschiedener URL-Typen verwendet werden. Wenn Sie diese übersetzen, haben Sie komplett lokalisierte URLs, die zur Sprache der Seiten passen."
726
+
727
+ msgid "You can enter or edit your default values on the %sPermalinks settings%s page or, for the endpoints, on the WooCommerce %sAccount settings%s page."
728
+ msgstr "Sie können Ihre Standardwerte auf der %sPermalinks-Einstellungen%s-Seite eingeben oder bearbeiten, oder im Falle der Endpunkte auf der WooCommerce %sAccount-Einstellungs%s-Seite."
729
+
730
+ msgid "permalinks settings"
731
+ msgstr "Permalinks-Einstellungen"
732
+
733
+ msgid "Account settings"
734
+ msgstr "Account-Einstellungen"
735
+
736
+ msgid "Slug type"
737
+ msgstr "Slug-Typ"
738
+
739
+ msgid "Original Slug"
740
+ msgstr "Original-Slug"
741
+
742
+ msgid "Shop page"
743
+ msgstr "Shop-Seite"
744
+
745
+ msgid "Product base"
746
+ msgstr "Produktbasis"
747
+
748
+ msgid "Product category base"
749
+ msgstr "Produktkategoriebasis"
750
+
751
+ msgid "Product tag base"
752
+ msgstr "Produkt-Tag-Basis"
753
+
754
+ msgid "Product attribute base"
755
+ msgstr "Produktattributbasis"
756
+
757
+ msgid "Original"
758
+ msgstr "Original"
759
+
760
+ msgid "Translation to"
761
+ msgstr "Übersetzung auf"
762
+
763
+ msgid "Product Shop Base"
764
+ msgstr "Produkt-Shop-Basis"
765
+
766
+ msgid "Welcome to WooCommerce Multilingual!"
767
+ msgstr "Willkommen bei WooCommerce Multilingual!"
768
+
769
+ msgid "Configure the multilingual support for your e-commerce site in just a couple of minutes."
770
+ msgstr ""
771
+
772
+ msgid "By default, the products are translatable just like product categories, product tags and attributes. So you can start translating these right away."
773
+ msgstr "Standardmäßig sind die Produkte genau wie Produktkategorien, Produkt-Tags und Attribute übersetzbar. So können Sie sofort mit ihrer Übersetzung beginnen."
774
+
775
+ msgid "You can configure, however, which attributes you want to translate, install the translated shop pages or enable the multi-currency mode."
776
+ msgstr "Sie können jedoch konfigurieren, welche Attribute Sie übersetzen wollen, die übersetzten Shop-Seiten installieren oder den Modus für mehrere Währungen aktivieren."
777
+
778
+ msgid "Start"
779
+ msgstr "Start"
780
+
781
+ msgid "No, thanks. I'll do it later."
782
+ msgstr "Nein, danke. Das mache ich später."
783
+
784
+ msgid "Select translatable attributes"
785
+ msgstr "Übersetzbare Attribute auswählen"
786
+
787
+ msgid "There are no attributes defined"
788
+ msgstr "Es wurden keine Attribute definiert"
789
+
790
+ msgid "Continue"
791
+ msgstr "Weiter"
792
+
793
+ msgid "Later"
794
+ msgstr "Später"
795
+
796
+ msgid "One or more WooCommerce pages have not been created"
797
+ msgstr "Eine oder mehrere WooCommerce-Seiten wurden nicht erstellt"
798
+
799
+ msgid "Install missing WooCommerce pages and create translations."
800
+ msgstr "Installieren Sie fehlende WooCommerce-Seiten und erstellen Sie Übersetzungen."
801
+
802
+ msgid "Translate Store Pages"
803
+ msgstr "Store-Seiten übersetzen"
804
+
805
+ msgid "All store pages must be translated in the languages configured on the site."
806
+ msgstr "Alle Store-Seiten müssen in die auf der Seite konfigurierten Sprachen übersetzt werden."
807
+
808
+ msgid "Select the translation interface"
809
+ msgstr "Wählen Sie die Übersetzungsoberfläche aus."
810
+
811
+ msgid "Enable multiple currencies"
812
+ msgstr "Mehrere Währungen aktivieren"
813
+
814
+ msgid "This will allow you to set prices for products in different currencies. The prices can be determined based on a given exchange rate or set explicitly for specific products."
815
+ msgstr "Hiermit können Sie Preise für Produkte in verschiedenen Kategorien festlegen. Die Preise können auf Basis eines angegebenen Wechselkurses ermittelt oder gezielt für bestimmte Produkte eingestellt werden."
816
+
817
+ msgid "Enable the multi-currency mode"
818
+ msgstr "Modus für mehrere Währungen aktivieren"
819
+
820
+ msgid "Further actions that are necessary for making your existing content multilingual, are listed below."
821
+ msgstr "Weitere Aktionen, die nötig sind, um Ihren vorhandenen Inhalt mehrsprachig zu machen, sind unten aufgeführt."
822
+
823
+ msgid "Start translating products"
824
+ msgstr "Beginnen Sie, Produkte zu übersetzen"
825
+
826
+ msgid "Add secondary currencies on the %smulti-currency configuration%s page"
827
+ msgstr "Fügen Sie auf der Seite %sKonfiguration für mehrere Währungen%s weitere Währungen hinzu"
828
+
829
+ msgid "Translate existing terms for these %sproduct attributes%s: %s"
830
+ msgstr "Übersetzen Sie vorhandene Begriffe für diese %sProduktattribute%s: %s"
831
+
832
+ msgid "Translate existing %sproduct categories%s"
833
+ msgstr "Übersetzen Sie vorhandene %sProduktkategorien%s"
834
+
835
+ msgid "Translate existing %sproduct tags%s"
836
+ msgstr "Übersetzen Sie vorhandene %sProdukt-Tags%s"
837
+
838
+ msgid "%sAdd missing translations%s for shipping classes"
839
+ msgstr "%sFügen Sie fehlende Übersetzungen hinzu%s für Versandklassen"
840
+
841
+ msgid "Translate %sURL slugs%s to create multilingual store and product urls"
842
+ msgstr "Übersetzen Sie %sURL-Slugs%s, um mehrsprachige Store- und Produkt-URLs zu generieren"
843
+
844
+ msgid "Use custom settings for translations download files"
845
+ msgstr ""
846
+
847
+ msgid "WooCommerce Store Pages"
848
+ msgstr "WooCommerce Store-Seiten"
849
+
850
+ msgid "To run a multilingual e-commerce site, you need to have the WooCommerce shop pages translated to all the site's languages. Once all the pages are installed you can add the translations for them from this menu."
851
+ msgstr "Um eine mehrsprachige E-Commerce-Seite zu betreiben, müssen Sie die WooCommerce-Shop-Seiten in alle Sprachen der Seite übersetzen lassen. Sobald alle Seiten installiert sind, können Sie die Übersetzungen für diese aus dem Menü hinzufügen."
852
+
853
+ msgid "One or more WooCommerce pages have not been created."
854
+ msgstr "Eine oder mehrere WooCommerce-Seite wurden nicht erstellt."
855
+
856
+ msgid "Install WooCommerce Pages"
857
+ msgstr "WooCommerce-Seiten installieren"
858
+
859
+ msgid "WooCommerce store pages do not exist for these languages:"
860
+ msgstr "Für diese Sprachen gibt es keine WooCommerce-Shop-Seiten:"
861
+
862
+ msgid "Create missing translations"
863
+ msgstr "Fehlende Übersetzungen erstellen"
864
+
865
+ msgid "These pages are currently being translated by translators via WPML: "
866
+ msgstr "Diese Seiten werden aktuell von Übersetzern über WPML übersetzt:"
867
+
868
+ msgid "WooCommerce store pages are translated to all the site's languages."
869
+ msgstr "WooCommerce Store-Seiten werden in alle Sprachen der Seite übersetzt."
870
+
871
+ msgid "Configuration warnings"
872
+ msgstr "Konfigurationswarnungen"
873
+
874
+ msgid "Reporting miscelaneous configuration issues that can make WooCommerce Multilingual not run normally"
875
+ msgstr "Es wurden verschiedene Konfigurationsprobleme gemeldet, die dazu führen können, dass WooCommerce Multilingual nicht richtig funktioniert"
876
+
877
+ msgid "Your product permalink base is not translated to:"
878
+ msgstr "Ihre Produkt-Permalink-Basis ist nicht übersetzt auf:"
879
+
880
+ msgid "Translate URLs"
881
+ msgstr "URLs übersetzen"
882
+
883
+ msgid "Your site's default language is not English and the strings language is also not English."
884
+ msgstr "Die Standardsprache Ihrer Seite ist nicht Englisch und die Sprache der Strings ist ebenfalls nicht Englisch."
885
+
886
+ msgid "Running WooCommerce multilingual with default language other than English."
887
+ msgstr "Betrieb von WooCommerce Multilingual mit einer anderen Standardsprache als Englisch."
888
+
889
+ msgid "This may cause problems with URLs in different languages."
890
+ msgstr "Dies kann Probleme mit URLs in unterschiedlichen Sprachen hervorrufen."
891
+
892
+ msgid "Change default language"
893
+ msgstr "Standardsprache ändern"
894
+
895
+ msgid "Your site's default language is not English."
896
+ msgstr "Die Standardsprache Ihrer Seite ist nicht Englisch."
897
+
898
+ msgid "There are some settings that require careful attention."
899
+ msgstr "Einige der Einstellungen müssen sorgfältig ausgewählt werden."
900
+
901
+ msgid "Some settings from the WooCommerce Multilingual wpml-config.xml file have been overwritten."
902
+ msgstr "Einige Einstellungen aus der wpml-config.xml-Datei in WooCommerce Multilingual wurden überschrieben."
903
+
904
+ msgid "You should check WPML configuration files added by other plugins or manual settings on the %s section."
905
+ msgstr "Sie sollten die WPML-Konfigurationsdateien prüfen, die von anderen Plugins hinzugefügt wurden oder die manuellen Einstellungen im Abschnitt %s."
906
+
907
+ msgid "Multilingual Content Setup"
908
+ msgstr "Einrichtung des mehrsprachigen Inhalts"
909
+
910
+ msgid "Taxonomies missing translations"
911
+ msgstr "Übersetzungen in Taxonomien fehlen"
912
+
913
+ msgid "To run a fully translated site, you should translate all taxonomy terms. Some store elements, such as variations, depend on taxonomy translation."
914
+ msgstr "Um eine vollständig übersetzte Seite zu betreiben, sollten Sie alle Taxonomie-Begriffe übersetzen. Einige Store-Elemente wie Variationen hängen von der Taxonomie-Übersetzung ab."
915
+
916
+ msgid "This taxonomy requires translation."
917
+ msgstr "Diese Taxonomie erfordert eine Übersetzung."
918
+
919
+ msgid "Include in translation"
920
+ msgstr "In die Übersetzung einbeziehen"
921
+
922
+ msgid "This taxonomy does not require translation."
923
+ msgstr "Diese Taxonomie erfordert keine Übersetzung."
924
+
925
+ msgid "Right now, there are no taxonomy terms needing translation."
926
+ msgstr "Aktuell benötigen keine Taxonomie-Begriffe eine Übersetzung."
927
+
928
+ msgid "There are no translatable product attributes defined"
929
+ msgstr "Es wurden keine übersetzbaren Produktattribute definiert"
930
+
931
+ msgid "Select the attribute to translate: "
932
+ msgstr "Wählen Sie das zu übersetzende Attribut:"
933
+
934
+ msgid "Please make a backup of your database before you start the synchronization"
935
+ msgstr "Bitte erstellen Sie ein Backup Ihrer Datenbank, bevor Sie die Synchronisierung starten."
936
+
937
+ msgid "Sync variables products"
938
+ msgstr "Variable Produkte synchronisieren"
939
+
940
+ msgid "Update products count:"
941
+ msgstr "Produktzähler aktualisieren:"
942
+
943
+ msgid "products with variations"
944
+ msgstr "Produkte mit Variationen"
945
+
946
+ msgid "Sync products variations:"
947
+ msgstr "Produkt-Variationen synchronisieren:"
948
+
949
+ msgid "left"
950
+ msgstr "übrig"
951
+
952
+ msgid "Sync products \"gallery images\":"
953
+ msgstr "Produkt-\"Galeriebilder\" synchr.:"
954
+
955
+ msgid "Sync products categories (display type, thumbnail):"
956
+ msgstr "Produktkategorien synchronisieren (Anzeigetyp, Miniaturbild):"
957
+
958
+ msgid "Duplicate terms ( please select attribute ):"
959
+ msgstr "Begriffe duplizieren (bitte Attribut auswählen):"
960
+
961
+ msgid "none"
962
+ msgstr "keine"
963
+
964
+ msgid "Enable/disable"
965
+ msgstr "Aktivieren/deaktivieren"
966
+
967
+ msgid "Currencies"
968
+ msgstr "Währungen"
969
+
970
+ msgid "Add currency"
971
+ msgstr "Währung hinzufügen"
972
+
973
+ msgid "Currency"
974
+ msgstr "Währung"
975
+
976
+ msgid "Rate"
977
+ msgstr "Kurs"
978
+
979
+ msgid "default"
980
+ msgstr "Voreinstellung"
981
+
982
+ msgid "Default currency"
983
+ msgstr "Standardwährung"
984
+
985
+ msgid "Switch to this currency when switching language in the front-end"
986
+ msgstr "Beim Umschalten der Sprache im Front-End auf diese Währung umschalten"
987
+
988
+ msgid "Keep"
989
+ msgstr "Beibehalten"
990
+
991
+ msgid "Delete"
992
+ msgstr "Löschen"
993
+
994
+ msgid " (%s)"
995
+ msgstr "(%s)"
996
+
997
+ msgid "The multi-currency mode cannot be enabled as a specific currency was not set. Go to the %sWooCommerce settings%s page and select the default currency for your store."
998
+ msgstr "Der Modus für mehrere Währungen kann nicht aktiviert werden, da keine bestimmte Währung eingestellt wurde. Gehen Sie auf die Seite %sWooCommerce-Einstellungen%s und wählen Sie die Standardwährung für Ihren Shop aus."
999
+
1000
+ msgid "Learn more"
1001
+ msgstr "Mehr erfahren"
1002
+
1003
+ msgid "Show only products with custom prices in secondary currencies"
1004
+ msgstr "Nur Produkte mit benutzerdefinierten Preisen in Zweitwährungen anzeigen"
1005
+
1006
+ msgid "When this option is on, when you switch to a secondary currency on the front end, only the products with custom prices in that currency are being displayed. Products with prices determined based on the exchange rate are hidden."
1007
+ msgstr "Wenn diese Option eingeschaltet ist und Sie im Frontend auf eine Zweitwährung wechseln, werden in dieser Währung nur Produkte mit benutzerdefinierten Preisen angezeigt. Produkte mit Preisen, die basierend auf dem Wechselkurs bestimmt werden, werden ausgeblendet."
1008
+
1009
+ msgid "The changes you made will be lost if you navigate away from this page."
1010
+ msgstr "Die von Ihnen durchgeführten Änderungen gehen verloren, wenn Sie von dieser Seite weg navigieren."
1011
+
1012
+ msgid "At least one currency must be enabled for this language!"
1013
+ msgstr "Mindestens eine Währung muss für diese Sprache aktiviert sein!"
1014
+
1015
+ msgid "Currency switcher options"
1016
+ msgstr "Währungsumschalter-Optionen"
1017
+
1018
+ msgid "Currency switcher style"
1019
+ msgstr "Währungsumschalter-Stil"
1020
+
1021
+ msgid "Currency order"
1022
+ msgstr "Währungsreihenfolge"
1023
+
1024
+ msgid "Available parameters"
1025
+ msgstr "Verfügbare Parameter"
1026
+
1027
+ msgid "Template for currency switcher"
1028
+ msgstr "Template für Währungsumschalter"
1029
+
1030
+ msgid "Visibility"
1031
+ msgstr "Sichtbarkeit"
1032
+
1033
+ msgid "Currency switcher preview"
1034
+ msgstr "Währungsumschalter-Vorschau"
1035
+
1036
+ msgid "Drop-down menu"
1037
+ msgstr "Dropdown-Menü"
1038
+
1039
+ msgid "List of currencies"
1040
+ msgstr "Liste der Währungen"
1041
+
1042
+ msgid "Vertical"
1043
+ msgstr "Vertikal"
1044
+
1045
+ msgid "Horizontal"
1046
+ msgstr "Horizontal"
1047
+
1048
+ msgid "Drag the currencies to change their order"
1049
+ msgstr "Ziehen Sie die Währungen, um ihre Reihenfolge zu ändern"
1050
+
1051
+ msgid "%name%, %symbol%, %code%"
1052
+ msgstr "%name%, %symbol%, %code%"
1053
+
1054
+ msgid "Default: %name% (%symbol%) - %code%"
1055
+ msgstr "Standard: %name% (%symbol%) - %code%"
1056
+
1057
+ msgid "Show a currency selector on the product page template"
1058
+ msgstr "Einen Währungsselektor auf dem Produktseiten-Template anzeigen"
1059
+
1060
+ msgid "To configure how the %sWooCommerce products%s are translated, visit the WooCommerce Multiligual %ssettings%s page."
1061
+ msgstr "Um zu konfigurieren, wie die %sWooCommerce-Produkte%s übersetzt werden, besuchen Sie die WooCommerce Multiligual %sEinstellungs-%sSeite."
1062
+
1063
+ msgid "Title"
1064
+ msgstr "Titel"
1065
+
1066
+ msgid "Slug"
1067
+ msgstr "Slug"
1068
+
1069
+ msgid "Content / Description"
1070
+ msgstr "Inhalt / Beschreibung"
1071
+
1072
+ msgid "Excerpt"
1073
+ msgstr "Auszug"
1074
+
1075
+ msgid "Purchase note"
1076
+ msgstr "Anmerkungen zum Kauf"
1077
+
1078
+ msgid "Images"
1079
+ msgstr "Bilder"
1080
+
1081
+ msgid "Custom Product attributes"
1082
+ msgstr "Benutzerdefinierte Produktattribute"
1083
+
1084
+ msgid "Name"
1085
+ msgstr "Name"
1086
+
1087
+ msgid "Value(s)"
1088
+ msgstr "Wert(e)"
1089
+
1090
+ msgid "Custom Fields"
1091
+ msgstr "Benutzerdefinierte Felder"
1092
+
1093
+ msgid "Variations data"
1094
+ msgstr "Variationsdaten"
1095
+
1096
+ msgid "Download Files for Variation #%s"
1097
+ msgstr "Dateien für Variation Nr. %s herunterladen"
1098
+
1099
+ msgid "Download Files"
1100
+ msgstr "Dateien herunterladen"
1101
+
1102
+ msgid "File URL"
1103
+ msgstr "Datei-URL"
1104
+
1105
+ msgid "Content, title, and excerpt are empty."
1106
+ msgstr "Inhalt, Titel und Auszug sind leer. \n"
1107
+
1108
+ msgid "Search %s"
1109
+ msgstr "%s suchen"
1110
+
1111
+ msgid "All %s"
1112
+ msgstr "Alle %s"
1113
+
1114
+ msgid "Parent %s"
1115
+ msgstr "Übergeordnete/s/r %s"
1116
+
1117
+ msgid "Parent %s:"
1118
+ msgstr "Übergeordnete/s/r %s:"
1119
+
1120
+ msgid "Edit %s"
1121
+ msgstr "%s bearbeiten"
1122
+
1123
+ msgid "Update %s"
1124
+ msgstr "%s aktualisieren"
1125
+
1126
+ msgid "Add New %s"
1127
+ msgstr "Neue/n/s %s hinzufügen"
1128
+
1129
+ msgid "New %s"
1130
+ msgstr "Neue/s/r %s"
1131
+
1132
+ msgid "To translate Add-ons strings please save Add-ons and go to the <b><a href=\"%s\">String Translation interface</a></b>"
1133
+ msgstr "Um Add-ons-Strings zu übersetzen, speichern Sie bitte Add-ons und rufen Sie die <b><a href=\"%s\">String-Übersetzungs-Oberfläche</a></b> auf."
1134
+
1135
+ msgid "Product Add-ons Group \"%s\""
1136
+ msgstr "Produkt-Add-ons-Gruppe \"%s\""
1137
+
1138
+ msgid "Description"
1139
+ msgstr "Beschreibung"
1140
+
1141
+ msgid "Options"
1142
+ msgstr "Optionen"
1143
+
1144
+ msgid "Label"
1145
+ msgstr "Label"
1146
+
1147
+ msgid "To translate Extra Options strings please save %s and go to the <b><a href=\"%s\">String Translation interface</a></b>"
1148
+ msgstr "Um zusätzliche Options-Strings zu übersetzen, speichern Sie bitte %s und rufen Sie die <b><a href=\"%s\">String-Übersetzungsoberfläche auf</a></b>."
1149
+
1150
+ msgid "Language"
1151
+ msgstr "Sprache"
1152
+
1153
+ msgid "Translation of"
1154
+ msgstr "Übersetzung von"
1155
+
1156
+ msgid "Subscription Price"
1157
+ msgstr "Abonnementpreis"
1158
+
1159
+ msgid "Sign-up Fee"
1160
+ msgstr "Registrierungsgebühr"
1161
+
1162
+ msgid "Calculate costs in other currencies automatically"
1163
+ msgstr "Berechnen Sie Kosten in anderen Währungen automatisch"
1164
+
1165
+ msgid "Set costs in other currencies manually"
1166
+ msgstr "Legen Sie Kosten in anderen Währungen manuell fest"
1167
+
1168
+ msgid "This is the cost per block booked. All other costs (for resources and persons) are added to this."
1169
+ msgstr "Dies sind die Kosten pro gebuchtem Block. Alle anderen Kosten (für Ressourcen und Personen) werden aufgeschlagen."
1170
+
1171
+ msgid "Product tabs"
1172
+ msgstr "Produkt-Register"
1173
+
1174
+ msgid "Heading"
1175
+ msgstr "Überschrift"
1176
+
1177
+ msgid "Tour Data"
1178
+ msgstr "Tourdaten"
1179
+
1180
+ msgid "Content"
1181
+ msgstr "Inhalt"
1182
+
1183
+ msgid "Composite Products"
1184
+ msgstr "Produkte mit Extra-Komponenten"
1185
+
1186
+ msgid "Product Bundles"
1187
+ msgstr "Produktbündel"
1188
+
1189
+ msgid "One-off cost for the booking as a whole."
1190
+ msgstr "Einmalige Kosten für die Buchung insgesamt."
1191
+
1192
+ msgid "The cost is displayed to the user on the frontend. Leave blank to have it calculated for you. If a booking has varying costs, this will be prefixed with the word \"from:\"."
1193
+ msgstr "Die Kosten werden dem Benutzer im Frondend angezeigt. Lassen Sie dies frei, um die Kosten berechnen zu lassen. Wenn eine Buchung variierende Kosten hat, steht vor den Kosten das Wort \"ab\":\"."
1194
+
1195
+ msgid "Bookings"
1196
+ msgstr "Buchungen"
1197
+
1198
+ msgid "Resources Label"
1199
+ msgstr "Ressourcen-Label"
1200
+
1201
+ msgid "Resources"
1202
+ msgstr "Ressourcen"
1203
+
1204
+ msgid "Person Types"
1205
+ msgstr "Personentypen"
1206
+
1207
+ msgid "Person Type Name"
1208
+ msgstr "Name des Personentyps"
1209
+
1210
+ msgid "Resources label"
1211
+ msgstr "Ressourcen-Label"
1212
+
1213
+ msgid "Booking currency"
1214
+ msgstr "Buchungswährung"
locale/woocommerce-multilingual-el.po ADDED
@@ -0,0 +1,1214 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # This file was generated by WPML
2
+ # WPML is a WordPress plugin that can turn any WordPress site into a full featured multilingual content management system.
3
+ # https://wpml.org
4
+ msgid ""
5
+ msgstr "Content-Type: text/plain; charset=utf-8\nContent-Transfer-Encoding: 8bit\nProject-Id-Version:WPML_EXPORT\nPOT-Creation-Date: \nPO-Revision-Date: \nLast-Translator: \nLanguage-Team: \nLanguage:en\nMIME-Version: 1.0\n"
6
+
7
+ msgid "Introduction"
8
+ msgstr "Εισαγωγή"
9
+
10
+ msgid "Store Pages"
11
+ msgstr "Σελίδες καταστήματος"
12
+
13
+ msgid "Global Attributes"
14
+ msgstr "Γενικές ιδιότητες"
15
+
16
+ msgid "Multiple Currencies"
17
+ msgstr "Πολλαπλά νομίσματα"
18
+
19
+ msgid "Translation Interface"
20
+ msgstr "Περιβάλλον εργασίας μετάφρασης"
21
+
22
+ msgid "Ready!"
23
+ msgstr "Έτοιμο!"
24
+
25
+ msgid "Welcome to %sWooCommerce Multilingual!%s Please take a moment to configure the main settings and then you are ready to start translating your products."
26
+ msgstr ""
27
+
28
+ msgid "Action failed. Please refresh the page and retry."
29
+ msgstr "Η ενέργεια απέτυχε. Ανανεώστε τη σελίδα και προσπαθήστε ξανά."
30
+
31
+ msgid "Cheatin&#8217; huh?"
32
+ msgstr "Τεχνικό σφάλμα"
33
+
34
+ msgid "Run the Setup Wizard"
35
+ msgstr "Εκτέλεση οδηγού ρύθμισης παραμέτρων"
36
+
37
+ msgid "Skip Setup"
38
+ msgstr "Παράλειψη ρύθμισης παραμέτρων"
39
+
40
+ msgid "WooCommerce Multilingual &rsaquo; Setup Wizard"
41
+ msgstr "Πολυγλωσσικό WooCommerce &rsaquo; Οδηγός ρύθμισης παραμέτρων"
42
+
43
+ msgid "WooCommerce Multilingual"
44
+ msgstr "Πολυγλωσσικό WooCommerce"
45
+
46
+ msgid "How to translate products"
47
+ msgstr "Πώς μεταφράζονται τα προϊόντα"
48
+
49
+ msgid "Quick edit is disabled for product translations. It's recommended to use the %s for editing products translations. %s"
50
+ msgstr "Η λειτουργία γρήγορης επεξεργασίας είναι απενεργοποιημένη για τις μεταφράσεις των προϊόντων. Συνίσταται να χρησιμοποιείτε το %s για την επεξεργασία μεταφράσεων προϊόντων. %s"
51
+
52
+ msgid "WooCommerce Multilingual products editor"
53
+ msgstr "Επεξεργαστής προϊόντων πολυγλωσσικού WooCommerce"
54
+
55
+ msgid "Edit this product translation"
56
+ msgstr "Επεξεργασία αυτής της μετάφρασης προϊόντος"
57
+
58
+ msgid "How to translate attributes"
59
+ msgstr "Πώς μεταφράζονται οι ιδιότητες"
60
+
61
+ msgid "How to translate product categories"
62
+ msgstr "Πώς μεταφράζονται οι κατηγορίες προϊόντων"
63
+
64
+ msgid "The recommended way to translate WooCommerce products is using the\n %sWooCommerce Multilingual products translation%s page.\n Please use this page only for translating elements that are not available in the WooCommerce Multilingual products translation table."
65
+ msgstr ""
66
+
67
+ msgid "In order to edit custom attributes you need to use the <a href=\"%s\">custom product translation editor</a>"
68
+ msgstr "Προκειμένου να επεξεργαστείτε προσαρμοσμένες ιδιότητες πρέπει να χρησιμοποιήσετε το <a href=\"%s\">πρόγραμμα επεξεργασίας μετάφρασης προσαρμοσμένων προϊόντων</a> "
69
+
70
+ msgid "You are using the same value as for the regular category base. This is known to create conflicts resulting in urls not working properly."
71
+ msgstr "Χρησιμοποιείτε την ίδια τιμή με αυτή της κανονικής βάσης κατηγοριών. Είναι γνωστό ότι αυτό δημιουργεί διενέξεις που έχουν ως αποτέλεσμα την εσφαλμένη λειτουργία των URL."
72
+
73
+ msgid "translations"
74
+ msgstr "μεταφράσεις"
75
+
76
+ msgid "product"
77
+ msgstr "προϊόν"
78
+
79
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">WPML</a> versions prior %s."
80
+ msgstr "Το WooCommerce Multilingual είναι ενεργοποιημένο αλλά δεν εκτελείται. Δεν είναι συμβατό με τις εκδόσεις του <a href=\"%s\">WPML</a> πριν την έκδοση %s."
81
+
82
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">Woocommerce</a> versions prior %s."
83
+ msgstr "Το πολυγλωσσικό WooCommerce είναι ενεργοποιημένο αλλά δεν εκτελείται. Δεν είναι συμβατό με τις εκδόσεις του <a href=\"%s\">Woocommerce</a> πριν την έκδοση %s."
84
+
85
+ msgid "You are using WooCommerce Multilingual %s. This version includes an important UI redesign for the configuration screens and it requires <a href=\"%s\">WPML %s</a> or higher. Everything still works on the front end now but, in order to configure options for WooCommerce Multilingual, you need to upgrade WPML."
86
+ msgstr "Χρησιμοποιείτε το WooCommerce Multilingual %s. Αυτή η έκδοση περιλαμβάνει ένα σημαντικό επανασχεδιασμό του περιβάλλοντος εργασίας του χρήστη για τις οθόνες ρύθμισης παραμέτρων και απαιτεί <a href=\"%s\">WPML %s</a> ή μεταγενέστερο. Τα πάντα λειτουργούν ακόμα στην εφαρμογή προσκηνίου, αλλά προκειμένου να ρυθμίσετε επιλογές για το WooCommerce Multilingual, πρέπει να αναβαθμίσετε σε WPML."
87
+
88
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">WPML Translation Management</a> versions prior %s."
89
+ msgstr "Το WooCommerce Multilingual είναι ενεργοποιημένο αλλά δεν εκτελείται. Δεν είναι συμβατό με τις εκδόσεις του <a href=\"%s\">WPML Translation Management</a> πριν την έκδοση %s."
90
+
91
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">WPML String Translation</a> versions prior %s."
92
+ msgstr "Το WooCommerce Multilingual είναι ενεργοποιημένο αλλά δεν εκτελείται. Δεν είναι συμβατό με τις εκδόσεις του <a href=\"%s\">WPML String Translation</a> πριν την έκδοση %s."
93
+
94
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">WPML Media</a> versions prior %s."
95
+ msgstr "Το WooCommerce Multilingual είναι ενεργοποιημένο αλλά δεν εκτελείται. Δεν είναι συμβατό με τις εκδόσεις του <a href=\"%s\">WPML Media</a> πριν την έκδοση %s."
96
+
97
+ msgid "and"
98
+ msgstr "και"
99
+
100
+ msgid "WooCommerce Multilingual is enabled but not effective. It requires %s in order to work."
101
+ msgstr "Το πολυγλωσσικό WooCommerce είναι ενεργοποιημένο αλλά δεν εκτελείται. Απαιτείται το %s για να είναι δυνατή η εκτέλεσή του."
102
+
103
+ msgid "Permalink settings"
104
+ msgstr "Ρυθμίσεις μόνιμης σύνδεσης"
105
+
106
+ msgid "Configure products slug translation"
107
+ msgstr "Διαμόρφωση μετάφρασης slug προϊόντων"
108
+
109
+ msgid "If you want different slugs for shop pages (%s/%s), you need to disable the shop prefix for products in <a href=\"%s\">WooCommerce Settings</a>"
110
+ msgstr "Αν θέλετε διαφορετικά slug για τις σελίδες καταστήματος (%s/%s), πρέπει να απενεργοποιήσετε το πρόθεμα καταστήματος στις <a href=\"%s\">Ρυθμίσεις WooCommerce</a>"
111
+
112
+ msgid "Finished! You can visit the %sstrings translation%s screen to translate the strings now."
113
+ msgstr "Αυτό ήταν! Τώρα μπορείτε να μεταβείτε στην οθόνη %sstrings translation%s για να μεταφράσετε τις συμβολοσειρές."
114
+
115
+ msgid "wpml-config.xml file missing from WooCommerce Multilingual folder."
116
+ msgstr "Το αρχείο wpml-config.xml λείπει από τον φάκελο του πολυγλωσσικού WooCommerce."
117
+
118
+ msgid "Custom field %s configuration from wpml-config.xml file was altered!"
119
+ msgstr "Η ρύθμιση παραμέτρων του προσαρμοσμένου πεδίου %s από το αρχείο wpml-config.xml μεταβλήθηκε!"
120
+
121
+ msgid "Custom type %s configuration from wpml-config.xml file was altered!"
122
+ msgstr "Η ρύθμιση παραμέτρων του προσαρμοσμένου τύπου %s από το αρχείο wpml-config.xml μεταβλήθηκε!"
123
+
124
+ msgid "Custom taxonomy %s configuration from wpml-config.xml file was altered!"
125
+ msgstr "Η ρύθμιση παραμέτρων της προσαρμοσμένης ταξινόμησης %s από το αρχείο wpml-config.xml μεταβλήθηκε!"
126
+
127
+ msgid "Upgrade WPML"
128
+ msgstr "Αναβάθμιση WPML"
129
+
130
+ msgid "Invalid language parameter: %s"
131
+ msgstr "Μη έγκυρη παράμετρος γλώσσας: %s"
132
+
133
+ msgid "Source product id not found: %s"
134
+ msgstr "Το ID του προϊόντος πηγής δεν βρέθηκε: %s"
135
+
136
+ msgid "Product Base"
137
+ msgstr "Βάση προϊόντος"
138
+
139
+ msgid "Product Tag Base"
140
+ msgstr "Βάση ετικέτας προϊόντος"
141
+
142
+ msgid "Product Category Base"
143
+ msgstr "Βάση κατηγορίας προϊόντος"
144
+
145
+ msgid "Product Attribute Base"
146
+ msgstr "Βάση ιδιότητας προϊόντος"
147
+
148
+ msgid "Endpoint: %s"
149
+ msgstr "Τελικό σημείο: %s"
150
+
151
+ msgid "product-category"
152
+ msgstr "προϊόν-κατηγορία"
153
+
154
+ msgid "product-tag"
155
+ msgstr "προϊόν-ετικέτα"
156
+
157
+ msgid "Original language"
158
+ msgstr "Αρχική γλώσσα"
159
+
160
+ msgid "Take this and edit"
161
+ msgstr "Αποδοχή εργασίας και μετάφραση"
162
+
163
+ msgid "Add translation"
164
+ msgstr "Προσθήκη μετάφρασης"
165
+
166
+ msgid "Update translation"
167
+ msgstr "Ενημέρωση μετάφρασης"
168
+
169
+ msgid "Finish translating"
170
+ msgstr "Ολοκλήρωση μετάφρασης"
171
+
172
+ msgid "Edit translation"
173
+ msgstr "Επεξεργασία μετάφρασης"
174
+
175
+ msgid "Edit this item inline"
176
+ msgstr "Ενσωματωμένη επεξεργασία αυτού του στοιχείου"
177
+
178
+ msgid "Quick Edit"
179
+ msgstr "Γρήγορη επεξεργασία"
180
+
181
+ msgid "Translation in progress"
182
+ msgstr "Μετάφραση σε εξέλιξη"
183
+
184
+ msgid "Invalid nonce"
185
+ msgstr "Μη έγκυρο nonce"
186
+
187
+ msgid "Currency - no orders found"
188
+ msgstr "Νόμισμα – δεν βρέθηκαν παραγγελίες"
189
+
190
+ msgid "Currencies order updated"
191
+ msgstr "Η σειρά των νομισμάτων ενημερώθηκε"
192
+
193
+ msgid "Currency switcher"
194
+ msgstr "Eναλλαγέας νομίσματος "
195
+
196
+ msgid "Configure options"
197
+ msgstr "Ρύθμιση επιλογών"
198
+
199
+ msgid "Settings saved!"
200
+ msgstr "Οι ρυθμίσεις αποθηκεύτηκαν!"
201
+
202
+ msgid "Add new currency"
203
+ msgstr "Προσθήκη νέου νομίσματος"
204
+
205
+ msgid "Update currency"
206
+ msgstr "Ενημέρωση νομίσματος"
207
+
208
+ msgid "Update settings for %s"
209
+ msgstr "Ενημέρωση ρυθμίσεων για το %s"
210
+
211
+ msgid "The default currency was changed. In order to show accurate prices in all currencies, you need to update the exchange rates under the %sMulti-currency%s configuration."
212
+ msgstr "Το προεπιλεγμένο νόμισμα άλλαξε. Προκειμένου να φαίνονται οι ακριβείς τιμές σε όλα τα νομίσματα, πρέπει να ενημερώσετε τις συναλλαγματικές ισοτιμίες στη ρύθμιση παραμέτρου %sπολλαπλά νομίσματα%s."
213
+
214
+ msgid "All the products will be removed from the current order in order to change the currency"
215
+ msgstr "Όλα τα προϊόντα θα απομακρυνθούν από την τρέχουσα σειρά προκειμένου να γίνει αλλαγή του νομίσματος"
216
+
217
+ msgid "Show all currencies"
218
+ msgstr "Εμφάνιση όλων των νομισμάτων"
219
+
220
+ msgid "Order currency:"
221
+ msgstr "Νόμισμα παραγγελίας:"
222
+
223
+ msgid "Cart"
224
+ msgstr "Καλάθι"
225
+
226
+ msgid "Checkout"
227
+ msgstr "Ολοκλήρωση αγοράς"
228
+
229
+ msgid "Checkout &rarr; Pay"
230
+ msgstr "Ολοκλήρωση αγοράς &rarr; Πληρωμή"
231
+
232
+ msgid "Order Received"
233
+ msgstr "Η παραγγελία παρελήφθη"
234
+
235
+ msgid "My Account"
236
+ msgstr "Ο λογαριασμός μου"
237
+
238
+ msgid "Change Password"
239
+ msgstr "Αλλαγή κωδικού"
240
+
241
+ msgid "Edit My Address"
242
+ msgstr "Επεξεργασία της διεύθυνσής μου"
243
+
244
+ msgid "Logout"
245
+ msgstr "Αποσύνδεση"
246
+
247
+ msgid "Lost Password"
248
+ msgstr "Απώλεια κωδικού"
249
+
250
+ msgid "View Order"
251
+ msgstr "Προβολή παραγγελίας"
252
+
253
+ msgid "Shop"
254
+ msgstr "Κατάστημα"
255
+
256
+ msgid "All the products will be removed from the current order in order to change the language"
257
+ msgstr "Όλα τα προϊόντα θα απομακρυνθούν από την τρέχουσα σειρά προκειμένου να γίνει αλλαγή γλώσσας"
258
+
259
+ msgid "Order language:"
260
+ msgstr "Γλώσσα παραγγελίας:"
261
+
262
+ msgid "Choose a file"
263
+ msgstr "Επιλέξτε ένα αρχείο"
264
+
265
+ msgid "At least one of these fields is required: title, content or excerpt"
266
+ msgstr "Απαιτείται τουλάχιστον ένα από τα εξής πεδία: τίτλος, περιεχόμενο ή απόσπασμα"
267
+
268
+ msgid "This translation job will no longer be assigned to you. Other translators will be able take it and continue the translation."
269
+ msgstr "Αυτή η μεταφραστική εργασία δεν θα είναι πια ανατεθειμένη σε εσάς. Άλλοι μεταφραστές θα έχουν τη δυνατότητα να την αναλάβουν και να συνεχίσουν τη μετάφραση."
270
+
271
+ msgid "This field is locked for editing because WPML will copy its value from the original language."
272
+ msgstr "Το πεδίο είναι κλειδωμένο για επεξεργασία καθώς το WPML θα αντιγράψει την τιμή από τη γλώσσα προέλευσης."
273
+
274
+ msgid "This is a translation of %s. Some of the fields are not editable. It's recommended to use the %s for translating products."
275
+ msgstr "Το παρόν αποτελεί μετάφραση του %s. Μερικά πεδία δεν είναι επεξεργάσιμα. Συνίσταται να χρησιμοποιείτε το %s για τη μετάφραση προϊόντων."
276
+
277
+ msgid "WooCommerce Multilingual products translator"
278
+ msgstr "Μεταφραστής προϊόντων πολυγλωσσικού WooCommerce"
279
+
280
+ msgid "Looks like you are upgrading from a previous version of WooCommerce Multilingual. Would you like to automatically create translated variations and images?"
281
+ msgstr "Φαίνεται πως αναβαθμίζετε μία παλαιότερη έκδοση του πολυγλωσσικού WooCommerce. Θα θέλατε να δημιουργηθούν αυτόματα μεταφρασμένες παραλλαγές και εικόνες;"
282
+
283
+ msgid "Yes, go to the troubleshooting page"
284
+ msgstr "Ναι, μετάβαση στη σελίδα επίλυσης προβλημάτων"
285
+
286
+ msgid "No - dismiss"
287
+ msgstr "Όχι - απόρριψη"
288
+
289
+ msgid "You've successfully installed %sWooCommerce Multilingual%s. Would you like to see a quick overview?"
290
+ msgstr "Εγκαταστήσατε με επιτυχία το %sΠολυγλωσσικό WooCommerce%s. Θέλετε να δείτε μια γρήγορη επισκόπηση;"
291
+
292
+ msgid "Learn how to turn your e-commerce site multilingual"
293
+ msgstr "Κάντε πολυγλωσσικό τον ιστότοπο ηλεκτρονικού εμπορίου σας"
294
+
295
+ msgid "Dismiss"
296
+ msgstr "Ματαίωση"
297
+
298
+ msgid "To translate %s please use the %s translation%s page, inside the %sWooCommerce Multilingual admin%s."
299
+ msgstr "Για μετάφραση των %s, παρακαλούμε χρησιμοποιήστε τη σελίδα %s μετάφρασης%s μέσα από τη %sΔιαχείριση του πολυγλωσσικού WooCommerce%s."
300
+
301
+ msgid "%s do not require translation."
302
+ msgstr "Δεν απαιτείται μετάφραση για %s."
303
+
304
+ msgid "Include to translation"
305
+ msgstr "Να περιληφθεί στη μετάφραση"
306
+
307
+ msgid "%d %s are missing translations."
308
+ msgstr "Απουσιάζουν μεταφράσεις από τα εξής: %d %s."
309
+
310
+ msgid "Translate %s"
311
+ msgstr "Μετάφραση %s"
312
+
313
+ msgid "Exclude from translation"
314
+ msgstr "Να μην περιληφθεί στη μετάφραση"
315
+
316
+ msgid "All %s are translated."
317
+ msgstr "Όλα τα αντικείμενα (%s) είναι μεταφρασμένα."
318
+
319
+ msgid "Currently, there are %s variations that need to be created."
320
+ msgstr "Αυτή τη στιγμή υπάρχουν %s παραλλαγές οι οποίες πρέπει να δημιουργηθούν."
321
+
322
+ msgid "%d products left"
323
+ msgstr "%d προϊόντα ακόμη"
324
+
325
+ msgid "Synchronization complete!"
326
+ msgstr "Ο συγχρονισμός ολοκληρώθηκε!"
327
+
328
+ msgid "Invalid taxonomy %s"
329
+ msgstr "Μη έγκυρη ταξινόμηση %s"
330
+
331
+ msgid "Some translated %s have different %s assignments."
332
+ msgstr "Για κάποιες μεταφράσεις (%s) υπάρχουν διαφορετικές εργασίες (%s)."
333
+
334
+ msgid "Update %s for all translated %s"
335
+ msgstr "Ενημέρωση %s για όλες τις μεταφράσεις (%s)"
336
+
337
+ msgid "All %s have the same %s assignments."
338
+ msgstr "Για κάθε %s υπάρχουν ίδιου είδους εργασίες (%s)."
339
+
340
+ msgid "Successfully updated %s for all translated %s."
341
+ msgstr "Επιτυχής ενημέρωση %s για όλες τις μεταφράσεις (%s)."
342
+
343
+ msgid "Synchronize attributes and update product variations"
344
+ msgstr "Συγχρονισμός ιδιοτήτων και ενημέρωση παραλλαγών προϊόντων"
345
+
346
+ msgid "Image"
347
+ msgstr "Εικόνα"
348
+
349
+ msgid "Product"
350
+ msgstr "Προϊόν"
351
+
352
+ msgid "Type"
353
+ msgstr "Τύπος"
354
+
355
+ msgid "Date"
356
+ msgstr "Ημερομηνία"
357
+
358
+ msgid "Categories"
359
+ msgstr "Κατηγορίες"
360
+
361
+ msgid "No products found"
362
+ msgstr "Δεν βρέθηκε κανένα προϊόν"
363
+
364
+ msgid "Draft"
365
+ msgstr "Πρόχειρο"
366
+
367
+ msgid "Private"
368
+ msgstr "Ιδιωτικό"
369
+
370
+ msgid "Pending"
371
+ msgstr ""
372
+
373
+ msgid "Scheduled"
374
+ msgstr "Προγραμματίστηκε"
375
+
376
+ msgid "Parent product: %s"
377
+ msgstr "Γονικό προϊόν: %s"
378
+
379
+ msgid "Edit this item"
380
+ msgstr "Επεξεργαστείτε αυτό το στοιχείο"
381
+
382
+ msgid "Edit"
383
+ msgstr "Επεξεργασία"
384
+
385
+ msgid "View \"%s\""
386
+ msgstr "Προβολή \"%s\""
387
+
388
+ msgid "View"
389
+ msgstr "Προβολή"
390
+
391
+ msgid "Published"
392
+ msgstr "Δημοσιευμένο"
393
+
394
+ msgid "Last Modified"
395
+ msgstr "Τελευταία τροποποίηση"
396
+
397
+ msgid "All languages"
398
+ msgstr "Όλες οι γλώσσες"
399
+
400
+ msgid "All categories"
401
+ msgstr "Όλες οι κατηγορίες"
402
+
403
+ msgid "All translation statuses"
404
+ msgstr "Όλες οι καταστάσεις μετάφρασης"
405
+
406
+ msgid "Not translated or needs updating"
407
+ msgstr "Δεν έχει μεταφραστεί ή πρέπει να γίνει ενημέρωση"
408
+
409
+ msgid "Needs updating"
410
+ msgstr "Χρειάζεται ενημέρωση"
411
+
412
+ msgid "Translation complete"
413
+ msgstr "Η μετάφραση ολοκληρώθηκε"
414
+
415
+ msgid "All statuses"
416
+ msgstr "Όλες οι καταστάσεις"
417
+
418
+ msgid "Filter"
419
+ msgstr "Φιλτράρισμα"
420
+
421
+ msgid "Reset"
422
+ msgstr "Επαναφορά"
423
+
424
+ msgid "Search"
425
+ msgstr "Αναζήτηση"
426
+
427
+ msgid "%d items"
428
+ msgstr "%d στοιχεία"
429
+
430
+ msgid "Go to the first page"
431
+ msgstr "Μετάβαση στην πρώτη σελίδα"
432
+
433
+ msgid "Go to the previous page"
434
+ msgstr "Μετάβαση στην προηγούμενη σελίδα"
435
+
436
+ msgid "Select Page"
437
+ msgstr "Επιλογή σελίδας"
438
+
439
+ msgid "Current page"
440
+ msgstr "Τρέχουσα σελίδα"
441
+
442
+ msgid "of"
443
+ msgstr "από"
444
+
445
+ msgid "Go to the next page"
446
+ msgstr "Μετάβαση στην επόμενη σελίδα"
447
+
448
+ msgid "Go to the last page"
449
+ msgstr "Μετάβαση στην τελευταία σελίδα"
450
+
451
+ msgid "Translatable?"
452
+ msgstr "Μεταφράσιμο;"
453
+
454
+ msgid "Enable this if you want to translate attribute values with Woocommerce Multilingual"
455
+ msgstr "Ενεργοποιήστε το αν θέλετε να μεταφράζετε τιμές χαρακτηριστικών με το πολυγλωσσικό Woocommerce"
456
+
457
+ msgid "Existing translations and variations associated will be deleted."
458
+ msgstr "Οι υπάρχουσες συνδεδεμένες μεταφράσεις και παραλλαγές θα διαγραφούν."
459
+
460
+ msgid "Product Translation Interface"
461
+ msgstr "Διεπαφή Μετάφρασης Προϊόντων"
462
+
463
+ msgid "The recommended way is using the WPML Translation Editor. It is streamlined for making the translation process much easier while also providing a much better integration with various WooCommerce extensions."
464
+ msgstr "Ο συνιστώμενος τρόπος είναι μέσω του Προγράμματος επεξεργασίας μεταφράσεων WPML. Είναι βελτιστοποιημένο ώστε να διευκολύνει κατά πολύ τη διαδικασία μετάφρασης, ενώ προσφέρει παράλληλα καλύτερη ενσωμάτωση με διάφορες επεκτάσεις του WooCommerce."
465
+
466
+ msgid "WPML Translation Editor"
467
+ msgstr "Πρόγραμμα επεξεργασίας μεταφράσεων WPML"
468
+
469
+ msgid "Native WooCommerce product editing screen"
470
+ msgstr "Εγγενής οθόνη επεξεργασίας προϊόντος WooCommerce"
471
+
472
+ msgid "Products synchronization"
473
+ msgstr "Συγχρονισμός προϊόντων"
474
+
475
+ msgid "Configure specific product properties that should be synced to translations."
476
+ msgstr "Ρύθμιση παραμέτρων συγκεκριμένων ιδιοτήτων προϊόντων οι οποίες πρέπει να συγχρονίζονται στις μεταφράσεις."
477
+
478
+ msgid "Sync publishing date for translated products."
479
+ msgstr "Συγχρονισμός ημερομηνίας έκδοσης μεταφρασμένων προϊόντων."
480
+
481
+ msgid "Sync products and product taxonomies order."
482
+ msgstr "Συγχρονισμός των προϊόντων και της σειράς ταξινόμησης προϊόντων."
483
+
484
+ msgid "Products Download Files"
485
+ msgstr "Αρχεία λήψης προϊόντων"
486
+
487
+ msgid "If you are using downloadable products, you can choose to have their paths\n synchronized, or seperate for each language."
488
+ msgstr "Αν χρησιμοποιείτε προϊόντα με δυνατότητα λήψης, μπορείτε να επιλέξετε να συγχρονίζονται\n οι διαδρομές τους ή κάθε γλώσσα να είναι ανεξάρτητη."
489
+
490
+ msgid "Use the same files for translations"
491
+ msgstr "Χρήση των ίδιων αρχείων για μεταφράσεις"
492
+
493
+ msgid "Add separate download files for translations"
494
+ msgstr "Προσθήκη ξεχωριστών αρχείων λήψης για μεταφράσεις"
495
+
496
+ msgid "Save changes"
497
+ msgstr "Αποθήκευση αλλαγών"
498
+
499
+ msgid "Troubleshooting page"
500
+ msgstr "Σελίδα επίλυσης προβλημάτων"
501
+
502
+ msgid "Update Translation"
503
+ msgstr "Ενημέρωση μετάφρασης"
504
+
505
+ msgid "Hide This Message"
506
+ msgstr "Απόκρυψη αυτού του μηνύματος "
507
+
508
+ msgid "<strong>WooCommerce Translation Available</strong> &#8211; Install or update your <code>%s</code> translations to version <code>%s</code>."
509
+ msgstr "<strong>Διαθέσιμη μετάφραση του WooCommerce</strong> &#8211; Εγκατάσταση ή ενημέρωση των <code>%s</code> μεταφράσεών σας στην έκδοση <code>%s</code>."
510
+
511
+ msgid "This will automatically generate variations for translated products corresponding to recently translated attributes."
512
+ msgstr "Έτσι δημιουργούνται αυτόματα παραλλαγές των μεταφρασμένων προϊόντων σύμφωνα με τις πρόσφατα μεταφρασμένες ιδιότητες."
513
+
514
+ msgid "Synchronize %s assignment in content"
515
+ msgstr "Συγχρονισμός της εργασίας (%s) στο περιεχόμενο"
516
+
517
+ msgid "This action lets you automatically apply the %s taxonomy to your content in different languages. It will scan the original content and apply the same taxonomy to translated content."
518
+ msgstr "Με αυτή την ενέργεια μπορείτε να εφαρμόζετε αυτόματα την ταξινόμηση %s στο περιεχόμενό σας σε διαφορετικές γλώσσες. Θα σαρώνεται το αρχικό σας περιεχόμενο και θα εφαρμόζεται η ίδια ταξινόμηση στο μεταφρασμένο περιεχόμενο."
519
+
520
+ msgid "You have untranslated terms!"
521
+ msgstr "Έχετε μη μεταφρασμένους όρους!"
522
+
523
+ msgid "Select currency"
524
+ msgstr "Επιλογή νομίσματος"
525
+
526
+ msgid "Exchange Rate"
527
+ msgstr "Συναλλαγματική ισοτιμία"
528
+
529
+ msgid "Only numeric"
530
+ msgstr "Μόνο αριθμητικοί χαρακτήρες"
531
+
532
+ msgid "Set on %s"
533
+ msgstr "Ορίστηκε: %s"
534
+
535
+ msgid "Currency Preview"
536
+ msgstr "Προεπισκόπηση νομίσματος"
537
+
538
+ msgid "Currency Position"
539
+ msgstr "Θέση νομίσματος"
540
+
541
+ msgid "Left"
542
+ msgstr "Αριστερά"
543
+
544
+ msgid "Right"
545
+ msgstr "Δεξιά"
546
+
547
+ msgid "Left with space"
548
+ msgstr "Αριστερά με κενό"
549
+
550
+ msgid "Right with space"
551
+ msgstr "Δεξιά με κενό"
552
+
553
+ msgid "Thousand Separator"
554
+ msgstr "Σύμβολο διαχωρισμού χιλιάδων"
555
+
556
+ msgid "Decimal Separator"
557
+ msgstr "Σύμβολο διαχωρισμού δεκαδικών"
558
+
559
+ msgid "Number of Decimals"
560
+ msgstr "Αριθμός δεκαδικών ψηφίων"
561
+
562
+ msgid "Rounding to the nearest integer"
563
+ msgstr "Στρογγυλοποίηση στον πλησιέστερο ακέραιο "
564
+
565
+ msgid "Disabled"
566
+ msgstr "Απενεργοποιημένο"
567
+
568
+ msgid "Up"
569
+ msgstr "Πάνω"
570
+
571
+ msgid "Down"
572
+ msgstr "Κάτω"
573
+
574
+ msgid "Nearest"
575
+ msgstr "Πλησιέστερο"
576
+
577
+ msgid "Increment for nearest integer"
578
+ msgstr "Αύξηση προς τον πλησιέστερο ακέραιο"
579
+
580
+ msgid "Autosubtract amount"
581
+ msgstr "Αυτόματη αφαίρεση ποσού"
582
+
583
+ msgid "Cancel"
584
+ msgstr "Άκυρο"
585
+
586
+ msgid "Save"
587
+ msgstr "Αποθήκευση"
588
+
589
+ msgid "Products"
590
+ msgstr "Προϊόντα"
591
+
592
+ msgid "Tags"
593
+ msgstr "Ετικέτες"
594
+
595
+ msgid "Attributes"
596
+ msgstr "Ιδότητες"
597
+
598
+ msgid "Shipping Classes"
599
+ msgstr "Κλάσεις αποστολής"
600
+
601
+ msgid "Settings"
602
+ msgstr "Ρυθμίσεις"
603
+
604
+ msgid "Multi-currency"
605
+ msgstr "Πολλαπλά νομίσματα"
606
+
607
+ msgid "Store URLs"
608
+ msgstr "Δ/νσεις URL καταστήματος"
609
+
610
+ msgid "Status"
611
+ msgstr "Κατάσταση"
612
+
613
+ msgid "Troubleshooting"
614
+ msgstr "Αντιμετώπιση προβλημάτων"
615
+
616
+ msgid "Thank you for using %sWooCommerce Multilingual%s! You can express your love and\n support by %s rating our plugin and saying that %sit works%s for you."
617
+ msgstr "Ευχαριστούμε που χρησιμοποιείτε το %sWooCommerce Multilingual%s! Μπορείτε να εκφράσετε την αγάπη και\n την υποστήριξή σας %s αξιολογώντας την προσθήκη μας και δηλώνοντας ότι %sσας βοηθάει%s."
618
+
619
+ msgid "Hide"
620
+ msgstr "Απόκρυψη"
621
+
622
+ msgid "Loading ..."
623
+ msgstr "Φόρτωση ..."
624
+
625
+ msgid "Regular Price"
626
+ msgstr "Συνήθης τιμή"
627
+
628
+ msgid "Sale Price"
629
+ msgstr "Τιμή κατόπιν έκπτωσης"
630
+
631
+ msgid "Multi-currency is enabled but no secondary currencies have been set. %sAdd secondary currencies%s."
632
+ msgstr ""
633
+
634
+ msgid "Calculate prices in other currencies automatically"
635
+ msgstr "Αυτόματος υπολογισμός τιμών σε άλλα νομίσματα"
636
+
637
+ msgid "Click to see the prices in the other currencies as they are currently shown on the front end."
638
+ msgstr "Κάντε κλικ για να δείτε τις τιμές σε άλλα νομίσματα όπως εμφανίζονται αυτή τη στιγμή στο προσκήνιο."
639
+
640
+ msgid "Show"
641
+ msgstr "Εμφάνιση"
642
+
643
+ msgid "Set prices in other currencies manually"
644
+ msgstr "Μη αυτόματος ορισμός τιμών σε άλλα νομίσματα"
645
+
646
+ msgid "Enter prices in other currencies"
647
+ msgstr "Εισαγάγετε τις τιμές στα άλλα νομίσματα"
648
+
649
+ msgid "Hide prices in other currencies"
650
+ msgstr "Απόκρυψη τιμών σε άλλα νομίσματα"
651
+
652
+ msgid "Determined automatically based on exchange rate"
653
+ msgstr "Καθορίζεται αυτόματα βάσει συναλλαγματικής ισοτιμίας"
654
+
655
+ msgid "Schedule"
656
+ msgstr "Πρόγραμμα"
657
+
658
+ msgid "Same as default currency"
659
+ msgstr "Όπως στο προεπιλεγμένο νόμισμα"
660
+
661
+ msgid "Set dates"
662
+ msgstr "Ορισμός ημερομηνιών"
663
+
664
+ msgid "Collapse"
665
+ msgstr "Σύμπτυξη"
666
+
667
+ msgid "From&hellip;"
668
+ msgstr "Από&hellip;"
669
+
670
+ msgid "To&hellip;"
671
+ msgstr "Σε&hellip;"
672
+
673
+ msgid "Please enter in a value less than the regular price"
674
+ msgstr "Δώστε μία τιμή μικρότερη από την κανονική"
675
+
676
+ msgid "Required plugins"
677
+ msgstr "Απαιτούμενες προσθήκες"
678
+
679
+ msgid "Plugins Status"
680
+ msgstr "Κατάσταση προσθηκών"
681
+
682
+ msgid "WooCommerce Multilingual depends on several plugins to work. If any required plugin is missing, you should install and activate it."
683
+ msgstr "Χρειάζονται αρκετές προσθήκες για να καταστεί δυνατή η εκτέλεση του πολυγλωσσικού WooCommerce. Αν λείπει οποιαδήποτε προσθήκη θα πρέπει να την εγκαταστήσετε.και να την ενεργοποιήσετε."
684
+
685
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">WPML</a> versions prior 2.0.5."
686
+ msgstr "Το πολυγλωσσικό WooCommerce είναι ενεργοποιημένο αλλά δεν εκτελείται. Δεν είναι συμβατό με τις <a href=\"%s\">WPML</a> εκδόσεις πριν την έκδοση 2.0.5."
687
+
688
+ msgid "Update WPML"
689
+ msgstr "Ενημέρωση WPML"
690
+
691
+ msgid "Get WPML"
692
+ msgstr "Λήψη WPML"
693
+
694
+ msgid "Get WPML Media"
695
+ msgstr "Λήψη WPML Media"
696
+
697
+ msgid "Get WPML Translation Management"
698
+ msgstr "Λήψη Διαχείρισης Μετάφρασης WPML"
699
+
700
+ msgid "Get WPML String Translation"
701
+ msgstr "Λήψη μετάφρασης συμβολοσειράς WPML"
702
+
703
+ msgid "%s is installed and active."
704
+ msgstr "Η προσθήκη %s εγκαταστάθηκε και ενεργοποιήθηκε."
705
+
706
+ msgid "%s is set up."
707
+ msgstr "%s έχει ρυθμιστεί."
708
+
709
+ msgid "%s is not set up."
710
+ msgstr "%s δεν έχει ρυθμιστεί."
711
+
712
+ msgid "%s is either not installed or not active."
713
+ msgstr "%s μη εγκατεστημένο ή ανενεργό."
714
+
715
+ msgid "%1$s is installed, but with incorrect version. You need %1$s %2$s or higher. "
716
+ msgstr "Το %1$s είναι εγκατεστημένο αλλά η έκδοση είναι εσφαλμένη. Απαιτείται έκδοση %1$s %2$s ή πιο πρόσφατη."
717
+
718
+ msgid "Download WooCommerce"
719
+ msgstr "Λήψη WooCommerce"
720
+
721
+ msgid "The WordPress Multilingual Plugin"
722
+ msgstr "Προσθήκη WordPress Multilingual"
723
+
724
+ msgid "This page allows you to translate all strings that are being used by WooCommerce in building different type of urls. Translating them enables you to have fully localized urls that match the language of the pages."
725
+ msgstr "Αυτή η σελίδα σας επιτρέπει να μεταφράσετε όλες τις συμβολοσειρές που χρησιμοποιούνται από το WooCommerce στη δημιουργία διαφορετικών τύπων URL. Μεταφράζοντάς τις έχετε τη δυνατότητα να έχετε πλήρως τοπικοποιημένα URL που θα ταιριάζουν με τη γλώσσα των σελίδων."
726
+
727
+ msgid "You can enter or edit your default values on the %sPermalinks settings%s page or, for the endpoints, on the WooCommerce %sAccount settings%s page."
728
+ msgstr "Μπορείτε να δώσετε ή να επεξεργαστείτε τις προεπιλεγμένες τιμές στη σελίδα %sΡυθμίσεων μόνιμων συνδέσμων%s ή, για τα τελικά σημεία, στη σελίδα %sΡυθμίσεων λογαριασμού%s του WooCommerce."
729
+
730
+ msgid "permalinks settings"
731
+ msgstr "Ρυθμίσεις μόνιμων συνδέσμων"
732
+
733
+ msgid "Account settings"
734
+ msgstr "Ρυθμίσεις λογαριασμού"
735
+
736
+ msgid "Slug type"
737
+ msgstr "Τύπος slug"
738
+
739
+ msgid "Original Slug"
740
+ msgstr "Αρχικό slug"
741
+
742
+ msgid "Shop page"
743
+ msgstr "Σελίδα καταστήματος"
744
+
745
+ msgid "Product base"
746
+ msgstr "Βάση προϊόντος"
747
+
748
+ msgid "Product category base"
749
+ msgstr "Βάση κατηγορίας προϊόντος"
750
+
751
+ msgid "Product tag base"
752
+ msgstr "Βάση ετικέτας προϊόντος"
753
+
754
+ msgid "Product attribute base"
755
+ msgstr "Βάση χαρακτηριστικού προϊόντος"
756
+
757
+ msgid "Original"
758
+ msgstr "Πρωτότυπο"
759
+
760
+ msgid "Translation to"
761
+ msgstr "Μετάφραση σε"
762
+
763
+ msgid "Product Shop Base"
764
+ msgstr "Βάση καταστήματος προϊόντος"
765
+
766
+ msgid "Welcome to WooCommerce Multilingual!"
767
+ msgstr "Καλώς ήρθατε στο Πολυγλωσσικό WooCommerce!"
768
+
769
+ msgid "Configure the multilingual support for your e-commerce site in just a couple of minutes."
770
+ msgstr ""
771
+
772
+ msgid "By default, the products are translatable just like product categories, product tags and attributes. So you can start translating these right away."
773
+ msgstr "Από προεπιλογή, τα προϊόντα είναι μεταφράσιμα, ακριβώς όπως οι κατηγορίες προϊόντων, οι ετικέτες προϊόντων και οι ιδιότητες. Μπορείτε να αρχίσετε να τα μεταφράζετε αμέσως."
774
+
775
+ msgid "You can configure, however, which attributes you want to translate, install the translated shop pages or enable the multi-currency mode."
776
+ msgstr "Μπορείτε, ωστόσο, να ορίσετε ποιες ιδιότητες θέλετε να μεταφράσετε, να εγκαταστήσετε τις μεταφρασμένες σελίδες καταστήματος ή να ενεργοποιήσετε τη λειτουργία πολλαπλών νομισμάτων."
777
+
778
+ msgid "Start"
779
+ msgstr "Έναρξη"
780
+
781
+ msgid "No, thanks. I'll do it later."
782
+ msgstr "Όχι ευχαριστώ. Θα το κάνω αργότερα."
783
+
784
+ msgid "Select translatable attributes"
785
+ msgstr "Επιλέξτε μεταφράσιμες ιδιότητες"
786
+
787
+ msgid "There are no attributes defined"
788
+ msgstr "Δεν έχουν οριστεί ιδιότητες"
789
+
790
+ msgid "Continue"
791
+ msgstr "Συνέχεια"
792
+
793
+ msgid "Later"
794
+ msgstr "Αργότερα"
795
+
796
+ msgid "One or more WooCommerce pages have not been created"
797
+ msgstr "Μία ή περισσότερες σελίδες WooCommerce δεν δημιουργήθηκαν"
798
+
799
+ msgid "Install missing WooCommerce pages and create translations."
800
+ msgstr "Εγκατάσταση σελίδων WooCommerce που απουσιάζουν και δημιουργία μεταφράσεων."
801
+
802
+ msgid "Translate Store Pages"
803
+ msgstr "Μετάφραση σελίδων καταστήματος"
804
+
805
+ msgid "All store pages must be translated in the languages configured on the site."
806
+ msgstr "Όλες οι σελίδες καταστήματος πρέπει να μεταφραστούν στις γλώσσες που έχουν οριστεί στον ιστότοπο."
807
+
808
+ msgid "Select the translation interface"
809
+ msgstr "Επιλέξτε το περιβάλλον εργασίας μετάφρασης"
810
+
811
+ msgid "Enable multiple currencies"
812
+ msgstr "Ενεργοποίηση πολλαπλών νομισμάτων"
813
+
814
+ msgid "This will allow you to set prices for products in different currencies. The prices can be determined based on a given exchange rate or set explicitly for specific products."
815
+ msgstr "Αυτή η επιλογή θα σας επιτρέπει να ορίζετε τις τιμές των προϊόντων σε διαφορετικά νομίσματα. Οι τιμές μπορούν να οριστούν βάσει μιας δεδομένης τιμής συναλλάγματος ή να οριστούν μη αυτόματα για συγκεκριμένα προϊόντα."
816
+
817
+ msgid "Enable the multi-currency mode"
818
+ msgstr "Ενεργοποίηση της λειτουργίας πολλαπλού νομίσματος"
819
+
820
+ msgid "Further actions that are necessary for making your existing content multilingual, are listed below."
821
+ msgstr "Παρακάτω αναγράφονται περαιτέρω ενέργειες που απαιτούνται για να κάνετε το υπάρχον περιεχόμενό σας πολυγλωσσικό."
822
+
823
+ msgid "Start translating products"
824
+ msgstr "Έναρξη μετάφρασης προϊόντων"
825
+
826
+ msgid "Add secondary currencies on the %smulti-currency configuration%s page"
827
+ msgstr "Προσθήκη δευτερευόντων νομισμάτων στη σελίδα %sρύθμιση πολλαπλών νομισμάτων%s"
828
+
829
+ msgid "Translate existing terms for these %sproduct attributes%s: %s"
830
+ msgstr "Μετάφραση υπαρχόντων όρων για αυτές τις %sιδιότητες προϊόντος%s: %s"
831
+
832
+ msgid "Translate existing %sproduct categories%s"
833
+ msgstr "Μετάφραση υπαρχόντων %sκατηγοριών προϊόντων%s"
834
+
835
+ msgid "Translate existing %sproduct tags%s"
836
+ msgstr "Μετάφραση υπαρχόντων %sετικετών προϊόντων%s"
837
+
838
+ msgid "%sAdd missing translations%s for shipping classes"
839
+ msgstr "%sΠροσθήκη μεταφράσεων που λείπουν%s για κλάσεις αποστολής"
840
+
841
+ msgid "Translate %sURL slugs%s to create multilingual store and product urls"
842
+ msgstr "Μετάφραση %sslug URL%s για δημιουργία URL πολυγλωσσικού καταστήματος και προϊόντων"
843
+
844
+ msgid "Use custom settings for translations download files"
845
+ msgstr ""
846
+
847
+ msgid "WooCommerce Store Pages"
848
+ msgstr "Σελίδες καταστήματος WooCommerce"
849
+
850
+ msgid "To run a multilingual e-commerce site, you need to have the WooCommerce shop pages translated to all the site's languages. Once all the pages are installed you can add the translations for them from this menu."
851
+ msgstr "Για να καταστεί δυνατή η λειτουργία ενός πολυγλωσσικού ιστότοπου ηλεκτρονικού εμπορίου, πρέπει οι σελίδες του καταστήματος WooCommerce να μεταφραστούν σε όλες τις γλώσσες του ιστότοπου. Μόλις εγκατασταθούν όλες οι σελίδες, μπορείτε να προσθέσετε μεταφράσεις από αυτό το μενού."
852
+
853
+ msgid "One or more WooCommerce pages have not been created."
854
+ msgstr "Μία ή περισσότερες σελίδες του WooCommerce δεν έχουν δημιουργηθεί."
855
+
856
+ msgid "Install WooCommerce Pages"
857
+ msgstr "Στήσιμο σελίδων WooCommerce"
858
+
859
+ msgid "WooCommerce store pages do not exist for these languages:"
860
+ msgstr "Δεν υπάρχουν σελίδες καταστήματος του WooCommerce για τις εξής γλώσσες:"
861
+
862
+ msgid "Create missing translations"
863
+ msgstr "Δημιουργία μεταφράσεων που λείπουν"
864
+
865
+ msgid "These pages are currently being translated by translators via WPML: "
866
+ msgstr "Αυτές οι σελίδες μεταφράζονται αυτή τη στιγμή από μεταφραστές μέσω του WPML:"
867
+
868
+ msgid "WooCommerce store pages are translated to all the site's languages."
869
+ msgstr "Οι σελίδες καταστήματος WooCommerce μεταφράζονται σε όλες τις γλώσσες του ιστότοπου."
870
+
871
+ msgid "Configuration warnings"
872
+ msgstr "Προειδοποιήσεις ρύθμισης παραμέτρων"
873
+
874
+ msgid "Reporting miscelaneous configuration issues that can make WooCommerce Multilingual not run normally"
875
+ msgstr "Αναφορά διαφόρων ζητημάτων που αφορούν τη ρύθμιση παραμέτρων, τα οποία μπορεί να έχουν ως αποτέλεσμα να μην εκτελείται κανονικά το WooCommerce Multilingual"
876
+
877
+ msgid "Your product permalink base is not translated to:"
878
+ msgstr "Η βάση μόνιμων συνδέσμων των προϊόντων σας δεν έχει μεταφραστεί σε:"
879
+
880
+ msgid "Translate URLs"
881
+ msgstr "Μετάφραση των URL"
882
+
883
+ msgid "Your site's default language is not English and the strings language is also not English."
884
+ msgstr "Ούτε η προεπιλεγμένη γλώσσα του ιστότοπού σας ούτε η γλώσσα των συμβολοσειρών είναι τα αγγλικά."
885
+
886
+ msgid "Running WooCommerce multilingual with default language other than English."
887
+ msgstr "Εκτέλεση του WooCommerce multilingual με προεπιλεγμένη μια γλώσσα άλλη εκτός των αγγλικών."
888
+
889
+ msgid "This may cause problems with URLs in different languages."
890
+ msgstr "Αυτό μπορεί να προκαλέσει προβλήματα με URL σε διαφορετικές γλώσσες."
891
+
892
+ msgid "Change default language"
893
+ msgstr "Αλλαγή προεπιλεγμένης γλώσσας"
894
+
895
+ msgid "Your site's default language is not English."
896
+ msgstr "Η προεπιλεγμένη γλώσσα του ιστότοπού σας δεν είναι τα αγγλικά."
897
+
898
+ msgid "There are some settings that require careful attention."
899
+ msgstr "Υπάρχουν μερικές ρυθμίσεις που απαιτούν αυξημένη προσοχή."
900
+
901
+ msgid "Some settings from the WooCommerce Multilingual wpml-config.xml file have been overwritten."
902
+ msgstr "Μερικές ρυθμίσεις από το αρχείο wpml-config.xml του πολυγλωσσικού WooCommerce έχουν αντικατασταθεί."
903
+
904
+ msgid "You should check WPML configuration files added by other plugins or manual settings on the %s section."
905
+ msgstr "Πρέπει να ελέγξετε τα αρχεία ρύθμισης παραμέτρων του WPML που έχουν προστεθεί από άλλες προσθήκες ή τις μη αυτόματες ρυθμίσεις στην ενότητα %s."
906
+
907
+ msgid "Multilingual Content Setup"
908
+ msgstr "Διαμόρφωση πολυγλωσσικού περιεχομένου"
909
+
910
+ msgid "Taxonomies missing translations"
911
+ msgstr "Μεταφράσεις των ταξινομήσεων που δεν υπάρχουν"
912
+
913
+ msgid "To run a fully translated site, you should translate all taxonomy terms. Some store elements, such as variations, depend on taxonomy translation."
914
+ msgstr "Για να έχετε έναν πλήρως μεταφρασμένο ιστότοπο, θα πρέπει να μεταφράσετε όλους τους όρους ταξινόμησης. Ορισμένα στοιχεία του καταστήματος, όπως οι παραλλαγές, εξαρτώνται από τη μετάφραση της ταξινόμησης."
915
+
916
+ msgid "This taxonomy requires translation."
917
+ msgstr "Απαιτείται μετάφραση για αυτή την ταξινόμηση."
918
+
919
+ msgid "Include in translation"
920
+ msgstr "Να περιληφθεί στη μετάφραση"
921
+
922
+ msgid "This taxonomy does not require translation."
923
+ msgstr "Δεν απαιτείται μετάφραση για αυτή την ταξινόμηση."
924
+
925
+ msgid "Right now, there are no taxonomy terms needing translation."
926
+ msgstr "Αυτή τη στιγμή δεν υπάρχουν όροι ταξινόμησης για τους οποίους απαιτείται μετάφραση."
927
+
928
+ msgid "There are no translatable product attributes defined"
929
+ msgstr "Δεν έχουν οριστεί χαρακτηριστικά μεταφράσιμου προϊόντος"
930
+
931
+ msgid "Select the attribute to translate: "
932
+ msgstr "Επιλέξτε το χαρακτηριστικό προς μετάφραση:"
933
+
934
+ msgid "Please make a backup of your database before you start the synchronization"
935
+ msgstr "Παρακαλούμε δημιουργήστε αντίγραφο ασφαλείας της βάσης δεδομένων σας πριν ξεκινήσετε τον συγχρονισμό"
936
+
937
+ msgid "Sync variables products"
938
+ msgstr "Συγχρονισμός μεταβλητών προϊόντων"
939
+
940
+ msgid "Update products count:"
941
+ msgstr "Ενημέρωση αριθμού προϊόντων:"
942
+
943
+ msgid "products with variations"
944
+ msgstr "προϊόντα με παραλλαγές"
945
+
946
+ msgid "Sync products variations:"
947
+ msgstr "Συγχρονισμός μεταβλητών προϊόντων:"
948
+
949
+ msgid "left"
950
+ msgstr "αριστερά"
951
+
952
+ msgid "Sync products \"gallery images\":"
953
+ msgstr "Συγχρονισμός προϊόντων \"συλλογή εικόνων\":"
954
+
955
+ msgid "Sync products categories (display type, thumbnail):"
956
+ msgstr "Συγχρονισμός κατηγοριών προϊόντων (τύπος εμφάνισης, μικρογραφία):"
957
+
958
+ msgid "Duplicate terms ( please select attribute ):"
959
+ msgstr "Αντιγραφή όρων ( επιλέξτε ιδιότητα ):"
960
+
961
+ msgid "none"
962
+ msgstr "κανένα"
963
+
964
+ msgid "Enable/disable"
965
+ msgstr "Ενεργοποίηση/απενεργοποίηση"
966
+
967
+ msgid "Currencies"
968
+ msgstr "Νομίσματα"
969
+
970
+ msgid "Add currency"
971
+ msgstr "Προσθήκη νομίσματος"
972
+
973
+ msgid "Currency"
974
+ msgstr "Νόμισμα"
975
+
976
+ msgid "Rate"
977
+ msgstr "Ισοτιμία"
978
+
979
+ msgid "default"
980
+ msgstr "προεπιλογή"
981
+
982
+ msgid "Default currency"
983
+ msgstr "Προεπιλεγμένο νόμισμα"
984
+
985
+ msgid "Switch to this currency when switching language in the front-end"
986
+ msgstr "Μετάβαση σε αυτό το νόμισμα όταν αλλάζει η γλώσσα του περιβάλλοντος χρήσης"
987
+
988
+ msgid "Keep"
989
+ msgstr "Διατήρηση"
990
+
991
+ msgid "Delete"
992
+ msgstr "Διαγραφή"
993
+
994
+ msgid " (%s)"
995
+ msgstr "(%s)"
996
+
997
+ msgid "The multi-currency mode cannot be enabled as a specific currency was not set. Go to the %sWooCommerce settings%s page and select the default currency for your store."
998
+ msgstr "Η λειτουργία πολλαπλών νομισμάτων δεν μπορεί να ενεργοποιηθεί καθώς ένα συγκεκριμένο νόμισμα δεν έχει οριστεί. Πηγαίνετε στη σελίδα %sρυθμίσεων του WooCommerce%s και επιλέξτε το προεπιλεγμένο νόμισμα για το κατάστημά σας."
999
+
1000
+ msgid "Learn more"
1001
+ msgstr "Μάθετε περισσότερα"
1002
+
1003
+ msgid "Show only products with custom prices in secondary currencies"
1004
+ msgstr "Εμφάνιση μόνο των προϊόντων με τιμές προσαρμοσμένες σε δευτερεύοντα νομίσματα"
1005
+
1006
+ msgid "When this option is on, when you switch to a secondary currency on the front end, only the products with custom prices in that currency are being displayed. Products with prices determined based on the exchange rate are hidden."
1007
+ msgstr "Όταν είναι ενεργοποιημένη αυτή η επιλογή και αλλάζετε σε ένα δευτερεύον νόμισμα στο προσκήνιο, εμφανίζονται μόνο τα προϊόντα με τιμές προσαρμοσμένες σε αυτό το νόμισμα. Προϊόντα με τιμές που καθορίζονται βάσει της συναλλαγματικής ισοτιμίας αποκρύπτονται."
1008
+
1009
+ msgid "The changes you made will be lost if you navigate away from this page."
1010
+ msgstr "Οι αλλαγές που πραγματοποιήσατε θα χαθούν εάν πλοηγηθείτε εκτός της παρούσας σελίδας."
1011
+
1012
+ msgid "At least one currency must be enabled for this language!"
1013
+ msgstr "Πρέπει να ενεργοποιηθεί τουλάχιστον ένα νόμισμα για αυτή τη γλώσσα!"
1014
+
1015
+ msgid "Currency switcher options"
1016
+ msgstr "Επιλογές εναλλαγής νομίσματος"
1017
+
1018
+ msgid "Currency switcher style"
1019
+ msgstr "Στυλ εναλλαγής νομίσματος"
1020
+
1021
+ msgid "Currency order"
1022
+ msgstr "Σειρά νομισμάτων"
1023
+
1024
+ msgid "Available parameters"
1025
+ msgstr "Διαθέσιμες παράμετροι"
1026
+
1027
+ msgid "Template for currency switcher"
1028
+ msgstr "Πρότυπο για εναλλαγή νομίσματος"
1029
+
1030
+ msgid "Visibility"
1031
+ msgstr "Ορατότητα"
1032
+
1033
+ msgid "Currency switcher preview"
1034
+ msgstr "Προεπισκόπηση εναλλαγής νομίσματος"
1035
+
1036
+ msgid "Drop-down menu"
1037
+ msgstr "Πτυσσόμενο μενού"
1038
+
1039
+ msgid "List of currencies"
1040
+ msgstr "Λίστα νομισμάτων"
1041
+
1042
+ msgid "Vertical"
1043
+ msgstr "Κάθετα"
1044
+
1045
+ msgid "Horizontal"
1046
+ msgstr "Οριζόντια"
1047
+
1048
+ msgid "Drag the currencies to change their order"
1049
+ msgstr "Σύρετε τα νομίσματα για να αλλάξετε τη σειρά τους"
1050
+
1051
+ msgid "%name%, %symbol%, %code%"
1052
+ msgstr "%name%, %symbol%, %code% "
1053
+
1054
+ msgid "Default: %name% (%symbol%) - %code%"
1055
+ msgstr "Προεπιλογή: %name% (%symbol%) – %code%"
1056
+
1057
+ msgid "Show a currency selector on the product page template"
1058
+ msgstr "Εμφάνιση ενός επιλογέα νομίσματος στο πρότυπο της σελίδας προϊόντων"
1059
+
1060
+ msgid "To configure how the %sWooCommerce products%s are translated, visit the WooCommerce Multiligual %ssettings%s page."
1061
+ msgstr "Για να ρυθμίσετε τον τρόπο που μεταφράζονται τα %sπροϊόντα του WooCommerce%s, επισκεφτείτε τη σελίδα %sρυθμίσεων%s του Πολυγλωσσικού WooCommerce."
1062
+
1063
+ msgid "Title"
1064
+ msgstr "Τίτλος"
1065
+
1066
+ msgid "Slug"
1067
+ msgstr "Slug"
1068
+
1069
+ msgid "Content / Description"
1070
+ msgstr "Περιεχόμενο / Περιγραφή"
1071
+
1072
+ msgid "Excerpt"
1073
+ msgstr "Απόσπασμα"
1074
+
1075
+ msgid "Purchase note"
1076
+ msgstr "Σημείωση αγοράς"
1077
+
1078
+ msgid "Images"
1079
+ msgstr "Εικόνες"
1080
+
1081
+ msgid "Custom Product attributes"
1082
+ msgstr "Ιδιότητες προσαρμοσμένων προϊόντων"
1083
+
1084
+ msgid "Name"
1085
+ msgstr "Όνομα"
1086
+
1087
+ msgid "Value(s)"
1088
+ msgstr "Τιμή(-ές)"
1089
+
1090
+ msgid "Custom Fields"
1091
+ msgstr "Προσαρμοσμένα πεδία"
1092
+
1093
+ msgid "Variations data"
1094
+ msgstr "Δεδομένα παραλλαγών"
1095
+
1096
+ msgid "Download Files for Variation #%s"
1097
+ msgstr "Λήψη αρχείων για παραλλαγή #%s"
1098
+
1099
+ msgid "Download Files"
1100
+ msgstr "Λήψη αρχείων"
1101
+
1102
+ msgid "File URL"
1103
+ msgstr "URL αρχείου"
1104
+
1105
+ msgid "Content, title, and excerpt are empty."
1106
+ msgstr "Το περιεχόμενο, ο τίτλος και το απόσπασμα είναι κενά."
1107
+
1108
+ msgid "Search %s"
1109
+ msgstr "Αναζήτηση %s"
1110
+
1111
+ msgid "All %s"
1112
+ msgstr "Όλα τα %s"
1113
+
1114
+ msgid "Parent %s"
1115
+ msgstr "Γονικό %s"
1116
+
1117
+ msgid "Parent %s:"
1118
+ msgstr "Γονικό %s:"
1119
+
1120
+ msgid "Edit %s"
1121
+ msgstr "Επεξεργασία %s"
1122
+
1123
+ msgid "Update %s"
1124
+ msgstr "Ενημέρωση %s"
1125
+
1126
+ msgid "Add New %s"
1127
+ msgstr "Προσθήκη νέας %s"
1128
+
1129
+ msgid "New %s"
1130
+ msgstr "Νέο %s"
1131
+
1132
+ msgid "To translate Add-ons strings please save Add-ons and go to the <b><a href=\"%s\">String Translation interface</a></b>"
1133
+ msgstr "Για να γίνει μετάφραση των συμβολοσειρών προσθήκης αποθηκεύστε τις προσθήκες και πηγαίνετε στο <b><a href=\"%s\">Περιβάλλον εργασίας μετάφρασης συμβολοσειρών</a></b> "
1134
+
1135
+ msgid "Product Add-ons Group \"%s\""
1136
+ msgstr "Ομάδα προσθηκών προϊόντος \"%s\""
1137
+
1138
+ msgid "Description"
1139
+ msgstr "Περιγραφή"
1140
+
1141
+ msgid "Options"
1142
+ msgstr "Επιλογές"
1143
+
1144
+ msgid "Label"
1145
+ msgstr "Ετικέτα"
1146
+
1147
+ msgid "To translate Extra Options strings please save %s and go to the <b><a href=\"%s\">String Translation interface</a></b>"
1148
+ msgstr "Για να γίνει μετάφραση των συμβολοσειρών Πρόσθετες επιλογές αποθηκεύστε %s και πηγαίνετε στo <b><a href=\"%s\">Περιβάλλον εργασίας μετάφρασης συμβολοσειρών</a></b> "
1149
+
1150
+ msgid "Language"
1151
+ msgstr "Γλώσσα"
1152
+
1153
+ msgid "Translation of"
1154
+ msgstr "Μετάφραση του:"
1155
+
1156
+ msgid "Subscription Price"
1157
+ msgstr "Τιμή συνδρομής"
1158
+
1159
+ msgid "Sign-up Fee"
1160
+ msgstr "Τέλος εγγραφής"
1161
+
1162
+ msgid "Calculate costs in other currencies automatically"
1163
+ msgstr "Αυτόματος υπολογισμός κόστους σε άλλα νομίσματα"
1164
+
1165
+ msgid "Set costs in other currencies manually"
1166
+ msgstr "Μη αυτόματος ορισμός κόστους σε άλλα νομίσματα"
1167
+
1168
+ msgid "This is the cost per block booked. All other costs (for resources and persons) are added to this."
1169
+ msgstr "Αυτό είναι το κόστος της κράτησης για κάθε μπλοκ. Όλα τα άλλα κόστη (για πόρους και πρόσωπα) έχουν προστεθεί σε αυτό."
1170
+
1171
+ msgid "Product tabs"
1172
+ msgstr "Ετικέτες προϊόντος"
1173
+
1174
+ msgid "Heading"
1175
+ msgstr "Κεφαλίδα"
1176
+
1177
+ msgid "Tour Data"
1178
+ msgstr "Δεδομένα ταξιδιού"
1179
+
1180
+ msgid "Content"
1181
+ msgstr "Περιεχόμενο"
1182
+
1183
+ msgid "Composite Products"
1184
+ msgstr "Σύνθετα προϊόντα"
1185
+
1186
+ msgid "Product Bundles"
1187
+ msgstr "Πακέτα προϊόντων"
1188
+
1189
+ msgid "One-off cost for the booking as a whole."
1190
+ msgstr "Συνολικό εφάπαξ ποσό πληρωμής για την κράτηση."
1191
+
1192
+ msgid "The cost is displayed to the user on the frontend. Leave blank to have it calculated for you. If a booking has varying costs, this will be prefixed with the word \"from:\"."
1193
+ msgstr "Το κόστος εμφανίζεται στον χρήστη στο προσκήνιο. Αφήστε το κενό για να γίνει υπολογισμός του. Αν μια κράτηση έχει διάφορα κόστη, θα ακολουθεί τη λέξη \"από:\"."
1194
+
1195
+ msgid "Bookings"
1196
+ msgstr "Κρατήσεις"
1197
+
1198
+ msgid "Resources Label"
1199
+ msgstr "Ετικέτα πόρων"
1200
+
1201
+ msgid "Resources"
1202
+ msgstr "Πόροι"
1203
+
1204
+ msgid "Person Types"
1205
+ msgstr "Τύποι προσώπων"
1206
+
1207
+ msgid "Person Type Name"
1208
+ msgstr "Όνομα τύπου προσώπου"
1209
+
1210
+ msgid "Resources label"
1211
+ msgstr "Ετικέτα πόρων"
1212
+
1213
+ msgid "Booking currency"
1214
+ msgstr "Νόμισμα κράτησης"
locale/woocommerce-multilingual-es_ES.po ADDED
@@ -0,0 +1,1214 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # This file was generated by WPML
2
+ # WPML is a WordPress plugin that can turn any WordPress site into a full featured multilingual content management system.
3
+ # https://wpml.org
4
+ msgid ""
5
+ msgstr "Content-Type: text/plain; charset=utf-8\nContent-Transfer-Encoding: 8bit\nProject-Id-Version:WPML_EXPORT\nPOT-Creation-Date: \nPO-Revision-Date: \nLast-Translator: \nLanguage-Team: \nLanguage:en\nMIME-Version: 1.0\n"
6
+
7
+ msgid "Introduction"
8
+ msgstr "Introducción"
9
+
10
+ msgid "Store Pages"
11
+ msgstr "Páginas de la tienda"
12
+
13
+ msgid "Global Attributes"
14
+ msgstr "Atributos globales"
15
+
16
+ msgid "Multiple Currencies"
17
+ msgstr "Varias monedas"
18
+
19
+ msgid "Translation Interface"
20
+ msgstr "Interfaz de traducción"
21
+
22
+ msgid "Ready!"
23
+ msgstr "¡Listo!"
24
+
25
+ msgid "Welcome to %sWooCommerce Multilingual!%s Please take a moment to configure the main settings and then you are ready to start translating your products."
26
+ msgstr "¡Le damos la bienvenida a %sWooCommerce Multilingual%s! Dedíquele unos instantes a configurar los ajustes principales; después de esto estará listo para empezar a traducir los productos."
27
+
28
+ msgid "Action failed. Please refresh the page and retry."
29
+ msgstr "La acción falló. Actualice la página e inténtelo de nuevo."
30
+
31
+ msgid "Cheatin&#8217; huh?"
32
+ msgstr "¿Haciendo trampa, eh?"
33
+
34
+ msgid "Run the Setup Wizard"
35
+ msgstr "Ejecutar el asistente de configuración"
36
+
37
+ msgid "Skip Setup"
38
+ msgstr "Omitir configuración"
39
+
40
+ msgid "WooCommerce Multilingual &rsaquo; Setup Wizard"
41
+ msgstr "WooCommerce Multilingual y asistente de configuración"
42
+
43
+ msgid "WooCommerce Multilingual"
44
+ msgstr "WooCommerce Multilingual"
45
+
46
+ msgid "How to translate products"
47
+ msgstr "Instrucciones para traducir productos"
48
+
49
+ msgid "Quick edit is disabled for product translations. It's recommended to use the %s for editing products translations. %s"
50
+ msgstr "La edición rápida está desactivada para la traducción de productos. Se recomienda usar el %s para editar las traducciones de los productos. %s"
51
+
52
+ msgid "WooCommerce Multilingual products editor"
53
+ msgstr "Editor de productos de WooCommerce Multilingual"
54
+
55
+ msgid "Edit this product translation"
56
+ msgstr "Editar la traducción de este producto"
57
+
58
+ msgid "How to translate attributes"
59
+ msgstr "Instrucciones para traducir atributos"
60
+
61
+ msgid "How to translate product categories"
62
+ msgstr "Instrucciones para traducir categorías de productos"
63
+
64
+ msgid "The recommended way to translate WooCommerce products is using the\n %sWooCommerce Multilingual products translation%s page.\n Please use this page only for translating elements that are not available in the WooCommerce Multilingual products translation table."
65
+ msgstr "La forma recomendada de traducir los productos de WooCommerce es a través de la página de \n %straducción de productos de WooCommerce Multilingual%s.\n Use esta página solo para traducir elementos que no están disponibles en la tabla de traducción de productos de WooCommerce Multilingual."
66
+
67
+ msgid "In order to edit custom attributes you need to use the <a href=\"%s\">custom product translation editor</a>"
68
+ msgstr "Para editar atributos personalizados, use el <a href=\"%s\">editor de traducción de productos personalizado</a>"
69
+
70
+ msgid "You are using the same value as for the regular category base. This is known to create conflicts resulting in urls not working properly."
71
+ msgstr "Está usando el mismo valor que para la base de categoría regular. Se sabe que esto crea conflictos que dan como resultado urls que no funcionan correctamente."
72
+
73
+ msgid "translations"
74
+ msgstr "traducciones"
75
+
76
+ msgid "product"
77
+ msgstr "producto"
78
+
79
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">WPML</a> versions prior %s."
80
+ msgstr "WooCommerce Multilingual está habilitado pero no es operante. No es compatible con las versiones de <a href=\"%s\">WPML</a> anteriores a la %s."
81
+
82
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">Woocommerce</a> versions prior %s."
83
+ msgstr "WooCommerce Multilingual está habilitado pero no es operante. No es compatible con las versiones de <a href=\"%s\">Woocommerce</a> anteriores a la %s."
84
+
85
+ msgid "You are using WooCommerce Multilingual %s. This version includes an important UI redesign for the configuration screens and it requires <a href=\"%s\">WPML %s</a> or higher. Everything still works on the front end now but, in order to configure options for WooCommerce Multilingual, you need to upgrade WPML."
86
+ msgstr "Está usando WooCommerce Multilingual %s. Esta versión incluye una modificación importante de la IU en las pantallas de configuración y requiere <a href=\"%s\">WPML %s</a> o posterior. Todo sigue operando en la interfaz del usuario, pero para configurar las opciones de WooCommerce Multilingual, debes actualizar WPML."
87
+
88
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">WPML Translation Management</a> versions prior %s."
89
+ msgstr "WooCommerce Multilingual está habilitado pero no es operante. No es compatible con las versiones de <a href=\"%s\">WPML</a> anteriores a la %s."
90
+
91
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">WPML String Translation</a> versions prior %s."
92
+ msgstr "WooCommerce Multilingual está habilitado pero no es operante. No es compatible con las versiones de <a href=\"%s\">WPML</a> anteriores a la %s."
93
+
94
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">WPML Media</a> versions prior %s."
95
+ msgstr "WooCommerce Multilingual está habilitado pero no es operante. No es compatible con las versiones de <a href=\"%s\">WPML</a> anteriores a la %s."
96
+
97
+ msgid "and"
98
+ msgstr "y"
99
+
100
+ msgid "WooCommerce Multilingual is enabled but not effective. It requires %s in order to work."
101
+ msgstr "WooCommerce Multilingual está habilitado pero no vigente. Requiere %s para funcionar."
102
+
103
+ msgid "Permalink settings"
104
+ msgstr "Configuración de enlaces permanentes"
105
+
106
+ msgid "Configure products slug translation"
107
+ msgstr "Configurar la traducción de slugs de productos"
108
+
109
+ msgid "If you want different slugs for shop pages (%s/%s), you need to disable the shop prefix for products in <a href=\"%s\">WooCommerce Settings</a>"
110
+ msgstr "Si desea traducir slugs para las páginas de la tienda (%s/%s), debe desactivar el prefijo de la tienda para los productos en la <a href=\"%s\">Configuración de WooCommerce</a>"
111
+
112
+ msgid "Finished! You can visit the %sstrings translation%s screen to translate the strings now."
113
+ msgstr "¡Listo! Diríjase a la pantalla de %sTraducción de cadenas%s para traducir la cadena ahora."
114
+
115
+ msgid "wpml-config.xml file missing from WooCommerce Multilingual folder."
116
+ msgstr "Falta el archivo wpml-config.xml en la carpeta WooCommerce Multilingual."
117
+
118
+ msgid "Custom field %s configuration from wpml-config.xml file was altered!"
119
+ msgstr "Se ha modificado la configuración del campo personalizado %s en el archivo wpml-config.xml."
120
+
121
+ msgid "Custom type %s configuration from wpml-config.xml file was altered!"
122
+ msgstr "Se ha modificado la configuración del tipo personalizado %s en el archivo wpml-config.xml."
123
+
124
+ msgid "Custom taxonomy %s configuration from wpml-config.xml file was altered!"
125
+ msgstr "Se ha modificado la configuración de la taxonomía personalizada %s en el archivo wpml-config.xml."
126
+
127
+ msgid "Upgrade WPML"
128
+ msgstr "Actualizar WPML"
129
+
130
+ msgid "Invalid language parameter: %s"
131
+ msgstr "Parámetro de idioma no válido: %s"
132
+
133
+ msgid "Source product id not found: %s"
134
+ msgstr "No se encontró la ID del producto: %s"
135
+
136
+ msgid "Product Base"
137
+ msgstr "Base de producto"
138
+
139
+ msgid "Product Tag Base"
140
+ msgstr "Base de etiqueta de producto"
141
+
142
+ msgid "Product Category Base"
143
+ msgstr "Base de categoría de producto"
144
+
145
+ msgid "Product Attribute Base"
146
+ msgstr "Base de atributo de producto"
147
+
148
+ msgid "Endpoint: %s"
149
+ msgstr "Extremo: %s"
150
+
151
+ msgid "product-category"
152
+ msgstr "producto-categoría"
153
+
154
+ msgid "product-tag"
155
+ msgstr "producto-etiqueta"
156
+
157
+ msgid "Original language"
158
+ msgstr "Idioma original"
159
+
160
+ msgid "Take this and edit"
161
+ msgstr "Tomar esto y editar"
162
+
163
+ msgid "Add translation"
164
+ msgstr "Agregar traducción"
165
+
166
+ msgid "Update translation"
167
+ msgstr "Actualizar traducción"
168
+
169
+ msgid "Finish translating"
170
+ msgstr "Finalizar traducción"
171
+
172
+ msgid "Edit translation"
173
+ msgstr "Editar traducción"
174
+
175
+ msgid "Edit this item inline"
176
+ msgstr "Editar este elemento insertado"
177
+
178
+ msgid "Quick Edit"
179
+ msgstr "Edición rápida"
180
+
181
+ msgid "Translation in progress"
182
+ msgstr "Traducción en curso"
183
+
184
+ msgid "Invalid nonce"
185
+ msgstr "Valor de seguridad (nonce) no válido"
186
+
187
+ msgid "Currency - no orders found"
188
+ msgstr "Moneda: no se encontraron órdenes"
189
+
190
+ msgid "Currencies order updated"
191
+ msgstr "Orden de monedas actualizado"
192
+
193
+ msgid "Currency switcher"
194
+ msgstr "Selector de moneda"
195
+
196
+ msgid "Configure options"
197
+ msgstr "Configurar opciones"
198
+
199
+ msgid "Settings saved!"
200
+ msgstr "Configuración guardada."
201
+
202
+ msgid "Add new currency"
203
+ msgstr "Agregar nueva moneda"
204
+
205
+ msgid "Update currency"
206
+ msgstr "Actualizar moneda"
207
+
208
+ msgid "Update settings for %s"
209
+ msgstr "Actualizar configuración para %s"
210
+
211
+ msgid "The default currency was changed. In order to show accurate prices in all currencies, you need to update the exchange rates under the %sMulti-currency%s configuration."
212
+ msgstr "La moneda predeterminada ha cambiado. Para mostrar los precios exactos en todas las monedas, debe actualizar las tasas de cambio que figuran en la configuración de %sVarias monedas%s."
213
+
214
+ msgid "All the products will be removed from the current order in order to change the currency"
215
+ msgstr "Se borrarán todos los productos de la orden actual para cambiar la moneda"
216
+
217
+ msgid "Show all currencies"
218
+ msgstr "Mostrar todas las monedas"
219
+
220
+ msgid "Order currency:"
221
+ msgstr "Moneda de la orden:"
222
+
223
+ msgid "Cart"
224
+ msgstr "Carrito"
225
+
226
+ msgid "Checkout"
227
+ msgstr "Controlar pedido"
228
+
229
+ msgid "Checkout &rarr; Pay"
230
+ msgstr "Confirmar y pagar"
231
+
232
+ msgid "Order Received"
233
+ msgstr "Orden recibida"
234
+
235
+ msgid "My Account"
236
+ msgstr "Mi cuenta"
237
+
238
+ msgid "Change Password"
239
+ msgstr "Cambiar contraseña"
240
+
241
+ msgid "Edit My Address"
242
+ msgstr "Editar mi dirección"
243
+
244
+ msgid "Logout"
245
+ msgstr "Salir"
246
+
247
+ msgid "Lost Password"
248
+ msgstr "Perdí la contraseña"
249
+
250
+ msgid "View Order"
251
+ msgstr "Ver orden"
252
+
253
+ msgid "Shop"
254
+ msgstr "Tienda"
255
+
256
+ msgid "All the products will be removed from the current order in order to change the language"
257
+ msgstr "Se borrarán todos los productos de la orden actual para cambiar el idioma"
258
+
259
+ msgid "Order language:"
260
+ msgstr "Idioma de la orden:"
261
+
262
+ msgid "Choose a file"
263
+ msgstr "Elegir un archivo"
264
+
265
+ msgid "At least one of these fields is required: title, content or excerpt"
266
+ msgstr "Se requiere uno de estos campos como mínimo: título, contenido o extracto"
267
+
268
+ msgid "This translation job will no longer be assigned to you. Other translators will be able take it and continue the translation."
269
+ msgstr "Este proyecto de traducción ya no estará asignado a usted. Otros traductores podrán tomarlo y continuar con la traducción."
270
+
271
+ msgid "This field is locked for editing because WPML will copy its value from the original language."
272
+ msgstr "La edición de este campo está bloqueada porque WPML copiará su valor del idioma original."
273
+
274
+ msgid "This is a translation of %s. Some of the fields are not editable. It's recommended to use the %s for translating products."
275
+ msgstr "Esta es una traducción de %s. Algunos de los campos no es editable. Se recomienda usar el %s para traducir los productos."
276
+
277
+ msgid "WooCommerce Multilingual products translator"
278
+ msgstr "Traductor de productos de WooCommerce Multilingual"
279
+
280
+ msgid "Looks like you are upgrading from a previous version of WooCommerce Multilingual. Would you like to automatically create translated variations and images?"
281
+ msgstr "Parece que está actualizando de una versión anterior de WooCommerce Multilingual. ¿Te gustaría crear variaciones traducidas e imágenes automáticamente?"
282
+
283
+ msgid "Yes, go to the troubleshooting page"
284
+ msgstr "Sí, ir a la página de solución de problemas"
285
+
286
+ msgid "No - dismiss"
287
+ msgstr "No, descartar"
288
+
289
+ msgid "You've successfully installed %sWooCommerce Multilingual%s. Would you like to see a quick overview?"
290
+ msgstr "%sWooCommerce Multilingual%s se ha instalado correctamente. ¿Le gustaría darle un repaso rápido?"
291
+
292
+ msgid "Learn how to turn your e-commerce site multilingual"
293
+ msgstr "Aprenda cómo hacer multilingüe su sitio de comercio electrónico"
294
+
295
+ msgid "Dismiss"
296
+ msgstr "Descartar"
297
+
298
+ msgid "To translate %s please use the %s translation%s page, inside the %sWooCommerce Multilingual admin%s."
299
+ msgstr "Para traducir %s, por favor use la página de %straducción%s, dentro de la %sadministración de WooCommerce Multilingual%s."
300
+
301
+ msgid "%s do not require translation."
302
+ msgstr "%s no requiere traducción."
303
+
304
+ msgid "Include to translation"
305
+ msgstr "Incluir en traducción"
306
+
307
+ msgid "%d %s are missing translations."
308
+ msgstr "Faltan traducciones de %d %s."
309
+
310
+ msgid "Translate %s"
311
+ msgstr "Traducir %s"
312
+
313
+ msgid "Exclude from translation"
314
+ msgstr "Excluir de traducción"
315
+
316
+ msgid "All %s are translated."
317
+ msgstr "%s: todo traducido."
318
+
319
+ msgid "Currently, there are %s variations that need to be created."
320
+ msgstr "Actualmente, es necesario crear %s variaciones."
321
+
322
+ msgid "%d products left"
323
+ msgstr "Quedan %d productos"
324
+
325
+ msgid "Synchronization complete!"
326
+ msgstr "Sincronización finalizada"
327
+
328
+ msgid "Invalid taxonomy %s"
329
+ msgstr "Taxonomía %s no válida"
330
+
331
+ msgid "Some translated %s have different %s assignments."
332
+ msgstr "Algunos elementos traducidos (%s) tienen distintas asignaciones de %s."
333
+
334
+ msgid "Update %s for all translated %s"
335
+ msgstr "Actualizar %s para todas las %s traducidas"
336
+
337
+ msgid "All %s have the same %s assignments."
338
+ msgstr "Todos los elementos (%s) tienen las mismas asignaciones de %s."
339
+
340
+ msgid "Successfully updated %s for all translated %s."
341
+ msgstr "%s actualizadas correctamente para todas las %s traducidas."
342
+
343
+ msgid "Synchronize attributes and update product variations"
344
+ msgstr "Sincronizar atributos y actualizar variaciones de productos"
345
+
346
+ msgid "Image"
347
+ msgstr "Imagen"
348
+
349
+ msgid "Product"
350
+ msgstr "Producto"
351
+
352
+ msgid "Type"
353
+ msgstr "Tipo"
354
+
355
+ msgid "Date"
356
+ msgstr "Fecha"
357
+
358
+ msgid "Categories"
359
+ msgstr "Categorías"
360
+
361
+ msgid "No products found"
362
+ msgstr "No se encontraron productos"
363
+
364
+ msgid "Draft"
365
+ msgstr "Borrador"
366
+
367
+ msgid "Private"
368
+ msgstr "Privado"
369
+
370
+ msgid "Pending"
371
+ msgstr "Pendiente"
372
+
373
+ msgid "Scheduled"
374
+ msgstr "Programada"
375
+
376
+ msgid "Parent product: %s"
377
+ msgstr "Producto superior: %s"
378
+
379
+ msgid "Edit this item"
380
+ msgstr "Editar este elemento"
381
+
382
+ msgid "Edit"
383
+ msgstr "Editar"
384
+
385
+ msgid "View \"%s\""
386
+ msgstr "Ver \"%s\""
387
+
388
+ msgid "View"
389
+ msgstr "Ver"
390
+
391
+ msgid "Published"
392
+ msgstr "Publicada"
393
+
394
+ msgid "Last Modified"
395
+ msgstr "Última modificación"
396
+
397
+ msgid "All languages"
398
+ msgstr "Todos los idiomas"
399
+
400
+ msgid "All categories"
401
+ msgstr "Todas las categorías"
402
+
403
+ msgid "All translation statuses"
404
+ msgstr "Todos los estados de traducción"
405
+
406
+ msgid "Not translated or needs updating"
407
+ msgstr "Sin traducir o sin actualizar"
408
+
409
+ msgid "Needs updating"
410
+ msgstr "Necesita actualización"
411
+
412
+ msgid "Translation complete"
413
+ msgstr "Traducción terminada"
414
+
415
+ msgid "All statuses"
416
+ msgstr "Todos los estados"
417
+
418
+ msgid "Filter"
419
+ msgstr "Filtro"
420
+
421
+ msgid "Reset"
422
+ msgstr "Reiniciar"
423
+
424
+ msgid "Search"
425
+ msgstr "Búsqueda"
426
+
427
+ msgid "%d items"
428
+ msgstr "%d elementos"
429
+
430
+ msgid "Go to the first page"
431
+ msgstr "Ir a la primera página"
432
+
433
+ msgid "Go to the previous page"
434
+ msgstr "Ir a la página anterior"
435
+
436
+ msgid "Select Page"
437
+ msgstr "Seleccionar página"
438
+
439
+ msgid "Current page"
440
+ msgstr "Página actual"
441
+
442
+ msgid "of"
443
+ msgstr "de"
444
+
445
+ msgid "Go to the next page"
446
+ msgstr "Ir a la siguiente página"
447
+
448
+ msgid "Go to the last page"
449
+ msgstr "Ir a la última página"
450
+
451
+ msgid "Translatable?"
452
+ msgstr "¿Traducible?"
453
+
454
+ msgid "Enable this if you want to translate attribute values with Woocommerce Multilingual"
455
+ msgstr "Activar si se quiere traducir valores de atributos con Woocommerce Multilingual"
456
+
457
+ msgid "Existing translations and variations associated will be deleted."
458
+ msgstr "Las traducciones existentes y las variaciones asociadas serán eliminadas."
459
+
460
+ msgid "Product Translation Interface"
461
+ msgstr "Interfaz de traducción de productos"
462
+
463
+ msgid "The recommended way is using the WPML Translation Editor. It is streamlined for making the translation process much easier while also providing a much better integration with various WooCommerce extensions."
464
+ msgstr "Lo recomendado es usar el Editor del WPML. Este está diseñado para facilitar el proceso de traducción, al tiempo que brinda una mejor integración con varias extensiones de WooCommerce."
465
+
466
+ msgid "WPML Translation Editor"
467
+ msgstr "Editor de traducción de WPML"
468
+
469
+ msgid "Native WooCommerce product editing screen"
470
+ msgstr "Pantalla de edición de producto nativa de WooCommerce"
471
+
472
+ msgid "Products synchronization"
473
+ msgstr "Sincronización de productos"
474
+
475
+ msgid "Configure specific product properties that should be synced to translations."
476
+ msgstr "Configure las propiedades de productos específicas que se deben sincronizar con las traducciones."
477
+
478
+ msgid "Sync publishing date for translated products."
479
+ msgstr "Sincronizar la fecha de publicación para los productos traducidos."
480
+
481
+ msgid "Sync products and product taxonomies order."
482
+ msgstr "Sincronizar productos y orden de taxonomías de producto"
483
+
484
+ msgid "Products Download Files"
485
+ msgstr "Archivos para descargar productos"
486
+
487
+ msgid "If you are using downloadable products, you can choose to have their paths\n synchronized, or seperate for each language."
488
+ msgstr "Si está usando productos que se pueden bajar, puede optar por tener sus rutas\n sincronizadas o separadas para cada idioma."
489
+
490
+ msgid "Use the same files for translations"
491
+ msgstr "Use los mismos archivos para las traducciones"
492
+
493
+ msgid "Add separate download files for translations"
494
+ msgstr "Agregar archivos para descargar separados para las traducciones"
495
+
496
+ msgid "Save changes"
497
+ msgstr "Guardar los cambios"
498
+
499
+ msgid "Troubleshooting page"
500
+ msgstr "Página de Solución de problemas"
501
+
502
+ msgid "Update Translation"
503
+ msgstr "Actualizar traducción"
504
+
505
+ msgid "Hide This Message"
506
+ msgstr "Ocultar este mensaje"
507
+
508
+ msgid "<strong>WooCommerce Translation Available</strong> &#8211; Install or update your <code>%s</code> translations to version <code>%s</code>."
509
+ msgstr "<strong>Traducción de WooCommerce disponible</strong> &#8211; Instale o actualice las traducciones de <code>%s</code> a la versión <code>%s</code>."
510
+
511
+ msgid "This will automatically generate variations for translated products corresponding to recently translated attributes."
512
+ msgstr "Esto generará automáticamente variaciones para los productos traducidos correspondientes a atributos traducidos recientemente."
513
+
514
+ msgid "Synchronize %s assignment in content"
515
+ msgstr "Sincronizar las asignaciones de %s en el contenido"
516
+
517
+ msgid "This action lets you automatically apply the %s taxonomy to your content in different languages. It will scan the original content and apply the same taxonomy to translated content."
518
+ msgstr "Esta acción permite aplicar automáticamente la taxonomía %s al contenido en distintos idiomas. La misma analizará el contenido original y aplicará la misma taxonomía al contenido traducido."
519
+
520
+ msgid "You have untranslated terms!"
521
+ msgstr "Tiene términos sin traducir."
522
+
523
+ msgid "Select currency"
524
+ msgstr "Seleccionar moneda"
525
+
526
+ msgid "Exchange Rate"
527
+ msgstr "Tasa de cambio"
528
+
529
+ msgid "Only numeric"
530
+ msgstr "Solo números"
531
+
532
+ msgid "Set on %s"
533
+ msgstr "Actualizado al %s"
534
+
535
+ msgid "Currency Preview"
536
+ msgstr "Vista previa de moneda"
537
+
538
+ msgid "Currency Position"
539
+ msgstr "Posición de la moneda"
540
+
541
+ msgid "Left"
542
+ msgstr "Izquierda"
543
+
544
+ msgid "Right"
545
+ msgstr "Derecha"
546
+
547
+ msgid "Left with space"
548
+ msgstr "A la izquierda con espacio"
549
+
550
+ msgid "Right with space"
551
+ msgstr "A la derecha con espacio"
552
+
553
+ msgid "Thousand Separator"
554
+ msgstr "Separador de miles"
555
+
556
+ msgid "Decimal Separator"
557
+ msgstr "Separador de decimales"
558
+
559
+ msgid "Number of Decimals"
560
+ msgstr "Cantidad de decimales"
561
+
562
+ msgid "Rounding to the nearest integer"
563
+ msgstr "Redondeo al entero más próximo"
564
+
565
+ msgid "Disabled"
566
+ msgstr "Desactivado"
567
+
568
+ msgid "Up"
569
+ msgstr "Arriba"
570
+
571
+ msgid "Down"
572
+ msgstr "Abajo"
573
+
574
+ msgid "Nearest"
575
+ msgstr "Más cerca"
576
+
577
+ msgid "Increment for nearest integer"
578
+ msgstr "Aumento al entero más próximo"
579
+
580
+ msgid "Autosubtract amount"
581
+ msgstr "Resta automática de importe"
582
+
583
+ msgid "Cancel"
584
+ msgstr "Cancelar"
585
+
586
+ msgid "Save"
587
+ msgstr "Guardar"
588
+
589
+ msgid "Products"
590
+ msgstr "Productos"
591
+
592
+ msgid "Tags"
593
+ msgstr "Etiquetas"
594
+
595
+ msgid "Attributes"
596
+ msgstr "Atributos"
597
+
598
+ msgid "Shipping Classes"
599
+ msgstr "Clases de envíos"
600
+
601
+ msgid "Settings"
602
+ msgstr "Configuración"
603
+
604
+ msgid "Multi-currency"
605
+ msgstr "Varias monedas"
606
+
607
+ msgid "Store URLs"
608
+ msgstr "URL de la tienda"
609
+
610
+ msgid "Status"
611
+ msgstr "Estado"
612
+
613
+ msgid "Troubleshooting"
614
+ msgstr "Solución de problemas"
615
+
616
+ msgid "Thank you for using %sWooCommerce Multilingual%s! You can express your love and\n support by %s rating our plugin and saying that %sit works%s for you."
617
+ msgstr "¡Gracias por usar %sWooCommerce Multilingual%s! Exprese su amor y\n apoyo %scalificando nuestro plugin y diciendo que %ste sirve%s."
618
+
619
+ msgid "Hide"
620
+ msgstr "Ocultar"
621
+
622
+ msgid "Loading ..."
623
+ msgstr "Cargando..."
624
+
625
+ msgid "Regular Price"
626
+ msgstr "Precio regular"
627
+
628
+ msgid "Sale Price"
629
+ msgstr "Precio de oferta"
630
+
631
+ msgid "Multi-currency is enabled but no secondary currencies have been set. %sAdd secondary currencies%s."
632
+ msgstr "Se ha activado el modo Varias monedas pero no se han establecido las monedas secundarias. %sAgregar monedas secundarias%s"
633
+
634
+ msgid "Calculate prices in other currencies automatically"
635
+ msgstr "Calcular los precios en otras monedas automáticamente"
636
+
637
+ msgid "Click to see the prices in the other currencies as they are currently shown on the front end."
638
+ msgstr "Pulsar para ver los precios tal como se muestran en la interfaz del usuario."
639
+
640
+ msgid "Show"
641
+ msgstr "Mostrar"
642
+
643
+ msgid "Set prices in other currencies manually"
644
+ msgstr "Establecer precios en otras monedas manualmente"
645
+
646
+ msgid "Enter prices in other currencies"
647
+ msgstr "Introducir precios en otras monedas"
648
+
649
+ msgid "Hide prices in other currencies"
650
+ msgstr "Ocultar precios en otras monedas"
651
+
652
+ msgid "Determined automatically based on exchange rate"
653
+ msgstr "Determinado automáticamente según la tasa de cambio"
654
+
655
+ msgid "Schedule"
656
+ msgstr "Programar"
657
+
658
+ msgid "Same as default currency"
659
+ msgstr "Igual a la moneda predeterminada"
660
+
661
+ msgid "Set dates"
662
+ msgstr "Definir fechas"
663
+
664
+ msgid "Collapse"
665
+ msgstr "Contraer"
666
+
667
+ msgid "From&hellip;"
668
+ msgstr "De"
669
+
670
+ msgid "To&hellip;"
671
+ msgstr "Para&hellip;"
672
+
673
+ msgid "Please enter in a value less than the regular price"
674
+ msgstr "Introduzca un valor menor que el precio regular"
675
+
676
+ msgid "Required plugins"
677
+ msgstr "Plugins requeridos"
678
+
679
+ msgid "Plugins Status"
680
+ msgstr "Estado del plugin"
681
+
682
+ msgid "WooCommerce Multilingual depends on several plugins to work. If any required plugin is missing, you should install and activate it."
683
+ msgstr "WooCommerce Multilingual depende de varios plugins para funcionar. Si falta algún plugin requerido, debe instalarlo y activarlo."
684
+
685
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">WPML</a> versions prior 2.0.5."
686
+ msgstr "WooCommerce Multilingual está habilitado pero no vigente. No es compatible con las versiones de <a href=\"%s\">WPML</a> anteriores a la 2.0.5."
687
+
688
+ msgid "Update WPML"
689
+ msgstr "Actualizar WPML"
690
+
691
+ msgid "Get WPML"
692
+ msgstr "Obtener WPML"
693
+
694
+ msgid "Get WPML Media"
695
+ msgstr "Obtener WPML Media"
696
+
697
+ msgid "Get WPML Translation Management"
698
+ msgstr "Obtener Administración de traducción de WPML"
699
+
700
+ msgid "Get WPML String Translation"
701
+ msgstr "Obtener Traducción de cadenas de WPML"
702
+
703
+ msgid "%s is installed and active."
704
+ msgstr "%s está instalado y activo."
705
+
706
+ msgid "%s is set up."
707
+ msgstr "%s está configurado."
708
+
709
+ msgid "%s is not set up."
710
+ msgstr "%s no está configurado."
711
+
712
+ msgid "%s is either not installed or not active."
713
+ msgstr "%s no está instalado, o bien, no está activo."
714
+
715
+ msgid "%1$s is installed, but with incorrect version. You need %1$s %2$s or higher. "
716
+ msgstr "%1$s está instalado, pero en la versión incorrecta. Se requiere %1$s %2$s o superior."
717
+
718
+ msgid "Download WooCommerce"
719
+ msgstr "Descargar WooCommerce"
720
+
721
+ msgid "The WordPress Multilingual Plugin"
722
+ msgstr "El plugin WordPress Multilingual"
723
+
724
+ msgid "This page allows you to translate all strings that are being used by WooCommerce in building different type of urls. Translating them enables you to have fully localized urls that match the language of the pages."
725
+ msgstr "Esta página permite traducir todas las cadenas en uso en WooCommerce para crear distintos tipos de URL. La traducción de las mismas le permite tener URL totalmente localizadas que coincidan con el idioma de la página."
726
+
727
+ msgid "You can enter or edit your default values on the %sPermalinks settings%s page or, for the endpoints, on the WooCommerce %sAccount settings%s page."
728
+ msgstr "Puede introducir o editar los valores predeterminados en la página %sConfiguración de enlaces permanentes%s o, para la interfaz del usuario, en la página %sConfiguración de la cuenta%s de WooCommerce."
729
+
730
+ msgid "permalinks settings"
731
+ msgstr "configuración de enlaces permanentes"
732
+
733
+ msgid "Account settings"
734
+ msgstr "Configuración de la cuenta"
735
+
736
+ msgid "Slug type"
737
+ msgstr "Tipo de slug"
738
+
739
+ msgid "Original Slug"
740
+ msgstr "Slug original"
741
+
742
+ msgid "Shop page"
743
+ msgstr "Página de tienda"
744
+
745
+ msgid "Product base"
746
+ msgstr "Base de producto"
747
+
748
+ msgid "Product category base"
749
+ msgstr "Base de categoría de producto"
750
+
751
+ msgid "Product tag base"
752
+ msgstr "Base de etiqueta de producto"
753
+
754
+ msgid "Product attribute base"
755
+ msgstr "Base de atributo de producto"
756
+
757
+ msgid "Original"
758
+ msgstr "Original"
759
+
760
+ msgid "Translation to"
761
+ msgstr "Traducción al"
762
+
763
+ msgid "Product Shop Base"
764
+ msgstr "Base de tienda de producto"
765
+
766
+ msgid "Welcome to WooCommerce Multilingual!"
767
+ msgstr "¡Le damos la bienvenida a WooCommerce Multilingual!"
768
+
769
+ msgid "Configure the multilingual support for your e-commerce site in just a couple of minutes."
770
+ msgstr "Configure el soporte multilingüe para su sitio de comercio electrónico en solo un par de minutos."
771
+
772
+ msgid "By default, the products are translatable just like product categories, product tags and attributes. So you can start translating these right away."
773
+ msgstr "Por omisión, los productos son traducibles tal como las categorías de productos, etiquetas de productos y atributos, de modo que pueda empezar a traducirlos al instante."
774
+
775
+ msgid "You can configure, however, which attributes you want to translate, install the translated shop pages or enable the multi-currency mode."
776
+ msgstr "Sin embargo, se puede configurar qué atributos se desea traducir, instalar las páginas de la tienda traducidas o activar el modo de varias monedas."
777
+
778
+ msgid "Start"
779
+ msgstr "Iniciar"
780
+
781
+ msgid "No, thanks. I'll do it later."
782
+ msgstr "No, gracias. Lo haré más tarde."
783
+
784
+ msgid "Select translatable attributes"
785
+ msgstr "Seleccionar atributos traducibles"
786
+
787
+ msgid "There are no attributes defined"
788
+ msgstr "No hay ningún atributo definido"
789
+
790
+ msgid "Continue"
791
+ msgstr "Continuar"
792
+
793
+ msgid "Later"
794
+ msgstr "Más tarde"
795
+
796
+ msgid "One or more WooCommerce pages have not been created"
797
+ msgstr "No se crearon una o más páginas de WooCommerce."
798
+
799
+ msgid "Install missing WooCommerce pages and create translations."
800
+ msgstr "Instalar las páginas de WooCommerce que faltan y crear traducciones."
801
+
802
+ msgid "Translate Store Pages"
803
+ msgstr "Traducir las páginas de la tienda"
804
+
805
+ msgid "All store pages must be translated in the languages configured on the site."
806
+ msgstr "Todas las páginas de la tienda deben estar traducidas a los idiomas configurados en el sitio."
807
+
808
+ msgid "Select the translation interface"
809
+ msgstr "Seleccionar la interfaz de traducción"
810
+
811
+ msgid "Enable multiple currencies"
812
+ msgstr "Activar varias monedas"
813
+
814
+ msgid "This will allow you to set prices for products in different currencies. The prices can be determined based on a given exchange rate or set explicitly for specific products."
815
+ msgstr "Esto permite definir los precios de los productos en distintas monedas. Los precios se pueden determinar según una tasa de cambio dada o definir explícitamente para productos específicos."
816
+
817
+ msgid "Enable the multi-currency mode"
818
+ msgstr "Activar el modo Varias monedas"
819
+
820
+ msgid "Further actions that are necessary for making your existing content multilingual, are listed below."
821
+ msgstr "Además, las acciones que se deben realizar para que el contenido existente sea multilingüe son las siguiente."
822
+
823
+ msgid "Start translating products"
824
+ msgstr "Empezar a traducir productos"
825
+
826
+ msgid "Add secondary currencies on the %smulti-currency configuration%s page"
827
+ msgstr "Agregar monedas secundarias en la página de %sconfiguración de varias monedas%s"
828
+
829
+ msgid "Translate existing terms for these %sproduct attributes%s: %s"
830
+ msgstr "Traducir términos existentes para estos %satributos de productos%s: %s"
831
+
832
+ msgid "Translate existing %sproduct categories%s"
833
+ msgstr "Traducir %scategorías de productos%s existentes"
834
+
835
+ msgid "Translate existing %sproduct tags%s"
836
+ msgstr "Traducir %setiquetas de productos%s existentes"
837
+
838
+ msgid "%sAdd missing translations%s for shipping classes"
839
+ msgstr "%sAgregar las traducciones faltantes%s para los tipos de envíos"
840
+
841
+ msgid "Translate %sURL slugs%s to create multilingual store and product urls"
842
+ msgstr "Traducir los %sslugs de URL%s para crear las url de la tienda multilingüe y los productos"
843
+
844
+ msgid "Use custom settings for translations download files"
845
+ msgstr "Usar configuración personalizada para los archivos de descarga de traducciones"
846
+
847
+ msgid "WooCommerce Store Pages"
848
+ msgstr "Páginas de tienda de WooCommerce"
849
+
850
+ msgid "To run a multilingual e-commerce site, you need to have the WooCommerce shop pages translated to all the site's languages. Once all the pages are installed you can add the translations for them from this menu."
851
+ msgstr "Para ejecutar un sitio de e-commerce multilingüe, es necesario tener las páginas de la tienda de WooCommerce traducidas a todos los idiomas del sitio. Cuando todas las páginas estén instaladas, se podrán agregar las traducciones para estas desde este menú."
852
+
853
+ msgid "One or more WooCommerce pages have not been created."
854
+ msgstr "Una o más páginas de WooCommerce no se crearon."
855
+
856
+ msgid "Install WooCommerce Pages"
857
+ msgstr "Instalar páginas de WooCommerce"
858
+
859
+ msgid "WooCommerce store pages do not exist for these languages:"
860
+ msgstr "La tienda de WooCommerce no tiene páginas para estos idiomas:"
861
+
862
+ msgid "Create missing translations"
863
+ msgstr "Crear las traducciones que faltan"
864
+
865
+ msgid "These pages are currently being translated by translators via WPML: "
866
+ msgstr "Actualmente, los traductores están traduciendo estas páginas por medio de WPML:"
867
+
868
+ msgid "WooCommerce store pages are translated to all the site's languages."
869
+ msgstr "Las páginas de la tienda WooCommerce están traducidas a todos los idiomas del sitio."
870
+
871
+ msgid "Configuration warnings"
872
+ msgstr "Advertencias de configuración"
873
+
874
+ msgid "Reporting miscelaneous configuration issues that can make WooCommerce Multilingual not run normally"
875
+ msgstr "Informando diversos problemas de configuración que podrían estar provocando un mal funcionamiento de WooCommerce Multilingual"
876
+
877
+ msgid "Your product permalink base is not translated to:"
878
+ msgstr "La base del enlace permanente del producto no está traducida al:"
879
+
880
+ msgid "Translate URLs"
881
+ msgstr "Traducir URL"
882
+
883
+ msgid "Your site's default language is not English and the strings language is also not English."
884
+ msgstr "El idioma predeterminado del sitio web no es el inglés, y el idioma de las cadenas tampoco es el inglés."
885
+
886
+ msgid "Running WooCommerce multilingual with default language other than English."
887
+ msgstr "El idioma predeterminado en el que se está ejecutando WooCommerce multilingüe no es el inglés."
888
+
889
+ msgid "This may cause problems with URLs in different languages."
890
+ msgstr "Esto podría causar problemas con la URL de otros idiomas."
891
+
892
+ msgid "Change default language"
893
+ msgstr "Cambiar el idioma predeterminado"
894
+
895
+ msgid "Your site's default language is not English."
896
+ msgstr "El idioma predeterminado del sitio web no es el inglés."
897
+
898
+ msgid "There are some settings that require careful attention."
899
+ msgstr "Algunos ajustes de configuración requieren especial atención."
900
+
901
+ msgid "Some settings from the WooCommerce Multilingual wpml-config.xml file have been overwritten."
902
+ msgstr "Algunos ajustes del archivo wpml-config.xml de WooCommerce Multilingual fueron reemplazados."
903
+
904
+ msgid "You should check WPML configuration files added by other plugins or manual settings on the %s section."
905
+ msgstr "Controle los archivos de configuración de WPML agregados por otros plugins o la configuración manual en la sección %s."
906
+
907
+ msgid "Multilingual Content Setup"
908
+ msgstr "Configuración del contenido multilingüe"
909
+
910
+ msgid "Taxonomies missing translations"
911
+ msgstr "Faltan traducciones de taxonomías"
912
+
913
+ msgid "To run a fully translated site, you should translate all taxonomy terms. Some store elements, such as variations, depend on taxonomy translation."
914
+ msgstr "Para administrar un sitio totalmente traducido, debe traducir todos los términos de las taxonomías. Algunos elementos de la tienda, como las variaciones, dependen de la traducción de las taxonomías."
915
+
916
+ msgid "This taxonomy requires translation."
917
+ msgstr "Esta taxonomía requiere traducción."
918
+
919
+ msgid "Include in translation"
920
+ msgstr "Incluir en la traducción"
921
+
922
+ msgid "This taxonomy does not require translation."
923
+ msgstr "Esta taxonomía no requiere traducción."
924
+
925
+ msgid "Right now, there are no taxonomy terms needing translation."
926
+ msgstr "En este momento, no hay términos taxonómicos sin traducir."
927
+
928
+ msgid "There are no translatable product attributes defined"
929
+ msgstr "No se ha definido ningún atributo de productos para traducir"
930
+
931
+ msgid "Select the attribute to translate: "
932
+ msgstr "Seleccionar el atributo para traducir:"
933
+
934
+ msgid "Please make a backup of your database before you start the synchronization"
935
+ msgstr "Realice una copia de seguridad de la base de datos antes de comenzar la sincronización"
936
+
937
+ msgid "Sync variables products"
938
+ msgstr "Sincronizar productos de variables"
939
+
940
+ msgid "Update products count:"
941
+ msgstr "Actualizar conteo de productos:"
942
+
943
+ msgid "products with variations"
944
+ msgstr "productos con variaciones"
945
+
946
+ msgid "Sync products variations:"
947
+ msgstr "Sincronizar variaciones de productos:"
948
+
949
+ msgid "left"
950
+ msgstr "queda"
951
+
952
+ msgid "Sync products \"gallery images\":"
953
+ msgstr "Sincronizar las \"imágenes de galería\" de los productos:"
954
+
955
+ msgid "Sync products categories (display type, thumbnail):"
956
+ msgstr "Sincronizar categorías de productos (mostrar tipo, miniatura):"
957
+
958
+ msgid "Duplicate terms ( please select attribute ):"
959
+ msgstr "Duplicar términos ( seleccionar atributo ):"
960
+
961
+ msgid "none"
962
+ msgstr "no hay"
963
+
964
+ msgid "Enable/disable"
965
+ msgstr "Activar/desactivar"
966
+
967
+ msgid "Currencies"
968
+ msgstr "Monedas"
969
+
970
+ msgid "Add currency"
971
+ msgstr "Agregar moneda"
972
+
973
+ msgid "Currency"
974
+ msgstr "Moneda"
975
+
976
+ msgid "Rate"
977
+ msgstr "Calificar"
978
+
979
+ msgid "default"
980
+ msgstr "predeterminado"
981
+
982
+ msgid "Default currency"
983
+ msgstr "Moneda predeterminada"
984
+
985
+ msgid "Switch to this currency when switching language in the front-end"
986
+ msgstr "Cambiar a esta moneda al cambiar el idioma en la interfaz del usuario"
987
+
988
+ msgid "Keep"
989
+ msgstr "Mantener"
990
+
991
+ msgid "Delete"
992
+ msgstr "Eliminar"
993
+
994
+ msgid " (%s)"
995
+ msgstr "(%s)"
996
+
997
+ msgid "The multi-currency mode cannot be enabled as a specific currency was not set. Go to the %sWooCommerce settings%s page and select the default currency for your store."
998
+ msgstr "No se puede activar el modo Varias monedas porque no se ha establecido una moneda específica. Vaya a la página %sConfiguración de WooCommerce%s y seleccione la moneda predeterminada para su tienda."
999
+
1000
+ msgid "Learn more"
1001
+ msgstr "Más información"
1002
+
1003
+ msgid "Show only products with custom prices in secondary currencies"
1004
+ msgstr "Mostrar solo productos con precios especiales en monedas secundarias"
1005
+
1006
+ msgid "When this option is on, when you switch to a secondary currency on the front end, only the products with custom prices in that currency are being displayed. Products with prices determined based on the exchange rate are hidden."
1007
+ msgstr "Cuando esta opción esté activada y se cambie a una moneda secundaria en la interfaz del usuario, solo se mostrarán los productos con precios especiales en esa moneda. Los productos que tengan precios determinados según la tasa de cambio permanecerán ocultos."
1008
+
1009
+ msgid "The changes you made will be lost if you navigate away from this page."
1010
+ msgstr "Si sale de esta página, se perderán los cambios que haya realizado."
1011
+
1012
+ msgid "At least one currency must be enabled for this language!"
1013
+ msgstr "Debe haber por lo menos una moneda habilitada para este idioma."
1014
+
1015
+ msgid "Currency switcher options"
1016
+ msgstr "Opciones de selector de moneda"
1017
+
1018
+ msgid "Currency switcher style"
1019
+ msgstr "Estilo del selector de moneda"
1020
+
1021
+ msgid "Currency order"
1022
+ msgstr "Orden de moneda"
1023
+
1024
+ msgid "Available parameters"
1025
+ msgstr "Parámetros disponibles"
1026
+
1027
+ msgid "Template for currency switcher"
1028
+ msgstr "Plantilla para selector de moneda"
1029
+
1030
+ msgid "Visibility"
1031
+ msgstr "Visibilidad"
1032
+
1033
+ msgid "Currency switcher preview"
1034
+ msgstr "Vista previa del selector de moneda"
1035
+
1036
+ msgid "Drop-down menu"
1037
+ msgstr "Menú desplegable"
1038
+
1039
+ msgid "List of currencies"
1040
+ msgstr "Lista de monedas"
1041
+
1042
+ msgid "Vertical"
1043
+ msgstr "Vertical"
1044
+
1045
+ msgid "Horizontal"
1046
+ msgstr "Horizontal"
1047
+
1048
+ msgid "Drag the currencies to change their order"
1049
+ msgstr "Arrastre las monedas para cambiar el orden"
1050
+
1051
+ msgid "%name%, %symbol%, %code%"
1052
+ msgstr "%name%, %symbol%, %code%"
1053
+
1054
+ msgid "Default: %name% (%symbol%) - %code%"
1055
+ msgstr "Predeterminado: %name% (%symbol%) - %code%"
1056
+
1057
+ msgid "Show a currency selector on the product page template"
1058
+ msgstr "Mostrar un selector de moneda en la plantilla de la página del producto."
1059
+
1060
+ msgid "To configure how the %sWooCommerce products%s are translated, visit the WooCommerce Multiligual %ssettings%s page."
1061
+ msgstr "Para configurar la manera en que se traducen los %sproductos de WooCommerce%s visite la página de %sconfiguración%s de WooCommerce Multiligual."
1062
+
1063
+ msgid "Title"
1064
+ msgstr "Título"
1065
+
1066
+ msgid "Slug"
1067
+ msgstr "Slug"
1068
+
1069
+ msgid "Content / Description"
1070
+ msgstr "Contenido / Decripción"
1071
+
1072
+ msgid "Excerpt"
1073
+ msgstr "Extracto"
1074
+
1075
+ msgid "Purchase note"
1076
+ msgstr "Orden de compra"
1077
+
1078
+ msgid "Images"
1079
+ msgstr "Imágenes"
1080
+
1081
+ msgid "Custom Product attributes"
1082
+ msgstr "Atributos de productos personalizados"
1083
+
1084
+ msgid "Name"
1085
+ msgstr "Nombre"
1086
+
1087
+ msgid "Value(s)"
1088
+ msgstr "Valores"
1089
+
1090
+ msgid "Custom Fields"
1091
+ msgstr "Campos personalizados"
1092
+
1093
+ msgid "Variations data"
1094
+ msgstr "Datos de variaciones"
1095
+
1096
+ msgid "Download Files for Variation #%s"
1097
+ msgstr "Descargar archivos para la variación #%s"
1098
+
1099
+ msgid "Download Files"
1100
+ msgstr "Descargar archivos"
1101
+
1102
+ msgid "File URL"
1103
+ msgstr "URL de archivo"
1104
+
1105
+ msgid "Content, title, and excerpt are empty."
1106
+ msgstr "El contenido, título y extracto están vacíos."
1107
+
1108
+ msgid "Search %s"
1109
+ msgstr "Buscar %s"
1110
+
1111
+ msgid "All %s"
1112
+ msgstr "Todo %s"
1113
+
1114
+ msgid "Parent %s"
1115
+ msgstr "%s superior"
1116
+
1117
+ msgid "Parent %s:"
1118
+ msgstr "%s superior:"
1119
+
1120
+ msgid "Edit %s"
1121
+ msgstr "Editar %s"
1122
+
1123
+ msgid "Update %s"
1124
+ msgstr "Actualizar %s"
1125
+
1126
+ msgid "Add New %s"
1127
+ msgstr "Agregar nuevo %s"
1128
+
1129
+ msgid "New %s"
1130
+ msgstr "Nuevo %s"
1131
+
1132
+ msgid "To translate Add-ons strings please save Add-ons and go to the <b><a href=\"%s\">String Translation interface</a></b>"
1133
+ msgstr "Para traducir cadenas de complementos, guarde los complementos y vaya a la <b><a href=\"%s\">interfaz de Traducción de cadenas</a></b>"
1134
+
1135
+ msgid "Product Add-ons Group \"%s\""
1136
+ msgstr "Grupo de complementos de productos \"%s\""
1137
+
1138
+ msgid "Description"
1139
+ msgstr "Descripción"
1140
+
1141
+ msgid "Options"
1142
+ msgstr "Opciones"
1143
+
1144
+ msgid "Label"
1145
+ msgstr "Etiqueta"
1146
+
1147
+ msgid "To translate Extra Options strings please save %s and go to the <b><a href=\"%s\">String Translation interface</a></b>"
1148
+ msgstr "Para traducir cadenas de Opciones extras, guarde %s y vaya a la <b><a href=\"%s\">interfaz de Traducción de cadenas</a></b>"
1149
+
1150
+ msgid "Language"
1151
+ msgstr "Idioma"
1152
+
1153
+ msgid "Translation of"
1154
+ msgstr "Traducción de"
1155
+
1156
+ msgid "Subscription Price"
1157
+ msgstr "Precio de suscripción"
1158
+
1159
+ msgid "Sign-up Fee"
1160
+ msgstr "Tarifa de registro"
1161
+
1162
+ msgid "Calculate costs in other currencies automatically"
1163
+ msgstr "Calcular los costos en otras monedas de forma automática"
1164
+
1165
+ msgid "Set costs in other currencies manually"
1166
+ msgstr "Definir los costos en otras monedas de forma manual"
1167
+
1168
+ msgid "This is the cost per block booked. All other costs (for resources and persons) are added to this."
1169
+ msgstr "Este es el costo por bloque reservado. Todos los demás costos (por recursos y personas) se suman a este."
1170
+
1171
+ msgid "Product tabs"
1172
+ msgstr "Pestañas de producto"
1173
+
1174
+ msgid "Heading"
1175
+ msgstr "Encabezado"
1176
+
1177
+ msgid "Tour Data"
1178
+ msgstr "Datos del recorrido"
1179
+
1180
+ msgid "Content"
1181
+ msgstr "Contenido"
1182
+
1183
+ msgid "Composite Products"
1184
+ msgstr "Productos combinados"
1185
+
1186
+ msgid "Product Bundles"
1187
+ msgstr "Paquetes de productos"
1188
+
1189
+ msgid "One-off cost for the booking as a whole."
1190
+ msgstr "Este es el costo único por la reserva en su totalidad."
1191
+
1192
+ msgid "The cost is displayed to the user on the frontend. Leave blank to have it calculated for you. If a booking has varying costs, this will be prefixed with the word \"from:\"."
1193
+ msgstr "El costo se muestra en el frontend para el usuario. Déjelo en blanco para que se calcule automáticamente. Si una reserva tiene distintos costos, aparecerá como prefijo la palabra \"desde:\"."
1194
+
1195
+ msgid "Bookings"
1196
+ msgstr "Reservas"
1197
+
1198
+ msgid "Resources Label"
1199
+ msgstr "Etiqueta de recursos"
1200
+
1201
+ msgid "Resources"
1202
+ msgstr "Recursos"
1203
+
1204
+ msgid "Person Types"
1205
+ msgstr "Tipos de personas"
1206
+
1207
+ msgid "Person Type Name"
1208
+ msgstr "Nombre de tipo de persona"
1209
+
1210
+ msgid "Resources label"
1211
+ msgstr "Etiqueta de recursos"
1212
+
1213
+ msgid "Booking currency"
1214
+ msgstr "Moneda de reserva"
locale/woocommerce-multilingual-fr_FR.mo CHANGED
Binary file
locale/woocommerce-multilingual-fr_FR.po ADDED
@@ -0,0 +1,1214 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # This file was generated by WPML
2
+ # WPML is a WordPress plugin that can turn any WordPress site into a full featured multilingual content management system.
3
+ # https://wpml.org
4
+ msgid ""
5
+ msgstr "Content-Type: text/plain; charset=utf-8\nContent-Transfer-Encoding: 8bit\nProject-Id-Version:WPML_EXPORT\nPOT-Creation-Date: \nPO-Revision-Date: \nLast-Translator: \nLanguage-Team: \nLanguage:en\nMIME-Version: 1.0\n"
6
+
7
+ msgid "Introduction"
8
+ msgstr "Introduction"
9
+
10
+ msgid "Store Pages"
11
+ msgstr "Stocker des pages"
12
+
13
+ msgid "Global Attributes"
14
+ msgstr "Attributs globaux"
15
+
16
+ msgid "Multiple Currencies"
17
+ msgstr "Devises multiples"
18
+
19
+ msgid "Translation Interface"
20
+ msgstr "Interface de traduction"
21
+
22
+ msgid "Ready!"
23
+ msgstr "Prêt !"
24
+
25
+ msgid "Welcome to %sWooCommerce Multilingual!%s Please take a moment to configure the main settings and then you are ready to start translating your products."
26
+ msgstr ""
27
+
28
+ msgid "Action failed. Please refresh the page and retry."
29
+ msgstr "L'action a échoué. Veuillez rafraîchir la page et réessayer."
30
+
31
+ msgid "Cheatin&#8217; huh?"
32
+ msgstr "Alors, on triche ?"
33
+
34
+ msgid "Run the Setup Wizard"
35
+ msgstr "Lancer l'Assistant installation"
36
+
37
+ msgid "Skip Setup"
38
+ msgstr "Passer l'installation"
39
+
40
+ msgid "WooCommerce Multilingual &rsaquo; Setup Wizard"
41
+ msgstr "WooCommerce Multilingual &rsaquo; Assistant installation"
42
+
43
+ msgid "WooCommerce Multilingual"
44
+ msgstr "WooCommerce Multilingual"
45
+
46
+ msgid "How to translate products"
47
+ msgstr "Comment traduire les produits"
48
+
49
+ msgid "Quick edit is disabled for product translations. It's recommended to use the %s for editing products translations. %s"
50
+ msgstr "La modification rapide est désactivée pour les traductions de produit. Il est recommandé d'utiliser le %s pour modifier les traductions de produit. %s"
51
+
52
+ msgid "WooCommerce Multilingual products editor"
53
+ msgstr "Éditeur de produits WooCommerce Multilingual"
54
+
55
+ msgid "Edit this product translation"
56
+ msgstr "Modifier la traduction de ce produit"
57
+
58
+ msgid "How to translate attributes"
59
+ msgstr "Comment traduire les attributs"
60
+
61
+ msgid "How to translate product categories"
62
+ msgstr "Comment traduire les catégories de produit"
63
+
64
+ msgid "The recommended way to translate WooCommerce products is using the\n %sWooCommerce Multilingual products translation%s page.\n Please use this page only for translating elements that are not available in the WooCommerce Multilingual products translation table."
65
+ msgstr ""
66
+
67
+ msgid "In order to edit custom attributes you need to use the <a href=\"%s\">custom product translation editor</a>"
68
+ msgstr "Pour modifier les attributs personnalisés, vous devez utiliser l'<a href=\"%s\">éditeur de traduction de produit personnalisé</a>"
69
+
70
+ msgid "You are using the same value as for the regular category base. This is known to create conflicts resulting in urls not working properly."
71
+ msgstr "Vous utilisez la même valeur que pour la base de catégorie habituelle. Cela crée souvent des conflits et il en résulte des adresses url qui ne fonctionnent pas correctement."
72
+
73
+ msgid "translations"
74
+ msgstr "traductions"
75
+
76
+ msgid "product"
77
+ msgstr "produit"
78
+
79
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">WPML</a> versions prior %s."
80
+ msgstr "WooCommerce Multilingual est activé, mais pas fonctionnel. Il n'est pas compatible avec les versions <a href=\"%s\">WPML</a> antérieures à %s."
81
+
82
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">Woocommerce</a> versions prior %s."
83
+ msgstr "WooCommerce Multilingual est activé mais n'est pas fonctionnel. Il n'est pas compatible avec les versions <a href=\"%s\">Woocommerce</a> précédentes à %s."
84
+
85
+ msgid "You are using WooCommerce Multilingual %s. This version includes an important UI redesign for the configuration screens and it requires <a href=\"%s\">WPML %s</a> or higher. Everything still works on the front end now but, in order to configure options for WooCommerce Multilingual, you need to upgrade WPML."
86
+ msgstr "Vous utilisez WooCommerce Multilingual %s. Cette version inclut une reconception UI importante pour les écrans de configuration et requiert <a href=\"%s\">WPML %s</a> ou une version supérieure. Tout fonctionne toujours en amont, mais pour configurer les options de WooCommerce Multilingual, vous devez passer à WPML."
87
+
88
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">WPML Translation Management</a> versions prior %s."
89
+ msgstr "WooCommerce Multilingual est activé, mais pas fonctionnel. Il n'est pas compatible avec les versions <a href=\"%s\">Gestion de traduction WPML</a> antérieures à %s."
90
+
91
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">WPML String Translation</a> versions prior %s."
92
+ msgstr "WooCommerce Multilingual est activé, mais pas fonctionnel. Il n'est pas compatible avec les versions <a href=\"%s\">Traduction de chaîne WPML</a> antérieures à %s."
93
+
94
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">WPML Media</a> versions prior %s."
95
+ msgstr "WooCommerce Multilingual est activé, mais pas fonctionnel. Il n'est pas compatible avec les versions <a href=\"%s\">Médias WPML</a> antérieures à %s."
96
+
97
+ msgid "and"
98
+ msgstr "et"
99
+
100
+ msgid "WooCommerce Multilingual is enabled but not effective. It requires %s in order to work."
101
+ msgstr "WooCommerce Multilingual est activé mais n'est pas effectif. Il requiert %s pour fonctionner."
102
+
103
+ msgid "Permalink settings"
104
+ msgstr "Paramètres permaliens"
105
+
106
+ msgid "Configure products slug translation"
107
+ msgstr "Configurer la traduction slug de produits"
108
+
109
+ msgid "If you want different slugs for shop pages (%s/%s), you need to disable the shop prefix for products in <a href=\"%s\">WooCommerce Settings</a>"
110
+ msgstr "Si vous souhaitez des slugs différents pour les pages boutique (%s/%s), vous devez désactiver le préfixe boutique pour les produits dans <a href=\"%s\">Paramètres WooCommerce</a>"
111
+
112
+ msgid "Finished! You can visit the %sstrings translation%s screen to translate the strings now."
113
+ msgstr "Terminé ! Vous pouvez maintenant visiter l'écran %straduction de chaînes%s pour traduire les chaînes."
114
+
115
+ msgid "wpml-config.xml file missing from WooCommerce Multilingual folder."
116
+ msgstr "Il manque le fichier wpml-config.xml au dossier WooCommerce Multilingual."
117
+
118
+ msgid "Custom field %s configuration from wpml-config.xml file was altered!"
119
+ msgstr "La configuration du champ personnalisé %s a été modifiée à partir du fichier wpml-config.xml !"
120
+
121
+ msgid "Custom type %s configuration from wpml-config.xml file was altered!"
122
+ msgstr "La configuration de type personnalisé %s a été modifiée à partir du fichier wpml-config.xml !"
123
+
124
+ msgid "Custom taxonomy %s configuration from wpml-config.xml file was altered!"
125
+ msgstr "La configuration de taxonomie personnalisée %s a été modifiée à partir du fichier wpml-config.xml !"
126
+
127
+ msgid "Upgrade WPML"
128
+ msgstr "Passer à la version WPML supérieure"
129
+
130
+ msgid "Invalid language parameter: %s"
131
+ msgstr "Paramètre de langue non valide : %s"
132
+
133
+ msgid "Source product id not found: %s"
134
+ msgstr "ID du produit source introuvable : %s"
135
+
136
+ msgid "Product Base"
137
+ msgstr "Base du produit"
138
+
139
+ msgid "Product Tag Base"
140
+ msgstr "Base de balise du produit"
141
+
142
+ msgid "Product Category Base"
143
+ msgstr "Base de catégorie du produit"
144
+
145
+ msgid "Product Attribute Base"
146
+ msgstr "Base d'attribut du produit"
147
+
148
+ msgid "Endpoint: %s"
149
+ msgstr "Point de terminaison : %s"
150
+
151
+ msgid "product-category"
152
+ msgstr "catégorie de produit"
153
+
154
+ msgid "product-tag"
155
+ msgstr "balise de produit"
156
+
157
+ msgid "Original language"
158
+ msgstr "Langue originale"
159
+
160
+ msgid "Take this and edit"
161
+ msgstr "Prenez ceci et modifier"
162
+
163
+ msgid "Add translation"
164
+ msgstr "Ajouter une traduction"
165
+
166
+ msgid "Update translation"
167
+ msgstr "Mise à jour de la traduction"
168
+
169
+ msgid "Finish translating"
170
+ msgstr "Finir la traduction"
171
+
172
+ msgid "Edit translation"
173
+ msgstr "Modifier la traduction"
174
+
175
+ msgid "Edit this item inline"
176
+ msgstr "Modifier cet élément intraligne"
177
+
178
+ msgid "Quick Edit"
179
+ msgstr "Modification rapide"
180
+
181
+ msgid "Translation in progress"
182
+ msgstr "Traduction en cours de réalisation"
183
+
184
+ msgid "Invalid nonce"
185
+ msgstr "Actuellement non valide"
186
+
187
+ msgid "Currency - no orders found"
188
+ msgstr "Devise - aucun tri trouvé"
189
+
190
+ msgid "Currencies order updated"
191
+ msgstr "Tri des devises mis à jour"
192
+
193
+ msgid "Currency switcher"
194
+ msgstr "Sélecteur de devise"
195
+
196
+ msgid "Configure options"
197
+ msgstr "Configurer les options"
198
+
199
+ msgid "Settings saved!"
200
+ msgstr "Paramètres sauvegardés !"
201
+
202
+ msgid "Add new currency"
203
+ msgstr "Ajouter une nouvelle devise"
204
+
205
+ msgid "Update currency"
206
+ msgstr "Mettre à jour la devise"
207
+
208
+ msgid "Update settings for %s"
209
+ msgstr "Mettre à jour les paramètres pour %s"
210
+
211
+ msgid "The default currency was changed. In order to show accurate prices in all currencies, you need to update the exchange rates under the %sMulti-currency%s configuration."
212
+ msgstr "La devise par défaut a été changée. Afin d'afficher les prix exacts dans toutes les devises, vous devez mettre à jour les taux de change dans la configuration %sMultidevise%s."
213
+
214
+ msgid "All the products will be removed from the current order in order to change the currency"
215
+ msgstr "Tous les produits seront supprimés du tri actuel afin de modifier la devise"
216
+
217
+ msgid "Show all currencies"
218
+ msgstr "Afficher toutes les devises"
219
+
220
+ msgid "Order currency:"
221
+ msgstr "Tri des devises :"
222
+
223
+ msgid "Cart"
224
+ msgstr "Panier"
225
+
226
+ msgid "Checkout"
227
+ msgstr "Validation"
228
+
229
+ msgid "Checkout &rarr; Pay"
230
+ msgstr "Validation &rarr; Paiement"
231
+
232
+ msgid "Order Received"
233
+ msgstr "Commande reçue"
234
+
235
+ msgid "My Account"
236
+ msgstr "Mon compte"
237
+
238
+ msgid "Change Password"
239
+ msgstr "Modifier le mot de passe"
240
+
241
+ msgid "Edit My Address"
242
+ msgstr "Modifier mon adresse"
243
+
244
+ msgid "Logout"
245
+ msgstr "Déconnexion"
246
+
247
+ msgid "Lost Password"
248
+ msgstr "Mot de passe perdu"
249
+
250
+ msgid "View Order"
251
+ msgstr "Visualiser la commande"
252
+
253
+ msgid "Shop"
254
+ msgstr "Boutique"
255
+
256
+ msgid "All the products will be removed from the current order in order to change the language"
257
+ msgstr "Tous les produits seront supprimés du tri actuel afin de modifier la langue"
258
+
259
+ msgid "Order language:"
260
+ msgstr "Tri des langues :"
261
+
262
+ msgid "Choose a file"
263
+ msgstr "Choisir un fichier"
264
+
265
+ msgid "At least one of these fields is required: title, content or excerpt"
266
+ msgstr "Au moins l'un de ces champs est requis : titre, contenu ou extrait"
267
+
268
+ msgid "This translation job will no longer be assigned to you. Other translators will be able take it and continue the translation."
269
+ msgstr "Ce travail de traduction ne vous sera plus attribué. D'autres traducteurs pourront postuler et poursuivre la traduction."
270
+
271
+ msgid "This field is locked for editing because WPML will copy its value from the original language."
272
+ msgstr "Ce champ est verrouillé pour modification car WPML copiera sa valeur à partir de la langue d'origine."
273
+
274
+ msgid "This is a translation of %s. Some of the fields are not editable. It's recommended to use the %s for translating products."
275
+ msgstr "C'est une traduction de %s. Certains champs ne sont pas modifiables. Il est recommandé d'utiliser le %s pour les produits de traduction."
276
+
277
+ msgid "WooCommerce Multilingual products translator"
278
+ msgstr "Traducteur de produits WooCommerce Multilingual"
279
+
280
+ msgid "Looks like you are upgrading from a previous version of WooCommerce Multilingual. Would you like to automatically create translated variations and images?"
281
+ msgstr "Il semble que vous mettiez à niveau à partir d'une version antérieure à WooCommerce Multilingual. Souhaitez-vous créer automatiquement des variations et des images traduites ?"
282
+
283
+ msgid "Yes, go to the troubleshooting page"
284
+ msgstr "Oui, aller à la page de dépannage"
285
+
286
+ msgid "No - dismiss"
287
+ msgstr "Non - rejeter"
288
+
289
+ msgid "You've successfully installed %sWooCommerce Multilingual%s. Would you like to see a quick overview?"
290
+ msgstr "Vous avez installé %sWooCommerce Multilingual%s avec succès. Souhaitez-vous avoir un bref aperçu ?"
291
+
292
+ msgid "Learn how to turn your e-commerce site multilingual"
293
+ msgstr "Apprenez comment transformer votre site e-commerce multilingue"
294
+
295
+ msgid "Dismiss"
296
+ msgstr "Rejeter"
297
+
298
+ msgid "To translate %s please use the %s translation%s page, inside the %sWooCommerce Multilingual admin%s."
299
+ msgstr "Pour traduire %s, veuillez utiliser la page de traduction%s %s, à l'intérieur de l'%s %sadmin. WooCommerce Multilingual."
300
+
301
+ msgid "%s do not require translation."
302
+ msgstr "%s ne requièrent pas de traduction."
303
+
304
+ msgid "Include to translation"
305
+ msgstr "Inclure à la traduction"
306
+
307
+ msgid "%d %s are missing translations."
308
+ msgstr "Les traductions manquent pour %d %s."
309
+
310
+ msgid "Translate %s"
311
+ msgstr "Traduire %s"
312
+
313
+ msgid "Exclude from translation"
314
+ msgstr "Exclure de la traduction"
315
+
316
+ msgid "All %s are translated."
317
+ msgstr "Tou(te)s les %s sont traduit(e)s."
318
+
319
+ msgid "Currently, there are %s variations that need to be created."
320
+ msgstr "%s variations doivent actuellement être créées."
321
+
322
+ msgid "%d products left"
323
+ msgstr "Il reste %d produits"
324
+
325
+ msgid "Synchronization complete!"
326
+ msgstr "Synchronisation terminée !"
327
+
328
+ msgid "Invalid taxonomy %s"
329
+ msgstr "Taxonomie non valide : %s"
330
+
331
+ msgid "Some translated %s have different %s assignments."
332
+ msgstr "Certains %s traduit(e)s ont des %s d'affectation différentes."
333
+
334
+ msgid "Update %s for all translated %s"
335
+ msgstr "Mettre à jour la/le %s pour tous les %s traduit(e)s"
336
+
337
+ msgid "All %s have the same %s assignments."
338
+ msgstr "Tou(te)s les %s ont les mêmes affectations de %s."
339
+
340
+ msgid "Successfully updated %s for all translated %s."
341
+ msgstr "%s mis(e) à jour avec succès pour tou(te)s les %s."
342
+
343
+ msgid "Synchronize attributes and update product variations"
344
+ msgstr "Synchroniser les attributs et mettre à jour les variations de produit"
345
+
346
+ msgid "Image"
347
+ msgstr "Image"
348
+
349
+ msgid "Product"
350
+ msgstr "Produit"
351
+
352
+ msgid "Type"
353
+ msgstr "Type"
354
+
355
+ msgid "Date"
356
+ msgstr "Date"
357
+
358
+ msgid "Categories"
359
+ msgstr "Catégories"
360
+
361
+ msgid "No products found"
362
+ msgstr "Aucun produit trouvé"
363
+
364
+ msgid "Draft"
365
+ msgstr "Brouillon"
366
+
367
+ msgid "Private"
368
+ msgstr "Privé"
369
+
370
+ msgid "Pending"
371
+ msgstr ""
372
+
373
+ msgid "Scheduled"
374
+ msgstr "Prévu"
375
+
376
+ msgid "Parent product: %s"
377
+ msgstr "Produit parent : %s"
378
+
379
+ msgid "Edit this item"
380
+ msgstr "Modifier cet élément"
381
+
382
+ msgid "Edit"
383
+ msgstr "Modifier"
384
+
385
+ msgid "View \"%s\""
386
+ msgstr "Visualiser \"%s\""
387
+
388
+ msgid "View"
389
+ msgstr "Visualiser"
390
+
391
+ msgid "Published"
392
+ msgstr "Publié"
393
+
394
+ msgid "Last Modified"
395
+ msgstr "Dernière modification"
396
+
397
+ msgid "All languages"
398
+ msgstr "Toutes les langues"
399
+
400
+ msgid "All categories"
401
+ msgstr "Toutes les catégories"
402
+
403
+ msgid "All translation statuses"
404
+ msgstr "Tous les statuts de traduction"
405
+
406
+ msgid "Not translated or needs updating"
407
+ msgstr "Non traduit ou nécessite une mise à jour"
408
+
409
+ msgid "Needs updating"
410
+ msgstr "Requiert une mise à jour"
411
+
412
+ msgid "Translation complete"
413
+ msgstr "Traduction terminée"
414
+
415
+ msgid "All statuses"
416
+ msgstr "Tous les statuts"
417
+
418
+ msgid "Filter"
419
+ msgstr "Filtre"
420
+
421
+ msgid "Reset"
422
+ msgstr "Réinitialiser"
423
+
424
+ msgid "Search"
425
+ msgstr "Recherche"
426
+
427
+ msgid "%d items"
428
+ msgstr "%d éléments"
429
+
430
+ msgid "Go to the first page"
431
+ msgstr "Allez à la première page"
432
+
433
+ msgid "Go to the previous page"
434
+ msgstr "Revenez à la page précédente"
435
+
436
+ msgid "Select Page"
437
+ msgstr "Sélectionner la page"
438
+
439
+ msgid "Current page"
440
+ msgstr "Page actuelle"
441
+
442
+ msgid "of"
443
+ msgstr "de"
444
+
445
+ msgid "Go to the next page"
446
+ msgstr "Allez à la page suivante"
447
+
448
+ msgid "Go to the last page"
449
+ msgstr "Allez à la dernière page"
450
+
451
+ msgid "Translatable?"
452
+ msgstr "Traduisible ?"
453
+
454
+ msgid "Enable this if you want to translate attribute values with Woocommerce Multilingual"
455
+ msgstr "Activer ceci si vous souhaitez traduire des valeurs attributs avec Woocommerce Multilingual"
456
+
457
+ msgid "Existing translations and variations associated will be deleted."
458
+ msgstr "Les traductions existantes et les variations associées seront supprimées."
459
+
460
+ msgid "Product Translation Interface"
461
+ msgstr "Interface de traduction de produit"
462
+
463
+ msgid "The recommended way is using the WPML Translation Editor. It is streamlined for making the translation process much easier while also providing a much better integration with various WooCommerce extensions."
464
+ msgstr "Il est recommandé d'utiliser l'éditeur de traduction WPML. Il est rationalisé pour faciliter le processus de traduction tout en offrant une bien meilleure intégration à diverses extensions WooCommerce."
465
+
466
+ msgid "WPML Translation Editor"
467
+ msgstr "Éditeur de traduction WPML"
468
+
469
+ msgid "Native WooCommerce product editing screen"
470
+ msgstr "Écran de traitement de produit WooCommerce natif"
471
+
472
+ msgid "Products synchronization"
473
+ msgstr "Synchronisation des produits"
474
+
475
+ msgid "Configure specific product properties that should be synced to translations."
476
+ msgstr "Configurer les propriétés du produit spécifique devant être synchronisées avec les traductions."
477
+
478
+ msgid "Sync publishing date for translated products."
479
+ msgstr "Synchroniser la date de publication pour les produits traduits"
480
+
481
+ msgid "Sync products and product taxonomies order."
482
+ msgstr "Tri des produits de synchro. et des taxonomies de produit."
483
+
484
+ msgid "Products Download Files"
485
+ msgstr "Fichiers de téléchargement de produits"
486
+
487
+ msgid "If you are using downloadable products, you can choose to have their paths\n synchronized, or seperate for each language."
488
+ msgstr "Si vous utilisez des produits téléchargeables, vous pouvez choisir d'avoir leurs chemins\n synchronisés ou séparer pour chaque langue."
489
+
490
+ msgid "Use the same files for translations"
491
+ msgstr "Utiliser les mêmes fichiers pour les traductions"
492
+
493
+ msgid "Add separate download files for translations"
494
+ msgstr "Ajouter des fichiers de téléchargement séparés pour les traductions"
495
+
496
+ msgid "Save changes"
497
+ msgstr "Sauvegarder les modifications"
498
+
499
+ msgid "Troubleshooting page"
500
+ msgstr "Page de dépannage"
501
+
502
+ msgid "Update Translation"
503
+ msgstr "Mettre à jour la traduction"
504
+
505
+ msgid "Hide This Message"
506
+ msgstr "Masquer ce message"
507
+
508
+ msgid "<strong>WooCommerce Translation Available</strong> &#8211; Install or update your <code>%s</code> translations to version <code>%s</code>."
509
+ msgstr "<strong>Traduction WooCommerce disponible</strong> &#8211; Installez ou mettez à jour vos traductions <code>%s</code> vers la version <code>%s</code>."
510
+
511
+ msgid "This will automatically generate variations for translated products corresponding to recently translated attributes."
512
+ msgstr "Ceci génèrera automatiquement des variations pour les produits traduits correspondant aux attributs récemment traduits."
513
+
514
+ msgid "Synchronize %s assignment in content"
515
+ msgstr "Synchroniser l'affectation de la/du %s dans le contenu"
516
+
517
+ msgid "This action lets you automatically apply the %s taxonomy to your content in different languages. It will scan the original content and apply the same taxonomy to translated content."
518
+ msgstr "Cette action vous permet d'appliquer automatiquement la taxonomie %s à votre contenu dans différentes langues. Le contenu original sera alors numérisé et la même taxonomie sera appliquée au contenu traduit."
519
+
520
+ msgid "You have untranslated terms!"
521
+ msgstr "Il reste des termes non traduits !"
522
+
523
+ msgid "Select currency"
524
+ msgstr "Sélectionner la devise"
525
+
526
+ msgid "Exchange Rate"
527
+ msgstr "Taux de change"
528
+
529
+ msgid "Only numeric"
530
+ msgstr "Numérique uniquement"
531
+
532
+ msgid "Set on %s"
533
+ msgstr "Définir sur %s"
534
+
535
+ msgid "Currency Preview"
536
+ msgstr "Aperçu des devises"
537
+
538
+ msgid "Currency Position"
539
+ msgstr "Place de la devise"
540
+
541
+ msgid "Left"
542
+ msgstr "Gauche"
543
+
544
+ msgid "Right"
545
+ msgstr "Droite"
546
+
547
+ msgid "Left with space"
548
+ msgstr "À gauche avec espace"
549
+
550
+ msgid "Right with space"
551
+ msgstr "À droite avec espace"
552
+
553
+ msgid "Thousand Separator"
554
+ msgstr "Séparateur de millier"
555
+
556
+ msgid "Decimal Separator"
557
+ msgstr "Séparateur de décimale"
558
+
559
+ msgid "Number of Decimals"
560
+ msgstr "Nombre de décimales"
561
+
562
+ msgid "Rounding to the nearest integer"
563
+ msgstr "Arrondi au prochain nombre entier"
564
+
565
+ msgid "Disabled"
566
+ msgstr "Désactivé"
567
+
568
+ msgid "Up"
569
+ msgstr "En haut"
570
+
571
+ msgid "Down"
572
+ msgstr "En bas"
573
+
574
+ msgid "Nearest"
575
+ msgstr "Le plus proche"
576
+
577
+ msgid "Increment for nearest integer"
578
+ msgstr "Incrémenter pour le prochain nombre entier"
579
+
580
+ msgid "Autosubtract amount"
581
+ msgstr "Montant auto-soustrait"
582
+
583
+ msgid "Cancel"
584
+ msgstr "Annuler"
585
+
586
+ msgid "Save"
587
+ msgstr "Appliquer"
588
+
589
+ msgid "Products"
590
+ msgstr "Produits"
591
+
592
+ msgid "Tags"
593
+ msgstr "Mots-Clés"
594
+
595
+ msgid "Attributes"
596
+ msgstr "Attributs"
597
+
598
+ msgid "Shipping Classes"
599
+ msgstr "Classes d'expédition"
600
+
601
+ msgid "Settings"
602
+ msgstr "Paramètres"
603
+
604
+ msgid "Multi-currency"
605
+ msgstr "Multidevise"
606
+
607
+ msgid "Store URLs"
608
+ msgstr "Stocker les URL"
609
+
610
+ msgid "Status"
611
+ msgstr "Statut"
612
+
613
+ msgid "Troubleshooting"
614
+ msgstr "Dépannage"
615
+
616
+ msgid "Thank you for using %sWooCommerce Multilingual%s! You can express your love and\n support by %s rating our plugin and saying that %sit works%s for you."
617
+ msgstr "Merci d'utiliser %sWooCommerce Multilingual%s ! Vous pouvez exprimer votre appréciation et\n votre soutien en évaluant %s notre module d'extension et expliquer comment %sil fonctionne%s pour vous."
618
+
619
+ msgid "Hide"
620
+ msgstr "Masquer"
621
+
622
+ msgid "Loading ..."
623
+ msgstr "Chargement en cours..."
624
+
625
+ msgid "Regular Price"
626
+ msgstr "Prix normal"
627
+
628
+ msgid "Sale Price"
629
+ msgstr "Prix de vente"
630
+
631
+ msgid "Multi-currency is enabled but no secondary currencies have been set. %sAdd secondary currencies%s."
632
+ msgstr ""
633
+
634
+ msgid "Calculate prices in other currencies automatically"
635
+ msgstr "Calculer les prix automatiquement dans d'autres devises"
636
+
637
+ msgid "Click to see the prices in the other currencies as they are currently shown on the front end."
638
+ msgstr "Cliquez pour afficher les prix dans les autres devises tels qu'ils apparaissent actuellement en amont."
639
+
640
+ msgid "Show"
641
+ msgstr "Afficher"
642
+
643
+ msgid "Set prices in other currencies manually"
644
+ msgstr "Définir les prix manuellement dans d'autres devises"
645
+
646
+ msgid "Enter prices in other currencies"
647
+ msgstr "Entrer les prix dans d'autres devises"
648
+
649
+ msgid "Hide prices in other currencies"
650
+ msgstr "Masquer les prix dans d'autres devises"
651
+
652
+ msgid "Determined automatically based on exchange rate"
653
+ msgstr "Automatiquement déterminé sur base du taux de change"
654
+
655
+ msgid "Schedule"
656
+ msgstr "Agenda"
657
+
658
+ msgid "Same as default currency"
659
+ msgstr "Identique à la devise par défaut"
660
+
661
+ msgid "Set dates"
662
+ msgstr "Définir les dates"
663
+
664
+ msgid "Collapse"
665
+ msgstr "Réduire"
666
+
667
+ msgid "From&hellip;"
668
+ msgstr "De&hellip;"
669
+
670
+ msgid "To&hellip;"
671
+ msgstr "À&hellip;"
672
+
673
+ msgid "Please enter in a value less than the regular price"
674
+ msgstr "Veuillez entrer une valeur inférieure au prix standard"
675
+
676
+ msgid "Required plugins"
677
+ msgstr "Modules d'extension requis"
678
+
679
+ msgid "Plugins Status"
680
+ msgstr "Statut des modules d'extension"
681
+
682
+ msgid "WooCommerce Multilingual depends on several plugins to work. If any required plugin is missing, you should install and activate it."
683
+ msgstr "WooCommerce Multilingual requiert plusieurs modules d'extension pour fonctionner. Si un module d'extension requis manque, installez-le et activez-le."
684
+
685
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">WPML</a> versions prior 2.0.5."
686
+ msgstr "WooCommerce Multilingual est activé mais pas effectif. Il n'est pas compatible avec les versions <a href=\"%s\">WPML</a> antérieures à 2.0.5."
687
+
688
+ msgid "Update WPML"
689
+ msgstr "Mettre à jour WPML"
690
+
691
+ msgid "Get WPML"
692
+ msgstr "Obtenir WPML"
693
+
694
+ msgid "Get WPML Media"
695
+ msgstr "Obtenir WPML Media"
696
+
697
+ msgid "Get WPML Translation Management"
698
+ msgstr "Obtenir la Gestion de traduction WPML"
699
+
700
+ msgid "Get WPML String Translation"
701
+ msgstr "Obtenir la Traduction de chaîne WPML"
702
+
703
+ msgid "%s is installed and active."
704
+ msgstr "%s est installé et actif."
705
+
706
+ msgid "%s is set up."
707
+ msgstr "%s est défini."
708
+
709
+ msgid "%s is not set up."
710
+ msgstr "%s n'est pas défini."
711
+
712
+ msgid "%s is either not installed or not active."
713
+ msgstr "%s n'est ni installé ni activé."
714
+
715
+ msgid "%1$s is installed, but with incorrect version. You need %1$s %2$s or higher. "
716
+ msgstr "%1$s est installé, mais dans une version incorrecte. Une version %1$s %2$s ou supérieure est requise."
717
+
718
+ msgid "Download WooCommerce"
719
+ msgstr "Télécharger WooCommerce"
720
+
721
+ msgid "The WordPress Multilingual Plugin"
722
+ msgstr "Le module d'extension WordPress Multilingue"
723
+
724
+ msgid "This page allows you to translate all strings that are being used by WooCommerce in building different type of urls. Translating them enables you to have fully localized urls that match the language of the pages."
725
+ msgstr "Cette page vous permet de traduire toutes les chaînes qui sont utilisées par WooCommerce en construisant différents types d'url. Les traduire vous permet de localiser entièrement les url qui associent la langue des pages."
726
+
727
+ msgid "You can enter or edit your default values on the %sPermalinks settings%s page or, for the endpoints, on the WooCommerce %sAccount settings%s page."
728
+ msgstr "Vous pouvez saisir ou modifier vos valeurs par défaut sur la page des %sParamètres permaliens%s ou, pour les points de terminaison, sur la page WooCommerce des %sParamètres du compte%s."
729
+
730
+ msgid "permalinks settings"
731
+ msgstr "paramètres des permaliens"
732
+
733
+ msgid "Account settings"
734
+ msgstr "Paramètres du compte"
735
+
736
+ msgid "Slug type"
737
+ msgstr "Type de slug"
738
+
739
+ msgid "Original Slug"
740
+ msgstr "Slug original"
741
+
742
+ msgid "Shop page"
743
+ msgstr "Page de la boutique"
744
+
745
+ msgid "Product base"
746
+ msgstr "Base du produit"
747
+
748
+ msgid "Product category base"
749
+ msgstr "Base de catégorie du produit"
750
+
751
+ msgid "Product tag base"
752
+ msgstr "Base de balise du produit"
753
+
754
+ msgid "Product attribute base"
755
+ msgstr "Base d'attribut du produit"
756
+
757
+ msgid "Original"
758
+ msgstr "Original"
759
+
760
+ msgid "Translation to"
761
+ msgstr "Traduction en"
762
+
763
+ msgid "Product Shop Base"
764
+ msgstr "Base de la boutique de produit"
765
+
766
+ msgid "Welcome to WooCommerce Multilingual!"
767
+ msgstr "Bienvenue chez WooCommerce Multilingual !"
768
+
769
+ msgid "Configure the multilingual support for your e-commerce site in just a couple of minutes."
770
+ msgstr ""
771
+
772
+ msgid "By default, the products are translatable just like product categories, product tags and attributes. So you can start translating these right away."
773
+ msgstr "Les produits sont traduisibles par défaut tout comme les catégories de produit, les balises de produit et les attributs. Vous pouvez ainsi commencer immédiatement à les traduire."
774
+
775
+ msgid "You can configure, however, which attributes you want to translate, install the translated shop pages or enable the multi-currency mode."
776
+ msgstr "Vous pouvez cependant configurer les attributs que vous souhaitez traduire, installer les pages boutique traduites ou activer le mode multidevise."
777
+
778
+ msgid "Start"
779
+ msgstr "Démarrer"
780
+
781
+ msgid "No, thanks. I'll do it later."
782
+ msgstr "Non merci. Je le ferai plus tard."
783
+
784
+ msgid "Select translatable attributes"
785
+ msgstr "Sélectionner les attributs traduisibles"
786
+
787
+ msgid "There are no attributes defined"
788
+ msgstr "Aucun attribut n'est défini"
789
+
790
+ msgid "Continue"
791
+ msgstr "Poursuivre"
792
+
793
+ msgid "Later"
794
+ msgstr "Plus tard "
795
+
796
+ msgid "One or more WooCommerce pages have not been created"
797
+ msgstr "Une ou plusieurs pages WooCommerce n'ont pas été créées"
798
+
799
+ msgid "Install missing WooCommerce pages and create translations."
800
+ msgstr "Installer les pages WooCommerce manquantes et créer des traductions."
801
+
802
+ msgid "Translate Store Pages"
803
+ msgstr "Traduire les pages de la boutique"
804
+
805
+ msgid "All store pages must be translated in the languages configured on the site."
806
+ msgstr "Toutes les pages stockées doivent être traduites dans les langues configurées sur le site."
807
+
808
+ msgid "Select the translation interface"
809
+ msgstr "Sélectionner l'interface de traduction"
810
+
811
+ msgid "Enable multiple currencies"
812
+ msgstr "Activer plusieurs devises"
813
+
814
+ msgid "This will allow you to set prices for products in different currencies. The prices can be determined based on a given exchange rate or set explicitly for specific products."
815
+ msgstr "Ceci vous permettra de fixer les prix des produits dans différentes devises. Les prix peuvent être déterminés sur base d'un taux de change donné ou fixés explicitement pour des produits déterminés."
816
+
817
+ msgid "Enable the multi-currency mode"
818
+ msgstr "Activer le mode multidevise"
819
+
820
+ msgid "Further actions that are necessary for making your existing content multilingual, are listed below."
821
+ msgstr "Les autres actions nécessaires à rendre votre contenu multilingue existant sont listées ci-dessous."
822
+
823
+ msgid "Start translating products"
824
+ msgstr "Démarrer la traduction des produits"
825
+
826
+ msgid "Add secondary currencies on the %smulti-currency configuration%s page"
827
+ msgstr "Ajouter des devises secondaires sur la page de %sconfiguration multidevise%s"
828
+
829
+ msgid "Translate existing terms for these %sproduct attributes%s: %s"
830
+ msgstr "Traduire les termes existants pour ces %sattributs de produit%s : %s"
831
+
832
+ msgid "Translate existing %sproduct categories%s"
833
+ msgstr "Traduire les %scatégories de produit%s existantes"
834
+
835
+ msgid "Translate existing %sproduct tags%s"
836
+ msgstr "Traduire les %sbalises de produit%s existantes"
837
+
838
+ msgid "%sAdd missing translations%s for shipping classes"
839
+ msgstr "%sAjouter les traductions manquantes%s pour les catégories d'expédition."
840
+
841
+ msgid "Translate %sURL slugs%s to create multilingual store and product urls"
842
+ msgstr "Traduire les %sslugs URL%s pour créer un stockage multilingue et des url de produit"
843
+
844
+ msgid "Use custom settings for translations download files"
845
+ msgstr ""
846
+
847
+ msgid "WooCommerce Store Pages"
848
+ msgstr "Pages du magasin WooCommerce"
849
+
850
+ msgid "To run a multilingual e-commerce site, you need to have the WooCommerce shop pages translated to all the site's languages. Once all the pages are installed you can add the translations for them from this menu."
851
+ msgstr "Pour pouvoir exécuter un site e-commerce multilingue, les pages de la boutique WooCommerce doivent être traduites dans toutes les langues du site. Une fois toutes les pages installées, vous pouvez ajouter leurs traductions à partir de ce menu."
852
+
853
+ msgid "One or more WooCommerce pages have not been created."
854
+ msgstr "Une ou plusieurs pages WooCommerce n'ont pas été créées."
855
+
856
+ msgid "Install WooCommerce Pages"
857
+ msgstr "Installer les pages WooCommerce"
858
+
859
+ msgid "WooCommerce store pages do not exist for these languages:"
860
+ msgstr "Les pages de la boutique WooCommerce n'existent pas dans ces langues :"
861
+
862
+ msgid "Create missing translations"
863
+ msgstr "Créer les traductions manquantes"
864
+
865
+ msgid "These pages are currently being translated by translators via WPML: "
866
+ msgstr "Ces pages sont en cours de traduction par les traduteurs via WPML :"
867
+
868
+ msgid "WooCommerce store pages are translated to all the site's languages."
869
+ msgstr "Les pages du magasin WooCommerce sont traduites dans toutes les langues du site :"
870
+
871
+ msgid "Configuration warnings"
872
+ msgstr "Avertissements de configuration"
873
+
874
+ msgid "Reporting miscelaneous configuration issues that can make WooCommerce Multilingual not run normally"
875
+ msgstr "Signalement de divers problèmes de configuration pouvant empêcher WooCommerce Multilingual de ne pas fonctionner normalement"
876
+
877
+ msgid "Your product permalink base is not translated to:"
878
+ msgstr "Votre produit de base permalien n'est pas traduit en :"
879
+
880
+ msgid "Translate URLs"
881
+ msgstr "Traduire les URL"
882
+
883
+ msgid "Your site's default language is not English and the strings language is also not English."
884
+ msgstr "La langue par défaut de votre site n'est pas l'anglais et la langue des chaînes n'est pas non plus l'anglais."
885
+
886
+ msgid "Running WooCommerce multilingual with default language other than English."
887
+ msgstr "Exécuter WooCommerce multilingual avec une langue par défaut autre que l'anglais."
888
+
889
+ msgid "This may cause problems with URLs in different languages."
890
+ msgstr "Cela peut causer des problèmes avec des URL dans différentes langues."
891
+
892
+ msgid "Change default language"
893
+ msgstr "Modifier la langue par défaut"
894
+
895
+ msgid "Your site's default language is not English."
896
+ msgstr "La langue par défaut de votre site n'est pas l'anglais."
897
+
898
+ msgid "There are some settings that require careful attention."
899
+ msgstr "Certains paramètres nécessitent une attention particulière."
900
+
901
+ msgid "Some settings from the WooCommerce Multilingual wpml-config.xml file have been overwritten."
902
+ msgstr "Certains paramètres du fichier wpml-config.xml WooCommerce Multilingual ont été écrasés."
903
+
904
+ msgid "You should check WPML configuration files added by other plugins or manual settings on the %s section."
905
+ msgstr "Il est recommandé de vérifier les fichiers de configuration WPML ajoutés par d'autres modules d'extension ou des paramètres manuels sur la section %s."
906
+
907
+ msgid "Multilingual Content Setup"
908
+ msgstr "Configuration du contenu multilingue"
909
+
910
+ msgid "Taxonomies missing translations"
911
+ msgstr "Traductions manquantes de taxonomie"
912
+
913
+ msgid "To run a fully translated site, you should translate all taxonomy terms. Some store elements, such as variations, depend on taxonomy translation."
914
+ msgstr "Pour lancer un site entièrement traduit, il faut traduire tous les éléments de taxonomie. Certains éléments de magasin tels que les variations, dépendent de la traduction de taxonomie."
915
+
916
+ msgid "This taxonomy requires translation."
917
+ msgstr "Cette taxonomie requiert une traduction."
918
+
919
+ msgid "Include in translation"
920
+ msgstr "Inclure dans la traduction"
921
+
922
+ msgid "This taxonomy does not require translation."
923
+ msgstr "Cette taxonomie ne requiert pas de traduction."
924
+
925
+ msgid "Right now, there are no taxonomy terms needing translation."
926
+ msgstr "Actuellement, aucun élément de taxonomie ne requiert de traduction."
927
+
928
+ msgid "There are no translatable product attributes defined"
929
+ msgstr "Aucun attribut de produit traduisible n'est défini"
930
+
931
+ msgid "Select the attribute to translate: "
932
+ msgstr "Sélectionner l'attribut à traduire : "
933
+
934
+ msgid "Please make a backup of your database before you start the synchronization"
935
+ msgstr "Veuillez sauvegarder votre base de données avant de démarrer la synchronisation"
936
+
937
+ msgid "Sync variables products"
938
+ msgstr "Produits de synchronisation variables"
939
+
940
+ msgid "Update products count:"
941
+ msgstr "Mettre à jour le total des produits :"
942
+
943
+ msgid "products with variations"
944
+ msgstr "produits avec variations"
945
+
946
+ msgid "Sync products variations:"
947
+ msgstr "Synchroniser les variations de produit :"
948
+
949
+ msgid "left"
950
+ msgstr "restant"
951
+
952
+ msgid "Sync products \"gallery images\":"
953
+ msgstr "Synchroniser la \"galerie d'images\" de produits :"
954
+
955
+ msgid "Sync products categories (display type, thumbnail):"
956
+ msgstr "Catégories de produits synchro. (type d'affichage, miniature) :"
957
+
958
+ msgid "Duplicate terms ( please select attribute ):"
959
+ msgstr "Dupliquer les termes (veuillez sélectionner l'attribut) :"
960
+
961
+ msgid "none"
962
+ msgstr "aucun"
963
+
964
+ msgid "Enable/disable"
965
+ msgstr "Activer/Désactiver"
966
+
967
+ msgid "Currencies"
968
+ msgstr "Devises"
969
+
970
+ msgid "Add currency"
971
+ msgstr "Ajouter une devise"
972
+
973
+ msgid "Currency"
974
+ msgstr "Devise"
975
+
976
+ msgid "Rate"
977
+ msgstr "Taux"
978
+
979
+ msgid "default"
980
+ msgstr "par défaut"
981
+
982
+ msgid "Default currency"
983
+ msgstr "Devise par défaut"
984
+
985
+ msgid "Switch to this currency when switching language in the front-end"
986
+ msgstr "Basculer vers cette devise lorsque vous changer de langue en amont"
987
+
988
+ msgid "Keep"
989
+ msgstr "Garder"
990
+
991
+ msgid "Delete"
992
+ msgstr "Supprimer"
993
+
994
+ msgid " (%s)"
995
+ msgstr "(%s)"
996
+
997
+ msgid "The multi-currency mode cannot be enabled as a specific currency was not set. Go to the %sWooCommerce settings%s page and select the default currency for your store."
998
+ msgstr "Le mode multidevise ne peut être activé car aucune devise spécifique car n'a été définie. Allez à la page %sParamètres WooCommerce%s et sélectionnez la devise par défaut pour votre boutique."
999
+
1000
+ msgid "Learn more"
1001
+ msgstr "Pour en savoir plus"
1002
+
1003
+ msgid "Show only products with custom prices in secondary currencies"
1004
+ msgstr "Afficher seulement les produits avec prix personnalisés dans les devises secondaires"
1005
+
1006
+ msgid "When this option is on, when you switch to a secondary currency on the front end, only the products with custom prices in that currency are being displayed. Products with prices determined based on the exchange rate are hidden."
1007
+ msgstr "Quand cette option est activée, si vous passez à une devise secondaire en amont, seuls les produits dotés de prix personnalisés dans cette devise seront affichés. Les produits dont les prix définis sont basés sur le taux de change sont masqués."
1008
+
1009
+ msgid "The changes you made will be lost if you navigate away from this page."
1010
+ msgstr "Les modifications que vous avez effectuées seront perdues si vous quittez cette page."
1011
+
1012
+ msgid "At least one currency must be enabled for this language!"
1013
+ msgstr "Au moins une devise doit être activée pour cette langue !"
1014
+
1015
+ msgid "Currency switcher options"
1016
+ msgstr "Options du sélecteur de devise"
1017
+
1018
+ msgid "Currency switcher style"
1019
+ msgstr "Style du sélecteur de devise"
1020
+
1021
+ msgid "Currency order"
1022
+ msgstr "Tri des devises"
1023
+
1024
+ msgid "Available parameters"
1025
+ msgstr "Paramètres disponibles"
1026
+
1027
+ msgid "Template for currency switcher"
1028
+ msgstr "Modèle pour sélecteur de devise"
1029
+
1030
+ msgid "Visibility"
1031
+ msgstr "Visibilité"
1032
+
1033
+ msgid "Currency switcher preview"
1034
+ msgstr "Aperçu du sélecteur de devise"
1035
+
1036
+ msgid "Drop-down menu"
1037
+ msgstr "Menu déroulant"
1038
+
1039
+ msgid "List of currencies"
1040
+ msgstr "Liste des devises"
1041
+
1042
+ msgid "Vertical"
1043
+ msgstr "Vertical"
1044
+
1045
+ msgid "Horizontal"
1046
+ msgstr "Horizontal"
1047
+
1048
+ msgid "Drag the currencies to change their order"
1049
+ msgstr "Faire glisser les devises pour modifier l'ordre"
1050
+
1051
+ msgid "%name%, %symbol%, %code%"
1052
+ msgstr "%nom%, %symbole%, %code%"
1053
+
1054
+ msgid "Default: %name% (%symbol%) - %code%"
1055
+ msgstr "Par défaut : %nom% (%symbole%) - %code%"
1056
+
1057
+ msgid "Show a currency selector on the product page template"
1058
+ msgstr "Afficher un sélecteur de devise sur le modèle de page de produit"
1059
+
1060
+ msgid "To configure how the %sWooCommerce products%s are translated, visit the WooCommerce Multiligual %ssettings%s page."
1061
+ msgstr "Pour configurer la manière dont les %sproduits WooCommerce%s sont traduits, consultez la page des %sparamètres%s WooCommerce Multiligual."
1062
+
1063
+ msgid "Title"
1064
+ msgstr "Titre"
1065
+
1066
+ msgid "Slug"
1067
+ msgstr "Slug"
1068
+
1069
+ msgid "Content / Description"
1070
+ msgstr "Contenu / Description"
1071
+
1072
+ msgid "Excerpt"
1073
+ msgstr "Extrait"
1074
+
1075
+ msgid "Purchase note"
1076
+ msgstr "Note d'achat"
1077
+
1078
+ msgid "Images"
1079
+ msgstr "Images"
1080
+
1081
+ msgid "Custom Product attributes"
1082
+ msgstr "Attributs de produit personnalisé"
1083
+
1084
+ msgid "Name"
1085
+ msgstr "Intitulé"
1086
+
1087
+ msgid "Value(s)"
1088
+ msgstr "Valeur(s)"
1089
+
1090
+ msgid "Custom Fields"
1091
+ msgstr "Champs personnalisés"
1092
+
1093
+ msgid "Variations data"
1094
+ msgstr "Données de variantes"
1095
+
1096
+ msgid "Download Files for Variation #%s"
1097
+ msgstr "Télécharger les fichiers pour la variation #%s"
1098
+
1099
+ msgid "Download Files"
1100
+ msgstr "Télécharger les fichiers"
1101
+
1102
+ msgid "File URL"
1103
+ msgstr "Fichier URL"
1104
+
1105
+ msgid "Content, title, and excerpt are empty."
1106
+ msgstr "Le contenu, le titre et l'extrait sont vides."
1107
+
1108
+ msgid "Search %s"
1109
+ msgstr "Rechercher dans %s"
1110
+
1111
+ msgid "All %s"
1112
+ msgstr "Tous(tes) les %s"
1113
+
1114
+ msgid "Parent %s"
1115
+ msgstr "Parent %s"
1116
+
1117
+ msgid "Parent %s:"
1118
+ msgstr "Parent %s :"
1119
+
1120
+ msgid "Edit %s"
1121
+ msgstr "Modifier %s"
1122
+
1123
+ msgid "Update %s"
1124
+ msgstr "Mettre à jour %s"
1125
+
1126
+ msgid "Add New %s"
1127
+ msgstr "Ajouter un(e) nouveau(elle) %s"
1128
+
1129
+ msgid "New %s"
1130
+ msgstr "Nouveau(elle) %s"
1131
+
1132
+ msgid "To translate Add-ons strings please save Add-ons and go to the <b><a href=\"%s\">String Translation interface</a></b>"
1133
+ msgstr "Pour traduire des chaînes de composants additionnels, veuillez sauvegarder les composants additionnels et aller à l'<b><a href=\"%s\">Interface de traduction de chaîne</a></b>"
1134
+
1135
+ msgid "Product Add-ons Group \"%s\""
1136
+ msgstr " Groupe des composants additionnels du produit \"%s\""
1137
+
1138
+ msgid "Description"
1139
+ msgstr "Description"
1140
+
1141
+ msgid "Options"
1142
+ msgstr "Options"
1143
+
1144
+ msgid "Label"
1145
+ msgstr "Étiquette"
1146
+
1147
+ msgid "To translate Extra Options strings please save %s and go to the <b><a href=\"%s\">String Translation interface</a></b>"
1148
+ msgstr "Pour traduire des chaînes d'options supplémentaires, veuillez sauvegarder %s et aller à l'<b><a href=\"%s\">Interface de traduction de chaîne</a></b>"
1149
+
1150
+ msgid "Language"
1151
+ msgstr "Langue"
1152
+
1153
+ msgid "Translation of"
1154
+ msgstr "Traduction de"
1155
+
1156
+ msgid "Subscription Price"
1157
+ msgstr "Prix d'abonnement"
1158
+
1159
+ msgid "Sign-up Fee"
1160
+ msgstr "Frais d'inscription"
1161
+
1162
+ msgid "Calculate costs in other currencies automatically"
1163
+ msgstr "Calculer les coûts automatiquement dans une autre devise"
1164
+
1165
+ msgid "Set costs in other currencies manually"
1166
+ msgstr "Définir les coûts manuellement dans une autre devise"
1167
+
1168
+ msgid "This is the cost per block booked. All other costs (for resources and persons) are added to this."
1169
+ msgstr "Ceci est le coût par bloc réservé. Tous les autres coûts (pour les ressources et les personnes) seront ajoutés au coût de départ."
1170
+
1171
+ msgid "Product tabs"
1172
+ msgstr "Balises du produit"
1173
+
1174
+ msgid "Heading"
1175
+ msgstr "En-tête"
1176
+
1177
+ msgid "Tour Data"
1178
+ msgstr "Données du tour"
1179
+
1180
+ msgid "Content"
1181
+ msgstr "Contenu"
1182
+
1183
+ msgid "Composite Products"
1184
+ msgstr "Produits composites"
1185
+
1186
+ msgid "Product Bundles"
1187
+ msgstr "Regroupements de produits"
1188
+
1189
+ msgid "One-off cost for the booking as a whole."
1190
+ msgstr "Coût ponctuel pour la réservation dans son ensemble"
1191
+
1192
+ msgid "The cost is displayed to the user on the frontend. Leave blank to have it calculated for you. If a booking has varying costs, this will be prefixed with the word \"from:\"."
1193
+ msgstr "Le coût est affiché en amont pour l'utilisateur. Laissez blanc pour que le calcul s'effectue pour vous. Si une réservation présente des coûts variables, ce sera préfixé par les mots \"à partir de :\"."
1194
+
1195
+ msgid "Bookings"
1196
+ msgstr "Réservations"
1197
+
1198
+ msgid "Resources Label"
1199
+ msgstr "Étiquette des ressources"
1200
+
1201
+ msgid "Resources"
1202
+ msgstr "Ressources"
1203
+
1204
+ msgid "Person Types"
1205
+ msgstr "Types de personne"
1206
+
1207
+ msgid "Person Type Name"
1208
+ msgstr "Nom du type de personne"
1209
+
1210
+ msgid "Resources label"
1211
+ msgstr "Étiquette Ressources"
1212
+
1213
+ msgid "Booking currency"
1214
+ msgstr "Devise de réservation"
locale/woocommerce-multilingual-he_IL.po ADDED
@@ -0,0 +1,1214 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # This file was generated by WPML
2
+ # WPML is a WordPress plugin that can turn any WordPress site into a full featured multilingual content management system.
3
+ # https://wpml.org
4
+ msgid ""
5
+ msgstr "Content-Type: text/plain; charset=utf-8\nContent-Transfer-Encoding: 8bit\nProject-Id-Version:WPML_EXPORT\nPOT-Creation-Date: \nPO-Revision-Date: \nLast-Translator: \nLanguage-Team: \nLanguage:en\nMIME-Version: 1.0\n"
6
+
7
+ msgid "Introduction"
8
+ msgstr "מבוא"
9
+
10
+ msgid "Store Pages"
11
+ msgstr "דפי חנות"
12
+
13
+ msgid "Global Attributes"
14
+ msgstr "מאפיינים גלובליים"
15
+
16
+ msgid "Multiple Currencies"
17
+ msgstr "מטבעות מרובים"
18
+
19
+ msgid "Translation Interface"
20
+ msgstr "ממשק תרגום"
21
+
22
+ msgid "Ready!"
23
+ msgstr "מוכן!"
24
+
25
+ msgid "Welcome to %sWooCommerce Multilingual!%s Please take a moment to configure the main settings and then you are ready to start translating your products."
26
+ msgstr ""
27
+
28
+ msgid "Action failed. Please refresh the page and retry."
29
+ msgstr "הפעולה נכשלה. רענן את הדף ונסה שוב."
30
+
31
+ msgid "Cheatin&#8217; huh?"
32
+ msgstr "מרמה, מה?"
33
+
34
+ msgid "Run the Setup Wizard"
35
+ msgstr "הפעל את אשף ההגדרה"
36
+
37
+ msgid "Skip Setup"
38
+ msgstr "דלג על ההגדרה"
39
+
40
+ msgid "WooCommerce Multilingual &rsaquo; Setup Wizard"
41
+ msgstr "WooCommerce Multilingual &rsaquo; אשף התקנה"
42
+
43
+ msgid "WooCommerce Multilingual"
44
+ msgstr "WooCommerce Multilingual"
45
+
46
+ msgid "How to translate products"
47
+ msgstr "כיצד לתרגם מוצרים"
48
+
49
+ msgid "Quick edit is disabled for product translations. It's recommended to use the %s for editing products translations. %s"
50
+ msgstr "עריכה מהירה לא מופעלת עבור תרגומי מוצרים. מומלץ להשתמש ב-%s לעריכת תרגומי מוצרים. %s"
51
+
52
+ msgid "WooCommerce Multilingual products editor"
53
+ msgstr "עורך מוצרים של WooCommerce Multilingual"
54
+
55
+ msgid "Edit this product translation"
56
+ msgstr "ערוך תרגום מוצר זה"
57
+
58
+ msgid "How to translate attributes"
59
+ msgstr "כיצד לתרגם מאפיינים"
60
+
61
+ msgid "How to translate product categories"
62
+ msgstr "כיצד לתרגם קטגוריות מוצרים"
63
+
64
+ msgid "The recommended way to translate WooCommerce products is using the\n %sWooCommerce Multilingual products translation%s page.\n Please use this page only for translating elements that are not available in the WooCommerce Multilingual products translation table."
65
+ msgstr ""
66
+
67
+ msgid "In order to edit custom attributes you need to use the <a href=\"%s\">custom product translation editor</a>"
68
+ msgstr "כדי לערוך מאפיינים מותאמים אישית עליך להשתמש ב<a href=\"%s\">עורך תרגום מוצרים מותאם אישית </a>"
69
+
70
+ msgid "You are using the same value as for the regular category base. This is known to create conflicts resulting in urls not working properly."
71
+ msgstr "אתה משתמש באותו ערך עבור בסיס הקטגוריה הרגיל. דבר זה לגרום להתנגשויות שיובילו לכתובות URL שלא יעבדו כהלכה."
72
+
73
+ msgid "translations"
74
+ msgstr "תרגומים"
75
+
76
+ msgid "product"
77
+ msgstr "מוצר"
78
+
79
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">WPML</a> versions prior %s."
80
+ msgstr "WooCommerce רב-לשנוי מופעל עכשיו אבל אינו עובד. הוא אינו תואם לגרסאות <a href=\"%s\">WPML</a> לפני %s."
81
+
82
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">Woocommerce</a> versions prior %s."
83
+ msgstr "WooCommerce Multilingual מופעל אבל אינו עובד. הוא אינו תואם לגרסאות <a href=\"%s\">Woocommerce</a> לפני %s."
84
+
85
+ msgid "You are using WooCommerce Multilingual %s. This version includes an important UI redesign for the configuration screens and it requires <a href=\"%s\">WPML %s</a> or higher. Everything still works on the front end now but, in order to configure options for WooCommerce Multilingual, you need to upgrade WPML."
86
+ msgstr "אתה משתמש ב-WooCommerce Multilingual %s. גרסה זו כוללת עיצוב מחדש חשוב של ממשק המשתמש עבור מסכי התצורה והוא מחייב <a href=\"%s\">WPML %s</a> ומעלה. הכל עדיין עובד גם בממשק הקצה אבל כדי להגדיר אפשרויות עבור WooCommerce Multilingual, יש צורך לשדרג את WPML."
87
+
88
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">WPML Translation Management</a> versions prior %s."
89
+ msgstr "WooCommerce Multilingual מופעל אבל לא עובד. הוא אינו תואם לגרסאות <a href=\"%s\">WPML ניהול התרגום</a> לפני %s."
90
+
91
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">WPML String Translation</a> versions prior %s."
92
+ msgstr "WooCommerce Multilingual מופעל אבל אינו עובד. הוא אינו תואם לגרסאות <a href=\"%s\">WPML String Translation</a> לפני %s."
93
+
94
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">WPML Media</a> versions prior %s."
95
+ msgstr "WooCommerce Multilingual מופעל אבל אינו עובד. הוא אינו תואם לגרסאות <a href=\"%s\">WPML מדיה</a> לפני %s."
96
+
97
+ msgid "and"
98
+ msgstr "וגם"
99
+
100
+ msgid "WooCommerce Multilingual is enabled but not effective. It requires %s in order to work."
101
+ msgstr "WooCommerce Multilingual מופעל אך לא אפקטיבי. הוא זקוק ל-%s כדי לפעול."
102
+
103
+ msgid "Permalink settings"
104
+ msgstr "הגדרות קישורים ישירים"
105
+
106
+ msgid "Configure products slug translation"
107
+ msgstr "קבע את הגדרות התרגום של שמות המוצרים"
108
+
109
+ msgid "If you want different slugs for shop pages (%s/%s), you need to disable the shop prefix for products in <a href=\"%s\">WooCommerce Settings</a>"
110
+ msgstr "אם אתה רוצה שמות שנוים לדפי חנות (%s/%s), עליך להשבית את קידומת החנות עבור מוצרים ב<a href=\"%s\">הגדרות WooCommerce</a>"
111
+
112
+ msgid "Finished! You can visit the %sstrings translation%s screen to translate the strings now."
113
+ msgstr "סיימנו! עכשיו ניתן לבקר במסך %sתרגום מחרוזות%s כדי לתרגם את המחרוזות."
114
+
115
+ msgid "wpml-config.xml file missing from WooCommerce Multilingual folder."
116
+ msgstr "קובץ wpml-config.xml חסר בתיקייה של WooCommerce Multilingual."
117
+
118
+ msgid "Custom field %s configuration from wpml-config.xml file was altered!"
119
+ msgstr "השדה המותאם אישית %s של התצורה מהקובץ wpml-config.xml עבר שינוי!"
120
+
121
+ msgid "Custom type %s configuration from wpml-config.xml file was altered!"
122
+ msgstr "הסוג המותאם אישית %s מקובץ התצורה wpml-config.xml עבר שינוי!"
123
+
124
+ msgid "Custom taxonomy %s configuration from wpml-config.xml file was altered!"
125
+ msgstr "הטקסונומיה המותאמת אישית %s מקובץ התצורה wpml-config.xml עברה שינוי!"
126
+
127
+ msgid "Upgrade WPML"
128
+ msgstr "שדרג את WPML"
129
+
130
+ msgid "Invalid language parameter: %s"
131
+ msgstr "פרמטר שפה לא חוקי: %s"
132
+
133
+ msgid "Source product id not found: %s"
134
+ msgstr "מזהה מוצר מקור לא נמצא: %s"
135
+
136
+ msgid "Product Base"
137
+ msgstr "בסיס מוצרים"
138
+
139
+ msgid "Product Tag Base"
140
+ msgstr "בסיס תגי מוצרים"
141
+
142
+ msgid "Product Category Base"
143
+ msgstr "בסיס קטגוריות מוצרים"
144
+
145
+ msgid "Product Attribute Base"
146
+ msgstr "בסיס מאפייני מוצרים"
147
+
148
+ msgid "Endpoint: %s"
149
+ msgstr "נקודת סיום: %s"
150
+
151
+ msgid "product-category"
152
+ msgstr "מוצר-קטגוריה"
153
+
154
+ msgid "product-tag"
155
+ msgstr "מוצר-תג"
156
+
157
+ msgid "Original language"
158
+ msgstr "שפה מקורית"
159
+
160
+ msgid "Take this and edit"
161
+ msgstr "קח זאת וערוך"
162
+
163
+ msgid "Add translation"
164
+ msgstr "הוסף תרגום"
165
+
166
+ msgid "Update translation"
167
+ msgstr "עדכן תרגום"
168
+
169
+ msgid "Finish translating"
170
+ msgstr "סיים את התרגום"
171
+
172
+ msgid "Edit translation"
173
+ msgstr "ערוך תרגום"
174
+
175
+ msgid "Edit this item inline"
176
+ msgstr "ערוך פריט מוטבע זה"
177
+
178
+ msgid "Quick Edit"
179
+ msgstr "עריכה מהירה"
180
+
181
+ msgid "Translation in progress"
182
+ msgstr "התרגום מתבצע"
183
+
184
+ msgid "Invalid nonce"
185
+ msgstr "nonce לא חוקי"
186
+
187
+ msgid "Currency - no orders found"
188
+ msgstr "מטבע - לא נמצאו הזמנות"
189
+
190
+ msgid "Currencies order updated"
191
+ msgstr "סדר המטבעות עודכן"
192
+
193
+ msgid "Currency switcher"
194
+ msgstr "מעביר מטבע"
195
+
196
+ msgid "Configure options"
197
+ msgstr "הגדר את תצורת האפשרויות"
198
+
199
+ msgid "Settings saved!"
200
+ msgstr "ההגדרות נשמרו!"
201
+
202
+ msgid "Add new currency"
203
+ msgstr "הוסף מטבע חדש"
204
+
205
+ msgid "Update currency"
206
+ msgstr "עדכן מטבע"
207
+
208
+ msgid "Update settings for %s"
209
+ msgstr "עדכן הגדרות עבור %s"
210
+
211
+ msgid "The default currency was changed. In order to show accurate prices in all currencies, you need to update the exchange rates under the %sMulti-currency%s configuration."
212
+ msgstr "מטבע ברירת המדל שונה על-מנת להציג מחירים מדויקים בכל המטבעות, יש לעדכן את שערי החליפין בתצורה של %sריבוי מטבעות%s."
213
+
214
+ msgid "All the products will be removed from the current order in order to change the currency"
215
+ msgstr "כל המוצרים יוסרו מההזמנה הנוכחית כדי לשנות את המטבע"
216
+
217
+ msgid "Show all currencies"
218
+ msgstr "הצג את כל המטבעות"
219
+
220
+ msgid "Order currency:"
221
+ msgstr "מטבע הזמנה:"
222
+
223
+ msgid "Cart"
224
+ msgstr "עגלה"
225
+
226
+ msgid "Checkout"
227
+ msgstr "קופה"
228
+
229
+ msgid "Checkout &rarr; Pay"
230
+ msgstr "קופה &rarr; שלם"
231
+
232
+ msgid "Order Received"
233
+ msgstr "ההזמנה התקבלה"
234
+
235
+ msgid "My Account"
236
+ msgstr "החשבון שלי"
237
+
238
+ msgid "Change Password"
239
+ msgstr "שנה סיסמה"
240
+
241
+ msgid "Edit My Address"
242
+ msgstr "ערוך את הכתובת שלי"
243
+
244
+ msgid "Logout"
245
+ msgstr "יציאה"
246
+
247
+ msgid "Lost Password"
248
+ msgstr "איבדת את הסיסמה"
249
+
250
+ msgid "View Order"
251
+ msgstr "הצג הזמנה"
252
+
253
+ msgid "Shop"
254
+ msgstr "חנות"
255
+
256
+ msgid "All the products will be removed from the current order in order to change the language"
257
+ msgstr "כל המוצרים יוסרו מההזמנה הנוכחית כדי לשנות את השפה"
258
+
259
+ msgid "Order language:"
260
+ msgstr "שפת הזמנה:"
261
+
262
+ msgid "Choose a file"
263
+ msgstr "בחר קובץ"
264
+
265
+ msgid "At least one of these fields is required: title, content or excerpt"
266
+ msgstr "לפחות אחד השדות האלה הכרחי: כותרת, תוכן או מובאה"
267
+
268
+ msgid "This translation job will no longer be assigned to you. Other translators will be able take it and continue the translation."
269
+ msgstr "משימת התרגום כבר לא תהייה מוקציית לך. מתרגמים אחרים יוכלו לקחתת אותה ולהמשיך בתרגום."
270
+
271
+ msgid "This field is locked for editing because WPML will copy its value from the original language."
272
+ msgstr "שדה זה נעול לעריכה מפני ש-WPML יעתיק את ערכו מהשפה המקורית."
273
+
274
+ msgid "This is a translation of %s. Some of the fields are not editable. It's recommended to use the %s for translating products."
275
+ msgstr "זהו תרגום של %s. חלק מהשדות לא ניתנים לעריכה. מומלץ להשתמש ב-%s לתרגום מוצרים."
276
+
277
+ msgid "WooCommerce Multilingual products translator"
278
+ msgstr "מתרגם מוצרים של WooCommerce Multilingual"
279
+
280
+ msgid "Looks like you are upgrading from a previous version of WooCommerce Multilingual. Would you like to automatically create translated variations and images?"
281
+ msgstr "נראה שאתה משדרג מגרסה קודמת של WooCommerce Multilingual. האם תרצה ליצור באופן אוטומטי ואריאציות ותמונות מתורגמות?"
282
+
283
+ msgid "Yes, go to the troubleshooting page"
284
+ msgstr "כן, עבור אל דף פתרון הבעיות"
285
+
286
+ msgid "No - dismiss"
287
+ msgstr "לא - בטל"
288
+
289
+ msgid "You've successfully installed %sWooCommerce Multilingual%s. Would you like to see a quick overview?"
290
+ msgstr "התקנת בהצלחה את %sWooCommerce Multilingual%s. האם תרצה לראות סקירה מהירה?"
291
+
292
+ msgid "Learn how to turn your e-commerce site multilingual"
293
+ msgstr "למד כיצד להפוך את אתר המסחר האלקטרוני שלך לרב-לשוני"
294
+
295
+ msgid "Dismiss"
296
+ msgstr "בטל"
297
+
298
+ msgid "To translate %s please use the %s translation%s page, inside the %sWooCommerce Multilingual admin%s."
299
+ msgstr "כדי לתרגם את %s השתמש בדף %sתרגום%s, בתוך %sהניהול של WooCommerceרב-לשוני%s."
300
+
301
+ msgid "%s do not require translation."
302
+ msgstr "%s לא זקוק לתרגום."
303
+
304
+ msgid "Include to translation"
305
+ msgstr "כלול בתרגום"
306
+
307
+ msgid "%d %s are missing translations."
308
+ msgstr "ל-%d %s חסרים תרגומים."
309
+
310
+ msgid "Translate %s"
311
+ msgstr "תרגם את %s"
312
+
313
+ msgid "Exclude from translation"
314
+ msgstr "אל תכלול בתרגום"
315
+
316
+ msgid "All %s are translated."
317
+ msgstr "כל ה-%s מתורגמים."
318
+
319
+ msgid "Currently, there are %s variations that need to be created."
320
+ msgstr "כרגע יש %s ואריאציות שצריך ליצור."
321
+
322
+ msgid "%d products left"
323
+ msgstr "%d מוצרים נותרו"
324
+
325
+ msgid "Synchronization complete!"
326
+ msgstr "הסנכרון הושלם!"
327
+
328
+ msgid "Invalid taxonomy %s"
329
+ msgstr "טקסטונומיה לא חוקית %s"
330
+
331
+ msgid "Some translated %s have different %s assignments."
332
+ msgstr "לחלק מה-%s המתורגמים יש הקצאות %s שונות."
333
+
334
+ msgid "Update %s for all translated %s"
335
+ msgstr "עדכן את %s עבור כל ה-%s המתורגמים"
336
+
337
+ msgid "All %s have the same %s assignments."
338
+ msgstr "לכל ה-%s יש את אותן ההקצאות של %s ."
339
+
340
+ msgid "Successfully updated %s for all translated %s."
341
+ msgstr "%s עודכן בהצלחה עבור כל ה-%s."
342
+
343
+ msgid "Synchronize attributes and update product variations"
344
+ msgstr "סנכרן מאפיינים ועדכן ואריאציות מוצרים"
345
+
346
+ msgid "Image"
347
+ msgstr "תמונה"
348
+
349
+ msgid "Product"
350
+ msgstr "מוצר"
351
+
352
+ msgid "Type"
353
+ msgstr "סוג"
354
+
355
+ msgid "Date"
356
+ msgstr "תאריך"
357
+
358
+ msgid "Categories"
359
+ msgstr "קטגוריות"
360
+
361
+ msgid "No products found"
362
+ msgstr "לא נמצאו מוצרים"
363
+
364
+ msgid "Draft"
365
+ msgstr "טיוטה"
366
+
367
+ msgid "Private"
368
+ msgstr "פרטי"
369
+
370
+ msgid "Pending"
371
+ msgstr ""
372
+
373
+ msgid "Scheduled"
374
+ msgstr "תוזמן"
375
+
376
+ msgid "Parent product: %s"
377
+ msgstr "מוצר הורה: %s"
378
+
379
+ msgid "Edit this item"
380
+ msgstr "ערוך פריט זה"
381
+
382
+ msgid "Edit"
383
+ msgstr "ערוך"
384
+
385
+ msgid "View \"%s\""
386
+ msgstr "הצג את '%s'"
387
+
388
+ msgid "View"
389
+ msgstr "צפה"
390
+
391
+ msgid "Published"
392
+ msgstr "פורסם"
393
+
394
+ msgid "Last Modified"
395
+ msgstr "שונה לאחרונה"
396
+
397
+ msgid "All languages"
398
+ msgstr "כל השפות"
399
+
400
+ msgid "All categories"
401
+ msgstr "כל הקטגוריות"
402
+
403
+ msgid "All translation statuses"
404
+ msgstr "כל סטטוסי התרגום"
405
+
406
+ msgid "Not translated or needs updating"
407
+ msgstr "לא תורגם או זקוק לעדכון"
408
+
409
+ msgid "Needs updating"
410
+ msgstr "זקוק לעדכון"
411
+
412
+ msgid "Translation complete"
413
+ msgstr "התרגום הושלם"
414
+
415
+ msgid "All statuses"
416
+ msgstr "כל הסטטוסים"
417
+
418
+ msgid "Filter"
419
+ msgstr "מסנן"
420
+
421
+ msgid "Reset"
422
+ msgstr "אפס"
423
+
424
+ msgid "Search"
425
+ msgstr "חפש"
426
+
427
+ msgid "%d items"
428
+ msgstr "%d פריטים"
429
+
430
+ msgid "Go to the first page"
431
+ msgstr "עבור לדף הראשון"
432
+
433
+ msgid "Go to the previous page"
434
+ msgstr "עבור לדף הקודם"
435
+
436
+ msgid "Select Page"
437
+ msgstr "בחר דף"
438
+
439
+ msgid "Current page"
440
+ msgstr "הדף הנוכחי"
441
+
442
+ msgid "of"
443
+ msgstr "מתוך"
444
+
445
+ msgid "Go to the next page"
446
+ msgstr "עבור לדף הבא"
447
+
448
+ msgid "Go to the last page"
449
+ msgstr "עבור לדף האחרון"
450
+
451
+ msgid "Translatable?"
452
+ msgstr "ניתן לתרגום?"
453
+
454
+ msgid "Enable this if you want to translate attribute values with Woocommerce Multilingual"
455
+ msgstr "אפשר זאת אם אתה מעוניין לתרגם ערכי מאפיינים באמצעות Woocommerce Multilingual"
456
+
457
+ msgid "Existing translations and variations associated will be deleted."
458
+ msgstr "תרגומים קיימים ווריאציות משויכות יימחקו."
459
+
460
+ msgid "Product Translation Interface"
461
+ msgstr "ממשק תרגום מוצרים"
462
+
463
+ msgid "The recommended way is using the WPML Translation Editor. It is streamlined for making the translation process much easier while also providing a much better integration with various WooCommerce extensions."
464
+ msgstr "הדרך המומלצת היא באמצעות עורך התרגומים של WPML. הוא מותאם להקלה על תהליך התרגום וגם מספק אינטגרציה הרבה יותר טובה עם הרחבות שונות של WooCommerce."
465
+
466
+ msgid "WPML Translation Editor"
467
+ msgstr "עורך התרגומים של WPML"
468
+
469
+ msgid "Native WooCommerce product editing screen"
470
+ msgstr "מסך מקורי לעריכת מוצרי WooCommerce"
471
+
472
+ msgid "Products synchronization"
473
+ msgstr "סנכרון מוצרים"
474
+
475
+ msgid "Configure specific product properties that should be synced to translations."
476
+ msgstr "הגדר תכונות מוצר ספציפיות שיש לסנכרן לתרגומים"
477
+
478
+ msgid "Sync publishing date for translated products."
479
+ msgstr "סנכרן נתוני פרסום עבור מוצרים מתורגמים."
480
+
481
+ msgid "Sync products and product taxonomies order."
482
+ msgstr "סנכרן מוצרים וטקסונומיות מוצרים מאוחר יותר."
483
+
484
+ msgid "Products Download Files"
485
+ msgstr "קובצי הורדה למוצרים"
486
+
487
+ msgid "If you are using downloadable products, you can choose to have their paths\n synchronized, or seperate for each language."
488
+ msgstr "אם אתה משתמש במוצרים שניתן להורידם, ניתן לסנכרן את הנתיבים\n שלהם או להשירם נפרדים עבור כל שפה."
489
+
490
+ msgid "Use the same files for translations"
491
+ msgstr "השתמש באותם קבצים לתרגומים"
492
+
493
+ msgid "Add separate download files for translations"
494
+ msgstr "הוסף קובצי הורדה נפרדים עבור תרגומים"
495
+
496
+ msgid "Save changes"
497
+ msgstr "שמור שינויים"
498
+
499
+ msgid "Troubleshooting page"
500
+ msgstr "דף פתרון הבעיות"
501
+
502
+ msgid "Update Translation"
503
+ msgstr "עדכן תרגום"
504
+
505
+ msgid "Hide This Message"
506
+ msgstr "הסתר הודעה זו"
507
+
508
+ msgid "<strong>WooCommerce Translation Available</strong> &#8211; Install or update your <code>%s</code> translations to version <code>%s</code>."
509
+ msgstr "<strong>תרגום WooCommerce זמין</strong> &#8211; התקן או עדכן את תרגומי <code>%s</code> לגרסה <code>%s</code>."
510
+
511
+ msgid "This will automatically generate variations for translated products corresponding to recently translated attributes."
512
+ msgstr "פעולה זו תייצר באופן אוטומטי ואריאציות עבור מוצרים מתורגמים המתאימות למאפיינים שתורגמו לאחרונה."
513
+
514
+ msgid "Synchronize %s assignment in content"
515
+ msgstr "סנכרן את ההקצאה %s בתוכן"
516
+
517
+ msgid "This action lets you automatically apply the %s taxonomy to your content in different languages. It will scan the original content and apply the same taxonomy to translated content."
518
+ msgstr "פעולה זו מאפשרת לך להחיל באופן אוטומטי את הטקסונומיה %s על התוכן שלך בשפות שונות. היא תסרוק את התוכן המקורי ותחיל את אותה הטקסונומיה על תוכן מתורגם."
519
+
520
+ msgid "You have untranslated terms!"
521
+ msgstr "יש לך מונחים לא מתורגמים!"
522
+
523
+ msgid "Select currency"
524
+ msgstr "בחר מטבע"
525
+
526
+ msgid "Exchange Rate"
527
+ msgstr "שער חליפין"
528
+
529
+ msgid "Only numeric"
530
+ msgstr "מספרי בלבד"
531
+
532
+ msgid "Set on %s"
533
+ msgstr "מוגדר ב-%s"
534
+
535
+ msgid "Currency Preview"
536
+ msgstr "תצוגה מקדימה של מטבע"
537
+
538
+ msgid "Currency Position"
539
+ msgstr "מיקום מטבע"
540
+
541
+ msgid "Left"
542
+ msgstr "שמאל"
543
+
544
+ msgid "Right"
545
+ msgstr "ימין"
546
+
547
+ msgid "Left with space"
548
+ msgstr "שמאל עם רווח"
549
+
550
+ msgid "Right with space"
551
+ msgstr "ימין עם רווח"
552
+
553
+ msgid "Thousand Separator"
554
+ msgstr "מפריד אלפים"
555
+
556
+ msgid "Decimal Separator"
557
+ msgstr "תו הפרדה עשרוני"
558
+
559
+ msgid "Number of Decimals"
560
+ msgstr "מספר מקומות עשרוניים"
561
+
562
+ msgid "Rounding to the nearest integer"
563
+ msgstr "עיגול למספר השלם הקרוב ביותר"
564
+
565
+ msgid "Disabled"
566
+ msgstr "מושבת"
567
+
568
+ msgid "Up"
569
+ msgstr "למעלה"
570
+
571
+ msgid "Down"
572
+ msgstr "למטה"
573
+
574
+ msgid "Nearest"
575
+ msgstr "הקרוב ביותר"
576
+
577
+ msgid "Increment for nearest integer"
578
+ msgstr "תוספת קבועה למספר השלם הקרוב ביותר"
579
+
580
+ msgid "Autosubtract amount"
581
+ msgstr "חיסור אוטומטי של סכום"
582
+
583
+ msgid "Cancel"
584
+ msgstr "בטל"
585
+
586
+ msgid "Save"
587
+ msgstr "שמור"
588
+
589
+ msgid "Products"
590
+ msgstr "מוצרים"
591
+
592
+ msgid "Tags"
593
+ msgstr "תגים"
594
+
595
+ msgid "Attributes"
596
+ msgstr "מאפיינים"
597
+
598
+ msgid "Shipping Classes"
599
+ msgstr "מחלקות משלוח"
600
+
601
+ msgid "Settings"
602
+ msgstr "הגדרות"
603
+
604
+ msgid "Multi-currency"
605
+ msgstr "ריבוי מטבעות"
606
+
607
+ msgid "Store URLs"
608
+ msgstr "אחסן כתובות URL"
609
+
610
+ msgid "Status"
611
+ msgstr "מצב"
612
+
613
+ msgid "Troubleshooting"
614
+ msgstr "פתרון בעיות"
615
+
616
+ msgid "Thank you for using %sWooCommerce Multilingual%s! You can express your love and\n support by %s rating our plugin and saying that %sit works%s for you."
617
+ msgstr "תודה שהשתמשת ב-%sWooCommerce Multilingual%s! תוכל להביע את אהבתך ותמיכתך\n על-ידי %s דירוג התוסף שלנו ולכתוב שהוא %sעובד%s בשבילך."
618
+
619
+ msgid "Hide"
620
+ msgstr "הסתר"
621
+
622
+ msgid "Loading ..."
623
+ msgstr "טוען..."
624
+
625
+ msgid "Regular Price"
626
+ msgstr "מחיר רגיל"
627
+
628
+ msgid "Sale Price"
629
+ msgstr "מחיר מבצע"
630
+
631
+ msgid "Multi-currency is enabled but no secondary currencies have been set. %sAdd secondary currencies%s."
632
+ msgstr ""
633
+
634
+ msgid "Calculate prices in other currencies automatically"
635
+ msgstr "חשב מחירים במטבעות אחרים באופן אוטומטי"
636
+
637
+ msgid "Click to see the prices in the other currencies as they are currently shown on the front end."
638
+ msgstr "לחץ כדי לראות את המחירים במטבעות האחרים כפי שהם מוצגים כרגע בממשק הקצה."
639
+
640
+ msgid "Show"
641
+ msgstr "הצג"
642
+
643
+ msgid "Set prices in other currencies manually"
644
+ msgstr "הגדר באופן ידני את המחירים במטבעות האחרים"
645
+
646
+ msgid "Enter prices in other currencies"
647
+ msgstr "הזן את המחירים במטבעות האחרים"
648
+
649
+ msgid "Hide prices in other currencies"
650
+ msgstr "הסתר מחירים במטבעות האחרים"
651
+
652
+ msgid "Determined automatically based on exchange rate"
653
+ msgstr "נקבע באופן אוטומטי על-בסיס שער החליפין"
654
+
655
+ msgid "Schedule"
656
+ msgstr "לוח זמנים"
657
+
658
+ msgid "Same as default currency"
659
+ msgstr "כמו מטבע ברירת המחדל"
660
+
661
+ msgid "Set dates"
662
+ msgstr "קבע תאריכים"
663
+
664
+ msgid "Collapse"
665
+ msgstr "כווץ"
666
+
667
+ msgid "From&hellip;"
668
+ msgstr "מאת&hellip;"
669
+
670
+ msgid "To&hellip;"
671
+ msgstr "אל&hellip;"
672
+
673
+ msgid "Please enter in a value less than the regular price"
674
+ msgstr "הזן ערך הנמוך מהמחיר הרגיל"
675
+
676
+ msgid "Required plugins"
677
+ msgstr "תוספים נדרשים"
678
+
679
+ msgid "Plugins Status"
680
+ msgstr "מצב תוספים"
681
+
682
+ msgid "WooCommerce Multilingual depends on several plugins to work. If any required plugin is missing, you should install and activate it."
683
+ msgstr "WooCommerce Multilingual זקוק למספר תוספים כדי לפעול. אם חסר תוסף, עליך להתקין ולהפעיל אותו."
684
+
685
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">WPML</a> versions prior 2.0.5."
686
+ msgstr "WooCommerce Multilingual מופעל אבל לא אפקטיבי. הוא אינו תואם <a href=\"%s\">WPML</a> גרסאות נמוכות מ-2.0.5."
687
+
688
+ msgid "Update WPML"
689
+ msgstr "עדכן את WPML"
690
+
691
+ msgid "Get WPML"
692
+ msgstr "קבל את WPML"
693
+
694
+ msgid "Get WPML Media"
695
+ msgstr "קבל את WPML Media"
696
+
697
+ msgid "Get WPML Translation Management"
698
+ msgstr "קבל את 'ניהול התרגום של WPML'"
699
+
700
+ msgid "Get WPML String Translation"
701
+ msgstr "קבל את WPML String Translation"
702
+
703
+ msgid "%s is installed and active."
704
+ msgstr "%s מותקן ופעיל."
705
+
706
+ msgid "%s is set up."
707
+ msgstr "%s מוגדר."
708
+
709
+ msgid "%s is not set up."
710
+ msgstr "%s לא מוגדר."
711
+
712
+ msgid "%s is either not installed or not active."
713
+ msgstr "%s לא מותקן או לא פעיל."
714
+
715
+ msgid "%1$s is installed, but with incorrect version. You need %1$s %2$s or higher. "
716
+ msgstr "%1$s מותקן, אבל לא בגרסה הנכונה. אתה צריך %1$s %2$s ומעלה."
717
+
718
+ msgid "Download WooCommerce"
719
+ msgstr "הורד את WooCommerce"
720
+
721
+ msgid "The WordPress Multilingual Plugin"
722
+ msgstr "התוסף הרב-לשוני של WordPress"
723
+
724
+ msgid "This page allows you to translate all strings that are being used by WooCommerce in building different type of urls. Translating them enables you to have fully localized urls that match the language of the pages."
725
+ msgstr "דף זה מאפשר תרגום של כל המחרוזות שבהן WooCommerce משתמש לבניית סוגים שונים של כתובות URL. תרגום שלהן מאפשר לך שימוש בכתובות URL בעלות לוקליזתציה מלאה שתואמות לשפת הדפים."
726
+
727
+ msgid "You can enter or edit your default values on the %sPermalinks settings%s page or, for the endpoints, on the WooCommerce %sAccount settings%s page."
728
+ msgstr "ניתן להזין את ערכי ברירת המחדל או לערוך אותם בדף %sהגדרות קישורים קבועים%s או, עבור נקודות הקצה, בדף %sהגדרות חשבון%s של WooCommerce."
729
+
730
+ msgid "permalinks settings"
731
+ msgstr "הגדרות קישורים ישירים"
732
+
733
+ msgid "Account settings"
734
+ msgstr "הגדרות חשבון"
735
+
736
+ msgid "Slug type"
737
+ msgstr "סוג זיהוי"
738
+
739
+ msgid "Original Slug"
740
+ msgstr "זיהוי מקור"
741
+
742
+ msgid "Shop page"
743
+ msgstr "דף חנות"
744
+
745
+ msgid "Product base"
746
+ msgstr "בסיס מוצרים"
747
+
748
+ msgid "Product category base"
749
+ msgstr "בסיס קטגוריות מוצרים"
750
+
751
+ msgid "Product tag base"
752
+ msgstr "בסיס תגי מוצרים"
753
+
754
+ msgid "Product attribute base"
755
+ msgstr "בסיס מאפייני מוצרים"
756
+
757
+ msgid "Original"
758
+ msgstr "מקור"
759
+
760
+ msgid "Translation to"
761
+ msgstr "תרגום ל-"
762
+
763
+ msgid "Product Shop Base"
764
+ msgstr "בסיס חנויות מוצרים"
765
+
766
+ msgid "Welcome to WooCommerce Multilingual!"
767
+ msgstr "ברוך הבא אל WooCommerce Multilingual!"
768
+
769
+ msgid "Configure the multilingual support for your e-commerce site in just a couple of minutes."
770
+ msgstr ""
771
+
772
+ msgid "By default, the products are translatable just like product categories, product tags and attributes. So you can start translating these right away."
773
+ msgstr "כברירת מחדל, ניתן לתרגם מוצרים בדיוק כמו קטגוריות מוצרים, תגי ומאפייני מוצרים. לכן ניתן להתחיל בתרגום של כולם מיד."
774
+
775
+ msgid "You can configure, however, which attributes you want to translate, install the translated shop pages or enable the multi-currency mode."
776
+ msgstr "אולם ניתן להגדיר איזה מאפיינים לתרגם, להתקין את דפי החנות המתורגמים, או להפעיל את מצב ריבוי מטבעות."
777
+
778
+ msgid "Start"
779
+ msgstr "התחל"
780
+
781
+ msgid "No, thanks. I'll do it later."
782
+ msgstr "לא תודה, אעשה זאת מאוחר יותר"
783
+
784
+ msgid "Select translatable attributes"
785
+ msgstr "בחר מאפיינים שניתן לתרגם"
786
+
787
+ msgid "There are no attributes defined"
788
+ msgstr "לא הוגדרו מאפיינים"
789
+
790
+ msgid "Continue"
791
+ msgstr "המשך"
792
+
793
+ msgid "Later"
794
+ msgstr "מאוחר יותר"
795
+
796
+ msgid "One or more WooCommerce pages have not been created"
797
+ msgstr "דף אחד או יותר של WooCommerce לא נוצרו"
798
+
799
+ msgid "Install missing WooCommerce pages and create translations."
800
+ msgstr "התקן דפי WooCommerce חסרים וצור תרגומים."
801
+
802
+ msgid "Translate Store Pages"
803
+ msgstr "תרגם דפי חנות"
804
+
805
+ msgid "All store pages must be translated in the languages configured on the site."
806
+ msgstr "יש לתרגם את כל דפי החנות לשפות המוגדרות באתר."
807
+
808
+ msgid "Select the translation interface"
809
+ msgstr "בחר את ממשק התרגום"
810
+
811
+ msgid "Enable multiple currencies"
812
+ msgstr "הפעל מטבעות מרובים"
813
+
814
+ msgid "This will allow you to set prices for products in different currencies. The prices can be determined based on a given exchange rate or set explicitly for specific products."
815
+ msgstr "כך תוכל להגדיר מחירים למוצרים במטבעות שונים. ניתן לקבוע את המחירים על בסיס שער חליפין נתון או להגדירם מפורש עבור מוצרים מוסימים."
816
+
817
+ msgid "Enable the multi-currency mode"
818
+ msgstr "הפעל מצב ריבוי מטבעות"
819
+
820
+ msgid "Further actions that are necessary for making your existing content multilingual, are listed below."
821
+ msgstr "הפעולות הנוספות הנחוצות להפיכת התוכן הקיים לרב-לשוני מפורטות להלן."
822
+
823
+ msgid "Start translating products"
824
+ msgstr "התחל בתרגום מוצרים"
825
+
826
+ msgid "Add secondary currencies on the %smulti-currency configuration%s page"
827
+ msgstr "הוסף מטבעות משניים בדף %sתצורת ריבוי מטבעות%s"
828
+
829
+ msgid "Translate existing terms for these %sproduct attributes%s: %s"
830
+ msgstr "תרגם מונחים קיימים עבור %sמאפייני מוצרים%s אלה: %s"
831
+
832
+ msgid "Translate existing %sproduct categories%s"
833
+ msgstr "תרגם %sקטגוריות מוצרים%s קיימות"
834
+
835
+ msgid "Translate existing %sproduct tags%s"
836
+ msgstr "תרגם %sתגי מוצרים%s קיימים"
837
+
838
+ msgid "%sAdd missing translations%s for shipping classes"
839
+ msgstr "%sהוסף תרגומים חסרים%s עבור מחלקות משלוח"
840
+
841
+ msgid "Translate %sURL slugs%s to create multilingual store and product urls"
842
+ msgstr "תרגם %sזיהויים של כתובות URL%s כדי ליצור כתובות URL רב-לשוניות עבור חנויות ומוצרים"
843
+
844
+ msgid "Use custom settings for translations download files"
845
+ msgstr ""
846
+
847
+ msgid "WooCommerce Store Pages"
848
+ msgstr "דפי חנות WooCommerce"
849
+
850
+ msgid "To run a multilingual e-commerce site, you need to have the WooCommerce shop pages translated to all the site's languages. Once all the pages are installed you can add the translations for them from this menu."
851
+ msgstr "כדי להפעיל אתר מסחר אלקטרוני רב-לשוני, יש צורך בתרגום דפי החנות של WooCommerce לכל שפות האתר. לאחר התקנה של כל הדפים ניתן להוסיף את התרגומים עבורם מתפריט זה."
852
+
853
+ msgid "One or more WooCommerce pages have not been created."
854
+ msgstr "דף אחד או יותר של WooCommerce לא נוצרו."
855
+
856
+ msgid "Install WooCommerce Pages"
857
+ msgstr "התקן את דפי WooCommerce"
858
+
859
+ msgid "WooCommerce store pages do not exist for these languages:"
860
+ msgstr "לא קיימים דפי חנות WooCommerce עבור השפות הבאות:"
861
+
862
+ msgid "Create missing translations"
863
+ msgstr "צור תרגומים חסרים"
864
+
865
+ msgid "These pages are currently being translated by translators via WPML: "
866
+ msgstr "הדפים האלה מתורגמים כרגע על-ידי מתרגמים דרך WPML:"
867
+
868
+ msgid "WooCommerce store pages are translated to all the site's languages."
869
+ msgstr "דפי חנות WooCommerce מתורגמים לכל שפות האתר"
870
+
871
+ msgid "Configuration warnings"
872
+ msgstr "אזהרות תצורה"
873
+
874
+ msgid "Reporting miscelaneous configuration issues that can make WooCommerce Multilingual not run normally"
875
+ msgstr "דיווח על בעיות תצורה שונות שעלולות לגרום ל-WooCommerce Multilingual לא לרוץ כהלכה"
876
+
877
+ msgid "Your product permalink base is not translated to:"
878
+ msgstr "בסיס הקישורים הישירים של המוצר שלך אינו מתורגם ל:"
879
+
880
+ msgid "Translate URLs"
881
+ msgstr "תרגם כתובות URL"
882
+
883
+ msgid "Your site's default language is not English and the strings language is also not English."
884
+ msgstr "שפת ברירת המחדל של האתר אינה אנגלית ושפת המחרוזות גם אינה אנגלית."
885
+
886
+ msgid "Running WooCommerce multilingual with default language other than English."
887
+ msgstr "הפעלה של WooCommerce Multilingual עם שפת ברירת מחדל שאינה אנגלית."
888
+
889
+ msgid "This may cause problems with URLs in different languages."
890
+ msgstr "עלול לגרום לבעיות עם כתובות URL בשפות שונות."
891
+
892
+ msgid "Change default language"
893
+ msgstr "שנה שפת ברירת מחדל"
894
+
895
+ msgid "Your site's default language is not English."
896
+ msgstr "שפת ברירת המחדל של האתר אינה אנגלית."
897
+
898
+ msgid "There are some settings that require careful attention."
899
+ msgstr "ישנן מספר הגדרות שמחייבות תשומת לב מיוחדת."
900
+
901
+ msgid "Some settings from the WooCommerce Multilingual wpml-config.xml file have been overwritten."
902
+ msgstr "חלק מההגדרות מהקובץ wpml-config.xml של WooCommerce Multilingual הוחלפו."
903
+
904
+ msgid "You should check WPML configuration files added by other plugins or manual settings on the %s section."
905
+ msgstr "יש לבדוק בקובצי התצורה של WPML שנוספו על-ידי תוספים אחרים או הגדרות ידניות במקטע %s."
906
+
907
+ msgid "Multilingual Content Setup"
908
+ msgstr "הגדרת תוכן רב-לשוני"
909
+
910
+ msgid "Taxonomies missing translations"
911
+ msgstr "תרגומים חסרים בטקסונומיות"
912
+
913
+ msgid "To run a fully translated site, you should translate all taxonomy terms. Some store elements, such as variations, depend on taxonomy translation."
914
+ msgstr "כדי להריץ אתר מתורגם לחלוטין, עליך לתרגם את כל מונחי הטקסונומיה. חלק מרכיבי החנות, כגון ואריאציות, תלויים בתרגום הטקסונומיה."
915
+
916
+ msgid "This taxonomy requires translation."
917
+ msgstr "טקסונומיה זו זקוקה לתרגום"
918
+
919
+ msgid "Include in translation"
920
+ msgstr "כלול בתרגום"
921
+
922
+ msgid "This taxonomy does not require translation."
923
+ msgstr "טקסונומיה זו לא זקוקה לתרגום."
924
+
925
+ msgid "Right now, there are no taxonomy terms needing translation."
926
+ msgstr "כרגע אין מונחי טקסונומיה הזקוקים לתרגום."
927
+
928
+ msgid "There are no translatable product attributes defined"
929
+ msgstr "לא הגדרו מאפייני מוצר שניתן לתרגם"
930
+
931
+ msgid "Select the attribute to translate: "
932
+ msgstr "בחר את המאפיין לתרגום:"
933
+
934
+ msgid "Please make a backup of your database before you start the synchronization"
935
+ msgstr "בצע גיבוי של מסד הנתונים שלך לפני התחלת הסנכרון"
936
+
937
+ msgid "Sync variables products"
938
+ msgstr "סנכרן את משתני המוצרים"
939
+
940
+ msgid "Update products count:"
941
+ msgstr "עדכן ספירת מוצרים:"
942
+
943
+ msgid "products with variations"
944
+ msgstr "מוצרים עם ואריאציות"
945
+
946
+ msgid "Sync products variations:"
947
+ msgstr "סנכרן ואריאציות מוצרים:"
948
+
949
+ msgid "left"
950
+ msgstr "נותרו"
951
+
952
+ msgid "Sync products \"gallery images\":"
953
+ msgstr "סנכרן מוצרים 'תמונות גלרייה':"
954
+
955
+ msgid "Sync products categories (display type, thumbnail):"
956
+ msgstr "סנכרן קטגוריות מוצרים (סוד תצוגה, תמונות ממוזערות):"
957
+
958
+ msgid "Duplicate terms ( please select attribute ):"
959
+ msgstr "מונחים כפולים (בחר מאפיין):"
960
+
961
+ msgid "none"
962
+ msgstr "ללא"
963
+
964
+ msgid "Enable/disable"
965
+ msgstr "הפעל/השבת"
966
+
967
+ msgid "Currencies"
968
+ msgstr "מטבעות"
969
+
970
+ msgid "Add currency"
971
+ msgstr "הוסף מטבע"
972
+
973
+ msgid "Currency"
974
+ msgstr "מטבע"
975
+
976
+ msgid "Rate"
977
+ msgstr "שער"
978
+
979
+ msgid "default"
980
+ msgstr "ברירת מחדל"
981
+
982
+ msgid "Default currency"
983
+ msgstr "מטבע ברירת מחדל"
984
+
985
+ msgid "Switch to this currency when switching language in the front-end"
986
+ msgstr "עבור למטבע זה בעת החלפת שפה בממשק הקצה"
987
+
988
+ msgid "Keep"
989
+ msgstr "שמור"
990
+
991
+ msgid "Delete"
992
+ msgstr "מחק"
993
+
994
+ msgid " (%s)"
995
+ msgstr "(%s)"
996
+
997
+ msgid "The multi-currency mode cannot be enabled as a specific currency was not set. Go to the %sWooCommerce settings%s page and select the default currency for your store."
998
+ msgstr "לא ניתן להפעיל מצב ריבוי מטבעות מגיוון שלא הוגדר מטבע ספציפי. עבור אל הדף %sהגדרות WooCommerce%s ובחר את מטבע ברירת המחדל עבור החנות."
999
+
1000
+ msgid "Learn more"
1001
+ msgstr "לפרטים נוספים"
1002
+
1003
+ msgid "Show only products with custom prices in secondary currencies"
1004
+ msgstr "הצג רק מוצרים בעלי מחירים מותאמים אישית במטבעות משניים"
1005
+
1006
+ msgid "When this option is on, when you switch to a secondary currency on the front end, only the products with custom prices in that currency are being displayed. Products with prices determined based on the exchange rate are hidden."
1007
+ msgstr "כאשר אפשרות זו מופעלת, אם תעבור למטבע משני בממשק הקצה, יוצגו רק המוצרים בעלי מחירים מותאמים אישית במטבע זה. מוצרים בעלי מחירים הנקבעים על-בסיס שער החליפין יוסתרו."
1008
+
1009
+ msgid "The changes you made will be lost if you navigate away from this page."
1010
+ msgstr "השינויים שביצעת יאבדו אם תעזוב את הדף."
1011
+
1012
+ msgid "At least one currency must be enabled for this language!"
1013
+ msgstr "יש להפעיל לפחות מטבע אחד עובר שפה זו!"
1014
+
1015
+ msgid "Currency switcher options"
1016
+ msgstr "אפשרויות מעביר המטבעות"
1017
+
1018
+ msgid "Currency switcher style"
1019
+ msgstr "סגנון מעביר המטבע"
1020
+
1021
+ msgid "Currency order"
1022
+ msgstr "סדר המטבעות"
1023
+
1024
+ msgid "Available parameters"
1025
+ msgstr "פרמטרים זמינים"
1026
+
1027
+ msgid "Template for currency switcher"
1028
+ msgstr "תבנית עבור מעביר המטבע"
1029
+
1030
+ msgid "Visibility"
1031
+ msgstr "נראות"
1032
+
1033
+ msgid "Currency switcher preview"
1034
+ msgstr "תצוגה מקימה של מעביר המטבע"
1035
+
1036
+ msgid "Drop-down menu"
1037
+ msgstr "תפריט נפתח"
1038
+
1039
+ msgid "List of currencies"
1040
+ msgstr "רשימת מטבעות"
1041
+
1042
+ msgid "Vertical"
1043
+ msgstr "אנכי"
1044
+
1045
+ msgid "Horizontal"
1046
+ msgstr "אופקי"
1047
+
1048
+ msgid "Drag the currencies to change their order"
1049
+ msgstr "גרור את המטבעות כדי לשנות את סדרן"
1050
+
1051
+ msgid "%name%, %symbol%, %code%"
1052
+ msgstr "%name%, %symbol%, %code%"
1053
+
1054
+ msgid "Default: %name% (%symbol%) - %code%"
1055
+ msgstr "ברירת מחדל: %name% (%symbol%) - %code%"
1056
+
1057
+ msgid "Show a currency selector on the product page template"
1058
+ msgstr "הצג בורר מטבע על תבנית דף המוצר"
1059
+
1060
+ msgid "To configure how the %sWooCommerce products%s are translated, visit the WooCommerce Multiligual %ssettings%s page."
1061
+ msgstr "כדי להגדיר כיצד %sמוצרי WooCommerce%s יתורגמו, בקר בדף %sהגדרות%s WooCommerce Multiligual."
1062
+
1063
+ msgid "Title"
1064
+ msgstr "כותרת"
1065
+
1066
+ msgid "Slug"
1067
+ msgstr "זיהוי"
1068
+
1069
+ msgid "Content / Description"
1070
+ msgstr "תוכן/תיאור"
1071
+
1072
+ msgid "Excerpt"
1073
+ msgstr "מובאה"
1074
+
1075
+ msgid "Purchase note"
1076
+ msgstr "הערת רכישה"
1077
+
1078
+ msgid "Images"
1079
+ msgstr "תמונות"
1080
+
1081
+ msgid "Custom Product attributes"
1082
+ msgstr "מאפייני מוצרים מותאמים אישית"
1083
+
1084
+ msgid "Name"
1085
+ msgstr "שם"
1086
+
1087
+ msgid "Value(s)"
1088
+ msgstr "ערכים"
1089
+
1090
+ msgid "Custom Fields"
1091
+ msgstr "שדות מותאמים אישית"
1092
+
1093
+ msgid "Variations data"
1094
+ msgstr "נתוני וריאציות"
1095
+
1096
+ msgid "Download Files for Variation #%s"
1097
+ msgstr "הורד קבצים עבור וריאציה #%s"
1098
+
1099
+ msgid "Download Files"
1100
+ msgstr "הורד קבצים"
1101
+
1102
+ msgid "File URL"
1103
+ msgstr "כתובת URL של קובץ"
1104
+
1105
+ msgid "Content, title, and excerpt are empty."
1106
+ msgstr "תוכן, כותרת ומובאה ריקים."
1107
+
1108
+ msgid "Search %s"
1109
+ msgstr "חיפוש %s"
1110
+
1111
+ msgid "All %s"
1112
+ msgstr "כל ה-%s"
1113
+
1114
+ msgid "Parent %s"
1115
+ msgstr "הורה %s"
1116
+
1117
+ msgid "Parent %s:"
1118
+ msgstr "הורה %s:"
1119
+
1120
+ msgid "Edit %s"
1121
+ msgstr "ערוך את %s"
1122
+
1123
+ msgid "Update %s"
1124
+ msgstr "עדכן את %s"
1125
+
1126
+ msgid "Add New %s"
1127
+ msgstr "הוסף %s חדש"
1128
+
1129
+ msgid "New %s"
1130
+ msgstr "%s חדש"
1131
+
1132
+ msgid "To translate Add-ons strings please save Add-ons and go to the <b><a href=\"%s\">String Translation interface</a></b>"
1133
+ msgstr "כדי לתרגם מחרוזות של תוספים שמור את התוספים ועבור אל <b><a href=\"%s\">הממשק 'תרגום מחרוזות'</a></b>"
1134
+
1135
+ msgid "Product Add-ons Group \"%s\""
1136
+ msgstr "קבוצת תוספי מוצרים '%s'"
1137
+
1138
+ msgid "Description"
1139
+ msgstr "תיאור"
1140
+
1141
+ msgid "Options"
1142
+ msgstr "אפשרויות"
1143
+
1144
+ msgid "Label"
1145
+ msgstr "תווית"
1146
+
1147
+ msgid "To translate Extra Options strings please save %s and go to the <b><a href=\"%s\">String Translation interface</a></b>"
1148
+ msgstr "כדי לתרגם מחרוזות 'אפשרויות נוספות' שמור את %s ועבור אל <b><a href=\"%s\">הממשק 'תרגום מחרוזות'</a></b>"
1149
+
1150
+ msgid "Language"
1151
+ msgstr "שפה"
1152
+
1153
+ msgid "Translation of"
1154
+ msgstr "תרגום של"
1155
+
1156
+ msgid "Subscription Price"
1157
+ msgstr "מחיר מינוי"
1158
+
1159
+ msgid "Sign-up Fee"
1160
+ msgstr "דמי רישום"
1161
+
1162
+ msgid "Calculate costs in other currencies automatically"
1163
+ msgstr "חישוב עלויות במטבעות אחרים באופן אוטומטי"
1164
+
1165
+ msgid "Set costs in other currencies manually"
1166
+ msgstr "הגדר עלויות במטבעות אחרים באופן ידני"
1167
+
1168
+ msgid "This is the cost per block booked. All other costs (for resources and persons) are added to this."
1169
+ msgstr "זו העלות עבור כל בלוק שמוזמן. כל העלויות האחרות (עבור משאבים ואנשים) יתווספו אליה."
1170
+
1171
+ msgid "Product tabs"
1172
+ msgstr "כרטיסיות מוצר"
1173
+
1174
+ msgid "Heading"
1175
+ msgstr "כותרת"
1176
+
1177
+ msgid "Tour Data"
1178
+ msgstr "נתוני סיור"
1179
+
1180
+ msgid "Content"
1181
+ msgstr "תוכן"
1182
+
1183
+ msgid "Composite Products"
1184
+ msgstr "מוצרים מרוכבים"
1185
+
1186
+ msgid "Product Bundles"
1187
+ msgstr "הגן על חבילות"
1188
+
1189
+ msgid "One-off cost for the booking as a whole."
1190
+ msgstr "עלות חד-פעמית לכלל ההזמנה."
1191
+
1192
+ msgid "The cost is displayed to the user on the frontend. Leave blank to have it calculated for you. If a booking has varying costs, this will be prefixed with the word \"from:\"."
1193
+ msgstr "העלות מוצגת למשתמש בממשק הקצה. השאר ריק כדי שתחושב עבורך. אם יש להזמנה עלויות משתנות, יופיע לפניהן 'מ:'."
1194
+
1195
+ msgid "Bookings"
1196
+ msgstr "הזמנות"
1197
+
1198
+ msgid "Resources Label"
1199
+ msgstr "תווית משאבים"
1200
+
1201
+ msgid "Resources"
1202
+ msgstr "משאבים"
1203
+
1204
+ msgid "Person Types"
1205
+ msgstr "סוגי אנשים"
1206
+
1207
+ msgid "Person Type Name"
1208
+ msgstr "שם סוג אדם"
1209
+
1210
+ msgid "Resources label"
1211
+ msgstr "תווית משאבים"
1212
+
1213
+ msgid "Booking currency"
1214
+ msgstr "מטבע ההזמנה"
locale/woocommerce-multilingual-it_IT.po ADDED
@@ -0,0 +1,1214 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # This file was generated by WPML
2
+ # WPML is a WordPress plugin that can turn any WordPress site into a full featured multilingual content management system.
3
+ # https://wpml.org
4
+ msgid ""
5
+ msgstr "Content-Type: text/plain; charset=utf-8\nContent-Transfer-Encoding: 8bit\nProject-Id-Version:WPML_EXPORT\nPOT-Creation-Date: \nPO-Revision-Date: \nLast-Translator: \nLanguage-Team: \nLanguage:en\nMIME-Version: 1.0\n"
6
+
7
+ msgid "Introduction"
8
+ msgstr "Introduzione"
9
+
10
+ msgid "Store Pages"
11
+ msgstr "Pagine del negozio"
12
+
13
+ msgid "Global Attributes"
14
+ msgstr "Attributi globali"
15
+
16
+ msgid "Multiple Currencies"
17
+ msgstr "Valute multiple"
18
+
19
+ msgid "Translation Interface"
20
+ msgstr "Interfaccia di traduzione"
21
+
22
+ msgid "Ready!"
23
+ msgstr "Pronto!"
24
+
25
+ msgid "Welcome to %sWooCommerce Multilingual!%s Please take a moment to configure the main settings and then you are ready to start translating your products."
26
+ msgstr ""
27
+
28
+ msgid "Action failed. Please refresh the page and retry."
29
+ msgstr "Azione non riuscita. Aggiorna la pagina e riprova."
30
+
31
+ msgid "Cheatin&#8217; huh?"
32
+ msgstr "Azione non autorizzata!"
33
+
34
+ msgid "Run the Setup Wizard"
35
+ msgstr "Esegui l'installazione guidata"
36
+
37
+ msgid "Skip Setup"
38
+ msgstr "Ignora installazione"
39
+
40
+ msgid "WooCommerce Multilingual &rsaquo; Setup Wizard"
41
+ msgstr "WooCommerce Multilingual &rsaquo; Installazione guidata"
42
+
43
+ msgid "WooCommerce Multilingual"
44
+ msgstr "WooCommerce Multilingual"
45
+
46
+ msgid "How to translate products"
47
+ msgstr "Come tradurre i prodotti"
48
+
49
+ msgid "Quick edit is disabled for product translations. It's recommended to use the %s for editing products translations. %s"
50
+ msgstr "La modifica rapida è disabilitata per la traduzione dei prodotti. Per modificare la traduzione dei prodotti, si consiglia l'uso di %s. %s"
51
+
52
+ msgid "WooCommerce Multilingual products editor"
53
+ msgstr "Editor multilingue prodotti WooCommerce"
54
+
55
+ msgid "Edit this product translation"
56
+ msgstr "Modifica la traduzione di questo prodotto"
57
+
58
+ msgid "How to translate attributes"
59
+ msgstr "Come tradurre gli attributi"
60
+
61
+ msgid "How to translate product categories"
62
+ msgstr "Come tradurre le categorie dei prodotti"
63
+
64
+ msgid "The recommended way to translate WooCommerce products is using the\n %sWooCommerce Multilingual products translation%s page.\n Please use this page only for translating elements that are not available in the WooCommerce Multilingual products translation table."
65
+ msgstr ""
66
+
67
+ msgid "In order to edit custom attributes you need to use the <a href=\"%s\">custom product translation editor</a>"
68
+ msgstr "Per modificare gli attributi personalizzati devi usare l'<a href=\"%s\">editor di traduzione personalizzata dei prodotti</a>"
69
+
70
+ msgid "You are using the same value as for the regular category base. This is known to create conflicts resulting in urls not working properly."
71
+ msgstr "Stai utilizzando lo stesso valore della normale base delle categorie. È noto che questo causa dei conflitti da cui deriva un funzionamento incorretto degli url."
72
+
73
+ msgid "translations"
74
+ msgstr "traduzioni"
75
+
76
+ msgid "product"
77
+ msgstr "prodotto"
78
+
79
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">WPML</a> versions prior %s."
80
+ msgstr "WooCommerce Multilingual è attivo, ma non funzionante. Non è compatibile con le versioni di <a href=\"%s\">WPML</a> antecedenti alla %s."
81
+
82
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">Woocommerce</a> versions prior %s."
83
+ msgstr "WooCommerce Multilingual è attivo, ma non funzionante. Non è compatibile con le versioni di <a href=\"%s\">Woocommerce</a> antecedenti alla %s."
84
+
85
+ msgid "You are using WooCommerce Multilingual %s. This version includes an important UI redesign for the configuration screens and it requires <a href=\"%s\">WPML %s</a> or higher. Everything still works on the front end now but, in order to configure options for WooCommerce Multilingual, you need to upgrade WPML."
86
+ msgstr "Stai utilizzando WooCommerce Multilingual %s. Questa versione include un'importante riprogettazione dell'interfaccia utente per le schermate di configurazione e richiede <a href=\"%s\">WPML %s</a> o versioni successive. Adesso tutte le funzionalità del front end continueranno a essere attive, ma per configurare le opzioni di WooCommerce Multilingual, devi aggiornare WPML."
87
+
88
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">WPML Translation Management</a> versions prior %s."
89
+ msgstr "WooCommerce Multilingual è attivo, ma non funzionante. Non è compatibile con le versioni di <a href=\"%s\">WPML Translation Management</a> antecedenti alla %s."
90
+
91
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">WPML String Translation</a> versions prior %s."
92
+ msgstr "WooCommerce Multilingual è attivo, ma non funzionante. Non è compatibile con le versioni di <a href=\"%s\">String Translation di WPML</a> antecedenti alla %s."
93
+
94
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">WPML Media</a> versions prior %s."
95
+ msgstr "WooCommerce Multilingual è attivo, ma non funzionante. Non è compatibile con le versioni di <a href=\"%s\">WPML Media</a> antecedenti alla %s."
96
+
97
+ msgid "and"
98
+ msgstr "e"
99
+
100
+ msgid "WooCommerce Multilingual is enabled but not effective. It requires %s in order to work."
101
+ msgstr "WooCommerce Multilingual è abilitato, ma non funzionante. Per funzionare richiede %s."
102
+
103
+ msgid "Permalink settings"
104
+ msgstr "Impostazioni permalink"
105
+
106
+ msgid "Configure products slug translation"
107
+ msgstr "Configura la traduzione degli slug dei prodotti"
108
+
109
+ msgid "If you want different slugs for shop pages (%s/%s), you need to disable the shop prefix for products in <a href=\"%s\">WooCommerce Settings</a>"
110
+ msgstr "Se preferisci slug diversi per ogni pagina del negozio (%s/%s), devi disabilitare per i prodotti il prefisso del negozio in <a href=\"%s\">Impostazioni WooCommerce</a>"
111
+
112
+ msgid "Finished! You can visit the %sstrings translation%s screen to translate the strings now."
113
+ msgstr "Fatto! Adesso per tradurre le stringhe, puoi visitare la schermata di %straduzione stringhe%s."
114
+
115
+ msgid "wpml-config.xml file missing from WooCommerce Multilingual folder."
116
+ msgstr "Il file wpml-config.xml non è presente nella cartella WooCommerce Multilingual."
117
+
118
+ msgid "Custom field %s configuration from wpml-config.xml file was altered!"
119
+ msgstr "La configurazione del campo personalizzato %s del file wpml-config.xml è stata alterata!"
120
+
121
+ msgid "Custom type %s configuration from wpml-config.xml file was altered!"
122
+ msgstr "La configurazione del tipo personalizzato %s del file wpml-config.xml è stata alterata!"
123
+
124
+ msgid "Custom taxonomy %s configuration from wpml-config.xml file was altered!"
125
+ msgstr "La configurazione della tassonomia personalizzata %s del file wpml-config.xml è stata alterata!"
126
+
127
+ msgid "Upgrade WPML"
128
+ msgstr "Aggiorna WPML"
129
+
130
+ msgid "Invalid language parameter: %s"
131
+ msgstr "Parametro della lingua non valido: %s"
132
+
133
+ msgid "Source product id not found: %s"
134
+ msgstr "ID d'origine del prodotto non trovato: %s"
135
+
136
+ msgid "Product Base"
137
+ msgstr "Base del prodotto"
138
+
139
+ msgid "Product Tag Base"
140
+ msgstr "Base dei tag del prodotto"
141
+
142
+ msgid "Product Category Base"
143
+ msgstr "Base della categoria del prodotto"
144
+
145
+ msgid "Product Attribute Base"
146
+ msgstr "Base degli attributi del prodotto"
147
+
148
+ msgid "Endpoint: %s"
149
+ msgstr "Endpoint: %s"
150
+
151
+ msgid "product-category"
152
+ msgstr "categoria-prodotto"
153
+
154
+ msgid "product-tag"
155
+ msgstr "tag-prodotto"
156
+
157
+ msgid "Original language"
158
+ msgstr "Lingua originale"
159
+
160
+ msgid "Take this and edit"
161
+ msgstr "Prendi questo e modifica"
162
+
163
+ msgid "Add translation"
164
+ msgstr "Aggiungi traduzione"
165
+
166
+ msgid "Update translation"
167
+ msgstr "Aggiorna la traduzione"
168
+
169
+ msgid "Finish translating"
170
+ msgstr "Interrompi la traduzione"
171
+
172
+ msgid "Edit translation"
173
+ msgstr "Modifica la traduzione"
174
+
175
+ msgid "Edit this item inline"
176
+ msgstr "Modifica questo elemento in linea con il testo"
177
+
178
+ msgid "Quick Edit"
179
+ msgstr "Modifica rapida"
180
+
181
+ msgid "Translation in progress"
182
+ msgstr "Traduzione in corso"
183
+
184
+ msgid "Invalid nonce"
185
+ msgstr "Nonce non valido"
186
+
187
+ msgid "Currency - no orders found"
188
+ msgstr "Valuta - non è stato trovato nessun ordine"
189
+
190
+ msgid "Currencies order updated"
191
+ msgstr "Ordine delle valute aggiornato"
192
+
193
+ msgid "Currency switcher"
194
+ msgstr "Selettore valuta"
195
+
196
+ msgid "Configure options"
197
+ msgstr "Configura opzioni"
198
+
199
+ msgid "Settings saved!"
200
+ msgstr "Le impostazioni sono state salvate!"
201
+
202
+ msgid "Add new currency"
203
+ msgstr "Aggiungi un'altra valuta"
204
+
205
+ msgid "Update currency"
206
+ msgstr "Aggiorna la valuta"
207
+
208
+ msgid "Update settings for %s"
209
+ msgstr "Aggiorna le impostazioni per %s"
210
+
211
+ msgid "The default currency was changed. In order to show accurate prices in all currencies, you need to update the exchange rates under the %sMulti-currency%s configuration."
212
+ msgstr "La valuta predefinita è stata modificata. Per visualizzare correttamente i prezzi in tutte le valute, devi aggiornare i tassi di cambio nella configurazione %sMultivaluta%s."
213
+
214
+ msgid "All the products will be removed from the current order in order to change the currency"
215
+ msgstr "Per modificare la valuta, tutti i prodotti saranno rimossi dall'attuale ordine"
216
+
217
+ msgid "Show all currencies"
218
+ msgstr "Mostra tutte le valute"
219
+
220
+ msgid "Order currency:"
221
+ msgstr "Valuta dell'ordine:"
222
+
223
+ msgid "Cart"
224
+ msgstr "Carrello"
225
+
226
+ msgid "Checkout"
227
+ msgstr "Completa transazione"
228
+
229
+ msgid "Checkout &rarr; Pay"
230
+ msgstr "Completa transazione e paga"
231
+
232
+ msgid "Order Received"
233
+ msgstr "Ordine ricevuto"
234
+
235
+ msgid "My Account"
236
+ msgstr "Il mio account"
237
+
238
+ msgid "Change Password"
239
+ msgstr "Modifica password"
240
+
241
+ msgid "Edit My Address"
242
+ msgstr "Modifica il mio indirizzo"
243
+
244
+ msgid "Logout"
245
+ msgstr "Esci"
246
+
247
+ msgid "Lost Password"
248
+ msgstr "Password smarrita?"
249
+
250
+ msgid "View Order"
251
+ msgstr "Visualizza ordine"
252
+
253
+ msgid "Shop"
254
+ msgstr "Negozio"
255
+
256
+ msgid "All the products will be removed from the current order in order to change the language"
257
+ msgstr "Per modificare la lingua, tutti i prodotti saranno rimossi dall'attuale ordine"
258
+
259
+ msgid "Order language:"
260
+ msgstr "Lingua dell'ordine:"
261
+
262
+ msgid "Choose a file"
263
+ msgstr "Scegli un file"
264
+
265
+ msgid "At least one of these fields is required: title, content or excerpt"
266
+ msgstr "Almeno uno di questi campi è obbligatorio: titolo, contenuto o excerpt"
267
+
268
+ msgid "This translation job will no longer be assigned to you. Other translators will be able take it and continue the translation."
269
+ msgstr "Questo lavoro di traduzione non risulta più assegnato a te. Verrà assegnato ad altri traduttori che continueranno la traduzione."
270
+
271
+ msgid "This field is locked for editing because WPML will copy its value from the original language."
272
+ msgstr "L'editing di questo campo è bloccato in quanto WPML copierà il suo valore dalla lingua originale."
273
+
274
+ msgid "This is a translation of %s. Some of the fields are not editable. It's recommended to use the %s for translating products."
275
+ msgstr "Questa è la traduzioni di %s. Alcuni campi non sono modificabili. Per tradurre i prodotti si consiglia l'uso di %s."
276
+
277
+ msgid "WooCommerce Multilingual products translator"
278
+ msgstr "Traduttore multilingue prodotti WooCommerce"
279
+
280
+ msgid "Looks like you are upgrading from a previous version of WooCommerce Multilingual. Would you like to automatically create translated variations and images?"
281
+ msgstr "Ci risulta che tu abbia utilizzato finora una versione meno recente di WooCommerce Multilingual. Desideri creare le traduzioni delle varianti e delle immagini automaticamente?"
282
+
283
+ msgid "Yes, go to the troubleshooting page"
284
+ msgstr "Sì, vai alla pagina dedicata alla risoluzione dei problemi"
285
+
286
+ msgid "No - dismiss"
287
+ msgstr "No, ignora"
288
+
289
+ msgid "You've successfully installed %sWooCommerce Multilingual%s. Would you like to see a quick overview?"
290
+ msgstr "L'installazione di %sWooCommerce Multilingual%s è riuscita. Desideri visualizzare una breve panoramica?"
291
+
292
+ msgid "Learn how to turn your e-commerce site multilingual"
293
+ msgstr "Informazioni per trasformare il tuo sito e-commerce in un sito multilingue"
294
+
295
+ msgid "Dismiss"
296
+ msgstr "Elimina"
297
+
298
+ msgid "To translate %s please use the %s translation%s page, inside the %sWooCommerce Multilingual admin%s."
299
+ msgstr "Per tradurre %s, usa la pagina di %s traduzione%s, all'interno di %sGestione multilingue di WooCommerce%s."
300
+
301
+ msgid "%s do not require translation."
302
+ msgstr "%s non richiede traduzione."
303
+
304
+ msgid "Include to translation"
305
+ msgstr "Includi nella traduzione"
306
+
307
+ msgid "%d %s are missing translations."
308
+ msgstr "%d %s non risultano tradotti."
309
+
310
+ msgid "Translate %s"
311
+ msgstr "Traduci %s"
312
+
313
+ msgid "Exclude from translation"
314
+ msgstr "Escludi dalla traduzione"
315
+
316
+ msgid "All %s are translated."
317
+ msgstr "Tutti gli oggetti (%s) risultano tradotti."
318
+
319
+ msgid "Currently, there are %s variations that need to be created."
320
+ msgstr "Al momento è necessario creare %s varianti."
321
+
322
+ msgid "%d products left"
323
+ msgstr "%d prodotti rimasti"
324
+
325
+ msgid "Synchronization complete!"
326
+ msgstr "Sincronizzazione completata!"
327
+
328
+ msgid "Invalid taxonomy %s"
329
+ msgstr "Tassonomia non valida %s"
330
+
331
+ msgid "Some translated %s have different %s assignments."
332
+ msgstr "Ad alcuni elementi tradotti (%s) sono stati assegnati attributi diversi (%s)."
333
+
334
+ msgid "Update %s for all translated %s"
335
+ msgstr "Aggiorna %s per tutti gli oggetti tradotti (%s)"
336
+
337
+ msgid "All %s have the same %s assignments."
338
+ msgstr "È stata assegnata la stessa proprietà (%s) a tutti gli oggetti (%s)."
339
+
340
+ msgid "Successfully updated %s for all translated %s."
341
+ msgstr "Proprietà aggiornata (%s) per tutti gli oggetti tradotti (%s)!"
342
+
343
+ msgid "Synchronize attributes and update product variations"
344
+ msgstr "Sincronizza gli attributi e aggiorna le varianti dei prodotti"
345
+
346
+ msgid "Image"
347
+ msgstr "Immagine"
348
+
349
+ msgid "Product"
350
+ msgstr "Prodotto"
351
+
352
+ msgid "Type"
353
+ msgstr "Tipo"
354
+
355
+ msgid "Date"
356
+ msgstr "Data"
357
+
358
+ msgid "Categories"
359
+ msgstr "Categorie"
360
+
361
+ msgid "No products found"
362
+ msgstr "Nessun prodotto trovato"
363
+
364
+ msgid "Draft"
365
+ msgstr "Bozza"
366
+
367
+ msgid "Private"
368
+ msgstr "Privata"
369
+
370
+ msgid "Pending"
371
+ msgstr ""
372
+
373
+ msgid "Scheduled"
374
+ msgstr "Programmata"
375
+
376
+ msgid "Parent product: %s"
377
+ msgstr "Prodotto genitore: %s"
378
+
379
+ msgid "Edit this item"
380
+ msgstr "Modifica questo elemento"
381
+
382
+ msgid "Edit"
383
+ msgstr "Modifica"
384
+
385
+ msgid "View \"%s\""
386
+ msgstr "Visualizza \"%s\""
387
+
388
+ msgid "View"
389
+ msgstr "Visualizza"
390
+
391
+ msgid "Published"
392
+ msgstr "Pubblicati"
393
+
394
+ msgid "Last Modified"
395
+ msgstr "Ultima modifica"
396
+
397
+ msgid "All languages"
398
+ msgstr "Tutte le lingue"
399
+
400
+ msgid "All categories"
401
+ msgstr "Tutte le categorie"
402
+
403
+ msgid "All translation statuses"
404
+ msgstr "Tutti gli stati delle traduzioni"
405
+
406
+ msgid "Not translated or needs updating"
407
+ msgstr "Non tradotta o da aggiornare"
408
+
409
+ msgid "Needs updating"
410
+ msgstr "Richiede l'aggiornamento"
411
+
412
+ msgid "Translation complete"
413
+ msgstr "Traduzione completata"
414
+
415
+ msgid "All statuses"
416
+ msgstr "Tutti gli stati"
417
+
418
+ msgid "Filter"
419
+ msgstr "Filtro"
420
+
421
+ msgid "Reset"
422
+ msgstr "Reset"
423
+
424
+ msgid "Search"
425
+ msgstr "Ricerca"
426
+
427
+ msgid "%d items"
428
+ msgstr "%d elementi"
429
+
430
+ msgid "Go to the first page"
431
+ msgstr "Vai alla prima pagina"
432
+
433
+ msgid "Go to the previous page"
434
+ msgstr "Vai alla pagina precedente"
435
+
436
+ msgid "Select Page"
437
+ msgstr "Seleziona la pagina"
438
+
439
+ msgid "Current page"
440
+ msgstr "Pagina corrente"
441
+
442
+ msgid "of"
443
+ msgstr "di"
444
+
445
+ msgid "Go to the next page"
446
+ msgstr "Vai alla pagina successiva"
447
+
448
+ msgid "Go to the last page"
449
+ msgstr "Vai all'ultima pagina"
450
+
451
+ msgid "Translatable?"
452
+ msgstr "Traducibile?"
453
+
454
+ msgid "Enable this if you want to translate attribute values with Woocommerce Multilingual"
455
+ msgstr "Abilita questa opzione se desideri tradurre i valori di questo attributo con Woocommerce Multilingual"
456
+
457
+ msgid "Existing translations and variations associated will be deleted."
458
+ msgstr "Le traduzioni esistenti e le varianti associate verranno eliminate."
459
+
460
+ msgid "Product Translation Interface"
461
+ msgstr "Interfaccia di traduzione prodotti"
462
+
463
+ msgid "The recommended way is using the WPML Translation Editor. It is streamlined for making the translation process much easier while also providing a much better integration with various WooCommerce extensions."
464
+ msgstr "Si consiglia l'uso dell'editor di traduzione di WPML. Quest'ultimo è stato sviluppato per rendere il processo di traduzione più semplice e per fornire al tempo stesso una migliore integrazione con le varie estensioni di WooCommerce."
465
+
466
+ msgid "WPML Translation Editor"
467
+ msgstr "Editor di traduzione di WPML "
468
+
469
+ msgid "Native WooCommerce product editing screen"
470
+ msgstr "Schermata di editing dei prodotti WooCommerce nativa"
471
+
472
+ msgid "Products synchronization"
473
+ msgstr "Sincronizzazione dei prodotti"
474
+
475
+ msgid "Configure specific product properties that should be synced to translations."
476
+ msgstr "Configura proprietà specifiche del prodotto da sincronizzare nelle traduzioni."
477
+
478
+ msgid "Sync publishing date for translated products."
479
+ msgstr "Sincronizza la data di pubblicazione per i prodotti tradotti."
480
+
481
+ msgid "Sync products and product taxonomies order."
482
+ msgstr "Sincronizza prodotti e ordine tassonomia prodotti"
483
+
484
+ msgid "Products Download Files"
485
+ msgstr "File di download dei prodotti"
486
+
487
+ msgid "If you are using downloadable products, you can choose to have their paths\n synchronized, or seperate for each language."
488
+ msgstr "Se stai utilizzando dei prodotti che sono disponibili per il download, puoi scegliere di sincronizzare o separare\n i loro percorsi per ogni lingua."
489
+
490
+ msgid "Use the same files for translations"
491
+ msgstr "Usa gli stessi file per le traduzioni"
492
+
493
+ msgid "Add separate download files for translations"
494
+ msgstr "Aggiungi file di download separati per le traduzioni"
495
+
496
+ msgid "Save changes"
497
+ msgstr "Salva le modifiche"
498
+
499
+ msgid "Troubleshooting page"
500
+ msgstr "Pagina di risoluzione dei problemi"
501
+
502
+ msgid "Update Translation"
503
+ msgstr "Aggiorna traduzione"
504
+
505
+ msgid "Hide This Message"
506
+ msgstr "Nascondi questo messaggio"
507
+
508
+ msgid "<strong>WooCommerce Translation Available</strong> &#8211; Install or update your <code>%s</code> translations to version <code>%s</code>."
509
+ msgstr "<strong>WooCommerce Translation disponibile</strong> &#8211; Installa o aggiorna le tue <code>%s</code> traduzioni alla versione <code>%s</code>."
510
+
511
+ msgid "This will automatically generate variations for translated products corresponding to recently translated attributes."
512
+ msgstr "Questo genererà automaticamente le varianti per i prodotti tradotti corrispondenti agli attributi recentemente tradotti."
513
+
514
+ msgid "Synchronize %s assignment in content"
515
+ msgstr "Sincronizza proprietà (%s) assegnata al contenuto"
516
+
517
+ msgid "This action lets you automatically apply the %s taxonomy to your content in different languages. It will scan the original content and apply the same taxonomy to translated content."
518
+ msgstr "Questa azione ti consente di applicare la tassonomia %s automaticamente al tuo contenuto in lingue diverse. Il contenuto originale sarà analizzato e gli sarà applicata la stessa tassonomia del contenuto tradotto."
519
+
520
+ msgid "You have untranslated terms!"
521
+ msgstr "Ci sono termini non tradotti!"
522
+
523
+ msgid "Select currency"
524
+ msgstr "Seleziona la valuta"
525
+
526
+ msgid "Exchange Rate"
527
+ msgstr "Tasso di cambio"
528
+
529
+ msgid "Only numeric"
530
+ msgstr "Solo caratteri numerici"
531
+
532
+ msgid "Set on %s"
533
+ msgstr "Impostato il %s"
534
+
535
+ msgid "Currency Preview"
536
+ msgstr "Anteprima valuta"
537
+
538
+ msgid "Currency Position"
539
+ msgstr "Posizione valuta"
540
+
541
+ msgid "Left"
542
+ msgstr "Sinistra"
543
+
544
+ msgid "Right"
545
+ msgstr "Destra"
546
+
547
+ msgid "Left with space"
548
+ msgstr "A sinistra con spazio"
549
+
550
+ msgid "Right with space"
551
+ msgstr "A destra con spazio"
552
+
553
+ msgid "Thousand Separator"
554
+ msgstr "Separatore di migliaia"
555
+
556
+ msgid "Decimal Separator"
557
+ msgstr "Separatore decimale"
558
+
559
+ msgid "Number of Decimals"
560
+ msgstr "Numero di decimali"
561
+
562
+ msgid "Rounding to the nearest integer"
563
+ msgstr "Arrotondamento alla cifra più vicina"
564
+
565
+ msgid "Disabled"
566
+ msgstr "Disabilitata"
567
+
568
+ msgid "Up"
569
+ msgstr "Su"
570
+
571
+ msgid "Down"
572
+ msgstr "Giù"
573
+
574
+ msgid "Nearest"
575
+ msgstr "Più vicino"
576
+
577
+ msgid "Increment for nearest integer"
578
+ msgstr "Incremento per la cifra più vicina"
579
+
580
+ msgid "Autosubtract amount"
581
+ msgstr "Sottrazione automatica dell'importo"
582
+
583
+ msgid "Cancel"
584
+ msgstr "Annulla"
585
+
586
+ msgid "Save"
587
+ msgstr "Salva"
588
+
589
+ msgid "Products"
590
+ msgstr "Prodotti"
591
+
592
+ msgid "Tags"
593
+ msgstr "Tag"
594
+
595
+ msgid "Attributes"
596
+ msgstr "Attributi"
597
+
598
+ msgid "Shipping Classes"
599
+ msgstr "Classi di spedizioni"
600
+
601
+ msgid "Settings"
602
+ msgstr "Impostazioni"
603
+
604
+ msgid "Multi-currency"
605
+ msgstr "Multivaluta"
606
+
607
+ msgid "Store URLs"
608
+ msgstr "URL del negozio"
609
+
610
+ msgid "Status"
611
+ msgstr "Stato"
612
+
613
+ msgid "Troubleshooting"
614
+ msgstr "Risoluzione dei problemi"
615
+
616
+ msgid "Thank you for using %sWooCommerce Multilingual%s! You can express your love and\n support by %s rating our plugin and saying that %sit works%s for you."
617
+ msgstr "Grazie per aver scelto di utilizzare %sWooCommerce Multilingual%s! Puoi esprimere il tuo apprezzamento e\n sostegno %svalutando il nostro plugin e affermando che è %sadatto%s alle tue esigenze."
618
+
619
+ msgid "Hide"
620
+ msgstr "Nascondi"
621
+
622
+ msgid "Loading ..."
623
+ msgstr "Caricamento..."
624
+
625
+ msgid "Regular Price"
626
+ msgstr "Prezzo normale"
627
+
628
+ msgid "Sale Price"
629
+ msgstr "Prezzo di vendita"
630
+
631
+ msgid "Multi-currency is enabled but no secondary currencies have been set. %sAdd secondary currencies%s."
632
+ msgstr ""
633
+
634
+ msgid "Calculate prices in other currencies automatically"
635
+ msgstr "Calcola automaticamente i prezzi in altre valute"
636
+
637
+ msgid "Click to see the prices in the other currencies as they are currently shown on the front end."
638
+ msgstr "Clicca per visualizzare i prezzi nelle altre valute così come sono visibili al momento nel front end."
639
+
640
+ msgid "Show"
641
+ msgstr "Mostra"
642
+
643
+ msgid "Set prices in other currencies manually"
644
+ msgstr "Imposta manualmente i prezzi in altre valute"
645
+
646
+ msgid "Enter prices in other currencies"
647
+ msgstr "Inserisci i prezzi in altre valute"
648
+
649
+ msgid "Hide prices in other currencies"
650
+ msgstr "Nascondi i prezzi in altre valute"
651
+
652
+ msgid "Determined automatically based on exchange rate"
653
+ msgstr "Calcolo effettuato automaticamente in base al cambio valuta"
654
+
655
+ msgid "Schedule"
656
+ msgstr "Pianifica"
657
+
658
+ msgid "Same as default currency"
659
+ msgstr "Come la valuta predefinita"
660
+
661
+ msgid "Set dates"
662
+ msgstr "Imposta date"
663
+
664
+ msgid "Collapse"
665
+ msgstr "Comprimi"
666
+
667
+ msgid "From&hellip;"
668
+ msgstr "Da"
669
+
670
+ msgid "To&hellip;"
671
+ msgstr "A&hellip;"
672
+
673
+ msgid "Please enter in a value less than the regular price"
674
+ msgstr "Inserisci un valore inferiore al prezzo normale"
675
+
676
+ msgid "Required plugins"
677
+ msgstr "Plugin richiesti"
678
+
679
+ msgid "Plugins Status"
680
+ msgstr "Stato dei plugin"
681
+
682
+ msgid "WooCommerce Multilingual depends on several plugins to work. If any required plugin is missing, you should install and activate it."
683
+ msgstr "Il funzionamento di WooCommerce Multilingual dipende da vari plugin. Se uno di questi è assente, è necessario installarlo e attivarlo."
684
+
685
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">WPML</a> versions prior 2.0.5."
686
+ msgstr "WooCommerce Multilingual è abilitato, ma non funzionante. Non è compatibile con le versioni di <a href=\"%s\">WPML</a> antecedenti alla 2.0.5."
687
+
688
+ msgid "Update WPML"
689
+ msgstr "Aggiorna WPML"
690
+
691
+ msgid "Get WPML"
692
+ msgstr "Scarica WPML"
693
+
694
+ msgid "Get WPML Media"
695
+ msgstr "Scarica WPML Media"
696
+
697
+ msgid "Get WPML Translation Management"
698
+ msgstr "Scarica WPML Translation Management"
699
+
700
+ msgid "Get WPML String Translation"
701
+ msgstr "Scarica String Translation di WPML"
702
+
703
+ msgid "%s is installed and active."
704
+ msgstr "%s risulta installato e attivo."
705
+
706
+ msgid "%s is set up."
707
+ msgstr "%s è configurato."
708
+
709
+ msgid "%s is not set up."
710
+ msgstr "%s non è configurato."
711
+
712
+ msgid "%s is either not installed or not active."
713
+ msgstr "%s non è stato installato o non è attivo."
714
+
715
+ msgid "%1$s is installed, but with incorrect version. You need %1$s %2$s or higher. "
716
+ msgstr "%1$s risulta installato, ma in una versione non valida. È indispensabile %1$s %2$s o successivo."
717
+
718
+ msgid "Download WooCommerce"
719
+ msgstr "Scarica WooCommerce"
720
+
721
+ msgid "The WordPress Multilingual Plugin"
722
+ msgstr "Il plugin multilingue di WordPress"
723
+
724
+ msgid "This page allows you to translate all strings that are being used by WooCommerce in building different type of urls. Translating them enables you to have fully localized urls that match the language of the pages."
725
+ msgstr "Questa pagina ti consente di tradurre tutte le stringhe utilizzate da WooCommerce per la costruzione dei vari tipi di URL. Traducendole potrai avere URL completamente tradotti corrispondenti alla lingua delle pagine."
726
+
727
+ msgid "You can enter or edit your default values on the %sPermalinks settings%s page or, for the endpoints, on the WooCommerce %sAccount settings%s page."
728
+ msgstr "Puoi inserire o modificare i valori predefiniti dalla pagina %sImpostazioni permalink%s o quelli degli endpoint alla pagina di WooCommerce %sImpostazioni account%s."
729
+
730
+ msgid "permalinks settings"
731
+ msgstr "impostazioni dei permalink"
732
+
733
+ msgid "Account settings"
734
+ msgstr "Impostazioni dell'account "
735
+
736
+ msgid "Slug type"
737
+ msgstr "Tipo di slug "
738
+
739
+ msgid "Original Slug"
740
+ msgstr "Slug originale"
741
+
742
+ msgid "Shop page"
743
+ msgstr "Pagina del negozio"
744
+
745
+ msgid "Product base"
746
+ msgstr "Base del prodotto"
747
+
748
+ msgid "Product category base"
749
+ msgstr "Base della categoria del prodotto"
750
+
751
+ msgid "Product tag base"
752
+ msgstr "Base dei tag del prodotto"
753
+
754
+ msgid "Product attribute base"
755
+ msgstr "Base degli attributi del prodotto"
756
+
757
+ msgid "Original"
758
+ msgstr "Originale"
759
+
760
+ msgid "Translation to"
761
+ msgstr "Traduzione in"
762
+
763
+ msgid "Product Shop Base"
764
+ msgstr "Base del prodotto del negozio"
765
+
766
+ msgid "Welcome to WooCommerce Multilingual!"
767
+ msgstr "WooCommerce Multilingual ti dà il benvenuto!"
768
+
769
+ msgid "Configure the multilingual support for your e-commerce site in just a couple of minutes."
770
+ msgstr ""
771
+
772
+ msgid "By default, the products are translatable just like product categories, product tags and attributes. So you can start translating these right away."
773
+ msgstr "Per impostazione predefinita, i prodotti sono traducibili proprio come le categorie, i tag e gli attributi dei prodotti. Quindi, puoi iniziare a tradurli subito."
774
+
775
+ msgid "You can configure, however, which attributes you want to translate, install the translated shop pages or enable the multi-currency mode."
776
+ msgstr "Tuttavia, puoi configurare quali attributi intendi tradurre, installare le pagine del negozio tradotte o abilitare la modalità multivaluta."
777
+
778
+ msgid "Start"
779
+ msgstr "Avvia"
780
+
781
+ msgid "No, thanks. I'll do it later."
782
+ msgstr "No, grazie. Lo farò in seguito."
783
+
784
+ msgid "Select translatable attributes"
785
+ msgstr "Seleziona gli attributi traducibili"
786
+
787
+ msgid "There are no attributes defined"
788
+ msgstr "Non è stato definito nessun attributo"
789
+
790
+ msgid "Continue"
791
+ msgstr "Continua"
792
+
793
+ msgid "Later"
794
+ msgstr "Più tardi"
795
+
796
+ msgid "One or more WooCommerce pages have not been created"
797
+ msgstr "Una o più pagine WooCommerce non sono state create"
798
+
799
+ msgid "Install missing WooCommerce pages and create translations."
800
+ msgstr "Installa le pagine WooCommerce mancanti e crea le traduzioni."
801
+
802
+ msgid "Translate Store Pages"
803
+ msgstr "Traduci le pagine del negozio"
804
+
805
+ msgid "All store pages must be translated in the languages configured on the site."
806
+ msgstr "Tutte le pagine del negozio devono essere tradotte nelle lingue configurate sul sito."
807
+
808
+ msgid "Select the translation interface"
809
+ msgstr "Seleziona l'interfaccia di traduzione"
810
+
811
+ msgid "Enable multiple currencies"
812
+ msgstr "Abilita valute multiple"
813
+
814
+ msgid "This will allow you to set prices for products in different currencies. The prices can be determined based on a given exchange rate or set explicitly for specific products."
815
+ msgstr "Questo ti consentirà di impostare i prezzi dei prodotti in valute diverse. I prezzi possono essere calcolati in base a un tasso di cambio prefissato o impostato specificamente per determinati prodotti."
816
+
817
+ msgid "Enable the multi-currency mode"
818
+ msgstr "Abilita la modalità multivaluta"
819
+
820
+ msgid "Further actions that are necessary for making your existing content multilingual, are listed below."
821
+ msgstr "Le altre azioni necessarie per rendere multilingue i contenuti esistenti sono elencate qui in basso."
822
+
823
+ msgid "Start translating products"
824
+ msgstr "Inizia a tradurre i prodotti"
825
+
826
+ msgid "Add secondary currencies on the %smulti-currency configuration%s page"
827
+ msgstr "Aggiungi le valute secondarie alla pagina di %sconfigurazione multivaluta%s"
828
+
829
+ msgid "Translate existing terms for these %sproduct attributes%s: %s"
830
+ msgstr "Traduci i termini esistenti per questi %sattributi del prodotto%s: %s"
831
+
832
+ msgid "Translate existing %sproduct categories%s"
833
+ msgstr "Traduci le %scategorie del prodotto%s esistenti"
834
+
835
+ msgid "Translate existing %sproduct tags%s"
836
+ msgstr "Traduci i %stag del prodotto%s esistenti"
837
+
838
+ msgid "%sAdd missing translations%s for shipping classes"
839
+ msgstr "%sAggiungi le traduzioni mancanti%s per le classi di spedizione"
840
+
841
+ msgid "Translate %sURL slugs%s to create multilingual store and product urls"
842
+ msgstr "Traduci gli %sslug degli URL%s per creare URL multilingue del negozio e dei prodotti "
843
+
844
+ msgid "Use custom settings for translations download files"
845
+ msgstr ""
846
+
847
+ msgid "WooCommerce Store Pages"
848
+ msgstr "Pagine del negozio WooCommerce"
849
+
850
+ msgid "To run a multilingual e-commerce site, you need to have the WooCommerce shop pages translated to all the site's languages. Once all the pages are installed you can add the translations for them from this menu."
851
+ msgstr "Per eseguire un sito e-commerce multilingua, devi avere le pagine del negozio WooCommerce tradotte in tutte le lingue del sito. Quando avrai installato tutte le pagine, potrai aggiungere le loro traduzioni tramite questo menu."
852
+
853
+ msgid "One or more WooCommerce pages have not been created."
854
+ msgstr "Una o più pagine WooCommerce non sono state create."
855
+
856
+ msgid "Install WooCommerce Pages"
857
+ msgstr "Installa pagine WooCommerce"
858
+
859
+ msgid "WooCommerce store pages do not exist for these languages:"
860
+ msgstr "Le pagine del negozio WooCommerce in queste lingue sono inesistenti:"
861
+
862
+ msgid "Create missing translations"
863
+ msgstr "Crea traduzioni mancanti"
864
+
865
+ msgid "These pages are currently being translated by translators via WPML: "
866
+ msgstr "Queste pagine al momento sono in corso di traduzione tramite WPML:"
867
+
868
+ msgid "WooCommerce store pages are translated to all the site's languages."
869
+ msgstr "Le pagine del negozio WooCommerce risultano tradotte in tutte le lingue del sito."
870
+
871
+ msgid "Configuration warnings"
872
+ msgstr "Avvisi di configurazione"
873
+
874
+ msgid "Reporting miscelaneous configuration issues that can make WooCommerce Multilingual not run normally"
875
+ msgstr "Segnalare problemi di configurazione vari che non consentono la normale esecuzione di WooCommerce Multilingual"
876
+
877
+ msgid "Your product permalink base is not translated to:"
878
+ msgstr "La base dei permalink del prodotto non è stata tradotta in:"
879
+
880
+ msgid "Translate URLs"
881
+ msgstr "Traduci gli URL"
882
+
883
+ msgid "Your site's default language is not English and the strings language is also not English."
884
+ msgstr "La lingua predefinita del tuo sito e anche la lingua delle stringhe non è l'inglese."
885
+
886
+ msgid "Running WooCommerce multilingual with default language other than English."
887
+ msgstr "Eseguire WooCommerce multilingual con una lingua predefinita diversa dall'inglese."
888
+
889
+ msgid "This may cause problems with URLs in different languages."
890
+ msgstr "Questo potrebbe causare dei problemi con gli URL nelle altre lingue."
891
+
892
+ msgid "Change default language"
893
+ msgstr "Modifica lingua predefinita"
894
+
895
+ msgid "Your site's default language is not English."
896
+ msgstr "La lingua predefinita del tuo sito non è l'inglese."
897
+
898
+ msgid "There are some settings that require careful attention."
899
+ msgstr "Ci sono delle impostazioni che richiedono particolare attenzione."
900
+
901
+ msgid "Some settings from the WooCommerce Multilingual wpml-config.xml file have been overwritten."
902
+ msgstr "Alcune impostazioni contenute nel file wpml-config.xml di WooCommerce Multilingual sono state sovrascritte."
903
+
904
+ msgid "You should check WPML configuration files added by other plugins or manual settings on the %s section."
905
+ msgstr "Dovresti controllare i file di configurazione di WPML aggiunti con altri plugin o le impostazioni manuali nella sezione %s."
906
+
907
+ msgid "Multilingual Content Setup"
908
+ msgstr "Impostazioni contenuto multilingua"
909
+
910
+ msgid "Taxonomies missing translations"
911
+ msgstr "Traduzioni mancanti delle tassonomie"
912
+
913
+ msgid "To run a fully translated site, you should translate all taxonomy terms. Some store elements, such as variations, depend on taxonomy translation."
914
+ msgstr "Per creare un sito completamente tradotto, devi tradurre tutti i termini delle tassonomie. Alcuni elementi del negozio, come le varianti, dipendono dalla traduzione delle tassonomie."
915
+
916
+ msgid "This taxonomy requires translation."
917
+ msgstr "Questa tassonomia deve essere tradotta."
918
+
919
+ msgid "Include in translation"
920
+ msgstr "Includi nella traduzione"
921
+
922
+ msgid "This taxonomy does not require translation."
923
+ msgstr "Questa tassonomia non deve essere tradotta."
924
+
925
+ msgid "Right now, there are no taxonomy terms needing translation."
926
+ msgstr "Al momento, non ci sono termini delle tassonomie da tradurre."
927
+
928
+ msgid "There are no translatable product attributes defined"
929
+ msgstr "Non sono stati definiti attributi del prodotto traducibili"
930
+
931
+ msgid "Select the attribute to translate: "
932
+ msgstr "Seleziona l'attributo da tradurre: "
933
+
934
+ msgid "Please make a backup of your database before you start the synchronization"
935
+ msgstr "Esegui un backup del tuo database prima di avviare la sincronizzazione"
936
+
937
+ msgid "Sync variables products"
938
+ msgstr "Sincronizza le variabili dei prodotti"
939
+
940
+ msgid "Update products count:"
941
+ msgstr "Aggiorna il conteggio dei prodotti:"
942
+
943
+ msgid "products with variations"
944
+ msgstr "prodotti con varianti"
945
+
946
+ msgid "Sync products variations:"
947
+ msgstr "Sincronizza le varianti dei prodotti:"
948
+
949
+ msgid "left"
950
+ msgstr "rimanenti"
951
+
952
+ msgid "Sync products \"gallery images\":"
953
+ msgstr "Sincronizza le \"immagini della galleria\" dei prodotti:"
954
+
955
+ msgid "Sync products categories (display type, thumbnail):"
956
+ msgstr "Sincronizza categorie prodotti (visualizza tipo, anteprima):"
957
+
958
+ msgid "Duplicate terms ( please select attribute ):"
959
+ msgstr "Duplica termini (seleziona l'attributo):"
960
+
961
+ msgid "none"
962
+ msgstr "nessuno"
963
+
964
+ msgid "Enable/disable"
965
+ msgstr "Abilita/Disabilita"
966
+
967
+ msgid "Currencies"
968
+ msgstr "Valute"
969
+
970
+ msgid "Add currency"
971
+ msgstr "Aggiungi valuta"
972
+
973
+ msgid "Currency"
974
+ msgstr "Valuta"
975
+
976
+ msgid "Rate"
977
+ msgstr "Tasso"
978
+
979
+ msgid "default"
980
+ msgstr "predefinita"
981
+
982
+ msgid "Default currency"
983
+ msgstr "Valuta predefinita"
984
+
985
+ msgid "Switch to this currency when switching language in the front-end"
986
+ msgstr "Passa a questa valuta quando si cambia la lingua dal front-end"
987
+
988
+ msgid "Keep"
989
+ msgstr "Mantieni"
990
+
991
+ msgid "Delete"
992
+ msgstr "Elimina"
993
+
994
+ msgid " (%s)"
995
+ msgstr "(%s)"
996
+
997
+ msgid "The multi-currency mode cannot be enabled as a specific currency was not set. Go to the %sWooCommerce settings%s page and select the default currency for your store."
998
+ msgstr "La modalità multivaluta non può essere attivata perché non è stata impostata una valuta specifica. Vai alla pagina delle %simpostazioni di WooCommerce%s e seleziona una valuta predefinita per il tuo negozio."
999
+
1000
+ msgid "Learn more"
1001
+ msgstr "Per saperne di più"
1002
+
1003
+ msgid "Show only products with custom prices in secondary currencies"
1004
+ msgstr "Mostra solo i prodotti con i prezzi personalizzati nelle valute secondarie"
1005
+
1006
+ msgid "When this option is on, when you switch to a secondary currency on the front end, only the products with custom prices in that currency are being displayed. Products with prices determined based on the exchange rate are hidden."
1007
+ msgstr "Quando questa opzione è attiva, se si seleziona la valuta secondaria nel frontend, saranno visualizzati solo i prodotti con i prezzi personalizzati in quella valuta. I prodotti con i prezzi determinati in base al tasso di cambio non saranno visibili."
1008
+
1009
+ msgid "The changes you made will be lost if you navigate away from this page."
1010
+ msgstr "Abbandonando questa pagina le modifiche effettuate andranno perse."
1011
+
1012
+ msgid "At least one currency must be enabled for this language!"
1013
+ msgstr "Devi abilitare almeno una valuta per questa lingua!"
1014
+
1015
+ msgid "Currency switcher options"
1016
+ msgstr "Opzioni selettore valuta"
1017
+
1018
+ msgid "Currency switcher style"
1019
+ msgstr "Stile selettore valuta"
1020
+
1021
+ msgid "Currency order"
1022
+ msgstr "Ordine delle valute"
1023
+
1024
+ msgid "Available parameters"
1025
+ msgstr "Parametri disponibili"
1026
+
1027
+ msgid "Template for currency switcher"
1028
+ msgstr "Modello per selettore valuta"
1029
+
1030
+ msgid "Visibility"
1031
+ msgstr "Visibilità"
1032
+
1033
+ msgid "Currency switcher preview"
1034
+ msgstr "Anteprima selettore valuta"
1035
+
1036
+ msgid "Drop-down menu"
1037
+ msgstr "Menu a tendina"
1038
+
1039
+ msgid "List of currencies"
1040
+ msgstr "Elenco delle valute"
1041
+
1042
+ msgid "Vertical"
1043
+ msgstr "Verticale"
1044
+
1045
+ msgid "Horizontal"
1046
+ msgstr "Orizzontale"
1047
+
1048
+ msgid "Drag the currencies to change their order"
1049
+ msgstr "Trascina le valute per modificarne l'ordine"
1050
+
1051
+ msgid "%name%, %symbol%, %code%"
1052
+ msgstr "%name%, %symbol%, %code%"
1053
+
1054
+ msgid "Default: %name% (%symbol%) - %code%"
1055
+ msgstr "Predefiniti: %name% (%symbol%) - %code%"
1056
+
1057
+ msgid "Show a currency selector on the product page template"
1058
+ msgstr "Mostra un selettore di valuta nel template della pagina del prodotto"
1059
+
1060
+ msgid "To configure how the %sWooCommerce products%s are translated, visit the WooCommerce Multiligual %ssettings%s page."
1061
+ msgstr "Per configurare la modalità di traduzione dei %sprodotti WooCommerce%s, visita la pagina sulle %simpostazioni%s di WooCommerce Multiligual."
1062
+
1063
+ msgid "Title"
1064
+ msgstr "Titolo"
1065
+
1066
+ msgid "Slug"
1067
+ msgstr "Slug"
1068
+
1069
+ msgid "Content / Description"
1070
+ msgstr "Contenuto / Descrizione"
1071
+
1072
+ msgid "Excerpt"
1073
+ msgstr "Estratto"
1074
+
1075
+ msgid "Purchase note"
1076
+ msgstr "Nota sull'acquisto"
1077
+
1078
+ msgid "Images"
1079
+ msgstr "Immagini"
1080
+
1081
+ msgid "Custom Product attributes"
1082
+ msgstr "Attributi personalizzati del prodotto "
1083
+
1084
+ msgid "Name"
1085
+ msgstr "Nome"
1086
+
1087
+ msgid "Value(s)"
1088
+ msgstr "Valore(i)"
1089
+
1090
+ msgid "Custom Fields"
1091
+ msgstr "Campi personalizzati"
1092
+
1093
+ msgid "Variations data"
1094
+ msgstr "Dati delle varianti"
1095
+
1096
+ msgid "Download Files for Variation #%s"
1097
+ msgstr "File di download per la variante #%s"
1098
+
1099
+ msgid "Download Files"
1100
+ msgstr "File di download "
1101
+
1102
+ msgid "File URL"
1103
+ msgstr "URL del file"
1104
+
1105
+ msgid "Content, title, and excerpt are empty."
1106
+ msgstr "Il contenuto, il titolo e l'excerpt sono vuoti."
1107
+
1108
+ msgid "Search %s"
1109
+ msgstr "Cerca %s"
1110
+
1111
+ msgid "All %s"
1112
+ msgstr "Tutto %s"
1113
+
1114
+ msgid "Parent %s"
1115
+ msgstr "Genitore %s"
1116
+
1117
+ msgid "Parent %s:"
1118
+ msgstr "Genitore %s:"
1119
+
1120
+ msgid "Edit %s"
1121
+ msgstr "Modifica %s"
1122
+
1123
+ msgid "Update %s"
1124
+ msgstr "Aggiorna %s"
1125
+
1126
+ msgid "Add New %s"
1127
+ msgstr "Aggiungi un nuovo %s"
1128
+
1129
+ msgid "New %s"
1130
+ msgstr "Nuovo %s"
1131
+
1132
+ msgid "To translate Add-ons strings please save Add-ons and go to the <b><a href=\"%s\">String Translation interface</a></b>"
1133
+ msgstr "Per tradurre le stringhe dei componenti aggiuntivi, salva i componenti aggiuntivi e vai all'<b><a href=\"%s\">Interfaccia di traduzione stringhe</a></b>"
1134
+
1135
+ msgid "Product Add-ons Group \"%s\""
1136
+ msgstr "Gruppo di componenti aggiuntivi del prodotto \"%s\""
1137
+
1138
+ msgid "Description"
1139
+ msgstr "Descrizione"
1140
+
1141
+ msgid "Options"
1142
+ msgstr "Opzioni"
1143
+
1144
+ msgid "Label"
1145
+ msgstr "Etichetta"
1146
+
1147
+ msgid "To translate Extra Options strings please save %s and go to the <b><a href=\"%s\">String Translation interface</a></b>"
1148
+ msgstr "Per tradurre le stringhe delle Opzioni aggiuntive, salva %s e vai all'<b><a href=\"%s\">Interfaccia di traduzione stringhe</a></b>"
1149
+
1150
+ msgid "Language"
1151
+ msgstr "Lingua"
1152
+
1153
+ msgid "Translation of"
1154
+ msgstr "Traduzione di"
1155
+
1156
+ msgid "Subscription Price"
1157
+ msgstr "Prezzo dell'abbonamento"
1158
+
1159
+ msgid "Sign-up Fee"
1160
+ msgstr "Tariffa di registrazione"
1161
+
1162
+ msgid "Calculate costs in other currencies automatically"
1163
+ msgstr "Calcola i costi in altre valute automaticamente"
1164
+
1165
+ msgid "Set costs in other currencies manually"
1166
+ msgstr "Imposta i costi in altre valute manualmente"
1167
+
1168
+ msgid "This is the cost per block booked. All other costs (for resources and persons) are added to this."
1169
+ msgstr "Questo è il costo per blocco prenotato. A quest'ultimo saranno aggiunti tutti gli altri costi (relativi a risorse e persone)."
1170
+
1171
+ msgid "Product tabs"
1172
+ msgstr "Schede dei prodotti"
1173
+
1174
+ msgid "Heading"
1175
+ msgstr "Titolo"
1176
+
1177
+ msgid "Tour Data"
1178
+ msgstr "Dati del tour"
1179
+
1180
+ msgid "Content"
1181
+ msgstr "Contenuto"
1182
+
1183
+ msgid "Composite Products"
1184
+ msgstr "Prodotti compositi"
1185
+
1186
+ msgid "Product Bundles"
1187
+ msgstr "Raggruppamenti prodotto"
1188
+
1189
+ msgid "One-off cost for the booking as a whole."
1190
+ msgstr "Costo una tantum totale della prenotazione."
1191
+
1192
+ msgid "The cost is displayed to the user on the frontend. Leave blank to have it calculated for you. If a booking has varying costs, this will be prefixed with the word \"from:\"."
1193
+ msgstr "Il costo sarà visibile all'utente nel frontend. Lascia il campo in bianco affinché quest'ultimo venga calcolato automaticamente. Se una prenotazione ha costi variabili, il costo sarà preceduto dalla parola \"da:\"."
1194
+
1195
+ msgid "Bookings"
1196
+ msgstr "Prenotazioni"
1197
+
1198
+ msgid "Resources Label"
1199
+ msgstr "Etichetta delle risorse"
1200
+
1201
+ msgid "Resources"
1202
+ msgstr "Risorse"
1203
+
1204
+ msgid "Person Types"
1205
+ msgstr "Tipi di persone"
1206
+
1207
+ msgid "Person Type Name"
1208
+ msgstr "Nome del tipo di persona"
1209
+
1210
+ msgid "Resources label"
1211
+ msgstr "Etichetta risorse"
1212
+
1213
+ msgid "Booking currency"
1214
+ msgstr "Valuta di prenotazione"
locale/woocommerce-multilingual-ja.po ADDED
@@ -0,0 +1,1214 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # This file was generated by WPML
2
+ # WPML is a WordPress plugin that can turn any WordPress site into a full featured multilingual content management system.
3
+ # https://wpml.org
4
+ msgid ""
5
+ msgstr "Content-Type: text/plain; charset=utf-8\nContent-Transfer-Encoding: 8bit\nProject-Id-Version:WPML_EXPORT\nPOT-Creation-Date: \nPO-Revision-Date: \nLast-Translator: \nLanguage-Team: \nLanguage:en\nMIME-Version: 1.0\n"
6
+
7
+ msgid "Introduction"
8
+ msgstr "はじめに"
9
+
10
+ msgid "Store Pages"
11
+ msgstr "ストアページ"
12
+
13
+ msgid "Global Attributes"
14
+ msgstr "グローバル属性"
15
+
16
+ msgid "Multiple Currencies"
17
+ msgstr "複数通貨"
18
+
19
+ msgid "Translation Interface"
20
+ msgstr "翻訳インターフェース"
21
+
22
+ msgid "Ready!"
23
+ msgstr "用意!"
24
+
25
+ msgid "Welcome to %sWooCommerce Multilingual!%s Please take a moment to configure the main settings and then you are ready to start translating your products."
26
+ msgstr ""
27
+
28
+ msgid "Action failed. Please refresh the page and retry."
29
+ msgstr "操作に失敗しました。ページを更新し、再試行してください。"
30
+
31
+ msgid "Cheatin&#8217; huh?"
32
+ msgstr "ズルしてます&#8217; ね?"
33
+
34
+ msgid "Run the Setup Wizard"
35
+ msgstr "セットアップウィザード実行"
36
+
37
+ msgid "Skip Setup"
38
+ msgstr "設定をスキップ"
39
+
40
+ msgid "WooCommerce Multilingual &rsaquo; Setup Wizard"
41
+ msgstr "WooCommerce Multilingual &rsaquo; セットアップウィザード"
42
+
43
+ msgid "WooCommerce Multilingual"
44
+ msgstr "WooCommerce Multilingual"
45
+
46
+ msgid "How to translate products"
47
+ msgstr "製品の翻訳方法"
48
+
49
+ msgid "Quick edit is disabled for product translations. It's recommended to use the %s for editing products translations. %s"
50
+ msgstr "製品翻訳にはクイック編集が無効です。製品の翻訳の編集には %sを使用することをお薦めします。 %s"
51
+
52
+ msgid "WooCommerce Multilingual products editor"
53
+ msgstr "WooCommerce Multilingual 製品エディター"
54
+
55
+ msgid "Edit this product translation"
56
+ msgstr "この製品翻訳を編集する"
57
+
58
+ msgid "How to translate attributes"
59
+ msgstr "属性の翻訳方法"
60
+
61
+ msgid "How to translate product categories"
62
+ msgstr "製品カテゴリーの翻訳方法"
63
+
64
+ msgid "The recommended way to translate WooCommerce products is using the\n %sWooCommerce Multilingual products translation%s page.\n Please use this page only for translating elements that are not available in the WooCommerce Multilingual products translation table."
65
+ msgstr ""
66
+
67
+ msgid "In order to edit custom attributes you need to use the <a href=\"%s\">custom product translation editor</a>"
68
+ msgstr "カスタム属性を編集するには、 <a href=\"%s\">カスタム製品翻訳エディター</a>を使用する必要があります。"
69
+
70
+ msgid "You are using the same value as for the regular category base. This is known to create conflicts resulting in urls not working properly."
71
+ msgstr "通常のカテゴリーベースと同じ値を使用しています。これにより競合が起こり、URLが適切に作動しなくなります。"
72
+
73
+ msgid "translations"
74
+ msgstr "翻訳"
75
+
76
+ msgid "product"
77
+ msgstr "製品"
78
+
79
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">WPML</a> versions prior %s."
80
+ msgstr "WooCommerce Multilingual が有効になっていますが、使用できません。%sより以前の<a href=\"%s\">WPML</a>バージョンと互換性がありません。"
81
+
82
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">Woocommerce</a> versions prior %s."
83
+ msgstr "WooCommerce Multilingual が有効ですが、適切に動作しません。これは<a href=\"%s\">Woocommerce</a>%s以前のバージョンに対応しません。"
84
+
85
+ msgid "You are using WooCommerce Multilingual %s. This version includes an important UI redesign for the configuration screens and it requires <a href=\"%s\">WPML %s</a> or higher. Everything still works on the front end now but, in order to configure options for WooCommerce Multilingual, you need to upgrade WPML."
86
+ msgstr "WooCommerce Multilingual %sをご使用中です。このバージョンは設定画面に重要なUI再設計を含み、 <a href=\"%s\">WPML %s</a> 以降を必要とします。フロントエンドではすべてが有効ですが、WooCommerce Multilingualのオプションを設定するには、WPMLをアップグレードする必要があります。"
87
+
88
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">WPML Translation Management</a> versions prior %s."
89
+ msgstr "WooCommerce Multilingual が有効になっていますが、使用できません。 %sより以前の<a href=\"%s\">WPML 翻訳管理</a>バージョンと互換性がありません。"
90
+
91
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">WPML String Translation</a> versions prior %s."
92
+ msgstr "WooCommerce Multilingual が有効になっていますが、使用できません。 %sより以前の<a href=\"%s\">WPMLストリング翻訳</a>バージョンと互換性がありません。"
93
+
94
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">WPML Media</a> versions prior %s."
95
+ msgstr "WooCommerce Multilingual が有効になっていますが、使用できません。 %sより以前の<a href=\"%s\">WPMLメディア</a>バージョンと互換性がありません。"
96
+
97
+ msgid "and"
98
+ msgstr "と"
99
+
100
+ msgid "WooCommerce Multilingual is enabled but not effective. It requires %s in order to work."
101
+ msgstr "WooCommerce Multilingualが有効ですが、作動していません。作動するには%sが必要です。"
102
+
103
+ msgid "Permalink settings"
104
+ msgstr "パーマリンク設定"
105
+
106
+ msgid "Configure products slug translation"
107
+ msgstr "製品スラグ翻訳を設定する"
108
+
109
+ msgid "If you want different slugs for shop pages (%s/%s), you need to disable the shop prefix for products in <a href=\"%s\">WooCommerce Settings</a>"
110
+ msgstr "ショップページに違うスラグが必要な場合 (%s/%s)、<a href=\"%s\">WooCommerce Settings</a>でショッププレフィックスを無効にする必要があります"
111
+
112
+ msgid "Finished! You can visit the %sstrings translation%s screen to translate the strings now."
113
+ msgstr "完了!%sストリング翻訳%s画面に移動し、ストリング翻訳を開始できます。"
114
+
115
+ msgid "wpml-config.xml file missing from WooCommerce Multilingual folder."
116
+ msgstr "WooCommerce Multilingual フォルダからwpml-config.xml ファイルが紛失しています"
117
+
118
+ msgid "Custom field %s configuration from wpml-config.xml file was altered!"
119
+ msgstr "wpml-config.xml ファイルのカスタムフィールド%s 設定は変更されました!"
120
+
121
+ msgid "Custom type %s configuration from wpml-config.xml file was altered!"
122
+ msgstr "wpml-config.xml ファイルのカスタムタイプ%s 設定は変更されました!"
123
+
124
+ msgid "Custom taxonomy %s configuration from wpml-config.xml file was altered!"
125
+ msgstr "wpml-config.xml ファイルのカスタムタクゾノミー%s 設定は変更されました!"
126
+
127
+ msgid "Upgrade WPML"
128
+ msgstr "WPMLをアップグレードする"
129
+
130
+ msgid "Invalid language parameter: %s"
131
+ msgstr "無効な言語パラメーター: %s"
132
+
133
+ msgid "Source product id not found: %s"
134
+ msgstr "ソース製品IDが見つかりません: %s"
135
+
136
+ msgid "Product Base"
137
+ msgstr "製品ベース"
138
+
139
+ msgid "Product Tag Base"
140
+ msgstr "製品タグベース"
141
+
142
+ msgid "Product Category Base"
143
+ msgstr "製品カテゴリーベース"
144
+
145
+ msgid "Product Attribute Base"
146
+ msgstr "製品属性ベース"
147
+
148
+ msgid "Endpoint: %s"
149
+ msgstr "終点: %s"
150
+
151
+ msgid "product-category"
152
+ msgstr "製品-カテゴリー"
153
+
154
+ msgid "product-tag"
155
+ msgstr "製品-タグ"
156
+
157
+ msgid "Original language"
158
+ msgstr "原語"
159
+
160
+ msgid "Take this and edit"
161
+ msgstr "引き受けて編集する"
162
+
163
+ msgid "Add translation"
164
+ msgstr "翻訳を追加する"
165
+
166
+ msgid "Update translation"
167
+ msgstr "翻訳をアップデート"
168
+
169
+ msgid "Finish translating"
170
+ msgstr "翻訳を終了する"
171
+
172
+ msgid "Edit translation"
173
+ msgstr "翻訳を編集"
174
+
175
+ msgid "Edit this item inline"
176
+ msgstr "このアイテムインラインを編集する"
177
+
178
+ msgid "Quick Edit"
179
+ msgstr "クイック編集"
180
+
181
+ msgid "Translation in progress"
182
+ msgstr "翻訳進行中"
183
+
184
+ msgid "Invalid nonce"
185
+ msgstr "無効なnonce"
186
+
187
+ msgid "Currency - no orders found"
188
+ msgstr "通貨 - 順番がありません"
189
+
190
+ msgid "Currencies order updated"
191
+ msgstr "通貨の順番が更新されました"
192
+
193
+ msgid "Currency switcher"
194
+ msgstr "通貨スイッチャー"
195
+
196
+ msgid "Configure options"
197
+ msgstr "オプション設定"
198
+
199
+ msgid "Settings saved!"
200
+ msgstr "設定が保存されました!"
201
+
202
+ msgid "Add new currency"
203
+ msgstr "新しい通貨を追加する"
204
+
205
+ msgid "Update currency"
206
+ msgstr "通貨を更新する"
207
+
208
+ msgid "Update settings for %s"
209
+ msgstr "%sの設定を更新する"
210
+
211
+ msgid "The default currency was changed. In order to show accurate prices in all currencies, you need to update the exchange rates under the %sMulti-currency%s configuration."
212
+ msgstr "デフォルト通貨が変更されました。全ての通貨に正確な価格を表示するには、%sMulti-currency%s 設定で為替レートを更新する必要があります。"
213
+
214
+ msgid "All the products will be removed from the current order in order to change the currency"
215
+ msgstr "通貨を変更するには、現在の注文から全ての製品を取り除いてください"
216
+
217
+ msgid "Show all currencies"
218
+ msgstr "全ての通貨を表示する"
219
+
220
+ msgid "Order currency:"
221
+ msgstr "通貨を順番に並べる:"
222
+
223
+ msgid "Cart"
224
+ msgstr "カート"
225
+
226
+ msgid "Checkout"
227
+ msgstr "チェックアウト"
228
+
229
+ msgid "Checkout &rarr; Pay"
230
+ msgstr "チェックアウト &rarr; お支払い"
231
+
232
+ msgid "Order Received"
233
+ msgstr "注文を受け取りました"
234
+
235
+ msgid "My Account"
236
+ msgstr "私のアカウント"
237
+
238
+ msgid "Change Password"
239
+ msgstr "パスワード変更"
240
+
241
+ msgid "Edit My Address"
242
+ msgstr "私のアドレスを編集"
243
+
244
+ msgid "Logout"
245
+ msgstr "ログアウト"
246
+
247
+ msgid "Lost Password"
248
+ msgstr "紛失したパスワード"
249
+
250
+ msgid "View Order"
251
+ msgstr "注文を閲覧"
252
+
253
+ msgid "Shop"
254
+ msgstr "ショップ"
255
+
256
+ msgid "All the products will be removed from the current order in order to change the language"
257
+ msgstr "言語を変更するために、現在の順番からすべての製品が取り除かれます"
258
+
259
+ msgid "Order language:"
260
+ msgstr "注文言語:"
261
+
262
+ msgid "Choose a file"
263
+ msgstr "ファイルを選択"
264
+
265
+ msgid "At least one of these fields is required: title, content or excerpt"
266
+ msgstr "少なくとも3フィールドのうちの1つが必要です:タイトル、コンテンツまたは抜粋"
267
+
268
+ msgid "This translation job will no longer be assigned to you. Other translators will be able take it and continue the translation."
269
+ msgstr "あなたは現在この翻訳ジョブに指名されていません。他のトランスレーターが引き受け、翻訳を続けることができます。"
270
+
271
+ msgid "This field is locked for editing because WPML will copy its value from the original language."
272
+ msgstr "このファイルはWPMLが言語から値をコピーするため、編集不可です。"
273
+
274
+ msgid "This is a translation of %s. Some of the fields are not editable. It's recommended to use the %s for translating products."
275
+ msgstr "これは%sの翻訳です。フィールドの幾つかは編集不可能です。製品の翻訳には%s を使用することをお薦めします。"
276
+
277
+ msgid "WooCommerce Multilingual products translator"
278
+ msgstr "WooCommerce Multilingual 製品トランスレーター"
279
+
280
+ msgid "Looks like you are upgrading from a previous version of WooCommerce Multilingual. Would you like to automatically create translated variations and images?"
281
+ msgstr "以前のWooCommerce Multilingual が更新されたようです。翻訳されたバリエーションと画像を自動的に作成しますか?"
282
+
283
+ msgid "Yes, go to the troubleshooting page"
284
+ msgstr "はい、トラブルシューティングページへ移動します"
285
+
286
+ msgid "No - dismiss"
287
+ msgstr "いいえ- 無視します"
288
+
289
+ msgid "You've successfully installed %sWooCommerce Multilingual%s. Would you like to see a quick overview?"
290
+ msgstr "%sWooCommerce Multilingual%sのインストールに成功しました。クイック概略を表示しますか?"
291
+
292
+ msgid "Learn how to turn your e-commerce site multilingual"
293
+ msgstr "Eコマースサイトを多言語にする方法を学ぶ"
294
+
295
+ msgid "Dismiss"
296
+ msgstr "無視する"
297
+
298
+ msgid "To translate %s please use the %s translation%s page, inside the %sWooCommerce Multilingual admin%s."
299
+ msgstr "%s を翻訳するには、%sWooCommerce Multilingual admin%s内の %s翻訳%s ページを使用してください。"
300
+
301
+ msgid "%s do not require translation."
302
+ msgstr "%s は翻訳を必要としません。"
303
+
304
+ msgid "Include to translation"
305
+ msgstr "翻訳に含む"
306
+
307
+ msgid "%d %s are missing translations."
308
+ msgstr "%d %s は翻訳がありません。"
309
+
310
+ msgid "Translate %s"
311
+ msgstr "%sを翻訳"
312
+
313
+ msgid "Exclude from translation"
314
+ msgstr "翻訳から除外する"
315
+
316
+ msgid "All %s are translated."
317
+ msgstr "すべての%s は翻訳されました。"
318
+
319
+ msgid "Currently, there are %s variations that need to be created."
320
+ msgstr "現在、 %s バリエーションを作成する必要があります。"
321
+
322
+ msgid "%d products left"
323
+ msgstr "あと%d 製品あります"
324
+
325
+ msgid "Synchronization complete!"
326
+ msgstr "同期完了!"
327
+
328
+ msgid "Invalid taxonomy %s"
329
+ msgstr "無効なタクゾノミー %s"
330
+
331
+ msgid "Some translated %s have different %s assignments."
332
+ msgstr "幾つかの翻訳された %s は違う %s を指定されています。"
333
+
334
+ msgid "Update %s for all translated %s"
335
+ msgstr "%sを更新-全ての翻訳された %s 用"
336
+
337
+ msgid "All %s have the same %s assignments."
338
+ msgstr "全ての %s は同じ %s を指定されています。"
339
+
340
+ msgid "Successfully updated %s for all translated %s."
341
+ msgstr "%sが無事更新されました-全ての翻訳された %s用。"
342
+
343
+ msgid "Synchronize attributes and update product variations"
344
+ msgstr "属性を同期し、製品バリエーションを更新する"
345
+
346
+ msgid "Image"
347
+ msgstr "画像"
348
+
349
+ msgid "Product"
350
+ msgstr "製品"
351
+
352
+ msgid "Type"
353
+ msgstr "タイプ"
354
+
355
+ msgid "Date"
356
+ msgstr "日付"
357
+
358
+ msgid "Categories"
359
+ msgstr "カテゴリー"
360
+
361
+ msgid "No products found"
362
+ msgstr "製品がありません"
363
+
364
+ msgid "Draft"
365
+ msgstr "下書き"
366
+
367
+ msgid "Private"
368
+ msgstr "プライベート"
369
+
370
+ msgid "Pending"
371
+ msgstr ""
372
+
373
+ msgid "Scheduled"
374
+ msgstr "スケジュール済み"
375
+
376
+ msgid "Parent product: %s"
377
+ msgstr "親製品: %s"
378
+
379
+ msgid "Edit this item"
380
+ msgstr "このアイテムを編集する"
381
+
382
+ msgid "Edit"
383
+ msgstr "編集"
384
+
385
+ msgid "View \"%s\""
386
+ msgstr "\"%s\"を表示する"
387
+
388
+ msgid "View"
389
+ msgstr "表示"
390
+
391
+ msgid "Published"
392
+ msgstr "公開済み"
393
+
394
+ msgid "Last Modified"
395
+ msgstr "最後の変更"
396
+
397
+ msgid "All languages"
398
+ msgstr "全言語"
399
+
400
+ msgid "All categories"
401
+ msgstr "全カテゴリー"
402
+
403
+ msgid "All translation statuses"
404
+ msgstr "全翻訳の状況"
405
+
406
+ msgid "Not translated or needs updating"
407
+ msgstr "翻訳されていません、または更新の必要がありません"
408
+
409
+ msgid "Needs updating"
410
+ msgstr "更新が必要"
411
+
412
+ msgid "Translation complete"
413
+ msgstr "翻訳完了"
414
+
415
+ msgid "All statuses"
416
+ msgstr "全てのステータス"
417
+
418
+ msgid "Filter"
419
+ msgstr "フィルター"
420
+
421
+ msgid "Reset"
422
+ msgstr "リセット"
423
+
424
+ msgid "Search"
425
+ msgstr "検索"
426
+
427
+ msgid "%d items"
428
+ msgstr "%d 項目"
429
+
430
+ msgid "Go to the first page"
431
+ msgstr "最初のページに移動"
432
+
433
+ msgid "Go to the previous page"
434
+ msgstr "前のページに移動"
435
+
436
+ msgid "Select Page"
437
+ msgstr "ページ選択"
438
+
439
+ msgid "Current page"
440
+ msgstr "現在のページ"
441
+
442
+ msgid "of"
443
+ msgstr "の"
444
+
445
+ msgid "Go to the next page"
446
+ msgstr "次のページに移動"
447
+
448
+ msgid "Go to the last page"
449
+ msgstr "最後のページに移動"
450
+
451
+ msgid "Translatable?"
452
+ msgstr "翻訳可能?"
453
+
454
+ msgid "Enable this if you want to translate attribute values with Woocommerce Multilingual"
455
+ msgstr "Woocommerce Multilingualで属性値を翻訳するには、これを有効にしてください "
456
+
457
+ msgid "Existing translations and variations associated will be deleted."
458
+ msgstr "既存の翻訳と関連バリエーションが削除されます。"
459
+
460
+ msgid "Product Translation Interface"
461
+ msgstr "製品翻訳インターフェース"
462
+
463
+ msgid "The recommended way is using the WPML Translation Editor. It is streamlined for making the translation process much easier while also providing a much better integration with various WooCommerce extensions."
464
+ msgstr "おすすめの方法はWPML翻訳エディターを使用することです。翻訳プロセスがとても簡単になり、さまざまなWooCommerce拡張機能に良好に統合します。"
465
+
466
+ msgid "WPML Translation Editor"
467
+ msgstr "WPML 翻訳エディター"
468
+
469
+ msgid "Native WooCommerce product editing screen"
470
+ msgstr "ネイティブ WooCommerce 製品編集画面"
471
+
472
+ msgid "Products synchronization"
473
+ msgstr "製品の同期"
474
+
475
+ msgid "Configure specific product properties that should be synced to translations."
476
+ msgstr "翻訳に同期される製品のプロパティを設定する"
477
+
478
+ msgid "Sync publishing date for translated products."
479
+ msgstr "翻訳された製品の公開日を同期する。"
480
+
481
+ msgid "Sync products and product taxonomies order."
482
+ msgstr "製品と製品タクゾノミー順を同期する。"
483
+
484
+ msgid "Products Download Files"
485
+ msgstr "製品ダウンロードファイル"
486
+
487
+ msgid "If you are using downloadable products, you can choose to have their paths\n synchronized, or seperate for each language."
488
+ msgstr "ダウンロード可能な製品をご使用なら、これらのパスを\n同期する、または言語別に分離することを選択できます。"
489
+
490
+ msgid "Use the same files for translations"
491
+ msgstr "翻訳に同じファイルを使用する"
492
+
493
+ msgid "Add separate download files for translations"
494
+ msgstr "翻訳に別のダウンロードファイルを追加する"
495
+
496
+ msgid "Save changes"
497
+ msgstr "変更を保存する"
498
+
499
+ msgid "Troubleshooting page"
500
+ msgstr "トラブルシューティングページ"
501
+
502
+ msgid "Update Translation"
503
+ msgstr "翻訳をアップデートする"
504
+
505
+ msgid "Hide This Message"
506
+ msgstr "このメッセージを非表示にする"
507
+
508
+ msgid "<strong>WooCommerce Translation Available</strong> &#8211; Install or update your <code>%s</code> translations to version <code>%s</code>."
509
+ msgstr "<strong>WooCommerce 翻訳があります</strong> &#8211; <code>%s</code> 翻訳を<code>%s</code>バージョンにインストールするか、アップデートしてください。."
510
+
511
+ msgid "This will automatically generate variations for translated products corresponding to recently translated attributes."
512
+ msgstr "最近翻訳された属性に対し、翻訳された製品バリエーションを自動的に発生します。"
513
+
514
+ msgid "Synchronize %s assignment in content"
515
+ msgstr "コンテンツ内の %s 指定を同期"
516
+
517
+ msgid "This action lets you automatically apply the %s taxonomy to your content in different languages. It will scan the original content and apply the same taxonomy to translated content."
518
+ msgstr "このアクションはあなたのコンテンツの色々な言語に%sタクゾノミーを自動的に適用します。元コンテンツをスキャンし、同じタクゾノミーを翻訳コンテンツに適用します。"
519
+
520
+ msgid "You have untranslated terms!"
521
+ msgstr "未翻訳のタームがあります!"
522
+
523
+ msgid "Select currency"
524
+ msgstr "通貨を選択する"
525
+
526
+ msgid "Exchange Rate"
527
+ msgstr "為替率"
528
+
529
+ msgid "Only numeric"
530
+ msgstr "数値のみ"
531
+
532
+ msgid "Set on %s"
533
+ msgstr "%sに設定"
534
+
535
+ msgid "Currency Preview"
536
+ msgstr "通貨プレビュー"
537
+
538
+ msgid "Currency Position"
539
+ msgstr "通貨ポジション"
540
+
541
+ msgid "Left"
542
+ msgstr "左"
543
+
544
+ msgid "Right"
545
+ msgstr "右"
546
+
547
+ msgid "Left with space"
548
+ msgstr "余白付き左側"
549
+
550
+ msgid "Right with space"
551
+ msgstr "余白付き右側"
552
+
553
+ msgid "Thousand Separator"
554
+ msgstr "千区切り"
555
+
556
+ msgid "Decimal Separator"
557
+ msgstr "小数点区切り"
558
+
559
+ msgid "Number of Decimals"
560
+ msgstr "少数桁"
561
+
562
+ msgid "Rounding to the nearest integer"
563
+ msgstr "一番近い整数に丸める"
564
+
565
+ msgid "Disabled"
566
+ msgstr "無効済み"
567
+
568
+ msgid "Up"
569
+ msgstr "上"
570
+
571
+ msgid "Down"
572
+ msgstr "下"
573
+
574
+ msgid "Nearest"
575
+ msgstr "最も近い"
576
+
577
+ msgid "Increment for nearest integer"
578
+ msgstr "一番近い整数に増加する"
579
+
580
+ msgid "Autosubtract amount"
581
+ msgstr "自動減算額"
582
+
583
+ msgid "Cancel"
584
+ msgstr "キャンセル"
585
+
586
+ msgid "Save"
587
+ msgstr "保存"
588
+
589
+ msgid "Products"
590
+ msgstr "製品"
591
+
592
+ msgid "Tags"
593
+ msgstr "タグ"
594
+
595
+ msgid "Attributes"
596
+ msgstr "属性"
597
+
598
+ msgid "Shipping Classes"
599
+ msgstr "配送クラス"
600
+
601
+ msgid "Settings"
602
+ msgstr "設定"
603
+
604
+ msgid "Multi-currency"
605
+ msgstr "複数通貨"
606
+
607
+ msgid "Store URLs"
608
+ msgstr "ストアURL"
609
+
610
+ msgid "Status"
611
+ msgstr "状況"
612
+
613
+ msgid "Troubleshooting"
614
+ msgstr "トラブルシューティング"
615
+
616
+ msgid "Thank you for using %sWooCommerce Multilingual%s! You can express your love and\n support by %s rating our plugin and saying that %sit works%s for you."
617
+ msgstr "%sWooCommerce Multilingual%sをご利用いただき、ありがとうございます! 当社のプラグインに対して\n%s評価と%s順調に動作する%sというコメントでご支援いただければ幸いです。"
618
+
619
+ msgid "Hide"
620
+ msgstr "非表示"
621
+
622
+ msgid "Loading ..."
623
+ msgstr "読み込み中です..."
624
+
625
+ msgid "Regular Price"
626
+ msgstr "通常価格"
627
+
628
+ msgid "Sale Price"
629
+ msgstr "セールス価格"
630
+
631
+ msgid "Multi-currency is enabled but no secondary currencies have been set. %sAdd secondary currencies%s."
632
+ msgstr ""
633
+
634
+ msgid "Calculate prices in other currencies automatically"
635
+ msgstr "自動的に他の通貨で価格を計算します"
636
+
637
+ msgid "Click to see the prices in the other currencies as they are currently shown on the front end."
638
+ msgstr "フロントエンドで表示されている他通貨での価格を見るにはクリックしてください。"
639
+
640
+ msgid "Show"
641
+ msgstr "表示"
642
+
643
+ msgid "Set prices in other currencies manually"
644
+ msgstr "手動で他の通貨の価格を設定する"
645
+
646
+ msgid "Enter prices in other currencies"
647
+ msgstr "他の通貨で価格を入力する"
648
+
649
+ msgid "Hide prices in other currencies"
650
+ msgstr "他通貨の価格を非表示にする"
651
+
652
+ msgid "Determined automatically based on exchange rate"
653
+ msgstr "為替レートにより自動的に決定する"
654
+
655
+ msgid "Schedule"
656
+ msgstr "スケジュール"
657
+
658
+ msgid "Same as default currency"
659
+ msgstr "初期設定通貨と同じ"
660
+
661
+ msgid "Set dates"
662
+ msgstr "日付を設定"
663
+
664
+ msgid "Collapse"
665
+ msgstr "折りたたむ"
666
+
667
+ msgid "From&hellip;"
668
+ msgstr "From&hellip;"
669
+
670
+ msgid "To&hellip;"
671
+ msgstr "To&hellip;"
672
+
673
+ msgid "Please enter in a value less than the regular price"
674
+ msgstr "通常価格以下の値を入力してください"
675
+
676
+ msgid "Required plugins"
677
+ msgstr "必要なプラグイン"
678
+
679
+ msgid "Plugins Status"
680
+ msgstr "プラグイン状況"
681
+
682
+ msgid "WooCommerce Multilingual depends on several plugins to work. If any required plugin is missing, you should install and activate it."
683
+ msgstr "WooCommerce Multilingual は幾つかのプラグインにより作動します。必要なプラグインがない場合、インストールし、認証する必要があります。"
684
+
685
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">WPML</a> versions prior 2.0.5."
686
+ msgstr "WooCommerce Multilingual が有効ですが、作動しません。2.0.5版以前の <a href=\"%s\">WPML</a> と互換性がありません。"
687
+
688
+ msgid "Update WPML"
689
+ msgstr "WPMLを更新する"
690
+
691
+ msgid "Get WPML"
692
+ msgstr "WPMLを入手"
693
+
694
+ msgid "Get WPML Media"
695
+ msgstr "WPML メディアを入手"
696
+
697
+ msgid "Get WPML Translation Management"
698
+ msgstr "WPML 翻訳管理を入手"
699
+
700
+ msgid "Get WPML String Translation"
701
+ msgstr "WPML ストリング翻訳を入手"
702
+
703
+ msgid "%s is installed and active."
704
+ msgstr "%s がインストールされ、有効です。"
705
+
706
+ msgid "%s is set up."
707
+ msgstr "%s が設定されました。"
708
+
709
+ msgid "%s is not set up."
710
+ msgstr "%s が設定されました。"
711
+
712
+ msgid "%s is either not installed or not active."
713
+ msgstr "%s がインストールされていないか有効ではありません。"
714
+
715
+ msgid "%1$s is installed, but with incorrect version. You need %1$s %2$s or higher. "
716
+ msgstr "インストールされた%1$s バージョンは正しくありません。 %1$s %2$s 以降が必要です。"
717
+
718
+ msgid "Download WooCommerce"
719
+ msgstr "WooCommerceをダウンロード"
720
+
721
+ msgid "The WordPress Multilingual Plugin"
722
+ msgstr "WordPress 多言語プラグイン"
723
+
724
+ msgid "This page allows you to translate all strings that are being used by WooCommerce in building different type of urls. Translating them enables you to have fully localized urls that match the language of the pages."
725
+ msgstr "このページを使用して異なるタイプのURLが作成されたWooCommerceの全てのストリングを翻訳できます。これらを翻訳することで、ページ言語にマッチするURLを完全にローカライズできます。"
726
+
727
+ msgid "You can enter or edit your default values on the %sPermalinks settings%s page or, for the endpoints, on the WooCommerce %sAccount settings%s page."
728
+ msgstr "デフォルト値は%sパーマリンク設定%s ページ上で入力/編集できます。またエンドポイントはWooCommerce %sアカウント設定%s ページ上で入力/編集できます。"
729
+
730
+ msgid "permalinks settings"
731
+ msgstr "パーマリンク設定"
732
+
733
+ msgid "Account settings"
734
+ msgstr "アカウント設定"
735
+
736
+ msgid "Slug type"
737
+ msgstr "スラグタイプ"
738
+
739
+ msgid "Original Slug"
740
+ msgstr "オリジナルスラグ"
741
+
742
+ msgid "Shop page"
743
+ msgstr "ストアページ"
744
+
745
+ msgid "Product base"
746
+ msgstr "製品ベース"
747
+
748
+ msgid "Product category base"
749
+ msgstr "製品カテゴリーベース"
750
+
751
+ msgid "Product tag base"
752
+ msgstr "製品タグベース"
753
+
754
+ msgid "Product attribute base"
755
+ msgstr "製品属性ベース"
756
+
757
+ msgid "Original"
758
+ msgstr "オリジナル"
759
+
760
+ msgid "Translation to"
761
+ msgstr "次言語への翻訳"
762
+
763
+ msgid "Product Shop Base"
764
+ msgstr "製品ストアベース"
765
+
766
+ msgid "Welcome to WooCommerce Multilingual!"
767
+ msgstr "WooCommerce Multilingualにようこそ!"
768
+
769
+ msgid "Configure the multilingual support for your e-commerce site in just a couple of minutes."
770
+ msgstr ""
771
+
772
+ msgid "By default, the products are translatable just like product categories, product tags and attributes. So you can start translating these right away."
773
+ msgstr "製品はデフォルトにより製品カタログ、製品タグ、属性と同様に翻訳可能です。これらの翻訳を直ちに開始できます。"
774
+
775
+ msgid "You can configure, however, which attributes you want to translate, install the translated shop pages or enable the multi-currency mode."
776
+ msgstr "どの属性を翻訳するか設定し、翻訳されたショップページをインストールし、複数通貨モードを有効にすることができます。"
777
+
778
+ msgid "Start"
779
+ msgstr "スタート"
780
+
781
+ msgid "No, thanks. I'll do it later."
782
+ msgstr "いいえ結構です。後にします。"
783
+
784
+ msgid "Select translatable attributes"
785
+ msgstr "翻訳可能な属性を選択してください"
786
+
787
+ msgid "There are no attributes defined"
788
+ msgstr "定義された属性がありません"
789
+
790
+ msgid "Continue"
791
+ msgstr "続ける"
792
+
793
+ msgid "Later"
794
+ msgstr "後で"
795
+
796
+ msgid "One or more WooCommerce pages have not been created"
797
+ msgstr "1以上の WooCommerce ページが作成されていません"
798
+
799
+ msgid "Install missing WooCommerce pages and create translations."
800
+ msgstr "紛失しているWooCommerce ページをインストールし、翻訳を作成。"
801
+
802
+ msgid "Translate Store Pages"
803
+ msgstr "ストアページを翻訳する"
804
+
805
+ msgid "All store pages must be translated in the languages configured on the site."
806
+ msgstr "全てのストアページをサイトの設定言語に翻訳する必要があります。"
807
+
808
+ msgid "Select the translation interface"
809
+ msgstr "翻訳インターフェースを選択する"
810
+
811
+ msgid "Enable multiple currencies"
812
+ msgstr "複数通貨を有効にする"
813
+
814
+ msgid "This will allow you to set prices for products in different currencies. The prices can be determined based on a given exchange rate or set explicitly for specific products."
815
+ msgstr "これにより通貨別に製品価格を設定することができます。価格は所定の為替率または特定の製品に基づいて決定します。"
816
+
817
+ msgid "Enable the multi-currency mode"
818
+ msgstr "複数通貨モードを有効にする"
819
+
820
+ msgid "Further actions that are necessary for making your existing content multilingual, are listed below."
821
+ msgstr "既存コンテンツを他言語にするために必要な操作は下記にリストされています。"
822
+
823
+ msgid "Start translating products"
824
+ msgstr "製品の翻訳を開始する"
825
+
826
+ msgid "Add secondary currencies on the %smulti-currency configuration%s page"
827
+ msgstr " %s複数通貨設定%s ページに第2通貨を追加する"
828
+
829
+ msgid "Translate existing terms for these %sproduct attributes%s: %s"
830
+ msgstr "これらの%s製品属性%sの既存条件を翻訳する: %s"
831
+
832
+ msgid "Translate existing %sproduct categories%s"
833
+ msgstr "既存の%s製品属性%sを翻訳する"
834
+
835
+ msgid "Translate existing %sproduct tags%s"
836
+ msgstr "既存の%s製品タグ%sを翻訳する"
837
+
838
+ msgid "%sAdd missing translations%s for shipping classes"
839
+ msgstr "出荷クラスに%s紛失している翻訳を追加する%s"
840
+
841
+ msgid "Translate %sURL slugs%s to create multilingual store and product urls"
842
+ msgstr "多言語ストアと製品urlsを作成するには%sURL スラグ%s を翻訳してください"
843
+
844
+ msgid "Use custom settings for translations download files"
845
+ msgstr ""
846
+
847
+ msgid "WooCommerce Store Pages"
848
+ msgstr "WooCommerce ストアページ"
849
+
850
+ msgid "To run a multilingual e-commerce site, you need to have the WooCommerce shop pages translated to all the site's languages. Once all the pages are installed you can add the translations for them from this menu."
851
+ msgstr "多言語Eコマースサイトを運営するには、WooCommerceストアページを全てのサイト言語に翻訳する必要があります。全てのページをインストール後、このメニューから翻訳を追加することができます。"
852
+
853
+ msgid "One or more WooCommerce pages have not been created."
854
+ msgstr "1つかそれ以上のWooCommerce ページが作成されていません。"
855
+
856
+ msgid "Install WooCommerce Pages"
857
+ msgstr "WooCommerce ページをインストール"
858
+
859
+ msgid "WooCommerce store pages do not exist for these languages:"
860
+ msgstr "WooCommerce ストアページがこれらの言語に存在しません:"
861
+
862
+ msgid "Create missing translations"
863
+ msgstr "必要な翻訳を作成"
864
+
865
+ msgid "These pages are currently being translated by translators via WPML: "
866
+ msgstr "これらのページは現在WPMLを通して翻訳者によって翻訳されています:"
867
+
868
+ msgid "WooCommerce store pages are translated to all the site's languages."
869
+ msgstr "WooCommerce ストアページはサイトの全言語用に翻訳されました。"
870
+
871
+ msgid "Configuration warnings"
872
+ msgstr "設定警告"
873
+
874
+ msgid "Reporting miscelaneous configuration issues that can make WooCommerce Multilingual not run normally"
875
+ msgstr "WooCommerce Multilingual の正常な作動を妨げる様々な設定問題のレポート"
876
+
877
+ msgid "Your product permalink base is not translated to:"
878
+ msgstr "製品パーマリンクベースが次の言語に翻訳されていません:"
879
+
880
+ msgid "Translate URLs"
881
+ msgstr "URLを翻訳する"
882
+
883
+ msgid "Your site's default language is not English and the strings language is also not English."
884
+ msgstr "サイトのデフォルト言語は英語ではなく、ストリング言語も英語ではありません。"
885
+
886
+ msgid "Running WooCommerce multilingual with default language other than English."
887
+ msgstr "英語ではないデフォルト言語でWooCommerce multilingualを実行中。"
888
+
889
+ msgid "This may cause problems with URLs in different languages."
890
+ msgstr "これは他言語のURLに問題を起こすかもしれません。"
891
+
892
+ msgid "Change default language"
893
+ msgstr "初期設定の言語を変更する"
894
+
895
+ msgid "Your site's default language is not English."
896
+ msgstr "サイトのデフォルト言語は英語ではありません。"
897
+
898
+ msgid "There are some settings that require careful attention."
899
+ msgstr "幾つかの設定に注意が必要です。"
900
+
901
+ msgid "Some settings from the WooCommerce Multilingual wpml-config.xml file have been overwritten."
902
+ msgstr "WooCommerce Multilingual wpml-config.xml ファイルの設定が幾つか上書きされました。"
903
+
904
+ msgid "You should check WPML configuration files added by other plugins or manual settings on the %s section."
905
+ msgstr "他のプラグインまたは%sセクションのマニュアル設定により追加されたWPML設定ファイルをお調べください。"
906
+
907
+ msgid "Multilingual Content Setup"
908
+ msgstr "マルチ言語コンテンツ設定"
909
+
910
+ msgid "Taxonomies missing translations"
911
+ msgstr "タクゾノミーに翻訳がありません"
912
+
913
+ msgid "To run a fully translated site, you should translate all taxonomy terms. Some store elements, such as variations, depend on taxonomy translation."
914
+ msgstr "完全に翻訳されたサイトを運営するには、全てのタクゾノミーのタームを翻訳すべきです。バリエーションなど、特定のストア要素はタクゾノミー翻訳で翻訳されます。"
915
+
916
+ msgid "This taxonomy requires translation."
917
+ msgstr "このタクゾノミーは翻訳を必要とします。"
918
+
919
+ msgid "Include in translation"
920
+ msgstr "翻訳に含む"
921
+
922
+ msgid "This taxonomy does not require translation."
923
+ msgstr "このタクゾノミーは翻訳を必要としません。"
924
+
925
+ msgid "Right now, there are no taxonomy terms needing translation."
926
+ msgstr "現在翻訳が必要なタクゾノミーのタームがありません"
927
+
928
+ msgid "There are no translatable product attributes defined"
929
+ msgstr "翻訳できる製品属性定義がありません"
930
+
931
+ msgid "Select the attribute to translate: "
932
+ msgstr "翻訳する属性を選択してください:"
933
+
934
+ msgid "Please make a backup of your database before you start the synchronization"
935
+ msgstr "同期を開始する前にデータバースのバックアップを作成してください。"
936
+
937
+ msgid "Sync variables products"
938
+ msgstr "製品変数を同期する"
939
+
940
+ msgid "Update products count:"
941
+ msgstr "製品カウントを更新する"
942
+
943
+ msgid "products with variations"
944
+ msgstr "製品バリエーション"
945
+
946
+ msgid "Sync products variations:"
947
+ msgstr "製品バリエーションを同期する"
948
+
949
+ msgid "left"
950
+ msgstr "残量"
951
+
952
+ msgid "Sync products \"gallery images\":"
953
+ msgstr "製品\"ギャラリー画像\"を同期:"
954
+
955
+ msgid "Sync products categories (display type, thumbnail):"
956
+ msgstr "製品カテゴリーを同期する(表示タイプ、サムネイル):"
957
+
958
+ msgid "Duplicate terms ( please select attribute ):"
959
+ msgstr "タームを複製する( 属性を選択してください ):"
960
+
961
+ msgid "none"
962
+ msgstr "なし"
963
+
964
+ msgid "Enable/disable"
965
+ msgstr "有効/無効にする"
966
+
967
+ msgid "Currencies"
968
+ msgstr "通貨"
969
+
970
+ msgid "Add currency"
971
+ msgstr "通貨を追加"
972
+
973
+ msgid "Currency"
974
+ msgstr "通貨"
975
+
976
+ msgid "Rate"
977
+ msgstr "レート"
978
+
979
+ msgid "default"
980
+ msgstr "初期設定"
981
+
982
+ msgid "Default currency"
983
+ msgstr "初期設定通貨"
984
+
985
+ msgid "Switch to this currency when switching language in the front-end"
986
+ msgstr "表示言語に切り替える時、通貨も切り替える"
987
+
988
+ msgid "Keep"
989
+ msgstr "保存"
990
+
991
+ msgid "Delete"
992
+ msgstr "削除"
993
+
994
+ msgid " (%s)"
995
+ msgstr "(%s)"
996
+
997
+ msgid "The multi-currency mode cannot be enabled as a specific currency was not set. Go to the %sWooCommerce settings%s page and select the default currency for your store."
998
+ msgstr "特定通貨が設定されていないため、複数通貨モードを有効にすることができません。%sWooCommerce settings%sページに移動し、ストアのデフォルト通貨を選択してください。"
999
+
1000
+ msgid "Learn more"
1001
+ msgstr "さらに学ぶ"
1002
+
1003
+ msgid "Show only products with custom prices in secondary currencies"
1004
+ msgstr "第2通貨でカスタム価格を表示する製品だけ表示"
1005
+
1006
+ msgid "When this option is on, when you switch to a secondary currency on the front end, only the products with custom prices in that currency are being displayed. Products with prices determined based on the exchange rate are hidden."
1007
+ msgstr "このオプションがオンの時、フロントエンドで第2通貨に切替えられ、表示通貨におけるカスタム価格を持つ製品だけが表示されます。為替レートに基づいて価格が決定される製品は表示されません。"
1008
+
1009
+ msgid "The changes you made will be lost if you navigate away from this page."
1010
+ msgstr "このページから移動すると、変更が失われます。"
1011
+
1012
+ msgid "At least one currency must be enabled for this language!"
1013
+ msgstr "この言語に少なくとも通貨を一つ有効にしてください!"
1014
+
1015
+ msgid "Currency switcher options"
1016
+ msgstr "通貨スイッチャーオプション"
1017
+
1018
+ msgid "Currency switcher style"
1019
+ msgstr "通貨スイッチャースタイル"
1020
+
1021
+ msgid "Currency order"
1022
+ msgstr "通貨順"
1023
+
1024
+ msgid "Available parameters"
1025
+ msgstr "利用可能なパラメーター"
1026
+
1027
+ msgid "Template for currency switcher"
1028
+ msgstr "通貨スイッチャー用のテンプレート"
1029
+
1030
+ msgid "Visibility"
1031
+ msgstr "可視性"
1032
+
1033
+ msgid "Currency switcher preview"
1034
+ msgstr "通貨スイッチャープレビュー"
1035
+
1036
+ msgid "Drop-down menu"
1037
+ msgstr "ドロップダウンメニュー"
1038
+
1039
+ msgid "List of currencies"
1040
+ msgstr "通貨リスト"
1041
+
1042
+ msgid "Vertical"
1043
+ msgstr "垂直"
1044
+
1045
+ msgid "Horizontal"
1046
+ msgstr "水平"
1047
+
1048
+ msgid "Drag the currencies to change their order"
1049
+ msgstr "順番を変更するには通貨をドラッグしてください"
1050
+
1051
+ msgid "%name%, %symbol%, %code%"
1052
+ msgstr "%name%、 %symbol%、%code%"
1053
+
1054
+ msgid "Default: %name% (%symbol%) - %code%"
1055
+ msgstr "初期設定: %name% (%symbol%) - %code%"
1056
+
1057
+ msgid "Show a currency selector on the product page template"
1058
+ msgstr "製品ページテンプレートで通貨セレクターを表示する"
1059
+
1060
+ msgid "To configure how the %sWooCommerce products%s are translated, visit the WooCommerce Multiligual %ssettings%s page."
1061
+ msgstr "%sWooCommerce 製品%sの翻訳方法を設定するには、WooCommerce Multiligual %s設定%s ページをご覧ください。"
1062
+
1063
+ msgid "Title"
1064
+ msgstr "タイトル"
1065
+
1066
+ msgid "Slug"
1067
+ msgstr "スラグ"
1068
+
1069
+ msgid "Content / Description"
1070
+ msgstr "コンテンツ / 内容"
1071
+
1072
+ msgid "Excerpt"
1073
+ msgstr "抜粋"
1074
+
1075
+ msgid "Purchase note"
1076
+ msgstr "購入ノート"
1077
+
1078
+ msgid "Images"
1079
+ msgstr "画像"
1080
+
1081
+ msgid "Custom Product attributes"
1082
+ msgstr "カスタム製品属性"
1083
+
1084
+ msgid "Name"
1085
+ msgstr "名前"
1086
+
1087
+ msgid "Value(s)"
1088
+ msgstr "値"
1089
+
1090
+ msgid "Custom Fields"
1091
+ msgstr "Custom Fields"
1092
+
1093
+ msgid "Variations data"
1094
+ msgstr "バリエーションデータ"
1095
+
1096
+ msgid "Download Files for Variation #%s"
1097
+ msgstr "バリエーション用ダウンロードファイル #%s"
1098
+
1099
+ msgid "Download Files"
1100
+ msgstr "ファイルダウンロード"
1101
+
1102
+ msgid "File URL"
1103
+ msgstr "ファイル URL"
1104
+
1105
+ msgid "Content, title, and excerpt are empty."
1106
+ msgstr "コンテンツ、タイトル、抜粋が空白です。"
1107
+
1108
+ msgid "Search %s"
1109
+ msgstr "%sを検索"
1110
+
1111
+ msgid "All %s"
1112
+ msgstr "全%s"
1113
+
1114
+ msgid "Parent %s"
1115
+ msgstr "初回%s"
1116
+
1117
+ msgid "Parent %s:"
1118
+ msgstr "初回 %s:"
1119
+
1120
+ msgid "Edit %s"
1121
+ msgstr "編集 %s"
1122
+
1123
+ msgid "Update %s"
1124
+ msgstr "%s更新"
1125
+
1126
+ msgid "Add New %s"
1127
+ msgstr "新規%sを追加"
1128
+
1129
+ msgid "New %s"
1130
+ msgstr "新規%s"
1131
+
1132
+ msgid "To translate Add-ons strings please save Add-ons and go to the <b><a href=\"%s\">String Translation interface</a></b>"
1133
+ msgstr "アドオンストリングを翻訳するには、アドオンを保存してから<b><a href=\"%s\">ストリング翻訳インターフェース</a></b>へ移動します"
1134
+
1135
+ msgid "Product Add-ons Group \"%s\""
1136
+ msgstr "製品アドオングループ \"%s\""
1137
+
1138
+ msgid "Description"
1139
+ msgstr "内容"
1140
+
1141
+ msgid "Options"
1142
+ msgstr "オプション"
1143
+
1144
+ msgid "Label"
1145
+ msgstr "ラベル"
1146
+
1147
+ msgid "To translate Extra Options strings please save %s and go to the <b><a href=\"%s\">String Translation interface</a></b>"
1148
+ msgstr "追加オプションのストリングを翻訳するには、%s を保存し、<b><a href=\"%s\">ストリング翻訳インターフェース</a></b>に移動します"
1149
+
1150
+ msgid "Language"
1151
+ msgstr "言語"
1152
+
1153
+ msgid "Translation of"
1154
+ msgstr "次の翻訳"
1155
+
1156
+ msgid "Subscription Price"
1157
+ msgstr "サブスクリプション価格"
1158
+
1159
+ msgid "Sign-up Fee"
1160
+ msgstr "登録料"
1161
+
1162
+ msgid "Calculate costs in other currencies automatically"
1163
+ msgstr "コストが他の通貨で自動的に計算されます"
1164
+
1165
+ msgid "Set costs in other currencies manually"
1166
+ msgstr "手動で他の通貨のコストを設定する"
1167
+
1168
+ msgid "This is the cost per block booked. All other costs (for resources and persons) are added to this."
1169
+ msgstr "これは1ブロック予約当たりのコストです。他のコスト(リソースと人件費など)はこれに加算されます。"
1170
+
1171
+ msgid "Product tabs"
1172
+ msgstr "製品タブ"
1173
+
1174
+ msgid "Heading"
1175
+ msgstr "見出し"
1176
+
1177
+ msgid "Tour Data"
1178
+ msgstr "ツアーデータ"
1179
+
1180
+ msgid "Content"
1181
+ msgstr "コンテンツ"
1182
+
1183
+ msgid "Composite Products"
1184
+ msgstr "複合製品"
1185
+
1186
+ msgid "Product Bundles"
1187
+ msgstr "製品バンドル"
1188
+
1189
+ msgid "One-off cost for the booking as a whole."
1190
+ msgstr "1度のお支払いだけで全てご予約。"
1191
+
1192
+ msgid "The cost is displayed to the user on the frontend. Leave blank to have it calculated for you. If a booking has varying costs, this will be prefixed with the word \"from:\"."
1193
+ msgstr "フロントエンドでユーザーにコストが表示されます。後の計算のために空白にしておいてください。予約に様々なコストがある場合、\"from:\"という語が前に置かれます。"
1194
+
1195
+ msgid "Bookings"
1196
+ msgstr "予約"
1197
+
1198
+ msgid "Resources Label"
1199
+ msgstr "リソースラベル"
1200
+
1201
+ msgid "Resources"
1202
+ msgstr "リソース"
1203
+
1204
+ msgid "Person Types"
1205
+ msgstr "人タイプ"
1206
+
1207
+ msgid "Person Type Name"
1208
+ msgstr "人タイプ名前"
1209
+
1210
+ msgid "Resources label"
1211
+ msgstr "リソースラベル"
1212
+
1213
+ msgid "Booking currency"
1214
+ msgstr "予約通貨"
locale/woocommerce-multilingual-ko_KR.po ADDED
@@ -0,0 +1,1214 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # This file was generated by WPML
2
+ # WPML is a WordPress plugin that can turn any WordPress site into a full featured multilingual content management system.
3
+ # https://wpml.org
4
+ msgid ""
5
+ msgstr "Content-Type: text/plain; charset=utf-8\nContent-Transfer-Encoding: 8bit\nProject-Id-Version:WPML_EXPORT\nPOT-Creation-Date: \nPO-Revision-Date: \nLast-Translator: \nLanguage-Team: \nLanguage:en\nMIME-Version: 1.0\n"
6
+
7
+ msgid "Introduction"
8
+ msgstr "소개"
9
+
10
+ msgid "Store Pages"
11
+ msgstr "상점 페이지"
12
+
13
+ msgid "Global Attributes"
14
+ msgstr "전역 속성"
15
+
16
+ msgid "Multiple Currencies"
17
+ msgstr "복수 통화"
18
+
19
+ msgid "Translation Interface"
20
+ msgstr "번역 인터페이스"
21
+
22
+ msgid "Ready!"
23
+ msgstr "준비!"
24
+
25
+ msgid "Welcome to %sWooCommerce Multilingual!%s Please take a moment to configure the main settings and then you are ready to start translating your products."
26
+ msgstr ""
27
+
28
+ msgid "Action failed. Please refresh the page and retry."
29
+ msgstr "작업에 실패했습니다. 페이지를 새로 고친 후에 다시 시도하십시오."
30
+
31
+ msgid "Cheatin&#8217; huh?"
32
+ msgstr "속임수를 쓰고 계시나요?"
33
+
34
+ msgid "Run the Setup Wizard"
35
+ msgstr "설정 마법사 실행"
36
+
37
+ msgid "Skip Setup"
38
+ msgstr "설정 건너뛰기"
39
+
40
+ msgid "WooCommerce Multilingual &rsaquo; Setup Wizard"
41
+ msgstr "WooCommerce Multilingual &rsaquo; 설정 마법사"
42
+
43
+ msgid "WooCommerce Multilingual"
44
+ msgstr "WooCommerce Multilingual"
45
+
46
+ msgid "How to translate products"
47
+ msgstr "제품 번역 방법"
48
+
49
+ msgid "Quick edit is disabled for product translations. It's recommended to use the %s for editing products translations. %s"
50
+ msgstr "제품 번역에 빠른 편집을 사용할 수 없습니다. 제품 번역 편집에 %s을(를) 사용할 것을 권장합니다. %s"
51
+
52
+ msgid "WooCommerce Multilingual products editor"
53
+ msgstr "WooCommerce Multilingual 제품 편집기"
54
+
55
+ msgid "Edit this product translation"
56
+ msgstr "이 제품 번역 편집"
57
+
58
+ msgid "How to translate attributes"
59
+ msgstr "속성 번역 방법"
60
+
61
+ msgid "How to translate product categories"
62
+ msgstr "제품 카테고리 번역 방법"
63
+
64
+ msgid "The recommended way to translate WooCommerce products is using the\n %sWooCommerce Multilingual products translation%s page.\n Please use this page only for translating elements that are not available in the WooCommerce Multilingual products translation table."
65
+ msgstr ""
66
+
67
+ msgid "In order to edit custom attributes you need to use the <a href=\"%s\">custom product translation editor</a>"
68
+ msgstr "사용자 정의 속성을 편집하려면 <a href=\"%s\">사용자 정의 제품 번역 편집기</a>를 사용해야 합니다."
69
+
70
+ msgid "You are using the same value as for the regular category base. This is known to create conflicts resulting in urls not working properly."
71
+ msgstr "일반 카테고리 기준에 동일한 값을 사용하고 있습니다. 이 경우 URL이 제대로 작동하지 않는 충돌을 일으키는 것으로 알려져 있습니다."
72
+
73
+ msgid "translations"
74
+ msgstr "번역"
75
+
76
+ msgid "product"
77
+ msgstr "제품"
78
+
79
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">WPML</a> versions prior %s."
80
+ msgstr "WooCommerce Multilingual이 활성화되었지만 작동하지 않습니다. <a href=\"%s\">WPML</a> %s 이전 버전과 호환되지 않습니다."
81
+
82
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">Woocommerce</a> versions prior %s."
83
+ msgstr "WooCommerce Multilingual이 활성화되었지만 작동하지 않습니다. %s 이전 버전의 <a href=\"%s\">Woocommerce</a>와 호환되지 않습니다."
84
+
85
+ msgid "You are using WooCommerce Multilingual %s. This version includes an important UI redesign for the configuration screens and it requires <a href=\"%s\">WPML %s</a> or higher. Everything still works on the front end now but, in order to configure options for WooCommerce Multilingual, you need to upgrade WPML."
86
+ msgstr "현재 WooCommerce Multilingual %s을(를) 사용 중입니다. 이 버전에는 구성 화면을 위한 중요한 UI 디자인 변경이 포함되어 있으며 <a href=\"%s\">WPML %s</a> 이상이 필요합니다. 현재 프런트 엔드에서 모든 기능이 정상적으로 작동하지만 WooCommerce Multilingual 옵션을 구성하려면 WPML을 업그레이드해야 합니다."
87
+
88
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">WPML Translation Management</a> versions prior %s."
89
+ msgstr "WooCommerce Multilingual이 활성화되었지만 작동하지 않습니다. <a href=\"%s\">WPML Translation Management</a> %s 이전 버전과 호환되지 않습니다."
90
+
91
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">WPML String Translation</a> versions prior %s."
92
+ msgstr "WooCommerce Multilingual이 활성화되었지만 작동하지 않습니다. <a href=\"%s\">WPML String Translation</a> %s 이전 버전과 호환되지 않습니다."
93
+
94
+ msgid "WooCommerce Multilingual is enabled but not effective. It is not compatible with <a href=\"%s\">WPML Media</a> versions prior %s."
95
+ msgstr "WooCommerce Multilingual이 활성화되었지만 작동하지 않습니다. <a href=\"%s\">WPML Media</a> %s 이전 버전과 호환되지 않습니다."
96
+
97
+ msgid "and"
98
+ msgstr "및"
99
+
100
+ msgid "WooCommerce Multilingual is enabled but not effective. It requires %s in order to work."
101
+ msgstr "WooCommerce Multilingual이 활성화되었지만 작동하지 않습니다. 제대로 작동하려면 %s이(가) 필요합니다."
102
+
103
+ msgid "Permalink settings"
104
+ msgstr "고유주소 설정"
105
+
106
+ msgid "Configure products slug translation"
107
+ msgstr "제품 슬러그 번역 구성"
108
+
109
+ msgid "If you want different slugs for shop pages (%s/%s), you need to disable the shop prefix for products in <a href=\"%s\">WooCommerce Settings</a>"
110
+ msgstr "상점 페이지별로 다른 슬러그를 원하는 경우(%s/%s), <a href=\"%s\">WooCommerce 설정</a>에서 제품의 상점 접두사를 비활성화해야 합니다."
111
+
112
+ msgid "Finished! You can visit the %sstrings translation%s screen to translate the strings now."
113
+ msgstr "완료되었습니다! 이제 %s문자열 번역%s 화면을 방문하여 문자열을 번역할 수 있습니다."
114
+
115
+ msgid "wpml-config.xml file missing from WooCommerce Multilingual folder."
116
+ msgstr "WooCommerce Multilingual 폴더에서 wpml-config.xml 파일이 누락되었습니다."
117
+
118
+ msgid "Custom field %s configuration from wpml-config.xml file was altered!"
119
+ msgstr "wpml-config.xml 파일에서 사용자 정의 필드 %s 구성이 변경되었습니다!"
120
+
121
+ msgid "Custom type %s configuration from wpml-config.xml file was altered!"
122
+ msgstr "wpml-config.xml 파일에서 사용자 정의 유형 %s 구성이 변경되었습니다!"
123
+
124
+ msgid "Custom taxonomy %s configuration from wpml-config.xml file was altered!"
125
+ msgstr "wpml-config.xml 파일에서 사용자 정의 분류 %s 구성이 변경되었습니다!"
126
+
127
+ msgid "Upgrade WPML"
128
+ msgstr "WPML 업데이트"
129
+
130
+ msgid "Invalid language parameter: %s"
131
+ msgstr "잘못된 언어 파라미터: %s"
132
+
133
+ msgid "Source product id not found: %s"
134
+ msgstr "원본 상품 id를 찾을 수 없음: %s"
135
+
136
+ msgid "Product Base"
137
+ msgstr "상품 기준"
138
+
139
+ msgid "Product Tag Base"
140
+ msgstr "상품 태그 기준"
141
+
142
+ msgid "Product Category Base"
143
+ msgstr "상품 카테고리 기준"
144
+
145
+ msgid "Product Attribute Base"
146
+ msgstr "상품 속성 기준"
147
+
148
+ msgid "Endpoint: %s"
149
+ msgstr "끝점: %s"
150
+
151
+ msgid "product-category"
152
+ msgstr "제품-카테고리"
153
+
154
+ msgid "product-tag"
155
+ msgstr "제품-태그"
156
+
157
+ msgid "Original language"
158
+ msgstr "원본 언어"
159
+
160
+ msgid "Take this and edit"
161
+ msgstr "이 작업을 수락하여 편집하기"
162
+
163
+ msgid "Add translation"
164
+ msgstr "번역 추가"
165
+
166
+ msgid "Update translation"
167
+ msgstr "번역 업데이트"
168
+
169
+ msgid "Finish translating"
170
+ msgstr "번역 종료"
171
+
172
+ msgid "Edit translation"
173
+ msgstr "번역 편집"
174
+
175
+ msgid "Edit this item inline"
176
+ msgstr "이 항목 인라인 편집"
177
+
178
+ msgid "Quick Edit"
179
+ msgstr "빠른 편집"
180
+
181
+ msgid "Translation in progress"
182
+ msgstr "진행 중인 번역"
183
+
184
+ msgid "Invalid nonce"
185
+ msgstr "잘못된 임시 문자열"
186
+
187
+ msgid "Currency - no orders found"
188
+ msgstr "통화 - 정렬이 없습니다."
189
+
190
+ msgid "Currencies order updated"
191
+ msgstr "통화 순서 업데이트됨"
192
+
193
+ msgid "Currency switcher"
194
+ msgstr "통화 전환기"
195
+
196
+ msgid "Configure options"
197
+ msgstr "옵션 구성"
198
+
199
+ msgid "Settings saved!"
200
+ msgstr "설정이 저장되었습니다!"
201
+
202
+ msgid "Add new currency"
203
+ msgstr "새 통화 추가"
204
+
205
+ msgid "Update currency"
206
+ msgstr "통화 업데이트"
207
+
208
+ msgid "Update settings for %s"
209
+ msgstr "%s 설정 업데이트"
210
+
211
+ msgid "The default currency was changed. In order to show accurate prices in all currencies, you need to update the exchange rates under the %sMulti-currency%s configuration."
212
+ msgstr "기본 통화가 변경되었습니다. 모든 통화로 정확한 가격을 표시하려면 %s복수 통화%s 구성에서 환율을 업데이트해야 합니다."
213
+
214
+ msgid "All the products will be removed from the current order in order to change the currency"
215
+ msgstr "통화를 변경하기 위해 현재 주문에서 모든 제품이 제거됩니다."
216
+
217
+ msgid "Show all currencies"
218
+ msgstr "모든 통화 표시"
219
+
220
+ msgid "Order currency:"
221
+ msgstr "주문 통화:"
222
+
223
+ msgid "Cart"
224
+ msgstr "카트"
225
+
226
+ msgid "Checkout"
227
+ msgstr "체크아웃"
228
+
229
+ msgid "Checkout &rarr; Pay"
230
+ msgstr "체크아웃 &rarr; 지불"
231
+
232
+ msgid "Order Received"
233
+ msgstr "접수한 주문"
234
+
235
+ msgid "My Account"
236
+ msgstr "내 계정"
237
+
238
+ msgid "Change Password"
239
+ msgstr "비밀번호 변경"
240
+
241
+ msgid "Edit My Address"
242
+ msgstr "내 주소 편집"
243
+
244
+ msgid "Logout"
245
+ msgstr "로그아웃"
246
+
247
+ msgid "Lost Password"
248
+ msgstr "비밀번호 분실"
249
+
250
+ msgid "View Order"
251
+ msgstr "주문 보기"
252
+
253
+ msgid "Shop"
254
+ msgstr "상점"
255
+
256
+ msgid "All the products will be removed from the current order in order to change the language"
257
+ msgstr "언어를 변경하기 위해 현재 주문에서 모든 제품이 제거됩니다."
258
+
259
+ msgid "Order language:"
260
+ msgstr "주문 언어:"
261
+
262
+ msgid "Choose a file"
263
+ msgstr "파일 선택"
264
+
265
+ msgid "At least one of these fields is required: title, content or excerpt"
266
+ msgstr "다음 필드 중 하나 이상이 요청되었습니다: 제목, 내용 또는 또는 요약문"
267
+
268
+ msgid "This translation job will no longer be assigned to you. Other translators will be able take it and continue the translation."
269
+ msgstr "이 번역 작업은 더 이상 귀하에게 지정되지 않습니다. 다른 번역가가 이 작업을 맡아서 번역을 계속해 나갈 수 있습니다."
270
+
271
+ msgid "This field is locked for editing because WPML will copy its value from the original language."
272
+ msgstr "WPML이 원본 언어에서 값을 복사하기 때문에 이 필드는 편집할 수 없도록 잠겨 있습니다."
273
+
274
+ msgid "This is a translation of %s. Some of the fields are not editable. It's recommended to use the %s for translating products."
275
+ msgstr "이것은 %s의 번역입니다. 일부 필드는 편집할 수 없습니다. 제품 번역에 %s을(를) 사용할 것을 권장합니다."
276
+
277
+ msgid "WooCommerce Multilingual products translator"
278
+ msgstr "WooCommerce Multilingual 제품 번역기"
279
+
280
+ msgid "Looks like you are upgrading from a previous version of WooCommerce Multilingual. Would you like to automatically create translated variations and images?"
281
+ msgstr "이전 버전의 WooCommerce Multilingual에서 업그레이드하려는 것 같습니다. 자동으로 번역된 베리에이션과 이미지를 만드시겠습니까?"
282
+
283
+ msgid "Yes, go to the troubleshooting page"
284
+ msgstr "예, 문제 해결 페이지로 이동합니다."
285
+
286
+ msgid "No - dismiss"
287
+ msgstr "아니오 - 취소"
288
+
289
+ msgid "You've successfully installed %sWooCommerce Multilingual%s. Would you like to see a quick overview?"
290
+ msgstr "%sWooCommerce Multilingual%s 설치가 완료되었습니다. 간략한 개요를 보시겠습니까?"
291
+
292
+ msgid "Learn how to turn your e-commerce site multilingual"
293
+ msgstr "귀사의 전자상거래 사이트를 다국어로 바꾸는 방법을 살펴보세요."
294
+
295
+ msgid "Dismiss"
296
+ msgstr "무시"
297
+
298
+ msgid "To translate %s please use the %s translation%s page, inside the %sWooCommerce Multilingual admin%s."
299
+ msgstr "%s을(를) 번역하려면 %s 번역%s 페이지(%sWooCommerce Multilingual 관리자%s 내)를 사용하십시오."
300
+
301
+ msgid "%s do not require translation."
302
+ msgstr "%s은(는) 번역할 필요가 없습니다."
303
+
304
+ msgid "Include to translation"
305
+ msgstr "번역에 포함"
306
+
307
+ msgid "%d %s are missing translations."
308
+ msgstr "%d개 %s이(가) 번역 누락되었습니다."
309
+
310
+ msgid "Translate %s"
311
+ msgstr "%s 번역"
312
+
313
+ msgid "Exclude from translation"
314
+ msgstr "번역에서 제외"
315
+
316
+ msgid "All %s are translated."
317
+ msgstr "모든 %s이(가) 번역되었습니다."
318
+
319
+ msgid "Currently, there are %s variations that need to be created."
320
+ msgstr "현재 %s개의 베리에이션을 생성해야 합니다."
321
+
322
+ msgid "%d products left"
323
+ msgstr "남은 제품: %d개"
324
+
325
+ msgid "Synchronization complete!"
326
+ msgstr "동기화 완료!"
327
+
328
+ msgid "Invalid taxonomy %s"
329
+ msgstr "잘못된 분류 %s"
330
+
331
+ msgid "Some translated %s have different %s assignments."
332
+ msgstr "번역된 일부 %s에 다른 %s 속성이 배정되었습니다."
333
+
334
+ msgid "Update %s for all translated %s"
335
+ msgstr "%s(번역된 모든 %s) 업데이트"
336
+
337
+ msgid "All %s have the same %s assignments."
338
+ msgstr "모든 %s에 동일한 %s 속성이 배정되어 있습니다."
339
+
340
+ msgid "Successfully updated %s for all translated %s."
341
+ msgstr "%s(번역된 모든 %s)을(를) 성공적으로 업데이트했습니다."
342
+
343
+ msgid "Synchronize attributes and update product variations"
344
+ msgstr "속성을 동기화하고 제품 베리에이션을 업데이트합니다."
345
+
346
+ msgid "Image"
347
+ msgstr "이미지"
348
+
349
+ msgid "Product"
350
+ msgstr "제품"
351
+
352
+ msgid "Type"
353
+ msgstr "타입"
354
+
355
+ msgid "Date"
356
+ msgstr "날짜"
357
+
358
+ msgid "Categories"
359
+ msgstr "카테고리"
360
+
361
+ msgid "No products found"
362
+ msgstr "검색된 제품이 없습니다."
363
+
364
+ msgid "Draft"
365
+ msgstr "임시글"
366
+
367
+ msgid "Private"
368
+ msgstr "개인적(비공개)"
369
+
370
+ msgid "Pending"
371
+ msgstr ""
372
+
373
+ msgid "Scheduled"
374
+ msgstr "예약됨"
375
+
376
+ msgid "Parent product: %s"
377
+ msgstr "상위 상품: %s"
378
+
379
+ msgid "Edit this item"
380
+ msgstr "이 항목 편집"
381
+
382
+ msgid "Edit"
383
+ msgstr "편집"
384
+
385
+ msgid "View \"%s\""
386
+ msgstr "\"%s\" 보기"
387
+
388
+ msgid "View"
389
+ msgstr "보기"
390
+
391
+ msgid "Published"
392
+ msgstr "발행됨"
393
+
394
+ msgid "Last Modified"
395
+ msgstr "마지막으로 수정한 날짜"
396
+
397
+ msgid "All languages"
398
+ msgstr "모든 언어"
399
+
400
+ msgid "All categories"
401
+ msgstr "모든 카테고리"
402
+
403
+ msgid "All translation statuses"
404
+ msgstr "모든 번역 상태"
405
+
406
+ msgid "Not translated or needs updating"
407
+ msgstr "번역되지 않았거나 업데이트해야 합니다"
408
+
409
+ msgid "Needs updating"
410
+ msgstr "업데이트해야 합니다."
411
+
412
+ msgid "Translation complete"
413
+ msgstr "번역 완료"
414
+
415
+ msgid "All statuses"
416
+ msgstr "모든 상태"
417
+
418
+ msgid "Filter"
419
+ msgstr "필터"
420
+
421
+ msgid "Reset"
422
+ msgstr "초기화"
423
+
424
+ msgid "Search"
425
+ msgstr "검색"
426
+
427
+ msgid "%d items"
428
+ msgstr "%d개 항목"
429
+
430
+ msgid "Go to the first page"
431
+ msgstr "첫 페이지로 이동"
432
+
433
+ msgid "Go to the previous page"
434
+ msgstr "이전 페이지로 이동"
435
+
436
+ msgid "Select Page"
437
+ msgstr "페이지 선택"
438
+
439
+ msgid "Current page"
440
+ msgstr "현재 페이지"
441
+
442
+ msgid "of"
443
+ msgstr "/"
444
+
445
+ msgid "Go to the next page"
446
+ msgstr "다음 페이지로 이동"
447
+
448
+ msgid "Go to the last page"
449
+ msgstr "마지막 페이지로 이동"
450
+
451
+ msgid "Translatable?"
452
+ msgstr "번역 가능?"
453
+
454
+ msgid "Enable this if you want to translate attribute values with Woocommerce Multilingual"
455
+ msgstr "Woocommerce Multilingual로 속성 값을 번역하려는 경우 이 기능을 활성화하십시오."
456
+
457
+ msgid "Existing translations and variations associated will be deleted."
458
+ msgstr "기존 번역 및 관련 베리에이션이 삭제됩니다."
459
+
460
+ msgid "Product Translation Interface"
461
+ msgstr "제품 번역 인터페이스"
462
+
463
+ msgid "The recommended way is using the WPML Translation Editor. It is streamlined for making the translation process much easier while also providing a much better integration with various WooCommerce extensions."
464
+ msgstr "WPML Translation Editor를 사용할 것을 권장합니다. 매우 향상된 다양한 WooCommerce 확장기능과의 통합을 제공하면서 번역 과정이 훨씬 쉽게 이루어지도록 간소화되었습니다. "
465
+
466
+ msgid "WPML Translation Editor"
467
+ msgstr "WPML Translation Editor"
468
+
469
+ msgid "Native WooCommerce product editing screen"
470
+ msgstr "네이티브 WooCommerce 상품 편집 화면"
471
+
472
+ msgid "Products synchronization"
473
+ msgstr "제품 동기화"
474
+
475
+ msgid "Configure specific product properties that should be synced to translations."
476
+ msgstr "번역에 동기화되어야 하는 특정 제품 속성을 구성합니다."
477
+
478
+ msgid "Sync publishing date for translated products."
479
+ msgstr "번역된 제품의 게시 날짜를 동기화합니다."
480
+
481
+ msgid "Sync products and product taxonomies order."
482
+ msgstr "제품과 제품 분류 순서를 동기화합니다."
483
+
484
+ msgid "Products Download Files"
485
+ msgstr "상품 다운로드 파일"
486
+
487
+ msgid "If you are using downloadable products, you can choose to have their paths\n synchronized, or seperate for each language."
488
+ msgstr "다운로드 가능한 상품을 사용하는 경우 각 언어에 대하여 상품 경로를 동기화하거나\n 분리하는 옵션을 선택할 수 있습니다."
489
+
490
+ msgid "Use the same files for translations"
491
+ msgstr "번역에 동일 파일 사용"
492
+
493
+ msgid "Add separate download files for translations"
494
+ msgstr "번역에 별도의 다운로드 파일 추가"
495
+
496
+ msgid "Save changes"
497
+ msgstr "변경 내용 저장"
498
+
499
+ msgid "Troubleshooting page"
500
+ msgstr "문제 해결 페이지"
501
+
502
+ msgid "Update Translation"
503
+ msgstr "번역 업데이트"
504
+
505
+ msgid "Hide This Message"
506
+ msgstr "이 메시지 숨기기"
507
+
508
+ msg