Popups – WordPress Popup - Version 1.9.3.3

Version Description

  • Fixed page/post parent rule issue
  • More forms compatibility
Download this release

Release Info

Developer timersys
Plugin Icon 128x128 Popups – WordPress Popup
Version 1.9.3.3
Comparing to
See all releases

Code changes from version 1.9.3.2 to 1.9.3.3

Files changed (60) hide show
  1. README.txt +6 -2
  2. admin/assets/css/editor-style.css +61 -61
  3. admin/assets/js/spu-tinymce.js +65 -65
  4. admin/class-social-popup-admin.php +952 -952
  5. admin/includes/class-spu-notices.php +46 -46
  6. admin/includes/class-spu-upgrader.php +28 -28
  7. admin/includes/tinymce-editor.php +38 -38
  8. admin/views/metaboxes/metabox-appearance.php +210 -210
  9. admin/views/metaboxes/metabox-donate.php +15 -15
  10. admin/views/metaboxes/metabox-help.php +67 -67
  11. admin/views/metaboxes/metabox-options.php +141 -141
  12. admin/views/metaboxes/metabox-premium.php +39 -39
  13. admin/views/metaboxes/metabox-rules.php +109 -109
  14. admin/views/metaboxes/metabox-support.php +5 -5
  15. admin/views/metaboxes/metabox-video.php +6 -6
  16. admin/views/settings-page.php +76 -76
  17. composer.json +8 -8
  18. composer.lock +166 -166
  19. includes/class-spu-helper.php +563 -563
  20. includes/updates-msg.html +7 -7
  21. languages/popups-de_DE.po +870 -870
  22. languages/popups-es_ES.po +814 -814
  23. languages/popups-fr_FR .po +864 -864
  24. languages/popups-ru_RU.po +730 -730
  25. languages/popups-sr_RS.po +821 -821
  26. popups.php +2 -2
  27. public/assets/js/public.js +1 -1
  28. public/class-social-popup.php +855 -855
  29. public/includes/class-spu-rules.php +1150 -1156
  30. uninstall.php +22 -22
  31. vendor/autoload.php +7 -7
  32. vendor/cbschuld/browser.php/.travis.yml +10 -10
  33. vendor/cbschuld/browser.php/LICENSE.md +7 -7
  34. vendor/cbschuld/browser.php/README.md +149 -149
  35. vendor/cbschuld/browser.php/composer.json +22 -22
  36. vendor/cbschuld/browser.php/lib/Browser.php +1732 -1732
  37. vendor/cbschuld/browser.php/phpunit.xml.dist +29 -29
  38. vendor/composer/ClassLoader.php +441 -441
  39. vendor/composer/LICENSE +21 -21
  40. vendor/composer/autoload_classmap.php +10 -10
  41. vendor/composer/autoload_files.php +10 -10
  42. vendor/composer/autoload_namespaces.php +10 -10
  43. vendor/composer/autoload_psr4.php +10 -10
  44. vendor/composer/autoload_real.php +70 -70
  45. vendor/composer/autoload_static.php +51 -51
  46. vendor/composer/installed.json +154 -154
  47. vendor/jaybizzle/crawler-detect/LICENSE +22 -22
  48. vendor/jaybizzle/crawler-detect/README.md +68 -68
  49. vendor/jaybizzle/crawler-detect/composer.json +30 -30
  50. vendor/jaybizzle/crawler-detect/export.php +41 -41
  51. vendor/jaybizzle/crawler-detect/raw/Crawlers.txt +1140 -1140
  52. vendor/jaybizzle/crawler-detect/raw/Exclusions.txt +41 -41
  53. vendor/jaybizzle/crawler-detect/raw/Headers.txt +9 -9
  54. vendor/jaybizzle/crawler-detect/src/CrawlerDetect.php +191 -191
  55. vendor/jaybizzle/crawler-detect/src/Fixtures/AbstractProvider.php +31 -31
  56. vendor/jaybizzle/crawler-detect/src/Fixtures/Crawlers.php +1162 -1162
  57. vendor/jaybizzle/crawler-detect/src/Fixtures/Exclusions.php +66 -66
  58. vendor/jaybizzle/crawler-detect/src/Fixtures/Headers.php +37 -37
  59. vendor/mobiledetect/mobiledetectlib/LICENSE.txt +48 -48
  60. vendor/mobiledetect/mobiledetectlib/Mobile_Detect.php +828 -1468
README.txt CHANGED
@@ -3,8 +3,8 @@ Contributors: timersys
3
  Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=K4T6L69EV9G2Q
4
  Tags: popup,twitter,google+,facebook,Popups,twitter follow,facebook like,mailchimp,Activecampaign,Mailpoet,Postmatic,Infusionsoft,mailerlite,constant contact,aweber,google plus,social boost,social splash,postmatic,mailpoet,facebook popup,scroll popups,popups,wordpress popup,wp popups,cf7,gf,gravity forms,contact form 7,ifs,infusion soft,subscribe,login popup,ajax login popups,popupmaker
5
  Requires at least: 3.6
6
- Tested up to: 4.9.7
7
- Stable tag: 1.9.3.2
8
  Requires PHP: 5.3
9
  Text Domain: popups
10
  License: GPLv2 or later
@@ -184,6 +184,10 @@ If you have cache be sure to enable AJAX mode in the plugin settings page
184
 
185
  == Changelog ==
186
 
 
 
 
 
187
  = 1.9.3.2 =
188
  * Ninja forms fix
189
  * Added new display rule "custom url"
3
  Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=K4T6L69EV9G2Q
4
  Tags: popup,twitter,google+,facebook,Popups,twitter follow,facebook like,mailchimp,Activecampaign,Mailpoet,Postmatic,Infusionsoft,mailerlite,constant contact,aweber,google plus,social boost,social splash,postmatic,mailpoet,facebook popup,scroll popups,popups,wordpress popup,wp popups,cf7,gf,gravity forms,contact form 7,ifs,infusion soft,subscribe,login popup,ajax login popups,popupmaker
5
  Requires at least: 3.6
6
+ Tested up to: 4.9.8
7
+ Stable tag: 1.9.3.3
8
  Requires PHP: 5.3
9
  Text Domain: popups
10
  License: GPLv2 or later
184
 
185
  == Changelog ==
186
 
187
+ = 1.9.3.3 =
188
+ * Fixed page/post parent rule issue
189
+ * More forms compatibility
190
+
191
  = 1.9.3.2 =
192
  * Ninja forms fix
193
  * Added new display rule "custom url"
admin/assets/css/editor-style.css CHANGED
@@ -1,62 +1,62 @@
1
- /**
2
- * Editor
3
- */
4
- html{
5
- background: #9C9B9B;
6
- }
7
- body#tinymce.wp-editor{
8
- margin: 20px auto;
9
- }
10
- body#tinymce.wp-editor,
11
- body#tinymce.wp-editor * {
12
- box-sizing: border-box;
13
- -webkit-box-sizing: border-box;
14
- -moz-box-sizing: border-box;
15
- }
16
- body#tinymce.wp-editor{
17
- max-width: 100%;
18
- }
19
-
20
- /**
21
- * Top position
22
- */
23
- body#tinymce.spu-optin-editor.spu-position-top-bar,
24
- body#tinymce.spu-position-top-bar {
25
- margin-top: 0 !important;
26
- border-top: none !important;
27
- }
28
- body#tinymce.spu-optin-editor.spu-position-top-bar,
29
- body#tinymce.spu-position-top-bar ,
30
- body#tinymce.spu-optin-editor.spu-position-bottom-bar,
31
- body#tinymce.spu-position-bottom-bar {
32
- padding-top: 10px !important;
33
- padding-bottom: 10px !important;
34
- width: 100% !important;
35
- border-left: none !important;
36
- border-right: none !important;
37
- border-radius: 0;
38
- }
39
- body#tinymce.spu-optin-editor.spu-position-bottom-bar,
40
- body#tinymce.spu-position-bottom-bar {
41
- margin-bottom: 0 !important;
42
- border-bottom: none !important;
43
- position: absolute;
44
- left: 0;
45
- bottom: 0;
46
- }
47
- body#tinymce.spu-position-top-bar h1,
48
- body#tinymce.spu-position-top-bar h2,
49
- body#tinymce.spu-position-top-bar h3,
50
- body#tinymce.spu-position-top-bar h4,
51
- body#tinymce.spu-position-top-bar h5,
52
- body#tinymce.spu-position-top-bar h6,
53
- body#tinymce.spu-position-top-bar p,
54
- body#tinymce.spu-position-bottom-bar h1,
55
- body#tinymce.spu-position-bottom-bar h2,
56
- body#tinymce.spu-position-bottom-bar h3,
57
- body#tinymce.spu-position-bottom-bar h4,
58
- body#tinymce.spu-position-bottom-bar h5,
59
- body#tinymce.spu-position-bottom-bar h6,
60
- body#tinymce.spu-position-bottom-bar p{
61
- margin: 0;
62
  }
1
+ /**
2
+ * Editor
3
+ */
4
+ html{
5
+ background: #9C9B9B;
6
+ }
7
+ body#tinymce.wp-editor{
8
+ margin: 20px auto;
9
+ }
10
+ body#tinymce.wp-editor,
11
+ body#tinymce.wp-editor * {
12
+ box-sizing: border-box;
13
+ -webkit-box-sizing: border-box;
14
+ -moz-box-sizing: border-box;
15
+ }
16
+ body#tinymce.wp-editor{
17
+ max-width: 100%;
18
+ }
19
+
20
+ /**
21
+ * Top position
22
+ */
23
+ body#tinymce.spu-optin-editor.spu-position-top-bar,
24
+ body#tinymce.spu-position-top-bar {
25
+ margin-top: 0 !important;
26
+ border-top: none !important;
27
+ }
28
+ body#tinymce.spu-optin-editor.spu-position-top-bar,
29
+ body#tinymce.spu-position-top-bar ,
30
+ body#tinymce.spu-optin-editor.spu-position-bottom-bar,
31
+ body#tinymce.spu-position-bottom-bar {
32
+ padding-top: 10px !important;
33
+ padding-bottom: 10px !important;
34
+ width: 100% !important;
35
+ border-left: none !important;
36
+ border-right: none !important;
37
+ border-radius: 0;
38
+ }
39
+ body#tinymce.spu-optin-editor.spu-position-bottom-bar,
40
+ body#tinymce.spu-position-bottom-bar {
41
+ margin-bottom: 0 !important;
42
+ border-bottom: none !important;
43
+ position: absolute;
44
+ left: 0;
45
+ bottom: 0;
46
+ }
47
+ body#tinymce.spu-position-top-bar h1,
48
+ body#tinymce.spu-position-top-bar h2,
49
+ body#tinymce.spu-position-top-bar h3,
50
+ body#tinymce.spu-position-top-bar h4,
51
+ body#tinymce.spu-position-top-bar h5,
52
+ body#tinymce.spu-position-top-bar h6,
53
+ body#tinymce.spu-position-top-bar p,
54
+ body#tinymce.spu-position-bottom-bar h1,
55
+ body#tinymce.spu-position-bottom-bar h2,
56
+ body#tinymce.spu-position-bottom-bar h3,
57
+ body#tinymce.spu-position-bottom-bar h4,
58
+ body#tinymce.spu-position-bottom-bar h5,
59
+ body#tinymce.spu-position-bottom-bar h6,
60
+ body#tinymce.spu-position-bottom-bar p{
61
+ margin: 0;
62
  }
admin/assets/js/spu-tinymce.js CHANGED
@@ -1,65 +1,65 @@
1
- (function( $ ) {
2
- 'use strict';
3
-
4
-
5
- tinymce.create('tinymce.plugins.SPU', {
6
- init : function(ed, url) {
7
- ed.addButton('spu_button', {
8
- title : 'Add Popup',
9
- cmd : 'spu_button',
10
- image : url+'/popup.png'
11
- });
12
- ed.addCommand('spu_button', function() {
13
-
14
- jQuery('#spu_editor').dialog({
15
- height: 500,
16
- width: '600px',
17
- buttons: {
18
- "Insert Shortcode": function() {
19
-
20
- var spu_id = jQuery('#spu-posts').val();
21
- var str = "";
22
-
23
- str = '[spu popup="'+spu_id+'"';
24
- var selected_text = ed.selection.getContent();
25
- if (selected_text) {
26
-
27
- str += "]" + selected_text + "[/spu]";
28
-
29
- } else {
30
-
31
- str += "]YOUR TEXT OR IMG HERE[/spu]";
32
-
33
- }
34
-
35
-
36
- var Editor = tinyMCE.get('content');
37
- Editor.focus();
38
- Editor.selection.setContent(str);
39
-
40
-
41
- jQuery( this ).dialog( "close" );
42
- },
43
- Cancel: function() {
44
- jQuery( this ).dialog( "close" );
45
- }
46
- }
47
- }).dialog('open');
48
-
49
- });
50
- },
51
- createControl : function(n, cm) {
52
- return null;
53
- },
54
- getInfo : function() {
55
- return {
56
- longname : 'Popups Button',
57
- author : 'Damian Logghe',
58
- authorurl : 'https://timersys.com',
59
- infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/example',
60
- version : "0.1"
61
- };
62
- }
63
- });
64
- tinymce.PluginManager.add('spu', tinymce.plugins.SPU);
65
- })( jQuery );
1
+ (function( $ ) {
2
+ 'use strict';
3
+
4
+
5
+ tinymce.create('tinymce.plugins.SPU', {
6
+ init : function(ed, url) {
7
+ ed.addButton('spu_button', {
8
+ title : 'Add Popup',
9
+ cmd : 'spu_button',
10
+ image : url+'/popup.png'
11
+ });
12
+ ed.addCommand('spu_button', function() {
13
+
14
+ jQuery('#spu_editor').dialog({
15
+ height: 500,
16
+ width: '600px',
17
+ buttons: {
18
+ "Insert Shortcode": function() {
19
+
20
+ var spu_id = jQuery('#spu-posts').val();
21
+ var str = "";
22
+
23
+ str = '[spu popup="'+spu_id+'"';
24
+ var selected_text = ed.selection.getContent();
25
+ if (selected_text) {
26
+
27
+ str += "]" + selected_text + "[/spu]";
28
+
29
+ } else {
30
+
31
+ str += "]YOUR TEXT OR IMG HERE[/spu]";
32
+
33
+ }
34
+
35
+
36
+ var Editor = tinyMCE.get('content');
37
+ Editor.focus();
38
+ Editor.selection.setContent(str);
39
+
40
+
41
+ jQuery( this ).dialog( "close" );
42
+ },
43
+ Cancel: function() {
44
+ jQuery( this ).dialog( "close" );
45
+ }
46
+ }
47
+ }).dialog('open');
48
+
49
+ });
50
+ },
51
+ createControl : function(n, cm) {
52
+ return null;
53
+ },
54
+ getInfo : function() {
55
+ return {
56
+ longname : 'Popups Button',
57
+ author : 'Damian Logghe',
58
+ authorurl : 'https://timersys.com',
59
+ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/example',
60
+ version : "0.1"
61
+ };
62
+ }
63
+ });
64
+ tinymce.PluginManager.add('spu', tinymce.plugins.SPU);
65
+ })( jQuery );
admin/class-social-popup-admin.php CHANGED
@@ -1,952 +1,952 @@
1
- <?php
2
- /**
3
- * Popups.
4
- *
5
- * @package SocialPopup_Admin
6
- * @author Damian Logghe <info@timersys.com>
7
- * @license GPL-2.0+
8
- * @link https://timersys.com
9
- * @copyright 2014 Timersys
10
- */
11
-
12
-
13
- define( 'SPU_ADMIN_DIR' , plugin_dir_path(__FILE__) );
14
-
15
-
16
- /**
17
- * Admin Class of the plugin
18
- *
19
- * @package SocialPopup_Admin
20
- * @author Damian Logghe <info@timersys.com>
21
- */
22
- class SocialPopup_Admin {
23
-
24
- /**
25
- * Instance of this class.
26
- *
27
- * @since 1.0.0
28
- *
29
- * @var object
30
- */
31
- protected static $instance = null;
32
-
33
- /**
34
- * Slug of the plugin screen.
35
- *
36
- * @since 1.0.0
37
- *
38
- * @var string
39
- */
40
- protected $plugin_screen_hook_suffix = null;
41
-
42
- /**
43
- * Plugins settings
44
- * @var array
45
- */
46
- protected $spu_settings = array();
47
-
48
- /**
49
- * Premium version is enabled
50
- *
51
- * @since 1.1
52
- *
53
- * @var bool
54
- */
55
- protected $premium = false;
56
-
57
- /**
58
- * Helper function
59
- *
60
- * @since 1.1
61
- *
62
- * @var bool
63
- */
64
- protected $helper = '';
65
-
66
- /**
67
- * Initialize the plugin by loading admin scripts & styles and adding a
68
- * settings page and menu.
69
- *
70
- * @since 1.0.0
71
- */
72
- private function __construct() {
73
-
74
-
75
- $plugin = SocialPopup::get_instance();
76
- $this->plugin_slug = $plugin->get_plugin_slug();
77
-
78
- // helper funcs
79
- $this->helper = new Spu_Helper;
80
-
81
- //settings name
82
- $this->options_name = $this->plugin_slug .'_settings';
83
-
84
- //load settings
85
- $this->spu_settings = $plugin->get_settings();
86
-
87
- //premium version ?
88
- $this->premium = defined('SPUP_PLUGIN_HOOK');
89
-
90
- // add settings page
91
- add_action('admin_menu' , array( $this, 'add_settings_menu' ) );
92
-
93
- //Add our metaboxes
94
- add_action( 'add_meta_boxes', array( $this, 'add_meta_boxes' ) );
95
-
96
- //Save metaboxes
97
- add_action( 'save_post_spucpt', array( $this, 'save_meta_options' ), 20 );
98
-
99
- // Load admin style sheet and JavaScript.
100
- add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_admin_styles' ) );
101
- add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_admin_scripts' ) );
102
-
103
- // Add an action link pointing to the options page.
104
- add_filter( 'plugin_action_links_' . SPU_PLUGIN_HOOK, array( $this, 'add_action_links' ) );
105
-
106
- //Filters for rules
107
- add_filter('spu/get_post_types', array($this, 'get_post_types'), 1, 3);
108
- add_filter('spu/get_taxonomies', array($this, 'get_taxonomies'), 1, 3);
109
-
110
- //AJAX Actions
111
- add_action('wp_ajax_spu/field_group/render_rules', array( $this->helper, 'ajax_render_rules' ) );
112
- add_action('wp_ajax_spu/field_group/render_operator', array( $this->helper, 'ajax_render_operator' ) );
113
- add_action('wp_ajax_spu_enable_ajax_notice_handler', array( $this, 'ajax_notice_handler' ) );
114
-
115
- //Tinymce
116
- add_filter( 'tiny_mce_before_init', array($this, 'tinymce_init'), 9999 );
117
- add_action( 'admin_init', array( $this, 'editor_styles' ) );
118
- add_action( 'init', array( $this, 'register_tiny_buttons' ) );
119
-
120
- //Columns in cpt
121
- add_filter( 'manage_edit-spucpt_columns' , array( $this, 'set_custom_cpt_columns'), 10, 2 );
122
- add_action( 'manage_spucpt_posts_custom_column' , array( $this, 'custom_columns'), 10, 2 );
123
- add_action( 'admin_init' , array( $this, 'toggle_on_popup') );
124
-
125
- add_action( 'admin_init' , array( $this, 'extra_checks') );
126
-
127
- $this->set_rules_fields();
128
- }
129
-
130
- /**
131
- * Return an instance of this class.
132
- *
133
- * @since 1.0.0
134
- *
135
- * @return object A single instance of this class.
136
- */
137
- public static function get_instance() {
138
-
139
-
140
- // If the single instance hasn't been set, set it now.
141
- if ( null == self::$instance ) {
142
- self::$instance = new self;
143
- }
144
-
145
- return self::$instance;
146
- }
147
-
148
-
149
- /**
150
- * Add menu for Settings page of the plugin
151
- * @since 1.1
152
- * @return void
153
- */
154
- public function add_settings_menu() {
155
-
156
- add_submenu_page('edit.php?post_type=spucpt', __( 'Settings', 'popups' ), __( 'Settings', 'popups' ), apply_filters( 'spu/settings_page/roles', 'manage_options'), 'spu_settings', array( $this, 'settings_page' ) );
157
-
158
- }
159
-
160
-
161
-
162
- /**
163
- * Settings page of the plugin
164
- * @since 1.1
165
- * @return void
166
- */
167
- public function settings_page() {
168
-
169
- $defaults = apply_filters( 'spu/settings_page/defaults_opts', array(
170
- 'aff_link' => '',
171
- 'ajax_mode' => '0',
172
- 'shortcodes_style' => '',
173
- 'facebook' => '',
174
- 'google' => '',
175
- 'twitter' => '',
176
- 'spu_license_key' => '',
177
- 'ua_code' => '',
178
- 'mc_api' => '',
179
- ));
180
- $opts = apply_filters( 'spu/settings_page/opts', get_option( 'spu_settings', $defaults ) );
181
-
182
-
183
- if ( isset( $_POST['spu_nonce'] ) && wp_verify_nonce( $_POST['spu_nonce'], 'spu_save_settings' ) ) {
184
- $opts = esc_sql( @$_POST['spu_settings'] );
185
- update_option( 'spu_settings' , $opts );
186
- }
187
-
188
-
189
- include 'views/settings-page.php';
190
-
191
- }
192
-
193
- /**
194
- * Register the metaboxes for our cpt and remove others
195
- */
196
- public function add_meta_boxes() {
197
-
198
-
199
- add_meta_box(
200
- 'spu-video',
201
- '<i class="spu-icon-info spu-icon"></i>' . __( 'Help video', 'popups' ),
202
- array( $this, 'metabox_video' ),
203
- 'spucpt',
204
- 'normal',
205
- 'core'
206
- );
207
-
208
- add_meta_box(
209
- 'spu-appearance',
210
- '<i class="spu-icon-magic spu-icon"></i>' . __( 'PopUp Appearance', 'popups' ),
211
- array( $this, 'popup_appearance' ),
212
- 'spucpt',
213
- 'normal',
214
- 'core'
215
- );
216
-
217
- add_meta_box(
218
- 'spu-rules',
219
- '<i class="spu-icon-eye spu-icon"></i>' . __( 'PopUp Display Rules', 'popups' ),
220
- array( $this, 'popup_rules' ),
221
- 'spucpt',
222
- 'normal',
223
- 'core'
224
- );
225
-
226
- add_meta_box(
227
- 'spu-options',
228
- '<i class="spu-icon-gears spu-icon"></i>' . __( 'Display Options', 'popups' ),
229
- array( $this, 'popup_options' ),
230
- 'spucpt',
231
- 'normal',
232
- 'core'
233
- );
234
- if( !$this->premium ) {
235
-
236
- add_meta_box(
237
- 'spu-premium',
238
- __( 'Popups Premium', 'popups' ),
239
- array( $this, 'popup_premium' ),
240
- 'spucpt',
241
- 'normal',
242
- 'core'
243
- );
244
-
245
- }
246
- add_meta_box(
247
- 'spu-help',
248
- '<i class="spu-icon-info spu-icon"></i>' . __( 'PopUp Shortcodes', 'popups' ),
249
- array( $this, 'popup_help' ),
250
- 'spucpt',
251
- 'normal',
252
- 'core'
253
- );
254
-
255
- add_meta_box(
256
- 'spu-support',
257
- __( 'Need support?', 'popups' ),
258
- array( $this, 'metabox_support' ),
259
- 'spucpt',
260
- 'side'
261
- );
262
-
263
- add_meta_box(
264
- 'spu-donate',
265
- __( 'Donate & support', 'popups' ),
266
- array( $this, 'metabox_donate' ),
267
- 'spucpt',
268
- 'side'
269
- );
270
-
271
- }
272
-
273
- /**
274
- * Include the metabox view for popup premium
275
- * @param object $post spucpt post object
276
- * @param array $metabox full metabox items array
277
- * @since 1.1
278
- */
279
- public function popup_premium( $post, $metabox ) {
280
-
281
- include 'views/metaboxes/metabox-premium.php';
282
- }
283
-
284
- /**
285
- * Include the metabox view for popup help
286
- * @param object $post spucpt post object
287
- * @param array $metabox full metabox items array
288
- * @since 1.1
289
- */
290
- public function popup_help( $post, $metabox ) {
291
-
292
- include 'views/metaboxes/metabox-help.php';
293
- }
294
- /**
295
- * Include the metabox view for popup rules
296
- * @param object $post spucpt post object
297
- * @param array $metabox full metabox items array
298
- * @since 1.1
299
- */
300
- public function popup_rules( $post, $metabox ) {
301
-
302
- $groups = apply_filters('spu/metaboxes/get_box_rules', $this->helper->get_box_rules( $post->ID ), $post->ID);
303
-
304
- include 'views/metaboxes/metabox-rules.php';
305
- }
306
- /**
307
- * Include the metabox view for popup options
308
- * @param object $post spucpt post object
309
- * @param array $metabox full metabox items array
310
- * @since 1.1
311
- */
312
- public function popup_options( $post, $metabox ) {
313
-
314
- $opts = apply_filters('spu/metaboxes/get_box_options', $this->helper->get_box_options( $post->ID ), $post->ID );
315
-
316
- include 'views/metaboxes/metabox-options.php';
317
- }
318
- /**
319
- * Include the metabox view for popup appearance
320
- * @param object $post spucpt post object
321
- * @param array $metabox full metabox items array
322
- * @since 1.1
323
- */
324
- public function popup_appearance( $post, $metabox ) {
325
-
326
- $opts = apply_filters('spu/metaboxes/get_box_options', $this->helper->get_box_options( $post->ID ), $post->ID );
327
-
328
- include 'views/metaboxes/metabox-appearance.php';
329
- }
330
-
331
- /**
332
- * Include the metabox view for donate box
333
- * @param object $post spucpt post object
334
- * @param array $metabox full metabox items array
335
- * @since 1.1
336
- */
337
- public function metabox_donate( $post, $metabox ) {
338
-
339
- $donate_metabox = apply_filters( 'spu/metaboxes/donate_metabox', dirname(__FILE__) . '/views/metaboxes/metabox-donate.php' );
340
-
341
- include $donate_metabox;
342
- }
343
-
344
- /**
345
- * Include the metabox view for help video
346
- * @param object $post spucpt post object
347
- * @param array $metabox full metabox items array
348
- * @since 1.1
349
- */
350
- public function metabox_video( $post, $metabox ) {
351
-
352
- $video_metabox = apply_filters( 'spu/metaboxes/video_metabox', dirname(__FILE__) . '/views/metaboxes/metabox-video.php' );
353
-
354
- include $video_metabox;
355
- }
356
- /**
357
- * Include the metabox view for support box
358
- * @param object $post spucpt post object
359
- * @param array $metabox full metabox items array
360
- * @since 1.1
361
- */
362
- public function metabox_support( $post, $metabox ) {
363
-
364
- $support_metabox = apply_filters( 'spu/metaboxes/support_metabox', dirname(__FILE__) . '/views/metaboxes/metabox-support.php' );
365
-
366
- include $support_metabox;
367
- }
368
-
369
-
370
- /**
371
- * Saves popup options and rules
372
- *
373
- * @param $post_id
374
- *
375
- * @return mixed
376
- */
377
- public function save_meta_options( $post_id ) {
378
- static $spu_save = 0;
379
-
380
- // For some reason sometimes this hook run twice, until I can find the reason and reproduce error
381
- // let's use a static var to prevent this
382
- if( $spu_save > 0 )
383
- return $post_id;
384
-
385
- // Verify that the nonce is set and valid.
386
- if ( !isset( $_POST['spu_options_nonce'] ) || ! wp_verify_nonce( $_POST['spu_options_nonce'], 'spu_options' ) ) {
387
- return $post_id;
388
- }
389
- // If this is an autosave, our form has not been submitted, so we don't want to do anything.
390
- if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
391
- return $post_id;
392
- }
393
- // same for ajax
394
- if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
395
- return $post_id;
396
- }
397
- // same for cron
398
- if ( defined( 'DOING_CRON' ) && DOING_CRON ) {
399
- return $post_id;
400
- }
401
- // same for posts revisions
402
- if ( wp_is_post_revision( $post_id ) ) {
403
- return $post_id;
404
- }
405
-
406
- // can user edit this post?
407
- if ( ! current_user_can( 'edit_post', $post_id ) ) {
408
- return $post_id;
409
- }
410
-
411
- $opts = $_POST['spu'];
412
- unset( $_POST['spu'] );
413
-
414
- $post = get_post($post_id);
415
-
416
- // sanitize settings
417
- $opts['css']['bgopacity'] = sanitize_text_field( $opts['css']['bgopacity'] );
418
- $opts['css']['overlay_color'] = sanitize_text_field( $opts['css']['overlay_color'] );
419
- $opts['css']['background_color'] = sanitize_text_field( $opts['css']['background_color'] );
420
- $opts['css']['background_opacity'] = sanitize_text_field( $opts['css']['background_opacity'] );
421
- $opts['css']['width'] = sanitize_text_field( $opts['css']['width'] );
422
- $opts['css']['padding'] = absint( sanitize_text_field( $opts['css']['padding'] ) );
423
- $opts['css']['color'] = sanitize_text_field( $opts['css']['color'] );
424
- $opts['css']['shadow_color'] = sanitize_text_field( $opts['css']['shadow_color'] );
425
- $opts['css']['shadow_type'] = sanitize_text_field( $opts['css']['shadow_type'] );
426
- $opts['css']['shadow_x_offset'] = absint( sanitize_text_field( $opts['css']['shadow_x_offset'] ) );
427
- $opts['css']['shadow_y_offset'] = absint( sanitize_text_field( $opts['css']['shadow_y_offset'] ) );
428
- $opts['css']['shadow_blur'] = absint( sanitize_text_field( $opts['css']['shadow_blur'] ) );
429
- $opts['css']['shadow_spread'] = absint( sanitize_text_field( $opts['css']['shadow_spread'] ) );
430
- $opts['css']['border_color'] = sanitize_text_field( $opts['css']['border_color'] );
431
- $opts['css']['border_width'] = absint( sanitize_text_field( $opts['css']['border_width'] ) );
432
- $opts['css']['border_radius'] = absint( sanitize_text_field( $opts['css']['border_radius'] ) );
433
- $opts['css']['border_type'] = sanitize_text_field( $opts['css']['border_type'] );
434
- $opts['css']['close_color'] = sanitize_text_field( $opts['css']['close_color'] );
435
- $opts['css']['close_hover_color'] = sanitize_text_field( $opts['css']['close_hover_color'] );
436
- $opts['css']['close_size'] = sanitize_text_field( $opts['css']['close_size'] );
437
- $opts['css']['close_position'] = sanitize_text_field( $opts['css']['close_position'] );
438
- $opts['css']['close_shadow_color'] = sanitize_text_field( $opts['css']['close_shadow_color'] );
439
- $opts['css']['position'] = sanitize_text_field( $opts['css']['position'] );
440
-
441
- $opts['name-convert-cookie'] = sanitize_text_field( $opts['name-convert-cookie'] ) ;
442
- $opts['name-close-cookie'] = sanitize_text_field( $opts['name-close-cookie'] );
443
- $opts['duration-convert-cookie'] = absint( sanitize_text_field( $opts['duration-convert-cookie'] ) );
444
- $opts['duration-close-cookie'] = absint( sanitize_text_field( $opts['duration-close-cookie'] ) );
445
- // add popup ID to make the unique
446
- $opts['name-convert-cookie'] = $opts['name-convert-cookie'] == 'spu_conversion' ? 'spu_conversion_'.$post_id : $opts['name-convert-cookie'] ;
447
- $opts['name-close-cookie'] = $opts['name-close-cookie'] == 'spu_closing' ? 'spu_closing_'.$post_id : $opts['name-close-cookie'];
448
-
449
- $opts['trigger_number'] = absint( sanitize_text_field( $opts['trigger_number'] ) );
450
-
451
-
452
-
453
- // Check for social shortcodes and update post meta ( we check later if we need to enqueue any social js)
454
- $total_shortcodes =0;
455
- if( has_shortcode( $post->post_content, 'spu-facebook' ) || has_shortcode( $post->post_content, 'spu-facebook-page' ) ){
456
- $total_shortcodes++;
457
- update_post_meta( $post_id, 'spu_fb', true );
458
- } else {
459
- delete_post_meta( $post_id, 'spu_fb');
460
- }
461
- if( has_shortcode( $post->post_content, 'spu-twitter' ) ){
462
- $total_shortcodes++;
463
- update_post_meta( $post_id, 'spu_tw', true );
464
- } else {
465
- delete_post_meta( $post_id, 'spu_tw');
466
- }
467
- if( has_shortcode( $post->post_content, 'spu-google' ) ){
468
- $total_shortcodes++;
469
- $opts['google'] = true;
470
- update_post_meta( $post_id, 'spu_google', true );
471
- } else {
472
- delete_post_meta( $post_id, 'spu_google');
473
- }
474
- // save total shortcodes (for auto styling)
475
- if( $total_shortcodes ){
476
- update_post_meta( $post_id, 'spu_social', $total_shortcodes );
477
- } else {
478
- delete_post_meta( $post_id, 'spu_social' );
479
- }
480
- if( has_shortcode( $post->post_content, 'gravityform' ) ) {
481
- preg_match('/\[gravityform id="([0-9]+)".*\]/i', $post->post_content, $matches);
482
- if( !empty( $matches[1] ) )
483
- update_post_meta( $post_id, 'spu_gravity', $matches[1]);
484
- } else {
485
- delete_post_meta( $post_id, 'spu_gravity' );
486
- }
487
-
488
- // save box settings
489
- update_post_meta( $post_id, 'spu_options', apply_filters( 'spu/metaboxes/sanitized_options', $opts ) );
490
-
491
- // Start with rules
492
- if( isset($_POST['spu_rules']) && is_array($_POST['spu_rules']) )
493
- {
494
- // clean array keys
495
- $groups = array_values( $_POST['spu_rules'] );
496
- foreach($groups as $group_id => $group )
497
- {
498
- if( is_array($group) )
499
- {
500
- // clean array keys
501
- $groups_a[] = array_values( $group );
502
-
503
- }
504
- }
505
-
506
- update_post_meta( $post_id, 'spu_rules', apply_filters( 'spu/metaboxes/sanitized_rules', $groups_a ) );
507
- unset( $_POST['spu_rules'] );
508
- }
509
- $spu_save++;
510
- }
511
- /**
512
- * Register and enqueue admin-specific style sheet.
513
- *
514
- * @TODO:
515
- *
516
- * - Rename "Plugin_Name" to the name your plugin
517
- *
518
- * @since 1.0.0
519
- *
520
- * @return null Return early if no settings page is registered.
521
- */
522
- public function enqueue_admin_styles() {
523
-
524
- global $pagenow;
525
-
526
- $post_type = isset($_GET['post_type']) ? $_GET['post_type'] : get_post_type();
527
-
528
- if ( $post_type !== 'spucpt' || !in_array( $pagenow, array( 'post-new.php', 'post.php', 'edit.php' ) ) ) {
529
- return;
530
- }
531
- wp_enqueue_style( 'spu-admin-css', plugins_url( 'assets/css/admin.css', __FILE__ ) , '', SocialPopup::VERSION );
532
- wp_enqueue_style( 'wp-color-picker' );
533
-
534
- }
535
-
536
- /**
537
- * Register and enqueue admin-specific JavaScript.
538
- *
539
- * @TODO:
540
- *
541
- * - Rename "Plugin_Name" to the name your plugin
542
- *
543
- * @since 1.0.0
544
- *
545
- * @return null Return early if no settings page is registered.
546
- */
547
- public function enqueue_admin_scripts() {
548
- global $pagenow, $post;
549
-
550
- if ( get_post_type() !== 'spucpt' || !in_array( $pagenow, array( 'post-new.php', 'edit.php', 'post.php' ) ) ) {
551
- return;
552
- }
553
-
554
- $box_id = isset( $post->ID ) ? $post->ID : '';
555
-
556
- wp_enqueue_script( 'wp-color-picker' );
557
- wp_enqueue_script( 'ace_code_highlighter_js', plugins_url( 'assets/js/ace.js', __FILE__ ) , '', '1.0.0', true );
558
- wp_enqueue_script( 'ace_mode_js', plugins_url( 'assets/js/mode-css.js', __FILE__ ) , array( 'ace_code_highlighter_js' ), '1.0.0', true );
559
- wp_enqueue_script( 'worker_css_js', plugins_url( 'assets/js/worker-css.js', __FILE__ ) , array( 'jquery', 'ace_code_highlighter_js' ), '1.0.0', true );
560
- wp_enqueue_script( 'spu-admin-js', plugins_url( 'assets/js/admin.js', __FILE__ ) , '', SocialPopup::VERSION );
561
-
562
- wp_localize_script( 'spu-admin-js', 'spu_js',
563
- array(
564
- 'admin_url' => admin_url( ),
565
- 'nonce' => wp_create_nonce( 'spu_nonce' ),
566
- 'l10n' => array (
567
- 'or' => '<span>'.__('OR', 'popups' ).'</span>'
568
- ),
569
- 'opts' => $this->helper->get_box_options($box_id)
570
- )
571
- );
572
-
573
- wp_localize_script( 'spup-admin-js' , 'spup_js' ,
574
- array(
575
- 'opts' => $this->helper->get_box_options($box_id),
576
- 'spinner' => SPU_PLUGIN_URL . 'public/assets/img/ajax-loader.gif'
577
-
578
- )
579
- );
580
- }
581
-
582
-
583
-
584
-
585
- /**
586
- * Add settings action link to the plugins page.
587
- *
588
- * @since 1.0.0
589
- */
590
- public function add_action_links( $links ) {
591
-
592
- return array_merge(
593
- array(
594
- 'settings' => '<a href="' . admin_url( 'edit.php?post_type=spucpt' ) . '">' . __( 'Add a Popup', 'popups' ) . '</a>'
595
- ),
596
- $links
597
- );
598
-
599
- }
600
-
601
- /**
602
- * Return available posts types. Used in filters
603
- * @param array $post_types custom post types
604
- * @param array $exclude cpt to explude
605
- * @param array $include cpts to include
606
- * @return array Resulting cpts
607
- */
608
- function get_post_types( $post_types, $exclude = array(), $include = array() ) {
609
-
610
- // get all custom post types
611
- $post_types = array_merge($post_types, get_post_types());
612
-
613
-
614
- // core include / exclude
615
- $spu_includes = array_merge( array(), $include );
616
- $spu_excludes = array_merge( array( 'spucpt', 'acf', 'revision', 'nav_menu_item','custom_css', 'customize_changeset', 'oembed_cache', 'wpvqgr_quiz_trivia', 'wpvqgr_quiz_perso', 'wpvqgr_user', 'popup', 'popup_theme', 'page_rating', 'sa_slider', 'faq', 'opanda-item', 'amn_smtp' ), $exclude );
617
-
618
- foreach( $spu_includes as $p )
619
- {
620
- if( post_type_exists($p) )
621
- {
622
- $post_types[ $p ] = $p;
623
- }
624
- }
625
-
626
-
627
- // exclude
628
- foreach( $spu_excludes as $p )
629
- {
630
- unset( $post_types[ $p ] );
631
- }
632
-
633
-
634
- return $post_types;
635
-
636
- }
637
-
638
- /**
639
- * Get taxonomies. Used in filters rules
640
- *
641
- * @param array $choices [description]
642
- * @param boolean $simple_value [description]
643
- *
644
- * @return array [type] [description]
645
- */
646
- function get_taxonomies( $choices, $simple_value = false ) {
647
-
648
- // vars
649
- $post_types = get_post_types();
650
-
651
-
652
- if($post_types)
653
- {
654
- foreach($post_types as $post_type)
655
- {
656
- $post_type_object = get_post_type_object($post_type);
657
- $taxonomies = get_object_taxonomies($post_type);
658
- if($taxonomies)
659
- {
660
- foreach($taxonomies as $taxonomy)
661
- {
662
- if( 'nav_menu' == $taxonomy ) continue;
663
- $terms = get_terms($taxonomy, array('hide_empty' => true));
664
- if($terms)
665
- {
666
- foreach($terms as $term)
667
- {
668
- $value = $taxonomy . ':' . $term->term_id;
669
-
670
- if( $simple_value )
671
- {
672
- $value = $term->term_id;
673
- }
674
-
675
- $choices[$post_type_object->label . ': ' . $taxonomy][$value] = $term->name;
676
- }
677
- }
678
- }
679
- }
680
- }
681
- }
682
-
683
- return $choices;
684
- }
685
-
686
- /**
687
- * Load tinymce style on load
688
- * @param [type] $args [description]
689
- * @return [type] [description]
690
- */
691
- public function tinymce_init($args) {
692
-
693
- if( get_post_type() !== 'spucpt') {
694
- return $args;
695
- }
696
- $func = '';
697
- // dirty hax, WPML replace our function so let's try to get theirs and add to ours
698
- // same with follow up emails by woocommerce
699
- if( array_key_exists('setup', $args) && strpos($args['setup'], 'function(ed)') !== false) {
700
- if( $pos = strpos($args['setup'], 'function(ed){') !== false ) {
701
- if( $pos < 15 ){
702
- $func .= rtrim(substr_replace($args['setup'],'',$pos,strlen('function(ed){')),'}');
703
- }
704
- }
705
- if( $pos = strpos($args['setup'], 'function(ed) {') !== false ) {
706
- if( $pos < 15 ){
707
- $func .= rtrim(substr_replace($args['setup'],'',$pos,strlen('function(ed) {')),'}');
708
- }
709
- }
710
-
711
- }
712
-
713
- $args['setup'] = 'function(ed) {
714
- if(typeof SPU_ADMIN === \'undefined\') {
715
- return;
716
- }
717
- ed.onInit.add(SPU_ADMIN.onTinyMceInit);
718
- if(typeof SPUP_ADMIN === \'undefined\') {
719
- return;
720
- }
721
- ed.onInit.add(SPUP_ADMIN.onTinyMceInit);
722
- '.$func.'
723
- }';
724
-
725
- return $args;
726
- }
727
-
728
- /**
729
- * Add the stylesheet for optin in editor
730
- * @since 1.2.3.6
731
- */
732
- function editor_styles() {
733
- global $pagenow;
734
- $post_type = isset($_GET['post']) ? get_post_type($_GET['post']) : '';
735
-
736
- if( 'spucpt' == $post_type || get_post_type() == 'spucpt' || (isset( $_GET['post_type']) && $_GET['post_type'] == 'spucpt') ) {
737
- add_editor_style( SPU_PLUGIN_URL . 'admin/assets/css/editor-style.css' );
738
- }
739
- // Add html for shortcodes popup
740
- if( 'post.php' == $pagenow || 'post-new.php' == $pagenow ) {
741
- wp_enqueue_script( 'jquery-ui-dialog' );
742
- wp_enqueue_style( 'wp-jquery-ui-dialog' );
743
- add_action( 'in_admin_footer', array($this, 'add_editor' ),100 );
744
-
745
- }
746
- }
747
-
748
- function get_rules_choices() {
749
- $choices = array(
750
- __("User", 'popups' ) => array(
751
- 'user_type' => __("User role", 'popups' ),
752
- 'logged_user' => __("User is logged", 'popups' ),
753
- 'left_comment' => __("User never left a comment", 'popups' ),
754
- 'search_engine' => __("User came via a search engine", 'popups' ),
755
- 'same_site' => __("User did not arrive via another page on your site", 'popups' ),
756
- ),
757
- __("Post", 'popups' ) => array(
758
- 'post' => __("Post", 'popups' ),
759
- 'post_id' => __("Post ID", 'popups' ),
760
- 'post_type' => __("Post Type", 'popups' ),
761
- 'post_category' => __("Post Category", 'popups' ),
762
- 'post_format' => __("Post Format", 'popups' ),
763
- 'post_status' => __("Post Status", 'popups' ),
764
- 'taxonomy' => __("Post Taxonomy", 'popups' ),
765
- ),
766
- __("Page", 'popups' ) => array(
767
- 'page' => __("Page", 'popups' ),
768
- 'page_type' => __("Page Type", 'popups' ),
769
- 'page_parent' => __("Page Parent", 'popups' ),
770
- 'page_template' => __("Page Template", 'popups' ),
771
- ),
772
- __("Other", 'popups' ) => array(
773
- 'referrer' => __("Referrer", 'popups' ),
774
- 'query_string' => __("Query String", 'popups' ),
775
- 'keyword_url' => __("Url contains keyword", 'popups' ),
776
- 'custom_url' => __("Custom Url", 'popups' ),
777
- 'mobiles' => __("Mobile Phone", 'popups' ),
778
- 'tablets' => __("Tablet", 'popups' ),
779
- 'desktop' => __("Dekstop", 'popups' ),
780
- 'crawlers' => __("Bots/Crawlers", 'popups' ),
781
- 'browser' => __("Browser", 'popups' ),
782
- )
783
- );
784
- // allow custom rules rules
785
- return apply_filters( 'spu/metaboxes/rule_types', $choices );
786
- }
787
-
788
- /**
789
- * Hook each rule to a field to print
790
- */
791
- private function set_rules_fields() {
792
-
793
- // User
794
- add_action('spu/rules/print_user_type_field', array('Spu_Helper', 'print_select'), 10, 2);
795
- add_action('spu/rules/print_logged_user_field', array('Spu_Helper', 'print_select'), 10, 2);
796
- add_action('spu/rules/print_left_comment_field', array('Spu_Helper', 'print_select'), 10, 2);
797
- add_action('spu/rules/print_search_engine_field', array('Spu_Helper', 'print_select'), 10, 2);
798
- add_action('spu/rules/print_same_site_field', array('Spu_Helper', 'print_select'), 10, 2);
799
-
800
- // Post
801
- add_action('spu/rules/print_post_type_field', array('Spu_Helper', 'print_select'), 10, 2);
802
- add_action('spu/rules/print_post_id_field', array('Spu_Helper', 'print_textfield'), 10, 1);
803
- add_action('spu/rules/print_post_field', array('Spu_Helper', 'print_select'), 10, 2);
804
- add_action('spu/rules/print_post_category_field', array('Spu_Helper', 'print_select'), 10, 2);
805
- add_action('spu/rules/print_post_format_field', array('Spu_Helper', 'print_select'), 10, 2);
806
- add_action('spu/rules/print_post_status_field', array('Spu_Helper', 'print_select'), 10, 2);
807
- add_action('spu/rules/print_taxonomy_field', array('Spu_Helper', 'print_select'), 10, 2);
808
-
809
- // Page
810
- add_action('spu/rules/print_page_field', array('Spu_Helper', 'print_select'), 10, 2);
811
- add_action('spu/rules/print_page_type_field', array('Spu_Helper', 'print_select'), 10, 2);
812
- add_action('spu/rules/print_page_parent_field', array('Spu_Helper', 'print_select'), 10, 2);
813
- add_action('spu/rules/print_page_template_field', array('Spu_Helper', 'print_select'), 10, 2);
814
-
815
- //Other
816
- add_action('spu/rules/print_mobiles_field', array('Spu_Helper', 'print_select'), 10, 2);
817
- add_action('spu/rules/print_desktop_field', array('Spu_Helper', 'print_select'), 10, 2);
818
- add_action('spu/rules/print_tablets_field', array('Spu_Helper', 'print_select'), 10, 2);
819
- add_action('spu/rules/print_crawlers_field', array('Spu_Helper', 'print_select'), 10, 2);
820
- add_action('spu/rules/print_referrer_field', array('Spu_Helper', 'print_textfield'), 10, 1);
821
- add_action('spu/rules/print_query_string_field', array('Spu_Helper', 'print_textfield'), 10, 1);
822
- add_action('spu/rules/print_keyword_url_field', array('Spu_Helper', 'print_textfield'), 10, 1);
823
- add_action('spu/rules/print_custom_url_field', array('Spu_Helper', 'print_textfield'), 10, 1);
824
- add_action('spu/rules/print_browser_field', array('Spu_Helper', 'print_textfield'), 10, 1);
825
- }
826
-
827
- /**
828
- * Add custom columns to spu cpt
829
- *
830
- * @param [type] $columns [description]
831
- *
832
- * @since 1.3.3
833
- * @return array|int
834
- */
835
- public function set_custom_cpt_columns( $columns ){
836
-
837
- unset( $columns['date'] );
838
- $spu_switch = array( 'spu_switch' => __( 'On / Off', 'popups' ) );
839
- $columns = array_slice($columns, 0, 1, true) + $spu_switch + array_slice($columns, 1, count( $columns ) - 1, true) ;
840
- $columns['spu_id'] = __( 'ID', 'popups' );
841
- $columns['spu_trigger_class'] = __( 'Trigger class', 'popups' );
842
-
843
- return $columns;
844
- }
845
- /**
846
- * Add callbacks for custom colums
847
- * @param array $column [description]
848
- * @param int $post_id [description]
849
- * @return echo html
850
- * @since 1.3.3
851
- */
852
- function custom_columns( $column, $post_id ) {
853
- global $wpdb;
854
-
855
- switch ( $column ) {
856
- case 'spu_id' :
857
- echo '#spu-'.$post_id;
858
- break;
859
- case 'spu_switch' :
860
- echo '<a href="'. wp_nonce_url( admin_url('edit.php?post_type=spucpt&post='. $post_id . '&spu_action=spu_toggle_on'), 'spu_toggle_on', 'spu_nonce') .'"><i class="spu-icon spu-icon-';
861
- echo get_post_status( $post_id ) == 'publish' ? 'toggle-on' : 'toggle-off';
862
- echo '"></i></a>';
863
- break;
864
- case 'spu_trigger_class':
865
- echo '.spu-open-' . $post_id;
866
- break;
867
- }
868
- }
869
-
870
- /**
871
- * Catch the toggle on/off action and change post status
872
- * Redirect to clear url once is completed
873
- */
874
- function toggle_on_popup() {
875
- //checks
876
- if ( ! isset( $_GET['spu_action'] ) || $_GET['spu_action'] != 'spu_toggle_on' )
877
- return;
878
- if ( !isset( $_GET['spu_nonce'] ) || !wp_verify_nonce($_GET['spu_nonce'], 'spu_toggle_on') )
879
- return;
880
- if ( empty( $_GET['post'] ) )
881
- return;
882
- $post_id = esc_attr( $_GET['post'] );
883
- $post_status = get_post_status( $post_id );
884
-
885
- $post = array(
886
- 'ID' => $post_id,
887
- 'post_status' => $post_status != 'publish' ? 'publish' : 'draft'
888
- );
889
- wp_update_post( $post );
890
- wp_safe_redirect( admin_url('edit.php?post_type=spucpt') );
891
- exit;
892
- }
893
-
894
- /**
895
- * Add filters for tinymce buttons
896
- */
897
- public function register_tiny_buttons() {
898
- add_filter( "mce_external_plugins", array( $this, "add_button" ) );
899
- add_filter( 'mce_buttons', array( $this, 'register_button' ) );
900
- }
901
-
902
- /**
903
- * Add buton js file
904
- * @param [type] $plugin_array [description]
905
- */
906
- function add_button( $plugin_array ) {
907
-
908
- $plugin_array['spu'] = plugins_url( 'assets/js/spu-tinymce.js' , __FILE__ );
909
- return $plugin_array;
910
-
911
- }
912
-
913
- /**
914
- * Register button
915
- * @param [type] $buttons [description]
916
- * @return [type] [description]
917
- */
918
- function register_button( $buttons ) {
919
- array_push( $buttons, '|', 'spu_button' ); // dropcap', 'recentposts
920
- return $buttons;
921
- }
922
-
923
- /**
924
- * Add popup editor for
925
- */
926
- function add_editor() {
927
-
928
- include 'includes/tinymce-editor.php';
929
-
930
- }
931
-
932
- /**
933
- * Save into db the dimissed notice
934
- * @return [type] [description]
935
- */
936
- function ajax_notice_handler() {
937
- update_option( 'spu_enabled_cache', TRUE );
938
- die();
939
- }
940
-
941
- /**
942
- * Extra checks needed on admin init
943
- */
944
- public function extra_checks(){
945
- // second check it's because on 1.9 by mistake was not added SPUP_VERSION
946
- if( ( defined('SPUP_VERSION') && version_compare(SPUP_VERSION, '1.9.1', '<') ) || ( defined( 'SPUP_PLUGIN_FILE') && ! defined('SPUP_VERSION') ) ){
947
- deactivate_plugins( array('popups-premium/popups-premium.php'));
948
- update_option('spu_pair_plugins',true);
949
- add_action( 'admin_notices', array('SocialPopup_Notices','pair_plugins' ));
950
- }
951
- }
952
- }
1
+ <?php
2
+ /**
3
+ * Popups.
4
+ *
5
+ * @package SocialPopup_Admin
6
+ * @author Damian Logghe <info@timersys.com>
7
+ * @license GPL-2.0+
8
+ * @link https://timersys.com
9
+ * @copyright 2014 Timersys
10
+ */
11
+
12
+
13
+ define( 'SPU_ADMIN_DIR' , plugin_dir_path(__FILE__) );
14
+
15
+
16
+ /**
17
+ * Admin Class of the plugin
18
+ *
19
+ * @package SocialPopup_Admin
20
+ * @author Damian Logghe <info@timersys.com>
21
+ */
22
+ class SocialPopup_Admin {
23
+
24
+ /**
25
+ * Instance of this class.
26
+ *
27
+ * @since 1.0.0
28
+ *
29
+ * @var object
30
+ */
31
+ protected static $instance = null;
32
+
33
+ /**
34
+ * Slug of the plugin screen.
35
+ *
36
+ * @since 1.0.0
37
+ *
38
+ * @var string
39
+ */
40
+ protected $plugin_screen_hook_suffix = null;
41
+
42
+ /**
43
+ * Plugins settings
44
+ * @var array
45
+ */
46
+ protected $spu_settings = array();
47
+
48
+ /**
49
+ * Premium version is enabled
50
+ *
51
+ * @since 1.1
52
+ *
53
+ * @var bool
54
+ */
55
+ protected $premium = false;
56
+
57
+ /**
58
+ * Helper function
59
+ *
60
+ * @since 1.1
61
+ *
62
+ * @var bool
63
+ */
64
+ protected $helper = '';
65
+
66
+ /**
67
+ * Initialize the plugin by loading admin scripts & styles and adding a
68
+ * settings page and menu.
69
+ *
70
+ * @since 1.0.0
71
+ */
72
+ private function __construct() {
73
+
74
+
75
+ $plugin = SocialPopup::get_instance();
76
+ $this->plugin_slug = $plugin->get_plugin_slug();
77
+
78
+ // helper funcs
79
+ $this->helper = new Spu_Helper;
80
+
81
+ //settings name
82
+ $this->options_name = $this->plugin_slug .'_settings';
83
+
84
+ //load settings
85
+ $this->spu_settings = $plugin->get_settings();
86
+
87
+ //premium version ?
88
+ $this->premium = defined('SPUP_PLUGIN_HOOK');
89
+
90
+ // add settings page
91
+ add_action('admin_menu' , array( $this, 'add_settings_menu' ) );
92
+
93
+ //Add our metaboxes
94
+ add_action( 'add_meta_boxes', array( $this, 'add_meta_boxes' ) );
95
+
96
+ //Save metaboxes
97
+ add_action( 'save_post_spucpt', array( $this, 'save_meta_options' ), 20 );
98
+
99
+ // Load admin style sheet and JavaScript.
100
+ add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_admin_styles' ) );
101
+ add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_admin_scripts' ) );
102
+
103
+ // Add an action link pointing to the options page.
104
+ add_filter( 'plugin_action_links_' . SPU_PLUGIN_HOOK, array( $this, 'add_action_links' ) );
105
+
106
+ //Filters for rules
107
+ add_filter('spu/get_post_types', array($this, 'get_post_types'), 1, 3);
108
+ add_filter('spu/get_taxonomies', array($this, 'get_taxonomies'), 1, 3);
109
+
110
+ //AJAX Actions
111
+ add_action('wp_ajax_spu/field_group/render_rules', array( $this->helper, 'ajax_render_rules' ) );
112
+ add_action('wp_ajax_spu/field_group/render_operator', array( $this->helper, 'ajax_render_operator' ) );
113
+ add_action('wp_ajax_spu_enable_ajax_notice_handler', array( $this, 'ajax_notice_handler' ) );
114
+
115
+ //Tinymce
116
+ add_filter( 'tiny_mce_before_init', array($this, 'tinymce_init'), 9999 );
117
+ add_action( 'admin_init', array( $this, 'editor_styles' ) );
118
+ add_action( 'init', array( $this, 'register_tiny_buttons' ) );
119
+
120
+ //Columns in cpt
121
+ add_filter( 'manage_edit-spucpt_columns' , array( $this, 'set_custom_cpt_columns'), 10, 2 );
122
+ add_action( 'manage_spucpt_posts_custom_column' , array( $this, 'custom_columns'), 10, 2 );
123
+ add_action( 'admin_init' , array( $this, 'toggle_on_popup') );
124
+
125
+ add_action( 'admin_init' , array( $this, 'extra_checks') );
126
+
127
+ $this->set_rules_fields();
128
+ }
129
+
130
+ /**
131
+ * Return an instance of this class.
132
+ *
133
+ * @since 1.0.0
134
+ *
135
+ * @return object A single instance of this class.
136
+ */
137
+ public static function get_instance() {
138
+
139
+
140
+ // If the single instance hasn't been set, set it now.
141
+ if ( null == self::$instance ) {
142
+ self::$instance = new self;
143
+ }
144
+
145
+ return self::$instance;
146
+ }
147
+
148
+
149
+ /**
150
+ * Add menu for Settings page of the plugin
151
+ * @since 1.1
152
+ * @return void
153
+ */
154
+ public function add_settings_menu() {
155
+
156
+ add_submenu_page('edit.php?post_type=spucpt', __( 'Settings', 'popups' ), __( 'Settings', 'popups' ), apply_filters( 'spu/settings_page/roles', 'manage_options'), 'spu_settings', array( $this, 'settings_page' ) );
157
+
158
+ }
159
+
160
+
161
+
162
+ /**
163
+ * Settings page of the plugin
164
+ * @since 1.1
165
+ * @return void
166
+ */
167
+ public function settings_page() {
168
+
169
+ $defaults = apply_filters( 'spu/settings_page/defaults_opts', array(
170
+ 'aff_link' => '',
171
+ 'ajax_mode' => '0',
172
+ 'shortcodes_style' => '',
173
+ 'facebook' => '',
174
+ 'google' => '',
175
+ 'twitter' => '',
176
+ 'spu_license_key' => '',
177
+ 'ua_code' => '',
178
+ 'mc_api' => '',
179
+ ));
180
+ $opts = apply_filters( 'spu/settings_page/opts', get_option( 'spu_settings', $defaults ) );
181
+
182
+
183
+ if ( isset( $_POST['spu_nonce'] ) && wp_verify_nonce( $_POST['spu_nonce'], 'spu_save_settings' ) ) {
184
+ $opts = esc_sql( @$_POST['spu_settings'] );
185
+ update_option( 'spu_settings' , $opts );
186
+ }
187
+
188
+
189
+ include 'views/settings-page.php';
190
+
191
+ }
192
+
193
+ /**
194
+ * Register the metaboxes for our cpt and remove others
195
+ */
196
+ public function add_meta_boxes() {
197
+
198
+
199
+ add_meta_box(
200
+ 'spu-video',
201
+ '<i class="spu-icon-info spu-icon"></i>' . __( 'Help video', 'popups' ),
202
+ array( $this, 'metabox_video' ),
203
+ 'spucpt',
204
+ 'normal',
205
+ 'core'
206
+ );
207
+
208
+ add_meta_box(
209
+ 'spu-appearance',
210
+ '<i class="spu-icon-magic spu-icon"></i>' . __( 'PopUp Appearance', 'popups' ),
211
+ array( $this, 'popup_appearance' ),
212
+ 'spucpt',
213
+ 'normal',
214
+ 'core'
215
+ );
216
+
217
+ add_meta_box(
218
+ 'spu-rules',
219
+ '<i class="spu-icon-eye spu-icon"></i>' . __( 'PopUp Display Rules', 'popups' ),
220
+ array( $this, 'popup_rules' ),
221
+ 'spucpt',
222
+ 'normal',
223
+ 'core'
224
+ );
225
+
226
+ add_meta_box(
227
+ 'spu-options',
228
+ '<i class="spu-icon-gears spu-icon"></i>' . __( 'Display Options', 'popups' ),
229
+ array( $this, 'popup_options' ),
230
+ 'spucpt',
231
+ 'normal',
232
+ 'core'
233
+ );
234
+ if( !$this->premium ) {
235
+
236
+ add_meta_box(
237
+ 'spu-premium',
238
+ __( 'Popups Premium', 'popups' ),
239
+ array( $this, 'popup_premium' ),
240
+ 'spucpt',
241
+ 'normal',
242
+ 'core'
243
+ );
244
+
245
+ }
246
+ add_meta_box(
247
+ 'spu-help',
248
+ '<i class="spu-icon-info spu-icon"></i>' . __( 'PopUp Shortcodes', 'popups' ),
249
+ array( $this, 'popup_help' ),
250
+ 'spucpt',
251
+ 'normal',
252
+ 'core'
253
+ );
254
+
255
+ add_meta_box(
256
+ 'spu-support',
257
+ __( 'Need support?', 'popups' ),
258
+ array( $this, 'metabox_support' ),
259
+ 'spucpt',
260
+ 'side'
261
+ );
262
+
263
+ add_meta_box(
264
+ 'spu-donate',
265
+ __( 'Donate & support', 'popups' ),
266
+ array( $this, 'metabox_donate' ),
267
+ 'spucpt',
268
+ 'side'
269
+ );
270
+
271
+ }
272
+
273
+ /**
274
+ * Include the metabox view for popup premium
275
+ * @param object $post spucpt post object
276
+ * @param array $metabox full metabox items array
277
+ * @since 1.1
278
+ */
279
+ public function popup_premium( $post, $metabox ) {
280
+
281
+ include 'views/metaboxes/metabox-premium.php';
282
+ }
283
+
284
+ /**
285
+ * Include the metabox view for popup help
286
+ * @param object $post spucpt post object
287
+ * @param array $metabox full metabox items array
288
+ * @since 1.1
289
+ */
290
+ public function popup_help( $post, $metabox ) {
291
+
292
+ include 'views/metaboxes/metabox-help.php';
293
+ }
294
+ /**
295
+ * Include the metabox view for popup rules
296
+ * @param object $post spucpt post object
297
+ * @param array $metabox full metabox items array
298
+ * @since 1.1
299
+ */
300
+ public function popup_rules( $post, $metabox ) {
301
+
302
+ $groups = apply_filters('spu/metaboxes/get_box_rules', $this->helper->get_box_rules( $post->ID ), $post->ID);
303
+
304
+ include 'views/metaboxes/metabox-rules.php';
305
+ }
306
+ /**
307
+ * Include the metabox view for popup options
308
+ * @param object $post spucpt post object
309
+ * @param array $metabox full metabox items array
310
+ * @since 1.1
311
+ */
312
+ public function popup_options( $post, $metabox ) {
313
+
314
+ $opts = apply_filters('spu/metaboxes/get_box_options', $this->helper->get_box_options( $post->ID ), $post->ID );
315
+
316
+ include 'views/metaboxes/metabox-options.php';
317
+ }
318
+ /**
319
+ * Include the metabox view for popup appearance
320
+ * @param object $post spucpt post object
321
+ * @param array $metabox full metabox items array
322
+ * @since 1.1
323
+ */
324
+ public function popup_appearance( $post, $metabox ) {
325
+
326
+ $opts = apply_filters('spu/metaboxes/get_box_options', $this->helper->get_box_options( $post->ID ), $post->ID );
327
+
328
+ include 'views/metaboxes/metabox-appearance.php';
329
+ }
330
+
331
+ /**
332
+ * Include the metabox view for donate box
333
+ * @param object $post spucpt post object
334
+ * @param array $metabox full metabox items array
335
+ * @since 1.1
336
+ */
337
+ public function metabox_donate( $post, $metabox ) {
338
+
339
+ $donate_metabox = apply_filters( 'spu/metaboxes/donate_metabox', dirname(__FILE__) . '/views/metaboxes/metabox-donate.php' );
340
+
341
+ include $donate_metabox;
342
+ }
343
+
344
+ /**
345
+ * Include the metabox view for help video
346
+ * @param object $post spucpt post object
347
+ * @param array $metabox full metabox items array
348
+ * @since 1.1
349
+ */
350
+ public function metabox_video( $post, $metabox ) {
351
+
352
+ $video_metabox = apply_filters( 'spu/metaboxes/video_metabox', dirname(__FILE__) . '/views/metaboxes/metabox-video.php' );
353
+
354
+ include $video_metabox;
355
+ }
356
+ /**
357
+ * Include the metabox view for support box
358
+ * @param object $post spucpt post object
359
+ * @param array $metabox full metabox items array
360
+ * @since 1.1
361
+ */
362
+ public function metabox_support( $post, $metabox ) {
363
+
364
+ $support_metabox = apply_filters( 'spu/metaboxes/support_metabox', dirname(__FILE__) . '/views/metaboxes/metabox-support.php' );
365
+
366
+ include $support_metabox;
367
+ }
368
+
369
+
370
+ /**
371
+ * Saves popup options and rules
372
+ *
373
+ * @param $post_id
374
+ *
375
+ * @return mixed
376
+ */
377
+ public function save_meta_options( $post_id ) {
378
+ static $spu_save = 0;
379
+
380
+ // For some reason sometimes this hook run twice, until I can find the reason and reproduce error
381
+ // let's use a static var to prevent this
382
+ if( $spu_save > 0 )
383
+ return $post_id;
384
+
385
+ // Verify that the nonce is set and valid.
386
+ if ( !isset( $_POST['spu_options_nonce'] ) || ! wp_verify_nonce( $_POST['spu_options_nonce'], 'spu_options' ) ) {
387
+ return $post_id;
388
+ }
389
+ // If this is an autosave, our form has not been submitted, so we don't want to do anything.
390
+ if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
391
+ return $post_id;
392
+ }
393
+ // same for ajax
394
+ if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
395
+ return $post_id;
396
+ }
397
+ // same for cron
398
+ if ( defined( 'DOING_CRON' ) && DOING_CRON ) {
399
+ return $post_id;
400
+ }
401
+ // same for posts revisions
402
+ if ( wp_is_post_revision( $post_id ) ) {
403
+ return $post_id;
404
+ }
405
+
406
+ // can user edit this post?
407
+ if ( ! current_user_can( 'edit_post', $post_id ) ) {
408
+ return $post_id;
409
+ }
410
+
411
+ $opts = $_POST['spu'];
412
+ unset( $_POST['spu'] );
413
+
414
+ $post = get_post($post_id);
415
+
416
+ // sanitize settings
417
+ $opts['css']['bgopacity'] = sanitize_text_field( $opts['css']['bgopacity'] );
418
+ $opts['css']['overlay_color'] = sanitize_text_field( $opts['css']['overlay_color'] );
419
+ $opts['css']['background_color'] = sanitize_text_field( $opts['css']['background_color'] );
420
+ $opts['css']['background_opacity'] = sanitize_text_field( $opts['css']['background_opacity'] );
421
+ $opts['css']['width'] = sanitize_text_field( $opts['css']['width'] );
422
+ $opts['css']['padding'] = absint( sanitize_text_field( $opts['css']['padding'] ) );
423
+ $opts['css']['color'] = sanitize_text_field( $opts['css']['color'] );
424
+ $opts['css']['shadow_color'] = sanitize_text_field( $opts['css']['shadow_color'] );
425
+ $opts['css']['shadow_type'] = sanitize_text_field( $opts['css']['shadow_type'] );
426
+ $opts['css']['shadow_x_offset'] = absint( sanitize_text_field( $opts['css']['shadow_x_offset'] ) );
427
+ $opts['css']['shadow_y_offset'] = absint( sanitize_text_field( $opts['css']['shadow_y_offset'] ) );
428
+ $opts['css']['shadow_blur'] = absint( sanitize_text_field( $opts['css']['shadow_blur'] ) );
429
+ $opts['css']['shadow_spread'] = absint( sanitize_text_field( $opts['css']['shadow_spread'] ) );
430
+ $opts['css']['border_color'] = sanitize_text_field( $opts['css']['border_color'] );
431
+ $opts['css']['border_width'] = absint( sanitize_text_field( $opts['css']['border_width'] ) );
432
+ $opts['css']['border_radius'] = absint( sanitize_text_field( $opts['css']['border_radius'] ) );
433
+ $opts['css']['border_type'] = sanitize_text_field( $opts['css']['border_type'] );
434
+ $opts['css']['close_color'] = sanitize_text_field( $opts['css']['close_color'] );
435
+ $opts['css']['close_hover_color'] = sanitize_text_field( $opts['css']['close_hover_color'] );
436
+ $opts['css']['close_size'] = sanitize_text_field( $opts['css']['close_size'] );
437
+ $opts['css']['close_position'] = sanitize_text_field( $opts['css']['close_position'] );
438
+ $opts['css']['close_shadow_color'] = sanitize_text_field( $opts['css']['close_shadow_color'] );
439
+ $opts['css']['position'] = sanitize_text_field( $opts['css']['position'] );
440
+
441
+ $opts['name-convert-cookie'] = sanitize_text_field( $opts['name-convert-cookie'] ) ;
442
+ $opts['name-close-cookie'] = sanitize_text_field( $opts['name-close-cookie'] );
443
+ $opts['duration-convert-cookie'] = absint( sanitize_text_field( $opts['duration-convert-cookie'] ) );
444
+ $opts['duration-close-cookie'] = absint( sanitize_text_field( $opts['duration-close-cookie'] ) );
445
+ // add popup ID to make the unique
446
+ $opts['name-convert-cookie'] = $opts['name-convert-cookie'] == 'spu_conversion' ? 'spu_conversion_'.$post_id : $opts['name-convert-cookie'] ;
447
+ $opts['name-close-cookie'] = $opts['name-close-cookie'] == 'spu_closing' ? 'spu_closing_'.$post_id : $opts['name-close-cookie'];
448
+
449
+ $opts['trigger_number'] = absint( sanitize_text_field( $opts['trigger_number'] ) );
450
+
451
+
452
+
453
+ // Check for social shortcodes and update post meta ( we check later if we need to enqueue any social js)
454
+ $total_shortcodes =0;
455
+ if( has_shortcode( $post->post_content, 'spu-facebook' ) || has_shortcode( $post->post_content, 'spu-facebook-page' ) ){
456
+ $total_shortcodes++;
457
+ update_post_meta( $post_id, 'spu_fb', true );
458
+ } else {
459
+ delete_post_meta( $post_id, 'spu_fb');
460
+ }
461
+ if( has_shortcode( $post->post_content, 'spu-twitter' ) ){
462
+ $total_shortcodes++;
463
+ update_post_meta( $post_id, 'spu_tw', true );
464
+ } else {
465
+ delete_post_meta( $post_id, 'spu_tw');
466
+ }
467
+ if( has_shortcode( $post->post_content, 'spu-google' ) ){
468
+ $total_shortcodes++;
469
+ $opts['google'] = true;
470
+ update_post_meta( $post_id, 'spu_google', true );
471
+ } else {
472
+ delete_post_meta( $post_id, 'spu_google');
473
+ }
474
+ // save total shortcodes (for auto styling)
475
+ if( $total_shortcodes ){
476
+ update_post_meta( $post_id, 'spu_social', $total_shortcodes );
477
+ } else {
478
+ delete_post_meta( $post_id, 'spu_social' );
479
+ }
480
+ if( has_shortcode( $post->post_content, 'gravityform' ) ) {
481
+ preg_match('/\[gravityform id="([0-9]+)".*\]/i', $post->post_content, $matches);
482
+ if( !empty( $matches[1] ) )
483
+ update_post_meta( $post_id, 'spu_gravity', $matches[1]);
484
+ } else {
485
+ delete_post_meta( $post_id, 'spu_gravity' );
486
+ }
487
+
488
+ // save box settings
489
+ update_post_meta( $post_id, 'spu_options', apply_filters( 'spu/metaboxes/sanitized_options', $opts ) );
490
+
491
+ // Start with rules
492
+ if( isset($_POST['spu_rules']) && is_array($_POST['spu_rules']) )
493
+ {
494
+ // clean array keys
495
+ $groups = array_values( $_POST['spu_rules'] );
496
+ foreach($groups as $group_id => $group )
497
+ {
498
+ if( is_array($group) )
499
+ {
500
+ // clean array keys
501
+ $groups_a[] = array_values( $group );
502
+
503
+ }
504
+ }
505
+
506
+ update_post_meta( $post_id, 'spu_rules', apply_filters( 'spu/metaboxes/sanitized_rules', $groups_a ) );
507
+ unset( $_POST['spu_rules'] );
508
+ }
509
+ $spu_save++;
510
+ }
511
+ /**
512
+ * Register and enqueue admin-specific style sheet.
513
+ *
514
+ * @TODO:
515
+ *
516
+ * - Rename "Plugin_Name" to the name your plugin
517
+ *
518
+ * @since 1.0.0
519
+ *
520
+ * @return null Return early if no settings page is registered.
521
+ */
522
+ public function enqueue_admin_styles() {
523
+
524
+ global $pagenow;
525
+
526
+ $post_type = isset($_GET['post_type']) ? $_GET['post_type'] : get_post_type();
527
+
528
+ if ( $post_type !== 'spucpt' || !in_array( $pagenow, array( 'post-new.php', 'post.php', 'edit.php' ) ) ) {
529
+ return;
530
+ }
531
+ wp_enqueue_style( 'spu-admin-css', plugins_url( 'assets/css/admin.css', __FILE__ ) , '', SocialPopup::VERSION );
532
+ wp_enqueue_style( 'wp-color-picker' );
533
+
534
+ }
535
+
536
+ /**
537
+ * Register and enqueue admin-specific JavaScript.
538
+ *
539
+ * @TODO:
540
+ *
541
+ * - Rename "Plugin_Name" to the name your plugin
542
+ *
543
+ * @since 1.0.0
544
+ *
545
+ * @return null Return early if no settings page is registered.
546
+ */
547
+ public function enqueue_admin_scripts() {
548
+ global $pagenow, $post;
549
+
550
+ if ( get_post_type() !== 'spucpt' || !in_array( $pagenow, array( 'post-new.php', 'edit.php', 'post.php' ) ) ) {
551
+ return;
552
+ }
553
+
554
+ $box_id = isset( $post->ID ) ? $post->ID : '';
555
+
556
+ wp_enqueue_script( 'wp-color-picker' );
557
+ wp_enqueue_script( 'ace_code_highlighter_js', plugins_url( 'assets/js/ace.js', __FILE__ ) , '', '1.0.0', true );
558
+ wp_enqueue_script( 'ace_mode_js', plugins_url( 'assets/js/mode-css.js', __FILE__ ) , array( 'ace_code_highlighter_js' ), '1.0.0', true );
559
+ wp_enqueue_script( 'worker_css_js', plugins_url( 'assets/js/worker-css.js', __FILE__ ) , array( 'jquery', 'ace_code_highlighter_js' ), '1.0.0', true );
560
+ wp_enqueue_script( 'spu-admin-js', plugins_url( 'assets/js/admin.js', __FILE__ ) , '', SocialPopup::VERSION );
561
+
562
+ wp_localize_script( 'spu-admin-js', 'spu_js',
563
+ array(
564
+ 'admin_url' => admin_url( ),
565
+ 'nonce' => wp_create_nonce( 'spu_nonce' ),
566
+ 'l10n' => array (
567
+ 'or' => '<span>'.__('OR', 'popups' ).'</span>'
568
+ ),
569
+ 'opts' => $this->helper->get_box_options($box_id)
570
+ )
571
+ );
572
+
573
+ wp_localize_script( 'spup-admin-js' , 'spup_js' ,
574
+ array(
575
+ 'opts' => $this->helper->get_box_options($box_id),
576
+ 'spinner' => SPU_PLUGIN_URL . 'public/assets/img/ajax-loader.gif'
577
+
578
+ )
579
+ );
580
+ }
581
+
582
+
583
+
584
+
585
+ /**
586
+ * Add settings action link to the plugins page.
587
+ *
588
+ * @since 1.0.0
589
+ */
590
+ public function add_action_links( $links ) {
591
+
592
+ return array_merge(
593
+ array(
594
+ 'settings' => '<a href="' . admin_url( 'edit.php?post_type=spucpt' ) . '">' . __( 'Add a Popup', 'popups' ) . '</a>'
595
+ ),
596
+ $links
597
+ );
598
+
599
+ }
600
+
601
+ /**
602
+ * Return available posts types. Used in filters
603
+ * @param array $post_types custom post types
604
+ * @param array $exclude cpt to explude
605
+ * @param array $include cpts to include
606
+ * @return array Resulting cpts
607
+ */
608
+ function get_post_types( $post_types, $exclude = array(), $include = array() ) {
609
+
610
+ // get all custom post types
611
+ $post_types = array_merge($post_types, get_post_types());
612
+
613
+
614
+ // core include / exclude
615
+ $spu_includes = array_merge( array(), $include );
616
+ $spu_excludes = array_merge( array( 'spucpt', 'acf', 'revision', 'nav_menu_item','custom_css', 'customize_changeset', 'oembed_cache', 'wpvqgr_quiz_trivia', 'wpvqgr_quiz_perso', 'wpvqgr_user', 'popup', 'popup_theme', 'page_rating', 'sa_slider', 'faq', 'opanda-item', 'amn_smtp' ), $exclude );
617
+
618
+ foreach( $spu_includes as $p )
619
+ {
620
+ if( post_type_exists($p) )
621
+ {
622
+ $post_types[ $p ] = $p;
623
+ }
624
+ }
625
+
626
+
627
+ // exclude
628
+ foreach( $spu_excludes as $p )
629
+ {
630
+ unset( $post_types[ $p ] );
631
+ }
632
+
633
+
634
+ return $post_types;
635
+
636
+ }
637
+
638
+ /**
639
+ * Get taxonomies. Used in filters rules
640
+ *
641
+ * @param array $choices [description]
642
+ * @param boolean $simple_value [description]
643
+ *
644
+ * @return array [type] [description]
645
+ */
646
+ function get_taxonomies( $choices, $simple_value = false ) {
647
+
648
+ // vars
649
+ $post_types = get_post_types();
650
+
651
+
652
+ if($post_types)
653
+ {
654
+ foreach($post_types as $post_type)
655
+ {
656
+ $post_type_object = get_post_type_object($post_type);
657
+ $taxonomies = get_object_taxonomies($post_type);
658
+ if($taxonomies)
659
+ {
660
+ foreach($taxonomies as $taxonomy)
661
+ {
662
+ if( 'nav_menu' == $taxonomy ) continue;
663
+ $terms = get_terms($taxonomy, array('hide_empty' => true));
664
+ if($terms)
665
+ {
666
+ foreach($terms as $term)
667
+ {
668
+ $value = $taxonomy . ':' . $term->term_id;
669
+
670
+ if( $simple_value )
671
+ {
672
+ $value = $term->term_id;
673
+ }
674
+
675
+ $choices[$post_type_object->label . ': ' . $taxonomy][$value] = $term->name;
676
+ }
677
+ }
678
+ }
679
+ }
680
+ }
681
+ }
682
+
683
+ return $choices;
684
+ }
685
+
686
+ /**
687
+ * Load tinymce style on load
688
+ * @param [type] $args [description]
689
+ * @return [type] [description]
690
+ */
691
+ public function tinymce_init($args) {
692
+
693
+ if( get_post_type() !== 'spucpt') {
694
+ return $args;
695
+ }
696
+ $func = '';
697
+ // dirty hax, WPML replace our function so let's try to get theirs and add to ours
698
+ // same with follow up emails by woocommerce
699
+ if( array_key_exists('setup', $args) && strpos($args['setup'], 'function(ed)') !== false) {
700
+ if( $pos = strpos($args['setup'], 'function(ed){') !== false ) {
701
+ if( $pos < 15 ){
702
+ $func .= rtrim(substr_replace($args['setup'],'',$pos,strlen('function(ed){')),'}');
703
+ }
704
+ }
705
+ if( $pos = strpos($args['setup'], 'function(ed) {') !== false ) {
706
+ if( $pos < 15 ){
707
+ $func .= rtrim(substr_replace($args['setup'],'',$pos,strlen('function(ed) {')),'}');
708
+ }
709
+ }
710
+
711
+ }
712
+
713
+ $args['setup'] = 'function(ed) {
714
+ if(typeof SPU_ADMIN === \'undefined\') {
715
+ return;
716
+ }
717
+ ed.onInit.add(SPU_ADMIN.onTinyMceInit);
718
+ if(typeof SPUP_ADMIN === \'undefined\') {
719
+ return;
720
+ }
721
+ ed.onInit.add(SPUP_ADMIN.onTinyMceInit);
722
+ '.$func.'
723
+ }';
724
+
725
+ return $args;
726
+ }
727
+
728
+ /**
729
+ * Add the stylesheet for optin in editor
730
+ * @since 1.2.3.6
731
+ */
732
+ function editor_styles() {
733
+ global $pagenow;
734
+ $post_type = isset($_GET['post']) ? get_post_type($_GET['post']) : '';
735
+
736
+ if( 'spucpt' == $post_type || get_post_type() == 'spucpt' || (isset( $_GET['post_type']) && $_GET['post_type'] == 'spucpt') ) {
737
+ add_editor_style( SPU_PLUGIN_URL . 'admin/assets/css/editor-style.css' );
738
+ }
739
+ // Add html for shortcodes popup
740
+ if( 'post.php' == $pagenow || 'post-new.php' == $pagenow ) {
741
+ wp_enqueue_script( 'jquery-ui-dialog' );
742
+ wp_enqueue_style( 'wp-jquery-ui-dialog' );
743
+ add_action( 'in_admin_footer', array($this, 'add_editor' ),100 );
744
+
745
+ }
746
+ }
747
+
748
+ function get_rules_choices() {
749
+ $choices = array(
750
+ __("User", 'popups' ) => array(
751
+ 'user_type' => __("User role", 'popups' ),
752
+ 'logged_user' => __("User is logged", 'popups' ),
753
+ 'left_comment' => __("User never left a comment", 'popups' ),
754
+ 'search_engine' => __("User came via a search engine", 'popups' ),
755
+ 'same_site' => __("User did not arrive via another page on your site", 'popups' ),
756
+ ),
757
+ __("Post", 'popups' ) => array(
758
+ 'post' => __("Post", 'popups' ),
759
+ 'post_id' => __("Post ID", 'popups' ),
760
+ 'post_type' => __("Post Type", 'popups' ),
761
+ 'post_category' => __("Post Category", 'popups' ),
762
+ 'post_format' => __("Post Format", 'popups' ),
763
+ 'post_status' => __("Post Status", 'popups' ),
764
+ 'taxonomy' => __("Post Taxonomy", 'popups' ),
765
+ ),
766
+ __("Page", 'popups' ) => array(
767
+ 'page' => __("Page", 'popups' ),
768
+ 'page_type' => __("Page Type", 'popups' ),
769
+ 'page_parent' => __("Page Parent", 'popups' ),
770
+ 'page_template' => __("Page Template", 'popups' ),
771
+ ),
772
+ __("Other", 'popups' ) => array(
773
+ 'referrer' => __("Referrer", 'popups' ),
774
+ 'query_string' => __("Query String", 'popups' ),
775
+ 'keyword_url' => __("Url contains keyword", 'popups' ),
776
+ 'custom_url' => __("Custom Url", 'popups' ),
777
+ 'mobiles' => __("Mobile Phone", 'popups' ),
778
+ 'tablets' => __("Tablet", 'popups' ),
779
+ 'desktop' => __("Dekstop", 'popups' ),
780
+ 'crawlers' => __("Bots/Crawlers", 'popups' ),
781
+ 'browser' => __("Browser", 'popups' ),
782
+ )
783
+ );
784
+ // allow custom rules rules
785
+ return apply_filters( 'spu/metaboxes/rule_types', $choices );
786
+ }
787
+
788
+ /**
789
+ * Hook each rule to a field to print
790
+ */
791
+ private function set_rules_fields() {
792
+
793
+ // User
794
+ add_action('spu/rules/print_user_type_field', array('Spu_Helper', 'print_select'), 10, 2);
795
+ add_action('spu/rules/print_logged_user_field', array('Spu_Helper', 'print_select'), 10, 2);
796
+ add_action('spu/rules/print_left_comment_field', array('Spu_Helper', 'print_select'), 10, 2);
797
+ add_action('spu/rules/print_search_engine_field', array('Spu_Helper', 'print_select'), 10, 2);
798
+ add_action('spu/rules/print_same_site_field', array('Spu_Helper', 'print_select'), 10, 2);
799
+
800
+ // Post
801
+ add_action('spu/rules/print_post_type_field', array('Spu_Helper', 'print_select'), 10, 2);
802
+ add_action('spu/rules/print_post_id_field', array('Spu_Helper', 'print_textfield'), 10, 1);
803
+ add_action('spu/rules/print_post_field', array('Spu_Helper', 'print_select'), 10, 2);
804
+ add_action('spu/rules/print_post_category_field', array('Spu_Helper', 'print_select'), 10, 2);
805
+ add_action('spu/rules/print_post_format_field', array('Spu_Helper', 'print_select'), 10, 2);
806
+ add_action('spu/rules/print_post_status_field', array('Spu_Helper', 'print_select'), 10, 2);
807
+ add_action('spu/rules/print_taxonomy_field', array('Spu_Helper', 'print_select'), 10, 2);
808
+
809
+ // Page
810
+ add_action('spu/rules/print_page_field', array('Spu_Helper', 'print_select'), 10, 2);
811
+ add_action('spu/rules/print_page_type_field', array('Spu_Helper', 'print_select'), 10, 2);
812
+ add_action('spu/rules/print_page_parent_field', array('Spu_Helper', 'print_select'), 10, 2);
813
+ add_action('spu/rules/print_page_template_field', array('Spu_Helper', 'print_select'), 10, 2);
814
+
815
+ //Other
816
+ add_action('spu/rules/print_mobiles_field', array('Spu_Helper', 'print_select'), 10, 2);
817
+ add_action('spu/rules/print_desktop_field', array('Spu_Helper', 'print_select'), 10, 2);
818
+ add_action('spu/rules/print_tablets_field', array('Spu_Helper', 'print_select'), 10, 2);
819
+ add_action('spu/rules/print_crawlers_field', array('Spu_Helper', 'print_select'), 10, 2);
820
+ add_action('spu/rules/print_referrer_field', array('Spu_Helper', 'print_textfield'), 10, 1);
821
+ add_action('spu/rules/print_query_string_field', array('Spu_Helper', 'print_textfield'), 10, 1);
822
+ add_action('spu/rules/print_keyword_url_field', array('Spu_Helper', 'print_textfield'), 10, 1);
823
+ add_action('spu/rules/print_custom_url_field', array('Spu_Helper', 'print_textfield'), 10, 1);
824
+ add_action('spu/rules/print_browser_field', array('Spu_Helper', 'print_textfield'), 10, 1);
825
+ }
826
+
827
+ /**
828
+ * Add custom columns to spu cpt
829
+ *
830
+ * @param [type] $columns [description]
831
+ *
832
+ * @since 1.3.3
833
+ * @return array|int
834
+ */
835
+ public function set_custom_cpt_columns( $columns ){
836
+
837
+ unset( $columns['date'] );
838
+ $spu_switch = array( 'spu_switch' => __( 'On / Off', 'popups' ) );
839
+ $columns = array_slice($columns, 0, 1, true) + $spu_switch + array_slice($columns, 1, count( $columns ) - 1, true) ;
840
+ $columns['spu_id'] = __( 'ID', 'popups' );
841
+ $columns['spu_trigger_class'] = __( 'Trigger class', 'popups' );
842
+
843
+ return $columns;
844
+ }
845
+ /**
846
+ * Add callbacks for custom colums
847
+ * @param array $column [description]
848
+ * @param int $post_id [description]
849
+ * @return echo html
850
+ * @since 1.3.3
851
+ */
852
+ function custom_columns( $column, $post_id ) {
853
+ global $wpdb;
854
+
855
+ switch ( $column ) {
856
+ case 'spu_id' :
857
+ echo '#spu-'.$post_id;
858
+ break;
859
+ case 'spu_switch' :
860
+ echo '<a href="'. wp_nonce_url( admin_url('edit.php?post_type=spucpt&post='. $post_id . '&spu_action=spu_toggle_on'), 'spu_toggle_on', 'spu_nonce') .'"><i class="spu-icon spu-icon-';
861
+ echo get_post_status( $post_id ) == 'publish' ? 'toggle-on' : 'toggle-off';
862
+ echo '"></i></a>';
863
+ break;
864
+ case 'spu_trigger_class':
865
+ echo '.spu-open-' . $post_id;
866
+ break;
867
+ }
868
+ }
869
+
870
+ /**
871
+ * Catch the toggle on/off action and change post status
872
+ * Redirect to clear url once is completed
873
+ */
874
+ function toggle_on_popup() {
875
+ //checks
876
+ if ( ! isset( $_GET['spu_action'] ) || $_GET['spu_action'] != 'spu_toggle_on' )
877
+ return;
878
+ if ( !isset( $_GET['spu_nonce'] ) || !wp_verify_nonce($_GET['spu_nonce'], 'spu_toggle_on') )
879
+ return;
880
+ if ( empty( $_GET['post'] ) )
881
+ return;
882
+ $post_id = esc_attr( $_GET['post'] );
883
+ $post_status = get_post_status( $post_id );
884
+
885
+ $post = array(
886
+ 'ID' => $post_id,
887
+ 'post_status' => $post_status != 'publish' ? 'publish' : 'draft'
888
+ );
889
+ wp_update_post( $post );
890
+ wp_safe_redirect( admin_url('edit.php?post_type=spucpt') );
891
+ exit;
892
+ }
893
+
894
+ /**
895
+ * Add filters for tinymce buttons
896
+ */
897
+ public function register_tiny_buttons() {
898
+ add_filter( "mce_external_plugins", array( $this, "add_button" ) );
899
+ add_filter( 'mce_buttons', array( $this, 'register_button' ) );
900
+ }
901
+
902
+ /**
903
+ * Add buton js file
904
+ * @param [type] $plugin_array [description]
905
+ */
906
+ function add_button( $plugin_array ) {
907
+
908
+ $plugin_array['spu'] = plugins_url( 'assets/js/spu-tinymce.js' , __FILE__ );
909
+ return $plugin_array;
910
+
911
+ }
912
+
913
+ /**
914
+ * Register button
915
+ * @param [type] $buttons [description]
916
+ * @return [type] [description]
917
+ */
918
+ function register_button( $buttons ) {
919
+ array_push( $buttons, '|', 'spu_button' ); // dropcap', 'recentposts
920
+ return $buttons;
921
+ }
922
+
923
+ /**
924
+ * Add popup editor for
925
+ */
926
+ function add_editor() {
927
+
928
+ include 'includes/tinymce-editor.php';
929
+
930
+ }
931
+
932
+ /**
933
+ * Save into db the dimissed notice
934
+ * @return [type] [description]
935
+ */
936
+ function ajax_notice_handler() {
937
+ update_option( 'spu_enabled_cache', TRUE );
938
+ die();
939
+ }
940
+
941
+ /**
942
+ * Extra checks needed on admin init
943
+ */
944
+ public function extra_checks(){
945
+ // second check it's because on 1.9 by mistake was not added SPUP_VERSION
946
+ if( ( defined('SPUP_VERSION') && version_compare(SPUP_VERSION, '1.9.1', '<') ) || ( defined( 'SPUP_PLUGIN_FILE') && ! defined('SPUP_VERSION') ) ){
947
+ deactivate_plugins( array('popups-premium/popups-premium.php'));
948
+ update_option('spu_pair_plugins',true);
949
+ add_action( 'admin_notices', array('SocialPopup_Notices','pair_plugins' ));
950
+ }
951
+ }
952
+ }
admin/includes/class-spu-notices.php CHANGED
@@ -1,46 +1,46 @@
1
- <?php
2
-
3
- /**
4
- * Class that handle all admin notices
5
- *
6
- * @since 1.3.1
7
- * @package SocialPopup
8
- * @subpackage SocialPopup/Admin/Includes
9
- * @author Damian Logghe <info@timersys.com>
10
- */
11
- class SocialPopup_Notices {
12
-
13
-
14
- /**
15
- * Initialize the class and set its properties.
16
- *
17
- * @since 1.3.1
18
- */
19
- public function __construct( ) {
20
-
21
- if( isset( $_GET['spu_notice'])){
22
- update_option('spu_'.esc_attr($_GET['spu_notice']), true);
23
- }
24
- }
25
-
26
-
27
- public function rate_plugin(){
28
- ?><div class="notice-info notice">
29
- <h3><i class=" dashicons-before dashicons-share-alt"></i>WordPress Popups Plugin</h3>
30
- <p><?php echo sprintf(__( 'We noticed that you have been using our plugin for a while and we would like to ask you a little favour. If you are happy with it and can take a minute please <a href="%s" target="_blank">leave a nice review</a> on WordPress. It will be a tremendous help for us!', 'spu' ), 'https://wordpress.org/support/view/plugin-reviews/popups?filter=5' ); ?></p>
31
- <ul>
32
- <li><?php echo sprintf(__('<a href="%s" target="_blank">Leave a nice review</a>'),'https://wordpress.org/support/view/plugin-reviews/popups?filter=5');?></li>
33
- <li><?php echo sprintf(__('<a href="%s">I already did</a>'), admin_url('?spu_notice=rate_plugin'));?></li>
34
- </ul>
35
- </div><?php
36
- }
37
-
38
- public static function pair_plugins(){
39
- ?><div class="notice-info error">
40
- <h3><i class=" dashicons-before dashicons-share-alt"></i>WordPress Popups Plugin error</h3>
41
- <p><?php _e('The Popups premium was automatically deactivated.', 'spu');?></p>
42
- <p><?php _e( 'Your current version of Popups premium it\'s not compatible with the core Popups plugin you just installed/updated. Please upgrade your premium version to at least 1.9.1 or downgrade the core version to 1.7.3 .', 'spu' ); ?></p>
43
- <p><a href="<?= admin_url('?spu_notice=pair_plugins_dismiss');?>" class="button-primary"><?php _e('Dismiss','spu');?></a></p>
44
- </div><?php
45
- }
46
- }
1
+ <?php
2
+
3
+ /**
4
+ * Class that handle all admin notices
5
+ *
6
+ * @since 1.3.1
7
+ * @package SocialPopup
8
+ * @subpackage SocialPopup/Admin/Includes
9
+ * @author Damian Logghe <info@timersys.com>
10
+ */
11
+ class SocialPopup_Notices {
12
+
13
+
14
+ /**
15
+ * Initialize the class and set its properties.
16
+ *
17
+ * @since 1.3.1
18
+ */
19
+ public function __construct( ) {
20
+
21
+ if( isset( $_GET['spu_notice'])){
22
+ update_option('spu_'.esc_attr($_GET['spu_notice']), true);
23
+ }
24
+ }
25
+
26
+
27
+ public function rate_plugin(){
28
+ ?><div class="notice-info notice">
29
+ <h3><i class=" dashicons-before dashicons-share-alt"></i>WordPress Popups Plugin</h3>
30
+ <p><?php echo sprintf(__( 'We noticed that you have been using our plugin for a while and we would like to ask you a little favour. If you are happy with it and can take a minute please <a href="%s" target="_blank">leave a nice review</a> on WordPress. It will be a tremendous help for us!', 'spu' ), 'https://wordpress.org/support/view/plugin-reviews/popups?filter=5' ); ?></p>
31
+ <ul>
32
+ <li><?php echo sprintf(__('<a href="%s" target="_blank">Leave a nice review</a>'),'https://wordpress.org/support/view/plugin-reviews/popups?filter=5');?></li>
33
+ <li><?php echo sprintf(__('<a href="%s">I already did</a>'), admin_url('?spu_notice=rate_plugin'));?></li>
34
+ </ul>
35
+ </div><?php
36
+ }
37
+
38
+ public static function pair_plugins(){
39
+ ?><div class="notice-info error">
40
+ <h3><i class=" dashicons-before dashicons-share-alt"></i>WordPress Popups Plugin error</h3>
41
+ <p><?php _e('The Popups premium was automatically deactivated.', 'spu');?></p>
42
+ <p><?php _e( 'Your current version of Popups premium it\'s not compatible with the core Popups plugin you just installed/updated. Please upgrade your premium version to at least 1.9.1 or downgrade the core version to 1.7.3 .', 'spu' ); ?></p>
43
+ <p><a href="<?= admin_url('?spu_notice=pair_plugins_dismiss');?>" class="button-primary"><?php _e('Dismiss','spu');?></a></p>
44
+ </div><?php
45
+ }
46
+ }
admin/includes/class-spu-upgrader.php CHANGED
@@ -1,29 +1,29 @@
1
- <?php
2
-
3
- /*
4
- * Upgrader Class
5
- *
6
- * @description: Upgrade rutines and upgrade messages
7
- * @since 1.3.1
8
- * @version 1.0
9
- */
10
-
11
- class SocialPopup_Upgrader {
12
-
13
- public function upgrade_plugin() {
14
- global $wpdb;
15
- $current_version = get_option('spu-version');
16
-
17
- if( !get_option('spu_plugin_updated') ) {
18
- // show feedback box if updating plugin
19
- if ( empty( $current_version ) ) {
20
- $total = $wpdb->get_var( "SELECT count(*) FROM $wpdb->posts WHERE post_status = 'publish' AND post_type = 'spucpt'" );
21
- if ( $total > 0 ) {
22
- update_option( 'spu_plugin_updated', true );
23
- }
24
- } elseif ( ! empty( $current_version ) && version_compare( $current_version, SPU_VERSION, '<' ) ) {
25
- update_option( 'spu_plugin_updated', true );
26
- }
27
- }
28
- }
29
  }
1
+ <?php
2
+
3
+ /*
4
+ * Upgrader Class
5
+ *
6
+ * @description: Upgrade rutines and upgrade messages
7
+ * @since 1.3.1
8
+ * @version 1.0
9
+ */
10
+
11
+ class SocialPopup_Upgrader {
12
+
13
+ public function upgrade_plugin() {
14
+ global $wpdb;
15
+ $current_version = get_option('spu-version');
16
+
17
+ if( !get_option('spu_plugin_updated') ) {
18
+ // show feedback box if updating plugin
19
+ if ( empty( $current_version ) ) {
20
+ $total = $wpdb->get_var( "SELECT count(*) FROM $wpdb->posts WHERE post_status = 'publish' AND post_type = 'spucpt'" );
21
+ if ( $total > 0 ) {
22
+ update_option( 'spu_plugin_updated', true );
23
+ }
24
+ } elseif ( ! empty( $current_version ) && version_compare( $current_version, SPU_VERSION, '<' ) ) {
25
+ update_option( 'spu_plugin_updated', true );
26
+ }
27
+ }
28
+ }
29
  }
admin/includes/tinymce-editor.php CHANGED
@@ -1,38 +1,38 @@
1
- <form name="form" autocomplete="off">
2
- <div id="spu_editor" class="shortcode_editor" title="Insert popup link to page" style="display:none;height:500px">
3
- <div style="display: none;"><!--hack for chrome-->
4
- <input type="text" id="PreventChromeAutocomplete" name="PreventChromeAutocomplete" autocomplete="address-level4" />
5
- </div>
6
- <table class="form-table">
7
- <tr>
8
- <td colspan="2">
9
- <p>
10
- <?php _e('Choose which popup you want to insert. This will generate an href link that you can use with text or images', 'spu');?>
11
- </p>
12
- </td>
13
- </tr>
14
- <tr>
15
- <th><label for="spu_what"><?php _e( 'Choose:', 'spu' ); ?></label></th>
16
- <td>
17
- <select name="spu-post" id="spu-posts">
18
- <option value=""><?php _e('Choose one','spu');?></option>
19
- <?php
20
-
21
- global $wpdb;
22
- $popups = $wpdb->get_results( "SELECT post_title, ID FROM $wpdb->posts WHERE post_status = 'publish' AND post_type = 'spucpt'");
23
-
24
- // The Loop
25
- if ( $popups ) {
26
- foreach( $popups as $po ) {
27
- echo '<option value="'.$po->ID.'">'.$po->post_title.'</option>"';
28
- }
29
- }
30
-
31
- ?>
32
- </select>
33
- </td>
34
- </tr>
35
-
36
- </table>
37
- </div>
38
- </form>
1
+ <form name="form" autocomplete="off">
2
+ <div id="spu_editor" class="shortcode_editor" title="Insert popup link to page" style="display:none;height:500px">
3
+ <div style="display: none;"><!--hack for chrome-->
4
+ <input type="text" id="PreventChromeAutocomplete" name="PreventChromeAutocomplete" autocomplete="address-level4" />
5
+ </div>
6
+ <table class="form-table">
7
+ <tr>
8
+ <td colspan="2">
9
+ <p>
10
+ <?php _e('Choose which popup you want to insert. This will generate an href link that you can use with text or images', 'spu');?>
11
+ </p>
12
+ </td>
13
+ </tr>
14
+ <tr>
15
+ <th><label for="spu_what"><?php _e( 'Choose:', 'spu' ); ?></label></th>
16
+ <td>
17
+ <select name="spu-post" id="spu-posts">
18
+ <option value=""><?php _e('Choose one','spu');?></option>
19
+ <?php
20
+
21
+ global $wpdb;
22
+ $popups = $wpdb->get_results( "SELECT post_title, ID FROM $wpdb->posts WHERE post_status = 'publish' AND post_type = 'spucpt'");
23
+
24
+ // The Loop
25
+ if ( $popups ) {
26
+ foreach( $popups as $po ) {
27
+ echo '<option value="'.$po->ID.'">'.$po->post_title.'</option>"';
28
+ }
29
+ }
30
+
31
+ ?>
32
+ </select>
33
+ </td>
34
+ </tr>
35
+
36
+ </table>
37
+ </div>
38
+ </form>
admin/views/metaboxes/metabox-appearance.php CHANGED
@@ -1,211 +1,211 @@
1
- <?php
2
- // Exit if accessed directly
3
- if ( !defined( 'ABSPATH' ) ) exit;?>
4
-
5
- <div class="spu-admin-options">
6
-
7
- <?php do_action( 'spu/metaboxes/before_appearance_options', $opts );?>
8
- <h3>Overlay</h3>
9
- <table class="form-table">
10
- <tr>
11
- <th><label class="spu-label" for="spu_bgopacity"><?php _e( 'Overlay opacity', 'popups' ); ?></label></th>
12
- <td>
13
- <input type="number" id="spu_bgopacity" name="spu[css][bgopacity]" min="0" step="0.1" max="1" value="<?php echo esc_attr($opts['css']['bgopacity']); ?>" />
14
- <p class="spu-help"><?php _e( 'Leave at 0 for no background. Max value is 1', 'popups' ); ?></p>
15
- </td>
16
- </tr>
17
- <tr>
18
- <th><label class="spu-label" for="spu_bgcolor"><?php _e( 'Overlay color', 'popups' ); ?></label></th>
19
- <td>
20
- <input id="spu_bgcolor" name="spu[css][overlay_color]" type="text" class="spu-color-field" value="<?php echo esc_attr($opts['css']['overlay_color']); ?>" />
21
- </td>
22
- </tr>
23
- <?php do_action( 'spu/metaboxes/after_overlay_appearance', $opts );?>
24
- <tr><th colspan="2"><?php if( ! defined('SPUP_VERSION') ) echo sprintf( __( 'On <a href="%s">Premium version</a> you can have full screen popups, or sticky popups, insert optin forms inside yours post and much more!','popups'), 'https://timersys.com/plugins/popups-premium/?utm_source=Plugin&utm_medium=appearance_overlay&utm_campaign=Popups%20Premium');?></th></tr>
25
- </table>
26
- <h3>Popup Background</h3>
27
- <table class="form-table">
28
- <tr>
29
- <th><label class="spu-label" for="spu-background-color"><?php _e( 'Background color', 'popups' ); ?></label></th>
30
- <td>
31
- <input id="spu-background-color" name="spu[css][background_color]" type="text" class="spu-color-field" value="<?php echo esc_attr($opts['css']['background_color']); ?>" />
32
- </td>
33
- </tr>
34
- <tr>
35
- <th><label class="spu-label" for="spu_background_opacity"><?php _e( 'Background opacity', 'popups' ); ?></label></th>
36
- <td>
37
- <input type="number" id="spu_background_opacity" name="spu[css][background_opacity]" min="0" step="0.1" max="1" value="<?php echo esc_attr($opts['css']['background_opacity']); ?>" />
38
- <p class="spu-help"><?php _e( 'Leave at 0 for no background. Max value is 1', 'popups' ); ?></p>
39
- </td>
40
- </tr>
41
- <?php do_action( 'spu/metaboxes/after_background_appearance', $opts );?>
42
- <tr><th colspan="2"><?php if( ! defined('SPUP_VERSION') ) echo sprintf( __( 'Check <a href="%s">Premium version</a> to add background images or choose a pre made optin theme!','popups'), 'https://timersys.com/plugins/popups-premium/?utm_source=Plugin&utm_medium=appearance_bg&utm_campaign=Popups%20Premium');?></th></tr>
43
- </table>
44
- <h3>Popup Box</h3>
45
- <table class="form-table">
46
- <tr class="hide-for-optins">
47
- <th><label class="spu-label" for="spu-width"><?php _e( 'Box width', 'popups' ); ?></label></th>
48
- <td>
49
- <input id="spu-width" name="spu[css][width]" id="spu-box-width" type="text" class="small" value="<?php echo esc_attr($opts['css']['width']); ?>" />
50
- <p class="spu-help"><?php _e( 'Max size the responsive popup will grow. You can use % or px.', 'popups' ); ?></p>
51
- </td>
52
- </tr>
53
- <tr class="hide-for-optins">
54
- <th><label class="spu-label" for="spu-padding"><?php _e( 'Padding', 'popups' ); ?></label></th>
55
- <td>
56
- <input id="spu-padding" name="spu[css][padding]" id="spu-box-padding" type="number" class="small" value="<?php echo esc_attr($opts['css']['padding']); ?>" />px
57
- </td>
58
- </tr>
59
- <tr>
60
- <th><label class="spu-label" for="spu-color"><?php _e( 'Text color', 'popups' ); ?></label></th>
61
- <td>
62
- <input id="spu-color" name="spu[css][color]" type="text" class="spu-color-field" value="<?php echo esc_attr($opts['css']['color']); ?>" />
63
- </td>
64
- </tr>
65
- <?php do_action( 'spu/metaboxes/after_box_appearance', $opts );?>
66
- </table>
67
- <h3>Popup Shadow</h3>
68
- <table class="form-table">
69
- <tr>
70
- <th><label class="spu-label" for="spu-shadow-color"><?php _e( 'Shadow Color', 'popups' ); ?></label></th>
71
- <td>
72
- <input id="spu-shadow-color" name="spu[css][shadow_color]" type="text" class="spu-color-field" value="<?php echo esc_attr($opts['css']['shadow_color']); ?>" />
73
- </td>
74
- </tr>
75
- <tr>
76
- <th><label class="spu-label" for="spu-shadow-type"><?php _e( 'Shadow Type', 'popups' ); ?></label></th>
77
- <td>
78
- <select name="spu[css][shadow_type]" id="spu-shadow-type">
79
- <option value="inset" <?php selected('inset',esc_attr($opts['css']['shadow_type']));?>>Inset</option>
80
- <option value="outset" <?php selected('outset',esc_attr($opts['css']['shadow_type']));?>>Outset</option>
81
- </select>
82
- </td>
83
- </tr>
84
- <tr>
85
- <th><label class="spu-label" for="spu-shadow-x"><?php _e( 'X Offset', 'popups' ); ?></label></th>
86
- <td>
87
- <input id="spu-shadow-x" name="spu[css][shadow_x_offset]" type="number" step="1" class="small" value="<?php echo esc_attr($opts['css']['shadow_x_offset']); ?>" />px
88
- </td>
89
- </tr>
90
- <tr>
91
- <th><label class="spu-label" for="spu-shadow-y"><?php _e( 'Y Offset', 'popups' ); ?></label></th>
92
- <td>
93
- <input id="spu-shadow-y" name="spu[css][shadow_y_offset]" type="number" step="1" class="small" value="<?php echo esc_attr($opts['css']['shadow_y_offset']); ?>" />px
94
- </td>
95
- </tr>
96
- <tr>
97
- <th><label class="spu-label" for="spu-shadow-blur"><?php _e( 'Blur', 'popups' ); ?></label></th>
98
- <td>
99
- <input id="spu-shadow-blur" name="spu[css][shadow_blur]" type="number" step="1" class="small" value="<?php echo esc_attr($opts['css']['shadow_blur']); ?>" />px
100
- </td>
101
- </tr>
102
- <tr>
103
- <th><label class="spu-label" for="spu-shadow-spread"><?php _e( 'Spread', 'popups' ); ?></label></th>
104
- <td>
105
- <input id="spu-shadow-spread" name="spu[css][shadow_spread]" type="number" step="1" class="small" value="<?php echo esc_attr($opts['css']['shadow_spread']); ?>" />px
106
- </td>
107
- </tr>
108
- <?php do_action( 'spu/metaboxes/after_shadow_appearance', $opts );?>
109
- </table>
110
- <h3>Border</h3>
111
-
112
- <table class="form-table">
113
- <tr>
114
- <th><label class="spu-label" for="spu-border-color"><?php _e( 'Border color', 'popups' ); ?></label></th>
115
- <td>
116
- <input name="spu[css][border_color]" id="spu-border-color" type="text" class="spu-color-field" value="<?php echo esc_attr($opts['css']['border_color']); ?>" />
117
- </td>
118
- </tr>
119
- <tr>
120
- <th><label class="spu-label" for="spu-border-width"><?php _e( 'Border width', 'popups' ); ?></label></th>
121
- <td>
122
- <input name="spu[css][border_width]" id="spu-border-width" type="number" min="0" max="25" value="<?php echo esc_attr($opts['css']['border_width']); ?>" /> px
123
- </td>
124
- </tr>
125
- <tr>
126
- <th><label class="spu-label" for="spu-border-radius"><?php _e( 'Border radius', 'popups' ); ?></label></th>
127
- <td>
128
- <input name="spu[css][border_radius]" id="spu-border-radius" type="number" min="0" max="25" value="<?php echo esc_attr($opts['css']['border_radius']); ?>" /> px
129
- </td>
130
- </tr>
131
- <tr>
132
- <th><label class="spu-label" for="spu-border-type"><?php _e( 'Border type', 'popups' ); ?></label></th>
133
- <td>
134
- <select name="spu[css][border_type]" id="spu-border-type">
135
- <option value="none" <?php selected('none',esc_attr($opts['css']['border_type']));?>>None</option>
136
- <option value="solid" <?php selected('solid',esc_attr($opts['css']['border_type']));?>>Solid</option>
137
- <option value="dotted" <?php selected('dotted',esc_attr($opts['css']['border_type']));?>>Dotted</option>
138
- <option value="dashed" <?php selected('dashed',esc_attr($opts['css']['border_type']));?>>Dashed</option>
139
- <option value="double" <?php selected('double',esc_attr($opts['css']['border_type']));?>>Double</option>
140
- <option value="groove" <?php selected('groove',esc_attr($opts['css']['border_type']));?>>Groove</option>
141
- <option value="inset" <?php selected('inset',esc_attr($opts['css']['border_type']));?>>Inset</option>
142
- <option value="outset" <?php selected('outset',esc_attr($opts['css']['border_type']));?>>Outset</option>
143
- <option value="ridge" <?php selected('ridge',esc_attr($opts['css']['border_type']));?>>Ridge</option>
144
- </select>
145
- </td>
146
- </tr>
147
- <?php do_action( 'spu/metaboxes/after_border_appearance', $opts );?>
148
- </table>
149
- <h3>Close</h3>
150
- <table class="form-table">
151
- <tr>
152
- <th><label class="spu-label" for="spu-close-color"><?php _e( 'Color', 'popups' ); ?></label></th>
153
- <td>
154
- <input name="spu[css][close_color]" id="spu-close-color" type="text" class="spu-color-field" value="<?php echo esc_attr($opts['css']['close_color']); ?>" />
155
- </td>
156
- </tr>
157
- <tr>
158
- <th><label class="spu-label" for="spu-close-color"><?php _e( 'Hover Color', 'popups' ); ?></label></th>
159
- <td>
160
- <input name="spu[css][close_hover_color]" id="spu-close-color" type="text" class="spu-color-field" value="<?php echo esc_attr($opts['css']['close_hover_color']); ?>" />
161
- </td>
162
- </tr>
163
- <tr>
164
- <th><label class="spu-label" for="spu-close-color"><?php _e( 'Shadow Color', 'popups' ); ?></label></th>
165
- <td>
166
- <input name="spu[css][close_shadow_color]" id="spu-close-color" type="text" class="spu-color-field" value="<?php echo esc_attr($opts['css']['close_shadow_color']); ?>" />
167
- </td>
168
- </tr>
169
- <tr>
170
- <th><label class="spu-label" for="spu-close-size"><?php _e( 'Size', 'popups' ); ?></label></th>
171
- <td>
172
- <input name="spu[css][close_size]" id="spu-close-size" type="text" class="" value="<?php echo esc_attr($opts['css']['close_size']); ?>" />
173
- <p class="spu-help"><?php _e( 'You can use px, em or rem units', 'popups' ); ?></p>
174
- </td>
175
- </tr>
176
- <tr>
177
- <th><label class="spu-label" for="spu-border-radius"><?php _e( 'Position', 'popups' ); ?></label></th>
178
- <td>
179
- <select name="spu[css][close_position]" id="spu-border-type">
180
- <option value="top_right" <?php selected('top_right',esc_attr($opts['css']['close_position']));?>>Top right</option>
181
- <option value="top_left" <?php selected('top_left',esc_attr($opts['css']['close_position']));?>>Top Left</option>
182
- <option value="bottom_right" <?php selected('bottom_right',esc_attr($opts['css']['close_position']));?>>Bottom Right</option>
183
- <option value="bottom_left" <?php selected('bottom_left',esc_attr($opts['css']['close_position']));?>>Bottom Left</option>
184
- </select>
185
- </td>
186
- </tr>
187
- <?php do_action( 'spu/metaboxes/after_close_appearance', $opts );?>
188
- </table>
189
- <h3>CSS</h3>
190
- <table class="form-table">
191
- <tr>
192
- <th><label class="spu-label" for="spu-custom-css"><?php _e( 'Custom CSS', 'popups' ); ?></label></th>
193
- <td>
194
- <div id="custom_css_container">
195
- <div name="custom_css" id="custom_css" style="border: 1px solid #DFDFDF; -moz-border-radius: 3px; -webkit-border-radius: 3px; border-radius: 3px; width: 100%; height: 200px; position: relative;"></div>
196
- </div>
197
- <?php
198
- if( !isset( $opts['css']['custom_css'] ) ) {
199
- $popup_id = get_the_id();
200
- $opts['css']['custom_css'] = "/*
201
- * Add custom CSS for this popup
202
- * Be sure to start your rules with #spu-{$popup_id} { } and use !important when needed to override plugin rules
203
- */";
204
- }
205
- ?>
206
- <textarea name="spu[css][custom_css]" id="spu-custom-css" style="display: none;"><?php echo esc_attr($opts['css']['custom_css']); ?></textarea>
207
- </td>
208
- </tr>
209
- </table>
210
- <?php do_action( 'spu/metaboxes/after_appearance_options', $opts );?>
211
  </div>
1
+ <?php
2
+ // Exit if accessed directly
3
+ if ( !defined( 'ABSPATH' ) ) exit;?>
4
+
5
+ <div class="spu-admin-options">
6
+
7
+ <?php do_action( 'spu/metaboxes/before_appearance_options', $opts );?>
8
+ <h3>Overlay</h3>
9
+ <table class="form-table">
10
+ <tr>
11
+ <th><label class="spu-label" for="spu_bgopacity"><?php _e( 'Overlay opacity', 'popups' ); ?></label></th>
12
+ <td>
13
+ <input type="number" id="spu_bgopacity" name="spu[css][bgopacity]" min="0" step="0.1" max="1" value="<?php echo esc_attr($opts['css']['bgopacity']); ?>" />
14
+ <p class="spu-help"><?php _e( 'Leave at 0 for no background. Max value is 1', 'popups' ); ?></p>
15
+ </td>
16
+ </tr>
17
+ <tr>
18
+ <th><label class="spu-label" for="spu_bgcolor"><?php _e( 'Overlay color', 'popups' ); ?></label></th>
19
+ <td>
20
+ <input id="spu_bgcolor" name="spu[css][overlay_color]" type="text" class="spu-color-field" value="<?php echo esc_attr($opts['css']['overlay_color']); ?>" />
21
+ </td>
22
+ </tr>
23
+ <?php do_action( 'spu/metaboxes/after_overlay_appearance', $opts );?>
24
+ <tr><th colspan="2"><?php if( ! defined('SPUP_VERSION') ) echo sprintf( __( 'On <a href="%s">Premium version</a> you can have full screen popups, or sticky popups, insert optin forms inside yours post and much more!','popups'), 'https://timersys.com/plugins/popups-premium/?utm_source=Plugin&utm_medium=appearance_overlay&utm_campaign=Popups%20Premium');?></th></tr>
25
+ </table>
26
+ <h3>Popup Background</h3>
27
+ <table class="form-table">
28
+ <tr>
29
+ <th><label class="spu-label" for="spu-background-color"><?php _e( 'Background color', 'popups' ); ?></label></th>
30
+ <td>
31
+ <input id="spu-background-color" name="spu[css][background_color]" type="text" class="spu-color-field" value="<?php echo esc_attr($opts['css']['background_color']); ?>" />
32
+ </td>
33
+ </tr>
34
+ <tr>
35
+ <th><label class="spu-label" for="spu_background_opacity"><?php _e( 'Background opacity', 'popups' ); ?></label></th>
36
+ <td>
37
+ <input type="number" id="spu_background_opacity" name="spu[css][background_opacity]" min="0" step="0.1" max="1" value="<?php echo esc_attr($opts['css']['background_opacity']); ?>" />
38
+ <p class="spu-help"><?php _e( 'Leave at 0 for no background. Max value is 1', 'popups' ); ?></p>
39
+ </td>
40
+ </tr>
41
+ <?php do_action( 'spu/metaboxes/after_background_appearance', $opts );?>
42
+ <tr><th colspan="2"><?php if( ! defined('SPUP_VERSION') ) echo sprintf( __( 'Check <a href="%s">Premium version</a> to add background images or choose a pre made optin theme!','popups'), 'https://timersys.com/plugins/popups-premium/?utm_source=Plugin&utm_medium=appearance_bg&utm_campaign=Popups%20Premium');?></th></tr>
43
+ </table>
44
+ <h3>Popup Box</h3>
45
+ <table class="form-table">
46
+ <tr class="hide-for-optins">
47
+ <th><label class="spu-label" for="spu-width"><?php _e( 'Box width', 'popups' ); ?></label></th>
48
+ <td>
49
+ <input id="spu-width" name="spu[css][width]" id="spu-box-width" type="text" class="small" value="<?php echo esc_attr($opts['css']['width']); ?>" />
50
+ <p class="spu-help"><?php _e( 'Max size the responsive popup will grow. You can use % or px.', 'popups' ); ?></p>
51
+ </td>
52
+ </tr>
53
+ <tr class="hide-for-optins">
54
+ <th><label class="spu-label" for="spu-padding"><?php _e( 'Padding', 'popups' ); ?></label></th>
55
+ <td>
56
+ <input id="spu-padding" name="spu[css][padding]" id="spu-box-padding" type="number" class="small" value="<?php echo esc_attr($opts['css']['padding']); ?>" />px
57
+ </td>
58
+ </tr>
59
+ <tr>
60
+ <th><label class="spu-label" for="spu-color"><?php _e( 'Text color', 'popups' ); ?></label></th>
61
+ <td>
62
+ <input id="spu-color" name="spu[css][color]" type="text" class="spu-color-field" value="<?php echo esc_attr($opts['css']['color']); ?>" />
63
+ </td>
64
+ </tr>
65
+ <?php do_action( 'spu/metaboxes/after_box_appearance', $opts );?>
66
+ </table>
67
+ <h3>Popup Shadow</h3>
68
+ <table class="form-table">
69
+ <tr>
70
+ <th><label class="spu-label" for="spu-shadow-color"><?php _e( 'Shadow Color', 'popups' ); ?></label></th>
71
+ <td>
72
+ <input id="spu-shadow-color" name="spu[css][shadow_color]" type="text" class="spu-color-field" value="<?php echo esc_attr($opts['css']['shadow_color']); ?>" />
73
+ </td>
74
+ </tr>
75
+ <tr>
76
+ <th><label class="spu-label" for="spu-shadow-type"><?php _e( 'Shadow Type', 'popups' ); ?></label></th>
77
+ <td>
78
+ <select name="spu[css][shadow_type]" id="spu-shadow-type">
79
+ <option value="inset" <?php selected('inset',esc_attr($opts['css']['shadow_type']));?>>Inset</option>
80
+ <option value="outset" <?php selected('outset',esc_attr($opts['css']['shadow_type']));?>>Outset</option>
81
+ </select>
82
+ </td>
83
+ </tr>
84
+ <tr>
85
+ <th><label class="spu-label" for="spu-shadow-x"><?php _e( 'X Offset', 'popups' ); ?></label></th>
86
+ <td>
87
+ <input id="spu-shadow-x" name="spu[css][shadow_x_offset]" type="number" step="1" class="small" value="<?php echo esc_attr($opts['css']['shadow_x_offset']); ?>" />px
88
+ </td>
89
+ </tr>
90
+ <tr>
91
+ <th><label class="spu-label" for="spu-shadow-y"><?php _e( 'Y Offset', 'popups' ); ?></label></th>
92
+ <td>
93
+ <input id="spu-shadow-y" name="spu[css][shadow_y_offset]" type="number" step="1" class="small" value="<?php echo esc_attr($opts['css']['shadow_y_offset']); ?>" />px
94
+ </td>
95
+ </tr>
96
+ <tr>
97
+ <th><label class="spu-label" for="spu-shadow-blur"><?php _e( 'Blur', 'popups' ); ?></label></th>
98
+ <td>
99
+ <input id="spu-shadow-blur" name="spu[css][shadow_blur]" type="number" step="1" class="small" value="<?php echo esc_attr($opts['css']['shadow_blur']); ?>" />px
100
+ </td>
101
+ </tr>
102
+ <tr>
103
+ <th><label class="spu-label" for="spu-shadow-spread"><?php _e( 'Spread', 'popups' ); ?></label></th>
104
+ <td>
105
+ <input id="spu-shadow-spread" name="spu[css][shadow_spread]" type="number" step="1" class="small" value="<?php echo esc_attr($opts['css']['shadow_spread']); ?>" />px
106
+ </td>
107
+ </tr>
108
+ <?php do_action( 'spu/metaboxes/after_shadow_appearance', $opts );?>
109
+ </table>
110
+ <h3>Border</h3>
111
+
112
+ <table class="form-table">
113
+ <tr>
114
+ <th><label class="spu-label" for="spu-border-color"><?php _e( 'Border color', 'popups' ); ?></label></th>
115
+ <td>
116
+ <input name="spu[css][border_color]" id="spu-border-color" type="text" class="spu-color-field" value="<?php echo esc_attr($opts['css']['border_color']); ?>" />
117
+ </td>
118
+ </tr>
119
+ <tr>
120
+ <th><label class="spu-label" for="spu-border-width"><?php _e( 'Border width', 'popups' ); ?></label></th>
121
+ <td>
122
+ <input name="spu[css][border_width]" id="spu-border-width" type="number" min="0" max="25" value="<?php echo esc_attr($opts['css']['border_width']); ?>" /> px
123
+ </td>
124
+ </tr>
125
+ <tr>
126
+ <th><label class="spu-label" for="spu-border-radius"><?php _e( 'Border radius', 'popups' ); ?></label></th>
127
+ <td>
128
+ <input name="spu[css][border_radius]" id="spu-border-radius" type="number" min="0" max="25" value="<?php echo esc_attr($opts['css']['border_radius']); ?>" /> px
129
+ </td>
130
+ </tr>
131
+ <tr>
132
+ <th><label class="spu-label" for="spu-border-type"><?php _e( 'Border type', 'popups' ); ?></label></th>
133
+ <td>
134
+ <select name="spu[css][border_type]" id="spu-border-type">
135
+ <option value="none" <?php selected('none',esc_attr($opts['css']['border_type']));?>>None</option>
136
+ <option value="solid" <?php selected('solid',esc_attr($opts['css']['border_type']));?>>Solid</option>
137
+ <option value="dotted" <?php selected('dotted',esc_attr($opts['css']['border_type']));?>>Dotted</option>
138
+ <option value="dashed" <?php selected('dashed',esc_attr($opts['css']['border_type']));?>>Dashed</option>
139
+ <option value="double" <?php selected('double',esc_attr($opts['css']['border_type']));?>>Double</option>
140
+ <option value="groove" <?php selected('groove',esc_attr($opts['css']['border_type']));?>>Groove</option>
141
+ <option value="inset" <?php selected('inset',esc_attr($opts['css']['border_type']));?>>Inset</option>
142
+ <option value="outset" <?php selected('outset',esc_attr($opts['css']['border_type']));?>>Outset</option>
143
+ <option value="ridge" <?php selected('ridge',esc_attr($opts['css']['border_type']));?>>Ridge</option>
144
+ </select>
145
+ </td>
146
+ </tr>
147
+ <?php do_action( 'spu/metaboxes/after_border_appearance', $opts );?>
148
+ </table>
149
+ <h3>Close</h3>
150
+ <table class="form-table">
151
+ <tr>
152
+ <th><label class="spu-label" for="spu-close-color"><?php _e( 'Color', 'popups' ); ?></label></th>
153
+ <td>
154
+ <input name="spu[css][close_color]" id="spu-close-color" type="text" class="spu-color-field" value="<?php echo esc_attr($opts['css']['close_color']); ?>" />
155
+ </td>
156
+ </tr>
157
+ <tr>
158
+ <th><label class="spu-label" for="spu-close-color"><?php _e( 'Hover Color', 'popups' ); ?></label></th>
159
+ <td>
160
+ <input name="spu[css][close_hover_color]" id="spu-close-color" type="text" class="spu-color-field" value="<?php echo esc_attr($opts['css']['close_hover_color']); ?>" />
161
+ </td>
162
+ </tr>
163
+ <tr>
164
+ <th><label class="spu-label" for="spu-close-color"><?php _e( 'Shadow Color', 'popups' ); ?></label></th>
165
+ <td>
166
+ <input name="spu[css][close_shadow_color]" id="spu-close-color" type="text" class="spu-color-field" value="<?php echo esc_attr($opts['css']['close_shadow_color']); ?>" />
167
+ </td>
168
+ </tr>
169
+ <tr>
170
+ <th><label class="spu-label" for="spu-close-size"><?php _e( 'Size', 'popups' ); ?></label></th>
171
+ <td>
172
+ <input name="spu[css][close_size]" id="spu-close-size" type="text" class="" value="<?php echo esc_attr($opts['css']['close_size']); ?>" />
173
+ <p class="spu-help"><?php _e( 'You can use px, em or rem units', 'popups' ); ?></p>
174
+ </td>
175
+ </tr>
176
+ <tr>
177
+ <th><label class="spu-label" for="spu-border-radius"><?php _e( 'Position', 'popups' ); ?></label></th>
178
+ <td>
179
+ <select name="spu[css][close_position]" id="spu-border-type">
180
+ <option value="top_right" <?php selected('top_right',esc_attr($opts['css']['close_position']));?>>Top right</option>
181
+ <option value="top_left" <?php selected('top_left',esc_attr($opts['css']['close_position']));?>>Top Left</option>
182
+ <option value="bottom_right" <?php selected('bottom_right',esc_attr($opts['css']['close_position']));?>>Bottom Right</option>
183
+ <option value="bottom_left" <?php selected('bottom_left',esc_attr($opts['css']['close_position']));?>>Bottom Left</option>
184
+ </select>
185
+ </td>
186
+ </tr>
187
+ <?php do_action( 'spu/metaboxes/after_close_appearance', $opts );?>
188
+ </table>
189
+ <h3>CSS</h3>
190
+ <table class="form-table">
191
+ <tr>
192
+ <th><label class="spu-label" for="spu-custom-css"><?php _e( 'Custom CSS', 'popups' ); ?></label></th>
193
+ <td>
194
+ <div id="custom_css_container">
195
+ <div name="custom_css" id="custom_css" style="border: 1px solid #DFDFDF; -moz-border-radius: 3px; -webkit-border-radius: 3px; border-radius: 3px; width: 100%; height: 200px; position: relative;"></div>
196
+ </div>
197
+ <?php
198
+ if( !isset( $opts['css']['custom_css'] ) ) {
199
+ $popup_id = get_the_id();
200
+ $opts['css']['custom_css'] = "/*
201
+ * Add custom CSS for this popup
202
+ * Be sure to start your rules with #spu-{$popup_id} { } and use !important when needed to override plugin rules
203
+ */";
204
+ }
205
+ ?>
206
+ <textarea name="spu[css][custom_css]" id="spu-custom-css" style="display: none;"><?php echo esc_attr($opts['css']['custom_css']); ?></textarea>
207
+ </td>
208
+ </tr>
209
+ </table>
210
+ <?php do_action( 'spu/metaboxes/after_appearance_options', $opts );?>
211
  </div>
admin/views/metaboxes/metabox-donate.php CHANGED
@@ -1,16 +1,16 @@
1
- <?php
2
- // Exit if accessed directly
3
- if ( !defined( 'ABSPATH' ) ) exit;
4
- ?>
5
-
6
- <p><?php _e( 'If you like this plugin, consider supporting it by donating.', 'popups' );?></p>
7
-
8
- <a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=K4T6L69EV9G2Q" class="button-primary"><?php _e( 'Donate with PayPal', 'popups' );?></a>
9
-
10
- <p><?php _e( 'Some other ways to support this plugin', 'popups' );?></p>
11
- <ul class="ul-square">
12
- <li><a href="http://wordpress.org/support/view/plugin-reviews/popups?rate=5#postform" target="_blank"><?php _e( 'Leave a &#9733;&#9733;&#9733;&#9733;&#9733; review on WordPress.org', 'popups' );?></a></li>
13
- <li><a href="https://timersys.com/free-plugins/popups/" target="_blank"><?php _e( 'Write about Popups on your blog', 'popups' );?></a></li>
14
- <li><a href="http://twitter.com/intent/tweet/?text=I+am+using+Social+PopUP+on+my+WordPress+site.+It%27s+great%21&amp;via=chifliiii&amp;url=http%3A%2F%2Fwordpress.org%2Fplugins%2Fpopups%2F" target="_blank"><?php _e( 'Tweet about Popups', 'popups' );?></a></li>
15
- <li><a href="http://wordpress.org/plugins/popups/#compatibility"><?php _e( 'Vote "works" on the WordPress.org plugin page', 'popups' );?></a></li>
16
  </ul>
1
+ <?php
2
+ // Exit if accessed directly
3
+ if ( !defined( 'ABSPATH' ) ) exit;
4
+ ?>
5
+
6
+ <p><?php _e( 'If you like this plugin, consider supporting it by donating.', 'popups' );?></p>
7
+
8
+ <a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=K4T6L69EV9G2Q" class="button-primary"><?php _e( 'Donate with PayPal', 'popups' );?></a>
9
+
10
+ <p><?php _e( 'Some other ways to support this plugin', 'popups' );?></p>
11
+ <ul class="ul-square">
12
+ <li><a href="http://wordpress.org/support/view/plugin-reviews/popups?rate=5#postform" target="_blank"><?php _e( 'Leave a &#9733;&#9733;&#9733;&#9733;&#9733; review on WordPress.org', 'popups' );?></a></li>
13
+ <li><a href="https://timersys.com/free-plugins/popups/" target="_blank"><?php _e( 'Write about Popups on your blog', 'popups' );?></a></li>
14
+ <li><a href="http://twitter.com/intent/tweet/?text=I+am+using+Social+PopUP+on+my+WordPress+site.+It%27s+great%21&amp;via=chifliiii&amp;url=http%3A%2F%2Fwordpress.org%2Fplugins%2Fpopups%2F" target="_blank"><?php _e( 'Tweet about Popups', 'popups' );?></a></li>
15
+ <li><a href="http://wordpress.org/plugins/popups/#compatibility"><?php _e( 'Vote "works" on the WordPress.org plugin page', 'popups' );?></a></li>
16
  </ul>
admin/views/metaboxes/metabox-help.php CHANGED
@@ -1,67 +1,67 @@
1
- <?php
2
- // Exit if accessed directly
3
- if ( !defined( 'ABSPATH' ) ) exit;
4
- ?>
5
-
6
- <p><?php _e( 'You have some social shortcodes to use that will print a Facebook like, a Google+ Follow and a Twitter follow. Check the available options and <strong>configure them with your social accounts</strong>:', 'popups' );?></p>
7
-
8
- <p><strong><?php _e( 'Facebook Page', 'popups' );?>:</strong></p>
9
- <p>
10
- [spu-facebook-page href="" name="" show_faces="" hide_cover="" width=""]
11
- </p>
12
- <a href="fb-opts" onclick="jQuery('#fbpage-opts').slideToggle();return false;"><?php _e( 'View Facebook Page Options', 'popups' );?></a>
13
- <ul id="fbpage-opts" style="display:none;">
14
- <li><b>href:</b> <?php _e( 'Your Facebook page url', 'popups' );?></li>
15
- <li><b>name:</b> <?php _e( 'Your page name', 'popups' );?></li>
16
- <li><b>show_faces:</b> <?php _e( 'true|false <b>Default value:</b> true', 'popups' );?></li>
17
- <li><b>hide_cover:</b> <?php _e( 'true|false <b>Default value:</b> false', 'popups' );?></li>
18
- <li><b>width:</b> <?php _e( 'number <b>Default value:</b> 500', 'popups' );?></b></li>
19
- </ul>
20
-
21
- <p><strong><?php _e( 'Facebook Button', 'popups' );?>:</strong></p>
22
- <p>
23
- [spu-facebook href="" layout="" show_faces="" share="" action="" width=""]
24
- </p>
25
- <a href="fb-opts" onclick="jQuery('#fb-opts').slideToggle();return false;"><?php _e( 'View Facebook Options', 'popups' );?></a>
26
- <ul id="fb-opts" style="display:none;">
27
- <li><b>href:</b> <?php _e( 'Your Facebook page url', 'popups' );?></li>
28
- <li><b>layout:</b> <?php _e( 'standard, box_count, button <b>Default value:</b> button_count', 'popups' );?></li>
29
- <li><b>show_faces:</b> <?php _e( 'true <b>Default value:</b> false', 'popups' );?></li>
30
- <li><b>share:</b> <?php _e( 'true <b>Default value:</b> false', 'popups' );?></li>
31
- <li><b>action:</b> <?php _e( 'recommend <b>Default value:</b> like', 'popups' );?></li>
32
- <li><b>width:</b> <?php _e( 'number <b>Default value:</b>', 'popups' );?></li>
33
- </ul>
34
- <p><strong><?php _e( 'Google+ Button', 'popups' );?>:</strong></p>
35
- <p>
36
- [spu-google url="" size="" annotation=""]
37
- </p>
38
- <a href="go-opts" onclick="jQuery('#go-opts').slideToggle();return false;"><?php _e( 'View Google+ Options', 'popups' );?></a>
39
- <ul id="go-opts" style="display:none;">
40
- <li><b>url:</b> <?php _e( 'Your Google+ url', 'popups' );?></li>
41
- <li><b>type:</b> g-plusone, g-follow <?php _e( '<b>Default value:</b>', 'popups' );?>g-plusone</li>
42
- <li><b>size:</b> <?php _e( 'small, standard, tall <b>Default value:</b> medium', 'popups' );?></li>
43
- <li><b>annotation:</b> <?php _e( 'inline, none <b>Default value:</b> bubble', 'popups' );?></li>
44
- </ul>
45
- <p><strong><?php _e( 'Twitter Button', 'popups' );?>:</strong></p>
46
- <p>
47
- [spu-twitter user="" show_count="" size="" lang=""]
48
- </p>
49
- <a href="tw-opts" onclick="jQuery('#tw-opts').slideToggle();return false;"><?php _e( 'View Twitter Options', 'popups' );?></a>
50
- <ul id="tw-opts" style="display:none;">
51
- <li><b>user:</b> <?php _e( 'Your Twitter user <b>Default value: </b>', 'popups' ); echo ' ' . apply_filters( 'spu/social/tw_user', 'chifliiiii' ); ?></li>
52
- <li><b>show_count:</b> <?php _e( 'false <b>Default value:</b> true', 'popups' );?></li>
53
- <li><b>size:</b> <?php _e( 'large <b>Default value:</b> ""', 'popups' );?></li>
54
- <li><b>lang:</b> </li>
55
- </ul>
56
- <h3 style="padding-left:0;margin: 20px 0;"><strong><?php _e('Other available Shortcodes:', 'popups' );?></strong></h3>
57
- <p><strong><?php _e( 'Close Button', 'popups' );?>:</strong></p>
58
- <p>
59
- [spu-close class="" text="" align="" conversion="false"]
60
- </p>
61
- <a href="close-opts" onclick="jQuery('#close-opts').slideToggle();return false;"><?php _e( 'View Close shortcode Options', 'popups' );?></a>
62
- <ul id="close-opts" style="display:none;">
63
- <li><b>class:</b> <?php _e( 'Pass a custom class to style your button', 'popups' );?></li>
64
- <li><b>text:</b> <?php _e( 'Button label - <b>Default value:</b> Close', 'popups' );?></li>
65
- <li><b>conversion:</b> <?php _e( 'Conversion button?- <b>Default value:</b> False', 'popups' );?></li>
66
- <li><b>align:</b> <?php _e( 'left, right, center, none - <b>Default value:</b> center', 'popups' );?></li>
67
- </ul>
1
+ <?php
2
+ // Exit if accessed directly
3
+ if ( !defined( 'ABSPATH' ) ) exit;
4
+ ?>
5
+
6
+ <p><?php _e( 'You have some social shortcodes to use that will print a Facebook like, a Google+ Follow and a Twitter follow. Check the available options and <strong>configure them with your social accounts</strong>:', 'popups' );?></p>
7
+
8
+ <p><strong><?php _e( 'Facebook Page', 'popups' );?>:</strong></p>
9
+ <p>
10
+ [spu-facebook-page href="" name="" show_faces="" hide_cover="" width=""]
11
+ </p>
12
+ <a href="fb-opts" onclick="jQuery('#fbpage-opts').slideToggle();return false;"><?php _e( 'View Facebook Page Options', 'popups' );?></a>
13
+ <ul id="fbpage-opts" style="display:none;">
14
+ <li><b>href:</b> <?php _e( 'Your Facebook page url', 'popups' );?></li>
15
+ <li><b>name:</b> <?php _e( 'Your page name', 'popups' );?></li>
16
+ <li><b>show_faces:</b> <?php _e( 'true|false <b>Default value:</b> true', 'popups' );?></li>
17
+ <li><b>hide_cover:</b> <?php _e( 'true|false <b>Default value:</b> false', 'popups' );?></li>
18
+ <li><b>width:</b> <?php _e( 'number <b>Default value:</b> 500', 'popups' );?></b></li>
19
+ </ul>
20
+
21
+ <p><strong><?php _e( 'Facebook Button', 'popups' );?>:</strong></p>
22
+ <p>
23
+ [spu-facebook href="" layout="" show_faces="" share="" action="" width=""]
24
+ </p>
25
+ <a href="fb-opts" onclick="jQuery('#fb-opts').slideToggle();return false;"><?php _e( 'View Facebook Options', 'popups' );?></a>
26
+ <ul id="fb-opts" style="display:none;">
27
+ <li><b>href:</b> <?php _e( 'Your Facebook page url', 'popups' );?></li>
28
+ <li><b>layout:</b> <?php _e( 'standard, box_count, button <b>Default value:</b> button_count', 'popups' );?></li>
29
+ <li><b>show_faces:</b> <?php _e( 'true <b>Default value:</b> false', 'popups' );?></li>
30
+ <li><b>share:</b> <?php _e( 'true <b>Default value:</b> false', 'popups' );?></li>
31
+ <li><b>action:</b> <?php _e( 'recommend <b>Default value:</b> like', 'popups' );?></li>
32
+ <li><b>width:</b> <?php _e( 'number <b>Default value:</b>', 'popups' );?></li>
33
+ </ul>
34
+ <p><strong><?php _e( 'Google+ Button', 'popups' );?>:</strong></p>
35
+ <p>
36
+ [spu-google url="" size="" annotation=""]
37
+ </p>
38
+ <a href="go-opts" onclick="jQuery('#go-opts').slideToggle();return false;"><?php _e( 'View Google+ Options', 'popups' );?></a>
39
+ <ul id="go-opts" style="display:none;">
40
+ <li><b>url:</b> <?php _e( 'Your Google+ url', 'popups' );?></li>
41
+ <li><b>type:</b> g-plusone, g-follow <?php _e( '<b>Default value:</b>', 'popups' );?>g-plusone</li>
42
+ <li><b>size:</b> <?php _e( 'small, standard, tall <b>Default value:</b> medium', 'popups' );?></li>
43
+ <li><b>annotation:</b> <?php _e( 'inline, none <b>Default value:</b> bubble', 'popups' );?></li>
44
+ </ul>
45
+ <p><strong><?php _e( 'Twitter Button', 'popups' );?>:</strong></p>
46
+ <p>
47
+ [spu-twitter user="" show_count="" size="" lang=""]
48
+ </p>
49
+ <a href="tw-opts" onclick="jQuery('#tw-opts').slideToggle();return false;"><?php _e( 'View Twitter Options', 'popups' );?></a>
50
+ <ul id="tw-opts" style="display:none;">
51
+ <li><b>user:</b> <?php _e( 'Your Twitter user <b>Default value: </b>', 'popups' ); echo ' ' . apply_filters( 'spu/social/tw_user', 'chifliiiii' ); ?></li>
52
+ <li><b>show_count:</b> <?php _e( 'false <b>Default value:</b> true', 'popups' );?></li>
53
+ <li><b>size:</b> <?php _e( 'large <b>Default value:</b> ""', 'popups' );?></li>
54
+ <li><b>lang:</b> </li>
55
+ </ul>
56
+ <h3 style="padding-left:0;margin: 20px 0;"><strong><?php _e('Other available Shortcodes:', 'popups' );?></strong></h3>
57
+ <p><strong><?php _e( 'Close Button', 'popups' );?>:</strong></p>
58
+ <p>
59
+ [spu-close class="" text="" align="" conversion="false"]
60
+ </p>
61
+ <a href="close-opts" onclick="jQuery('#close-opts').slideToggle();return false;"><?php _e( 'View Close shortcode Options', 'popups' );?></a>
62
+ <ul id="close-opts" style="display:none;">
63
+ <li><b>class:</b> <?php _e( 'Pass a custom class to style your button', 'popups' );?></li>
64
+ <li><b>text:</b> <?php _e( 'Button label - <b>Default value:</b> Close', 'popups' );?></li>
65
+ <li><b>conversion:</b> <?php _e( 'Conversion button?- <b>Default value:</b> False', 'popups' );?></li>
66
+ <li><b>align:</b> <?php _e( 'left, right, center, none - <b>Default value:</b> center', 'popups' );?></li>
67
+ </ul>
admin/views/metaboxes/metabox-options.php CHANGED
@@ -1,141 +1,141 @@
1
- <?php
2
- // Exit if accessed directly
3
- if ( !defined( 'ABSPATH' ) ) exit;?>
4
- <div class="spu-admin-options">
5
- <h3>Position</h3>
6
- <table class="form-table">
7
-
8
- <?php do_action( 'spu/metaboxes/before_display_options', $opts );?>
9
- <tr valign="top">
10
- <th><label for="spu_position"><?php _e( 'Box Position', 'popups' ); ?></label></th>
11
- <td>
12
- <select id="spu_position" name="spu[css][position]" class="widefat">
13
- <option value="centered" <?php selected($opts['css']['position'], 'centered'); ?>><?php _e( 'Centered', 'popups' ); ?></option>
14
- <option value="top-left" <?php selected($opts['css']['position'], 'top-left'); ?>><?php _e( 'Top Left', 'popups' ); ?></option>
15
- <option value="top-right" <?php selected($opts['css']['position'], 'top-right'); ?>><?php _e( 'Top Right', 'popups' ); ?></option>
16
- <option value="bottom-left" <?php selected($opts['css']['position'], 'bottom-left'); ?>><?php _e( 'Bottom Left', 'popups' ); ?></option>
17
- <option value="bottom-right" <?php selected($opts['css']['position'], 'bottom-right'); ?>><?php _e( 'Bottom Right', 'popups' ); ?></option>
18
- <option value="top-bar" <?php selected($opts['css']['position'], 'top-bar'); ?>><?php _e( 'Top Bar', 'popups' ); ?></option>
19
- <option value="bottom-bar" <?php selected($opts['css']['position'], 'bottom-bar'); ?>><?php _e( 'Bottom Bar', 'popups' ); ?></option>
20
- <?php do_action( 'spu/metaboxes/positions', $opts );?>
21
- </select>
22
- </td>
23
- <td colspan="2"></td>
24
- </tr>
25
- <tr><th colspan="2"><?php if( ! defined('SPUP_VERSION') ) echo sprintf( __( 'On <a href="%s">Premium version</a> there are more cool positions and popup styles.','popups'), 'https://timersys.com/plugins/popups-premium/?utm_source=Plugin&utm_medium=options_position&utm_campaign=Popups%20Premium');?></th></tr>
26
- <?php do_action( 'spu/metaboxes/after_position_options', $opts );?>
27
- </table>
28
- <h3>Trigger</h3>
29
- <table class="form-table">
30
- <tr valign="top">
31
- <th><label for="spu_trigger"><?php _e( 'Trigger action', 'popups' ); ?></label></th>
32
- <td class="spu-sm">
33
- <select id="spu_trigger" name="spu[trigger]" class="widefat">
34
-
35
- <option value="seconds" <?php selected($opts['trigger'], 'seconds'); ?>><?php _e( 'seconds after page load', 'popups' ); ?></option>
36
- <option value="percentage" <?php selected($opts['trigger'], 'percentage'); ?>>% <?php _e( 'of page height', 'popups' ); ?></option>
37
- <option value="pixels" <?php selected($opts['trigger'], 'pixels'); ?>><?php _e( 'Scrolled down pixels', 'popups' ); ?></option>
38
- <option value="manual" <?php selected($opts['trigger'], 'manual'); ?>><?php _e( 'Manual Triggering', 'popups' ); ?></option>
39
- <?php do_action( 'spu/metaboxes/trigger_options', $opts );?>
40
- </select>
41
- </td>
42
- <td>
43
- <input type="number" class="spu-trigger-number" name="spu[trigger_number]" min="0" value="<?php echo esc_attr($opts['trigger_number']); ?>" />
44
- <?php do_action( 'spu/metaboxes/trigger_values', $opts );?>
45
- </td>
46
- </tr>
47
- <tr>
48
- <td style="margin:0;padding:0"></td><td style="position: relative;top: -15px;margin:0;padding:0 0 0 10px"><p class="help"><?php _e( 'Choose how the popup will be triggered on the page', 'popups' ); ?></p></td>
49
- </tr>
50
- <tr><th colspan="2"><?php if( ! defined('SPUP_VERSION') ) echo sprintf( __( 'On <a href="%s">Premium version</a> you can use exit intent trigger technology, or attach to any element that appears in the viewport.','popups'), 'https://timersys.com/plugins/popups-premium/?utm_source=Plugin&utm_medium=options_trigger&utm_campaign=Popups%20Premium');?></th></tr>
51
- <?php do_action( 'spu/metaboxes/after_trigger_options', $opts );?>
52
- </table>
53
- <h3><?php _e( 'Cookies', 'popups');?></h3>
54
- <p><?php _e( 'We use PHP cookies to prevent popups opening for users after they closed it.', 'popups');?></p>
55
- <table class="form-table">
56
- <tr valign="top">
57
- <th><label for="spu_name_conversion_cookie"><?php _e( 'Conversion cookie name', 'popups' ); ?></label></th>
58
- <td colspan="3">
59
- <input type="text" id="spu_name_conversion_cookie" name="spu[name-convert-cookie]" value="<?php echo esc_attr($opts['name-convert-cookie']); ?>" />
60
- <p class="help"><?php _e( 'The name that the popup will use for convertion cookie. Changing this name will reset the cookie, so all users will see popup again.', 'popups' ); ?></p>
61
- </td>
62
- </tr>
63
- <tr valign="top">
64
- <th><label for="spu_duration_conversion_cookie"><?php _e( 'Conversion cookie Duration', 'popups' ); ?></label></th>
65
- <td colspan="3">
66
- <input type="number" id="spu_duration_conversion_cookie" name="spu[duration-convert-cookie]" min="0" value="<?php echo esc_attr($opts['duration-convert-cookie']); ?>" />
67
- <p class="help"><?php _e( 'When a user do a conversion like for example a click or form submission, how many days should it stay hidden?', 'popups' ); ?></p>
68
- </td>
69
- </tr>
70
- <tr valign="top">
71
- <th><label for="spu_name_closing_cookie"><?php _e( 'Closing cookie name', 'popups' ); ?></label></th>
72
- <td colspan="3">
73
- <input type="text" id="spu_name_closing_cookie" name="spu[name-close-cookie]" value="<?php echo esc_attr($opts['name-close-cookie']); ?>" />
74
- <p class="help"><?php _e( 'The name that the popup will use for closing cookie. Changing this name will reset the cookie, so all users will see popup again.', 'popups' ); ?></p>
75
- </td>
76
- </tr>
77
- <tr valign="top">
78
- <th><label for="spu_duration_close_cookie"><?php _e( 'Closing cookie duration', 'popups' ); ?></label></th>
79
- <td colspan="3">
80
- <input type="number" id="spu_duration_close_cookie" name="spu[duration-close-cookie]" min="0" value="<?php echo isset( $opts['duration-close-cookie'] ) ? esc_attr($opts['duration-close-cookie']) : esc_attr($opts['duration-convert-cookie']); ?>" />
81
- <p class="help"><?php _e( 'After closing the popup, how many days should it stay hidden?', 'popups' ); ?></p>
82
- </td>
83
- </tr>
84
- <?php do_action( 'spu/metaboxes/after_cookie_options', $opts );?>
85
- </table>
86
- <h3>Close options</h3>
87
- <table class="form-table">
88
- <tr valign="top" class="conversion_close">
89
- <th><label for="spu_conversion_close"><?php _e( 'Close on conversion?', 'popups' ); ?></label></th>
90
- <td colspan="3">
91
- <label><input type="radio" id="spu_conversion_close_1" name="spu[conversion_close]" value="1" <?php checked($opts['conversion_close'], 1); ?> /> <?php _e( 'Yes' ); ?></label> &nbsp;
92
- <label><input type="radio" id="spu_conversion_close_0" name="spu[conversion_close]" value="0" <?php checked($opts['conversion_close'], 0); ?> /> <?php _e( 'No' ); ?></label> &nbsp;
93
- <p class="help"><?php _e( 'If you have a form or social shortcode, by default popup will close on submission/conversion', 'popups' ); ?></p>
94
- </td>
95
- </tr>
96
- <?php do_action( 'spu/metaboxes/after_close_options', $opts );?>
97
- </table>
98
- <h3>Other options</h3>
99
- <table class="form-table">
100
- <tr valign="top" class="auto_hide">
101
- <th><label for="spu_auto_hide"><?php _e( 'Auto-hide?', 'popups' ); ?></label></th>
102
- <td colspan="3">
103
- <label><input type="radio" id="spu_auto_hide_1" name="spu[auto_hide]" value="1" <?php checked($opts['auto_hide'], 1); ?> /> <?php _e( 'Yes' ); ?></label> &nbsp;
104
- <label><input type="radio" id="spu_auto_hide_0" name="spu[auto_hide]" value="0" <?php checked($opts['auto_hide'], 0); ?> /> <?php _e( 'No' ); ?></label> &nbsp;
105
- <p class="help"><?php _e( 'Hide box again when visitors scroll back up?', 'popups' ); ?></p>
106
- </td>
107
- </tr>
108
- <tr valign="top">
109
- <th><label for="spu_test_mode"><?php _e( 'Enable test mode?', 'popups' ); ?></label></th>
110
- <td colspan="3">
111
- <label><input type="radio" id="spu_test_mode_1" name="spu[test_mode]" value="1" <?php checked($opts['test_mode'], 1); ?> /> <?php _e( 'Yes' ); ?></label> &nbsp;
112
- <label><input type="radio" id="spu_test_mode_0" name="spu[test_mode]" value="0" <?php checked($opts['test_mode'], 0); ?> /> <?php _e( 'No' ); ?></label> &nbsp;
113
- <p class="help"><?php _e( 'If test mode is enabled, the box will show up regardless of whether a cookie has been set. (To admins only)', 'popups' ); ?></p>
114
- </td>
115
- </tr>
116
- <tr valign="top">
117
- <th><label><?php _e( 'Animation', 'popups' ); ?></label></th>
118
- <td colspan="3">
119
- <select id="spu_animation" name="spu[animation]" class="widefat">
120
- <option value="fade" <?php selected($opts['animation'], 'fade'); ?> > <?php _e( 'Fade In', 'popups' ); ?></option>
121
- <option value="slide" <?php selected($opts['animation'], 'slide'); ?> > <?php _e( 'Slide In', 'popups' ); ?></option>
122
- <?php do_action( 'spu/metaboxes/animations', $opts );?>
123
- <option value="disable" <?php selected($opts['animation'], 'disable'); ?> > <?php _e( 'Disable animations', 'popups' ); ?></option>
124
- </select>
125
- <p class="help"><?php _e( 'Slide will only apply when popup is on the corners', 'popups' ); ?></p>
126
- </td>
127
- </tr>
128
- <tr><th colspan="2"><?php if( ! defined('SPUP_VERSION') ) echo sprintf( __( 'On <a href="%s">Premium version</a> you have 8 new animations to play with!','popups'), 'https://timersys.com/plugins/popups-premium/?utm_source=Plugin&utm_medium=options_trigger&utm_campaign=Popups%20Premium');?></th></tr>
129
- <tr valign="top" class="powered_link">
130
- <th><label for="spu_powered_link"><?php _e( 'Show powered by link?', 'popups' ); ?></label></th>
131
- <td colspan="3">
132
- <label><input type="radio" id="spu_powered_link_1" name="spu[powered_link]" value="1" <?php checked($opts['powered_link'], 1); ?> /> <?php _e( 'Yes' ); ?></label> &nbsp;
133
- <label><input type="radio" id="spu_powered_link_0" name="spu[powered_link]" value="0" <?php checked($opts['powered_link'], 0); ?> /> <?php _e( 'No' ); ?></label> &nbsp;
134
- <p class="help"><?php echo sprintf(__( 'Shows a "powered by" link below your popup. If your affiliate link is set in the <a href="%s">settings</a>, it will be used.', 'popups' ), admin_url('edit.php?post_type=spucpt&page=spu_settings')); ?></p>
135
- </td>
136
- </tr>
137
- <?php do_action( 'spu/metaboxes/after_other_options', $opts );?>
138
- </table>
139
- <?php do_action( 'spu/metaboxes/after_options', $opts );?>
140
- </div>
141
- <?php wp_nonce_field( 'spu_options', 'spu_options_nonce' ); ?>
1
+ <?php
2
+ // Exit if accessed directly
3
+ if ( !defined( 'ABSPATH' ) ) exit;?>
4
+ <div class="spu-admin-options">
5
+ <h3>Position</h3>
6
+ <table class="form-table">
7
+
8
+ <?php do_action( 'spu/metaboxes/before_display_options', $opts );?>
9
+ <tr valign="top">
10
+ <th><label for="spu_position"><?php _e( 'Box Position', 'popups' ); ?></label></th>
11
+ <td>
12
+ <select id="spu_position" name="spu[css][position]" class="widefat">
13
+ <option value="centered" <?php selected($opts['css']['position'], 'centered'); ?>><?php _e( 'Centered', 'popups' ); ?></option>
14
+ <option value="top-left" <?php selected($opts['css']['position'], 'top-left'); ?>><?php _e( 'Top Left', 'popups' ); ?></option>
15
+ <option value="top-right" <?php selected($opts['css']['position'], 'top-right'); ?>><?php _e( 'Top Right', 'popups' ); ?></option>
16
+ <option value="bottom-left" <?php selected($opts['css']['position'], 'bottom-left'); ?>><?php _e( 'Bottom Left', 'popups' ); ?></option>
17
+ <option value="bottom-right" <?php selected($opts['css']['position'], 'bottom-right'); ?>><?php _e( 'Bottom Right', 'popups' ); ?></option>
18
+ <option value="top-bar" <?php selected($opts['css']['position'], 'top-bar'); ?>><?php _e( 'Top Bar', 'popups' ); ?></option>
19
+ <option value="bottom-bar" <?php selected($opts['css']['position'], 'bottom-bar'); ?>><?php _e( 'Bottom Bar', 'popups' ); ?></option>
20
+ <?php do_action( 'spu/metaboxes/positions', $opts );?>
21
+ </select>
22
+ </td>
23
+ <td colspan="2"></td>
24
+ </tr>
25
+ <tr><th colspan="2"><?php if( ! defined('SPUP_VERSION') ) echo sprintf( __( 'On <a href="%s">Premium version</a> there are more cool positions and popup styles.','popups'), 'https://timersys.com/plugins/popups-premium/?utm_source=Plugin&utm_medium=options_position&utm_campaign=Popups%20Premium');?></th></tr>
26
+ <?php do_action( 'spu/metaboxes/after_position_options', $opts );?>
27
+ </table>
28
+ <h3>Trigger</h3>
29
+ <table class="form-table">
30
+ <tr valign="top">
31
+ <th><label for="spu_trigger"><?php _e( 'Trigger action', 'popups' ); ?></label></th>
32
+ <td class="spu-sm">
33
+ <select id="spu_trigger" name="spu[trigger]" class="widefat">
34
+
35
+ <option value="seconds" <?php selected($opts['trigger'], 'seconds'); ?>><?php _e( 'seconds after page load', 'popups' ); ?></option>
36
+ <option value="percentage" <?php selected($opts['trigger'], 'percentage'); ?>>% <?php _e( 'of page height', 'popups' ); ?></option>
37
+ <option value="pixels" <?php selected($opts['trigger'], 'pixels'); ?>><?php _e( 'Scrolled down pixels', 'popups' ); ?></option>
38
+ <option value="manual" <?php selected($opts['trigger'], 'manual'); ?>><?php _e( 'Manual Triggering', 'popups' ); ?></option>
39
+ <?php do_action( 'spu/metaboxes/trigger_options', $opts );?>
40
+ </select>
41
+ </td>
42
+ <td>
43
+ <input type="number" class="spu-trigger-number" name="spu[trigger_number]" min="0" value="<?php echo esc_attr($opts['trigger_number']); ?>" />
44
+ <?php do_action( 'spu/metaboxes/trigger_values', $opts );?>
45
+ </td>
46
+ </tr>
47
+ <tr>
48
+ <td style="margin:0;padding:0"></td><td style="position: relative;top: -15px;margin:0;padding:0 0 0 10px"><p class="help"><?php _e( 'Choose how the popup will be triggered on the page', 'popups' ); ?></p></td>
49
+ </tr>
50
+ <tr><th colspan="2"><?php if( ! defined('SPUP_VERSION') ) echo sprintf( __( 'On <a href="%s">Premium version</a> you can use exit intent trigger technology, or attach to any element that appears in the viewport.','popups'), 'https://timersys.com/plugins/popups-premium/?utm_source=Plugin&utm_medium=options_trigger&utm_campaign=Popups%20Premium');?></th></tr>
51
+ <?php do_action( 'spu/metaboxes/after_trigger_options', $opts );?>
52
+ </table>
53
+ <h3><?php _e( 'Cookies', 'popups');?></h3>
54
+ <p><?php _e( 'We use PHP cookies to prevent popups opening for users after they closed it.', 'popups');?></p>
55
+ <table class="form-table">
56
+ <tr valign="top">
57
+ <th><label for="spu_name_conversion_cookie"><?php _e( 'Conversion cookie name', 'popups' ); ?></label></th>
58
+ <td colspan="3">
59
+ <input type="text" id="spu_name_conversion_cookie" name="spu[name-convert-cookie]" value="<?php echo esc_attr($opts['name-convert-cookie']); ?>" />
60
+ <p class="help"><?php _e( 'The name that the popup will use for convertion cookie. Changing this name will reset the cookie, so all users will see popup again.', 'popups' ); ?></p>
61
+ </td>
62
+ </tr>
63
+ <tr valign="top">
64
+ <th><label for="spu_duration_conversion_cookie"><?php _e( 'Conversion cookie Duration', 'popups' ); ?></label></th>
65
+ <td colspan="3">
66
+ <input type="number" id="spu_duration_conversion_cookie" name="spu[duration-convert-cookie]" min="0" value="<?php echo esc_attr($opts['duration-convert-cookie']); ?>" />
67
+ <p class="help"><?php _e( 'When a user do a conversion like for example a click or form submission, how many days should it stay hidden?', 'popups' ); ?></p>
68
+ </td>
69
+ </tr>
70
+ <tr valign="top">
71
+ <th><label for="spu_name_closing_cookie"><?php _e( 'Closing cookie name', 'popups' ); ?></label></th>
72
+ <td colspan="3">
73
+ <input type="text" id="spu_name_closing_cookie" name="spu[name-close-cookie]" value="<?php echo esc_attr($opts['name-close-cookie']); ?>" />
74
+ <p class="help"><?php _e( 'The name that the popup will use for closing cookie. Changing this name will reset the cookie, so all users will see popup again.', 'popups' ); ?></p>
75
+ </td>
76
+ </tr>
77
+ <tr valign="top">
78
+ <th><label for="spu_duration_close_cookie"><?php _e( 'Closing cookie duration', 'popups' ); ?></label></th>
79
+ <td colspan="3">
80
+ <input type="number" id="spu_duration_close_cookie" name="spu[duration-close-cookie]" min="0" value="<?php echo isset( $opts['duration-close-cookie'] ) ? esc_attr($opts['duration-close-cookie']) : esc_attr($opts['duration-convert-cookie']); ?>" />
81
+ <p class="help"><?php _e( 'After closing the popup, how many days should it stay hidden?', 'popups' ); ?></p>
82
+ </td>
83
+ </tr>
84
+ <?php do_action( 'spu/metaboxes/after_cookie_options', $opts );?>
85
+ </table>
86
+ <h3>Close options</h3>
87
+ <table class="form-table">
88
+ <tr valign="top" class="conversion_close">
89
+ <th><label for="spu_conversion_close"><?php _e( 'Close on conversion?', 'popups' ); ?></label></th>
90
+ <td colspan="3">
91
+ <label><input type="radio" id="spu_conversion_close_1" name="spu[conversion_close]" value="1" <?php checked($opts['conversion_close'], 1); ?> /> <?php _e( 'Yes' ); ?></label> &nbsp;
92
+ <label><input type="radio" id="spu_conversion_close_0" name="spu[conversion_close]" value="0" <?php checked($opts['conversion_close'], 0); ?> /> <?php _e( 'No' ); ?></label> &nbsp;
93
+ <p class="help"><?php _e( 'If you have a form or social shortcode, by default popup will close on submission/conversion', 'popups' ); ?></p>
94
+ </td>
95
+ </tr>
96
+ <?php do_action( 'spu/metaboxes/after_close_options', $opts );?>
97
+ </table>
98
+ <h3>Other options</h3>
99
+ <table class="form-table">
100
+ <tr valign="top" class="auto_hide">
101
+ <th><label for="spu_auto_hide"><?php _e( 'Auto-hide?', 'popups' ); ?></label></th>
102
+ <td colspan="3">
103
+ <label><input type="radio" id="spu_auto_hide_1" name="spu[auto_hide]" value="1" <?php checked($opts['auto_hide'], 1); ?> /> <?php _e( 'Yes' ); ?></label> &nbsp;
104
+ <label><input type="radio" id="spu_auto_hide_0" name="spu[auto_hide]" value="0" <?php checked($opts['auto_hide'], 0); ?> /> <?php _e( 'No' ); ?></label> &nbsp;
105
+ <p class="help"><?php _e( 'Hide box again when visitors scroll back up?', 'popups' ); ?></p>
106
+ </td>
107
+ </tr>
108
+ <tr valign="top">
109
+ <th><label for="spu_test_mode"><?php _e( 'Enable test mode?', 'popups' ); ?></label></th>
110
+ <td colspan="3">
111
+ <label><input type="radio" id="spu_test_mode_1" name="spu[test_mode]" value="1" <?php checked($opts['test_mode'], 1); ?> /> <?php _e( 'Yes' ); ?></label> &nbsp;
112
+ <label><input type="radio" id="spu_test_mode_0" name="spu[test_mode]" value="0" <?php checked($opts['test_mode'], 0); ?> /> <?php _e( 'No' ); ?></label> &nbsp;
113
+ <p class="help"><?php _e( 'If test mode is enabled, the box will show up regardless of whether a cookie has been set. (To admins only)', 'popups' ); ?></p>
114
+ </td>
115
+ </tr>
116
+ <tr valign="top">
117
+ <th><label><?php _e( 'Animation', 'popups' ); ?></label></th>
118
+ <td colspan="3">
119
+ <select id="spu_animation" name="spu[animation]" class="widefat">
120
+ <option value="fade" <?php selected($opts['animation'], 'fade'); ?> > <?php _e( 'Fade In', 'popups' ); ?></option>
121
+ <option value="slide" <?php selected($opts['animation'], 'slide'); ?> > <?php _e( 'Slide In', 'popups' ); ?></option>
122
+ <?php do_action( 'spu/metaboxes/animations', $opts );?>
123
+ <option value="disable" <?php selected($opts['animation'], 'disable'); ?> > <?php _e( 'Disable animations', 'popups' ); ?></option>
124
+ </select>
125
+ <p class="help"><?php _e( 'Slide will only apply when popup is on the corners', 'popups' ); ?></p>
126
+ </td>
127
+ </tr>
128
+ <tr><th colspan="2"><?php if( ! defined('SPUP_VERSION') ) echo sprintf( __( 'On <a href="%s">Premium version</a> you have 8 new animations to play with!','popups'), 'https://timersys.com/plugins/popups-premium/?utm_source=Plugin&utm_medium=options_trigger&utm_campaign=Popups%20Premium');?></th></tr>
129
+ <tr valign="top" class="powered_link">
130
+ <th><label for="spu_powered_link"><?php _e( 'Show powered by link?', 'popups' ); ?></label></th>
131
+ <td colspan="3">
132
+ <label><input type="radio" id="spu_powered_link_1" name="spu[powered_link]" value="1" <?php checked($opts['powered_link'], 1); ?> /> <?php _e( 'Yes' ); ?></label> &nbsp;
133
+ <label><input type="radio" id="spu_powered_link_0" name="spu[powered_link]" value="0" <?php checked($opts['powered_link'], 0); ?> /> <?php _e( 'No' ); ?></label> &nbsp;
134
+ <p class="help"><?php echo sprintf(__( 'Shows a "powered by" link below your popup. If your affiliate link is set in the <a href="%s">settings</a>, it will be used.', 'popups' ), admin_url('edit.php?post_type=spucpt&page=spu_settings')); ?></p>
135
+ </td>
136
+ </tr>
137
+ <?php do_action( 'spu/metaboxes/after_other_options', $opts );?>
138
+ </table>
139
+ <?php do_action( 'spu/metaboxes/after_options', $opts );?>
140
+ </div>
141
+ <?php wp_nonce_field( 'spu_options', 'spu_options_nonce' ); ?>
admin/views/metaboxes/metabox-premium.php CHANGED
@@ -1,40 +1,40 @@
1
- <?php
2
- // Exit if accessed directly
3
- if ( !defined( 'ABSPATH' ) ) exit;
4
- ?>
5
- <?php
6
-
7
- $today = strtotime(date("Y-m-d H:i:s"));
8
- $blackbegin = strtotime("2014-11-28");
9
- $blackend = strtotime("2014-12-02");
10
- if($today > $blackbegin && $today < $blackend) : ?>
11
- <div class="alert-premium">
12
- <p><strong>Happy Black Friday!</strong> Get any Timersys Plugin with a 40% discount using the <code>BLACKFRIDAY</code> coupon code </p>
13
- </div>
14
- <?php endif;?>
15
-
16
- <p><?php _e( 'Take the best WordPress Popups plugin to the next level with Popups Premium extension.', 'popups' );?></p>
17
- <h2><?php _e( 'Popups Premium Features:', 'popups' );?></h2>
18
- <ul>
19
- <li><?php _e( 'Beautiful optin forms for popular mail providers', 'popups' );?></li>
20
- <li><?php _e( 'Currently supporting MailChimp, Aweber, Postmatic, Mailpoet, Constant Contact, ActiveCampaign, Newsletter plugin, InfusionSoft, etc', 'popups' );?></li>
21
- <li><?php _e( 'A/B testing. Explore which popup perform better for you.', 'popups' );?></li>
22
- <li><?php _e( 'Track impressions and Conversions of social likes and forms submissions like Contact Form 7, Gravity forms, etc', 'popups' );?></li>
23
- <li><?php _e( 'Track impressions and Conversions in Google Analytics ande define custom events', 'popups' );?></li>
24
- <li><?php _e( 'Exit Intent technology', 'popups' );?></li>
25
- <li><?php _e( 'New popup positions: top/bottoms bars , fullscreen mode, after post content', 'popups' );?></li>
26
- <li><?php _e( '8 New animations effects', 'popups' );?> - <a href="https://timersys.com/popups/?utm_source=Plugin&utm_medium=demo-button&utm_campaign=Popups%20Premium">Online demo</a></li>
27
- <li><?php _e( 'New trigger methods', 'popups' );?></li>
28
- <li><?php _e( 'More Display Rules: Show after N(numbers) of pages viewed', 'popups' );?></li>
29
- <li><?php _e( 'More Display Rules: Show popup at certain time', 'popups' );?></li>
30
- <li><?php _e( 'More Display Rules: Show popup at certain day', 'popups' );?></li>
31
- <li><?php _e( 'More Display Rules: Show/hide if another popup already converted', 'popups' );?></li>
32
- <li><?php _e( 'Timer for auto closing', 'popups' );?></li>
33
- <li><?php _e( 'Ability to disable close button', 'popups' );?></li>
34
- <li><?php _e( 'Ability to disable Advanced close methods like esc or clicking outside of the popup', 'popups' );?></li>
35
- <li><?php _e( 'Premium support', 'popups' );?></li>
36
- </ul>
37
- <p><strong>Hurry up and get your copy!</strong> Take advantage of this <span style="color:red">launch offer</span> before the price goes up. We have a <strong>lot of new features</strong> to be added soon!</p>
38
- <p style="text-align:center">
39
- <a class="button-primary" href="https://timersys.com/downloads/popups-premium/?utm_source=Plugin&utm_medium=buy-button&utm_campaign=Popups%20Premium"><?php _e( 'Buy Now!', 'popups' );?></a>
40
  </p>
1
+ <?php
2
+ // Exit if accessed directly
3
+ if ( !defined( 'ABSPATH' ) ) exit;
4
+ ?>
5
+ <?php
6
+
7
+ $today = strtotime(date("Y-m-d H:i:s"));
8
+ $blackbegin = strtotime("2014-11-28");
9
+ $blackend = strtotime("2014-12-02");
10
+ if($today > $blackbegin && $today < $blackend) : ?>
11
+ <div class="alert-premium">
12
+ <p><strong>Happy Black Friday!</strong> Get any Timersys Plugin with a 40% discount using the <code>BLACKFRIDAY</code> coupon code </p>
13
+ </div>
14
+ <?php endif;?>
15
+
16
+ <p><?php _e( 'Take the best WordPress Popups plugin to the next level with Popups Premium extension.', 'popups' );?></p>
17
+ <h2><?php _e( 'Popups Premium Features:', 'popups' );?></h2>
18
+ <ul>
19
+ <li><?php _e( 'Beautiful optin forms for popular mail providers', 'popups' );?></li>
20
+ <li><?php _e( 'Currently supporting MailChimp, Aweber, Postmatic, Mailpoet, Constant Contact, ActiveCampaign, Newsletter plugin, InfusionSoft, etc', 'popups' );?></li>
21
+ <li><?php _e( 'A/B testing. Explore which popup perform better for you.', 'popups' );?></li>
22
+ <li><?php _e( 'Track impressions and Conversions of social likes and forms submissions like Contact Form 7, Gravity forms, etc', 'popups' );?></li>
23
+ <li><?php _e( 'Track impressions and Conversions in Google Analytics ande define custom events', 'popups' );?></li>
24
+ <li><?php _e( 'Exit Intent technology', 'popups' );?></li>
25
+ <li><?php _e( 'New popup positions: top/bottoms bars , fullscreen mode, after post content', 'popups' );?></li>
26
+ <li><?php _e( '8 New animations effects', 'popups' );?> - <a href="https://timersys.com/popups/?utm_source=Plugin&utm_medium=demo-button&utm_campaign=Popups%20Premium">Online demo</a></li>
27
+ <li><?php _e( 'New trigger methods', 'popups' );?></li>
28
+ <li><?php _e( 'More Display Rules: Show after N(numbers) of pages viewed', 'popups' );?></li>
29
+ <li><?php _e( 'More Display Rules: Show popup at certain time', 'popups' );?></li>
30
+ <li><?php _e( 'More Display Rules: Show popup at certain day', 'popups' );?></li>
31
+ <li><?php _e( 'More Display Rules: Show/hide if another popup already converted', 'popups' );?></li>
32
+ <li><?php _e( 'Timer for auto closing', 'popups' );?></li>
33
+ <li><?php _e( 'Ability to disable close button', 'popups' );?></li>
34
+ <li><?php _e( 'Ability to disable Advanced close methods like esc or clicking outside of the popup', 'popups' );?></li>
35
+ <li><?php _e( 'Premium support', 'popups' );?></li>
36
+ </ul>
37
+ <p><strong>Hurry up and get your copy!</strong> Take advantage of this <span style="color:red">launch offer</span> before the price goes up. We have a <strong>lot of new features</strong> to be added soon!</p>
38
+ <p style="text-align:center">
39
+ <a class="button-primary" href="https://timersys.com/downloads/popups-premium/?utm_source=Plugin&utm_medium=buy-button&utm_campaign=Popups%20Premium"><?php _e( 'Buy Now!', 'popups' );?></a>
40
  </p>
admin/views/metaboxes/metabox-rules.php CHANGED
@@ -1,109 +1,109 @@
1
- <?php
2
- // Exit if accessed directly
3
- if ( !defined( 'ABSPATH' ) ) exit;
4
-
5
- /*
6
- * Meta box - Rules
7
- *
8
- * This template file is used when editing a popup and creates the interface for editing popup rules.
9
- *
10
- * @type template
11
- * @since 2.0
12
- */
13
- do_action( 'spu/metaboxes/before_rules', $post );
14
- ?>
15
-
16
- <table class="spu_table widefat" id="spu_rules">
17
- <tbody>
18
- <tr>
19
- <td class="label">
20
- <label for="post_type"><?php _e("Rules", 'popups' ); ?></label>
21
- <p class="description"><?php _e("Create a set of rules to determine where the popup will show", 'popups' ); ?></p>
22
- </td>
23
- <td>
24
- <div class="rules-groups">
25
-
26
- <?php if( is_array($groups) ): ?>
27
- <?php foreach( $groups as $group_id => $group ):
28
- $group_id = 'group_' . $group_id;
29
- ?>
30
- <div class="rules-group" data-id="<?php echo $group_id; ?>">
31
- <?php if( $group_id == 'group_0' ): ?>
32
- <h4><?php _e("Show this popup if", 'popups' ); ?></h4>
33
- <?php else: ?>
34
- <h4 class="rules-or"><span><?php _e("OR", 'popups' ); ?></span></h4>
35
- <?php endif; ?>
36
- <?php if( is_array($group) ): ?>
37
- <table class="spu_table widefat">
38
- <tbody>
39
- <?php foreach( $group as $rule_id => $rule ):
40
- $rule_id = 'rule_' . $rule_id;
41
- ?>
42
- <tr data-id="<?php echo $rule_id; ?>">
43
- <td class="param"><?php
44
-
45
- $choices = $this->get_rules_choices();
46
-
47
- // create field
48
- $args = array(
49
- 'group_id' => $group_id,
50
- 'rule_id' => $rule_id,
51
- 'name' => 'spu_rules[' . $group_id . '][' . $rule_id . '][param]',
52
- 'value' => $rule['param']
53
- );
54
-
55
- Spu_Helper::print_select( $args, $choices );
56
-
57
-
58
- ?></td>
59
- <td class="operator"><?php
60
-
61
- $args = array(
62
- 'group_id' => $group_id,
63
- 'rule_id' => $rule_id,
64
- 'name' => 'spu_rules[' . $group_id . '][' . $rule_id . '][operator]',
65
- 'value' => $rule['operator'],
66
- 'param' => $rule['param'],
67
-
68
- );
69
- Spu_Helper::ajax_render_operator( $args );
70
-
71
- ?></td>
72
- <td class="value"><?php
73
- $args = array(
74
- 'group_id' => $group_id,
75
- 'rule_id' => $rule_id,
76
- 'value' => !empty($rule['value']) ? $rule['value'] : '',
77
- 'name' => 'spu_rules[' . $group_id . '][' . $rule_id . '][value]',
78
- 'param' => $rule['param'],
79
- );
80
- Spu_Helper::ajax_render_rules( $args );
81
-
82
- ?></td>
83
- <td class="add">
84
- <a href="#" class="rules-add-rule button"><?php _e("+ AND", 'popups' ); ?></a>
85
- </td>
86
- <td class="remove">
87
- <a href="#" class="rules-remove-rule rules-remove-rule">-</a>
88
- </td>
89
- </tr>
90
- <?php endforeach; ?>
91
- </tbody>
92
- </table>
93
- <?php endif; ?>
94
- </div>
95
- <?php endforeach; ?>
96
-
97
- <h4 class="rules-or"><span><?php _e("OR", 'popups' ); ?></span></h4>
98
-
99
- <a class="button rules-add-group" href="#"><?php _e("Add rule group (+ OR)", 'popups' ); ?></a>
100
- <p style="margin-top:30px">
101
- <?php echo sprintf(__('<strong>Hint</strong>: If you are planning to open the popup with a button, simple leave this set to "All Pages" and change trigger method below to "Manual triggering". Then inside the page you want to open the popup add the following shortcode [spu popup="%s"]Click here[/spu]','spu'),$post->ID);?>
102
- </p>
103
- <?php endif; ?>
104
-
105
- </div>
106
- </td>
107
- </tr>
108
- </tbody>
109
- </table>
1
+ <?php
2
+ // Exit if accessed directly
3
+ if ( !defined( 'ABSPATH' ) ) exit;
4
+
5
+ /*
6
+ * Meta box - Rules
7
+ *
8
+ * This template file is used when editing a popup and creates the interface for editing popup rules.
9
+ *
10
+ * @type template
11
+ * @since 2.0
12
+ */
13
+ do_action( 'spu/metaboxes/before_rules', $post );
14
+ ?>
15
+
16
+ <table class="spu_table widefat" id="spu_rules">
17
+ <tbody>
18
+ <tr>
19
+ <td class="label">
20
+ <label for="post_type"><?php _e("Rules", 'popups' ); ?></label>
21
+ <p class="description"><?php _e("Create a set of rules to determine where the popup will show", 'popups' ); ?></p>
22
+ </td>
23
+ <td>
24
+ <div class="rules-groups">
25
+
26
+ <?php if( is_array($groups) ): ?>
27
+ <?php foreach( $groups as $group_id => $group ):
28
+ $group_id = 'group_' . $group_id;
29
+ ?>
30
+ <div class="rules-group" data-id="<?php echo $group_id; ?>">
31
+ <?php if( $group_id == 'group_0' ): ?>
32
+ <h4><?php _e("Show this popup if", 'popups' ); ?></h4>
33
+ <?php else: ?>
34
+ <h4 class="rules-or"><span><?php _e("OR", 'popups' ); ?></span></h4>
35
+ <?php endif; ?>
36
+ <?php if( is_array($group) ): ?>
37
+ <table class="spu_table widefat">
38
+ <tbody>
39
+ <?php foreach( $group as $rule_id => $rule ):
40
+ $rule_id = 'rule_' . $rule_id;
41
+ ?>
42
+ <tr data-id="<?php echo $rule_id; ?>">
43
+ <td class="param"><?php
44
+
45
+ $choices = $this->get_rules_choices();
46
+
47
+ // create field
48
+ $args = array(
49
+ 'group_id' => $group_id,
50
+ 'rule_id' => $rule_id,
51
+ 'name' => 'spu_rules[' . $group_id . '][' . $rule_id . '][param]',
52
+ 'value' => $rule['param']
53
+ );
54
+
55
+ Spu_Helper::print_select( $args, $choices );
56
+
57
+
58
+ ?></td>
59
+ <td class="operator"><?php
60
+
61
+ $args = array(
62
+ 'group_id' => $group_id,
63
+ 'rule_id' => $rule_id,
64
+ 'name' => 'spu_rules[' . $group_id . '][' . $rule_id . '][operator]',
65
+ 'value' => $rule['operator'],
66
+ 'param' => $rule['param'],
67
+
68
+ );
69
+ Spu_Helper::ajax_render_operator( $args );
70
+
71
+ ?></td>
72
+ <td class="value"><?php
73
+ $args = array(
74
+ 'group_id' => $group_id,
75
+ 'rule_id' => $rule_id,
76
+ 'value' => !empty($rule['value']) ? $rule['value'] : '',
77
+ 'name' => 'spu_rules[' . $group_id . '][' . $rule_id . '][value]',
78
+ 'param' => $rule['param'],
79
+ );
80
+ Spu_Helper::ajax_render_rules( $args );
81
+
82
+ ?></td>
83
+ <td class="add">
84
+ <a href="#" class="rules-add-rule button"><?php _e("+ AND", 'popups' ); ?></a>
85
+ </td>
86
+ <td class="remove">
87
+ <a href="#" class="rules-remove-rule rules-remove-rule">-</a>
88
+ </td>
89
+ </tr>
90
+ <?php endforeach; ?>
91
+ </tbody>
92
+ </table>
93
+ <?php endif; ?>
94
+ </div>
95
+ <?php endforeach; ?>
96
+
97
+ <h4 class="rules-or"><span><?php _e("OR", 'popups' ); ?></span></h4>
98
+
99
+ <a class="button rules-add-group" href="#"><?php _e("Add rule group (+ OR)", 'popups' ); ?></a>
100
+ <p style="margin-top:30px">
101
+ <?php echo sprintf(__('<strong>Hint</strong>: If you are planning to open the popup with a button, simple leave this set to "All Pages" and change trigger method below to "Manual triggering". Then inside the page you want to open the popup add the following shortcode [spu popup="%s"]Click here[/spu]','spu'),$post->ID);?>
102
+ </p>
103
+ <?php endif; ?>
104
+
105
+ </div>
106
+ </td>
107
+ </tr>
108
+ </tbody>
109
+ </table>
admin/views/metaboxes/metabox-support.php CHANGED
@@ -1,6 +1,6 @@
1
- <?php
2
- // Exit if accessed directly
3
- if ( !defined( 'ABSPATH' ) ) exit;
4
- ?>
5
- <p><?php echo sprintf( __( 'You are using Popups plugin v%s', 'popups' ), SocialPopup::VERSION );?></p>
6
  <p><?php echo sprintf( __( 'If you need support please go to the WordPress.org <a href="%s">support forums</a>', 'popups' ), 'http://wordpress.org/support/plugin/popups/');?></p>
1
+ <?php
2
+ // Exit if accessed directly
3
+ if ( !defined( 'ABSPATH' ) ) exit;
4
+ ?>
5
+ <p><?php echo sprintf( __( 'You are using Popups plugin v%s', 'popups' ), SocialPopup::VERSION );?></p>
6
  <p><?php echo sprintf( __( 'If you need support please go to the WordPress.org <a href="%s">support forums</a>', 'popups' ), 'http://wordpress.org/support/plugin/popups/');?></p>
admin/views/metaboxes/metabox-video.php CHANGED
@@ -1,6 +1,6 @@
1
- <?php
2
- // Exit if accessed directly
3
- if ( !defined( 'ABSPATH' ) ) exit;
4
- ?>
5
- <p><?= __('Take a look to this "How to add a Popup" help video to better understand how the plugin works. Remember you can minimize this box click clicking on the top right arrow.');?></p>
6
- <iframe width="100%" height="315" style="max-width:550px;display: block;margin:10px auto;" src="https://www.youtube.com/embed/S_MfZne6X2I??rel=0&amp;showinfo=0" frameborder="0" allowfullscreen></iframe>
1
+ <?php
2
+ // Exit if accessed directly
3
+ if ( !defined( 'ABSPATH' ) ) exit;
4
+ ?>
5
+ <p><?= __('Take a look to this "How to add a Popup" help video to better understand how the plugin works. Remember you can minimize this box click clicking on the top right arrow.');?></p>
6
+ <iframe width="100%" height="315" style="max-width:550px;display: block;margin:10px auto;" src="https://www.youtube.com/embed/S_MfZne6X2I??rel=0&amp;showinfo=0" frameborder="0" allowfullscreen></iframe>
admin/views/settings-page.php CHANGED
@@ -1,77 +1,77 @@
1
- <?php
2
- /**
3
- * Settings page template
4
- * @since 1.1
5
- */
6
- ?>
7
- <div class="wrap">
8
- <h2>Popups <?php echo SocialPopup::VERSION;
9
- if( class_exists('PopupsP') ){
10
- echo ' - Premium v', PopupsP::VERSION;
11
- }
12
- ?></h2>
13
- <form name="spu-settings" method="post">
14
- <table class="form-table">
15
- <?php do_action( 'spu/settings_page/before' ); ?>
16
- <tr valign="top" class="">
17
- <th><label for="add_link"><?php _e( 'Affiliate link', 'popups' ); ?></label></th>
18
- <td colspan="3">
19
- <label><input type="text" id="add_link" name="spu_settings[aff_link]" value="<?php echo isset($opts['aff_link']) ? $opts['aff_link'] :'';?>" class="regular-text" />
20
- <p class="help"><?php echo sprintf(__( 'You can earn money by promoting the plugin! Join <a href="%s">our affiliate program</a> and paste your affiliate link here to earn 35&#37; in commissions . Once entered, it will replace the default "Powered by" on the popups.', 'popups' ) , 'https://timersys.com/affiliates/'); ?></p>
21
- </td>
22
- </tr>
23
- <tr valign="top" class="">
24
- <th><label for="ajax_mode"><?php _e( 'Ajax mode?', 'popups' ); ?></label></th>
25
- <td colspan="3">
26
- <label><input type="checkbox" id="ajax_mode" name="spu_settings[ajax_mode]" value="1" <?php isset($opts['ajax_mode']) && checked($opts['ajax_mode'], 1); ?> />
27
- <p class="help"><?php _e( 'Load popups using ajax. Compatible with cache plugins, but might not work with all plugins', 'popups' ); ?></p>
28
- </td>
29
- </tr>
30
-
31
- <tr valign="top" class="">
32
- <th><label for="style"><?php _e( 'Remove shortcodes style', 'popups' ); ?></label></th>
33
- <td colspan="3">
34
- <label><input type="checkbox" id="style" name="spu_settings[shortcodes_style]" value="1" <?php isset($opts['shortcodes_style']) && checked($opts['shortcodes_style'], 1); ?> />
35
- <p class="help"><?php _e( 'By default the plugin will apply some style to shortcodes. Check here if you want to manually style them', 'popups' ); ?></p>
36
- </td>
37
-
38
- </tr>
39
- <tr valign="top" class="">
40
- <th><label for="style"><?php _e( 'Unload Facebook javascript', 'popups' ); ?></label></th>
41
- <td colspan="3">
42
- <label><input type="checkbox" id="style" name="spu_settings[facebook]" value="1" <?php isset($opts['facebook']) && checked($opts['facebook'], 1); ?> />
43
- <p class="help"><?php _e( 'If you use your own Facebook script, check this', 'popups' ); ?></p>
44
- </td>
45
-
46
- </tr>
47
- <tr valign="top" class="">
48
- <th><label for="style"><?php _e( 'Unload Google javascript', 'popups' ); ?></label></th>
49
- <td colspan="3">
50
- <label><input type="checkbox" id="style" name="spu_settings[google]" value="1" <?php isset($opts['google']) && checked($opts['google'], 1); ?> />
51
- <p class="help"><?php _e( 'If you use your own Google script, check this', 'popups' ); ?></p>
52
- </td>
53
-
54
- </tr>
55
- <tr valign="top" class="">
56
- <th><label for="style"><?php _e( 'Unload Twitter javascript', 'popups' ); ?></label></th>
57
- <td colspan="3">
58
- <label><input type="checkbox" id="style" name="spu_settings[twitter]" value="1" <?php isset($opts['twitter']) && checked($opts['twitter'], 1); ?> />
59
- <p class="help"><?php _e( 'If you use your own Twitter script, check this', 'popups' ); ?></p>
60
- </td>
61
-
62
- </tr>
63
- <?php do_action( 'spu/settings_page/after' ); ?>
64
-
65
- <tr valign="top" class="">
66
- <th><label for="uninstall"><?php _e( 'Delete all data on Uninstall', 'popups' ); ?></label></th>
67
- <td colspan="3">
68
- <label><input type="checkbox" id="uninstall" name="spu_settings[uninstall]" value="1" <?php isset($opts['uninstall']) && checked($opts['uninstall'], 1); ?> />
69
- <p class="help"><?php _e( 'When you uninstall the plugin all popups, settings and stats will be deleted from your db', 'popups' ); ?></p>
70
- </td>
71
-
72
- </tr>
73
- <tr><td><input type="submit" class="button-primary" value="<?php _e( 'Save settings', 'popups' );?>"/></td>
74
- <?php wp_nonce_field('spu_save_settings','spu_nonce'); ?>
75
- </table>
76
- </form>
77
  </div>
1
+ <?php
2
+ /**
3
+ * Settings page template
4
+ * @since 1.1
5
+ */
6
+ ?>
7
+ <div class="wrap">
8
+ <h2>Popups <?php echo SocialPopup::VERSION;
9
+ if( class_exists('PopupsP') ){
10
+ echo ' - Premium v', PopupsP::VERSION;
11
+ }
12
+ ?></h2>
13
+ <form name="spu-settings" method="post">
14
+ <table class="form-table">
15
+ <?php do_action( 'spu/settings_page/before' ); ?>
16
+ <tr valign="top" class="">
17
+ <th><label for="add_link"><?php _e( 'Affiliate link', 'popups' ); ?></label></th>
18
+ <td colspan="3">
19
+ <label><input type="text" id="add_link" name="spu_settings[aff_link]" value="<?php echo isset($opts['aff_link']) ? $opts['aff_link'] :'';?>" class="regular-text" />
20
+ <p class="help"><?php echo sprintf(__( 'You can earn money by promoting the plugin! Join <a href="%s">our affiliate program</a> and paste your affiliate link here to earn 35&#37; in commissions . Once entered, it will replace the default "Powered by" on the popups.', 'popups' ) , 'https://timersys.com/affiliates/'); ?></p>
21
+ </td>
22
+ </tr>
23
+ <tr valign="top" class="">
24
+ <th><label for="ajax_mode"><?php _e( 'Ajax mode?', 'popups' ); ?></label></th>
25
+ <td colspan="3">
26
+ <label><input type="checkbox" id="ajax_mode" name="spu_settings[ajax_mode]" value="1" <?php isset($opts['ajax_mode']) && checked($opts['ajax_mode'], 1); ?> />
27
+ <p class="help"><?php _e( 'Load popups using ajax. Compatible with cache plugins, but might not work with all plugins', 'popups' ); ?></p>
28
+ </td>
29
+ </tr>
30
+
31
+ <tr valign="top" class="">
32
+ <th><label for="style"><?php _e( 'Remove shortcodes style', 'popups' ); ?></label></th>
33
+ <td colspan="3">
34
+ <label><input type="checkbox" id="style" name="spu_settings[shortcodes_style]" value="1" <?php isset($opts['shortcodes_style']) && checked($opts['shortcodes_style'], 1); ?> />
35
+ <p class="help"><?php _e( 'By default the plugin will apply some style to shortcodes. Check here if you want to manually style them', 'popups' ); ?></p>
36
+ </td>
37
+
38
+ </tr>
39
+ <tr valign="top" class="">
40
+ <th><label for="style"><?php _e( 'Unload Facebook javascript', 'popups' ); ?></label></th>
41
+ <td colspan="3">
42
+ <label><input type="checkbox" id="style" name="spu_settings[facebook]" value="1" <?php isset($opts['facebook']) && checked($opts['facebook'], 1); ?> />
43
+ <p class="help"><?php _e( 'If you use your own Facebook script, check this', 'popups' ); ?></p>
44
+ </td>
45
+
46
+ </tr>
47
+ <tr valign="top" class="">
48
+ <th><label for="style"><?php _e( 'Unload Google javascript', 'popups' ); ?></label></th>
49
+ <td colspan="3">
50
+ <label><input type="checkbox" id="style" name="spu_settings[google]" value="1" <?php isset($opts['google']) && checked($opts['google'], 1); ?> />
51
+ <p class="help"><?php _e( 'If you use your own Google script, check this', 'popups' ); ?></p>
52
+ </td>
53
+
54
+ </tr>
55
+ <tr valign="top" class="">
56
+ <th><label for="style"><?php _e( 'Unload Twitter javascript', 'popups' ); ?></label></th>
57
+ <td colspan="3">
58
+ <label><input type="checkbox" id="style" name="spu_settings[twitter]" value="1" <?php isset($opts['twitter']) && checked($opts['twitter'], 1); ?> />
59
+ <p class="help"><?php _e( 'If you use your own Twitter script, check this', 'popups' ); ?></p>
60
+ </td>
61
+
62
+ </tr>
63
+ <?php do_action( 'spu/settings_page/after' ); ?>
64
+
65
+ <tr valign="top" class="">
66
+ <th><label for="uninstall"><?php _e( 'Delete all data on Uninstall', 'popups' ); ?></label></th>
67
+ <td colspan="3">
68
+ <label><input type="checkbox" id="uninstall" name="spu_settings[uninstall]" value="1" <?php isset($opts['uninstall']) && checked($opts['uninstall'], 1); ?> />
69
+ <p class="help"><?php _e( 'When you uninstall the plugin all popups, settings and stats will be deleted from your db', 'popups' ); ?></p>
70
+ </td>
71
+
72
+ </tr>
73
+ <tr><td><input type="submit" class="button-primary" value="<?php _e( 'Save settings', 'popups' );?>"/></td>
74
+ <?php wp_nonce_field('spu_save_settings','spu_nonce'); ?>
75
+ </table>
76
+ </form>
77
  </div>
composer.json CHANGED
@@ -1,8 +1,8 @@
1
- {
2
- "minimum-stability": "dev",
3
- "require": {
4
- "jaybizzle/crawler-detect": "1.*",
5
- "mobiledetect/mobiledetectlib": "^2.8",
6
- "cbschuld/browser.php": "^1.95@dev"
7
- }
8
- }
1
+ {
2
+ "minimum-stability": "dev",
3
+ "require": {
4
+ "jaybizzle/crawler-detect": "1.*",
5
+ "mobiledetect/mobiledetectlib": "^2.8",
6
+ "cbschuld/browser.php": "^1.95@dev"
7
+ }
8
+ }
composer.lock CHANGED
@@ -1,166 +1,166 @@
1
- {
2
- "_readme": [
3
- "This file locks the dependencies of your project to a known state",
4
- "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
5
- "This file is @generated automatically"
6
- ],
7
- "content-hash": "fe7213eeccfa0dd003c369f624314b84",
8
- "packages": [
9
- {
10
- "name": "cbschuld/browser.php",
11
- "version": "dev-master",
12
- "source": {
13
- "type": "git",
14
- "url": "https://github.com/cbschuld/Browser.php.git",
15
- "reference": "6bde9efb0b14a4917affe741500c29149419e491"
16
- },
17
- "dist": {
18
- "type": "zip",
19
- "url": "https://api.github.com/repos/cbschuld/Browser.php/zipball/6bde9efb0b14a4917affe741500c29149419e491",
20
- "reference": "6bde9efb0b14a4917affe741500c29149419e491",
21
- "shasum": ""
22
- },
23
- "type": "library",
24
- "extra": {
25
- "branch-alias": {
26
- "dev-master": "1.95-dev"
27
- }
28
- },
29
- "autoload": {
30
- "files": [
31
- "lib/Browser.php"
32
- ]
33
- },
34
- "notification-url": "https://packagist.org/downloads/",
35
- "license": [
36
- "MIT"
37
- ],
38
- "authors": [
39
- {
40
- "name": "Chris Schuld",
41
- "email": "chris@chrisschuld.com",
42
- "homepage": "http://chrisschuld.com"
43
- }
44
- ],
45
- "description": "A PHP Class to detect a user's Browser",
46
- "homepage": "http://chrisschuld.com/projects/browser-php-detecting-a-users-browser-from-php.html",
47
- "keywords": [
48
- "browser",
49
- "detection",
50
- "user agent"
51
- ],
52
- "time": "2017-07-31T23:43:17+00:00"
53
- },
54
- {
55
- "name": "jaybizzle/crawler-detect",
56
- "version": "v1.2.63",
57
- "source": {
58
- "type": "git",
59
- "url": "https://github.com/JayBizzle/Crawler-Detect.git",
60
- "reference": "3566bc69d0839ab2dfd739a660b00f25a6f02031"
61
- },
62
- "dist": {
63
- "type": "zip",
64
- "url": "https://api.github.com/repos/JayBizzle/Crawler-Detect/zipball/3566bc69d0839ab2dfd739a660b00f25a6f02031",
65
- "reference": "3566bc69d0839ab2dfd739a660b00f25a6f02031",
66
- "shasum": ""
67
- },
68
- "require": {
69
- "php": ">=5.3.0"
70
- },
71
- "require-dev": {
72
- "phpunit/phpunit": "^4.8|^5.5|^6.5",
73
- "satooshi/php-coveralls": "1.*"
74
- },
75
- "type": "library",
76
- "autoload": {
77
- "psr-4": {
78
- "Jaybizzle\\CrawlerDetect\\": "src/"
79
- }
80
- },
81
- "notification-url": "https://packagist.org/downloads/",
82
- "license": [
83
- "MIT"
84
- ],
85
- "authors": [
86
- {
87
- "name": "Mark Beech",
88
- "email": "m@rkbee.ch",
89
- "role": "Developer"
90
- }
91
- ],
92
- "description": "CrawlerDetect is a PHP class for detecting bots/crawlers/spiders via the user agent",
93
- "homepage": "https://github.com/JayBizzle/Crawler-Detect/",
94
- "keywords": [
95
- "crawler",
96
- "crawler detect",
97
- "crawler detector",
98
- "crawlerdetect",
99
- "php crawler detect"
100
- ],
101
- "time": "2018-05-21T19:56:44+00:00"
102
- },
103
- {
104
- "name": "mobiledetect/mobiledetectlib",
105
- "version": "2.8.31",
106
- "source": {
107
- "type": "git",
108
- "url": "https://github.com/serbanghita/Mobile-Detect.git",
109
- "reference": "adb882ea3b9d154f087ecb2c333180dad6f4dd37"
110
- },
111
- "dist": {
112
- "type": "zip",
113
- "url": "https://api.github.com/repos/serbanghita/Mobile-Detect/zipball/adb882ea3b9d154f087ecb2c333180dad6f4dd37",
114
- "reference": "adb882ea3b9d154f087ecb2c333180dad6f4dd37",
115
- "shasum": ""
116
- },
117
- "require": {
118
- "php": ">=5.0.0"
119
- },
120
- "require-dev": {
121
- "phpunit/phpunit": "~4.8.35||~5.7"
122
- },
123
- "type": "library",
124
- "autoload": {
125
- "classmap": [
126
- "Mobile_Detect.php"
127
- ],
128
- "psr-0": {
129
- "Detection": "namespaced/"
130
- }
131
- },
132
- "notification-url": "https://packagist.org/downloads/",
133
- "license": [
134
- "MIT"
135
- ],
136
- "authors": [
137
- {
138
- "name": "Serban Ghita",
139
- "email": "serbanghita@gmail.com",
140
- "homepage": "http://mobiledetect.net",
141
- "role": "Developer"
142
- }
143
- ],
144
- "description": "Mobile_Detect is a lightweight PHP class for detecting mobile devices. It uses the User-Agent string combined with specific HTTP headers to detect the mobile environment.",
145
- "homepage": "https://github.com/serbanghita/Mobile-Detect",
146
- "keywords": [
147
- "detect mobile devices",
148
- "mobile",
149
- "mobile detect",
150
- "mobile detector",
151
- "php mobile detect"
152
- ],
153
- "time": "2018-02-26T19:39:55+00:00"
154
- }
155
- ],
156
- "packages-dev": [],
157
- "aliases": [],
158
- "minimum-stability": "dev",
159
- "stability-flags": {
160
- "cbschuld/browser.php": 20
161
- },
162
- "prefer-stable": false,
163
- "prefer-lowest": false,
164
- "platform": [],
165
- "platform-dev": []
166
- }
1
+ {
2
+ "_readme": [
3
+ "This file locks the dependencies of your project to a known state",
4
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
5
+ "This file is @generated automatically"
6
+ ],
7
+ "content-hash": "fe7213eeccfa0dd003c369f624314b84",
8
+ "packages": [
9
+ {
10
+ "name": "cbschuld/browser.php",
11
+ "version": "dev-master",
12
+ "source": {
13
+ "type": "git",
14
+ "url": "https://github.com/cbschuld/Browser.php.git",
15
+ "reference": "6bde9efb0b14a4917affe741500c29149419e491"
16
+ },
17
+ "dist": {
18
+ "type": "zip",
19
+ "url": "https://api.github.com/repos/cbschuld/Browser.php/zipball/6bde9efb0b14a4917affe741500c29149419e491",
20
+ "reference": "6bde9efb0b14a4917affe741500c29149419e491",
21
+ "shasum": ""
22
+ },
23
+ "type": "library",
24
+ "extra": {
25
+ "branch-alias": {
26
+ "dev-master": "1.95-dev"
27
+ }
28
+ },
29
+ "autoload": {
30
+ "files": [
31
+ "lib/Browser.php"
32
+ ]
33
+ },
34
+ "notification-url": "https://packagist.org/downloads/",
35
+ "license": [
36
+ "MIT"
37
+ ],
38
+ "authors": [
39
+ {
40
+ "name": "Chris Schuld",
41
+ "email": "chris@chrisschuld.com",
42
+ "homepage": "http://chrisschuld.com"
43
+ }
44
+ ],
45
+ "description": "A PHP Class to detect a user's Browser",
46
+ "homepage": "http://chrisschuld.com/projects/browser-php-detecting-a-users-browser-from-php.html",
47
+ "keywords": [
48
+ "browser",
49
+ "detection",
50
+ "user agent"
51
+ ],
52
+ "time": "2017-07-31T23:43:17+00:00"
53
+ },
54
+ {
55
+ "name": "jaybizzle/crawler-detect",
56
+ "version": "v1.2.63",
57
+ "source": {
58
+ "type": "git",
59
+ "url": "https://github.com/JayBizzle/Crawler-Detect.git",
60
+ "reference": "3566bc69d0839ab2dfd739a660b00f25a6f02031"
61
+ },
62
+ "dist": {
63
+ "type": "zip",
64
+ "url": "https://api.github.com/repos/JayBizzle/Crawler-Detect/zipball/3566bc69d0839ab2dfd739a660b00f25a6f02031",
65
+ "reference": "3566bc69d0839ab2dfd739a660b00f25a6f02031",
66
+ "shasum": ""
67
+ },
68
+ "require": {
69
+ "php": ">=5.3.0"
70
+ },
71
+ "require-dev": {
72
+ "phpunit/phpunit": "^4.8|^5.5|^6.5",
73
+ "satooshi/php-coveralls": "1.*"
74
+ },
75
+ "type": "library",
76
+ "autoload": {
77
+ "psr-4": {
78
+ "Jaybizzle\\CrawlerDetect\\": "src/"
79
+ }
80
+ },
81
+ "notification-url": "https://packagist.org/downloads/",
82
+ "license": [
83
+ "MIT"
84
+ ],
85
+ "authors": [
86
+ {
87
+ "name": "Mark Beech",
88
+ "email": "m@rkbee.ch",
89
+ "role": "Developer"
90
+ }
91
+ ],
92
+ "description": "CrawlerDetect is a PHP class for detecting bots/crawlers/spiders via the user agent",
93
+ "homepage": "https://github.com/JayBizzle/Crawler-Detect/",
94
+ "keywords": [
95
+ "crawler",
96
+ "crawler detect",
97
+ "crawler detector",
98
+ "crawlerdetect",
99
+ "php crawler detect"
100
+ ],
101
+ "time": "2018-05-21T19:56:44+00:00"
102
+ },
103
+ {
104
+ "name": "mobiledetect/mobiledetectlib",
105
+ "version": "2.8.31",
106
+ "source": {
107
+ "type": "git",
108
+ "url": "https://github.com/serbanghita/Mobile-Detect.git",
109
+ "reference": "adb882ea3b9d154f087ecb2c333180dad6f4dd37"
110
+ },
111
+ "dist": {
112
+ "type": "zip",
113
+ "url": "https://api.github.com/repos/serbanghita/Mobile-Detect/zipball/adb882ea3b9d154f087ecb2c333180dad6f4dd37",
114
+ "reference": "adb882ea3b9d154f087ecb2c333180dad6f4dd37",
115
+ "shasum": ""
116
+ },
117
+ "require": {
118
+ "php": ">=5.0.0"
119
+ },
120
+ "require-dev": {
121
+ "phpunit/phpunit": "~4.8.35||~5.7"
122
+ },
123
+ "type": "library",
124
+ "autoload": {
125
+ "classmap": [
126
+ "Mobile_Detect.php"
127
+ ],
128
+ "psr-0": {
129
+ "Detection": "namespaced/"
130
+ }
131
+ },
132
+ "notification-url": "https://packagist.org/downloads/",
133
+ "license": [
134
+ "MIT"
135
+ ],
136
+ "authors": [
137
+ {
138
+ "name": "Serban Ghita",
139
+ "email": "serbanghita@gmail.com",
140
+ "homepage": "http://mobiledetect.net",
141
+ "role": "Developer"
142
+ }
143
+ ],
144
+ "description": "Mobile_Detect is a lightweight PHP class for detecting mobile devices. It uses the User-Agent string combined with specific HTTP headers to detect the mobile environment.",
145
+ "homepage": "https://github.com/serbanghita/Mobile-Detect",
146
+ "keywords": [
147
+ "detect mobile devices",
148
+ "mobile",
149
+ "mobile detect",
150
+ "mobile detector",
151
+ "php mobile detect"
152
+ ],
153
+ "time": "2018-02-26T19:39:55+00:00"
154
+ }
155
+ ],
156
+ "packages-dev": [],
157
+ "aliases": [],
158
+ "minimum-stability": "dev",
159
+ "stability-flags": {
160
+ "cbschuld/browser.php": 20
161
+ },
162
+ "prefer-stable": false,
163
+ "prefer-lowest": false,
164
+ "platform": [],
165
+ "platform-dev": []
166
+ }
includes/class-spu-helper.php CHANGED
@@ -1,564 +1,564 @@
1
- <?php
2
-
3
- /**
4
- * Helper class of SPu for admin
5
- *
6
- * @package SocialPopup_Admin
7
- * @author Damian Logghe <info@timersys.com>
8
- */
9
- class Spu_Helper {
10
- /**
11
- * Plugin slug
12
- * @var string
13
- */
14
- protected static $plugin_slug = '';
15
-
16
- /**
17
- * ajax_render_operator
18
- *
19
- * @description creates the HTML for the field group operator metabox. Called from both Ajax and PHP
20
- * @since 1.4.6
21
- * I took this functions from the awesome Advanced custom fields plugin http://www.advancedcustomfields.com/
22
- */
23
-
24
- public static function ajax_render_operator( $options = array() ) {
25
- // defaults
26
- $defaults = array(
27
- 'group_id' => 0,
28
- 'rule_id' => 0,
29
- 'value' => null,
30
- 'param' => null,
31
- );
32
-
33
- $is_ajax = false;
34
-
35
- if( isset($_POST['nonce']) && wp_verify_nonce($_POST['nonce'], 'spu_nonce') )
36
- {
37
- $is_ajax = true;
38
- }
39
-
40
- // Is AJAX call?
41
- if( $is_ajax )
42
- {
43
- $options = array_merge($defaults, $_POST);
44
- $options['name'] = 'spu_rules[' . $options['group_id'] . '][' . $options['rule_id'] . '][operator]';
45
- }
46
- else
47
- {
48
- $options = array_merge($defaults, $options);
49
- }
50
- // default for all rules
51
- $choices = array(
52
- '==' => __("is equal to", 'popups' ),
53
- '!=' => __("is not equal to", 'popups' ),
54
- );
55
- if( $options['param'] == 'local_time' ) {
56
- $choices = array(
57
- '<' => __("less than", 'popups' ),
58
- '>' => __("greater than", 'popups' ),
59
- );
60
- }
61
-
62
- if( $options['param'] == 'date' ) {
63
- $choices = array_merge( $choices,array(
64
- '<' => __("less than", 'popups' ),
65
- '>' => __("greater than", 'popups' ),
66
- ));
67
- }
68
-
69
- // allow custom operators
70
- $choices = apply_filters( 'spu/metaboxes/rule_operators', $choices, $options );
71
-
72
- self::print_select( $options, $choices );
73
-
74
- // ajax?
75
- if( $is_ajax )
76
- {
77
- die();
78
- }
79
- }
80
-
81
- /**
82
- * ajax_render_rules
83
- *
84
- * @description creates the HTML for the field group rules metabox. Called from both Ajax and PHP
85
- * @since 2.0
86
- * I took this functions from the awesome Advanced custom fields plugin http://www.advancedcustomfields.com/
87
- */
88
-
89
- public static function ajax_render_rules( $options = array() )
90
- {
91
-
92
- // defaults
93
- $defaults = array(
94
- 'group_id' => 0,
95
- 'rule_id' => 0,
96
- 'value' => null,
97
- 'param' => null,
98
- );
99
-
100
- $is_ajax = false;
101
-
102
- if( isset($_POST['nonce']) && wp_verify_nonce($_POST['nonce'], 'spu_nonce') )
103
- {
104
- $is_ajax = true;
105
- }
106
-
107
- // Is AJAX call?
108
- if( $is_ajax )
109
- {
110
- $options = array_merge($defaults, $_POST);
111
- $options['name'] = 'spu_rules[' . $options['group_id'] . '][' . $options['rule_id'] . '][value]';
112
- }
113
- else
114
- {
115
- $options = array_merge($defaults, $options);
116
- }
117
-
118
- // vars
119
- $choices = array();
120
-
121
-
122
- // some case's have the same outcome
123
- if($options['param'] == "page_parent")
124
- {
125
- $options['param'] = "page";
126
- }
127
-
128
-
129
- switch($options['param'])
130
- {
131
- case "post_type":
132
-
133
- // all post types except attachment
134
- $choices = apply_filters('spu/get_post_types', array(), array('attachment') );
135
-
136
- break;
137
-
138
-
139
- case "page":
140
-
141
- $post_type = 'page';
142
- $args = array(
143
- 'posts_per_page' => -1,
144
- 'post_type' => $post_type,
145
- 'orderby' => 'menu_order title',
146
- 'order' => 'ASC',
147
- 'post_status' => 'any',
148
- 'suppress_filters' => false,
149
- 'update_post_meta_cache' => false,
150
- );
151
-
152
- $posts = get_posts( apply_filters('spu/rules/page_args', $args ) );
153
-
154
- if( $posts )
155
- {
156
- // sort into hierachial order!
157
- if( is_post_type_hierarchical( $post_type ) )
158
- {
159
- $posts = get_page_children( 0, $posts );
160
- }
161
-
162
- foreach( $posts as $page )
163
- {
164
- $title = '';
165
- $ancestors = get_ancestors($page->ID, 'page');
166
- if($ancestors)
167
- {
168
- foreach($ancestors as $a)
169
- {
170
- $title .= '- ';
171
- }
172
- }
173
-
174
- $title .= apply_filters( 'the_title', $page->post_title, $page->ID );
175
-
176
-
177
- // status
178
- if($page->post_status != "publish")
179
- {
180
- $title .= " ($page->post_status)";
181
- }
182
-
183
- $choices[ $page->ID ] = $title;
184
-
185
- }
186
- // foreach($pages as $page)
187
-
188
- }
189
-
190
- break;
191
-
192
-
193
- case "page_type" :
194
-
195
- $choices = array(
196
- 'all_pages' => __("All Pages", 'popups'),
197
- 'front_page' => __("Front Page", 'popups'),
198
- 'posts_page' => __("Posts Page", 'popups'),
199
- 'category_page' => __("Category Page", 'popups'),
200
- 'search_page' => __("Search Page", 'popups'),
201
- 'archive_page' => __("Archives Page", 'popups'),
202
- 'top_level' => __("Top Level Page (parent of 0)", 'popups'),
203
- 'parent' => __("Parent Page (has children)", 'popups'),
204
- 'child' => __("Child Page (has parent)", 'popups'),
205
- );
206
-
207
- break;
208
-
209
- case "page_template" :
210
-
211
- $choices = array(
212
- 'default' => __("Default Template", 'popups'),
213
- );
214
-
215
- $templates = get_page_templates();
216
- foreach($templates as $k => $v)
217
- {
218
- $choices[$v] = $k;
219
- }
220
-
221
- break;
222
-
223
- case "post" :
224
- $post_types = apply_filters('spu/get_post_types', array());
225
- unset( $post_types['page'], $post_types['attachment'], $post_types['revision'] , $post_types['nav_menu_item'], $post_types['spucpt'] );
226
- if( $post_types )
227
- {
228
- foreach( $post_types as $post_type )
229
- {
230
- $args = array(
231
- 'numberposts' => '-1',
232
- 'post_type' => $post_type,
233
- 'post_status' => array('publish', 'private', 'draft', 'inherit', 'future'),
234
- 'suppress_filters' => false,
235
- 'update_post_meta_cache' => false,
236
- 'update_post_term_cache' => false,
237
- );
238
- $posts = get_posts(apply_filters('spu/rules/post_args', $args ));
239
-
240
- if( $posts)
241
- {
242
- $choices[$post_type] = array();
243
-
244
- foreach($posts as $post)
245
- {
246
- $title = apply_filters( 'the_title', $post->post_title, $post->ID );
247
-
248
- // status
249
- if($post->post_status != "publish")
250
- {
251
- $title .= " ($post->post_status)";
252
- }
253
-
254
- $choices[$post_type][$post->ID] = $title;
255
-
256
- }
257
- // foreach($posts as $post)
258
- }
259
- // if( $posts )
260
- }
261
- // foreach( $post_types as $post_type )
262
- }
263
- // if( $post_types )
264
-
265
-
266
- break;
267
-
268
- case "post_category" :
269
-
270
- $categories = get_terms('category', array('get' => 'all', 'fields' => 'id=>name' ) );
271
- $choices = apply_filters('spu/rules/categories', $categories );
272
-
273
- break;
274
-
275
- case "post_format" :
276
-
277
- $choices = get_post_format_strings();
278
-
279
- break;
280
-
281
- case "post_status" :
282
-
283
- $choices = get_post_stati();
284
-
285
- break;
286
-
287
- case "user_type" :
288
-
289
- global $wp_roles;
290
-
291
- $choices = $wp_roles->get_names();
292
-
293
- if( is_multisite() )
294
- {
295
- $choices['super_admin'] = __('Super Admin');
296
- }
297
-
298
- break;
299
-
300
- case "taxonomy" :
301
-
302
- $choices = array();
303
- $simple_value = true;
304
- $choices = apply_filters('spu/get_taxonomies', $choices, $simple_value);
305
-
306
- break;
307
-
308
- case "logged_user" :
309
- case "mobiles" :
310
- case "tablets" :
311
- case "desktop" :
312
- case "crawlers" :
313
- case "left_comment" :
314
- case "search_engine" :
315
- case "same_site" :
316
-
317
- $choices = array('true' => __( 'True', 'popups' ) );
318
-
319
- break;
320
-
321
-
322
- }
323
-
324
-
325
- // allow custom rules rules
326
- $choices = apply_filters( 'spu/rules/rule_values/' . $options['param'], $choices );
327
-
328
- // Custom fields for rules
329
- do_action( 'spu/rules/print_' . $options['param'] . '_field', $options, $choices );
330
-
331
- // ajax?
332
- if( $is_ajax )
333
- {
334
- die();
335
- }
336
- }
337
-
338
- /**
339
- * Helper function to print select fields for rules
340
- * @since 2.0
341
- * @param array $choices options values for select
342
- * @param array $options array to pass group, id, rule_id etc
343
- * @return echo the select field
344
- */
345
- static function print_select( $options, $choices ) {
346
-
347
- // value must be array
348
- if( !is_array($options['value']) )
349
- {
350
- // perhaps this is a default value with new lines in it?
351
- if( strpos($options['value'], "\n") !== false )
352
- {
353
- // found multiple lines, explode it
354
- $options['value'] = explode("\n", $options['value']);
355
- }
356
- else
357
- {
358
- $options['value'] = array( $options['value'] );
359
- }
360
- }
361
-
362
-
363
- // trim value
364
- $options['value'] = array_map('trim', $options['value']);
365
- // determin if choices are grouped (2 levels of array)
366
- if( is_array($choices) )
367
- {
368
- foreach( $choices as $k => $v )
369
- {
370
- if( is_array($v) )
371
- {
372
- $optgroup = true;
373
- }
374
- }
375
- }
376
-
377
- echo '<select id="spu_rule_'.$options['group_id'].'_rule_'.$options['rule_id'].'" class="select" name="'.$options['name'].'">';
378
-
379
- // loop through values and add them as options
380
- if( is_array($choices) )
381
- {
382
- foreach( $choices as $key => $value )
383
- {
384
- if( isset($optgroup) )
385
- {
386
- // this select is grouped with optgroup
387
- if($key != '') echo '<optgroup label="'.$key.'">';
388
-
389
- if( is_array($value) )
390
- {
391
- foreach($value as $id => $label)
392
- {
393
-
394
- $selected = in_array($id, $options['value']) ? 'selected="selected"' : '';
395
-
396
- echo '<option value="'.$id.'" '.$selected.'>'.$label.'</option>';
397
- }
398
- }
399
-
400
- if($key != '') echo '</optgroup>';
401
- }
402
- else
403
- {
404
- $selected = in_array($key, $options['value']) ? 'selected="selected"' : '';
405
- echo '<option value="'.$key.'" '.$selected.'>'.$value.'</option>';
406
- }
407
- }
408
- }
409
-
410
-
411
- echo '</select>';
412
-
413
- }
414
-
415
- /**
416
- * Prints a text field rule
417
- * @param $options
418
- */
419
- static function print_textfield( $options ) {
420
- echo '<input type="text" name="'.$options['name'].'" value="'.$options['value'].'" id="spu_rule_'.$options['group_id'].'_rule_'.$options['rule_id'].'" />';
421
- }
422
-
423
- /**
424
- * Return the box options
425
- * @param int $id spucpt id
426
- * @since 2.0
427
- * @return array metadata values
428
- */
429
- function get_box_options( $id )
430
- {
431
- $defaults = array(
432
- 'css' => array(
433
- 'bgopacity' => '0.5',
434
- 'overlay_color' => '#000',
435
- 'background_color' => '#eeeeee',
436
- 'background_opacity'=> '1',
437
- 'width' => '600px',
438
- 'padding' => '25',
439
- 'color' => '#333',
440
- 'shadow_color' => '#666',
441
- 'shadow_type' => 'outset',
442
- 'shadow_x_offset' => '0',
443
- 'shadow_y_offset' => '0',
444
- 'shadow_blur' => '10',
445
- 'shadow_spread' => '1',
446
- 'border_color' => '#eee',
447
- 'border_width' => '8',
448
- 'border_radius' => '0',
449
- 'border_type' => 'none',
450
- 'close_color' => '#666',
451
- 'close_hover_color' => '#000',
452
- 'close_size' => '30px',
453
- 'close_position' => 'top_right',
454
- 'close_shadow_color'=> '#fff',
455
- 'position' => 'centered',
456
- ),
457
- 'trigger' => 'seconds',
458
- 'trigger_number' => '5',
459
- 'animation' => 'fade',
460
- 'duration-convert-cookie' => '999',
461
- 'duration-close-cookie' => '30',
462
- 'name-convert-cookie' => 'spu_conversion',
463
- 'name-close-cookie' => 'spu_closing',
464
- 'auto_hide' => 0,
465
- 'test_mode' => 0,
466
- 'conversion_close' => '1',
467
- 'powered_link' => '0',
468
- );
469
-
470
- $opts = apply_filters( 'spu/metaboxes/box_options', get_post_meta( $id, 'spu_options', true ), $id );
471
-
472
- $opts = wp_parse_args( $opts, apply_filters( 'spu/metaboxes/default_options', $defaults ) );
473
- // we added new rules as we can't merge recursively, so manual check them
474
- foreach ( $defaults['css'] as $key => $value ) {
475
- if( ! isset($opts['css'][$key] ) )
476
- $opts['css'][$key] = $value;
477
- }
478
-
479
- return $opts;
480
- }
481
-
482
- /**
483
- * Return the box rules
484
- * @param int $id spucpt id
485
- * @since 2.0
486
- * @return array metadata values
487
- */
488
- function get_box_rules( $id )
489
- {
490
- $defaults = array(
491
- // group_0
492
- array(
493
-
494
- // rule_0
495
- array(
496
- 'param' => 'page_type',
497
- 'operator' => '==',
498
- 'value' => 'all_pages',
499
- 'order_no' => 0,
500
- 'group_no' => 0
501
- )
502
- )
503
- );
504
-
505
- $rules = get_post_meta( $id, 'spu_rules', true );
506
-
507
- if( empty( $rules ) ) {
508
-
509
- return apply_filters( 'spu/metaboxes/default_rules', $defaults );
510
-
511
- } else {
512
-
513
- return $rules;
514
-
515
- }
516
-
517
-
518
- }
519
-
520
- /**
521
- * Simple HEX TO RGBA converter
522
- * @param $color
523
- * @param bool $opacity
524
- *
525
- * @return string
526
- */
527
- public static function hex2rgba($color, $opacity = false) {
528
-
529
- $default = 'rgb(0,0,0)';
530
-
531
- //Return default if no color provided
532
- if(empty($color))
533
- return $default;
534
-
535
- //Sanitize $color if "#" is provided
536
- if ($color[0] == '#' ) {
537
- $color = substr( $color, 1 );
538
- }
539
-
540
- //Check if color has 6 or 3 characters and get values
541
- if (strlen($color) == 6) {
542
- $hex = array( $color[0] . $color[1], $color[2] . $color[3], $color[4] . $color[5] );
543
- } elseif ( strlen( $color ) == 3 ) {
544
- $hex = array( $color[0] . $color[0], $color[1] . $color[1], $color[2] . $color[2] );
545
- } else {
546
- return $default;
547
- }
548
-
549
- //Convert hexadec to rgb
550
- $rgb = array_map('hexdec', $hex);
551
-
552
- //Check if opacity is set(rgba or rgb)
553
- if($opacity){
554
- if(abs($opacity) > 1)
555
- $opacity = 1.0;
556
- $output = 'rgba('.implode(",",$rgb).','.$opacity.')';
557
- } else {
558
- $output = 'rgb('.implode(",",$rgb).')';
559
- }
560
-
561
- //Return rgb(a) color string
562
- return $output;
563
- }
564
  }
1
+ <?php
2
+
3
+ /**
4
+ * Helper class of SPu for admin
5
+ *
6
+ * @package SocialPopup_Admin
7
+ * @author Damian Logghe <info@timersys.com>
8
+ */
9
+ class Spu_Helper {
10
+ /**
11
+ * Plugin slug
12
+ * @var string
13
+ */
14
+ protected static $plugin_slug = '';
15
+
16
+ /**
17
+ * ajax_render_operator
18
+ *
19
+ * @description creates the HTML for the field group operator metabox. Called from both Ajax and PHP
20
+ * @since 1.4.6
21
+ * I took this functions from the awesome Advanced custom fields plugin http://www.advancedcustomfields.com/
22
+ */
23
+
24
+ public static function ajax_render_operator( $options = array() ) {
25
+ // defaults
26
+ $defaults = array(
27
+ 'group_id' => 0,
28
+ 'rule_id' => 0,
29
+ 'value' => null,
30
+ 'param' => null,
31
+ );
32
+
33
+ $is_ajax = false;
34
+
35
+ if( isset($_POST['nonce']) && wp_verify_nonce($_POST['nonce'], 'spu_nonce') )
36
+ {
37
+ $is_ajax = true;
38
+ }
39
+
40
+ // Is AJAX call?
41
+ if( $is_ajax )
42
+ {
43
+ $options = array_merge($defaults, $_POST);
44
+ $options['name'] = 'spu_rules[' . $options['group_id'] . '][' . $options['rule_id'] . '][operator]';
45
+ }
46
+ else
47
+ {
48
+ $options = array_merge($defaults, $options);
49
+ }
50
+ // default for all rules
51
+ $choices = array(
52
+ '==' => __("is equal to", 'popups' ),
53
+ '!=' => __("is not equal to", 'popups' ),
54
+ );
55
+ if( $options['param'] == 'local_time' ) {
56
+ $choices = array(
57
+ '<' => __("less than", 'popups' ),
58
+ '>' => __("greater than", 'popups' ),
59
+ );
60
+ }
61
+
62
+ if( $options['param'] == 'date' ) {
63
+ $choices = array_merge( $choices,array(
64
+ '<' => __("less than", 'popups' ),
65
+ '>' => __("greater than", 'popups' ),
66
+ ));
67
+ }
68
+
69
+ // allow custom operators
70
+ $choices = apply_filters( 'spu/metaboxes/rule_operators', $choices, $options );
71
+
72
+ self::print_select( $options, $choices );
73
+
74
+ // ajax?
75
+ if( $is_ajax )
76
+ {
77
+ die();
78
+ }
79
+ }
80
+
81
+ /**
82
+ * ajax_render_rules
83
+ *
84
+ * @description creates the HTML for the field group rules metabox. Called from both Ajax and PHP
85
+ * @since 2.0
86
+ * I took this functions from the awesome Advanced custom fields plugin http://www.advancedcustomfields.com/
87
+ */
88
+
89
+ public static function ajax_render_rules( $options = array() )
90
+ {
91
+
92
+ // defaults
93
+ $defaults = array(
94
+ 'group_id' => 0,
95
+ 'rule_id' => 0,
96
+ 'value' => null,
97
+ 'param' => null,
98
+ );
99
+
100
+ $is_ajax = false;
101
+
102
+ if( isset($_POST['nonce']) && wp_verify_nonce($_POST['nonce'], 'spu_nonce') )
103
+ {
104
+ $is_ajax = true;
105
+ }
106
+
107
+ // Is AJAX call?
108
+ if( $is_ajax )
109
+ {
110
+ $options = array_merge($defaults, $_POST);
111
+ $options['name'] = 'spu_rules[' . $options['group_id'] . '][' . $options['rule_id'] . '][value]';
112
+ }
113
+ else
114
+ {
115
+ $options = array_merge($defaults, $options);
116
+ }
117
+
118
+ // vars
119
+ $choices = array();
120
+
121
+
122
+ // some case's have the same outcome
123
+ if($options['param'] == "page_parent")
124
+ {
125
+ $options['param'] = "page";
126
+ }
127
+
128
+
129
+ switch($options['param'])
130
+ {
131
+ case "post_type":
132
+
133
+ // all post types except attachment
134
+ $choices = apply_filters('spu/get_post_types', array(), array('attachment') );
135
+
136
+ break;
137
+
138
+
139
+ case "page":
140
+
141
+ $post_type = 'page';
142
+ $args = array(
143
+ 'posts_per_page' => -1,
144
+ 'post_type' => $post_type,
145
+ 'orderby' => 'menu_order title',
146
+ 'order' => 'ASC',
147
+ 'post_status' => 'any',
148
+ 'suppress_filters' => false,
149
+ 'update_post_meta_cache' => false,
150
+ );
151
+
152
+ $posts = get_posts( apply_filters('spu/rules/page_args', $args ) );
153
+
154
+ if( $posts )
155
+ {
156
+ // sort into hierachial order!
157
+ if( is_post_type_hierarchical( $post_type ) )
158
+ {
159
+ $posts = get_page_children( 0, $posts );
160
+ }
161
+
162
+ foreach( $posts as $page )
163
+ {
164
+ $title = '';
165
+ $ancestors = get_ancestors($page->ID, 'page');
166
+ if($ancestors)
167
+ {
168
+ foreach($ancestors as $a)
169
+ {
170
+ $title .= '- ';
171
+ }
172
+ }
173
+
174
+ $title .= apply_filters( 'the_title', $page->post_title, $page->ID );
175
+
176
+
177
+ // status
178
+ if($page->post_status != "publish")
179
+ {
180
+ $title .= " ($page->post_status)";
181
+ }
182
+
183
+ $choices[ $page->ID ] = $title;
184
+
185
+ }
186
+ // foreach($pages as $page)
187
+
188
+ }
189
+
190
+ break;
191
+
192
+
193
+ case "page_type" :
194
+
195
+ $choices = array(
196
+ 'all_pages' => __("All Pages", 'popups'),
197
+ 'front_page' => __("Front Page", 'popups'),
198
+ 'posts_page' => __("Posts Page", 'popups'),
199
+ 'category_page' => __("Category Page", 'popups'),
200
+ 'search_page' => __("Search Page", 'popups'),
201
+ 'archive_page' => __("Archives Page", 'popups'),
202
+ 'top_level' => __("Top Level Page (parent of 0)", 'popups'),
203
+ 'parent' => __("Parent Page (has children)", 'popups'),
204
+ 'child' => __("Child Page (has parent)", 'popups'),
205
+ );
206
+
207
+ break;
208
+
209
+ case "page_template" :
210
+
211
+ $choices = array(
212
+ 'default' => __("Default Template", 'popups'),
213
+ );
214
+
215
+ $templates = get_page_templates();
216
+ foreach($templates as $k => $v)
217
+ {
218
+ $choices[$v] = $k;
219
+ }
220
+
221
+ break;
222
+
223
+ case "post" :
224
+ $post_types = apply_filters('spu/get_post_types', array());
225
+ unset( $post_types['page'], $post_types['attachment'], $post_types['revision'] , $post_types['nav_menu_item'], $post_types['spucpt'] );
226
+ if( $post_types )
227
+ {
228
+ foreach( $post_types as $post_type )
229
+ {
230
+ $args = array(
231
+ 'numberposts' => '-1',
232
+ 'post_type' => $post_type,
233
+ 'post_status' => array('publish', 'private', 'draft', 'inherit', 'future'),
234
+ 'suppress_filters' => false,
235
+ 'update_post_meta_cache' => false,
236
+ 'update_post_term_cache' => false,
237
+ );
238
+ $posts = get_posts(apply_filters('spu/rules/post_args', $args ));
239
+
240
+ if( $posts)
241
+ {
242
+ $choices[$post_type] = array();
243
+
244
+ foreach($posts as $post)
245
+ {
246
+ $title = apply_filters( 'the_title', $post->post_title, $post->ID );
247
+
248
+ // status
249
+ if($post->post_status != "publish")
250
+ {
251
+ $title .= " ($post->post_status)";
252
+ }
253
+
254
+ $choices[$post_type][$post->ID] = $title;
255
+
256
+ }
257
+ // foreach($posts as $post)
258
+ }
259
+ // if( $posts )
260
+ }
261
+ // foreach( $post_types as $post_type )
262
+ }
263
+ // if( $post_types )
264
+
265
+
266
+ break;
267
+
268
+ case "post_category" :
269
+
270
+ $categories = get_terms('category', array('get' => 'all', 'fields' => 'id=>name' ) );
271
+ $choices = apply_filters('spu/rules/categories', $categories );
272
+
273
+ break;
274
+
275
+ case "post_format" :
276
+
277
+ $choices = get_post_format_strings();
278
+
279
+ break;
280
+
281
+ case "post_status" :
282
+
283
+ $choices = get_post_stati();
284
+
285
+ break;
286
+
287
+ case "user_type" :
288
+
289
+ global $wp_roles;
290
+
291
+ $choices = $wp_roles->get_names();
292
+
293
+ if( is_multisite() )
294
+ {
295
+ $choices['super_admin'] = __('Super Admin');
296
+ }
297
+
298
+ break;
299
+
300
+ case "taxonomy" :
301
+
302
+ $choices = array();
303
+ $simple_value = true;
304
+ $choices = apply_filters('spu/get_taxonomies', $choices, $simple_value);
305
+
306
+ break;
307
+
308
+ case "logged_user" :
309
+ case "mobiles" :
310
+ case "tablets" :
311
+ case "desktop" :
312
+ case "crawlers" :
313
+ case "left_comment" :
314
+ case "search_engine" :
315
+ case "same_site" :
316
+
317
+ $choices = array('true' => __( 'True', 'popups' ) );
318
+
319
+ break;
320
+
321
+
322
+ }
323
+
324
+
325
+ // allow custom rules rules
326
+ $choices = apply_filters( 'spu/rules/rule_values/' . $options['param'], $choices );
327
+
328
+ // Custom fields for rules
329
+ do_action( 'spu/rules/print_' . $options['param'] . '_field', $options, $choices );
330
+
331
+ // ajax?
332
+ if( $is_ajax )
333
+ {
334
+ die();
335
+ }
336
+ }
337
+
338
+ /**
339
+ * Helper function to print select fields for rules
340
+ * @since 2.0
341
+ * @param array $choices options values for select
342
+ * @param array $options array to pass group, id, rule_id etc
343
+ * @return echo the select field
344
+ */
345
+ static function print_select( $options, $choices ) {
346
+
347
+ // value must be array
348
+ if( !is_array($options['value']) )
349
+ {
350
+ // perhaps this is a default value with new lines in it?
351
+ if( strpos($options['value'], "\n") !== false )
352
+ {
353
+ // found multiple lines, explode it
354
+ $options['value'] = explode("\n", $options['value']);
355
+ }
356
+ else
357
+ {
358
+ $options['value'] = array( $options['value'] );
359
+ }
360
+ }
361
+
362
+
363
+ // trim value
364
+ $options['value'] = array_map('trim', $options['value']);
365
+ // determin if choices are grouped (2 levels of array)
366
+ if( is_array($choices) )
367
+ {
368
+ foreach( $choices as $k => $v )
369
+ {
370
+ if( is_array($v) )
371
+ {
372
+ $optgroup = true;
373
+ }
374
+ }
375
+ }
376
+
377
+ echo '<select id="spu_rule_'.$options['group_id'].'_rule_'.$options['rule_id'].'" class="select" name="'.$options['name'].'">';
378
+
379
+ // loop through values and add them as options
380
+ if( is_array($choices) )
381
+ {
382
+ foreach( $choices as $key => $value )
383
+ {
384
+ if( isset($optgroup) )
385
+ {
386
+ // this select is grouped with optgroup
387
+ if($key != '') echo '<optgroup label="'.$key.'">';
388
+
389
+ if( is_array($value) )
390
+ {
391
+ foreach($value as $id => $label)
392
+ {
393
+
394
+ $selected = in_array($id, $options['value']) ? 'selected="selected"' : '';
395
+
396
+ echo '<option value="'.$id.'" '.$selected.'>'.$label.'</option>';
397
+ }
398
+ }
399
+
400
+ if($key != '') echo '</optgroup>';
401
+ }
402
+ else
403
+ {
404
+ $selected = in_array($key, $options['value']) ? 'selected="selected"' : '';
405
+ echo '<option value="'.$key.'" '.$selected.'>'.$value.'</option>';
406
+ }
407
+ }
408
+ }
409
+
410
+
411
+ echo '</select>';
412
+
413
+ }
414
+
415
+ /**
416
+ * Prints a text field rule
417
+ * @param $options
418
+ */
419
+ static function print_textfield( $options ) {
420
+ echo '<input type="text" name="'.$options['name'].'" value="'.$options['value'].'" id="spu_rule_'.$options['group_id'].'_rule_'.$options['rule_id'].'" />';
421
+ }
422
+
423
+ /**
424
+ * Return the box options
425
+ * @param int $id spucpt id
426
+ * @since 2.0
427
+ * @return array metadata values
428
+ */
429
+ function get_box_options( $id )
430
+ {
431
+ $defaults = array(
432
+ 'css' => array(
433
+ 'bgopacity' => '0.5',
434
+ 'overlay_color' => '#000',
435
+ 'background_color' => '#eeeeee',
436
+ 'background_opacity'=> '1',
437
+ 'width' => '600px',
438
+ 'padding' => '25',
439
+ 'color' => '#333',
440
+ 'shadow_color' => '#666',
441
+ 'shadow_type' => 'outset',
442
+ 'shadow_x_offset' => '0',
443
+ 'shadow_y_offset' => '0',
444
+ 'shadow_blur' => '10',
445
+ 'shadow_spread' => '1',
446
+ 'border_color' => '#eee',
447
+ 'border_width' => '8',
448
+ 'border_radius' => '0',
449
+ 'border_type' => 'none',
450
+ 'close_color' => '#666',
451
+ 'close_hover_color' => '#000',
452
+ 'close_size' => '30px',
453
+ 'close_position' => 'top_right',
454
+ 'close_shadow_color'=> '#fff',
455
+ 'position' => 'centered',
456
+ ),
457
+ 'trigger' => 'seconds',
458
+ 'trigger_number' => '5',
459
+ 'animation' => 'fade',
460
+ 'duration-convert-cookie' => '999',
461
+ 'duration-close-cookie' => '30',
462
+ 'name-convert-cookie' => 'spu_conversion',
463
+ 'name-close-cookie' => 'spu_closing',
464
+ 'auto_hide' => 0,
465
+ 'test_mode' => 0,
466
+ 'conversion_close' => '1',
467
+ 'powered_link' => '0',
468
+ );
469
+
470
+ $opts = apply_filters( 'spu/metaboxes/box_options', get_post_meta( $id, 'spu_options', true ), $id );
471
+
472
+ $opts = wp_parse_args( $opts, apply_filters( 'spu/metaboxes/default_options', $defaults ) );
473
+ // we added new rules as we can't merge recursively, so manual check them
474
+ foreach ( $defaults['css'] as $key => $value ) {
475
+ if( ! isset($opts['css'][$key] ) )
476
+ $opts['css'][$key] = $value;
477
+ }
478
+
479
+ return $opts;
480
+ }
481
+
482
+ /**
483
+ * Return the box rules
484
+ * @param int $id spucpt id
485
+ * @since 2.0
486
+ * @return array metadata values
487
+ */
488
+ function get_box_rules( $id )
489
+ {
490
+ $defaults = array(
491
+ // group_0
492
+ array(
493
+
494
+ // rule_0
495
+ array(
496
+ 'param' => 'page_type',
497
+ 'operator' => '==',
498
+ 'value' => 'all_pages',
499
+ 'order_no' => 0,
500
+ 'group_no' => 0
501
+ )
502
+ )
503
+ );
504
+
505
+ $rules = get_post_meta( $id, 'spu_rules', true );
506
+
507
+ if( empty( $rules ) ) {
508
+
509
+ return apply_filters( 'spu/metaboxes/default_rules', $defaults );
510
+
511
+ } else {
512
+
513
+ return $rules;
514
+
515
+ }
516
+
517
+
518
+ }
519
+
520
+ /**
521
+ * Simple HEX TO RGBA converter
522
+ * @param $color
523
+ * @param bool $opacity
524
+ *
525
+ * @return string
526
+ */
527
+ public static function hex2rgba($color, $opacity = false) {
528
+
529
+ $default = 'rgb(0,0,0)';
530
+
531
+ //Return default if no color provided
532
+ if(empty($color))
533
+ return $default;
534
+
535
+ //Sanitize $color if "#" is provided
536
+ if ($color[0] == '#' ) {
537
+ $color = substr( $color, 1 );
538
+ }
539
+
540
+ //Check if color has 6 or 3 characters and get values
541
+ if (strlen($color) == 6) {
542
+ $hex = array( $color[0] . $color[1], $color[2] . $color[3], $color[4] . $color[5] );
543
+ } elseif ( strlen( $color ) == 3 ) {
544
+ $hex = array( $color[0] . $color[0], $color[1] . $color[1], $color[2] . $color[2] );
545
+ } else {
546
+ return $default;
547
+ }
548
+
549
+ //Convert hexadec to rgb
550
+ $rgb = array_map('hexdec', $hex);
551
+
552
+ //Check if opacity is set(rgba or rgb)
553
+ if($opacity){
554
+ if(abs($opacity) > 1)
555
+ $opacity = 1.0;
556
+ $output = 'rgba('.implode(",",$rgb).','.$opacity.')';
557
+ } else {
558
+ $output = 'rgb('.implode(",",$rgb).')';
559
+ }
560
+
561
+ //Return rgb(a) color string
562
+ return $output;
563
+ }
564
  }
includes/updates-msg.html CHANGED
@@ -1,8 +1,8 @@
1
- <div class="warning">
2
- <p><strong>Warning:</strong></p>
3
- <p>Popups v1.0.0 it's a totally new version of the plugin. Previous version are deprecated as the plugin was totally recoded from scracth. Please save your popups if you have custom text on them because the <strong>will be lost after update</strong></p>
4
- </div>
5
- <div class="error">
6
- <p><strong>Warning:</strong></p>
7
- <p>Popups v1.0.0 it's a totally new version of the plugin. Previous version are deprecated as the plugin was totally recoded from scracth. Please save your popups if you have custom text on them because the <strong>will be lost after update</strong></p>
8
  </div>
1
+ <div class="warning">
2
+ <p><strong>Warning:</strong></p>
3
+ <p>Popups v1.0.0 it's a totally new version of the plugin. Previous version are deprecated as the plugin was totally recoded from scracth. Please save your popups if you have custom text on them because the <strong>will be lost after update</strong></p>
4
+ </div>
5
+ <div class="error">
6
+ <p><strong>Warning:</strong></p>
7
+ <p>Popups v1.0.0 it's a totally new version of the plugin. Previous version are deprecated as the plugin was totally recoded from scracth. Please save your popups if you have custom text on them because the <strong>will be lost after update</strong></p>
8
  </div>
languages/popups-de_DE.po CHANGED
@@ -1,870 +1,870 @@
1
- # Copyright (C) 2013 TODO
2
- # This file is distributed under the same license as the TODO package.
3
- msgid ""
4
- msgstr ""
5
- "Project-Id-Version: Popups\n"
6
- "Report-Msgid-Bugs-To: http://wordpress.org/plugins/plugin-name\n"
7
- "POT-Creation-Date: 2016-02-04 13:02+0100\n"
8
- "PO-Revision-Date: 2018-01-22 16:35+0000\n"
9
- "Language-Team: Timersys <info@timersys.com>\n"
10
- "MIME-Version: 1.0\n"
11
- "Content-Type: text/plain; charset=UTF-8\n"
12
- "Content-Transfer-Encoding: 8bit\n"
13
- "X-Generator: Poedit 2.0.6\n"
14
- "X-Poedit-KeywordsList: __;_e;_n;_x;esc_html_e;esc_html__;esc_attr_e;"
15
- "esc_attr__;_ex:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2;_x:1,2c;_n:1,2\n"
16
- "X-Poedit-Basepath: ..\n"
17
- "Plural-Forms: nplurals=2; plural=(n != 1);\n"
18
- "Last-Translator: \n"
19
- "Language: de_DE@formal\n"
20
- "X-Poedit-SearchPath-0: .\n"
21
-
22
- #: admin/class-social-popup-admin.php:159
23
- msgctxt "post type singular name"
24
- msgid "Popups"
25
- msgstr "PopUps"
26
-
27
- #: admin/class-social-popup-admin.php:160
28
- msgctxt "admin menu"
29
- msgid "Popups"
30
- msgstr "PopUps"
31
-
32
- #: admin/class-social-popup-admin.php:161
33
- msgctxt "add new on admin bar"
34
- msgid "Popups"
35
- msgstr "PopUps"
36
-
37
- #: admin/class-social-popup-admin.php:162
38
- msgctxt "Popups"
39
- msgid "Add New"
40
- msgstr "Neues hinzufügen"
41
-
42
- #: admin/class-social-popup-admin.php:163
43
- msgid "Add New Popups"
44
- msgstr "Neue Popups hinzufügen"
45
-
46
- #: admin/class-social-popup-admin.php:164
47
- msgid "New Popups"
48
- msgstr "Neue Popups"
49
-
50
- #: admin/class-social-popup-admin.php:165
51
- msgid "Edit Popups"
52
- msgstr "Popups bearbeiten"
53
-
54
- #: admin/class-social-popup-admin.php:166
55
- msgid "View Popups"
56
- msgstr "Popups anzeigen"
57
-
58
- #: admin/class-social-popup-admin.php:167
59
- msgid "All Popups"
60
- msgstr "Alle Popups"
61
-
62
- #: admin/class-social-popup-admin.php:168
63
- msgid "Search Popups"
64
- msgstr "Suche Popups"
65
-
66
- #: admin/class-social-popup-admin.php:169
67
- msgid "Parent Popups:"
68
- msgstr "Übergeordnete Popups:"
69
-
70
- #: admin/class-social-popup-admin.php:170
71
- msgid "No Popups found."
72
- msgstr "Keine Popups gefunden."
73
-
74
- #: admin/class-social-popup-admin.php:171
75
- msgid "No Popups found in Trash."
76
- msgstr "Keine Popups im Papierkorb gefunden."
77
-
78
- #: admin/class-social-popup-admin.php:212
79
- msgid "Settings"
80
- msgstr "Einstellungen"
81
-
82
- #: admin/class-social-popup-admin.php:260
83
- msgid "Popups Premium"
84
- msgstr "Popups Premium"
85
-
86
- #: admin/class-social-popup-admin.php:271
87
- msgid "PopUp Shortcodes"
88
- msgstr "PopUp Shortcodes"
89
-
90
- #: admin/class-social-popup-admin.php:280
91
- msgid "PopUp Appearance"
92
- msgstr "Popup Stil"
93
-
94
- #: admin/class-social-popup-admin.php:289
95
- msgid "PopUp Display Rules"
96
- msgstr "Popup-Anzeigeregeln"
97
-
98
- #: admin/class-social-popup-admin.php:298
99
- msgid "Display Options"
100
- msgstr "Anzeige-Optionen"
101
-
102
- #: admin/class-social-popup-admin.php:307
103
- msgid "Need support?"
104
- msgstr "Unterstützung benötigt?"
105
-
106
- #: admin/class-social-popup-admin.php:315
107
- msgid "Donate & support"
108
- msgstr "Spenden & unterstützen"
109
-
110
- #: admin/class-social-popup-admin.php:323
111
- msgid "About the developer"
112
- msgstr "Über den Hersteller"
113
-
114
- #: admin/class-social-popup-admin.php:589
115
- #: admin/views/metaboxes/metabox-rules.php:33
116
- #: admin/views/metaboxes/metabox-rules.php:106
117
- msgid "or"
118
- msgstr "oder"
119
-
120
- #: admin/class-social-popup-admin.php:616
121
- msgid "Add a Popup"
122
- msgstr "Ein PopUp zufügen"
123
-
124
- #: admin/class-social-popup-admin.php:740
125
- msgid "User"
126
- msgstr "Benutzer"
127
-
128
- #: admin/class-social-popup-admin.php:741
129
- msgid "User role"
130
- msgstr "Benutzer Rolle"
131
-
132
- #: admin/class-social-popup-admin.php:742
133
- msgid "User is logged"
134
- msgstr "Benutzer ist angemeldet"
135
-
136
- #: admin/class-social-popup-admin.php:743
137
- msgid "User never left a comment"
138
- msgstr "Benutzer hat nie einen Kommentar verfasst"
139
-
140
- #: admin/class-social-popup-admin.php:744
141
- msgid "User came via a search engine"
142
- msgstr "Benutzer kam über eine Suchmaschine"
143
-
144
- #: admin/class-social-popup-admin.php:745
145
- msgid "User did not arrive via another page on your site"
146
- msgstr "Benutzer kam nicht über eine andere Seite Ihrer Webseite"
147
-
148
- #: admin/class-social-popup-admin.php:747
149
- #: admin/class-social-popup-admin.php:748
150
- msgid "Post"
151
- msgstr "Beitrag"
152
-
153
- #: admin/class-social-popup-admin.php:749
154
- msgid "Post ID"
155
- msgstr "Beitrags ID"
156
-
157
- #: admin/class-social-popup-admin.php:750
158
- msgid "Post Type"
159
- msgstr "Beitragstyp"
160
-
161
- #: admin/class-social-popup-admin.php:751
162
- msgid "Post Category"
163
- msgstr "Beitragskategorie"
164
-
165
- #: admin/class-social-popup-admin.php:752
166
- msgid "Post Format"
167
- msgstr "Beitragsformat"
168
-
169
- #: admin/class-social-popup-admin.php:753
170
- msgid "Post Status"
171
- msgstr "Veröffentlichungsstatus"
172
-
173
- #: admin/class-social-popup-admin.php:754
174
- msgid "Post Taxonomy"
175
- msgstr "Beitragsklassifizierung"
176
-
177
- #: admin/class-social-popup-admin.php:756
178
- #: admin/class-social-popup-admin.php:757
179
- msgid "Page"
180
- msgstr "Seite"
181
-
182
- #: admin/class-social-popup-admin.php:758
183
- msgid "Page Type"
184
- msgstr "Seitentyp"
185
-
186
- #: admin/class-social-popup-admin.php:759
187
- msgid "Page Parent"
188
- msgstr "Übergeordnete Seite"
189
-
190
- #: admin/class-social-popup-admin.php:760
191
- msgid "Page Template"
192
- msgstr "Seitentemplate"
193
-
194
- #: admin/class-social-popup-admin.php:762
195
- msgid "Other"
196
- msgstr "Sonstiges"
197
-
198
- #: admin/class-social-popup-admin.php:763
199
- msgid "Referrer"
200
- msgstr "Empfehler"
201
-
202
- #: admin/class-social-popup-admin.php:764
203
- msgid "Mobile Phone"
204
- msgstr "Mobil Nummer"
205
-
206
- #: admin/class-social-popup-admin.php:765
207
- msgid "Tablet"
208
- msgstr "Tablet"
209
-
210
- #: admin/class-social-popup-admin.php:813
211
- msgid "ID"
212
- msgstr "ID"
213
-
214
- #: admin/includes/class-spu-notices.php:30
215
- #, php-format
216
- msgid ""
217
- "We noticed that you have been using our plugin for a while and we would like "
218
- "to ask you a little favour. If you are happy with it and can take a minute "
219
- "please <a href=\"%s\" target=\"_blank\">leave a nice review</a> on "
220
- "WordPress. It will be a tremendous help for us!"
221
- msgstr ""
222
- "Wir haben festgestellt, dass Sie unser Plugin bereits für eine Weile "
223
- "verwendet haben und möchten Sie um einen Gefallen bitten. Wenn Sie mit "
224
- "unserem Plugin zufrieden sind, nehmen Sie sich bitte eine Minute Zeit und <a "
225
- "href=\"%s\" target=\"_blank\">hinterlassen eine positive Rezension</a> auf "
226
- "WordPress. Es wird für uns eine große Hilfe sein!"
227
-
228
- #: admin/includes/class-spu-notices.php:32
229
- #, php-format
230
- msgid "<a href=\"%s\" target=\"_blank\">Leave a nice review</a>"
231
- msgstr "<a href=\"%s\" target=\"_blank\">Eine positive Rezension verfassen</a>"
232
-
233
- #: admin/includes/class-spu-notices.php:33
234
- #, php-format
235
- msgid "<a href=\"%s\">No, thanks</a>"
236
- msgstr "<a href=\"%s\">Nein Danke!</a>"
237
-
238
- #: admin/views/metaboxes/metabox-appearance.php:10
239
- msgid "Background opacity"
240
- msgstr "Hintergrund Transparenz"
241
-
242
- #: admin/views/metaboxes/metabox-appearance.php:12
243
- msgid "Leave at 0 for no background. Max value is 1"
244
- msgstr "0 für keinen Hintergrund. Max ist 1"
245
-
246
- #: admin/views/metaboxes/metabox-appearance.php:18
247
- msgid "Background color"
248
- msgstr "Hintergrundfarbe"
249
-
250
- #: admin/views/metaboxes/metabox-appearance.php:22
251
- msgid "Text color"
252
- msgstr "Text Farbe"
253
-
254
- #: admin/views/metaboxes/metabox-appearance.php:26
255
- msgid "Box width"
256
- msgstr "Breite des Inhalts-Blocks"
257
-
258
- #: admin/views/metaboxes/metabox-appearance.php:32
259
- msgid "Border color"
260
- msgstr "Rahmenfarbe"
261
-
262
- #: admin/views/metaboxes/metabox-appearance.php:36
263
- msgid "Border width"
264
- msgstr "Rahmenbreite"
265
-
266
- #: admin/views/metaboxes/metabox-donate.php:6
267
- msgid "If you like this plugin, consider supporting it by donating."
268
- msgstr ""
269
- "Wenn Ihnen dieses Plugin gefällt, unterstützen Sie es mit einer Spende."
270
-
271
- #: admin/views/metaboxes/metabox-donate.php:8
272
- msgid "Donate with PayPal"
273
- msgstr "Mit PayPal spenden"
274
-
275
- #: admin/views/metaboxes/metabox-donate.php:10
276
- msgid "Some other ways to support this plugin"
277
- msgstr "Einige andere Möglichkeiten, dieses Plugin zu unterstützen"
278
-
279
- #: admin/views/metaboxes/metabox-donate.php:12
280
- msgid "Leave a &#9733;&#9733;&#9733;&#9733;&#9733; review on WordPress.org"
281
- msgstr ""
282
- "Hinterlassen Sie eine &#9733;&#9733;&#9733;&#9733;&#9733; Bewertung auf "
283
- "WordPress.org"
284
-
285
- #: admin/views/metaboxes/metabox-donate.php:13
286
- msgid "Write about Popups on your blog"
287
- msgstr "Über Popups in Ihrem Blog schreiben"
288
-
289
- #: admin/views/metaboxes/metabox-donate.php:14
290
- msgid "Tweet about Popups"
291
- msgstr "Tweet über Popups"
292
-
293
- #: admin/views/metaboxes/metabox-donate.php:15
294
- msgid "Vote \"works\" on the WordPress.org plugin page"
295
- msgstr ""
296
- "Stimmen Sie mit &quot;funktioniert&quot; auf der WordPress.org Plugin Seite"
297
-
298
- #: admin/views/metaboxes/metabox-help.php:6
299
- msgid ""
300
- "You have some social shortcodes to use that will print a Facebook like, a "
301
- "Google+ Follow and a Twitter follow. Check the available options and "
302
- "<strong>configure them with your social accounts</strong>:"
303
- msgstr ""
304
- "Sie haben einige Shortcodes zur Verfügung, die: Facebook like, Google + "
305
- "folgen und ein Twitter folgen auf der Seite anzeigen können. Überprüfen Sie "
306
- "die verfügbaren Optionen um <strong>sie mit Ihren sozialen Netzwerkkonten zu "
307
- "konfigurieren</strong>:"
308
-
309
- #: admin/views/metaboxes/metabox-help.php:8
310
- msgid "Facebook Page"
311
- msgstr "Facebook-Seite"
312
-
313
- #: admin/views/metaboxes/metabox-help.php:12
314
- msgid "View Facebook Page Options"
315
- msgstr "Zeige Facebook-Seitenoptionen"
316
-
317
- #: admin/views/metaboxes/metabox-help.php:14
318
- #: admin/views/metaboxes/metabox-help.php:27
319
- msgid "Your Facebook page url"
320
- msgstr "Ihre Facebook-URL"
321
-
322
- #: admin/views/metaboxes/metabox-help.php:15
323
- msgid "Your page name"
324
- msgstr "Ihr Seitenname"
325
-
326
- #: admin/views/metaboxes/metabox-help.php:16
327
- msgid "true|false <b>Default value:</b> true"
328
- msgstr "richtig|falsch <b>Standart-Einstellung</b> richtig"
329
-
330
- #: admin/views/metaboxes/metabox-help.php:17
331
- msgid "true|false <b>Default value:</b> false"
332
- msgstr "richtig|falsch <b>Standart-Einstellung</b> falsch"
333
-
334
- #: admin/views/metaboxes/metabox-help.php:18
335
- msgid "number <b>Default value:</b> 500"
336
- msgstr "Anzahl <b>Standart-Wert:</b> 500"
337
-
338
- #: admin/views/metaboxes/metabox-help.php:21
339
- msgid "Facebook Button"
340
- msgstr "Facebook Taste"
341
-
342
- #: admin/views/metaboxes/metabox-help.php:25
343
- msgid "View Facebook Options"
344
- msgstr "Zeige Facebook-Optionen"
345
-
346
- #: admin/views/metaboxes/metabox-help.php:28
347
- msgid "standard, box_count, button <b>Default value:</b> button_count"
348
- msgstr "standart, box_drücke, taste <b>Standard Wert:</b> tasten_drücke"
349
-
350
- #: admin/views/metaboxes/metabox-help.php:29
351
- #: admin/views/metaboxes/metabox-help.php:30
352
- msgid "true <b>Default value:</b> false"
353
- msgstr "richtig <b>Standart-Einstellung</b> falsch"
354
-
355
- #: admin/views/metaboxes/metabox-help.php:31
356
- msgid "recommend <b>Default value:</b> like"
357
- msgstr "empfohlen <b>Default-Wert:</b> like"
358
-
359
- #: admin/views/metaboxes/metabox-help.php:32
360
- msgid "number <b>Default value:</b>"
361
- msgstr "Anzahl <b>Standart-Wert:</b>"
362
-
363
- #: admin/views/metaboxes/metabox-help.php:34
364
- msgid "Google+ Button"
365
- msgstr "Google+Taste"
366
-
367
- #: admin/views/metaboxes/metabox-help.php:38
368
- msgid "View Google+ Options"
369
- msgstr "Zeige Google +-Optionen"
370
-
371
- #: admin/views/metaboxes/metabox-help.php:40
372
- msgid "Your Google+ url"
373
- msgstr "Geben Sie Ihren Google+-Link an."
374
-
375
- #: admin/views/metaboxes/metabox-help.php:41
376
- msgid "small, standard, tall <b>Default value:</b> medium"
377
- msgstr "klein, standart, groß <b>Standart-Wert:</b> medium"
378
-
379
- #: admin/views/metaboxes/metabox-help.php:42
380
- msgid "inline, none <b>Default value:</b> bubble"
381
- msgstr "inline, none <b>Standartt-Wert:</b> bubble"
382
-
383
- #: admin/views/metaboxes/metabox-help.php:44
384
- msgid "Twitter Button"
385
- msgstr "Twitter Taste"
386
-
387
- #: admin/views/metaboxes/metabox-help.php:48
388
- msgid "View Twitter Options"
389
- msgstr "Zeige Twitter Optionen"
390
-
391
- #: admin/views/metaboxes/metabox-help.php:50
392
- msgid "Your Twitter user <b>Default chifliiiii</b>"
393
- msgstr "Ihr Twitter Benutzername <b>Standard-chifliiiii</b>"
394
-
395
- #: admin/views/metaboxes/metabox-help.php:51
396
- msgid "false <b>Default value:</b> true"
397
- msgstr "falsch <b>Standart-Einstellung</b> richtig"
398
-
399
- #: admin/views/metaboxes/metabox-help.php:52
400
- msgid "large <b>Default value:</b> \"\""
401
- msgstr "groß <b>Standart-Wert:</b> \"\""
402
-
403
- #: admin/views/metaboxes/metabox-help.php:55
404
- msgid "Other available Shortcodes:"
405
- msgstr "Weitere Shortcodes:"
406
-
407
- #: admin/views/metaboxes/metabox-help.php:56
408
- msgid "Close Button"
409
- msgstr "Schließen-Schaltfläche"
410
-
411
- #: admin/views/metaboxes/metabox-help.php:60
412
- msgid "View Close shortcode Options"
413
- msgstr "Zeige Shortcodes-Optionen zu: Schließen"
414
-
415
- #: admin/views/metaboxes/metabox-help.php:62
416
- msgid "Pass a custom class to style your button"
417
- msgstr ""
418
- "Bestimmen Sie eine benutzerdefinierte CSS-Klasse, zu Ihrer Schaltfläche"
419
-
420
- #: admin/views/metaboxes/metabox-help.php:63
421
- msgid "Button label - <b>Default value:</b> Close"
422
- msgstr "Schaltflächentext - <b>Default-Wert:</b> Schließen"
423
-
424
- #: admin/views/metaboxes/metabox-help.php:64
425
- msgid "left, right, center, none - <b>Default value:</b> center"
426
- msgstr "links, rechts, mittig, ohne - <b>Default-Wert:</b> mittig"
427
-
428
- #: admin/views/metaboxes/metabox-links.php:6
429
- msgid "My name is"
430
- msgstr "Mein Name ist"
431
-
432
- #: admin/views/metaboxes/metabox-links.php:6
433
- msgid "I develop WordPress plugins and themes."
434
- msgstr "Ich entwickle WordPress Plugins und Themes."
435
-
436
- #: admin/views/metaboxes/metabox-links.php:7
437
- #, php-format
438
- msgid ""
439
- "Take a look at my <a href=\"%s\">site</a> to see my other plugins or hire "
440
- "me. Subscribe to get updates!"
441
- msgstr ""
442
- "Werfen Sie einen Blick auf meine <a href=\"%s\">Website</a>, um andere "
443
- "Plugins von mir zu sehen oder mir direkt einen Kundenauftrag zu erteilen. "
444
- "Abonnieren Sie meine Newsletter für Updates!"
445
-
446
- #: admin/views/metaboxes/metabox-links.php:8
447
- msgid "Other plugins I built:"
448
- msgstr "Andere Plugins von mir:"
449
-
450
- #: admin/views/metaboxes/metabox-links.php:10
451
- msgid "Install multiple plugins and create collections"
452
- msgstr "Mehrere Plugins installieren und Sammlungen erstellen"
453
-
454
- #: admin/views/metaboxes/metabox-links.php:11
455
- msgid "Geotarget your content"
456
- msgstr "Geotarget Ihrer Inhalte"
457
-
458
- #: admin/views/metaboxes/metabox-links.php:12
459
- msgid "Invite your network friends and import contacts"
460
- msgstr "Lade Freunde ein und importiere Kontakte"
461
-
462
- #: admin/views/metaboxes/metabox-options.php:9
463
- msgid "Box Position"
464
- msgstr "Position der Box"
465
-
466
- #: admin/views/metaboxes/metabox-options.php:12
467
- msgid "Centered"
468
- msgstr "Zentriert"
469
-
470
- #: admin/views/metaboxes/metabox-options.php:13
471
- msgid "Top Left"
472
- msgstr "Oben links"
473
-
474
- #: admin/views/metaboxes/metabox-options.php:14
475
- msgid "Top Right"
476
- msgstr "Oben rechts"
477
-
478
- #: admin/views/metaboxes/metabox-options.php:15
479
- msgid "Bottom Left"
480
- msgstr "Unten links"
481
-
482
- #: admin/views/metaboxes/metabox-options.php:16
483
- msgid "Bottom Right"
484
- msgstr "Unten rechts"
485
-
486
- #: admin/views/metaboxes/metabox-options.php:23
487
- msgid "Trigger action"
488
- msgstr "Auslöseaktion"
489
-
490
- #: admin/views/metaboxes/metabox-options.php:27
491
- msgid "seconds after page load"
492
- msgstr "Sekunden nach dem Laden der Seite"
493
-
494
- #: admin/views/metaboxes/metabox-options.php:28
495
- msgid "of page height"
496
- msgstr "der Seitenhöhe"
497
-
498
- #: admin/views/metaboxes/metabox-options.php:38
499
- msgid "Auto-hide?"
500
- msgstr "Automatisch ausblenden?"
501
-
502
- #: admin/views/metaboxes/metabox-options.php:40
503
- #: admin/views/metaboxes/metabox-options.php:68
504
- #: admin/views/metaboxes/metabox-options.php:76
505
- #: admin/views/metaboxes/metabox-options.php:84
506
- msgid "Yes"
507
- msgstr "Ja"
508
-
509
- #: admin/views/metaboxes/metabox-options.php:41
510
- #: admin/views/metaboxes/metabox-options.php:69
511
- #: admin/views/metaboxes/metabox-options.php:77
512
- #: admin/views/metaboxes/metabox-options.php:85
513
- msgid "No"
514
- msgstr "Nein"
515
-
516
- #: admin/views/metaboxes/metabox-options.php:42
517
- msgid "Hide box again when visitors scroll back up?"
518
- msgstr ""
519
- "Soll die Box wieder versteckt werden, wenn Besucher zurück nach oben "
520
- "scrollen?"
521
-
522
- #: admin/views/metaboxes/metabox-options.php:46
523
- msgid "Animation"
524
- msgstr "Animieren"
525
-
526
- #: admin/views/metaboxes/metabox-options.php:49
527
- msgid "Fade In"
528
- msgstr "Einblenden"
529
-
530
- #: admin/views/metaboxes/metabox-options.php:50
531
- msgid "Slide In"
532
- msgstr "Seitlich einfahren"
533
-
534
- #: admin/views/metaboxes/metabox-options.php:53
535
- msgid "Slide will only apply when popup is on the corners"
536
- msgstr "Seitliches Einfahren nur: wenn das Popup in den Ecken platziert ist"
537
-
538
- #: admin/views/metaboxes/metabox-options.php:58
539
- msgid "Cookie expiration days"
540
- msgstr "Cookie läuft aus in Tagen"
541
-
542
- #: admin/views/metaboxes/metabox-options.php:61
543
- msgid "After closing the box, how many days should it stay hidden?"
544
- msgstr "Wie viele Tage sollte das Popup nach Schließen nicht angezeigt werden?"
545
-
546
- #: admin/views/metaboxes/metabox-options.php:66
547
- msgid "Enable test mode?"
548
- msgstr "Testmodus aktivieren?"
549
-
550
- #: admin/views/metaboxes/metabox-options.php:70
551
- msgid ""
552
- "If test mode is enabled, the box will show up regardless of whether a cookie "
553
- "has been set. (To admins only)"
554
- msgstr ""
555
- "Wenn Test-Modus aktiviert ist, wird das Popup angezeigt. Unabhängig davon, "
556
- "ob ein Cookie festgelegt wurde. (Nur für Admins)"
557
-
558
- #: admin/views/metaboxes/metabox-options.php:74
559
- msgid "Close on conversion?"
560
- msgstr "Schließen nach Konvertierung?"
561
-
562
- #: admin/views/metaboxes/metabox-options.php:78
563
- msgid ""
564
- "If you have a form or social shortcode, by default popup will close on "
565
- "submission/conversion"
566
- msgstr ""
567
- "Wenn Sie ein Formular oder ein Shortcode für soziale Netzwerkehaben, wird "
568
- "standardmäßig das Popup nach Anmeldung/Konversion geschlossen"
569
-
570
- #: admin/views/metaboxes/metabox-options.php:82
571
- msgid "Show powered by link?"
572
- msgstr "Mit Unterstützung von Link anzeigen?"
573
-
574
- #: admin/views/metaboxes/metabox-options.php:86
575
- #, php-format
576
- msgid ""
577
- "Shows a \"powered by\" link below your popup. If your affiliate link is set "
578
- "in the <a href=\"%s\">settings</a>, it will be used."
579
- msgstr ""
580
- "Zeigt einen \"powered by\" Link unten in Ihrem Popup. Wenn Ihr Affiliate-"
581
- "Link in den <a href=\"%s\">Einstellungen</a> festgelegt ist, wird dieser "
582
- "verwendet."
583
-
584
- #: admin/views/metaboxes/metabox-premium.php:16
585
- msgid ""
586
- "Take the best WordPress Popups plugin to the next level with Popups Premium "
587
- "extension."
588
- msgstr ""
589
- "Bringen Sie das beste WordPress Popups-Plugin auf den nächsten Level mit der "
590
- "Popups Premium-Erweiterung."
591
-
592
- #: admin/views/metaboxes/metabox-premium.php:17
593
- msgid "Popups Premium Features:"
594
- msgstr "Popups Premium Features:"
595
-
596
- #: admin/views/metaboxes/metabox-premium.php:19
597
- msgid "Beautiful optin forms for popular mail providers"
598
- msgstr "Schöne Opt-In Formulare für die bekanntesten E-Mail-Anbieter"
599
-
600
- #: admin/views/metaboxes/metabox-premium.php:20
601
- msgid "Currently supporting MailChimp, Aweber, Postmatic, Mailpoet"
602
- msgstr "Aktuell unterstützt: MailChimp, Aweber, Postmatic, Mailpoet"
603
-
604
- #: admin/views/metaboxes/metabox-premium.php:21
605
- msgid ""
606
- "Track impressions and Conversions of social likes and forms submissions like "
607
- "Contact Form 7, Gravity forms, etc"
608
- msgstr ""
609
- "Verfolge Impressionen und Konversionen von sozialen Likes und "
610
- "Formularübermittlungen wie: Contact Form 7, Gravity forms, etc."
611
-
612
- #: admin/views/metaboxes/metabox-premium.php:22
613
- msgid "Track impressions and Conversions also in Google Analytics"
614
- msgstr "Verfolge Impressionen und Conversions auch in Google Analytics"
615
-
616
- #: admin/views/metaboxes/metabox-premium.php:23
617
- #: admin/views/metaboxes/metabox-premium.php:25
618
- msgid "Exit Intent technology"
619
- msgstr "\"Beim Verlassen der Seite\" Technologie"
620
-
621
- #: admin/views/metaboxes/metabox-premium.php:24
622
- msgid "8 New animations effects"
623
- msgstr "8 neue Animationen"
624
-
625
- #: admin/views/metaboxes/metabox-premium.php:26
626
- msgid "New trigger methods"
627
- msgstr "Neue Trigger-Methoden"
628
-
629
- #: admin/views/metaboxes/metabox-premium.php:27
630
- msgid "Timer for auto closing"
631
- msgstr "Timer für automatische Schließung"
632
-
633
- #: admin/views/metaboxes/metabox-premium.php:28
634
- msgid "Ability to disable close button"
635
- msgstr "Möglichkeit zum Deaktivieren der Schaltfläche \"schließen\""
636
-
637
- #: admin/views/metaboxes/metabox-premium.php:29
638
- msgid ""
639
- "Ability to disable Advanced close methods like esc or clicking outside of "
640
- "the popup"
641
- msgstr ""
642
- "Möglichkeit, fortschrittliche \"Schließen\" Methoden wie ESC oder Klicken "
643
- "außerhalb des Popups zu deaktivieren"
644
-
645
- #: admin/views/metaboxes/metabox-premium.php:30
646
- msgid "Premium support"
647
- msgstr "Premium-Support"
648
-
649
- #: admin/views/metaboxes/metabox-premium.php:34
650
- msgid "Buy Now!"
651
- msgstr "Sofort Kaufen!"
652
-
653
- #: admin/views/metaboxes/metabox-rules.php:19
654
- msgid "Rules"
655
- msgstr "Regeln"
656
-
657
- #: admin/views/metaboxes/metabox-rules.php:20
658
- msgid "Create a set of rules to determine where the popup will show"
659
- msgstr ""
660
- "Erstellen Sie einen Satz von Regeln, um festzustellen, wo das Popup "
661
- "angezeigt wird"
662
-
663
- #: admin/views/metaboxes/metabox-rules.php:31
664
- msgid "Show this popup if"
665
- msgstr "Zeigen Sie dieses Popup wenn"
666
-
667
- #: admin/views/metaboxes/metabox-rules.php:61
668
- msgid "is equal to"
669
- msgstr "ist gleich"
670
-
671
- #: admin/views/metaboxes/metabox-rules.php:62
672
- msgid "is not equal to"
673
- msgstr "ist nicht gleich"
674
-
675
- #: admin/views/metaboxes/metabox-rules.php:93
676
- msgid "and"
677
- msgstr "und"
678
-
679
- #: admin/views/metaboxes/metabox-rules.php:108
680
- msgid "Add rule group"
681
- msgstr "Regelgruppe hinzufügen"
682
-
683
- #: admin/views/metaboxes/metabox-support.php:6
684
- #, php-format
685
- msgid "You are using Popups plugin v%s"
686
- msgstr "Sie verwenden Popups Plugin v%s"
687
-
688
- #: admin/views/metaboxes/metabox-support.php:7
689
- #, php-format
690
- msgid ""
691
- "If you need support please go to the WordPress.org <a href=\"%s\">support "
692
- "forums</a>"
693
- msgstr ""
694
- "Wenn Sie Unterstützung benötigen, gehen Sie bitte auf WordPress.org <a href="
695
- "\"%s\">Support-Foren</a>"
696
-
697
- #: admin/views/settings-page.php:17
698
- msgid "Affiliate link"
699
- msgstr "Affiliate Link"
700
-
701
- #: admin/views/settings-page.php:20
702
- #, php-format
703
- msgid ""
704
- "You can earn money by promoting the plugin! Join <a href=\"%s\">our "
705
- "affiliate program</a> and paste your affiliate link here to earn 35&#37; in "
706
- "commissions . Once entered, it will replace the default \"Powered by\" on "
707
- "the popups."
708
- msgstr ""
709
- "Sie können Geld verdienen durch Promotion des Plugin! Treten Sie <a href=\"%s"
710
- "\">unserem Affiliate-Programm</a> bei und fügen Sie Ihren Affiliate-Link "
711
- "hier ein, um 35&#37; an Provisionen zu verdienen. Einmal eingegeben, und der "
712
- "Standardwert \"Powered by\" wird mit Ihrem Link in den Popups ersetzt."
713
-
714
- #: admin/views/settings-page.php:24
715
- msgid "Ajax mode?"
716
- msgstr "Ajax-Modus?"
717
-
718
- #: admin/views/settings-page.php:27
719
- msgid ""
720
- "Load popups using ajax. Compatible with cache plugins, but might not work "
721
- "with all plugins"
722
- msgstr ""
723
- "Laden Sie Popups mit Ajax. Kompatibel mit Cache-Plugins, aber funktioniert "
724
- "möglicherweise nicht mit allen Plugins"
725
-
726
- #: admin/views/settings-page.php:32
727
- msgid "Enable Debug mode?"
728
- msgstr "Fehlersuche aktivieren?"
729
-
730
- #: admin/views/settings-page.php:35
731
- msgid "Will use uncompressed js"
732
- msgstr "Unkomprimierte Js verwenden"
733
-
734
- #: admin/views/settings-page.php:40
735
- msgid "Enable safe mode?"
736
- msgstr "Aktivieren abgesicherter Modus?"
737
-
738
- #: admin/views/settings-page.php:43
739
- msgid "Will move all popups to top of the screen."
740
- msgstr "Alle Popups wird zum oberen Rand des Bildschirms verschoben werden."
741
-
742
- #: admin/views/settings-page.php:48
743
- msgid "Remove shortcodes style"
744
- msgstr "Shortcodes Stil entfernen"
745
-
746
- #: admin/views/settings-page.php:51
747
- msgid ""
748
- "By default the plugin will apply some style to shortcodes. Check here if you "
749
- "want to manually style them"
750
- msgstr ""
751
- "Standardmäßig wird das Plugin eigene Stil-Shortcodes zuweisen. Aktivieren, "
752
- "wenn Sie Stile manuell erzeugen wollen"
753
-
754
- #: admin/views/settings-page.php:56
755
- msgid "Unload Facebook javascript"
756
- msgstr "Facebook Javascript nicht laden"
757
-
758
- #: admin/views/settings-page.php:59
759
- msgid "If you use your own Facebook script, check this"
760
- msgstr ""
761
- "Wenn Sie Ihr eigenes Facebook-Skript verwenden, aktivieren Sie dies hier"
762
-
763
- #: admin/views/settings-page.php:64
764
- msgid "Unload Google javascript"
765
- msgstr "Google Javascript nicht laden"
766
-
767
- #: admin/views/settings-page.php:67
768
- msgid "If you use your own Google script, check this"
769
- msgstr "Wenn Sie Ihre eigenes Google-Skript verwenden, aktivieren Sie dies"
770
-
771
- #: admin/views/settings-page.php:72
772
- msgid "Unload Twitter javascript"
773
- msgstr "Twitter-Javascript nicht laden"
774
-
775
- #: admin/views/settings-page.php:75
776
- msgid "If you use your own Twitter script, check this"
777
- msgstr ""
778
- "Wenn Sie Ihr eigenes Twitter-Skript verwenden, aktivieren Sie dies hier"
779
-
780
- #: admin/views/settings-page.php:82
781
- msgid "Delete all data on Uninstall"
782
- msgstr "Alle Daten bei der Deinstallation löschen"
783
-
784
- #: admin/views/settings-page.php:85
785
- msgid ""
786
- "When you uninstall the plugin all popups, settings and stats will be deleted "
787
- "from your db"
788
- msgstr ""
789
- "Wenn Sie das Plugin deinstallieren werden alle Popups, Einstellungen und "
790
- "Statistiken aus der Datenbank gelöscht"
791
-
792
- #: admin/views/settings-page.php:89
793
- msgid "Save settings"
794
- msgstr "Einstellungen speichern"
795
-
796
- #: includes/class-spu-helper.php:131
797
- msgid "All Pages"
798
- msgstr "Alle Seiten"
799
-
800
- #: includes/class-spu-helper.php:132
801
- msgid "Front Page"
802
- msgstr "Startseite"
803
-
804
- #: includes/class-spu-helper.php:133
805
- msgid "Posts Page"
806
- msgstr "Beiträge Seite"
807
-
808
- #: includes/class-spu-helper.php:134
809
- msgid "Category Page"
810
- msgstr "Kategorie Seite"
811
-
812
- #: includes/class-spu-helper.php:135
813
- msgid "Search Page"
814
- msgstr "Suche-Seite"
815
-
816
- #: includes/class-spu-helper.php:136
817
- msgid "Archives Page"
818
- msgstr "Archivseite"
819
-
820
- #: includes/class-spu-helper.php:137
821
- msgid "Top Level Page (parent of 0)"
822
- msgstr "Hauptseite (nicht übergeordnet)"
823
-
824
- #: includes/class-spu-helper.php:138
825
- msgid "Parent Page (has children)"
826
- msgstr "Eltern-Seite (mit Kind-Seiten darunter)"
827
-
828
- #: includes/class-spu-helper.php:139
829
- msgid "Child Page (has parent)"
830
- msgstr "Kind-Seite (hat Eltern)"
831
-
832
- #: includes/class-spu-helper.php:147
833
- msgid "Default Template"
834
- msgstr "Standardvorlage"
835
-
836
- #: includes/class-spu-helper.php:220
837
- msgid "Publish"
838
- msgstr "Veröffentlichen"
839
-
840
- #: includes/class-spu-helper.php:221
841
- msgid "Pending Review"
842
- msgstr "Ausstehende Bewertung"
843
-
844
- #: includes/class-spu-helper.php:222
845
- msgid "Draft"
846
- msgstr "Entwurf"
847
-
848
- #: includes/class-spu-helper.php:223
849
- msgid "Future"
850
- msgstr "Zukunft"
851
-
852
- #: includes/class-spu-helper.php:224
853
- msgid "Private"
854
- msgstr "Privat"
855
-
856
- #: includes/class-spu-helper.php:225
857
- msgid "Revision"
858
- msgstr "Revision"
859
-
860
- #: includes/class-spu-helper.php:226
861
- msgid "Trash"
862
- msgstr "Papierkorb"
863
-
864
- #: includes/class-spu-helper.php:239
865
- msgid "Super Admin"
866
- msgstr "Super Administrator"
867
-
868
- #: includes/class-spu-helper.php:259
869
- msgid "True"
870
- msgstr "Richtig"
1
+ # Copyright (C) 2013 TODO
2
+ # This file is distributed under the same license as the TODO package.
3
+ msgid ""
4
+ msgstr ""
5
+ "Project-Id-Version: Popups\n"
6
+ "Report-Msgid-Bugs-To: http://wordpress.org/plugins/plugin-name\n"
7
+ "POT-Creation-Date: 2016-02-04 13:02+0100\n"
8
+ "PO-Revision-Date: 2018-01-22 16:35+0000\n"
9
+ "Language-Team: Timersys <info@timersys.com>\n"
10
+ "MIME-Version: 1.0\n"
11
+ "Content-Type: text/plain; charset=UTF-8\n"
12
+ "Content-Transfer-Encoding: 8bit\n"
13
+ "X-Generator: Poedit 2.0.6\n"
14
+ "X-Poedit-KeywordsList: __;_e;_n;_x;esc_html_e;esc_html__;esc_attr_e;"
15
+ "esc_attr__;_ex:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2;_x:1,2c;_n:1,2\n"
16
+ "X-Poedit-Basepath: ..\n"
17
+ "Plural-Forms: nplurals=2; plural=(n != 1);\n"
18
+ "Last-Translator: \n"
19
+ "Language: de_DE@formal\n"
20
+ "X-Poedit-SearchPath-0: .\n"
21
+
22
+ #: admin/class-social-popup-admin.php:159
23
+ msgctxt "post type singular name"
24
+ msgid "Popups"
25
+ msgstr "PopUps"
26
+
27
+ #: admin/class-social-popup-admin.php:160
28
+ msgctxt "admin menu"
29
+ msgid "Popups"
30
+ msgstr "PopUps"
31
+
32
+ #: admin/class-social-popup-admin.php:161
33
+ msgctxt "add new on admin bar"
34
+ msgid "Popups"
35
+ msgstr "PopUps"
36
+
37
+ #: admin/class-social-popup-admin.php:162
38
+ msgctxt "Popups"
39
+ msgid "Add New"
40
+ msgstr "Neues hinzufügen"
41
+
42
+ #: admin/class-social-popup-admin.php:163
43
+ msgid "Add New Popups"
44
+ msgstr "Neue Popups hinzufügen"
45
+
46
+ #: admin/class-social-popup-admin.php:164
47
+ msgid "New Popups"
48
+ msgstr "Neue Popups"
49
+
50
+ #: admin/class-social-popup-admin.php:165
51
+ msgid "Edit Popups"
52
+ msgstr "Popups bearbeiten"
53
+
54
+ #: admin/class-social-popup-admin.php:166
55
+ msgid "View Popups"
56
+ msgstr "Popups anzeigen"
57
+
58
+ #: admin/class-social-popup-admin.php:167
59
+ msgid "All Popups"
60
+ msgstr "Alle Popups"
61
+
62
+ #: admin/class-social-popup-admin.php:168
63
+ msgid "Search Popups"
64
+ msgstr "Suche Popups"
65
+
66
+ #: admin/class-social-popup-admin.php:169
67
+ msgid "Parent Popups:"
68
+ msgstr "Übergeordnete Popups:"
69
+
70
+ #: admin/class-social-popup-admin.php:170
71
+ msgid "No Popups found."
72
+ msgstr "Keine Popups gefunden."
73
+
74
+ #: admin/class-social-popup-admin.php:171
75
+ msgid "No Popups found in Trash."
76
+ msgstr "Keine Popups im Papierkorb gefunden."
77
+
78
+ #: admin/class-social-popup-admin.php:212
79
+ msgid "Settings"
80
+ msgstr "Einstellungen"
81
+
82
+ #: admin/class-social-popup-admin.php:260
83
+ msgid "Popups Premium"
84
+ msgstr "Popups Premium"
85
+
86
+ #: admin/class-social-popup-admin.php:271
87
+ msgid "PopUp Shortcodes"
88
+ msgstr "PopUp Shortcodes"
89
+
90
+ #: admin/class-social-popup-admin.php:280
91
+ msgid "PopUp Appearance"
92
+ msgstr "Popup Stil"
93
+
94
+ #: admin/class-social-popup-admin.php:289
95
+ msgid "PopUp Display Rules"
96
+ msgstr "Popup-Anzeigeregeln"
97
+
98
+ #: admin/class-social-popup-admin.php:298
99
+ msgid "Display Options"
100
+ msgstr "Anzeige-Optionen"
101
+
102
+ #: admin/class-social-popup-admin.php:307
103
+ msgid "Need support?"
104
+ msgstr "Unterstützung benötigt?"
105
+
106
+ #: admin/class-social-popup-admin.php:315
107
+ msgid "Donate & support"
108
+ msgstr "Spenden & unterstützen"
109
+
110
+ #: admin/class-social-popup-admin.php:323
111
+ msgid "About the developer"
112
+ msgstr "Über den Hersteller"
113
+
114
+ #: admin/class-social-popup-admin.php:589
115
+ #: admin/views/metaboxes/metabox-rules.php:33
116
+ #: admin/views/metaboxes/metabox-rules.php:106
117
+ msgid "or"
118
+ msgstr "oder"
119
+
120
+ #: admin/class-social-popup-admin.php:616
121
+ msgid "Add a Popup"
122
+ msgstr "Ein PopUp zufügen"
123
+
124
+ #: admin/class-social-popup-admin.php:740
125
+ msgid "User"
126
+ msgstr "Benutzer"
127
+
128
+ #: admin/class-social-popup-admin.php:741
129
+ msgid "User role"
130
+ msgstr "Benutzer Rolle"
131
+
132
+ #: admin/class-social-popup-admin.php:742
133
+ msgid "User is logged"
134
+ msgstr "Benutzer ist angemeldet"
135
+
136
+ #: admin/class-social-popup-admin.php:743
137
+ msgid "User never left a comment"
138
+ msgstr "Benutzer hat nie einen Kommentar verfasst"
139
+
140
+ #: admin/class-social-popup-admin.php:744
141
+ msgid "User came via a search engine"
142
+ msgstr "Benutzer kam über eine Suchmaschine"
143
+
144
+ #: admin/class-social-popup-admin.php:745
145
+ msgid "User did not arrive via another page on your site"
146
+ msgstr "Benutzer kam nicht über eine andere Seite Ihrer Webseite"
147
+
148
+ #: admin/class-social-popup-admin.php:747
149
+ #: admin/class-social-popup-admin.php:748
150
+ msgid "Post"
151
+ msgstr "Beitrag"
152
+
153
+ #: admin/class-social-popup-admin.php:749
154
+ msgid "Post ID"
155
+ msgstr "Beitrags ID"
156
+
157
+ #: admin/class-social-popup-admin.php:750
158
+ msgid "Post Type"
159
+ msgstr "Beitragstyp"
160
+
161
+ #: admin/class-social-popup-admin.php:751
162
+ msgid "Post Category"
163
+ msgstr "Beitragskategorie"
164
+
165
+ #: admin/class-social-popup-admin.php:752
166
+ msgid "Post Format"
167
+ msgstr "Beitragsformat"
168
+
169
+ #: admin/class-social-popup-admin.php:753
170
+ msgid "Post Status"
171
+ msgstr "Veröffentlichungsstatus"
172
+
173
+ #: admin/class-social-popup-admin.php:754
174
+ msgid "Post Taxonomy"
175
+ msgstr "Beitragsklassifizierung"
176
+
177
+ #: admin/class-social-popup-admin.php:756
178
+ #: admin/class-social-popup-admin.php:757
179
+ msgid "Page"
180
+ msgstr "Seite"
181
+
182
+ #: admin/class-social-popup-admin.php:758
183
+ msgid "Page Type"
184
+ msgstr "Seitentyp"
185
+
186
+ #: admin/class-social-popup-admin.php:759
187
+ msgid "Page Parent"
188
+ msgstr "Übergeordnete Seite"
189
+
190
+ #: admin/class-social-popup-admin.php:760
191
+ msgid "Page Template"
192
+ msgstr "Seitentemplate"
193
+
194
+ #: admin/class-social-popup-admin.php:762
195
+ msgid "Other"
196
+ msgstr "Sonstiges"
197
+
198
+ #: admin/class-social-popup-admin.php:763
199
+ msgid "Referrer"
200
+ msgstr "Empfehler"
201
+
202
+ #: admin/class-social-popup-admin.php:764
203
+ msgid "Mobile Phone"
204
+ msgstr "Mobil Nummer"
205
+
206
+ #: admin/class-social-popup-admin.php:765
207
+ msgid "Tablet"
208
+ msgstr "Tablet"
209
+
210
+ #: admin/class-social-popup-admin.php:813
211
+ msgid "ID"
212
+ msgstr "ID"
213
+
214
+ #: admin/includes/class-spu-notices.php:30
215
+ #, php-format
216
+ msgid ""
217
+ "We noticed that you have been using our plugin for a while and we would like "
218
+ "to ask you a little favour. If you are happy with it and can take a minute "
219
+ "please <a href=\"%s\" target=\"_blank\">leave a nice review</a> on "
220
+ "WordPress. It will be a tremendous help for us!"
221
+ msgstr ""
222
+ "Wir haben festgestellt, dass Sie unser Plugin bereits für eine Weile "
223
+ "verwendet haben und möchten Sie um einen Gefallen bitten. Wenn Sie mit "
224
+ "unserem Plugin zufrieden sind, nehmen Sie sich bitte eine Minute Zeit und <a "
225
+ "href=\"%s\" target=\"_blank\">hinterlassen eine positive Rezension</a> auf "
226
+ "WordPress. Es wird für uns eine große Hilfe sein!"
227
+
228
+ #: admin/includes/class-spu-notices.php:32
229
+ #, php-format
230
+ msgid "<a href=\"%s\" target=\"_blank\">Leave a nice review</a>"
231
+ msgstr "<a href=\"%s\" target=\"_blank\">Eine positive Rezension verfassen</a>"
232
+
233
+ #: admin/includes/class-spu-notices.php:33
234
+ #, php-format
235
+ msgid "<a href=\"%s\">No, thanks</a>"
236
+ msgstr "<a href=\"%s\">Nein Danke!</a>"
237
+
238
+ #: admin/views/metaboxes/metabox-appearance.php:10
239
+ msgid "Background opacity"
240
+ msgstr "Hintergrund Transparenz"
241
+
242
+ #: admin/views/metaboxes/metabox-appearance.php:12
243
+ msgid "Leave at 0 for no background. Max value is 1"
244
+ msgstr "0 für keinen Hintergrund. Max ist 1"
245
+
246
+ #: admin/views/metaboxes/metabox-appearance.php:18
247
+ msgid "Background color"
248
+ msgstr "Hintergrundfarbe"
249
+
250
+ #: admin/views/metaboxes/metabox-appearance.php:22
251
+ msgid "Text color"
252
+ msgstr "Text Farbe"
253
+
254
+ #: admin/views/metaboxes/metabox-appearance.php:26
255
+ msgid "Box width"
256
+ msgstr "Breite des Inhalts-Blocks"
257
+
258
+ #: admin/views/metaboxes/metabox-appearance.php:32
259
+ msgid "Border color"
260
+ msgstr "Rahmenfarbe"
261
+
262
+ #: admin/views/metaboxes/metabox-appearance.php:36
263
+ msgid "Border width"
264
+ msgstr "Rahmenbreite"
265
+
266
+ #: admin/views/metaboxes/metabox-donate.php:6
267
+ msgid "If you like this plugin, consider supporting it by donating."
268
+ msgstr ""
269
+ "Wenn Ihnen dieses Plugin gefällt, unterstützen Sie es mit einer Spende."
270
+
271
+ #: admin/views/metaboxes/metabox-donate.php:8
272
+ msgid "Donate with PayPal"
273
+ msgstr "Mit PayPal spenden"
274
+
275
+ #: admin/views/metaboxes/metabox-donate.php:10
276
+ msgid "Some other ways to support this plugin"
277
+ msgstr "Einige andere Möglichkeiten, dieses Plugin zu unterstützen"
278
+
279
+ #: admin/views/metaboxes/metabox-donate.php:12
280
+ msgid "Leave a &#9733;&#9733;&#9733;&#9733;&#9733; review on WordPress.org"
281
+ msgstr ""
282
+ "Hinterlassen Sie eine &#9733;&#9733;&#9733;&#9733;&#9733; Bewertung auf "
283
+ "WordPress.org"
284
+
285
+ #: admin/views/metaboxes/metabox-donate.php:13
286
+ msgid "Write about Popups on your blog"
287
+ msgstr "Über Popups in Ihrem Blog schreiben"
288
+
289
+ #: admin/views/metaboxes/metabox-donate.php:14
290
+ msgid "Tweet about Popups"
291
+ msgstr "Tweet über Popups"
292
+
293
+ #: admin/views/metaboxes/metabox-donate.php:15
294
+ msgid "Vote \"works\" on the WordPress.org plugin page"
295
+ msgstr ""
296
+ "Stimmen Sie mit &quot;funktioniert&quot; auf der WordPress.org Plugin Seite"
297
+
298
+ #: admin/views/metaboxes/metabox-help.php:6
299
+ msgid ""
300
+ "You have some social shortcodes to use that will print a Facebook like, a "
301
+ "Google+ Follow and a Twitter follow. Check the available options and "
302
+ "<strong>configure them with your social accounts</strong>:"
303
+ msgstr ""
304
+ "Sie haben einige Shortcodes zur Verfügung, die: Facebook like, Google + "
305
+ "folgen und ein Twitter folgen auf der Seite anzeigen können. Überprüfen Sie "
306
+ "die verfügbaren Optionen um <strong>sie mit Ihren sozialen Netzwerkkonten zu "
307
+ "konfigurieren</strong>:"
308
+
309
+ #: admin/views/metaboxes/metabox-help.php:8
310
+ msgid "Facebook Page"
311
+ msgstr "Facebook-Seite"
312
+
313
+ #: admin/views/metaboxes/metabox-help.php:12
314
+ msgid "View Facebook Page Options"
315
+ msgstr "Zeige Facebook-Seitenoptionen"
316
+
317
+ #: admin/views/metaboxes/metabox-help.php:14
318
+ #: admin/views/metaboxes/metabox-help.php:27
319
+ msgid "Your Facebook page url"
320
+ msgstr "Ihre Facebook-URL"
321
+
322
+ #: admin/views/metaboxes/metabox-help.php:15
323
+ msgid "Your page name"
324
+ msgstr "Ihr Seitenname"
325
+
326
+ #: admin/views/metaboxes/metabox-help.php:16
327
+ msgid "true|false <b>Default value:</b> true"
328
+ msgstr "richtig|falsch <b>Standart-Einstellung</b> richtig"
329
+
330
+ #: admin/views/metaboxes/metabox-help.php:17
331
+ msgid "true|false <b>Default value:</b> false"
332
+ msgstr "richtig|falsch <b>Standart-Einstellung</b> falsch"
333
+
334
+ #: admin/views/metaboxes/metabox-help.php:18
335
+ msgid "number <b>Default value:</b> 500"
336
+ msgstr "Anzahl <b>Standart-Wert:</b> 500"
337
+
338
+ #: admin/views/metaboxes/metabox-help.php:21
339
+ msgid "Facebook Button"
340
+ msgstr "Facebook Taste"
341
+
342
+ #: admin/views/metaboxes/metabox-help.php:25
343
+ msgid "View Facebook Options"
344
+ msgstr "Zeige Facebook-Optionen"
345
+
346
+ #: admin/views/metaboxes/metabox-help.php:28
347
+ msgid "standard, box_count, button <b>Default value:</b> button_count"
348
+ msgstr "standart, box_drücke, taste <b>Standard Wert:</b> tasten_drücke"
349
+
350
+ #: admin/views/metaboxes/metabox-help.php:29
351
+ #: admin/views/metaboxes/metabox-help.php:30
352
+ msgid "true <b>Default value:</b> false"
353
+ msgstr "richtig <b>Standart-Einstellung</b> falsch"
354
+
355
+ #: admin/views/metaboxes/metabox-help.php:31
356
+ msgid "recommend <b>Default value:</b> like"
357
+ msgstr "empfohlen <b>Default-Wert:</b> like"
358
+
359
+ #: admin/views/metaboxes/metabox-help.php:32
360
+ msgid "number <b>Default value:</b>"
361
+ msgstr "Anzahl <b>Standart-Wert:</b>"
362
+
363
+ #: admin/views/metaboxes/metabox-help.php:34
364
+ msgid "Google+ Button"
365
+ msgstr "Google+Taste"
366
+
367
+ #: admin/views/metaboxes/metabox-help.php:38
368
+ msgid "View Google+ Options"
369
+ msgstr "Zeige Google +-Optionen"
370
+
371
+ #: admin/views/metaboxes/metabox-help.php:40
372
+ msgid "Your Google+ url"
373
+ msgstr "Geben Sie Ihren Google+-Link an."
374
+
375
+ #: admin/views/metaboxes/metabox-help.php:41
376
+ msgid "small, standard, tall <b>Default value:</b> medium"
377
+ msgstr "klein, standart, groß <b>Standart-Wert:</b> medium"
378
+
379
+ #: admin/views/metaboxes/metabox-help.php:42
380
+ msgid "inline, none <b>Default value:</b> bubble"
381
+ msgstr "inline, none <b>Standartt-Wert:</b> bubble"
382
+
383
+ #: admin/views/metaboxes/metabox-help.php:44
384
+ msgid "Twitter Button"
385
+ msgstr "Twitter Taste"
386
+
387
+ #: admin/views/metaboxes/metabox-help.php:48
388
+ msgid "View Twitter Options"
389
+ msgstr "Zeige Twitter Optionen"
390
+
391
+ #: admin/views/metaboxes/metabox-help.php:50
392
+ msgid "Your Twitter user <b>Default chifliiiii</b>"
393
+ msgstr "Ihr Twitter Benutzername <b>Standard-chifliiiii</b>"
394
+
395
+ #: admin/views/metaboxes/metabox-help.php:51
396
+ msgid "false <b>Default value:</b> true"
397
+ msgstr "falsch <b>Standart-Einstellung</b> richtig"
398
+
399
+ #: admin/views/metaboxes/metabox-help.php:52
400
+ msgid "large <b>Default value:</b> \"\""
401
+ msgstr "groß <b>Standart-Wert:</b> \"\""
402
+
403
+ #: admin/views/metaboxes/metabox-help.php:55
404
+ msgid "Other available Shortcodes:"
405
+ msgstr "Weitere Shortcodes:"
406
+
407
+ #: admin/views/metaboxes/metabox-help.php:56
408
+ msgid "Close Button"
409
+ msgstr "Schließen-Schaltfläche"
410
+
411
+ #: admin/views/metaboxes/metabox-help.php:60
412
+ msgid "View Close shortcode Options"
413
+ msgstr "Zeige Shortcodes-Optionen zu: Schließen"
414
+
415
+ #: admin/views/metaboxes/metabox-help.php:62
416
+ msgid "Pass a custom class to style your button"
417
+ msgstr ""
418
+ "Bestimmen Sie eine benutzerdefinierte CSS-Klasse, zu Ihrer Schaltfläche"
419
+
420
+ #: admin/views/metaboxes/metabox-help.php:63
421
+ msgid "Button label - <b>Default value:</b> Close"
422
+ msgstr "Schaltflächentext - <b>Default-Wert:</b> Schließen"
423
+
424
+ #: admin/views/metaboxes/metabox-help.php:64
425
+ msgid "left, right, center, none - <b>Default value:</b> center"
426
+ msgstr "links, rechts, mittig, ohne - <b>Default-Wert:</b> mittig"
427
+
428
+ #: admin/views/metaboxes/metabox-links.php:6
429
+ msgid "My name is"
430
+ msgstr "Mein Name ist"
431
+
432
+ #: admin/views/metaboxes/metabox-links.php:6
433
+ msgid "I develop WordPress plugins and themes."
434
+ msgstr "Ich entwickle WordPress Plugins und Themes."
435
+
436
+ #: admin/views/metaboxes/metabox-links.php:7
437
+ #, php-format
438
+ msgid ""
439
+ "Take a look at my <a href=\"%s\">site</a> to see my other plugins or hire "
440
+ "me. Subscribe to get updates!"
441
+ msgstr ""
442
+ "Werfen Sie einen Blick auf meine <a href=\"%s\">Website</a>, um andere "
443
+ "Plugins von mir zu sehen oder mir direkt einen Kundenauftrag zu erteilen. "
444
+ "Abonnieren Sie meine Newsletter für Updates!"
445
+
446
+ #: admin/views/metaboxes/metabox-links.php:8
447
+ msgid "Other plugins I built:"
448
+ msgstr "Andere Plugins von mir:"
449
+
450
+ #: admin/views/metaboxes/metabox-links.php:10
451
+ msgid "Install multiple plugins and create collections"
452
+ msgstr "Mehrere Plugins installieren und Sammlungen erstellen"
453
+
454
+ #: admin/views/metaboxes/metabox-links.php:11
455
+ msgid "Geotarget your content"
456
+ msgstr "Geotarget Ihrer Inhalte"
457
+
458
+ #: admin/views/metaboxes/metabox-links.php:12
459
+ msgid "Invite your network friends and import contacts"
460
+ msgstr "Lade Freunde ein und importiere Kontakte"
461
+
462
+ #: admin/views/metaboxes/metabox-options.php:9
463
+ msgid "Box Position"
464
+ msgstr "Position der Box"
465
+
466
+ #: admin/views/metaboxes/metabox-options.php:12
467
+ msgid "Centered"
468
+ msgstr "Zentriert"
469
+
470
+ #: admin/views/metaboxes/metabox-options.php:13
471
+ msgid "Top Left"
472
+ msgstr "Oben links"
473
+
474
+ #: admin/views/metaboxes/metabox-options.php:14
475
+ msgid "Top Right"
476
+ msgstr "Oben rechts"
477
+
478
+ #: admin/views/metaboxes/metabox-options.php:15
479
+ msgid "Bottom Left"
480
+ msgstr "Unten links"
481
+
482
+ #: admin/views/metaboxes/metabox-options.php:16
483
+ msgid "Bottom Right"
484
+ msgstr "Unten rechts"
485
+
486
+ #: admin/views/metaboxes/metabox-options.php:23
487
+ msgid "Trigger action"
488
+ msgstr "Auslöseaktion"
489
+
490
+ #: admin/views/metaboxes/metabox-options.php:27
491
+ msgid "seconds after page load"
492
+ msgstr "Sekunden nach dem Laden der Seite"
493
+
494
+ #: admin/views/metaboxes/metabox-options.php:28
495
+ msgid "of page height"
496
+ msgstr "der Seitenhöhe"
497
+
498
+ #: admin/views/metaboxes/metabox-options.php:38
499
+ msgid "Auto-hide?"
500
+ msgstr "Automatisch ausblenden?"
501
+
502
+ #: admin/views/metaboxes/metabox-options.php:40
503
+ #: admin/views/metaboxes/metabox-options.php:68
504
+ #: admin/views/metaboxes/metabox-options.php:76
505
+ #: admin/views/metaboxes/metabox-options.php:84
506
+ msgid "Yes"
507
+ msgstr "Ja"
508
+
509
+ #: admin/views/metaboxes/metabox-options.php:41
510
+ #: admin/views/metaboxes/metabox-options.php:69
511
+ #: admin/views/metaboxes/metabox-options.php:77
512
+ #: admin/views/metaboxes/metabox-options.php:85
513
+ msgid "No"
514
+ msgstr "Nein"
515
+
516
+ #: admin/views/metaboxes/metabox-options.php:42
517
+ msgid "Hide box again when visitors scroll back up?"
518
+ msgstr ""
519
+ "Soll die Box wieder versteckt werden, wenn Besucher zurück nach oben "
520
+ "scrollen?"
521
+
522
+ #: admin/views/metaboxes/metabox-options.php:46
523
+ msgid "Animation"
524
+ msgstr "Animieren"
525
+
526
+ #: admin/views/metaboxes/metabox-options.php:49
527
+ msgid "Fade In"
528
+ msgstr "Einblenden"
529
+
530
+ #: admin/views/metaboxes/metabox-options.php:50
531
+ msgid "Slide In"
532
+ msgstr "Seitlich einfahren"
533
+
534
+ #: admin/views/metaboxes/metabox-options.php:53
535
+ msgid "Slide will only apply when popup is on the corners"
536
+ msgstr "Seitliches Einfahren nur: wenn das Popup in den Ecken platziert ist"
537
+
538
+ #: admin/views/metaboxes/metabox-options.php:58
539
+ msgid "Cookie expiration days"
540
+ msgstr "Cookie läuft aus in Tagen"
541
+
542
+ #: admin/views/metaboxes/metabox-options.php:61
543
+ msgid "After closing the box, how many days should it stay hidden?"
544
+ msgstr "Wie viele Tage sollte das Popup nach Schließen nicht angezeigt werden?"
545
+
546
+ #: admin/views/metaboxes/metabox-options.php:66
547
+ msgid "Enable test mode?"
548
+ msgstr "Testmodus aktivieren?"
549
+
550
+ #: admin/views/metaboxes/metabox-options.php:70
551
+ msgid ""
552
+ "If test mode is enabled, the box will show up regardless of whether a cookie "
553
+ "has been set. (To admins only)"
554
+ msgstr ""
555
+ "Wenn Test-Modus aktiviert ist, wird das Popup angezeigt. Unabhängig davon, "
556
+ "ob ein Cookie festgelegt wurde. (Nur für Admins)"
557
+
558
+ #: admin/views/metaboxes/metabox-options.php:74
559
+ msgid "Close on conversion?"
560
+ msgstr "Schließen nach Konvertierung?"
561
+
562
+ #: admin/views/metaboxes/metabox-options.php:78
563
+ msgid ""
564
+ "If you have a form or social shortcode, by default popup will close on "
565
+ "submission/conversion"
566
+ msgstr ""
567
+ "Wenn Sie ein Formular oder ein Shortcode für soziale Netzwerkehaben, wird "
568
+ "standardmäßig das Popup nach Anmeldung/Konversion geschlossen"
569
+
570
+ #: admin/views/metaboxes/metabox-options.php:82
571
+ msgid "Show powered by link?"
572
+ msgstr "Mit Unterstützung von Link anzeigen?"
573
+
574
+ #: admin/views/metaboxes/metabox-options.php:86
575
+ #, php-format
576
+ msgid ""
577
+ "Shows a \"powered by\" link below your popup. If your affiliate link is set "
578
+ "in the <a href=\"%s\">settings</a>, it will be used."
579
+ msgstr ""
580
+ "Zeigt einen \"powered by\" Link unten in Ihrem Popup. Wenn Ihr Affiliate-"
581
+ "Link in den <a href=\"%s\">Einstellungen</a> festgelegt ist, wird dieser "
582
+ "verwendet."
583
+
584
+ #: admin/views/metaboxes/metabox-premium.php:16
585
+ msgid ""
586
+ "Take the best WordPress Popups plugin to the next level with Popups Premium "
587
+ "extension."
588
+ msgstr ""
589
+ "Bringen Sie das beste WordPress Popups-Plugin auf den nächsten Level mit der "
590
+ "Popups Premium-Erweiterung."
591
+
592
+ #: admin/views/metaboxes/metabox-premium.php:17
593
+ msgid "Popups Premium Features:"
594
+ msgstr "Popups Premium Features:"
595
+
596
+ #: admin/views/metaboxes/metabox-premium.php:19
597
+ msgid "Beautiful optin forms for popular mail providers"
598
+ msgstr "Schöne Opt-In Formulare für die bekanntesten E-Mail-Anbieter"
599
+
600
+ #: admin/views/metaboxes/metabox-premium.php:20
601
+ msgid "Currently supporting MailChimp, Aweber, Postmatic, Mailpoet"
602
+ msgstr "Aktuell unterstützt: MailChimp, Aweber, Postmatic, Mailpoet"
603
+
604
+ #: admin/views/metaboxes/metabox-premium.php:21
605
+ msgid ""
606
+ "Track impressions and Conversions of social likes and forms submissions like "
607
+ "Contact Form 7, Gravity forms, etc"
608
+ msgstr ""
609
+ "Verfolge Impressionen und Konversionen von sozialen Likes und "
610
+ "Formularübermittlungen wie: Contact Form 7, Gravity forms, etc."
611
+
612
+ #: admin/views/metaboxes/metabox-premium.php:22
613
+ msgid "Track impressions and Conversions also in Google Analytics"
614
+ msgstr "Verfolge Impressionen und Conversions auch in Google Analytics"
615
+
616
+ #: admin/views/metaboxes/metabox-premium.php:23
617
+ #: admin/views/metaboxes/metabox-premium.php:25
618
+ msgid "Exit Intent technology"
619
+ msgstr "\"Beim Verlassen der Seite\" Technologie"
620
+
621
+ #: admin/views/metaboxes/metabox-premium.php:24
622
+ msgid "8 New animations effects"
623
+ msgstr "8 neue Animationen"
624
+
625
+ #: admin/views/metaboxes/metabox-premium.php:26
626
+ msgid "New trigger methods"
627
+ msgstr "Neue Trigger-Methoden"
628
+
629
+ #: admin/views/metaboxes/metabox-premium.php:27
630
+ msgid "Timer for auto closing"
631
+ msgstr "Timer für automatische Schließung"
632
+
633
+ #: admin/views/metaboxes/metabox-premium.php:28
634
+ msgid "Ability to disable close button"
635
+ msgstr "Möglichkeit zum Deaktivieren der Schaltfläche \"schließen\""
636
+
637
+ #: admin/views/metaboxes/metabox-premium.php:29
638
+ msgid ""
639
+ "Ability to disable Advanced close methods like esc or clicking outside of "
640
+ "the popup"
641
+ msgstr ""
642
+ "Möglichkeit, fortschrittliche \"Schließen\" Methoden wie ESC oder Klicken "
643
+ "außerhalb des Popups zu deaktivieren"
644
+
645
+ #: admin/views/metaboxes/metabox-premium.php:30
646
+ msgid "Premium support"
647
+ msgstr "Premium-Support"
648
+
649
+ #: admin/views/metaboxes/metabox-premium.php:34
650
+ msgid "Buy Now!"
651
+ msgstr "Sofort Kaufen!"
652
+
653
+ #: admin/views/metaboxes/metabox-rules.php:19
654
+ msgid "Rules"
655
+ msgstr "Regeln"
656
+
657
+ #: admin/views/metaboxes/metabox-rules.php:20
658
+ msgid "Create a set of rules to determine where the popup will show"
659
+ msgstr ""
660
+ "Erstellen Sie einen Satz von Regeln, um festzustellen, wo das Popup "
661
+ "angezeigt wird"
662
+
663
+ #: admin/views/metaboxes/metabox-rules.php:31
664
+ msgid "Show this popup if"
665
+ msgstr "Zeigen Sie dieses Popup wenn"
666
+
667
+ #: admin/views/metaboxes/metabox-rules.php:61
668
+ msgid "is equal to"
669
+ msgstr "ist gleich"
670
+
671
+ #: admin/views/metaboxes/metabox-rules.php:62
672
+ msgid "is not equal to"
673
+ msgstr "ist nicht gleich"
674
+
675
+ #: admin/views/metaboxes/metabox-rules.php:93
676
+ msgid "and"
677
+ msgstr "und"
678
+
679
+ #: admin/views/metaboxes/metabox-rules.php:108
680
+ msgid "Add rule group"
681
+ msgstr "Regelgruppe hinzufügen"
682
+
683
+ #: admin/views/metaboxes/metabox-support.php:6
684
+ #, php-format
685
+ msgid "You are using Popups plugin v%s"
686
+ msgstr "Sie verwenden Popups Plugin v%s"
687
+
688
+ #: admin/views/metaboxes/metabox-support.php:7
689
+ #, php-format
690
+ msgid ""
691
+ "If you need support please go to the WordPress.org <a href=\"%s\">support "
692
+ "forums</a>"
693
+ msgstr ""
694
+ "Wenn Sie Unterstützung benötigen, gehen Sie bitte auf WordPress.org <a href="
695
+ "\"%s\">Support-Foren</a>"
696
+
697
+ #: admin/views/settings-page.php:17
698
+ msgid "Affiliate link"
699
+ msgstr "Affiliate Link"
700
+
701
+ #: admin/views/settings-page.php:20
702
+ #, php-format
703
+ msgid ""
704
+ "You can earn money by promoting the plugin! Join <a href=\"%s\">our "
705
+ "affiliate program</a> and paste your affiliate link here to earn 35&#37; in "
706
+ "commissions . Once entered, it will replace the default \"Powered by\" on "
707
+ "the popups."
708
+ msgstr ""
709
+ "Sie können Geld verdienen durch Promotion des Plugin! Treten Sie <a href=\"%s"
710
+ "\">unserem Affiliate-Programm</a> bei und fügen Sie Ihren Affiliate-Link "
711
+ "hier ein, um 35&#37; an Provisionen zu verdienen. Einmal eingegeben, und der "
712
+ "Standardwert \"Powered by\" wird mit Ihrem Link in den Popups ersetzt."
713
+
714
+ #: admin/views/settings-page.php:24
715
+ msgid "Ajax mode?"
716
+ msgstr "Ajax-Modus?"
717
+
718
+ #: admin/views/settings-page.php:27
719
+ msgid ""
720
+ "Load popups using ajax. Compatible with cache plugins, but might not work "
721
+ "with all plugins"
722
+ msgstr ""
723
+ "Laden Sie Popups mit Ajax. Kompatibel mit Cache-Plugins, aber funktioniert "
724
+ "möglicherweise nicht mit allen Plugins"
725
+
726
+ #: admin/views/settings-page.php:32
727
+ msgid "Enable Debug mode?"
728
+ msgstr "Fehlersuche aktivieren?"
729
+
730
+ #: admin/views/settings-page.php:35
731
+ msgid "Will use uncompressed js"
732
+ msgstr "Unkomprimierte Js verwenden"
733
+
734
+ #: admin/views/settings-page.php:40
735
+ msgid "Enable safe mode?"
736
+ msgstr "Aktivieren abgesicherter Modus?"
737
+
738
+ #: admin/views/settings-page.php:43
739
+ msgid "Will move all popups to top of the screen."
740
+ msgstr "Alle Popups wird zum oberen Rand des Bildschirms verschoben werden."
741
+
742
+ #: admin/views/settings-page.php:48
743
+ msgid "Remove shortcodes style"
744
+ msgstr "Shortcodes Stil entfernen"
745
+
746
+ #: admin/views/settings-page.php:51
747
+ msgid ""
748
+ "By default the plugin will apply some style to shortcodes. Check here if you "
749
+ "want to manually style them"
750
+ msgstr ""
751
+ "Standardmäßig wird das Plugin eigene Stil-Shortcodes zuweisen. Aktivieren, "
752
+ "wenn Sie Stile manuell erzeugen wollen"
753
+
754
+ #: admin/views/settings-page.php:56
755
+ msgid "Unload Facebook javascript"
756
+ msgstr "Facebook Javascript nicht laden"
757
+
758
+ #: admin/views/settings-page.php:59
759
+ msgid "If you use your own Facebook script, check this"
760
+ msgstr ""
761
+ "Wenn Sie Ihr eigenes Facebook-Skript verwenden, aktivieren Sie dies hier"
762
+
763
+ #: admin/views/settings-page.php:64
764
+ msgid "Unload Google javascript"
765
+ msgstr "Google Javascript nicht laden"
766
+
767
+ #: admin/views/settings-page.php:67
768
+ msgid "If you use your own Google script, check this"
769
+ msgstr "Wenn Sie Ihre eigenes Google-Skript verwenden, aktivieren Sie dies"
770
+
771
+ #: admin/views/settings-page.php:72
772
+ msgid "Unload Twitter javascript"
773
+ msgstr "Twitter-Javascript nicht laden"
774
+
775
+ #: admin/views/settings-page.php:75
776
+ msgid "If you use your own Twitter script, check this"
777
+ msgstr ""
778
+ "Wenn Sie Ihr eigenes Twitter-Skript verwenden, aktivieren Sie dies hier"
779
+
780
+ #: admin/views/settings-page.php:82
781
+ msgid "Delete all data on Uninstall"
782
+ msgstr "Alle Daten bei der Deinstallation löschen"
783
+
784
+ #: admin/views/settings-page.php:85
785
+ msgid ""
786
+ "When you uninstall the plugin all popups, settings and stats will be deleted "
787
+ "from your db"
788
+ msgstr ""
789
+ "Wenn Sie das Plugin deinstallieren werden alle Popups, Einstellungen und "
790
+ "Statistiken aus der Datenbank gelöscht"
791
+
792
+ #: admin/views/settings-page.php:89
793
+ msgid "Save settings"
794
+ msgstr "Einstellungen speichern"
795
+
796
+ #: includes/class-spu-helper.php:131
797
+ msgid "All Pages"
798
+ msgstr "Alle Seiten"
799
+
800
+ #: includes/class-spu-helper.php:132
801
+ msgid "Front Page"
802
+ msgstr "Startseite"
803
+
804
+ #: includes/class-spu-helper.php:133
805
+ msgid "Posts Page"
806
+ msgstr "Beiträge Seite"
807
+
808
+ #: includes/class-spu-helper.php:134
809
+ msgid "Category Page"
810
+ msgstr "Kategorie Seite"
811
+
812
+ #: includes/class-spu-helper.php:135
813
+ msgid "Search Page"
814
+ msgstr "Suche-Seite"
815
+
816
+ #: includes/class-spu-helper.php:136
817
+ msgid "Archives Page"
818
+ msgstr "Archivseite"
819
+
820
+ #: includes/class-spu-helper.php:137
821
+ msgid "Top Level Page (parent of 0)"
822
+ msgstr "Hauptseite (nicht übergeordnet)"
823
+
824
+ #: includes/class-spu-helper.php:138
825
+ msgid "Parent Page (has children)"
826
+ msgstr "Eltern-Seite (mit Kind-Seiten darunter)"
827
+
828
+ #: includes/class-spu-helper.php:139
829
+ msgid "Child Page (has parent)"
830
+ msgstr "Kind-Seite (hat Eltern)"
831
+
832
+ #: includes/class-spu-helper.php:147
833
+ msgid "Default Template"
834
+ msgstr "Standardvorlage"
835
+
836
+ #: includes/class-spu-helper.php:220
837
+ msgid "Publish"
838
+ msgstr "Veröffentlichen"
839
+
840
+ #: includes/class-spu-helper.php:221
841
+ msgid "Pending Review"
842
+ msgstr "Ausstehende Bewertung"
843
+
844
+ #: includes/class-spu-helper.php:222
845
+ msgid "Draft"
846
+ msgstr "Entwurf"
847
+
848
+ #: includes/class-spu-helper.php:223
849
+ msgid "Future"
850
+ msgstr "Zukunft"
851
+
852
+ #: includes/class-spu-helper.php:224
853
+ msgid "Private"
854
+ msgstr "Privat"
855
+
856
+ #: includes/class-spu-helper.php:225
857
+ msgid "Revision"
858
+ msgstr "Revision"
859
+
860
+ #: includes/class-spu-helper.php:226
861
+ msgid "Trash"
862
+ msgstr "Papierkorb"
863
+
864
+ #: includes/class-spu-helper.php:239
865
+ msgid "Super Admin"
866
+ msgstr "Super Administrator"
867
+
868
+ #: includes/class-spu-helper.php:259
869
+ msgid "True"
870
+ msgstr "Richtig"
languages/popups-es_ES.po CHANGED
@@ -1,814 +1,814 @@
1
- # Copyright (C) 2013 TODO
2
- # This file is distributed under the same license as the TODO package.
3
- msgid ""
4
- msgstr ""
5
- "Project-Id-Version: Popups\n"
6
- "Report-Msgid-Bugs-To: http://wordpress.org/plugins/plugin-name\n"
7
- "POT-Creation-Date: 2015-06-14 00:02-0300\n"
8
- "PO-Revision-Date: 2015-10-01 15:15-0300\n"
9
- "Last-Translator: Damian Logghe <info@timersys.com>\n"
10
- "Language-Team: Timersys <info@timersys.com>\n"
11
- "Language: es_ES\n"
12
- "MIME-Version: 1.0\n"
13
- "Content-Type: text/plain; charset=UTF-8\n"
14
- "Content-Transfer-Encoding: 8bit\n"
15
- "X-Generator: Poedit 1.7.4\n"
16
- "X-Poedit-KeywordsList: __;_e;_n;_x;esc_html_e;esc_html__;esc_attr_e;"
17
- "esc_attr__;_ex:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2;_x:1,2c;_n:1,2\n"
18
- "X-Poedit-Basepath: ../\n"
19
- "Plural-Forms: nplurals=2; plural=n != 1;\n"
20
- "X-Poedit-SearchPath-0: .\n"
21
-
22
- #: admin/class-social-popup-admin.php:154
23
- msgctxt "post type singular name"
24
- msgid "Popups"
25
- msgstr "Popups [postear nombre singular del tipo]"
26
-
27
- #: admin/class-social-popup-admin.php:155
28
- msgctxt "admin menu"
29
- msgid "Popups"
30
- msgstr "Popups [menú del admin]"
31
-
32
- #: admin/class-social-popup-admin.php:156
33
- msgctxt "add new on admin bar"
34
- msgid "Popups"
35
- msgstr "Popups [adicionar nuevo en la barra de admin]"
36
-
37
- #: admin/class-social-popup-admin.php:157
38
- msgctxt "Popups"
39
- msgid "Add New"
40
- msgstr "Adicionar nuevo [Popups]"
41
-
42
- #: admin/class-social-popup-admin.php:158
43
- msgid "Add New Popups"
44
- msgstr "Adicionar Nuevo Popups"
45
-
46
- #: admin/class-social-popup-admin.php:159
47
- msgid "New Popups"
48
- msgstr "Nuevo Popups"
49
-
50
- #: admin/class-social-popup-admin.php:160
51
- msgid "Edit Popups"
52
- msgstr "Editar Popups"
53
-
54
- #: admin/class-social-popup-admin.php:161
55
- msgid "View Popups"
56
- msgstr "Ver Popups"
57
-
58
- #: admin/class-social-popup-admin.php:162
59
- msgid "All Popups"
60
- msgstr "Todos los Popups"
61
-
62
- #: admin/class-social-popup-admin.php:163
63
- msgid "Search Popups"
64
- msgstr "Buscar Popups"
65
-
66
- #: admin/class-social-popup-admin.php:164
67
- msgid "Parent Popups:"
68
- msgstr "Popups Padre:"
69
-
70
- #: admin/class-social-popup-admin.php:165
71
- msgid "No Popups found."
72
- msgstr "No se encontraron Popups."
73
-
74
- #: admin/class-social-popup-admin.php:166
75
- msgid "No Popups found in Trash."
76
- msgstr "No se encontraron Popups en la Papelera."
77
-
78
- #: admin/class-social-popup-admin.php:255
79
- msgid "Popups Premium"
80
- msgstr "Popups Premium"
81
-
82
- #: admin/class-social-popup-admin.php:266
83
- msgid "PopUp Shortcodes"
84
- msgstr "Códigos Cortos del PopUp"
85
-
86
- #: admin/class-social-popup-admin.php:275
87
- msgid "PopUp Display Rules"
88
- msgstr "Reglas de Visualización del PopUp"
89
-
90
- #: admin/class-social-popup-admin.php:284
91
- msgid "Display Options"
92
- msgstr "Opciones de Visualización"
93
-
94
- #: admin/class-social-popup-admin.php:293
95
- msgid "Need support?"
96
- msgstr "¿Necesita soporte?"
97
-
98
- #: admin/class-social-popup-admin.php:301
99
- msgid "Donate & support"
100
- msgstr "Donar y soporte"
101
-
102
- #: admin/class-social-popup-admin.php:309
103
- msgid "About the developer"
104
- msgstr "Acerca del desarrollador"
105
-
106
- #: admin/class-social-popup-admin.php:557
107
- #: admin/views/metaboxes/metabox-rules.php:33
108
- #: admin/views/metaboxes/metabox-rules.php:106
109
- msgid "or"
110
- msgstr "o"
111
-
112
- #: admin/class-social-popup-admin.php:584
113
- msgid "Add a Popup"
114
- msgstr "Adicionar un Popup"
115
-
116
- #: admin/class-social-popup-admin.php:708
117
- msgid "User"
118
- msgstr "Usuario"
119
-
120
- #: admin/class-social-popup-admin.php:709
121
- msgid "User role"
122
- msgstr "Rol de Usuario"
123
-
124
- #: admin/class-social-popup-admin.php:710
125
- msgid "User is logged"
126
- msgstr "El usuario está autenticado"
127
-
128
- #: admin/class-social-popup-admin.php:711
129
- msgid "User never left a comment"
130
- msgstr "El usuario nunca dejó un comentario"
131
-
132
- #: admin/class-social-popup-admin.php:712
133
- msgid "User came via a search engine"
134
- msgstr "El usuario vino via un motor de búsqueda"
135
-
136
- #: admin/class-social-popup-admin.php:713
137
- msgid "User did not arrive via another page on your site"
138
- msgstr "El usuario no llegó via ninguna otra página de su sitio"
139
-
140
- #: admin/class-social-popup-admin.php:715
141
- #: admin/class-social-popup-admin.php:716
142
- msgid "Post"
143
- msgstr "Post"
144
-
145
- #: admin/class-social-popup-admin.php:717
146
- msgid "Post ID"
147
- msgstr "ID del Post"
148
-
149
- #: admin/class-social-popup-admin.php:718
150
- msgid "Post Type"
151
- msgstr "Tipo del Post"
152
-
153
- #: admin/class-social-popup-admin.php:719
154
- msgid "Post Category"
155
- msgstr "Categoría del Post"
156
-
157
- #: admin/class-social-popup-admin.php:720
158
- msgid "Post Format"
159
- msgstr "Formato del Post"
160
-
161
- #: admin/class-social-popup-admin.php:721
162
- msgid "Post Status"
163
- msgstr "Estado del Post"
164
-
165
- #: admin/class-social-popup-admin.php:722
166
- msgid "Post Taxonomy"
167
- msgstr "Taxonomía del Post"
168
-
169
- #: admin/class-social-popup-admin.php:724
170
- #: admin/class-social-popup-admin.php:725
171
- msgid "Page"
172
- msgstr "Página"
173
-
174
- #: admin/class-social-popup-admin.php:726
175
- msgid "Page Type"
176
- msgstr "Tipo de Página"
177
-
178
- #: admin/class-social-popup-admin.php:727
179
- msgid "Page Parent"
180
- msgstr "Padre de la Página"
181
-
182
- #: admin/class-social-popup-admin.php:728
183
- msgid "Page Template"
184
- msgstr "Plantilla de la Página"
185
-
186
- #: admin/class-social-popup-admin.php:730
187
- msgid "Other"
188
- msgstr "Otro"
189
-
190
- #: admin/class-social-popup-admin.php:731
191
- msgid "Referrer"
192
- msgstr "Remitente"
193
-
194
- #: admin/class-social-popup-admin.php:732
195
- msgid "Mobile Phone"
196
- msgstr "Teléfono Móvil"
197
-
198
- #: admin/class-social-popup-admin.php:733
199
- msgid "Tablet"
200
- msgstr "Tablet"
201
-
202
- #: admin/includes/class-spu-notices.php:30
203
- #, php-format
204
- msgid ""
205
- "We noticed that you have been using our plugin for a while and we would like "
206
- "to ask you a little favour. If you are happy with it and can take a minute "
207
- "please <a href=\"%s\" target=\"_blank\">leave a nice review</a> on "
208
- "WordPress. It will be a tremendous help for us!"
209
- msgstr ""
210
-
211
- #: admin/includes/class-spu-notices.php:32
212
- #, php-format
213
- msgid "<a href=\"%s\" target=\"_blank\">Leave a nice review</a>"
214
- msgstr ""
215
-
216
- #: admin/includes/class-spu-notices.php:33
217
- #, php-format
218
- msgid "<a href=\"%s\">No, thanks</a>"
219
- msgstr ""
220
-
221
- #: admin/views/metaboxes/metabox-donate.php:6
222
- msgid "If you like this plugin, consider supporting it by donating."
223
- msgstr "Si le gusta este plugin, considere soportarlo donando."
224
-
225
- #: admin/views/metaboxes/metabox-donate.php:8
226
- msgid "Donate with PayPal"
227
- msgstr "Donar con PayPal"
228
-
229
- #: admin/views/metaboxes/metabox-donate.php:10
230
- msgid "Some other ways to support this plugin"
231
- msgstr "Otras formas de soportar este plugin"
232
-
233
- #: admin/views/metaboxes/metabox-donate.php:12
234
- msgid "Leave a &#9733;&#9733;&#9733;&#9733;&#9733; review on WordPress.org"
235
- msgstr ""
236
- "Deje un &#9733;&#9733;&#9733;&#9733;&#9733; comentario en WordPress.org"
237
-
238
- #: admin/views/metaboxes/metabox-donate.php:13
239
- msgid "Write about Popups on your blog"
240
- msgstr "Escriba acerca de Popups en su blog"
241
-
242
- #: admin/views/metaboxes/metabox-donate.php:14
243
- msgid "Tweet about Popups"
244
- msgstr "Haga tweet acerca de Popups"
245
-
246
- #: admin/views/metaboxes/metabox-donate.php:15
247
- msgid "Vote \"works\" on the WordPress.org plugin page"
248
- msgstr "Vote \"funciona\" en la página del plugin de WordPress.org"
249
-
250
- #: admin/views/metaboxes/metabox-help.php:6
251
- msgid ""
252
- "You have three social shortcodes to use that will print a Facebook like, a "
253
- "Google+ Follow and a Twitter follow. Check the available options and "
254
- "<strong>configure them with your social accounts</strong>:"
255
- msgstr ""
256
- "Tiene tres códigos cortos sociales para usar que mostrarán un me gusta de "
257
- "Facebook, un seguir de Google+ y un seguir de Twitter. Chequee las opciones "
258
- "de disponibilidad y <strong>configúrelas con sus cuentas sociales</strong>:"
259
-
260
- #: admin/views/metaboxes/metabox-help.php:12
261
- msgid "View Facebook Page Options"
262
- msgstr ""
263
-
264
- #: admin/views/metaboxes/metabox-help.php:14
265
- #: admin/views/metaboxes/metabox-help.php:27
266
- msgid "Your facebook page url"
267
- msgstr "La url de su página de Facebook"
268
-
269
- #: admin/views/metaboxes/metabox-help.php:15
270
- msgid "Your page name"
271
- msgstr ""
272
-
273
- #: admin/views/metaboxes/metabox-help.php:16
274
- msgid "true|false <b>Default value:</b> true"
275
- msgstr ""
276
-
277
- #: admin/views/metaboxes/metabox-help.php:17
278
- msgid "true|false <b>Default value:</b> false"
279
- msgstr ""
280
-
281
- #: admin/views/metaboxes/metabox-help.php:25
282
- msgid "View Facebook Options"
283
- msgstr "Ver Opciones de Facebook"
284
-
285
- #: admin/views/metaboxes/metabox-help.php:28
286
- msgid "standard, box_count, button <b>Default value:</b> button_count"
287
- msgstr "standard, box_count, button <b> Valor por defecto:</b> button_count"
288
-
289
- #: admin/views/metaboxes/metabox-help.php:29
290
- #: admin/views/metaboxes/metabox-help.php:30
291
- msgid "true <b>Default value:</b> false"
292
- msgstr "true <b>Valor por defecto:</b> false"
293
-
294
- #: admin/views/metaboxes/metabox-help.php:31
295
- msgid "recommend <b>Default value:</b> like"
296
- msgstr "recommend <b>Valor por defecto:</b> like"
297
-
298
- #: admin/views/metaboxes/metabox-help.php:38
299
- msgid "View Google+ Options"
300
- msgstr "Ver Opciones de Google+"
301
-
302
- #: admin/views/metaboxes/metabox-help.php:40
303
- msgid "Your Google+ url"
304
- msgstr "Su url de Google+"
305
-
306
- #: admin/views/metaboxes/metabox-help.php:41
307
- msgid "small, standard, tall <b>Default value:</b> medium"
308
- msgstr "small, standard, tall <b>Valor por defecto:</b> medium"
309
-
310
- #: admin/views/metaboxes/metabox-help.php:42
311
- msgid "inline, none <b>Default value:</b> bubble"
312
- msgstr "inline, none <b>Valor por defecto:</b> bubble"
313
-
314
- #: admin/views/metaboxes/metabox-help.php:48
315
- msgid "View Twitter Options"
316
- msgstr "Ver Opciones de Twitter"
317
-
318
- #: admin/views/metaboxes/metabox-help.php:50
319
- msgid "Your Twitter user <b>Default chifli</b>iiii"
320
- msgstr "Su <b>chifli</b>iiii Por Defecto de su usuario de Twitter "
321
-
322
- #: admin/views/metaboxes/metabox-help.php:51
323
- msgid "false <b>Default value:</b> true"
324
- msgstr "false <b>Valor por defecto:</b> true"
325
-
326
- #: admin/views/metaboxes/metabox-help.php:52
327
- msgid "large <b>Default value:</b> \"\""
328
- msgstr "large <b>Valor por defecto:</b> \"\""
329
-
330
- #: admin/views/metaboxes/metabox-help.php:55
331
- msgid "Other available Shortcodes:"
332
- msgstr "Otros Códigos Cortos disponibles:"
333
-
334
- #: admin/views/metaboxes/metabox-help.php:60
335
- msgid "View Close shortcode Options"
336
- msgstr "Ver Opciones Cerradas de códigos cortos "
337
-
338
- #: admin/views/metaboxes/metabox-help.php:62
339
- msgid "Pass a custom class to style your button"
340
- msgstr "Pasar una clase personalizada para darle estilo a su botón"
341
-
342
- #: admin/views/metaboxes/metabox-help.php:63
343
- msgid "Button label - <b>Default value:</b> Close"
344
- msgstr "Button label - <b>Valor por defecto:</b> Close"
345
-
346
- #: admin/views/metaboxes/metabox-help.php:64
347
- msgid "left, right, center, none - <b>Default value:</b> center"
348
- msgstr "left, right, center, none - <b>Valor por defecto:</b> center"
349
-
350
- #: admin/views/metaboxes/metabox-links.php:6
351
- msgid "My name is"
352
- msgstr "Mi nombre es"
353
-
354
- #: admin/views/metaboxes/metabox-links.php:6
355
- msgid "I develop WordPress plugins and themes."
356
- msgstr "Yo desarrollo plugins y temas de WordPress."
357
-
358
- #: admin/views/metaboxes/metabox-links.php:7
359
- #, php-format
360
- msgid ""
361
- "Take a look at my <a href=\"%s\">site</a> to see my other plugins or hire "
362
- "me. Subscribe to get updates!"
363
- msgstr ""
364
- "Eche una ojeada a mi <a href=\"%s\">sitio</a> para ver mis otros plugins o "
365
- "contratarme. ¡Suscríbase para obtener actualizaciones!"
366
-
367
- #: admin/views/metaboxes/metabox-links.php:8
368
- msgid "Other plugins I built:"
369
- msgstr "Otros plugins que hago:"
370
-
371
- #: admin/views/metaboxes/metabox-links.php:10
372
- msgid "Install multiple plugins and create collections"
373
- msgstr "Instalar múltiples plugins y crear colecciones"
374
-
375
- #: admin/views/metaboxes/metabox-links.php:11
376
- msgid "Geotarget your content"
377
- msgstr ""
378
-
379
- #: admin/views/metaboxes/metabox-links.php:12
380
- msgid "Invite your network friends and import contacts"
381
- msgstr "Invitar a sus amigos de la red e importar contactos"
382
-
383
- #: admin/views/metaboxes/metabox-options.php:9
384
- msgid "Box Position"
385
- msgstr "Posición de la Caja"
386
-
387
- #: admin/views/metaboxes/metabox-options.php:12
388
- msgid "Centered"
389
- msgstr "Centrada"
390
-
391
- #: admin/views/metaboxes/metabox-options.php:13
392
- msgid "Top Left"
393
- msgstr "Arriba a la Izquierda"
394
-
395
- #: admin/views/metaboxes/metabox-options.php:14
396
- msgid "Top Right"
397
- msgstr "Arriba a la Derecha"
398
-
399
- #: admin/views/metaboxes/metabox-options.php:15
400
- msgid "Bottom Left"
401
- msgstr "Debajo a la Izquierda"
402
-
403
- #: admin/views/metaboxes/metabox-options.php:16
404
- msgid "Bottom Right"
405
- msgstr "Debajo a la Derecha"
406
-
407
- #: admin/views/metaboxes/metabox-options.php:23
408
- msgid "Trigger action"
409
- msgstr "Acción que se desencadena"
410
-
411
- #: admin/views/metaboxes/metabox-options.php:27
412
- msgid "seconds after page load"
413
- msgstr "segundos luego de la carga de la página"
414
-
415
- #: admin/views/metaboxes/metabox-options.php:28
416
- msgid "of page height"
417
- msgstr "del largo de la página"
418
-
419
- #: admin/views/metaboxes/metabox-options.php:38
420
- msgid "Auto-hide?"
421
- msgstr "¿Auto ocultar?"
422
-
423
- #: admin/views/metaboxes/metabox-options.php:40
424
- #: admin/views/metaboxes/metabox-options.php:68
425
- #: admin/views/metaboxes/metabox-options.php:76
426
- #: admin/views/metaboxes/metabox-options.php:84
427
- msgid "Yes"
428
- msgstr "Si"
429
-
430
- #: admin/views/metaboxes/metabox-options.php:41
431
- #: admin/views/metaboxes/metabox-options.php:69
432
- #: admin/views/metaboxes/metabox-options.php:77
433
- #: admin/views/metaboxes/metabox-options.php:85
434
- msgid "No"
435
- msgstr "No"
436
-
437
- #: admin/views/metaboxes/metabox-options.php:42
438
- #, php-format
439
- msgid ""
440
- "Hide box again when visitors scroll back up? Only works when Trigger action "
441
- "is set to % of page height"
442
- msgstr ""
443
- "¿Ocultar la caja nuevamente cuando los visitantes se desplazan hacia arriba? "
444
- "Solamente funciona cuando la acción Desencadenante se establece a % del "
445
- "largo de la página"
446
-
447
- #: admin/views/metaboxes/metabox-options.php:46
448
- msgid "Animation"
449
- msgstr "Animación"
450
-
451
- #: admin/views/metaboxes/metabox-options.php:49
452
- msgid "Fade In"
453
- msgstr "Entrar apareciendo"
454
-
455
- #: admin/views/metaboxes/metabox-options.php:50
456
- msgid "Slide In"
457
- msgstr "Entrar deslizándose"
458
-
459
- #: admin/views/metaboxes/metabox-options.php:53
460
- msgid "Slide will only apply when popup is on the corners"
461
- msgstr ""
462
- "El deslizado solamente se aplicará cuando el popup esté en las esquinas."
463
-
464
- #: admin/views/metaboxes/metabox-options.php:58
465
- msgid "Cookie expiration days"
466
- msgstr "Días de expiración de la cookie"
467
-
468
- #: admin/views/metaboxes/metabox-options.php:61
469
- msgid "After closing the box, how many days should it stay hidden?"
470
- msgstr "Luego de cerrar la caja, ¿cuántos días debería estar oculta?"
471
-
472
- #: admin/views/metaboxes/metabox-options.php:66
473
- msgid "Enable test mode?"
474
- msgstr " ¿Habilitar modo de prueba?"
475
-
476
- #: admin/views/metaboxes/metabox-options.php:70
477
- msgid ""
478
- "If test mode is enabled, the box will show up regardless of whether a cookie "
479
- "has been set. (To admins only)"
480
- msgstr ""
481
- "el modo de prueba está habilitado, la caja se va a mostrar no importa si la "
482
- "cookie ha sido enviada. (Para administradores solamente)"
483
-
484
- #: admin/views/metaboxes/metabox-options.php:74
485
- msgid "Close on conversion?"
486
- msgstr ""
487
-
488
- #: admin/views/metaboxes/metabox-options.php:78
489
- msgid ""
490
- "If you have a form or social shortcode, by default popup will close on "
491
- "submission/conversion"
492
- msgstr ""
493
-
494
- #: admin/views/metaboxes/metabox-options.php:82
495
- msgid "Show powered by link?"
496
- msgstr ""
497
-
498
- #: admin/views/metaboxes/metabox-options.php:86
499
- #, php-format
500
- msgid ""
501
- "Shows a \"powered by\" link below your popup. If your affiliate link is set "
502
- "in the <a href=\"%s\">settings</a>, it will be used."
503
- msgstr ""
504
-
505
- #: admin/views/metaboxes/metabox-options.php:91
506
- msgid "Appearance"
507
- msgstr "Apariencia"
508
-
509
- #: admin/views/metaboxes/metabox-options.php:95
510
- msgid "Background opacity"
511
- msgstr "Opacidad de fondo"
512
-
513
- #: admin/views/metaboxes/metabox-options.php:98
514
- msgid "Leave at 0 for no background. Max value is 1"
515
- msgstr "dejarlo en 0 para no tener fondo. El valor máx es 1"
516
-
517
- #: admin/views/metaboxes/metabox-options.php:104
518
- msgid "Background color"
519
- msgstr "Color de fondo"
520
-
521
- #: admin/views/metaboxes/metabox-options.php:108
522
- msgid "Text color"
523
- msgstr "Color de texto"
524
-
525
- #: admin/views/metaboxes/metabox-options.php:112
526
- msgid "Box width"
527
- msgstr "Ancho de la caja"
528
-
529
- #: admin/views/metaboxes/metabox-options.php:118
530
- msgid "Border color"
531
- msgstr "Color de borde"
532
-
533
- #: admin/views/metaboxes/metabox-options.php:122
534
- msgid "Border width"
535
- msgstr "Color de borde"
536
-
537
- #: admin/views/metaboxes/metabox-premium.php:16
538
- msgid ""
539
- "Take the best WordPress Popups plugin to the next level with Popups Premium "
540
- "extension."
541
- msgstr ""
542
- "Obtenga el mejor plugin de Popups de WordPress al siguiente nivel con la "
543
- "extensión Popups Premium."
544
-
545
- #: admin/views/metaboxes/metabox-premium.php:17
546
- msgid "Popups Premium Features:"
547
- msgstr "Características de Popups Premium:"
548
-
549
- #: admin/views/metaboxes/metabox-premium.php:19
550
- msgid "Beautiful optin forms for popular mail providers"
551
- msgstr ""
552
-
553
- #: admin/views/metaboxes/metabox-premium.php:20
554
- msgid "Currently supporting MailChimp, Aweber, Postmatic, Mailpoet"
555
- msgstr ""
556
-
557
- #: admin/views/metaboxes/metabox-premium.php:21
558
- msgid ""
559
- "Track impressions and Conversions of social likes and forms submissions like "
560
- "Contact Form 7, Gravity forms, etc"
561
- msgstr ""
562
-
563
- #: admin/views/metaboxes/metabox-premium.php:22
564
- msgid "Track impressions and Conversions also in Google Analytics"
565
- msgstr "Track impressions and Conversions también en Google Analytics"
566
-
567
- #: admin/views/metaboxes/metabox-premium.php:23
568
- #: admin/views/metaboxes/metabox-premium.php:25
569
- msgid "Exit Intent technology"
570
- msgstr "Salir de la tecnología de Propósito"
571
-
572
- #: admin/views/metaboxes/metabox-premium.php:24
573
- msgid "8 New animations effects"
574
- msgstr "8 efectos de nuevas animaciones"
575
-
576
- #: admin/views/metaboxes/metabox-premium.php:26
577
- msgid "New trigger methods"
578
- msgstr " Nuevos métodos de desencadenamiento"
579
-
580
- #: admin/views/metaboxes/metabox-premium.php:27
581
- msgid "Timer for auto closing"
582
- msgstr "Temporizador para auto cerrado"
583
-
584
- #: admin/views/metaboxes/metabox-premium.php:28
585
- msgid "Ability to disable close button"
586
- msgstr "Habilidad para deshabilitar el botón de cerrado"
587
-
588
- #: admin/views/metaboxes/metabox-premium.php:29
589
- msgid ""
590
- "Ability to disable Advanced close methods like esc or clicking outside of "
591
- "the popup"
592
- msgstr ""
593
- "Habilidad para deshabilitar métodos de cerrado Avanzados como esc o "
594
- "haciendo clic fuera del popup"
595
-
596
- #: admin/views/metaboxes/metabox-premium.php:30
597
- msgid "Premium support"
598
- msgstr "Soporte Premium"
599
-
600
- #: admin/views/metaboxes/metabox-premium.php:34
601
- msgid "Buy Now!"
602
- msgstr "¡Comprar Ahora!"
603
-
604
- #: admin/views/metaboxes/metabox-rules.php:19
605
- msgid "Rules"
606
- msgstr "Reglas"
607
-
608
- #: admin/views/metaboxes/metabox-rules.php:20
609
- msgid "Create a set of rules to determine where the popup will show"
610
- msgstr ""
611
- "Crear un grupo de reglas para determinar dónde el popup se va a mostrar"
612
-
613
- #: admin/views/metaboxes/metabox-rules.php:31
614
- msgid "Show this popup if"
615
- msgstr "Mostrar este popup si"
616
-
617
- #: admin/views/metaboxes/metabox-rules.php:61
618
- msgid "is equal to"
619
- msgstr "es igual a"
620
-
621
- #: admin/views/metaboxes/metabox-rules.php:62
622
- msgid "is not equal to"
623
- msgstr "no es igual a "
624
-
625
- #: admin/views/metaboxes/metabox-rules.php:93
626
- msgid "and"
627
- msgstr "y"
628
-
629
- #: admin/views/metaboxes/metabox-rules.php:108
630
- msgid "Add rule group"
631
- msgstr "Adicionar grupo de regla"
632
-
633
- #: admin/views/metaboxes/metabox-support.php:6
634
- #, php-format
635
- msgid "You are using Popups plugin v%s"
636
- msgstr "Usted está usando el plugin Popups v%s"
637
-
638
- #: admin/views/metaboxes/metabox-support.php:7
639
- #, php-format
640
- msgid ""
641
- "If you need support please go to the WordPress.org <a href=\"%s\">support "
642
- "forums</a>"
643
- msgstr ""
644
- "Si usted necesita soporte por favor vaya a <a href=\"%s\">los foros de "
645
- "soporte</a> de WordPress.org"
646
-
647
- #: admin/views/settings-page.php:17
648
- msgid "Affiliate link"
649
- msgstr ""
650
-
651
- #: admin/views/settings-page.php:20
652
- #, php-format
653
- msgid ""
654
- "You can earn money by promoting the plugin! Join <a href=\"%s\">our "
655
- "affiliate program</a> and paste your affiliate link here to earn 35&#37; in "
656
- "commissions . Once entered, it will replace the default \"Powered by\" on "
657
- "the popups."
658
- msgstr ""
659
-
660
- #: admin/views/settings-page.php:24
661
- msgid "Ajax mode?"
662
- msgstr "¿Modo Ajax?"
663
-
664
- #: admin/views/settings-page.php:27
665
- msgid ""
666
- "Load popups using ajax. Compatible with cache plugins, but might not work "
667
- "with all plugins"
668
- msgstr ""
669
- "Cargar popups usando ajax. Compatible con plugins de caché, pero puede no "
670
- "funcionar con todos los plugins"
671
-
672
- #: admin/views/settings-page.php:32
673
- msgid "Enable Debug mode?"
674
- msgstr "¿Habilitar modo Debug?"
675
-
676
- #: admin/views/settings-page.php:35
677
- msgid "Will use uncompressed js"
678
- msgstr "Va a usar js descomprimido"
679
-
680
- #: admin/views/settings-page.php:40
681
- msgid "Enable safe mode?"
682
- msgstr "¿Habilitar modo seguro?"
683
-
684
- #: admin/views/settings-page.php:43
685
- msgid "Will move all popups to top of the screen."
686
- msgstr "Moverá todos los popups hacia arriba de la pantalla."
687
-
688
- #: admin/views/settings-page.php:48
689
- msgid "Remove shortcodes style"
690
- msgstr "Eliminar el estilo de los códigos cortos"
691
-
692
- #: admin/views/settings-page.php:51
693
- msgid ""
694
- "By default the plugin will apply some style to shortcodes. Check here if you "
695
- "want to manually style them"
696
- msgstr ""
697
- "Por defecto el plugin aplicará algún estilo a códigos cortos. Seleccione "
698
- "aquí si quiere aplicarle el estilo manualmente"
699
-
700
- #: admin/views/settings-page.php:56
701
- msgid "Unload Facebook javascript"
702
- msgstr "No cargar el javascript de Facebook"
703
-
704
- #: admin/views/settings-page.php:59
705
- msgid "If you use your own Facebook script, check this"
706
- msgstr "Si usted usa su propio script de Facebook, seleccione aquí"
707
-
708
- #: admin/views/settings-page.php:64
709
- msgid "Unload Google javascript"
710
- msgstr "No cargar javascript de Google"
711
-
712
- #: admin/views/settings-page.php:67
713
- msgid "If you use your own Google script, check this"
714
- msgstr "Si usted usa su propio script de Google, seleccione aquí"
715
-
716
- #: admin/views/settings-page.php:72
717
- msgid "Unload Twitter javascript"
718
- msgstr "No cargar javascript de Twitter"
719
-
720
- #: admin/views/settings-page.php:75
721
- msgid "If you use your own Twitter script, check this"
722
- msgstr "Si usted usa su propio script de Twitter, seleccione aquí"
723
-
724
- #: admin/views/settings-page.php:80
725
- msgid "Save settings"
726
- msgstr "Salvar ajustes"
727
-
728
- #: includes/class-spu-helper.php:133
729
- msgid "All Pages"
730
- msgstr "Todas las Páginas"
731
-
732
- #: includes/class-spu-helper.php:134
733
- msgid "Front Page"
734
- msgstr "Página Frontal"
735
-
736
- #: includes/class-spu-helper.php:135
737
- msgid "Posts Page"
738
- msgstr "Página de Posts"
739
-
740
- #: includes/class-spu-helper.php:136
741
- msgid "Category Page"
742
- msgstr "Página de Categoría"
743
-
744
- #: includes/class-spu-helper.php:137
745
- msgid "Archives Page"
746
- msgstr "Página de Archivos"
747
-
748
- #: includes/class-spu-helper.php:138
749
- msgid "Top Level Page (parent of 0)"
750
- msgstr "Página de Nivel Superior (padre de 0)"
751
-
752
- #: includes/class-spu-helper.php:139
753
- msgid "Parent Page (has children)"
754
- msgstr "Página Padre (tiene hijos)"
755
-
756
- #: includes/class-spu-helper.php:140
757
- msgid "Child Page (has parent)"
758
- msgstr "Página hija (tiene padre)"
759
-
760
- #: includes/class-spu-helper.php:148
761
- msgid "Default Template"
762
- msgstr "Plantilla Por Defecto"
763
-
764
- #: includes/class-spu-helper.php:221
765
- msgid "Publish"
766
- msgstr "Publicar"
767
-
768
- #: includes/class-spu-helper.php:222
769
- msgid "Pending Review"
770
- msgstr "Revisión Pendiente"
771
-
772
- #: includes/class-spu-helper.php:223
773
- msgid "Draft"
774
- msgstr "Borrador"
775
-
776
- #: includes/class-spu-helper.php:224
777
- msgid "Future"
778
- msgstr "Futuro"
779
-
780
- #: includes/class-spu-helper.php:225
781
- msgid "Private"
782
- msgstr "Privado"
783
-
784
- #: includes/class-spu-helper.php:226
785
- msgid "Revision"
786
- msgstr "Revisión"
787
-
788
- #: includes/class-spu-helper.php:227
789
- msgid "Trash"
790
- msgstr "Papelera"
791
-
792
- #: includes/class-spu-helper.php:240
793
- msgid "Super Admin"
794
- msgstr "Super Admin"
795
-
796
- #: includes/class-spu-helper.php:260
797
- msgid "True"
798
- msgstr "Verdadero"
799
-
800
- #~ msgid "What's new"
801
- #~ msgstr "Qué hay de nuevo"
802
-
803
- #~ msgid "credits"
804
- #~ msgstr "créditos"
805
-
806
- #~ msgid "Like Facebook like box but for Twitter"
807
- #~ msgstr "Caja de me gusta de Facebook pero para Twitter"
808
-
809
- #~ msgid ""
810
- #~ "Track impressions and Conversions of social likes/follow and forms "
811
- #~ "submissions like Contact Form 7, Gravity forms, etc"
812
- #~ msgstr ""
813
- #~ "Track impressions and Conversions de likes/follow sociales y envíos de "
814
- #~ "formas como Contact Form 7, Gravity forms, etc"
1
+ # Copyright (C) 2013 TODO
2
+ # This file is distributed under the same license as the TODO package.
3
+ msgid ""
4
+ msgstr ""
5
+ "Project-Id-Version: Popups\n"
6
+ "Report-Msgid-Bugs-To: http://wordpress.org/plugins/plugin-name\n"
7
+ "POT-Creation-Date: 2015-06-14 00:02-0300\n"
8
+ "PO-Revision-Date: 2015-10-01 15:15-0300\n"
9
+ "Last-Translator: Damian Logghe <info@timersys.com>\n"
10
+ "Language-Team: Timersys <info@timersys.com>\n"
11
+ "Language: es_ES\n"
12
+ "MIME-Version: 1.0\n"
13
+ "Content-Type: text/plain; charset=UTF-8\n"
14
+ "Content-Transfer-Encoding: 8bit\n"
15
+ "X-Generator: Poedit 1.7.4\n"
16
+ "X-Poedit-KeywordsList: __;_e;_n;_x;esc_html_e;esc_html__;esc_attr_e;"
17
+ "esc_attr__;_ex:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2;_x:1,2c;_n:1,2\n"
18
+ "X-Poedit-Basepath: ../\n"
19
+ "Plural-Forms: nplurals=2; plural=n != 1;\n"
20
+ "X-Poedit-SearchPath-0: .\n"
21
+
22
+ #: admin/class-social-popup-admin.php:154
23
+ msgctxt "post type singular name"
24
+ msgid "Popups"
25
+ msgstr "Popups [postear nombre singular del tipo]"
26
+
27
+ #: admin/class-social-popup-admin.php:155
28
+ msgctxt "admin menu"
29
+ msgid "Popups"
30
+ msgstr "Popups [menú del admin]"
31
+
32
+ #: admin/class-social-popup-admin.php:156
33
+ msgctxt "add new on admin bar"
34
+ msgid "Popups"
35
+ msgstr "Popups [adicionar nuevo en la barra de admin]"
36
+
37
+ #: admin/class-social-popup-admin.php:157
38
+ msgctxt "Popups"
39
+ msgid "Add New"
40
+ msgstr "Adicionar nuevo [Popups]"
41
+
42
+ #: admin/class-social-popup-admin.php:158
43
+ msgid "Add New Popups"
44
+ msgstr "Adicionar Nuevo Popups"
45
+
46
+ #: admin/class-social-popup-admin.php:159
47
+ msgid "New Popups"
48
+ msgstr "Nuevo Popups"
49
+
50
+ #: admin/class-social-popup-admin.php:160
51
+ msgid "Edit Popups"
52
+ msgstr "Editar Popups"
53
+
54
+ #: admin/class-social-popup-admin.php:161
55
+ msgid "View Popups"
56
+ msgstr "Ver Popups"
57
+
58
+ #: admin/class-social-popup-admin.php:162
59
+ msgid "All Popups"
60
+ msgstr "Todos los Popups"
61
+
62
+ #: admin/class-social-popup-admin.php:163
63
+ msgid "Search Popups"
64
+ msgstr "Buscar Popups"
65
+
66
+ #: admin/class-social-popup-admin.php:164
67
+ msgid "Parent Popups:"
68
+ msgstr "Popups Padre:"
69
+
70
+ #: admin/class-social-popup-admin.php:165
71
+ msgid "No Popups found."
72
+ msgstr "No se encontraron Popups."
73
+
74
+ #: admin/class-social-popup-admin.php:166
75
+ msgid "No Popups found in Trash."
76
+ msgstr "No se encontraron Popups en la Papelera."
77
+
78
+ #: admin/class-social-popup-admin.php:255
79
+ msgid "Popups Premium"
80
+ msgstr "Popups Premium"
81
+
82
+ #: admin/class-social-popup-admin.php:266
83
+ msgid "PopUp Shortcodes"
84
+ msgstr "Códigos Cortos del PopUp"
85
+
86
+ #: admin/class-social-popup-admin.php:275
87
+ msgid "PopUp Display Rules"
88
+ msgstr "Reglas de Visualización del PopUp"
89
+
90
+ #: admin/class-social-popup-admin.php:284
91
+ msgid "Display Options"
92
+ msgstr "Opciones de Visualización"
93
+
94
+ #: admin/class-social-popup-admin.php:293
95
+ msgid "Need support?"
96
+ msgstr "¿Necesita soporte?"
97
+
98
+ #: admin/class-social-popup-admin.php:301
99
+ msgid "Donate & support"
100
+ msgstr "Donar y soporte"
101
+
102
+ #: admin/class-social-popup-admin.php:309
103
+ msgid "About the developer"
104
+ msgstr "Acerca del desarrollador"
105
+
106
+ #: admin/class-social-popup-admin.php:557
107
+ #: admin/views/metaboxes/metabox-rules.php:33
108
+ #: admin/views/metaboxes/metabox-rules.php:106
109
+ msgid "or"
110
+ msgstr "o"
111
+
112
+ #: admin/class-social-popup-admin.php:584
113
+ msgid "Add a Popup"
114
+ msgstr "Adicionar un Popup"
115
+
116
+ #: admin/class-social-popup-admin.php:708
117
+ msgid "User"
118
+ msgstr "Usuario"
119
+
120
+ #: admin/class-social-popup-admin.php:709
121
+ msgid "User role"
122
+ msgstr "Rol de Usuario"
123
+
124
+ #: admin/class-social-popup-admin.php:710
125
+ msgid "User is logged"
126
+ msgstr "El usuario está autenticado"
127
+
128
+ #: admin/class-social-popup-admin.php:711
129
+ msgid "User never left a comment"
130
+ msgstr "El usuario nunca dejó un comentario"
131
+
132
+ #: admin/class-social-popup-admin.php:712
133
+ msgid "User came via a search engine"
134
+ msgstr "El usuario vino via un motor de búsqueda"
135
+
136
+ #: admin/class-social-popup-admin.php:713
137
+ msgid "User did not arrive via another page on your site"
138
+ msgstr "El usuario no llegó via ninguna otra página de su sitio"
139
+
140
+ #: admin/class-social-popup-admin.php:715
141
+ #: admin/class-social-popup-admin.php:716
142
+ msgid "Post"
143
+ msgstr "Post"
144
+
145
+ #: admin/class-social-popup-admin.php:717
146
+ msgid "Post ID"
147
+ msgstr "ID del Post"
148
+
149
+ #: admin/class-social-popup-admin.php:718
150
+ msgid "Post Type"
151
+ msgstr "Tipo del Post"
152
+
153
+ #: admin/class-social-popup-admin.php:719
154
+ msgid "Post Category"
155
+ msgstr "Categoría del Post"
156
+
157
+ #: admin/class-social-popup-admin.php:720
158
+ msgid "Post Format"
159
+ msgstr "Formato del Post"
160
+
161
+ #: admin/class-social-popup-admin.php:721
162
+ msgid "Post Status"
163
+ msgstr "Estado del Post"
164
+
165
+ #: admin/class-social-popup-admin.php:722
166
+ msgid "Post Taxonomy"
167
+ msgstr "Taxonomía del Post"
168
+
169
+ #: admin/class-social-popup-admin.php:724
170
+ #: admin/class-social-popup-admin.php:725
171
+ msgid "Page"
172
+ msgstr "Página"
173
+
174
+ #: admin/class-social-popup-admin.php:726
175
+ msgid "Page Type"
176
+ msgstr "Tipo de Página"
177
+
178
+ #: admin/class-social-popup-admin.php:727
179
+ msgid "Page Parent"
180
+ msgstr "Padre de la Página"
181
+
182
+ #: admin/class-social-popup-admin.php:728
183
+ msgid "Page Template"
184
+ msgstr "Plantilla de la Página"
185
+
186
+ #: admin/class-social-popup-admin.php:730
187
+ msgid "Other"
188
+ msgstr "Otro"
189
+
190
+ #: admin/class-social-popup-admin.php:731
191
+ msgid "Referrer"
192
+ msgstr "Remitente"
193
+
194
+ #: admin/class-social-popup-admin.php:732
195
+ msgid "Mobile Phone"
196
+ msgstr "Teléfono Móvil"
197
+
198
+ #: admin/class-social-popup-admin.php:733
199
+ msgid "Tablet"
200
+ msgstr "Tablet"
201
+
202
+ #: admin/includes/class-spu-notices.php:30
203
+ #, php-format
204
+ msgid ""
205
+ "We noticed that you have been using our plugin for a while and we would like "
206
+ "to ask you a little favour. If you are happy with it and can take a minute "
207
+ "please <a href=\"%s\" target=\"_blank\">leave a nice review</a> on "
208
+ "WordPress. It will be a tremendous help for us!"
209
+ msgstr ""
210
+
211
+ #: admin/includes/class-spu-notices.php:32
212
+ #, php-format
213
+ msgid "<a href=\"%s\" target=\"_blank\">Leave a nice review</a>"
214
+ msgstr ""
215
+
216
+ #: admin/includes/class-spu-notices.php:33
217
+ #, php-format
218
+ msgid "<a href=\"%s\">No, thanks</a>"
219
+ msgstr ""
220
+
221
+ #: admin/views/metaboxes/metabox-donate.php:6
222
+ msgid "If you like this plugin, consider supporting it by donating."
223
+ msgstr "Si le gusta este plugin, considere soportarlo donando."
224
+
225
+ #: admin/views/metaboxes/metabox-donate.php:8
226
+ msgid "Donate with PayPal"
227
+ msgstr "Donar con PayPal"
228
+
229
+ #: admin/views/metaboxes/metabox-donate.php:10
230
+ msgid "Some other ways to support this plugin"
231
+ msgstr "Otras formas de soportar este plugin"
232
+
233
+ #: admin/views/metaboxes/metabox-donate.php:12
234
+ msgid "Leave a &#9733;&#9733;&#9733;&#9733;&#9733; review on WordPress.org"
235
+ msgstr ""
236
+ "Deje un &#9733;&#9733;&#9733;&#9733;&#9733; comentario en WordPress.org"
237
+
238
+ #: admin/views/metaboxes/metabox-donate.php:13
239
+ msgid "Write about Popups on your blog"
240
+ msgstr "Escriba acerca de Popups en su blog"
241
+
242
+ #: admin/views/metaboxes/metabox-donate.php:14
243
+ msgid "Tweet about Popups"
244
+ msgstr "Haga tweet acerca de Popups"
245
+
246
+ #: admin/views/metaboxes/metabox-donate.php:15
247
+ msgid "Vote \"works\" on the WordPress.org plugin page"
248
+ msgstr "Vote \"funciona\" en la página del plugin de WordPress.org"
249
+
250
+ #: admin/views/metaboxes/metabox-help.php:6
251
+ msgid ""
252
+ "You have three social shortcodes to use that will print a Facebook like, a "
253
+ "Google+ Follow and a Twitter follow. Check the available options and "
254
+ "<strong>configure them with your social accounts</strong>:"
255
+ msgstr ""
256
+ "Tiene tres códigos cortos sociales para usar que mostrarán un me gusta de "
257
+ "Facebook, un seguir de Google+ y un seguir de Twitter. Chequee las opciones "
258
+ "de disponibilidad y <strong>configúrelas con sus cuentas sociales</strong>:"
259
+
260
+ #: admin/views/metaboxes/metabox-help.php:12
261
+ msgid "View Facebook Page Options"
262
+ msgstr ""
263
+
264
+ #: admin/views/metaboxes/metabox-help.php:14
265
+ #: admin/views/metaboxes/metabox-help.php:27
266
+ msgid "Your facebook page url"
267
+ msgstr "La url de su página de Facebook"
268
+
269
+ #: admin/views/metaboxes/metabox-help.php:15
270
+ msgid "Your page name"
271
+ msgstr ""
272
+
273
+ #: admin/views/metaboxes/metabox-help.php:16
274
+ msgid "true|false <b>Default value:</b> true"
275
+ msgstr ""
276
+
277
+ #: admin/views/metaboxes/metabox-help.php:17
278
+ msgid "true|false <b>Default value:</b> false"
279
+ msgstr ""
280
+
281
+ #: admin/views/metaboxes/metabox-help.php:25
282
+ msgid "View Facebook Options"
283
+ msgstr "Ver Opciones de Facebook"
284
+
285
+ #: admin/views/metaboxes/metabox-help.php:28
286
+ msgid "standard, box_count, button <b>Default value:</b> button_count"
287
+ msgstr "standard, box_count, button <b> Valor por defecto:</b> button_count"
288
+
289
+ #: admin/views/metaboxes/metabox-help.php:29
290
+ #: admin/views/metaboxes/metabox-help.php:30
291
+ msgid "true <b>Default value:</b> false"
292
+ msgstr "true <b>Valor por defecto:</b> false"
293
+
294
+ #: admin/views/metaboxes/metabox-help.php:31
295
+ msgid "recommend <b>Default value:</b> like"
296
+ msgstr "recommend <b>Valor por defecto:</b> like"
297
+
298
+ #: admin/views/metaboxes/metabox-help.php:38
299
+ msgid "View Google+ Options"
300
+ msgstr "Ver Opciones de Google+"
301
+
302
+ #: admin/views/metaboxes/metabox-help.php:40
303
+ msgid "Your Google+ url"
304
+ msgstr "Su url de Google+"
305
+
306
+ #: admin/views/metaboxes/metabox-help.php:41
307
+ msgid "small, standard, tall <b>Default value:</b> medium"
308
+ msgstr "small, standard, tall <b>Valor por defecto:</b> medium"
309
+
310
+ #: admin/views/metaboxes/metabox-help.php:42
311
+ msgid "inline, none <b>Default value:</b> bubble"
312
+ msgstr "inline, none <b>Valor por defecto:</b> bubble"
313
+
314
+ #: admin/views/metaboxes/metabox-help.php:48
315
+ msgid "View Twitter Options"
316
+ msgstr "Ver Opciones de Twitter"
317
+
318
+ #: admin/views/metaboxes/metabox-help.php:50
319
+ msgid "Your Twitter user <b>Default chifli</b>iiii"
320
+ msgstr "Su <b>chifli</b>iiii Por Defecto de su usuario de Twitter "
321
+
322
+ #: admin/views/metaboxes/metabox-help.php:51
323
+ msgid "false <b>Default value:</b> true"
324
+ msgstr "false <b>Valor por defecto:</b> true"
325
+
326
+ #: admin/views/metaboxes/metabox-help.php:52
327
+ msgid "large <b>Default value:</b> \"\""
328
+ msgstr "large <b>Valor por defecto:</b> \"\""
329
+
330
+ #: admin/views/metaboxes/metabox-help.php:55
331
+ msgid "Other available Shortcodes:"
332
+ msgstr "Otros Códigos Cortos disponibles:"
333
+
334
+ #: admin/views/metaboxes/metabox-help.php:60
335
+ msgid "View Close shortcode Options"
336
+ msgstr "Ver Opciones Cerradas de códigos cortos "
337
+
338
+ #: admin/views/metaboxes/metabox-help.php:62
339
+ msgid "Pass a custom class to style your button"
340
+ msgstr "Pasar una clase personalizada para darle estilo a su botón"
341
+
342
+ #: admin/views/metaboxes/metabox-help.php:63
343
+ msgid "Button label - <b>Default value:</b> Close"
344
+ msgstr "Button label - <b>Valor por defecto:</b> Close"
345
+
346
+ #: admin/views/metaboxes/metabox-help.php:64
347
+ msgid "left, right, center, none - <b>Default value:</b> center"
348
+ msgstr "left, right, center, none - <b>Valor por defecto:</b> center"
349
+
350
+ #: admin/views/metaboxes/metabox-links.php:6
351
+ msgid "My name is"
352
+ msgstr "Mi nombre es"
353
+
354
+ #: admin/views/metaboxes/metabox-links.php:6
355
+ msgid "I develop WordPress plugins and themes."
356
+ msgstr "Yo desarrollo plugins y temas de WordPress."
357
+
358
+ #: admin/views/metaboxes/metabox-links.php:7
359
+ #, php-format
360
+ msgid ""
361
+ "Take a look at my <a href=\"%s\">site</a> to see my other plugins or hire "
362
+ "me. Subscribe to get updates!"
363
+ msgstr ""
364
+ "Eche una ojeada a mi <a href=\"%s\">sitio</a> para ver mis otros plugins o "
365
+ "contratarme. ¡Suscríbase para obtener actualizaciones!"
366
+
367
+ #: admin/views/metaboxes/metabox-links.php:8
368
+ msgid "Other plugins I built:"
369
+ msgstr "Otros plugins que hago:"
370
+
371
+ #: admin/views/metaboxes/metabox-links.php:10
372
+ msgid "Install multiple plugins and create collections"
373
+ msgstr "Instalar múltiples plugins y crear colecciones"
374
+
375
+ #: admin/views/metaboxes/metabox-links.php:11
376
+ msgid "Geotarget your content"
377
+ msgstr ""
378
+
379
+ #: admin/views/metaboxes/metabox-links.php:12
380
+ msgid "Invite your network friends and import contacts"
381
+ msgstr "Invitar a sus amigos de la red e importar contactos"
382
+
383
+ #: admin/views/metaboxes/metabox-options.php:9
384
+ msgid "Box Position"
385
+ msgstr "Posición de la Caja"
386
+
387
+ #: admin/views/metaboxes/metabox-options.php:12
388
+ msgid "Centered"
389
+ msgstr "Centrada"
390
+
391
+ #: admin/views/metaboxes/metabox-options.php:13
392
+ msgid "Top Left"
393
+ msgstr "Arriba a la Izquierda"
394
+
395
+ #: admin/views/metaboxes/metabox-options.php:14
396
+ msgid "Top Right"
397
+ msgstr "Arriba a la Derecha"
398
+
399
+ #: admin/views/metaboxes/metabox-options.php:15
400
+ msgid "Bottom Left"
401
+ msgstr "Debajo a la Izquierda"
402
+
403
+ #: admin/views/metaboxes/metabox-options.php:16
404
+ msgid "Bottom Right"
405
+ msgstr "Debajo a la Derecha"
406
+
407
+ #: admin/views/metaboxes/metabox-options.php:23
408
+ msgid "Trigger action"
409
+ msgstr "Acción que se desencadena"
410
+
411
+ #: admin/views/metaboxes/metabox-options.php:27
412
+ msgid "seconds after page load"
413
+ msgstr "segundos luego de la carga de la página"
414
+
415
+ #: admin/views/metaboxes/metabox-options.php:28
416
+ msgid "of page height"
417
+ msgstr "del largo de la página"
418
+
419
+ #: admin/views/metaboxes/metabox-options.php:38
420
+ msgid "Auto-hide?"
421
+ msgstr "¿Auto ocultar?"
422
+
423
+ #: admin/views/metaboxes/metabox-options.php:40
424
+ #: admin/views/metaboxes/metabox-options.php:68
425
+ #: admin/views/metaboxes/metabox-options.php:76
426
+ #: admin/views/metaboxes/metabox-options.php:84
427
+ msgid "Yes"
428
+ msgstr "Si"
429
+
430
+ #: admin/views/metaboxes/metabox-options.php:41
431
+ #: admin/views/metaboxes/metabox-options.php:69
432
+ #: admin/views/metaboxes/metabox-options.php:77
433
+ #: admin/views/metaboxes/metabox-options.php:85
434
+ msgid "No"
435
+ msgstr "No"
436
+
437
+ #: admin/views/metaboxes/metabox-options.php:42
438
+ #, php-format
439
+ msgid ""
440
+ "Hide box again when visitors scroll back up? Only works when Trigger action "
441
+ "is set to % of page height"
442
+ msgstr ""
443
+ "¿Ocultar la caja nuevamente cuando los visitantes se desplazan hacia arriba? "
444
+ "Solamente funciona cuando la acción Desencadenante se establece a % del "
445
+ "largo de la página"
446
+
447
+ #: admin/views/metaboxes/metabox-options.php:46
448
+ msgid "Animation"
449
+ msgstr "Animación"
450
+
451
+ #: admin/views/metaboxes/metabox-options.php:49
452
+ msgid "Fade In"
453
+ msgstr "Entrar apareciendo"
454
+
455
+ #: admin/views/metaboxes/metabox-options.php:50
456
+ msgid "Slide In"
457
+ msgstr "Entrar deslizándose"
458
+
459
+ #: admin/views/metaboxes/metabox-options.php:53
460
+ msgid "Slide will only apply when popup is on the corners"
461
+ msgstr ""
462
+ "El deslizado solamente se aplicará cuando el popup esté en las esquinas."
463
+
464
+ #: admin/views/metaboxes/metabox-options.php:58
465
+ msgid "Cookie expiration days"
466
+ msgstr "Días de expiración de la cookie"
467
+
468
+ #: admin/views/metaboxes/metabox-options.php:61
469
+ msgid "After closing the box, how many days should it stay hidden?"
470
+ msgstr "Luego de cerrar la caja, ¿cuántos días debería estar oculta?"
471
+
472
+ #: admin/views/metaboxes/metabox-options.php:66
473
+ msgid "Enable test mode?"
474
+ msgstr " ¿Habilitar modo de prueba?"
475
+
476
+ #: admin/views/metaboxes/metabox-options.php:70
477
+ msgid ""
478
+ "If test mode is enabled, the box will show up regardless of whether a cookie "
479
+ "has been set. (To admins only)"
480
+ msgstr ""
481
+ "el modo de prueba está habilitado, la caja se va a mostrar no importa si la "
482
+ "cookie ha sido enviada. (Para administradores solamente)"
483
+
484
+ #: admin/views/metaboxes/metabox-options.php:74
485
+ msgid "Close on conversion?"
486
+ msgstr ""
487
+
488
+ #: admin/views/metaboxes/metabox-options.php:78
489
+ msgid ""
490
+ "If you have a form or social shortcode, by default popup will close on "
491
+ "submission/conversion"
492
+ msgstr ""
493
+
494
+ #: admin/views/metaboxes/metabox-options.php:82
495
+ msgid "Show powered by link?"
496
+ msgstr ""
497
+
498
+ #: admin/views/metaboxes/metabox-options.php:86
499
+ #, php-format
500
+ msgid ""
501
+ "Shows a \"powered by\" link below your popup. If your affiliate link is set "
502
+ "in the <a href=\"%s\">settings</a>, it will be used."
503
+ msgstr ""
504
+
505
+ #: admin/views/metaboxes/metabox-options.php:91
506
+ msgid "Appearance"
507
+ msgstr "Apariencia"
508
+
509
+ #: admin/views/metaboxes/metabox-options.php:95
510
+ msgid "Background opacity"
511
+ msgstr "Opacidad de fondo"
512
+
513
+ #: admin/views/metaboxes/metabox-options.php:98
514
+ msgid "Leave at 0 for no background. Max value is 1"
515
+ msgstr "dejarlo en 0 para no tener fondo. El valor máx es 1"
516
+
517
+ #: admin/views/metaboxes/metabox-options.php:104
518
+ msgid "Background color"
519
+ msgstr "Color de fondo"
520
+
521
+ #: admin/views/metaboxes/metabox-options.php:108
522
+ msgid "Text color"
523
+ msgstr "Color de texto"
524
+
525
+ #: admin/views/metaboxes/metabox-options.php:112
526
+ msgid "Box width"
527
+ msgstr "Ancho de la caja"
528
+
529
+ #: admin/views/metaboxes/metabox-options.php:118
530
+ msgid "Border color"
531
+ msgstr "Color de borde"
532
+
533
+ #: admin/views/metaboxes/metabox-options.php:122
534
+ msgid "Border width"
535
+ msgstr "Color de borde"
536
+
537
+ #: admin/views/metaboxes/metabox-premium.php:16
538
+ msgid ""
539
+ "Take the best WordPress Popups plugin to the next level with Popups Premium "
540
+ "extension."
541
+ msgstr ""
542
+ "Obtenga el mejor plugin de Popups de WordPress al siguiente nivel con la "
543
+ "extensión Popups Premium."
544
+
545
+ #: admin/views/metaboxes/metabox-premium.php:17
546
+ msgid "Popups Premium Features:"
547
+ msgstr "Características de Popups Premium:"
548
+
549
+ #: admin/views/metaboxes/metabox-premium.php:19
550
+ msgid "Beautiful optin forms for popular mail providers"
551
+ msgstr ""
552
+
553
+ #: admin/views/metaboxes/metabox-premium.php:20
554
+ msgid "Currently supporting MailChimp, Aweber, Postmatic, Mailpoet"
555
+ msgstr ""
556
+
557
+ #: admin/views/metaboxes/metabox-premium.php:21
558
+ msgid ""
559
+ "Track impressions and Conversions of social likes and forms submissions like "
560
+ "Contact Form 7, Gravity forms, etc"
561
+ msgstr ""
562
+
563
+ #: admin/views/metaboxes/metabox-premium.php:22
564
+ msgid "Track impressions and Conversions also in Google Analytics"
565
+ msgstr "Track impressions and Conversions también en Google Analytics"
566
+
567
+ #: admin/views/metaboxes/metabox-premium.php:23
568
+ #: admin/views/metaboxes/metabox-premium.php:25
569
+ msgid "Exit Intent technology"
570
+ msgstr "Salir de la tecnología de Propósito"
571
+
572
+ #: admin/views/metaboxes/metabox-premium.php:24
573
+ msgid "8 New animations effects"
574
+ msgstr "8 efectos de nuevas animaciones"
575
+
576
+ #: admin/views/metaboxes/metabox-premium.php:26
577
+ msgid "New trigger methods"
578
+ msgstr " Nuevos métodos de desencadenamiento"
579
+
580
+ #: admin/views/metaboxes/metabox-premium.php:27
581
+ msgid "Timer for auto closing"
582
+ msgstr "Temporizador para auto cerrado"
583
+
584
+ #: admin/views/metaboxes/metabox-premium.php:28
585
+ msgid "Ability to disable close button"
586
+ msgstr "Habilidad para deshabilitar el botón de cerrado"
587
+
588
+ #: admin/views/metaboxes/metabox-premium.php:29
589
+ msgid ""
590
+ "Ability to disable Advanced close methods like esc or clicking outside of "
591
+ "the popup"
592
+ msgstr ""
593
+ "Habilidad para deshabilitar métodos de cerrado Avanzados como esc o "
594
+ "haciendo clic fuera del popup"
595
+
596
+ #: admin/views/metaboxes/metabox-premium.php:30
597
+ msgid "Premium support"
598
+ msgstr "Soporte Premium"
599
+
600
+ #: admin/views/metaboxes/metabox-premium.php:34
601
+ msgid "Buy Now!"
602
+ msgstr "¡Comprar Ahora!"
603
+
604
+ #: admin/views/metaboxes/metabox-rules.php:19
605
+ msgid "Rules"
606
+ msgstr "Reglas"
607
+
608
+ #: admin/views/metaboxes/metabox-rules.php:20
609
+ msgid "Create a set of rules to determine where the popup will show"
610
+ msgstr ""
611
+ "Crear un grupo de reglas para determinar dónde el popup se va a mostrar"
612
+
613
+ #: admin/views/metaboxes/metabox-rules.php:31
614
+ msgid "Show this popup if"
615
+ msgstr "Mostrar este popup si"
616
+
617
+ #: admin/views/metaboxes/metabox-rules.php:61
618
+ msgid "is equal to"
619
+ msgstr "es igual a"
620
+
621
+ #: admin/views/metaboxes/metabox-rules.php:62
622
+ msgid "is not equal to"
623
+ msgstr "no es igual a "
624
+
625
+ #: admin/views/metaboxes/metabox-rules.php:93
626
+ msgid "and"
627
+ msgstr "y"
628
+
629
+ #: admin/views/metaboxes/metabox-rules.php:108
630
+ msgid "Add rule group"
631
+ msgstr "Adicionar grupo de regla"
632
+
633
+ #: admin/views/metaboxes/metabox-support.php:6
634
+ #, php-format
635
+ msgid "You are using Popups plugin v%s"
636
+ msgstr "Usted está usando el plugin Popups v%s"
637
+
638
+ #: admin/views/metaboxes/metabox-support.php:7
639
+ #, php-format
640
+ msgid ""
641
+ "If you need support please go to the WordPress.org <a href=\"%s\">support "
642
+ "forums</a>"
643
+ msgstr ""
644
+ "Si usted necesita soporte por favor vaya a <a href=\"%s\">los foros de "
645
+ "soporte</a> de WordPress.org"
646
+
647
+ #: admin/views/settings-page.php:17
648
+ msgid "Affiliate link"
649
+ msgstr ""
650
+
651
+ #: admin/views/settings-page.php:20
652
+ #, php-format
653
+ msgid ""
654
+ "You can earn money by promoting the plugin! Join <a href=\"%s\">our "
655
+ "affiliate program</a> and paste your affiliate link here to earn 35&#37; in "
656
+ "commissions . Once entered, it will replace the default \"Powered by\" on "
657
+ "the popups."
658
+ msgstr ""
659
+
660
+ #: admin/views/settings-page.php:24
661
+ msgid "Ajax mode?"
662
+ msgstr "¿Modo Ajax?"
663
+
664
+ #: admin/views/settings-page.php:27
665
+ msgid ""
666
+ "Load popups using ajax. Compatible with cache plugins, but might not work "
667
+ "with all plugins"
668
+ msgstr ""
669
+ "Cargar popups usando ajax. Compatible con plugins de caché, pero puede no "
670
+ "funcionar con todos los plugins"
671
+
672
+ #: admin/views/settings-page.php:32
673
+ msgid "Enable Debug mode?"
674
+ msgstr "¿Habilitar modo Debug?"
675
+
676
+ #: admin/views/settings-page.php:35
677
+ msgid "Will use uncompressed js"
678
+ msgstr "Va a usar js descomprimido"
679
+
680
+ #: admin/views/settings-page.php:40
681
+ msgid "Enable safe mode?"
682
+ msgstr "¿Habilitar modo seguro?"
683
+
684
+ #: admin/views/settings-page.php:43
685
+ msgid "Will move all popups to top of the screen."
686
+ msgstr "Moverá todos los popups hacia arriba de la pantalla."
687
+
688
+ #: admin/views/settings-page.php:48
689
+ msgid "Remove shortcodes style"
690
+ msgstr "Eliminar el estilo de los códigos cortos"
691
+
692
+ #: admin/views/settings-page.php:51
693
+ msgid ""
694
+ "By default the plugin will apply some style to shortcodes. Check here if you "
695
+ "want to manually style them"
696
+ msgstr ""
697
+ "Por defecto el plugin aplicará algún estilo a códigos cortos. Seleccione "
698
+ "aquí si quiere aplicarle el estilo manualmente"
699
+
700
+ #: admin/views/settings-page.php:56
701
+ msgid "Unload Facebook javascript"
702
+ msgstr "No cargar el javascript de Facebook"
703
+
704
+ #: admin/views/settings-page.php:59
705
+ msgid "If you use your own Facebook script, check this"
706
+ msgstr "Si usted usa su propio script de Facebook, seleccione aquí"
707
+
708
+ #: admin/views/settings-page.php:64
709
+ msgid "Unload Google javascript"
710
+ msgstr "No cargar javascript de Google"
711
+
712
+ #: admin/views/settings-page.php:67
713
+ msgid "If you use your own Google script, check this"
714
+ msgstr "Si usted usa su propio script de Google, seleccione aquí"
715
+
716
+ #: admin/views/settings-page.php:72
717
+ msgid "Unload Twitter javascript"
718
+ msgstr "No cargar javascript de Twitter"
719
+
720
+ #: admin/views/settings-page.php:75
721
+ msgid "If you use your own Twitter script, check this"
722
+ msgstr "Si usted usa su propio script de Twitter, seleccione aquí"
723
+
724
+ #: admin/views/settings-page.php:80
725
+ msgid "Save settings"
726
+ msgstr "Salvar ajustes"
727
+
728
+ #: includes/class-spu-helper.php:133
729
+ msgid "All Pages"
730
+ msgstr "Todas las Páginas"
731
+
732
+ #: includes/class-spu-helper.php:134
733
+ msgid "Front Page"
734
+ msgstr "Página Frontal"
735
+
736
+ #: includes/class-spu-helper.php:135
737
+ msgid "Posts Page"
738
+ msgstr "Página de Posts"
739
+
740
+ #: includes/class-spu-helper.php:136
741
+ msgid "Category Page"
742
+ msgstr "Página de Categoría"
743
+
744
+ #: includes/class-spu-helper.php:137
745
+ msgid "Archives Page"
746
+ msgstr "Página de Archivos"
747
+
748
+ #: includes/class-spu-helper.php:138
749
+ msgid "Top Level Page (parent of 0)"
750
+ msgstr "Página de Nivel Superior (padre de 0)"
751
+
752
+ #: includes/class-spu-helper.php:139
753
+ msgid "Parent Page (has children)"
754
+ msgstr "Página Padre (tiene hijos)"
755
+
756
+ #: includes/class-spu-helper.php:140
757
+ msgid "Child Page (has parent)"
758
+ msgstr "Página hija (tiene padre)"
759
+
760
+ #: includes/class-spu-helper.php:148
761
+ msgid "Default Template"
762
+ msgstr "Plantilla Por Defecto"
763
+
764
+ #: includes/class-spu-helper.php:221
765
+ msgid "Publish"
766
+ msgstr "Publicar"
767
+
768
+ #: includes/class-spu-helper.php:222
769
+ msgid "Pending Review"
770
+ msgstr "Revisión Pendiente"
771
+
772
+ #: includes/class-spu-helper.php:223
773
+ msgid "Draft"
774
+ msgstr "Borrador"
775
+
776
+ #: includes/class-spu-helper.php:224
777
+ msgid "Future"
778
+ msgstr "Futuro"
779
+
780
+ #: includes/class-spu-helper.php:225
781
+ msgid "Private"
782
+ msgstr "Privado"
783
+
784
+ #: includes/class-spu-helper.php:226
785
+ msgid "Revision"
786
+ msgstr "Revisión"
787
+
788
+ #: includes/class-spu-helper.php:227
789
+ msgid "Trash"
790
+ msgstr "Papelera"
791
+
792
+ #: includes/class-spu-helper.php:240
793
+ msgid "Super Admin"
794
+ msgstr "Super Admin"
795
+
796
+ #: includes/class-spu-helper.php:260
797
+ msgid "True"
798
+ msgstr "Verdadero"
799
+
800
+ #~ msgid "What's new"
801
+ #~ msgstr "Qué hay de nuevo"
802
+
803
+ #~ msgid "credits"
804
+ #~ msgstr "créditos"
805
+
806
+ #~ msgid "Like Facebook like box but for Twitter"
807
+ #~ msgstr "Caja de me gusta de Facebook pero para Twitter"
808
+
809
+ #~ msgid ""
810
+ #~ "Track impressions and Conversions of social likes/follow and forms "
811
+ #~ "submissions like Contact Form 7, Gravity forms, etc"
812
+ #~ msgstr ""
813
+ #~ "Track impressions and Conversions de likes/follow sociales y envíos de "
814
+ #~ "formas como Contact Form 7, Gravity forms, etc"
languages/popups-fr_FR .po CHANGED
@@ -1,864 +1,864 @@
1
- # Copyright (C) 2013 TODO
2
- # This file is distributed under the same license as the TODO package.
3
- msgid ""
4
- msgstr ""
5
- "Project-Id-Version: Popups\n"
6
- "Report-Msgid-Bugs-To: http://wordpress.org/plugins/plugin-name\n"
7
- "POT-Creation-Date: 2017-05-20 10:47+0200\n"
8
- "PO-Revision-Date: 2017-05-21 18:21+0200\n"
9
- "Language-Team: Timersys <info@timersys.com>\n"
10
- "MIME-Version: 1.0\n"
11
- "Content-Type: text/plain; charset=UTF-8\n"
12
- "Content-Transfer-Encoding: 8bit\n"
13
- "X-Generator: Poedit 2.0.2\n"
14
- "X-Poedit-KeywordsList: __;_e;_n;_x;esc_html_e;esc_html__;esc_attr_e;"
15
- "esc_attr__;_ex:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2;_x:1,2c;_n:1,2\n"
16
- "X-Poedit-Basepath: ..\n"
17
- "Plural-Forms: nplurals=2; plural=(n > 1);\n"
18
- "Last-Translator: Hubert Desrues <hdesrues@icloud.com>\n"
19
- "Language: fr_FR\n"
20
- "X-Poedit-SearchPath-0: .\n"
21
-
22
- #: admin/class-social-popup-admin.php:159
23
- msgctxt "post type singular name"
24
- msgid "Popups"
25
- msgstr "Popups"
26
-
27
- #: admin/class-social-popup-admin.php:160
28
- msgctxt "admin menu"
29
- msgid "Popups"
30
- msgstr "Popups"
31
-
32
- #: admin/class-social-popup-admin.php:161
33
- msgctxt "add new on admin bar"
34
- msgid "Popups"
35
- msgstr "Popups"
36
-
37
- #: admin/class-social-popup-admin.php:162
38
- msgctxt "Popups"
39
- msgid "Add New"
40
- msgstr "Ajouter"
41
-
42
- #: admin/class-social-popup-admin.php:163
43
- msgid "Add New Popups"
44
- msgstr "Ajouter nouveaux Popups"
45
-
46
- #: admin/class-social-popup-admin.php:164
47
- msgid "New Popups"
48
- msgstr "Nouveau Popups"
49
-
50
- #: admin/class-social-popup-admin.php:165
51
- msgid "Edit Popups"
52
- msgstr "Éditer"
53
-
54
- #: admin/class-social-popup-admin.php:166
55
- msgid "View Popups"
56
- msgstr "Visualiser"
57
-
58
- #: admin/class-social-popup-admin.php:167
59
- msgid "All Popups"
60
- msgstr "Tous les Popups"
61
-
62
- #: admin/class-social-popup-admin.php:168
63
- msgid "Search Popups"
64
- msgstr "Rechercher des Popups"
65
-
66
- #: admin/class-social-popup-admin.php:169
67
- msgid "Parent Popups:"
68
- msgstr "Popups parent :"
69
-
70
- #: admin/class-social-popup-admin.php:170
71
- msgid "No Popups found."
72
- msgstr "Pas de Popups trouvé."
73
-
74
- #: admin/class-social-popup-admin.php:171
75
- msgid "No Popups found in Trash."
76
- msgstr "Pas de Popups dans la corbeille."
77
-
78
- #: admin/class-social-popup-admin.php:212
79
- msgid "Settings"
80
- msgstr "Réglages"
81
-
82
- #: admin/class-social-popup-admin.php:260
83
- msgid "Popups Premium"
84
- msgstr "Popups Premium"
85
-
86
- #: admin/class-social-popup-admin.php:271
87
- msgid "PopUp Shortcodes"
88
- msgstr "Shortcodes Popups"
89
-
90
- #: admin/class-social-popup-admin.php:280
91
- msgid "PopUp Appearance"
92
- msgstr "Apparence"
93
-
94
- #: admin/class-social-popup-admin.php:289
95
- msgid "PopUp Display Rules"
96
- msgstr "Règles d’affichage"
97
-
98
- #: admin/class-social-popup-admin.php:298
99
- msgid "Display Options"
100
- msgstr "Options de visualisation"
101
-
102
- #: admin/class-social-popup-admin.php:307
103
- msgid "Need support?"
104
- msgstr "Besoin de support ?"
105
-
106
- #: admin/class-social-popup-admin.php:315
107
- msgid "Donate & support"
108
- msgstr "Faites un don de soutien"
109
-
110
- #: admin/class-social-popup-admin.php:323
111
- msgid "About the developer"
112
- msgstr "A propos du développeur"
113
-
114
- #: admin/class-social-popup-admin.php:589
115
- #: admin/views/metaboxes/metabox-rules.php:33
116
- #: admin/views/metaboxes/metabox-rules.php:106
117
- msgid "or"
118
- msgstr "ou"
119
-
120
- #: admin/class-social-popup-admin.php:616
121
- msgid "Add a Popup"
122
- msgstr "Ajouter un Popup"
123
-
124
- #: admin/class-social-popup-admin.php:740
125
- msgid "User"
126
- msgstr "Utilisateur"
127
-
128
- #: admin/class-social-popup-admin.php:741
129
- msgid "User role"
130
- msgstr "Rôle de l’utilisateur"
131
-
132
- #: admin/class-social-popup-admin.php:742
133
- msgid "User is logged"
134
- msgstr "Utilisateur inscrit"
135
-
136
- #: admin/class-social-popup-admin.php:743
137
- msgid "User never left a comment"
138
- msgstr "Utilisateur n’ayant jamais laissé de commentaire"
139
-
140
- #: admin/class-social-popup-admin.php:744
141
- msgid "User came via a search engine"
142
- msgstr "Utilisateur venu par un moteur de recherche"
143
-
144
- #: admin/class-social-popup-admin.php:745
145
- msgid "User did not arrive via another page on your site"
146
- msgstr "Utilisateur ne venant pas d’une autre page de votre site"
147
-
148
- #: admin/class-social-popup-admin.php:747
149
- #: admin/class-social-popup-admin.php:748
150
- msgid "Post"
151
- msgstr "Article"
152
-
153
- #: admin/class-social-popup-admin.php:749
154
- msgid "Post ID"
155
- msgstr "ID de l’article"
156
-
157
- #: admin/class-social-popup-admin.php:750
158
- msgid "Post Type"
159
- msgstr "Type d’articles"
160
-
161
- #: admin/class-social-popup-admin.php:751
162
- msgid "Post Category"
163
- msgstr "Catégorie d’articles"
164
-
165
- #: admin/class-social-popup-admin.php:752
166
- msgid "Post Format"
167
- msgstr "Format d’articles"
168
-
169
- #: admin/class-social-popup-admin.php:753
170
- msgid "Post Status"
171
- msgstr "Statut d’articles"
172
-
173
- #: admin/class-social-popup-admin.php:754
174
- msgid "Post Taxonomy"
175
- msgstr "Taxynomie d’articles"
176
-
177
- #: admin/class-social-popup-admin.php:756
178
- #: admin/class-social-popup-admin.php:757
179
- msgid "Page"
180
- msgstr "Page"
181
-
182
- #: admin/class-social-popup-admin.php:758
183
- msgid "Page Type"
184
- msgstr "Type de pages"
185
-
186
- #: admin/class-social-popup-admin.php:759
187
- msgid "Page Parent"
188
- msgstr "Parent de pages"
189
-
190
- #: admin/class-social-popup-admin.php:760
191
- msgid "Page Template"
192
- msgstr "Modèle de pages"
193
-
194
- #: admin/class-social-popup-admin.php:762
195
- msgid "Other"
196
- msgstr "Autres"
197
-
198
- #: admin/class-social-popup-admin.php:763
199
- msgid "Referrer"
200
- msgstr "Référant"
201
-
202
- #: admin/class-social-popup-admin.php:764
203
- msgid "Mobile Phone"
204
- msgstr "Téléphone mobile"
205
-
206
- #: admin/class-social-popup-admin.php:765
207
- msgid "Tablet"
208
- msgstr "Tablette"
209
-
210
- #: admin/class-social-popup-admin.php:813
211
- msgid "ID"
212
- msgstr "ID"
213
-
214
- #: admin/includes/class-spu-notices.php:30
215
- #, php-format
216
- msgid ""
217
- "We noticed that you have been using our plugin for a while and we would like "
218
- "to ask you a little favour. If you are happy with it and can take a minute "
219
- "please <a href=\"%s\" target=\"_blank\">leave a nice review</a> on "
220
- "WordPress. It will be a tremendous help for us!"
221
- msgstr ""
222
- "Nous avons remarqué que vous avez utilisé notre plugin pendant un certain "
223
- "temps et nous vous demandons une faveur. Si vous êtes satisfait de ce plugin "
224
- "et si vous avez une minute, veuillez <a href=\"%s\" target=\"_blank\"> "
225
- "laisser une bonne critique </a> sur WordPress. Ce sera une aide formidable "
226
- "pour nous!"
227
-
228
- #: admin/includes/class-spu-notices.php:32
229
- #, php-format
230
- msgid "<a href=\"%s\" target=\"_blank\">Leave a nice review</a>"
231
- msgstr "<a href=\"%s\" target=\"_blank\">Laissez une bonne appréciation</a>"
232
-
233
- #: admin/includes/class-spu-notices.php:33
234
- #, php-format
235
- msgid "<a href=\"%s\">No, thanks</a>"
236
- msgstr "<a href=\"%s\">Non, merci</a>"
237
-
238
- #: admin/views/metaboxes/metabox-appearance.php:10
239
- msgid "Background opacity"
240
- msgstr "Opacité du fond"
241
-
242
- #: admin/views/metaboxes/metabox-appearance.php:12
243
- msgid "Leave at 0 for no background. Max value is 1"
244
- msgstr "Mettre 0 pour aucune opacité. Valeur maximale 1"
245
-
246
- #: admin/views/metaboxes/metabox-appearance.php:18
247
- msgid "Background color"
248
- msgstr "Couleur du fond"
249
-
250
- #: admin/views/metaboxes/metabox-appearance.php:22
251
- msgid "Text color"
252
- msgstr "Couleur du texte"
253
-
254
- #: admin/views/metaboxes/metabox-appearance.php:26
255
- msgid "Box width"
256
- msgstr "Largeur du popup"
257
-
258
- #: admin/views/metaboxes/metabox-appearance.php:32
259
- msgid "Border color"
260
- msgstr "Couleur du cadre"
261
-
262
- #: admin/views/metaboxes/metabox-appearance.php:36
263
- msgid "Border width"
264
- msgstr "Épaisseur du cadre"
265
-
266
- #: admin/views/metaboxes/metabox-donate.php:6
267
- msgid "If you like this plugin, consider supporting it by donating."
268
- msgstr "Si vous aimez ce plugin, manifestez-le par une donation."
269
-
270
- #: admin/views/metaboxes/metabox-donate.php:8
271
- msgid "Donate with PayPal"
272
- msgstr "Donnez avec PayPal"
273
-
274
- #: admin/views/metaboxes/metabox-donate.php:10
275
- msgid "Some other ways to support this plugin"
276
- msgstr "Quelques autres façons de supporter ce plugin"
277
-
278
- #: admin/views/metaboxes/metabox-donate.php:12
279
- msgid "Leave a &#9733;&#9733;&#9733;&#9733;&#9733; review on WordPress.org"
280
- msgstr ""
281
- "Laissez une &#9733;&#9733;&#9733;&#9733;&#9733; appréciation sur WordPress."
282
- "org"
283
-
284
- #: admin/views/metaboxes/metabox-donate.php:13
285
- msgid "Write about Popups on your blog"
286
- msgstr "Ecrivez un article à propos de Popups dans votre blog"
287
-
288
- #: admin/views/metaboxes/metabox-donate.php:14
289
- msgid "Tweet about Popups"
290
- msgstr "Tweetez à propos de Popups"
291
-
292
- #: admin/views/metaboxes/metabox-donate.php:15
293
- msgid "Vote \"works\" on the WordPress.org plugin page"
294
- msgstr "Votez « works » sur la page plugin de WordPress.org"
295
-
296
- #: admin/views/metaboxes/metabox-help.php:6
297
- msgid ""
298
- "You have some social shortcodes to use that will print a Facebook like, a "
299
- "Google+ Follow and a Twitter follow. Check the available options and "
300
- "<strong>configure them with your social accounts</strong>:"
301
- msgstr ""
302
- "Vous avez des shortcodes pour imprimer des « like » dans Facebook, des "
303
- "« Follow » dans Google+ ou dans Twitter. Vérifiez les options disponibles et "
304
- "<strong> configurez-les avec vos comptes sociaux </strong> :"
305
-
306
- #: admin/views/metaboxes/metabox-help.php:8
307
- msgid "Facebook Page"
308
- msgstr "Page Facebook"
309
-
310
- #: admin/views/metaboxes/metabox-help.php:12
311
- msgid "View Facebook Page Options"
312
- msgstr "Voir les options pour les pages Facebook"
313
-
314
- #: admin/views/metaboxes/metabox-help.php:14
315
- #: admin/views/metaboxes/metabox-help.php:27
316
- msgid "Your Facebook page url"
317
- msgstr "L’url de votre page Facebook"
318
-
319
- #: admin/views/metaboxes/metabox-help.php:15
320
- msgid "Your page name"
321
- msgstr "Le nom de votre page"
322
-
323
- #: admin/views/metaboxes/metabox-help.php:16
324
- msgid "true|false <b>Default value:</b> true"
325
- msgstr "vrai|faux <b>valeur par défaut :</b> vrai"
326
-
327
- #: admin/views/metaboxes/metabox-help.php:17
328
- msgid "true|false <b>Default value:</b> false"
329
- msgstr "vrai|faux <b>valeur par défaut :</b> faux"
330
-
331
- #: admin/views/metaboxes/metabox-help.php:18
332
- msgid "number <b>Default value:</b> 500"
333
- msgstr "nombre <b>Valeur par défaut :</b> 500"
334
-
335
- #: admin/views/metaboxes/metabox-help.php:21
336
- msgid "Facebook Button"
337
- msgstr "Bouton Facebook"
338
-
339
- #: admin/views/metaboxes/metabox-help.php:25
340
- msgid "View Facebook Options"
341
- msgstr "Voir les options Facebook"
342
-
343
- #: admin/views/metaboxes/metabox-help.php:28
344
- msgid "standard, box_count, button <b>Default value:</b> button_count"
345
- msgstr "standard, box_count, bouton <b> Valeur par défaut: </b> button_count"
346
-
347
- #: admin/views/metaboxes/metabox-help.php:29
348
- #: admin/views/metaboxes/metabox-help.php:30
349
- msgid "true <b>Default value:</b> false"
350
- msgstr "vrai <b>Valeur par défaut :</b> faux"
351
-
352
- #: admin/views/metaboxes/metabox-help.php:31
353
- msgid "recommend <b>Default value:</b> like"
354
- msgstr "recommander <b>Valeur par défaut:</b> aimer"
355
-
356
- #: admin/views/metaboxes/metabox-help.php:32
357
- msgid "number <b>Default value:</b>"
358
- msgstr "nombre <b>Valeur par défaut :</b>"
359
-
360
- #: admin/views/metaboxes/metabox-help.php:34
361
- msgid "Google+ Button"
362
- msgstr "Bouton Google+"
363
-
364
- #: admin/views/metaboxes/metabox-help.php:38
365
- msgid "View Google+ Options"
366
- msgstr "Voir les options Google+"
367
-
368
- #: admin/views/metaboxes/metabox-help.php:40
369
- msgid "Your Google+ url"
370
- msgstr "Votre url Google+"
371
-
372
- #: admin/views/metaboxes/metabox-help.php:41
373
- msgid "small, standard, tall <b>Default value:</b> medium"
374
- msgstr "petit, standard, grand <b>Valeur par défaut:</b> médium"
375
-
376
- #: admin/views/metaboxes/metabox-help.php:42
377
- msgid "inline, none <b>Default value:</b> bubble"
378
- msgstr "en ligne, non <b>Valeur par défaut :</b> bulle"
379
-
380
- #: admin/views/metaboxes/metabox-help.php:44
381
- msgid "Twitter Button"
382
- msgstr "Bouton twitter"
383
-
384
- #: admin/views/metaboxes/metabox-help.php:48
385
- msgid "View Twitter Options"
386
- msgstr "Voir les options twitter"
387
-
388
- #: admin/views/metaboxes/metabox-help.php:50
389
- msgid "Your Twitter user <b>Default chifliiiii</b>"
390
- msgstr "Votre nom d’utilisateur Twitter <b>Par défaut chifliiiii</b>"
391
-
392
- #: admin/views/metaboxes/metabox-help.php:51
393
- msgid "false <b>Default value:</b> true"
394
- msgstr "faux <b>valeur par défaut:</b> vrai"
395
-
396
- #: admin/views/metaboxes/metabox-help.php:52
397
- msgid "large <b>Default value:</b> \"\""
398
- msgstr "grans <b>Valeur par défaut :</b> \"\""
399
-
400
- #: admin/views/metaboxes/metabox-help.php:55
401
- msgid "Other available Shortcodes:"
402
- msgstr "Autres Shortcodes utilisables :"
403
-
404
- #: admin/views/metaboxes/metabox-help.php:56
405
- msgid "Close Button"
406
- msgstr "Bouton de fermeture"
407
-
408
- #: admin/views/metaboxes/metabox-help.php:60
409
- msgid "View Close shortcode Options"
410
- msgstr "Voir les options shortcode de fermeture"
411
-
412
- #: admin/views/metaboxes/metabox-help.php:62
413
- msgid "Pass a custom class to style your button"
414
- msgstr "Envoie une classe personnalisée pour styler votre bouton"
415
-
416
- #: admin/views/metaboxes/metabox-help.php:63
417
- msgid "Button label - <b>Default value:</b> Close"
418
- msgstr "Nom du bouton - <b>valeur par défaut :</b> Fermer"
419
-
420
- #: admin/views/metaboxes/metabox-help.php:64
421
- msgid "left, right, center, none - <b>Default value:</b> center"
422
- msgstr "gauche, droite, centré, aucun - <b>valeur par défaut:</b> centré"
423
-
424
- #: admin/views/metaboxes/metabox-links.php:6
425
- msgid "My name is"
426
- msgstr "Mon nom est"
427
-
428
- #: admin/views/metaboxes/metabox-links.php:6
429
- msgid "I develop WordPress plugins and themes."
430
- msgstr "Je développe des thèmes et des plugins pour WordPress."
431
-
432
- #: admin/views/metaboxes/metabox-links.php:7
433
- #, php-format
434
- msgid ""
435
- "Take a look at my <a href=\"%s\">site</a> to see my other plugins or hire "
436
- "me. Subscribe to get updates!"
437
- msgstr ""
438
- "Jetez un coup d’œil à mon <a href=\"%s\">site</a> pour découvrir mes autres "
439
- "plugins ou me passer une commande. Inscrivez-vous pour obtenir des mises à "
440
- "jour !"
441
-
442
- #: admin/views/metaboxes/metabox-links.php:8
443
- msgid "Other plugins I built:"
444
- msgstr "Mes autres plugins :"
445
-
446
- #: admin/views/metaboxes/metabox-links.php:10
447
- msgid "Install multiple plugins and create collections"
448
- msgstr "Installez de multiples plugins et créez des ensembles"
449
-
450
- #: admin/views/metaboxes/metabox-links.php:11
451
- msgid "Geotarget your content"
452
- msgstr "Ciblez géographiquement votre contenu"
453
-
454
- #: admin/views/metaboxes/metabox-links.php:12
455
- msgid "Invite your network friends and import contacts"
456
- msgstr "Invitez vos amis et vos contacts importés"
457
-
458
- #: admin/views/metaboxes/metabox-options.php:9
459
- msgid "Box Position"
460
- msgstr "Position du popup"
461
-
462
- #: admin/views/metaboxes/metabox-options.php:12
463
- msgid "Centered"
464
- msgstr "Centré"
465
-
466
- #: admin/views/metaboxes/metabox-options.php:13
467
- msgid "Top Left"
468
- msgstr "En haut à gauche"
469
-
470
- #: admin/views/metaboxes/metabox-options.php:14
471
- msgid "Top Right"
472
- msgstr "En haut à droite"
473
-
474
- #: admin/views/metaboxes/metabox-options.php:15
475
- msgid "Bottom Left"
476
- msgstr "En bas à gauche"
477
-
478
- #: admin/views/metaboxes/metabox-options.php:16
479
- msgid "Bottom Right"
480
- msgstr "En bas à droite"
481
-
482
- #: admin/views/metaboxes/metabox-options.php:23
483
- msgid "Trigger action"
484
- msgstr "Action de déclenchement"
485
-
486
- #: admin/views/metaboxes/metabox-options.php:27
487
- msgid "seconds after page load"
488
- msgstr "secondes après chargement de la page"
489
-
490
- #: admin/views/metaboxes/metabox-options.php:28
491
- msgid "of page height"
492
- msgstr "de hauteur de page"
493
-
494
- #: admin/views/metaboxes/metabox-options.php:38
495
- msgid "Auto-hide?"
496
- msgstr "Auto-disparition ?"
497
-
498
- #: admin/views/metaboxes/metabox-options.php:40
499
- #: admin/views/metaboxes/metabox-options.php:68
500
- #: admin/views/metaboxes/metabox-options.php:76
501
- #: admin/views/metaboxes/metabox-options.php:84
502
- msgid "Yes"
503
- msgstr "Oui"
504
-
505
- #: admin/views/metaboxes/metabox-options.php:41
506
- #: admin/views/metaboxes/metabox-options.php:69
507
- #: admin/views/metaboxes/metabox-options.php:77
508
- #: admin/views/metaboxes/metabox-options.php:85
509
- msgid "No"
510
- msgstr "Non"
511
-
512
- #: admin/views/metaboxes/metabox-options.php:42
513
- msgid "Hide box again when visitors scroll back up?"
514
- msgstr "Cacher le popup quand les visiteurs provoquent un défilement ?"
515
-
516
- #: admin/views/metaboxes/metabox-options.php:46
517
- msgid "Animation"
518
- msgstr "Animation"
519
-
520
- #: admin/views/metaboxes/metabox-options.php:49
521
- msgid "Fade In"
522
- msgstr "Par fondu"
523
-
524
- #: admin/views/metaboxes/metabox-options.php:50
525
- msgid "Slide In"
526
- msgstr "Par glissement"
527
-
528
- #: admin/views/metaboxes/metabox-options.php:53
529
- msgid "Slide will only apply when popup is on the corners"
530
- msgstr "Le glissement ne se fait que si le popup est dans un coin"
531
-
532
- #: admin/views/metaboxes/metabox-options.php:58
533
- msgid "Cookie expiration days"
534
- msgstr "Durée du cookie en jours"
535
-
536
- #: admin/views/metaboxes/metabox-options.php:61
537
- msgid "After closing the box, how many days should it stay hidden?"
538
- msgstr ""
539
- "Après fermeture du popup pendant combien de jours ne doit-il pas reparaître ?"
540
-
541
- #: admin/views/metaboxes/metabox-options.php:66
542
- msgid "Enable test mode?"
543
- msgstr "Activer le mode test ?"
544
-
545
- #: admin/views/metaboxes/metabox-options.php:70
546
- msgid ""
547
- "If test mode is enabled, the box will show up regardless of whether a cookie "
548
- "has been set. (To admins only)"
549
- msgstr ""
550
- "Si le mode test est activé, le popup ne tiendra pas compte des consignes du "
551
- "cookie. (Administrateurs seulement)"
552
-
553
- #: admin/views/metaboxes/metabox-options.php:74
554
- msgid "Close on conversion?"
555
- msgstr "Fermer sur conversion ?"
556
-
557
- #: admin/views/metaboxes/metabox-options.php:78
558
- msgid ""
559
- "If you have a form or social shortcode, by default popup will close on "
560
- "submission/conversion"
561
- msgstr ""
562
- "Si vous avez un formulaire ou un shortcode de réseau social, par défaut le "
563
- "popup se fermera sur soumission/conversion"
564
-
565
- #: admin/views/metaboxes/metabox-options.php:82
566
- msgid "Show powered by link?"
567
- msgstr "Afficher un lien « powered by » ?"
568
-
569
- #: admin/views/metaboxes/metabox-options.php:86
570
- #, php-format
571
- msgid ""
572
- "Shows a \"powered by\" link below your popup. If your affiliate link is set "
573
- "in the <a href=\"%s\">settings</a>, it will be used."
574
- msgstr ""
575
- "Afficher un lien « Powered by » sous votre popup. Si vous êtes affilié le "
576
- "lien est mis dans <a href=\"%s\">réglages</a>, pour être utilisé."
577
-
578
- #: admin/views/metaboxes/metabox-premium.php:16
579
- msgid ""
580
- "Take the best WordPress Popups plugin to the next level with Popups Premium "
581
- "extension."
582
- msgstr ""
583
- "Avec l’extension Popups Premium pour WordPress choisissez le meilleur plugin."
584
-
585
- #: admin/views/metaboxes/metabox-premium.php:17
586
- msgid "Popups Premium Features:"
587
- msgstr "Fonctionnalités de Popups Premium :"
588
-
589
- #: admin/views/metaboxes/metabox-premium.php:19
590
- msgid "Beautiful optin forms for popular mail providers"
591
- msgstr ""
592
- "Élégants formulaires de souscription pour les plus populaires distributeurs "
593
- "de mails"
594
-
595
- #: admin/views/metaboxes/metabox-premium.php:20
596
- msgid "Currently supporting MailChimp, Aweber, Postmatic, Mailpoet"
597
- msgstr "Supporte MailChimp, Aweber, Postmatic, Mailpoet"
598
-
599
- #: admin/views/metaboxes/metabox-premium.php:21
600
- msgid ""
601
- "Track impressions and Conversions of social likes and forms submissions like "
602
- "Contact Form 7, Gravity forms, etc"
603
- msgstr ""
604
- "Enregistre les impressions et conversions à partir des réseaux sociaux ou "
605
- "des formulaires de soumission comme Contac Form 7, Gravity Forms etc"
606
-
607
- #: admin/views/metaboxes/metabox-premium.php:22
608
- msgid "Track impressions and Conversions also in Google Analytics"
609
- msgstr "Enregistre aussi les impressions et conversion dans Google Analytics"
610
-
611
- #: admin/views/metaboxes/metabox-premium.php:23
612
- #: admin/views/metaboxes/metabox-premium.php:25
613
- msgid "Exit Intent technology"
614
- msgstr ""
615
- "Intégration de « Exit Intent technology » pour suivre les mouvements de la "
616
- "souris de l’utilisateur et prévoir sa sortie"
617
-
618
- #: admin/views/metaboxes/metabox-premium.php:24
619
- msgid "8 New animations effects"
620
- msgstr "8 nouvelles animations"
621
-
622
- #: admin/views/metaboxes/metabox-premium.php:26
623
- msgid "New trigger methods"
624
- msgstr "Nouvelles méthodes de déclenchement"
625
-
626
- #: admin/views/metaboxes/metabox-premium.php:27
627
- msgid "Timer for auto closing"
628
- msgstr "Minuteur pour fermeture automatique"
629
-
630
- #: admin/views/metaboxes/metabox-premium.php:28
631
- msgid "Ability to disable close button"
632
- msgstr "Possibilité de désactiver le bouton de fermeture"
633
-
634
- #: admin/views/metaboxes/metabox-premium.php:29
635
- msgid ""
636
- "Ability to disable Advanced close methods like esc or clicking outside of "
637
- "the popup"
638
- msgstr ""
639
- "Possibilité de désactiver les méthodes avances de fermeture comme esc ou "
640
- "clic à l’extérieur du popup"
641
-
642
- #: admin/views/metaboxes/metabox-premium.php:30
643
- msgid "Premium support"
644
- msgstr "Support Premium"
645
-
646
- #: admin/views/metaboxes/metabox-premium.php:34
647
- msgid "Buy Now!"
648
- msgstr "Achetez maintenant !"
649
-
650
- #: admin/views/metaboxes/metabox-rules.php:19
651
- msgid "Rules"
652
- msgstr "Règles"
653
-
654
- #: admin/views/metaboxes/metabox-rules.php:20
655
- msgid "Create a set of rules to determine where the popup will show"
656
- msgstr ""
657
- "Créez un ensemble de règles pour déterminer quand le popup doit apparaître"
658
-
659
- #: admin/views/metaboxes/metabox-rules.php:31
660
- msgid "Show this popup if"
661
- msgstr "Affichez le popup si"
662
-
663
- #: admin/views/metaboxes/metabox-rules.php:61
664
- msgid "is equal to"
665
- msgstr "est égal à"
666
-
667
- #: admin/views/metaboxes/metabox-rules.php:62
668
- msgid "is not equal to"
669
- msgstr "est différent de"
670
-
671
- #: admin/views/metaboxes/metabox-rules.php:93
672
- msgid "and"
673
- msgstr "et"
674
-
675
- #: admin/views/metaboxes/metabox-rules.php:108
676
- msgid "Add rule group"
677
- msgstr "Ajoutez une règle"
678
-
679
- #: admin/views/metaboxes/metabox-support.php:6
680
- #, php-format
681
- msgid "You are using Popups plugin v%s"
682
- msgstr "Vous utilisez la version v%s du plugin Popups"
683
-
684
- #: admin/views/metaboxes/metabox-support.php:7
685
- #, php-format
686
- msgid ""
687
- "If you need support please go to the WordPress.org <a href=\"%s\">support "
688
- "forums</a>"
689
- msgstr ""
690
- "Si vous avez besoin d’une aide, d’un support, rendez-vous sur le <a href=\"%s"
691
- "\">forum WordPress.org</a>"
692
-
693
- #: admin/views/settings-page.php:17
694
- msgid "Affiliate link"
695
- msgstr "Lien affilié"
696
-
697
- #: admin/views/settings-page.php:20
698
- #, php-format
699
- msgid ""
700
- "You can earn money by promoting the plugin! Join <a href=\"%s\">our "
701
- "affiliate program</a> and paste your affiliate link here to earn 35&#37; in "
702
- "commissions . Once entered, it will replace the default \"Powered by\" on "
703
- "the popups."
704
- msgstr ""
705
- "Monétisez votre site en faisant la promotion du plugin ! Rejoignez <a "
706
- "href=« %s »>notre programme d’affiliation</a> et collez votre lien d’affilié "
707
- "ici pour percevoir 35&#37; par commission . Une fois enregistrer il "
708
- "remplacera la notation par défaut « Powered by » dans les popups."
709
-
710
- #: admin/views/settings-page.php:24
711
- msgid "Ajax mode?"
712
- msgstr "Mode Ajax ?"
713
-
714
- #: admin/views/settings-page.php:27
715
- msgid ""
716
- "Load popups using ajax. Compatible with cache plugins, but might not work "
717
- "with all plugins"
718
- msgstr ""
719
- "Utilise Ajax pour charger les popups. Compatible avec les plugins de cache, "
720
- "mais peut ne pas fonctionner avec tous les plugins"
721
-
722
- #: admin/views/settings-page.php:32
723
- msgid "Enable Debug mode?"
724
- msgstr "Activer mode de débogage ?"
725
-
726
- #: admin/views/settings-page.php:35
727
- msgid "Will use uncompressed js"
728
- msgstr "Utilisera des js non compressés"
729
-
730
- #: admin/views/settings-page.php:40
731
- msgid "Enable safe mode?"
732
- msgstr "Activer mode sans échec ?"
733
-
734
- #: admin/views/settings-page.php:43
735
- msgid "Will move all popups to top of the screen."
736
- msgstr "Ouvrira tous les popups en haut de l’écran."
737
-
738
- #: admin/views/settings-page.php:48
739
- msgid "Remove shortcodes style"
740
- msgstr "Supprimer le style des shortcodes"
741
-
742
- #: admin/views/settings-page.php:51
743
- msgid ""
744
- "By default the plugin will apply some style to shortcodes. Check here if you "
745
- "want to manually style them"
746
- msgstr ""
747
- "Par défaut le plugin applique un style aux shortcodes. Cochez ici si vous "
748
- "voulez les styler manuellement"
749
-
750
- #: admin/views/settings-page.php:56
751
- msgid "Unload Facebook javascript"
752
- msgstr "Ne pas charger le javascript de Facebook"
753
-
754
- #: admin/views/settings-page.php:59
755
- msgid "If you use your own Facebook script, check this"
756
- msgstr "Si vous utilisez votre propre script Facebook, cochez ici"
757
-
758
- #: admin/views/settings-page.php:64
759
- msgid "Unload Google javascript"
760
- msgstr "Ne pas charger le javascript de Google"
761
-
762
- #: admin/views/settings-page.php:67
763
- msgid "If you use your own Google script, check this"
764
- msgstr "Si vous utilisez votre propre script Google, cochez ici"
765
-
766
- #: admin/views/settings-page.php:72
767
- msgid "Unload Twitter javascript"
768
- msgstr "Ne pas charger le javascript de Twitter"
769
-
770
- #: admin/views/settings-page.php:75
771
- msgid "If you use your own Twitter script, check this"
772
- msgstr "Si vous utilisez votre propre script pour Twitter, cochez ici"
773
-
774
- #: admin/views/settings-page.php:82
775
- msgid "Delete all data on Uninstall"
776
- msgstr "Effacez toutes les données en cas de désinstallation"
777
-
778
- #: admin/views/settings-page.php:85
779
- msgid ""
780
- "When you uninstall the plugin all popups, settings and stats will be deleted "
781
- "from your db"
782
- msgstr ""
783
- "Quand vous désinstallez le plugin tous les popups, les réglages et les "
784
- "statistiques sont effacées de la base de données"
785
-
786
- #: admin/views/settings-page.php:89
787
- msgid "Save settings"
788
- msgstr "Sauvegarder les réglages"
789
-
790
- #: includes/class-spu-helper.php:131
791
- msgid "All Pages"
792
- msgstr "Toutes les pages"
793
-
794
- #: includes/class-spu-helper.php:132
795
- msgid "Front Page"
796
- msgstr "Page de garde"
797
-
798
- #: includes/class-spu-helper.php:133
799
- msgid "Posts Page"
800
- msgstr "Page des articles"
801
-
802
- #: includes/class-spu-helper.php:134
803
- msgid "Category Page"
804
- msgstr "Page catégories"
805
-
806
- #: includes/class-spu-helper.php:135
807
- msgid "Search Page"
808
- msgstr "Page recherche"
809
-
810
- #: includes/class-spu-helper.php:136
811
- msgid "Archives Page"
812
- msgstr "Page archives"
813
-
814
- #: includes/class-spu-helper.php:137
815
- msgid "Top Level Page (parent of 0)"
816
- msgstr "Page de premier niveau (parent de 0)"
817
-
818
- #: includes/class-spu-helper.php:138
819
- msgid "Parent Page (has children)"
820
- msgstr "Page parent (a un enfant)"
821
-
822
- #: includes/class-spu-helper.php:139
823
- msgid "Child Page (has parent)"
824
- msgstr "Page enfant (a un parent)"
825
-
826
- #: includes/class-spu-helper.php:147
827
- msgid "Default Template"
828
- msgstr "Modèle par défaut"
829
-
830
- #: includes/class-spu-helper.php:220
831
- msgid "Publish"
832
- msgstr "Publier"
833
-
834
- #: includes/class-spu-helper.php:221
835
- msgid "Pending Review"
836
- msgstr "Révision en attente"
837
-
838
- #: includes/class-spu-helper.php:222
839
- msgid "Draft"
840
- msgstr "Brouillon"
841
-
842
- #: includes/class-spu-helper.php:223
843
- msgid "Future"
844
- msgstr "Avenir"
845
-
846
- #: includes/class-spu-helper.php:224
847
- msgid "Private"
848
- msgstr "Privé"
849
-
850
- #: includes/class-spu-helper.php:225
851
- msgid "Revision"
852
- msgstr "Révision"
853
-
854
- #: includes/class-spu-helper.php:226
855
- msgid "Trash"
856
- msgstr "Corbeille"
857
-
858
- #: includes/class-spu-helper.php:239
859
- msgid "Super Admin"
860
- msgstr "Super Administrateur"
861
-
862
- #: includes/class-spu-helper.php:259
863
- msgid "True"
864
- msgstr "Vrai"
1
+ # Copyright (C) 2013 TODO
2
+ # This file is distributed under the same license as the TODO package.
3
+ msgid ""
4
+ msgstr ""
5
+ "Project-Id-Version: Popups\n"
6
+ "Report-Msgid-Bugs-To: http://wordpress.org/plugins/plugin-name\n"
7
+ "POT-Creation-Date: 2017-05-20 10:47+0200\n"
8
+ "PO-Revision-Date: 2017-05-21 18:21+0200\n"
9
+ "Language-Team: Timersys <info@timersys.com>\n"
10
+ "MIME-Version: 1.0\n"
11
+ "Content-Type: text/plain; charset=UTF-8\n"
12
+ "Content-Transfer-Encoding: 8bit\n"
13
+ "X-Generator: Poedit 2.0.2\n"
14
+ "X-Poedit-KeywordsList: __;_e;_n;_x;esc_html_e;esc_html__;esc_attr_e;"
15
+ "esc_attr__;_ex:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2;_x:1,2c;_n:1,2\n"
16
+ "X-Poedit-Basepath: ..\n"
17
+ "Plural-Forms: nplurals=2; plural=(n > 1);\n"
18
+ "Last-Translator: Hubert Desrues <hdesrues@icloud.com>\n"
19
+ "Language: fr_FR\n"
20
+ "X-Poedit-SearchPath-0: .\n"
21
+
22
+ #: admin/class-social-popup-admin.php:159
23
+ msgctxt "post type singular name"
24
+ msgid "Popups"
25
+ msgstr "Popups"
26
+
27
+ #: admin/class-social-popup-admin.php:160
28
+ msgctxt "admin menu"
29
+ msgid "Popups"
30
+ msgstr "Popups"
31
+
32
+ #: admin/class-social-popup-admin.php:161
33
+ msgctxt "add new on admin bar"
34
+ msgid "Popups"
35
+ msgstr "Popups"
36
+
37
+ #: admin/class-social-popup-admin.php:162
38
+ msgctxt "Popups"
39
+ msgid "Add New"
40
+ msgstr "Ajouter"
41
+
42
+ #: admin/class-social-popup-admin.php:163
43
+ msgid "Add New Popups"
44
+ msgstr "Ajouter nouveaux Popups"
45
+
46
+ #: admin/class-social-popup-admin.php:164
47
+ msgid "New Popups"
48
+ msgstr "Nouveau Popups"
49
+
50
+ #: admin/class-social-popup-admin.php:165
51
+ msgid "Edit Popups"
52
+ msgstr "Éditer"
53
+
54
+ #: admin/class-social-popup-admin.php:166
55
+ msgid "View Popups"
56
+ msgstr "Visualiser"
57
+
58
+ #: admin/class-social-popup-admin.php:167
59
+ msgid "All Popups"
60
+ msgstr "Tous les Popups"
61
+
62
+ #: admin/class-social-popup-admin.php:168
63
+ msgid "Search Popups"
64
+ msgstr "Rechercher des Popups"
65
+
66
+ #: admin/class-social-popup-admin.php:169
67
+ msgid "Parent Popups:"
68
+ msgstr "Popups parent :"
69
+
70
+ #: admin/class-social-popup-admin.php:170
71
+ msgid "No Popups found."
72
+ msgstr "Pas de Popups trouvé."
73
+
74
+ #: admin/class-social-popup-admin.php:171
75
+ msgid "No Popups found in Trash."
76
+ msgstr "Pas de Popups dans la corbeille."
77
+
78
+ #: admin/class-social-popup-admin.php:212
79
+ msgid "Settings"
80
+ msgstr "Réglages"
81
+
82
+ #: admin/class-social-popup-admin.php:260
83
+ msgid "Popups Premium"
84
+ msgstr "Popups Premium"
85
+
86
+ #: admin/class-social-popup-admin.php:271
87
+ msgid "PopUp Shortcodes"
88
+ msgstr "Shortcodes Popups"
89
+
90
+ #: admin/class-social-popup-admin.php:280
91
+ msgid "PopUp Appearance"
92
+ msgstr "Apparence"
93
+
94
+ #: admin/class-social-popup-admin.php:289
95
+ msgid "PopUp Display Rules"
96
+ msgstr "Règles d’affichage"
97
+
98
+ #: admin/class-social-popup-admin.php:298
99
+ msgid "Display Options"
100
+ msgstr "Options de visualisation"
101
+
102
+ #: admin/class-social-popup-admin.php:307
103
+ msgid "Need support?"
104
+ msgstr "Besoin de support ?"
105
+
106
+ #: admin/class-social-popup-admin.php:315
107
+ msgid "Donate & support"
108
+ msgstr "Faites un don de soutien"
109
+
110
+ #: admin/class-social-popup-admin.php:323
111
+ msgid "About the developer"
112
+ msgstr "A propos du développeur"
113
+
114
+ #: admin/class-social-popup-admin.php:589
115
+ #: admin/views/metaboxes/metabox-rules.php:33
116
+ #: admin/views/metaboxes/metabox-rules.php:106
117
+ msgid "or"
118
+ msgstr "ou"
119
+
120
+ #: admin/class-social-popup-admin.php:616
121
+ msgid "Add a Popup"
122
+ msgstr "Ajouter un Popup"
123
+
124
+ #: admin/class-social-popup-admin.php:740
125
+ msgid "User"
126
+ msgstr "Utilisateur"
127
+
128
+ #: admin/class-social-popup-admin.php:741
129
+ msgid "User role"
130
+ msgstr "Rôle de l’utilisateur"
131
+
132
+ #: admin/class-social-popup-admin.php:742
133
+ msgid "User is logged"
134
+ msgstr "Utilisateur inscrit"
135
+
136
+ #: admin/class-social-popup-admin.php:743
137
+ msgid "User never left a comment"
138
+ msgstr "Utilisateur n’ayant jamais laissé de commentaire"
139
+
140
+ #: admin/class-social-popup-admin.php:744
141
+ msgid "User came via a search engine"
142
+ msgstr "Utilisateur venu par un moteur de recherche"
143
+
144
+ #: admin/class-social-popup-admin.php:745
145
+ msgid "User did not arrive via another page on your site"
146
+ msgstr "Utilisateur ne venant pas d’une autre page de votre site"
147
+
148
+ #: admin/class-social-popup-admin.php:747
149
+ #: admin/class-social-popup-admin.php:748
150
+ msgid "Post"
151
+ msgstr "Article"
152
+
153
+ #: admin/class-social-popup-admin.php:749
154
+ msgid "Post ID"
155
+ msgstr "ID de l’article"
156
+
157
+ #: admin/class-social-popup-admin.php:750
158
+ msgid "Post Type"
159
+ msgstr "Type d’articles"
160
+
161
+ #: admin/class-social-popup-admin.php:751
162
+ msgid "Post Category"
163
+ msgstr "Catégorie d’articles"
164
+
165
+ #: admin/class-social-popup-admin.php:752
166
+ msgid "Post Format"
167
+ msgstr "Format d’articles"
168
+
169
+ #: admin/class-social-popup-admin.php:753
170
+ msgid "Post Status"
171
+ msgstr "Statut d’articles"
172
+
173
+ #: admin/class-social-popup-admin.php:754
174
+ msgid "Post Taxonomy"
175
+ msgstr "Taxynomie d’articles"
176
+
177
+ #: admin/class-social-popup-admin.php:756
178
+ #: admin/class-social-popup-admin.php:757
179
+ msgid "Page"
180
+ msgstr "Page"
181
+
182
+ #: admin/class-social-popup-admin.php:758
183
+ msgid "Page Type"
184
+ msgstr "Type de pages"
185
+
186
+ #: admin/class-social-popup-admin.php:759
187
+ msgid "Page Parent"
188
+ msgstr "Parent de pages"
189
+
190
+ #: admin/class-social-popup-admin.php:760
191
+ msgid "Page Template"
192
+ msgstr "Modèle de pages"
193
+
194
+ #: admin/class-social-popup-admin.php:762
195
+ msgid "Other"
196
+ msgstr "Autres"
197
+
198
+ #: admin/class-social-popup-admin.php:763
199
+ msgid "Referrer"
200
+ msgstr "Référant"
201
+
202
+ #: admin/class-social-popup-admin.php:764
203
+ msgid "Mobile Phone"
204
+ msgstr "Téléphone mobile"
205
+
206
+ #: admin/class-social-popup-admin.php:765
207
+ msgid "Tablet"
208
+ msgstr "Tablette"
209
+
210
+ #: admin/class-social-popup-admin.php:813
211
+ msgid "ID"
212
+ msgstr "ID"
213
+
214
+ #: admin/includes/class-spu-notices.php:30
215
+ #, php-format
216
+ msgid ""
217
+ "We noticed that you have been using our plugin for a while and we would like "
218
+ "to ask you a little favour. If you are happy with it and can take a minute "
219
+ "please <a href=\"%s\" target=\"_blank\">leave a nice review</a> on "
220
+ "WordPress. It will be a tremendous help for us!"
221
+ msgstr ""
222
+ "Nous avons remarqué que vous avez utilisé notre plugin pendant un certain "
223
+ "temps et nous vous demandons une faveur. Si vous êtes satisfait de ce plugin "
224
+ "et si vous avez une minute, veuillez <a href=\"%s\" target=\"_blank\"> "
225
+ "laisser une bonne critique </a> sur WordPress. Ce sera une aide formidable "
226
+ "pour nous!"
227
+
228
+ #: admin/includes/class-spu-notices.php:32
229
+ #, php-format
230
+ msgid "<a href=\"%s\" target=\"_blank\">Leave a nice review</a>"
231
+ msgstr "<a href=\"%s\" target=\"_blank\">Laissez une bonne appréciation</a>"
232
+
233
+ #: admin/includes/class-spu-notices.php:33
234
+ #, php-format
235
+ msgid "<a href=\"%s\">No, thanks</a>"
236
+ msgstr "<a href=\"%s\">Non, merci</a>"
237
+
238
+ #: admin/views/metaboxes/metabox-appearance.php:10
239
+ msgid "Background opacity"
240
+ msgstr "Opacité du fond"
241
+
242
+ #: admin/views/metaboxes/metabox-appearance.php:12
243
+ msgid "Leave at 0 for no background. Max value is 1"
244
+ msgstr "Mettre 0 pour aucune opacité. Valeur maximale 1"
245
+
246
+ #: admin/views/metaboxes/metabox-appearance.php:18
247
+ msgid "Background color"
248
+ msgstr "Couleur du fond"
249
+
250
+ #: admin/views/metaboxes/metabox-appearance.php:22
251
+ msgid "Text color"
252
+ msgstr "Couleur du texte"
253
+
254
+ #: admin/views/metaboxes/metabox-appearance.php:26
255
+ msgid "Box width"
256
+ msgstr "Largeur du popup"
257
+
258
+ #: admin/views/metaboxes/metabox-appearance.php:32
259
+ msgid "Border color"
260
+ msgstr "Couleur du cadre"
261
+
262
+ #: admin/views/metaboxes/metabox-appearance.php:36
263
+ msgid "Border width"
264
+ msgstr "Épaisseur du cadre"
265
+
266
+ #: admin/views/metaboxes/metabox-donate.php:6
267
+ msgid "If you like this plugin, consider supporting it by donating."
268
+ msgstr "Si vous aimez ce plugin, manifestez-le par une donation."
269
+
270
+ #: admin/views/metaboxes/metabox-donate.php:8
271
+ msgid "Donate with PayPal"
272
+ msgstr "Donnez avec PayPal"
273
+
274
+ #: admin/views/metaboxes/metabox-donate.php:10
275
+ msgid "Some other ways to support this plugin"
276
+ msgstr "Quelques autres façons de supporter ce plugin"
277
+
278
+ #: admin/views/metaboxes/metabox-donate.php:12
279
+ msgid "Leave a &#9733;&#9733;&#9733;&#9733;&#9733; review on WordPress.org"
280
+ msgstr ""
281
+ "Laissez une &#9733;&#9733;&#9733;&#9733;&#9733; appréciation sur WordPress."
282
+ "org"
283
+
284
+ #: admin/views/metaboxes/metabox-donate.php:13
285
+ msgid "Write about Popups on your blog"
286
+ msgstr "Ecrivez un article à propos de Popups dans votre blog"
287
+
288
+ #: admin/views/metaboxes/metabox-donate.php:14
289
+ msgid "Tweet about Popups"
290
+ msgstr "Tweetez à propos de Popups"
291
+
292
+ #: admin/views/metaboxes/metabox-donate.php:15
293
+ msgid "Vote \"works\" on the WordPress.org plugin page"
294
+ msgstr "Votez « works » sur la page plugin de WordPress.org"
295
+
296
+ #: admin/views/metaboxes/metabox-help.php:6
297
+ msgid ""
298
+ "You have some social shortcodes to use that will print a Facebook like, a "
299
+ "Google+ Follow and a Twitter follow. Check the available options and "
300
+ "<strong>configure them with your social accounts</strong>:"
301
+ msgstr ""
302
+ "Vous avez des shortcodes pour imprimer des « like » dans Facebook, des "
303
+ "« Follow » dans Google+ ou dans Twitter. Vérifiez les options disponibles et "
304
+ "<strong> configurez-les avec vos comptes sociaux </strong> :"
305
+
306
+ #: admin/views/metaboxes/metabox-help.php:8
307
+ msgid "Facebook Page"
308
+ msgstr "Page Facebook"
309
+
310
+ #: admin/views/metaboxes/metabox-help.php:12
311
+ msgid "View Facebook Page Options"
312
+ msgstr "Voir les options pour les pages Facebook"
313
+
314
+ #: admin/views/metaboxes/metabox-help.php:14
315
+ #: admin/views/metaboxes/metabox-help.php:27
316
+ msgid "Your Facebook page url"
317
+ msgstr "L’url de votre page Facebook"
318
+
319
+ #: admin/views/metaboxes/metabox-help.php:15
320
+ msgid "Your page name"
321
+ msgstr "Le nom de votre page"
322
+
323
+ #: admin/views/metaboxes/metabox-help.php:16
324
+ msgid "true|false <b>Default value:</b> true"
325
+ msgstr "vrai|faux <b>valeur par défaut :</b> vrai"
326
+
327
+ #: admin/views/metaboxes/metabox-help.php:17
328
+ msgid "true|false <b>Default value:</b> false"
329
+ msgstr "vrai|faux <b>valeur par défaut :</b> faux"
330
+
331
+ #: admin/views/metaboxes/metabox-help.php:18
332
+ msgid "number <b>Default value:</b> 500"
333
+ msgstr "nombre <b>Valeur par défaut :</b> 500"
334
+
335
+ #: admin/views/metaboxes/metabox-help.php:21
336
+ msgid "Facebook Button"
337
+ msgstr "Bouton Facebook"
338
+
339
+ #: admin/views/metaboxes/metabox-help.php:25
340
+ msgid "View Facebook Options"
341
+ msgstr "Voir les options Facebook"
342
+
343
+ #: admin/views/metaboxes/metabox-help.php:28
344
+ msgid "standard, box_count, button <b>Default value:</b> button_count"
345
+ msgstr "standard, box_count, bouton <b> Valeur par défaut: </b> button_count"
346
+
347
+ #: admin/views/metaboxes/metabox-help.php:29
348
+ #: admin/views/metaboxes/metabox-help.php:30
349
+ msgid "true <b>Default value:</b> false"
350
+ msgstr "vrai <b>Valeur par défaut :</b> faux"
351
+
352
+ #: admin/views/metaboxes/metabox-help.php:31
353
+ msgid "recommend <b>Default value:</b> like"
354
+ msgstr "recommander <b>Valeur par défaut:</b> aimer"
355
+
356
+ #: admin/views/metaboxes/metabox-help.php:32
357
+ msgid "number <b>Default value:</b>"
358
+ msgstr "nombre <b>Valeur par défaut :</b>"
359
+
360
+ #: admin/views/metaboxes/metabox-help.php:34
361
+ msgid "Google+ Button"
362
+ msgstr "Bouton Google+"
363
+
364
+ #: admin/views/metaboxes/metabox-help.php:38
365
+ msgid "View Google+ Options"
366
+ msgstr "Voir les options Google+"
367
+
368
+ #: admin/views/metaboxes/metabox-help.php:40
369
+ msgid "Your Google+ url"
370
+ msgstr "Votre url Google+"
371
+
372
+ #: admin/views/metaboxes/metabox-help.php:41
373
+ msgid "small, standard, tall <b>Default value:</b> medium"
374
+ msgstr "petit, standard, grand <b>Valeur par défaut:</b> médium"
375
+
376
+ #: admin/views/metaboxes/metabox-help.php:42
377
+ msgid "inline, none <b>Default value:</b> bubble"
378
+ msgstr "en ligne, non <b>Valeur par défaut :</b> bulle"
379
+
380
+ #: admin/views/metaboxes/metabox-help.php:44
381
+ msgid "Twitter Button"
382
+ msgstr "Bouton twitter"
383
+
384
+ #: admin/views/metaboxes/metabox-help.php:48
385
+ msgid "View Twitter Options"
386
+ msgstr "Voir les options twitter"
387
+
388
+ #: admin/views/metaboxes/metabox-help.php:50
389
+ msgid "Your Twitter user <b>Default chifliiiii</b>"
390
+ msgstr "Votre nom d’utilisateur Twitter <b>Par défaut chifliiiii</b>"
391
+
392
+ #: admin/views/metaboxes/metabox-help.php:51
393
+ msgid "false <b>Default value:</b> true"
394
+ msgstr "faux <b>valeur par défaut:</b> vrai"
395
+
396
+ #: admin/views/metaboxes/metabox-help.php:52
397
+ msgid "large <b>Default value:</b> \"\""
398
+ msgstr "grans <b>Valeur par défaut :</b> \"\""
399
+
400
+ #: admin/views/metaboxes/metabox-help.php:55
401
+ msgid "Other available Shortcodes:"
402
+ msgstr "Autres Shortcodes utilisables :"
403
+
404
+ #: admin/views/metaboxes/metabox-help.php:56
405
+ msgid "Close Button"
406
+ msgstr "Bouton de fermeture"
407
+
408
+ #: admin/views/metaboxes/metabox-help.php:60
409
+ msgid "View Close shortcode Options"
410
+ msgstr "Voir les options shortcode de fermeture"
411
+
412
+ #: admin/views/metaboxes/metabox-help.php:62
413
+ msgid "Pass a custom class to style your button"
414
+ msgstr "Envoie une classe personnalisée pour styler votre bouton"
415
+
416
+ #: admin/views/metaboxes/metabox-help.php:63
417
+ msgid "Button label - <b>Default value:</b> Close"
418
+ msgstr "Nom du bouton - <b>valeur par défaut :</b> Fermer"
419
+
420
+ #: admin/views/metaboxes/metabox-help.php:64
421
+ msgid "left, right, center, none - <b>Default value:</b> center"
422
+ msgstr "gauche, droite, centré, aucun - <b>valeur par défaut:</b> centré"
423
+
424
+ #: admin/views/metaboxes/metabox-links.php:6
425
+ msgid "My name is"
426
+ msgstr "Mon nom est"
427
+
428
+ #: admin/views/metaboxes/metabox-links.php:6
429
+ msgid "I develop WordPress plugins and themes."
430
+ msgstr "Je développe des thèmes et des plugins pour WordPress."
431
+
432
+ #: admin/views/metaboxes/metabox-links.php:7
433
+ #, php-format
434
+ msgid ""
435
+ "Take a look at my <a href=\"%s\">site</a> to see my other plugins or hire "
436
+ "me. Subscribe to get updates!"
437
+ msgstr ""
438
+ "Jetez un coup d’œil à mon <a href=\"%s\">site</a> pour découvrir mes autres "
439
+ "plugins ou me passer une commande. Inscrivez-vous pour obtenir des mises à "
440
+ "jour !"
441
+
442
+ #: admin/views/metaboxes/metabox-links.php:8
443
+ msgid "Other plugins I built:"
444
+ msgstr "Mes autres plugins :"
445
+
446
+ #: admin/views/metaboxes/metabox-links.php:10
447
+ msgid "Install multiple plugins and create collections"
448
+ msgstr "Installez de multiples plugins et créez des ensembles"
449
+
450
+ #: admin/views/metaboxes/metabox-links.php:11
451
+ msgid "Geotarget your content"
452
+ msgstr "Ciblez géographiquement votre contenu"
453
+
454
+ #: admin/views/metaboxes/metabox-links.php:12
455
+ msgid "Invite your network friends and import contacts"
456
+ msgstr "Invitez vos amis et vos contacts importés"
457
+
458
+ #: admin/views/metaboxes/metabox-options.php:9
459
+ msgid "Box Position"
460
+ msgstr "Position du popup"
461
+
462
+ #: admin/views/metaboxes/metabox-options.php:12
463
+ msgid "Centered"
464
+ msgstr "Centré"
465
+
466
+ #: admin/views/metaboxes/metabox-options.php:13
467
+ msgid "Top Left"
468
+ msgstr "En haut à gauche"
469
+
470
+ #: admin/views/metaboxes/metabox-options.php:14
471
+ msgid "Top Right"
472
+ msgstr "En haut à droite"
473
+
474
+ #: admin/views/metaboxes/metabox-options.php:15
475
+ msgid "Bottom Left"
476
+ msgstr "En bas à gauche"
477
+
478
+ #: admin/views/metaboxes/metabox-options.php:16
479
+ msgid "Bottom Right"
480
+ msgstr "En bas à droite"
481
+
482
+ #: admin/views/metaboxes/metabox-options.php:23
483
+ msgid "Trigger action"
484
+ msgstr "Action de déclenchement"
485
+
486
+ #: admin/views/metaboxes/metabox-options.php:27
487
+ msgid "seconds after page load"
488
+ msgstr "secondes après chargement de la page"
489
+
490
+ #: admin/views/metaboxes/metabox-options.php:28
491
+ msgid "of page height"
492
+ msgstr "de hauteur de page"
493
+
494
+ #: admin/views/metaboxes/metabox-options.php:38
495
+ msgid "Auto-hide?"
496
+ msgstr "Auto-disparition ?"
497
+
498
+ #: admin/views/metaboxes/metabox-options.php:40
499
+ #: admin/views/metaboxes/metabox-options.php:68
500
+ #: admin/views/metaboxes/metabox-options.php:76
501
+ #: admin/views/metaboxes/metabox-options.php:84
502
+ msgid "Yes"
503
+ msgstr "Oui"
504
+
505
+ #: admin/views/metaboxes/metabox-options.php:41
506
+ #: admin/views/metaboxes/metabox-options.php:69
507
+ #: admin/views/metaboxes/metabox-options.php:77
508
+ #: admin/views/metaboxes/metabox-options.php:85
509
+ msgid "No"
510
+ msgstr "Non"
511
+
512
+ #: admin/views/metaboxes/metabox-options.php:42
513
+ msgid "Hide box again when visitors scroll back up?"
514
+ msgstr "Cacher le popup quand les visiteurs provoquent un défilement ?"
515
+
516
+ #: admin/views/metaboxes/metabox-options.php:46
517
+ msgid "Animation"
518
+ msgstr "Animation"
519
+
520
+ #: admin/views/metaboxes/metabox-options.php:49
521
+ msgid "Fade In"
522
+ msgstr "Par fondu"
523
+
524
+ #: admin/views/metaboxes/metabox-options.php:50
525
+ msgid "Slide In"
526
+ msgstr "Par glissement"
527
+
528
+ #: admin/views/metaboxes/metabox-options.php:53
529
+ msgid "Slide will only apply when popup is on the corners"
530
+ msgstr "Le glissement ne se fait que si le popup est dans un coin"
531
+
532
+ #: admin/views/metaboxes/metabox-options.php:58
533
+ msgid "Cookie expiration days"
534
+ msgstr "Durée du cookie en jours"
535
+
536
+ #: admin/views/metaboxes/metabox-options.php:61
537
+ msgid "After closing the box, how many days should it stay hidden?"
538
+ msgstr ""
539
+ "Après fermeture du popup pendant combien de jours ne doit-il pas reparaître ?"
540
+
541
+ #: admin/views/metaboxes/metabox-options.php:66
542
+ msgid "Enable test mode?"
543
+ msgstr "Activer le mode test ?"
544
+
545
+ #: admin/views/metaboxes/metabox-options.php:70
546
+ msgid ""
547
+ "If test mode is enabled, the box will show up regardless of whether a cookie "
548
+ "has been set. (To admins only)"
549
+ msgstr ""
550
+ "Si le mode test est activé, le popup ne tiendra pas compte des consignes du "
551
+ "cookie. (Administrateurs seulement)"
552
+
553
+ #: admin/views/metaboxes/metabox-options.php:74
554
+ msgid "Close on conversion?"
555
+ msgstr "Fermer sur conversion ?"
556
+
557
+ #: admin/views/metaboxes/metabox-options.php:78
558
+ msgid ""
559
+ "If you have a form or social shortcode, by default popup will close on "
560
+ "submission/conversion"
561
+ msgstr ""
562
+ "Si vous avez un formulaire ou un shortcode de réseau social, par défaut le "
563
+ "popup se fermera sur soumission/conversion"
564
+
565
+ #: admin/views/metaboxes/metabox-options.php:82
566
+ msgid "Show powered by link?"
567
+ msgstr "Afficher un lien « powered by » ?"
568
+
569
+ #: admin/views/metaboxes/metabox-options.php:86
570
+ #, php-format
571
+ msgid ""
572
+ "Shows a \"powered by\" link below your popup. If your affiliate link is set "
573
+ "in the <a href=\"%s\">settings</a>, it will be used."
574
+ msgstr ""
575
+ "Afficher un lien « Powered by » sous votre popup. Si vous êtes affilié le "
576
+ "lien est mis dans <a href=\"%s\">réglages</a>, pour être utilisé."
577
+
578
+ #: admin/views/metaboxes/metabox-premium.php:16
579
+ msgid ""
580
+ "Take the best WordPress Popups plugin to the next level with Popups Premium "
581
+ "extension."
582
+ msgstr ""
583
+ "Avec l’extension Popups Premium pour WordPress choisissez le meilleur plugin."
584
+
585
+ #: admin/views/metaboxes/metabox-premium.php:17
586
+ msgid "Popups Premium Features:"
587
+ msgstr "Fonctionnalités de Popups Premium :"
588
+
589
+ #: admin/views/metaboxes/metabox-premium.php:19
590
+ msgid "Beautiful optin forms for popular mail providers"
591
+ msgstr ""
592
+ "Élégants formulaires de souscription pour les plus populaires distributeurs "
593
+ "de mails"
594
+
595
+ #: admin/views/metaboxes/metabox-premium.php:20
596
+ msgid "Currently supporting MailChimp, Aweber, Postmatic, Mailpoet"
597
+ msgstr "Supporte MailChimp, Aweber, Postmatic, Mailpoet"
598
+
599
+ #: admin/views/metaboxes/metabox-premium.php:21
600
+ msgid ""
601
+ "Track impressions and Conversions of social likes and forms submissions like "
602
+ "Contact Form 7, Gravity forms, etc"
603
+ msgstr ""
604
+ "Enregistre les impressions et conversions à partir des réseaux sociaux ou "
605
+ "des formulaires de soumission comme Contac Form 7, Gravity Forms etc"
606
+
607
+ #: admin/views/metaboxes/metabox-premium.php:22
608
+ msgid "Track impressions and Conversions also in Google Analytics"
609
+ msgstr "Enregistre aussi les impressions et conversion dans Google Analytics"
610
+
611
+ #: admin/views/metaboxes/metabox-premium.php:23
612
+ #: admin/views/metaboxes/metabox-premium.php:25
613
+ msgid "Exit Intent technology"
614
+ msgstr ""
615
+ "Intégration de « Exit Intent technology » pour suivre les mouvements de la "
616
+ "souris de l’utilisateur et prévoir sa sortie"
617
+
618
+ #: admin/views/metaboxes/metabox-premium.php:24
619
+ msgid "8 New animations effects"
620
+ msgstr "8 nouvelles animations"
621
+
622
+ #: admin/views/metaboxes/metabox-premium.php:26
623
+ msgid "New trigger methods"
624
+ msgstr "Nouvelles méthodes de déclenchement"
625
+
626
+ #: admin/views/metaboxes/metabox-premium.php:27
627
+ msgid "Timer for auto closing"
628
+ msgstr "Minuteur pour fermeture automatique"
629
+
630
+ #: admin/views/metaboxes/metabox-premium.php:28
631
+ msgid "Ability to disable close button"
632
+ msgstr "Possibilité de désactiver le bouton de fermeture"
633
+
634
+ #: admin/views/metaboxes/metabox-premium.php:29
635
+ msgid ""
636
+ "Ability to disable Advanced close methods like esc or clicking outside of "
637
+ "the popup"
638
+ msgstr ""
639
+ "Possibilité de désactiver les méthodes avances de fermeture comme esc ou "
640
+ "clic à l’extérieur du popup"
641
+
642
+ #: admin/views/metaboxes/metabox-premium.php:30
643
+ msgid "Premium support"
644
+ msgstr "Support Premium"
645
+
646
+ #: admin/views/metaboxes/metabox-premium.php:34
647
+ msgid "Buy Now!"
648
+ msgstr "Achetez maintenant !"
649
+
650
+ #: admin/views/metaboxes/metabox-rules.php:19
651
+ msgid "Rules"
652
+ msgstr "Règles"
653
+
654
+ #: admin/views/metaboxes/metabox-rules.php:20
655
+ msgid "Create a set of rules to determine where the popup will show"
656
+ msgstr ""
657
+ "Créez un ensemble de règles pour déterminer quand le popup doit apparaître"
658
+
659
+ #: admin/views/metaboxes/metabox-rules.php:31
660
+ msgid "Show this popup if"
661
+ msgstr "Affichez le popup si"
662
+
663
+ #: admin/views/metaboxes/metabox-rules.php:61
664
+ msgid "is equal to"
665
+ msgstr "est égal à"
666
+
667
+ #: admin/views/metaboxes/metabox-rules.php:62
668
+ msgid "is not equal to"
669
+ msgstr "est différent de"
670
+
671
+ #: admin/views/metaboxes/metabox-rules.php:93
672
+ msgid "and"
673
+ msgstr "et"
674
+
675
+ #: admin/views/metaboxes/metabox-rules.php:108
676
+ msgid "Add rule group"
677
+ msgstr "Ajoutez une règle"
678
+
679
+ #: admin/views/metaboxes/metabox-support.php:6
680
+ #, php-format
681
+ msgid "You are using Popups plugin v%s"
682
+ msgstr "Vous utilisez la version v%s du plugin Popups"
683
+
684
+ #: admin/views/metaboxes/metabox-support.php:7
685
+ #, php-format
686
+ msgid ""
687
+ "If you need support please go to the WordPress.org <a href=\"%s\">support "
688
+ "forums</a>"
689
+ msgstr ""
690
+ "Si vous avez besoin d’une aide, d’un support, rendez-vous sur le <a href=\"%s"
691
+ "\">forum WordPress.org</a>"
692
+
693
+ #: admin/views/settings-page.php:17
694
+ msgid "Affiliate link"
695
+ msgstr "Lien affilié"
696
+
697
+ #: admin/views/settings-page.php:20
698
+ #, php-format
699
+ msgid ""
700
+ "You can earn money by promoting the plugin! Join <a href=\"%s\">our "
701
+ "affiliate program</a> and paste your affiliate link here to earn 35&#37; in "
702
+ "commissions . Once entered, it will replace the default \"Powered by\" on "
703
+ "the popups."
704
+ msgstr ""
705
+ "Monétisez votre site en faisant la promotion du plugin ! Rejoignez <a "
706
+ "href=« %s »>notre programme d’affiliation</a> et collez votre lien d’affilié "
707
+ "ici pour percevoir 35&#37; par commission . Une fois enregistrer il "
708
+ "remplacera la notation par défaut « Powered by » dans les popups."
709
+
710
+ #: admin/views/settings-page.php:24
711
+ msgid "Ajax mode?"
712
+ msgstr "Mode Ajax ?"
713
+
714
+ #: admin/views/settings-page.php:27
715
+ msgid ""
716
+ "Load popups using ajax. Compatible with cache plugins, but might not work "
717
+ "with all plugins"
718
+ msgstr ""
719
+ "Utilise Ajax pour charger les popups. Compatible avec les plugins de cache, "
720
+ "mais peut ne pas fonctionner avec tous les plugins"
721
+
722
+ #: admin/views/settings-page.php:32
723
+ msgid "Enable Debug mode?"
724
+ msgstr "Activer mode de débogage ?"
725
+
726
+ #: admin/views/settings-page.php:35
727
+ msgid "Will use uncompressed js"
728
+ msgstr "Utilisera des js non compressés"
729
+
730
+ #: admin/views/settings-page.php:40
731
+ msgid "Enable safe mode?"
732
+ msgstr "Activer mode sans échec ?"
733
+
734
+ #: admin/views/settings-page.php:43
735
+ msgid "Will move all popups to top of the screen."
736
+ msgstr "Ouvrira tous les popups en haut de l’écran."
737
+
738
+ #: admin/views/settings-page.php:48
739
+ msgid "Remove shortcodes style"
740
+ msgstr "Supprimer le style des shortcodes"
741
+
742
+ #: admin/views/settings-page.php:51
743
+ msgid ""
744
+ "By default the plugin will apply some style to shortcodes. Check here if you "
745
+ "want to manually style them"
746
+ msgstr ""
747
+ "Par défaut le plugin applique un style aux shortcodes. Cochez ici si vous "
748
+ "voulez les styler manuellement"
749
+
750
+ #: admin/views/settings-page.php:56
751
+ msgid "Unload Facebook javascript"
752
+ msgstr "Ne pas charger le javascript de Facebook"
753
+
754
+ #: admin/views/settings-page.php:59
755
+ msgid "If you use your own Facebook script, check this"
756
+ msgstr "Si vous utilisez votre propre script Facebook, cochez ici"
757
+
758
+ #: admin/views/settings-page.php:64
759
+ msgid "Unload Google javascript"
760
+ msgstr "Ne pas charger le javascript de Google"
761
+
762
+ #: admin/views/settings-page.php:67
763
+ msgid "If you use your own Google script, check this"
764
+ msgstr "Si vous utilisez votre propre script Google, cochez ici"
765
+
766
+ #: admin/views/settings-page.php:72
767
+ msgid "Unload Twitter javascript"
768
+ msgstr "Ne pas charger le javascript de Twitter"
769
+
770
+ #: admin/views/settings-page.php:75
771
+ msgid "If you use your own Twitter script, check this"
772
+ msgstr "Si vous utilisez votre propre script pour Twitter, cochez ici"
773
+
774
+ #: admin/views/settings-page.php:82
775
+ msgid "Delete all data on Uninstall"
776
+ msgstr "Effacez toutes les données en cas de désinstallation"
777
+
778
+ #: admin/views/settings-page.php:85
779
+ msgid ""
780
+ "When you uninstall the plugin all popups, settings and stats will be deleted "
781
+ "from your db"
782
+ msgstr ""
783
+ "Quand vous désinstallez le plugin tous les popups, les réglages et les "
784
+ "statistiques sont effacées de la base de données"
785
+
786
+ #: admin/views/settings-page.php:89
787
+ msgid "Save settings"
788
+ msgstr "Sauvegarder les réglages"
789
+
790
+ #: includes/class-spu-helper.php:131
791
+ msgid "All Pages"
792
+ msgstr "Toutes les pages"
793
+
794
+ #: includes/class-spu-helper.php:132
795
+ msgid "Front Page"
796
+ msgstr "Page de garde"
797
+
798
+ #: includes/class-spu-helper.php:133
799
+ msgid "Posts Page"
800
+ msgstr "Page des articles"
801
+
802
+ #: includes/class-spu-helper.php:134
803
+ msgid "Category Page"
804
+ msgstr "Page catégories"
805
+
806
+ #: includes/class-spu-helper.php:135
807
+ msgid "Search Page"
808
+ msgstr "Page recherche"
809
+
810
+ #: includes/class-spu-helper.php:136
811
+ msgid "Archives Page"
812
+ msgstr "Page archives"
813
+
814
+ #: includes/class-spu-helper.php:137
815
+ msgid "Top Level Page (parent of 0)"
816
+ msgstr "Page de premier niveau (parent de 0)"
817
+
818
+ #: includes/class-spu-helper.php:138
819
+ msgid "Parent Page (has children)"
820
+ msgstr "Page parent (a un enfant)"
821
+
822
+ #: includes/class-spu-helper.php:139
823
+ msgid "Child Page (has parent)"
824
+ msgstr "Page enfant (a un parent)"
825
+
826
+ #: includes/class-spu-helper.php:147
827
+ msgid "Default Template"
828
+ msgstr "Modèle par défaut"
829
+
830
+ #: includes/class-spu-helper.php:220
831
+ msgid "Publish"
832
+ msgstr "Publier"
833
+
834
+ #: includes/class-spu-helper.php:221
835
+ msgid "Pending Review"
836
+ msgstr "Révision en attente"
837
+
838
+ #: includes/class-spu-helper.php:222
839
+ msgid "Draft"
840
+ msgstr "Brouillon"
841
+
842
+ #: includes/class-spu-helper.php:223
843
+ msgid "Future"
844
+ msgstr "Avenir"
845
+
846
+ #: includes/class-spu-helper.php:224
847
+ msgid "Private"
848
+ msgstr "Privé"
849
+
850
+ #: includes/class-spu-helper.php:225
851
+ msgid "Revision"
852
+ msgstr "Révision"
853
+
854
+ #: includes/class-spu-helper.php:226
855
+ msgid "Trash"
856
+ msgstr "Corbeille"
857
+
858
+ #: includes/class-spu-helper.php:239
859
+ msgid "Super Admin"
860
+ msgstr "Super Administrateur"
861
+
862
+ #: includes/class-spu-helper.php:259
863
+ msgid "True"
864
+ msgstr "Vrai"
languages/popups-ru_RU.po CHANGED
@@ -1,730 +1,730 @@
1
- # Copyright (C) 2013 TODO
2
- # This file is distributed under the same license as the TODO package.
3
- # Translators:
4
- # Анатолий, 2015
5
- msgid ""
6
- msgstr ""
7
- "Project-Id-Version: Popups\n"
8
- "Report-Msgid-Bugs-To: http://wordpress.org/plugins/plugin-name\n"
9
- "POT-Creation-Date: 2015-06-14 00:02-0300\n"
10
- "PO-Revision-Date: 2015-10-01 11:18-0300\n"
11
- "Last-Translator: Анатолий\n"
12
- "Language-Team: Russian (Russia) (http://www.transifex.com/timersys/popups/language/ru_RU/)\n"
13
- "MIME-Version: 1.0\n"
14
- "Content-Type: text/plain; charset=UTF-8\n"
15
- "Content-Transfer-Encoding: 8bit\n"
16
- "Language: ru_RU\n"
17
- "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n"
18
- "X-Generator: Poedit 1.7.4\n"
19
- "X-Poedit-Basepath: ../\n"
20
- "X-Poedit-KeywordsList: __;_e;_n;_x;esc_html_e;esc_html__;esc_attr_e;esc_attr__;_ex:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2;_x:1,2c;_n:1,2\n"
21
- "X-Poedit-SearchPath-0: .\n"
22
-
23
- #: admin/class-social-popup-admin.php:154
24
- msgctxt "post type singular name"
25
- msgid "Popups"
26
- msgstr "Popups"
27
-
28
- #: admin/class-social-popup-admin.php:155
29
- msgctxt "admin menu"
30
- msgid "Popups"
31
- msgstr "Popups"
32
-
33
- #: admin/class-social-popup-admin.php:156
34
- msgctxt "add new on admin bar"
35
- msgid "Popups"
36
- msgstr "Popups"
37
-
38
- #: admin/class-social-popup-admin.php:157
39
- msgctxt "Popups"
40
- msgid "Add New"
41
- msgstr "Добавить новый"
42
-
43
- #: admin/class-social-popup-admin.php:158
44
- msgid "Add New Popups"
45
- msgstr "Добавить новый Popups"
46
-
47
- #: admin/class-social-popup-admin.php:159
48
- msgid "New Popups"
49
- msgstr "Новый Popups"
50
-
51
- #: admin/class-social-popup-admin.php:160
52
- msgid "Edit Popups"
53
- msgstr "Редактировать Popups"
54
-
55
- #: admin/class-social-popup-admin.php:161
56
- msgid "View Popups"
57
- msgstr "Редактировать Popups"
58
-
59
- #: admin/class-social-popup-admin.php:162
60
- msgid "All Popups"
61
- msgstr "Все Popups"
62
-
63
- #: admin/class-social-popup-admin.php:163
64
- msgid "Search Popups"
65
- msgstr "Поиск Popups"
66
-
67
- #: admin/class-social-popup-admin.php:164
68
- msgid "Parent Popups:"
69
- msgstr "Родительский Popups:"
70
-
71
- #: admin/class-social-popup-admin.php:165
72
- msgid "No Popups found."
73
- msgstr "Не найден Popups"
74
-
75
- #: admin/class-social-popup-admin.php:166
76
- msgid "No Popups found in Trash."
77
- msgstr "Не найден Popups в Корзине"
78
-
79
- #: admin/class-social-popup-admin.php:255
80
- msgid "Popups Premium"
81
- msgstr "Премиум Popups"
82
-
83
- #: admin/class-social-popup-admin.php:266
84
- msgid "PopUp Shortcodes"
85
- msgstr "Шорткоды PopUp"
86
-
87
- #: admin/class-social-popup-admin.php:275
88
- msgid "PopUp Display Rules"
89
- msgstr "Отображать правила PopUp"
90
-
91
- #: admin/class-social-popup-admin.php:284
92
- msgid "Display Options"
93
- msgstr "Отображать опции"
94
-
95
- #: admin/class-social-popup-admin.php:293
96
- msgid "Need support?"
97
- msgstr "Нужна помощь?"
98
-
99
- #: admin/class-social-popup-admin.php:301
100
- msgid "Donate & support"
101
- msgstr "Помощь и Поддержка"
102
-
103
- #: admin/class-social-popup-admin.php:309
104
- msgid "About the developer"
105
- msgstr "О разработчике"
106
-
107
- #: admin/class-social-popup-admin.php:557 admin/views/metaboxes/metabox-rules.php:33 admin/views/metaboxes/metabox-rules.php:106
108
- msgid "or"
109
- msgstr "или"
110
-
111
- #: admin/class-social-popup-admin.php:584
112
- msgid "Add a Popup"
113
- msgstr "Добавить Popup"
114
-
115
- #: admin/class-social-popup-admin.php:708
116
- msgid "User"
117
- msgstr "Пользователь"
118
-
119
- #: admin/class-social-popup-admin.php:709
120
- msgid "User role"
121
- msgstr "Роль пользователя"
122
-
123
- #: admin/class-social-popup-admin.php:710
124
- msgid "User is logged"
125
- msgstr "Пользователь залогинен"
126
-
127
- #: admin/class-social-popup-admin.php:711
128
- msgid "User never left a comment"
129
- msgstr "Пользователь никогда не комментировал"
130
-
131
- #: admin/class-social-popup-admin.php:712
132
- msgid "User came via a search engine"
133
- msgstr "Пользователь пришел из поисковых систем"
134
-
135
- #: admin/class-social-popup-admin.php:713
136
- msgid "User did not arrive via another page on your site"
137
- msgstr "Пользователь не пришел с другой страницы на вашем сайте"
138
-
139
- #: admin/class-social-popup-admin.php:715 admin/class-social-popup-admin.php:716
140
- msgid "Post"
141
- msgstr "Публикация"
142
-
143
- #: admin/class-social-popup-admin.php:717
144
- msgid "Post ID"
145
- msgstr "ID публикации"
146
-
147
- #: admin/class-social-popup-admin.php:718
148
- msgid "Post Type"
149
- msgstr "Тип публикации"
150
-
151
- #: admin/class-social-popup-admin.php:719
152
- msgid "Post Category"
153
- msgstr "Категория публикации"
154
-
155
- #: admin/class-social-popup-admin.php:720
156
- msgid "Post Format"
157
- msgstr "Формат публикации"
158
-
159
- #: admin/class-social-popup-admin.php:721
160
- msgid "Post Status"
161
- msgstr "Статус публикации"
162
-
163
- #: admin/class-social-popup-admin.php:722
164
- msgid "Post Taxonomy"
165
- msgstr "Таксономия публикации"
166
-
167
- #: admin/class-social-popup-admin.php:724 admin/class-social-popup-admin.php:725
168
- msgid "Page"
169
- msgstr "Страница"
170
-
171
- #: admin/class-social-popup-admin.php:726
172
- msgid "Page Type"
173
- msgstr "Тип страницы"
174
-
175
- #: admin/class-social-popup-admin.php:727
176
- msgid "Page Parent"
177
- msgstr "Родительская страница"
178
-
179
- #: admin/class-social-popup-admin.php:728
180
- msgid "Page Template"
181
- msgstr "Шаблон страницы"
182
-
183
- #: admin/class-social-popup-admin.php:730
184
- msgid "Other"
185
- msgstr "Другие"
186
-
187
- #: admin/class-social-popup-admin.php:731
188
- msgid "Referrer"
189
- msgstr "Реферер"
190
-
191
- #: admin/class-social-popup-admin.php:732
192
- msgid "Mobile Phone"
193
- msgstr "Мобильный телефон"
194
-
195
- #: admin/class-social-popup-admin.php:733
196
- msgid "Tablet"
197
- msgstr "Планшет"
198
-
199
- #: admin/includes/class-spu-notices.php:30
200
- #, php-format
201
- msgid "We noticed that you have been using our plugin for a while and we would like to ask you a little favour. If you are happy with it and can take a minute please <a href=\"%s\" target=\"_blank\">leave a nice review</a> on WordPress. It will be a tremendous help for us!"
202
- msgstr "Мы заметили, что вы использовали наш плагин некоторое время, и мы хотели бы попросить оказать нам небольшую услугу. Если вам понравился наш плагин и у вас есть свободная минутка, пожалуйста <a href=\"%s\" target=\"_blank\">оставьте хороший отзыв</a> на WordPress. Это будет огромная помощь для нас!"
203
-
204
- #: admin/includes/class-spu-notices.php:32
205
- #, php-format
206
- msgid "<a href=\"%s\" target=\"_blank\">Leave a nice review</a>"
207
- msgstr "<a href=\"%s\" target=\"_blank\">Оставьте хороший отзыв</a>"
208
-
209
- #: admin/includes/class-spu-notices.php:33
210
- #, php-format
211
- msgid "<a href=\"%s\">No, thanks</a>"
212
- msgstr "<a href=\"%s\">Нет, спасибо</a>"
213
-
214
- #: admin/views/metaboxes/metabox-donate.php:6
215
- msgid "If you like this plugin, consider supporting it by donating."
216
- msgstr "Если вам нравится этот плагин, поддержите, пожалуйста, его."
217
-
218
- #: admin/views/metaboxes/metabox-donate.php:8
219
- msgid "Donate with PayPal"
220
- msgstr "Помочь через PayPal"
221
-
222
- #: admin/views/metaboxes/metabox-donate.php:10
223
- msgid "Some other ways to support this plugin"
224
- msgstr "Некоторые другие способы поддержки этого плагина"
225
-
226
- #: admin/views/metaboxes/metabox-donate.php:12
227
- msgid "Leave a &#9733;&#9733;&#9733;&#9733;&#9733; review on WordPress.org"
228
- msgstr "Оставьте &#9733;&#9733;&#9733;&#9733;&#9733; отзыв на WordPress.org"
229
-
230
- #: admin/views/metaboxes/metabox-donate.php:13
231
- msgid "Write about Popups on your blog"
232
- msgstr "Напишите о плагине Popups на своем блоге"
233
-
234
- #: admin/views/metaboxes/metabox-donate.php:14
235
- msgid "Tweet about Popups"
236
- msgstr "Твитнуть о плагине Popups"
237
-
238
- #: admin/views/metaboxes/metabox-donate.php:15
239
- msgid "Vote \"works\" on the WordPress.org plugin page"
240
- msgstr "Проголосовать \"работает\" на странице плагина в WordPress.org"
241
-
242
- #: admin/views/metaboxes/metabox-help.php:6
243
- msgid "You have three social shortcodes to use that will print a Facebook like, a Google+ Follow and a Twitter follow. Check the available options and <strong>configure them with your social accounts</strong>:"
244
- msgstr "У вас есть возможность использовать три социальных Шорткода: Facebook Лайк, подписка на Google+ и следовать в Twitter. Проверьте доступные варианты и <strong>настройте их со своими социальными профилями</strong>:"
245
-
246
- #: admin/views/metaboxes/metabox-help.php:12
247
- msgid "View Facebook Page Options"
248
- msgstr "Смотреть параметры страницы в Facebook"
249
-
250
- #: admin/views/metaboxes/metabox-help.php:14 admin/views/metaboxes/metabox-help.php:27
251
- msgid "Your facebook page url"
252
- msgstr "Ссылка на вашу страницу Facebook"
253
-
254
- #: admin/views/metaboxes/metabox-help.php:15
255
- msgid "Your page name"
256
- msgstr "Имя вашей страницы"
257
-
258
- #: admin/views/metaboxes/metabox-help.php:16
259
- msgid "true|false <b>Default value:</b> true"
260
- msgstr "true|false <b>Значение по умолчанию:</b> true"
261
-
262
- #: admin/views/metaboxes/metabox-help.php:17
263
- msgid "true|false <b>Default value:</b> false"
264
- msgstr "true|false <b>Значение по умолчанию:</b> false"
265
-
266
- #: admin/views/metaboxes/metabox-help.php:25
267
- msgid "View Facebook Options"
268
- msgstr "Посмотреть опции Facebook"
269
-
270
- #: admin/views/metaboxes/metabox-help.php:28
271
- msgid "standard, box_count, button <b>Default value:</b> button_count"
272
- msgstr "standard, box_count, button <b>Значение по умолчанию:</b> button_count"
273
-
274
- #: admin/views/metaboxes/metabox-help.php:29 admin/views/metaboxes/metabox-help.php:30
275
- msgid "true <b>Default value:</b> false"
276
- msgstr "true <b>Значение по умолчанию:</b> false"
277
-
278
- #: admin/views/metaboxes/metabox-help.php:31
279
- msgid "recommend <b>Default value:</b> like"
280
- msgstr "рекомендованное <b>Значение по умолчанию:</b> like"
281
-
282
- #: admin/views/metaboxes/metabox-help.php:38
283
- msgid "View Google+ Options"
284
- msgstr "Посмотреть опции Google+"
285
-
286
- #: admin/views/metaboxes/metabox-help.php:40
287
- msgid "Your Google+ url"
288
- msgstr "Ссылка на ваш Google+"
289
-
290
- #: admin/views/metaboxes/metabox-help.php:41
291
- msgid "small, standard, tall <b>Default value:</b> medium"
292
- msgstr "small, standard, tall <b>Значение по умолчанию:</b> medium"
293
-
294
- #: admin/views/metaboxes/metabox-help.php:42
295
- msgid "inline, none <b>Default value:</b> bubble"
296
- msgstr "inline, none <b>Значение по умолчанию:</b> bubble"
297
-
298
- #: admin/views/metaboxes/metabox-help.php:48
299
- msgid "View Twitter Options"
300
- msgstr "Посмотреть опции в Twitter"
301
-
302
- #: admin/views/metaboxes/metabox-help.php:50
303
- msgid "Your Twitter user <b>Default chifli</b>iiii"
304
- msgstr "Ваш пользователь в Twitter <b>chifli по умолчанию</b>iiii"
305
-
306
- #: admin/views/metaboxes/metabox-help.php:51
307
- msgid "false <b>Default value:</b> true"
308
- msgstr "false <b>Значение по умолчанию:</b> true"
309
-
310
- #: admin/views/metaboxes/metabox-help.php:52
311
- msgid "large <b>Default value:</b> \"\""
312
- msgstr "large <b>Значение по умолчанию:</b> \"\""
313
-
314
- #: admin/views/metaboxes/metabox-help.php:55
315
- msgid "Other available Shortcodes:"
316
- msgstr "Другие доступные шорткоды:"
317
-
318
- #: admin/views/metaboxes/metabox-help.php:60
319
- msgid "View Close shortcode Options"
320
- msgstr "Помостреть Закрыть опции шорткодов"
321
-
322
- #: admin/views/metaboxes/metabox-help.php:62
323
- msgid "Pass a custom class to style your button"
324
- msgstr "Передайте собственный класс стиля для ваших кнопок"
325
-
326
- #: admin/views/metaboxes/metabox-help.php:63
327
- msgid "Button label - <b>Default value:</b> Close"
328
- msgstr "Значение кнопки - <b>Значение по умолчанию:</b> Close"
329
-
330
- #: admin/views/metaboxes/metabox-help.php:64
331
- msgid "left, right, center, none - <b>Default value:</b> center"
332
- msgstr "left, right, center, none - <b>Значение по умолчанию:</b> center"
333
-
334
- #: admin/views/metaboxes/metabox-links.php:6
335
- msgid "My name is"
336
- msgstr "Меня зовут"
337
-
338
- #: admin/views/metaboxes/metabox-links.php:6
339
- msgid "I develop WordPress plugins and themes."
340
- msgstr "Я разрабатываю плагины и темы для WordPress."
341
-
342
- #: admin/views/metaboxes/metabox-links.php:7
343
- #, php-format
344
- msgid "Take a look at my <a href=\"%s\">site</a> to see my other plugins or hire me. Subscribe to get updates!"
345
- msgstr "Взгляните на мой <a href=\"%s\">сайт</a> чтобы увидеть мои другие плагины или нанять меня. Подпишитесь на обновления!"
346
-
347
- #: admin/views/metaboxes/metabox-links.php:8
348
- msgid "Other plugins I built:"
349
- msgstr "Другие плагины которые я разработал:"
350
-
351
- #: admin/views/metaboxes/metabox-links.php:10
352
- msgid "Install multiple plugins and create collections"
353
- msgstr "Установка нескольких плагинов и создать коллекции"
354
-
355
- #: admin/views/metaboxes/metabox-links.php:11
356
- msgid "Geotarget your content"
357
- msgstr "Геотаргетинг вашего контента"
358
-
359
- #: admin/views/metaboxes/metabox-links.php:12
360
- msgid "Invite your network friends and import contacts"
361
- msgstr "Пригласить своих друзей из сети и импортировать контакты"
362
-
363
- #: admin/views/metaboxes/metabox-options.php:9
364
- msgid "Box Position"
365
- msgstr "Позиция Box"
366
-
367
- #: admin/views/metaboxes/metabox-options.php:12
368
- msgid "Centered"
369
- msgstr "По центру"
370
-
371
- #: admin/views/metaboxes/metabox-options.php:13
372
- msgid "Top Left"
373
- msgstr "Слева вверху"
374
-
375
- #: admin/views/metaboxes/metabox-options.php:14
376
- msgid "Top Right"
377
- msgstr "Справа вверху"
378
-
379
- #: admin/views/metaboxes/metabox-options.php:15
380
- msgid "Bottom Left"
381
- msgstr "Внизу слева"
382
-
383
- #: admin/views/metaboxes/metabox-options.php:16
384
- msgid "Bottom Right"
385
- msgstr "Внизу справа"
386
-
387
- #: admin/views/metaboxes/metabox-options.php:23
388
- msgid "Trigger action"
389
- msgstr "Запуск действия"
390
-
391
- #: admin/views/metaboxes/metabox-options.php:27
392
- msgid "seconds after page load"
393
- msgstr "секунд после загрузки страницы"
394
-
395
- #: admin/views/metaboxes/metabox-options.php:28
396
- msgid "of page height"
397
- msgstr "высоты страницы"
398
-
399
- #: admin/views/metaboxes/metabox-options.php:38
400
- msgid "Auto-hide?"
401
- msgstr "Авто-скрытие?"
402
-
403
- #: admin/views/metaboxes/metabox-options.php:40 admin/views/metaboxes/metabox-options.php:68 admin/views/metaboxes/metabox-options.php:76 admin/views/metaboxes/metabox-options.php:84
404
- msgid "Yes"
405
- msgstr "Да"
406
-
407
- #: admin/views/metaboxes/metabox-options.php:41 admin/views/metaboxes/metabox-options.php:69 admin/views/metaboxes/metabox-options.php:77 admin/views/metaboxes/metabox-options.php:85
408
- msgid "No"
409
- msgstr "Нет"
410
-
411
- #: admin/views/metaboxes/metabox-options.php:42
412
- #, php-format
413
- msgid "Hide box again when visitors scroll back up? Only works when Trigger action is set to % of page height"
414
- msgstr "Скрыть окно снова, когда посетители прокрутили обратно? Работает только когда действие триггера установлено % oт высоты страницы"
415
-
416
- #: admin/views/metaboxes/metabox-options.php:46
417
- msgid "Animation"
418
- msgstr "Анимация"
419
-
420
- #: admin/views/metaboxes/metabox-options.php:49
421
- msgid "Fade In"
422
- msgstr "Плавное появление"
423
-
424
- #: admin/views/metaboxes/metabox-options.php:50
425
- msgid "Slide In"
426
- msgstr "Выдвижение"
427
-
428
- #: admin/views/metaboxes/metabox-options.php:53
429
- msgid "Slide will only apply when popup is on the corners"
430
- msgstr "Выдвижение будет применяться только тогда, когда всплывающее окно находится по углах"
431
-
432
- #: admin/views/metaboxes/metabox-options.php:58
433
- msgid "Cookie expiration days"
434
- msgstr "Куки действуют дней"
435
-
436
- #: admin/views/metaboxes/metabox-options.php:61
437
- msgid "After closing the box, how many days should it stay hidden?"
438
- msgstr "После закрытия окна, сколько дней PopUp должен оставаться скрытым?"
439
-
440
- #: admin/views/metaboxes/metabox-options.php:66
441
- msgid "Enable test mode?"
442
- msgstr "Включить тестовый режим?"
443
-
444
- #: admin/views/metaboxes/metabox-options.php:70
445
- msgid "If test mode is enabled, the box will show up regardless of whether a cookie has been set. (To admins only)"
446
- msgstr "Если тестовый режим включен, окно будет отображаться независимо от того, были ли установлены куки. (только Админам)"
447
-
448
- #: admin/views/metaboxes/metabox-options.php:74
449
- msgid "Close on conversion?"
450
- msgstr "Закрыть при конверсии?"
451
-
452
- #: admin/views/metaboxes/metabox-options.php:78
453
- msgid "If you have a form or social shortcode, by default popup will close on submission/conversion"
454
- msgstr "Если у вас есть форма или социальной шорткод, по умолчанию всплывающие закроется при подтверждении/конверсии"
455
-
456
- #: admin/views/metaboxes/metabox-options.php:82
457
- msgid "Show powered by link?"
458
- msgstr "Показать ссылку powered by?"
459
-
460
- #: admin/views/metaboxes/metabox-options.php:86
461
- #, php-format
462
- msgid "Shows a \"powered by\" link below your popup. If your affiliate link is set in the <a href=\"%s\">settings</a>, it will be used."
463
- msgstr "Показать ссылку \"powered by\" под вашим PopUp. Если ваша партнерская ссылка указана в <a href=\"%s\">настройках</a>, она будет использована."
464
-
465
- #: admin/views/metaboxes/metabox-options.php:91
466
- msgid "Appearance"
467
- msgstr "Появление"
468
-
469
- #: admin/views/metaboxes/metabox-options.php:95
470
- msgid "Background opacity"
471
- msgstr "Размытие фона"
472
-
473
- #: admin/views/metaboxes/metabox-options.php:98
474
- msgid "Leave at 0 for no background. Max value is 1"
475
- msgstr "Оставьте 0 для без фона. Максимальное значение равно 1"
476
-
477
- #: admin/views/metaboxes/metabox-options.php:104
478
- msgid "Background color"
479
- msgstr "Цвет фона"
480
-
481
- #: admin/views/metaboxes/metabox-options.php:108
482
- msgid "Text color"
483
- msgstr "Цвет текста"
484
-
485
- #: admin/views/metaboxes/metabox-options.php:112
486
- msgid "Box width"
487
- msgstr "Ширина Бокса"
488
-
489
- #: admin/views/metaboxes/metabox-options.php:118
490
- msgid "Border color"
491
- msgstr "Цвет рамки"
492
-
493
- #: admin/views/metaboxes/metabox-options.php:122
494
- msgid "Border width"
495
- msgstr "Ширина рамки"
496
-
497
- #: admin/views/metaboxes/metabox-premium.php:16
498
- msgid "Take the best WordPress Popups plugin to the next level with Popups Premium extension."
499
- msgstr "Используйте максимум преимуществ плагина \"всплывающие окна\" для WordPress с расширением Popups Premium ."
500
-
501
- #: admin/views/metaboxes/metabox-premium.php:17
502
- msgid "Popups Premium Features:"
503
- msgstr "Преимущества Popups Premium:"
504
-
505
- #: admin/views/metaboxes/metabox-premium.php:19
506
- msgid "Beautiful optin forms for popular mail providers"
507
- msgstr "Красивые OptIn формы для популярных почтовых служб"
508
-
509
- #: admin/views/metaboxes/metabox-premium.php:20
510
- msgid "Currently supporting MailChimp, Aweber, Postmatic, Mailpoet"
511
- msgstr "Сейчас поддерживаются MailChimp, Aweber, Postmatic, Mailpoet"
512
-
513
- #: admin/views/metaboxes/metabox-premium.php:21
514
- msgid "Track impressions and Conversions of social likes and forms submissions like Contact Form 7, Gravity forms, etc"
515
- msgstr "Отслеживать показы и переходы из социальных сетей и формировать отчеты по действиям Contact Form 7, Gravity формы, и т.д."
516
-
517
- #: admin/views/metaboxes/metabox-premium.php:22
518
- msgid "Track impressions and Conversions also in Google Analytics"
519
- msgstr "Отслеживать показы и переходы также и в Google Analytics"
520
-
521
- #: admin/views/metaboxes/metabox-premium.php:23 admin/views/metaboxes/metabox-premium.php:25
522
- msgid "Exit Intent technology"
523
- msgstr "Выход Целевой технологии"
524
-
525
- #: admin/views/metaboxes/metabox-premium.php:24
526
- msgid "8 New animations effects"
527
- msgstr "8 новых анимационных эффектов"
528
-
529
- #: admin/views/metaboxes/metabox-premium.php:26
530
- msgid "New trigger methods"
531
- msgstr "Новые методы отслеживания"
532
-
533
- #: admin/views/metaboxes/metabox-premium.php:27
534
- msgid "Timer for auto closing"
535
- msgstr "Таймер для автоматического закрытия"
536
-
537
- #: admin/views/metaboxes/metabox-premium.php:28
538
- msgid "Ability to disable close button"
539
- msgstr "Возможность отключения кнопки закрытия"
540
-
541
- #: admin/views/metaboxes/metabox-premium.php:29
542
- msgid "Ability to disable Advanced close methods like esc or clicking outside of the popup"
543
- msgstr "Возможность отключения расширенных методов закрытия, такие как нажатие ESC или клик снаружи всплывающего окна"
544
-
545
- #: admin/views/metaboxes/metabox-premium.php:30
546
- msgid "Premium support"
547
- msgstr "Премиум поддержка"
548
-
549
- #: admin/views/metaboxes/metabox-premium.php:34
550
- msgid "Buy Now!"
551
- msgstr "Купить сейчас!"
552
-
553
- #: admin/views/metaboxes/metabox-rules.php:19
554
- msgid "Rules"
555
- msgstr "Правила"
556
-
557
- #: admin/views/metaboxes/metabox-rules.php:20
558
- msgid "Create a set of rules to determine where the popup will show"
559
- msgstr "Создать набор правил для показа всплывающего окна"
560
-
561
- #: admin/views/metaboxes/metabox-rules.php:31
562
- msgid "Show this popup if"
563
- msgstr "Показать это всплывающее окно, если"
564
-
565
- #: admin/views/metaboxes/metabox-rules.php:61
566
- msgid "is equal to"
567
- msgstr "равно"
568
-
569
- #: admin/views/metaboxes/metabox-rules.php:62
570
- msgid "is not equal to"
571
- msgstr "неравно"
572
-
573
- #: admin/views/metaboxes/metabox-rules.php:93
574
- msgid "and"
575
- msgstr "и"
576
-
577
- #: admin/views/metaboxes/metabox-rules.php:108
578
- msgid "Add rule group"
579
- msgstr "Добавить группу правил"
580
-
581
- #: admin/views/metaboxes/metabox-support.php:6
582
- #, php-format
583
- msgid "You are using Popups plugin v%s"
584
- msgstr "Вы используете плагин Popups v%s"
585
-
586
- #: admin/views/metaboxes/metabox-support.php:7
587
- #, php-format
588
- msgid "If you need support please go to the WordPress.org <a href=\"%s\">support forums</a>"
589
- msgstr "Если вам нужна поддержка, пожалуйста, перейдите на <a href=\"%s\">форум поддержки</a> WordPress.org"
590
-
591
- #: admin/views/settings-page.php:17
592
- msgid "Affiliate link"
593
- msgstr "Партнерская ссылка"
594
-
595
- #: admin/views/settings-page.php:20
596
- #, php-format
597
- msgid "You can earn money by promoting the plugin! Join <a href=\"%s\">our affiliate program</a> and paste your affiliate link here to earn 35&#37; in commissions . Once entered, it will replace the default \"Powered by\" on the popups."
598
- msgstr "Вы можете заработать деньги, продвигая плагин! Присоединяйтесь к <a href=\"%s\">нашей партнерской программе</a> и вставьте свою партнерскую ссылку, чтобы заработать 35&#37; комиссионных . После того, как вы введете ее, она заменит значение по умолчанию \"Powered by\" во всплывающих окнах."
599
-
600
- #: admin/views/settings-page.php:24
601
- msgid "Ajax mode?"
602
- msgstr "Режим Ajax?"
603
-
604
- #: admin/views/settings-page.php:27
605
- msgid "Load popups using ajax. Compatible with cache plugins, but might not work with all plugins"
606
- msgstr "Загрузка всплывающего окна с помощью Ajax. Совместима с плагинами кэширования, но не может работать с некоторыми плагинами"
607
-
608
- #: admin/views/settings-page.php:32
609
- msgid "Enable Debug mode?"
610
- msgstr "Включить режим отладки?"
611
-
612
- #: admin/views/settings-page.php:35
613
- msgid "Will use uncompressed js"
614
- msgstr "Будут использоваться несжатые JS"
615
-
616
- #: admin/views/settings-page.php:40
617
- msgid "Enable safe mode?"
618
- msgstr "Включить безопасный режим?"
619
-
620
- #: admin/views/settings-page.php:43
621
- msgid "Will move all popups to top of the screen."
622
- msgstr "Будут передвинуты все всплывающие окна в верхнюю часть экрана."
623
-
624
- #: admin/views/settings-page.php:48
625
- msgid "Remove shortcodes style"
626
- msgstr "Удалить стили Шорткодов"
627
-
628
- #: admin/views/settings-page.php:51
629
- msgid "By default the plugin will apply some style to shortcodes. Check here if you want to manually style them"
630
- msgstr "По умолчанию плагин будет применять некоторые стили Шорткодов. Отметьте здесь, если вы хотите задать их стиль вручную"
631
-
632
- #: admin/views/settings-page.php:56
633
- msgid "Unload Facebook javascript"
634
- msgstr "Выгрузка JavaScript Facebook"
635
-
636
- #: admin/views/settings-page.php:59
637
- msgid "If you use your own Facebook script, check this"
638
- msgstr "Если вы используете свой собственный скрипт Facebook, отметьте это"
639
-
640
- #: admin/views/settings-page.php:64
641
- msgid "Unload Google javascript"
642
- msgstr "Выгрузка JavaScript Google"
643
-
644
- #: admin/views/settings-page.php:67
645
- msgid "If you use your own Google script, check this"
646
- msgstr "Если вы используете свой собственный скрипт Google, отметьте это"
647
-
648
- #: admin/views/settings-page.php:72
649
- msgid "Unload Twitter javascript"
650
- msgstr "Выгрузка JavaScript Twitter"
651
-
652
- #: admin/views/settings-page.php:75
653
- msgid "If you use your own Twitter script, check this"
654
- msgstr "Если вы используете свой собственный скрипт Twitter, отметьте это"
655
-
656
- #: admin/views/settings-page.php:80
657
- msgid "Save settings"
658
- msgstr "Сохранить настройки"
659
-
660
- #: includes/class-spu-helper.php:133
661
- msgid "All Pages"
662
- msgstr "Все страницы"
663
-
664
- #: includes/class-spu-helper.php:134
665
- msgid "Front Page"
666
- msgstr "Титульная страница"
667
-
668
- #: includes/class-spu-helper.php:135
669
- msgid "Posts Page"
670
- msgstr "Страница Публикаций"
671
-
672
- #: includes/class-spu-helper.php:136
673
- msgid "Category Page"
674
- msgstr "Страница Категорий"
675
-
676
- #: includes/class-spu-helper.php:137
677
- msgid "Archives Page"
678
- msgstr "Страница Архивов"
679
-
680
- #: includes/class-spu-helper.php:138
681
- msgid "Top Level Page (parent of 0)"
682
- msgstr "Верхний уровень страницы (родителей 0)"
683
-
684
- #: includes/class-spu-helper.php:139
685
- msgid "Parent Page (has children)"
686
- msgstr "Родительская страница (имеет потомков)"
687
-
688
- #: includes/class-spu-helper.php:140
689
- msgid "Child Page (has parent)"
690
- msgstr "Дочерняя страница (имеет родителя)"
691
-
692
- #: includes/class-spu-helper.php:148
693
- msgid "Default Template"
694
- msgstr "Шаблон по умолчанию"
695
-
696
- #: includes/class-spu-helper.php:221
697
- msgid "Publish"
698
- msgstr "Опубликовать"
699
-
700
- #: includes/class-spu-helper.php:222
701
- msgid "Pending Review"
702
- msgstr "Ожидает оценки"
703
-
704
- #: includes/class-spu-helper.php:223
705
- msgid "Draft"
706
- msgstr "Черновик"
707
-
708
- #: includes/class-spu-helper.php:224
709
- msgid "Future"
710
- msgstr "Запланировать"
711
-
712
- #: includes/class-spu-helper.php:225
713
- msgid "Private"
714
- msgstr "Приватное"
715
-
716
- #: includes/class-spu-helper.php:226
717
- msgid "Revision"
718
- msgstr "Ревизии"
719
-
720
- #: includes/class-spu-helper.php:227
721
- msgid "Trash"
722
- msgstr "Корзина"
723
-
724
- #: includes/class-spu-helper.php:240
725
- msgid "Super Admin"
726
- msgstr "Супер Админ"
727
-
728
- #: includes/class-spu-helper.php:260
729
- msgid "True"
730
- msgstr "Правда"
1
+ # Copyright (C) 2013 TODO
2
+ # This file is distributed under the same license as the TODO package.
3
+ # Translators:
4
+ # Анатолий, 2015
5
+ msgid ""
6
+ msgstr ""
7
+ "Project-Id-Version: Popups\n"
8
+ "Report-Msgid-Bugs-To: http://wordpress.org/plugins/plugin-name\n"
9
+ "POT-Creation-Date: 2015-06-14 00:02-0300\n"
10
+ "PO-Revision-Date: 2015-10-01 11:18-0300\n"
11
+ "Last-Translator: Анатолий\n"
12
+ "Language-Team: Russian (Russia) (http://www.transifex.com/timersys/popups/language/ru_RU/)\n"
13
+ "MIME-Version: 1.0\n"
14
+ "Content-Type: text/plain; charset=UTF-8\n"
15
+ "Content-Transfer-Encoding: 8bit\n"
16
+ "Language: ru_RU\n"
17
+ "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n"
18
+ "X-Generator: Poedit 1.7.4\n"
19
+ "X-Poedit-Basepath: ../\n"
20
+ "X-Poedit-KeywordsList: __;_e;_n;_x;esc_html_e;esc_html__;esc_attr_e;esc_attr__;_ex:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2;_x:1,2c;_n:1,2\n"
21
+ "X-Poedit-SearchPath-0: .\n"
22
+
23
+ #: admin/class-social-popup-admin.php:154
24
+ msgctxt "post type singular name"
25
+ msgid "Popups"
26
+ msgstr "Popups"
27
+
28
+ #: admin/class-social-popup-admin.php:155
29
+ msgctxt "admin menu"
30
+ msgid "Popups"
31
+ msgstr "Popups"
32
+
33
+ #: admin/class-social-popup-admin.php:156
34
+ msgctxt "add new on admin bar"
35
+ msgid "Popups"
36
+ msgstr "Popups"
37
+
38
+ #: admin/class-social-popup-admin.php:157
39
+ msgctxt "Popups"
40
+ msgid "Add New"
41
+ msgstr "Добавить новый"
42
+
43
+ #: admin/class-social-popup-admin.php:158
44
+ msgid "Add New Popups"
45
+ msgstr "Добавить новый Popups"
46
+
47
+ #: admin/class-social-popup-admin.php:159
48
+ msgid "New Popups"
49
+ msgstr "Новый Popups"
50
+
51
+ #: admin/class-social-popup-admin.php:160
52
+ msgid "Edit Popups"
53
+ msgstr "Редактировать Popups"
54
+
55
+ #: admin/class-social-popup-admin.php:161
56
+ msgid "View Popups"
57
+ msgstr "Редактировать Popups"
58
+
59
+ #: admin/class-social-popup-admin.php:162
60
+ msgid "All Popups"
61
+ msgstr "Все Popups"
62
+
63
+ #: admin/class-social-popup-admin.php:163
64
+ msgid "Search Popups"
65
+ msgstr "Поиск Popups"
66
+
67
+ #: admin/class-social-popup-admin.php:164
68
+ msgid "Parent Popups:"
69
+ msgstr "Родительский Popups:"
70
+
71
+ #: admin/class-social-popup-admin.php:165
72
+ msgid "No Popups found."
73
+ msgstr "Не найден Popups"
74
+
75
+ #: admin/class-social-popup-admin.php:166
76
+ msgid "No Popups found in Trash."
77
+ msgstr "Не найден Popups в Корзине"
78
+
79
+ #: admin/class-social-popup-admin.php:255
80
+ msgid "Popups Premium"
81
+ msgstr "Премиум Popups"
82
+
83
+ #: admin/class-social-popup-admin.php:266
84
+ msgid "PopUp Shortcodes"
85
+ msgstr "Шорткоды PopUp"
86
+
87
+ #: admin/class-social-popup-admin.php:275
88
+ msgid "PopUp Display Rules"
89
+ msgstr "Отображать правила PopUp"
90
+
91
+ #: admin/class-social-popup-admin.php:284
92
+ msgid "Display Options"
93
+ msgstr "Отображать опции"
94
+
95
+ #: admin/class-social-popup-admin.php:293
96
+ msgid "Need support?"
97
+ msgstr "Нужна помощь?"
98
+
99
+ #: admin/class-social-popup-admin.php:301
100
+ msgid "Donate & support"
101
+ msgstr "Помощь и Поддержка"
102
+
103
+ #: admin/class-social-popup-admin.php:309
104
+ msgid "About the developer"
105
+ msgstr "О разработчике"
106
+
107
+ #: admin/class-social-popup-admin.php:557 admin/views/metaboxes/metabox-rules.php:33 admin/views/metaboxes/metabox-rules.php:106
108
+ msgid "or"
109
+ msgstr "или"
110
+
111
+ #: admin/class-social-popup-admin.php:584
112
+ msgid "Add a Popup"
113
+ msgstr "Добавить Popup"
114
+
115
+ #: admin/class-social-popup-admin.php:708
116
+ msgid "User"
117
+ msgstr "Пользователь"
118
+
119
+ #: admin/class-social-popup-admin.php:709
120
+ msgid "User role"
121
+ msgstr "Роль пользователя"
122
+
123
+ #: admin/class-social-popup-admin.php:710
124
+ msgid "User is logged"
125
+ msgstr "Пользователь залогинен"
126
+
127
+ #: admin/class-social-popup-admin.php:711
128
+ msgid "User never left a comment"
129
+ msgstr "Пользователь никогда не комментировал"
130
+
131
+ #: admin/class-social-popup-admin.php:712
132
+ msgid "User came via a search engine"
133
+ msgstr "Пользователь пришел из поисковых систем"
134
+
135
+ #: admin/class-social-popup-admin.php:713
136
+ msgid "User did not arrive via another page on your site"
137
+ msgstr "Пользователь не пришел с другой страницы на вашем сайте"
138
+
139
+ #: admin/class-social-popup-admin.php:715 admin/class-social-popup-admin.php:716
140
+ msgid "Post"
141
+ msgstr "Публикация"
142
+
143
+ #: admin/class-social-popup-admin.php:717
144
+ msgid "Post ID"
145
+ msgstr "ID публикации"
146
+
147
+ #: admin/class-social-popup-admin.php:718
148
+ msgid "Post Type"
149
+ msgstr "Тип публикации"
150
+
151
+ #: admin/class-social-popup-admin.php:719
152
+ msgid "Post Category"
153
+ msgstr "Категория публикации"
154
+
155
+ #: admin/class-social-popup-admin.php:720
156
+ msgid "Post Format"
157
+ msgstr "Формат публикации"
158
+
159
+ #: admin/class-social-popup-admin.php:721
160
+ msgid "Post Status"
161
+ msgstr "Статус публикации"
162
+
163
+ #: admin/class-social-popup-admin.php:722
164
+ msgid "Post Taxonomy"
165
+ msgstr "Таксономия публикации"
166
+
167
+ #: admin/class-social-popup-admin.php:724 admin/class-social-popup-admin.php:725
168
+ msgid "Page"
169
+ msgstr "Страница"
170
+
171
+ #: admin/class-social-popup-admin.php:726
172
+ msgid "Page Type"
173
+ msgstr "Тип страницы"
174
+
175
+ #: admin/class-social-popup-admin.php:727
176
+ msgid "Page Parent"
177
+ msgstr "Родительская страница"
178
+
179
+ #: admin/class-social-popup-admin.php:728
180
+ msgid "Page Template"
181
+ msgstr "Шаблон страницы"
182
+
183
+ #: admin/class-social-popup-admin.php:730
184
+ msgid "Other"
185
+ msgstr "Другие"
186
+
187
+ #: admin/class-social-popup-admin.php:731
188
+ msgid "Referrer"
189
+ msgstr "Реферер"
190
+
191
+ #: admin/class-social-popup-admin.php:732
192
+ msgid "Mobile Phone"
193
+ msgstr "Мобильный телефон"
194
+
195
+ #: admin/class-social-popup-admin.php:733
196
+ msgid "Tablet"
197
+ msgstr "Планшет"
198
+
199
+ #: admin/includes/class-spu-notices.php:30
200
+ #, php-format
201
+ msgid "We noticed that you have been using our plugin for a while and we would like to ask you a little favour. If you are happy with it and can take a minute please <a href=\"%s\" target=\"_blank\">leave a nice review</a> on WordPress. It will be a tremendous help for us!"
202
+ msgstr "Мы заметили, что вы использовали наш плагин некоторое время, и мы хотели бы попросить оказать нам небольшую услугу. Если вам понравился наш плагин и у вас есть свободная минутка, пожалуйста <a href=\"%s\" target=\"_blank\">оставьте хороший отзыв</a> на WordPress. Это будет огромная помощь для нас!"
203
+
204
+ #: admin/includes/class-spu-notices.php:32
205
+ #, php-format
206
+ msgid "<a href=\"%s\" target=\"_blank\">Leave a nice review</a>"
207
+ msgstr "<a href=\"%s\" target=\"_blank\">Оставьте хороший отзыв</a>"
208
+
209
+ #: admin/includes/class-spu-notices.php:33
210
+ #, php-format
211
+ msgid "<a href=\"%s\">No, thanks</a>"
212
+ msgstr "<a href=\"%s\">Нет, спасибо</a>"
213
+
214
+ #: admin/views/metaboxes/metabox-donate.php:6
215
+ msgid "If you like this plugin, consider supporting it by donating."
216
+ msgstr "Если вам нравится этот плагин, поддержите, пожалуйста, его."
217
+
218
+ #: admin/views/metaboxes/metabox-donate.php:8
219
+ msgid "Donate with PayPal"
220
+ msgstr "Помочь через PayPal"
221
+
222
+ #: admin/views/metaboxes/metabox-donate.php:10
223
+ msgid "Some other ways to support this plugin"
224
+ msgstr "Некоторые другие способы поддержки этого плагина"
225
+
226
+ #: admin/views/metaboxes/metabox-donate.php:12
227
+ msgid "Leave a &#9733;&#9733;&#9733;&#9733;&#9733; review on WordPress.org"
228
+ msgstr "Оставьте &#9733;&#9733;&#9733;&#9733;&#9733; отзыв на WordPress.org"
229
+
230
+ #: admin/views/metaboxes/metabox-donate.php:13
231
+ msgid "Write about Popups on your blog"
232
+ msgstr "Напишите о плагине Popups на своем блоге"
233
+
234
+ #: admin/views/metaboxes/metabox-donate.php:14
235
+ msgid "Tweet about Popups"
236
+ msgstr "Твитнуть о плагине Popups"
237
+
238
+ #: admin/views/metaboxes/metabox-donate.php:15
239
+ msgid "Vote \"works\" on the WordPress.org plugin page"
240
+ msgstr "Проголосовать \"работает\" на странице плагина в WordPress.org"
241
+
242
+ #: admin/views/metaboxes/metabox-help.php:6
243
+ msgid "You have three social shortcodes to use that will print a Facebook like, a Google+ Follow and a Twitter follow. Check the available options and <strong>configure them with your social accounts</strong>:"
244
+ msgstr "У вас есть возможность использовать три социальных Шорткода: Facebook Лайк, подписка на Google+ и следовать в Twitter. Проверьте доступные варианты и <strong>настройте их со своими социальными профилями</strong>:"
245
+
246
+ #: admin/views/metaboxes/metabox-help.php:12
247
+ msgid "View Facebook Page Options"
248
+ msgstr "Смотреть параметры страницы в Facebook"
249
+
250
+ #: admin/views/metaboxes/metabox-help.php:14 admin/views/metaboxes/metabox-help.php:27
251
+ msgid "Your facebook page url"
252
+ msgstr "Ссылка на вашу страницу Facebook"
253
+
254
+ #: admin/views/metaboxes/metabox-help.php:15
255
+ msgid "Your page name"
256
+ msgstr "Имя вашей страницы"
257
+
258
+ #: admin/views/metaboxes/metabox-help.php:16
259
+ msgid "true|false <b>Default value:</b> true"
260
+ msgstr "true|false <b>Значение по умолчанию:</b> true"
261
+
262
+ #: admin/views/metaboxes/metabox-help.php:17
263
+ msgid "true|false <b>Default value:</b> false"
264
+ msgstr "true|false <b>Значение по умолчанию:</b> false"
265
+
266
+ #: admin/views/metaboxes/metabox-help.php:25
267
+ msgid "View Facebook Options"
268
+ msgstr "Посмотреть опции Facebook"
269
+
270
+ #: admin/views/metaboxes/metabox-help.php:28
271
+ msgid "standard, box_count, button <b>Default value:</b> button_count"
272
+ msgstr "standard, box_count, button <b>Значение по умолчанию:</b> button_count"
273
+
274
+ #: admin/views/metaboxes/metabox-help.php:29 admin/views/metaboxes/metabox-help.php:30
275
+ msgid "true <b>Default value:</b> false"
276
+ msgstr "true <b>Значение по умолчанию:</b> false"
277
+
278
+ #: admin/views/metaboxes/metabox-help.php:31
279
+ msgid "recommend <b>Default value:</b> like"
280
+ msgstr "рекомендованное <b>Значение по умолчанию:</b> like"
281
+
282
+ #: admin/views/metaboxes/metabox-help.php:38
283
+ msgid "View Google+ Options"
284
+ msgstr "Посмотреть опции Google+"
285
+
286
+ #: admin/views/metaboxes/metabox-help.php:40
287
+ msgid "Your Google+ url"
288
+ msgstr "Ссылка на ваш Google+"
289
+
290
+ #: admin/views/metaboxes/metabox-help.php:41
291
+ msgid "small, standard, tall <b>Default value:</b> medium"
292
+ msgstr "small, standard, tall <b>Значение по умолчанию:</b> medium"
293
+
294
+ #: admin/views/metaboxes/metabox-help.php:42
295
+ msgid "inline, none <b>Default value:</b> bubble"
296
+ msgstr "inline, none <b>Значение по умолчанию:</b> bubble"
297
+
298
+ #: admin/views/metaboxes/metabox-help.php:48
299
+ msgid "View Twitter Options"
300
+ msgstr "Посмотреть опции в Twitter"
301
+
302
+ #: admin/views/metaboxes/metabox-help.php:50
303
+ msgid "Your Twitter user <b>Default chifli</b>iiii"
304
+ msgstr "Ваш пользователь в Twitter <b>chifli по умолчанию</b>iiii"
305
+
306
+ #: admin/views/metaboxes/metabox-help.php:51
307
+ msgid "false <b>Default value:</b> true"
308
+ msgstr "false <b>Значение по умолчанию:</b> true"
309
+
310
+ #: admin/views/metaboxes/metabox-help.php:52
311
+ msgid "large <b>Default value:</b> \"\""
312
+ msgstr "large <b>Значение по умолчанию:</b> \"\""
313
+
314
+ #: admin/views/metaboxes/metabox-help.php:55
315
+ msgid "Other available Shortcodes:"
316
+ msgstr "Другие доступные шорткоды:"
317
+
318
+ #: admin/views/metaboxes/metabox-help.php:60
319
+ msgid "View Close shortcode Options"
320
+ msgstr "Помостреть Закрыть опции шорткодов"
321
+
322
+ #: admin/views/metaboxes/metabox-help.php:62
323
+ msgid "Pass a custom class to style your button"
324
+ msgstr "Передайте собственный класс стиля для ваших кнопок"
325
+
326
+ #: admin/views/metaboxes/metabox-help.php:63
327
+ msgid "Button label - <b>Default value:</b> Close"
328
+ msgstr "Значение кнопки - <b>Значение по умолчанию:</b> Close"
329
+
330
+ #: admin/views/metaboxes/metabox-help.php:64
331
+ msgid "left, right, center, none - <b>Default value:</b> center"
332
+ msgstr "left, right, center, none - <b>Значение по умолчанию:</b> center"
333
+
334
+ #: admin/views/metaboxes/metabox-links.php:6
335
+ msgid "My name is"
336
+ msgstr "Меня зовут"
337
+
338
+ #: admin/views/metaboxes/metabox-links.php:6
339
+ msgid "I develop WordPress plugins and themes."
340
+ msgstr "Я разрабатываю плагины и темы для WordPress."
341
+
342
+ #: admin/views/metaboxes/metabox-links.php:7
343
+ #, php-format
344
+ msgid "Take a look at my <a href=\"%s\">site</a> to see my other plugins or hire me. Subscribe to get updates!"
345
+ msgstr "Взгляните на мой <a href=\"%s\">сайт</a> чтобы увидеть мои другие плагины или нанять меня. Подпишитесь на обновления!"
346
+
347
+ #: admin/views/metaboxes/metabox-links.php:8
348
+ msgid "Other plugins I built:"
349
+ msgstr "Другие плагины которые я разработал:"
350
+
351
+ #: admin/views/metaboxes/metabox-links.php:10
352
+ msgid "Install multiple plugins and create collections"
353
+ msgstr "Установка нескольких плагинов и создать коллекции"
354
+
355
+ #: admin/views/metaboxes/metabox-links.php:11
356
+ msgid "Geotarget your content"
357
+ msgstr "Геотаргетинг вашего контента"
358
+
359
+ #: admin/views/metaboxes/metabox-links.php:12
360
+ msgid "Invite your network friends and import contacts"
361
+ msgstr "Пригласить своих друзей из сети и импортировать контакты"
362
+
363
+ #: admin/views/metaboxes/metabox-options.php:9
364
+ msgid "Box Position"
365
+ msgstr "Позиция Box"
366
+
367
+ #: admin/views/metaboxes/metabox-options.php:12
368
+ msgid "Centered"
369
+ msgstr "По центру"
370
+
371
+ #: admin/views/metaboxes/metabox-options.php:13
372
+ msgid "Top Left"
373
+ msgstr "Слева вверху"
374
+
375
+ #: admin/views/metaboxes/metabox-options.php:14
376
+ msgid "Top Right"
377
+ msgstr "Справа вверху"
378
+
379
+ #: admin/views/metaboxes/metabox-options.php:15
380
+ msgid "Bottom Left"
381
+ msgstr "Внизу слева"
382
+
383
+ #: admin/views/metaboxes/metabox-options.php:16
384
+ msgid "Bottom Right"
385
+ msgstr "Внизу справа"
386
+
387
+ #: admin/views/metaboxes/metabox-options.php:23
388
+ msgid "Trigger action"
389
+ msgstr "Запуск действия"
390
+
391
+ #: admin/views/metaboxes/metabox-options.php:27
392
+ msgid "seconds after page load"
393
+ msgstr "секунд после загрузки страницы"
394
+
395
+ #: admin/views/metaboxes/metabox-options.php:28
396
+ msgid "of page height"
397
+ msgstr "высоты страницы"
398
+
399
+ #: admin/views/metaboxes/metabox-options.php:38
400
+ msgid "Auto-hide?"
401
+ msgstr "Авто-скрытие?"
402
+
403
+ #: admin/views/metaboxes/metabox-options.php:40 admin/views/metaboxes/metabox-options.php:68 admin/views/metaboxes/metabox-options.php:76 admin/views/metaboxes/metabox-options.php:84
404
+ msgid "Yes"
405
+ msgstr "Да"
406
+
407
+ #: admin/views/metaboxes/metabox-options.php:41 admin/views/metaboxes/metabox-options.php:69 admin/views/metaboxes/metabox-options.php:77 admin/views/metaboxes/metabox-options.php:85
408
+ msgid "No"
409
+ msgstr "Нет"
410
+
411
+ #: admin/views/metaboxes/metabox-options.php:42
412
+ #, php-format
413
+ msgid "Hide box again when visitors scroll back up? Only works when Trigger action is set to % of page height"
414
+ msgstr "Скрыть окно снова, когда посетители прокрутили обратно? Работает только когда действие триггера установлено % oт высоты страницы"
415
+
416
+ #: admin/views/metaboxes/metabox-options.php:46
417
+ msgid "Animation"
418
+ msgstr "Анимация"
419
+
420
+ #: admin/views/metaboxes/metabox-options.php:49
421
+ msgid "Fade In"
422
+ msgstr "Плавное появление"
423
+
424
+ #: admin/views/metaboxes/metabox-options.php:50
425
+ msgid "Slide In"
426
+ msgstr "Выдвижение"
427
+
428
+ #: admin/views/metaboxes/metabox-options.php:53
429
+ msgid "Slide will only apply when popup is on the corners"
430
+ msgstr "Выдвижение будет применяться только тогда, когда всплывающее окно находится по углах"
431
+
432
+ #: admin/views/metaboxes/metabox-options.php:58
433
+ msgid "Cookie expiration days"
434
+ msgstr "Куки действуют дней"
435
+
436
+ #: admin/views/metaboxes/metabox-options.php:61
437
+ msgid "After closing the box, how many days should it stay hidden?"
438
+ msgstr "После закрытия окна, сколько дней PopUp должен оставаться скрытым?"
439
+
440
+ #: admin/views/metaboxes/metabox-options.php:66
441
+ msgid "Enable test mode?"
442
+ msgstr "Включить тестовый режим?"
443
+
444
+ #: admin/views/metaboxes/metabox-options.php:70
445
+ msgid "If test mode is enabled, the box will show up regardless of whether a cookie has been set. (To admins only)"
446
+ msgstr "Если тестовый режим включен, окно будет отображаться независимо от того, были ли установлены куки. (только Админам)"
447
+
448
+ #: admin/views/metaboxes/metabox-options.php:74
449
+ msgid "Close on conversion?"
450
+ msgstr "Закрыть при конверсии?"
451
+
452
+ #: admin/views/metaboxes/metabox-options.php:78
453
+ msgid "If you have a form or social shortcode, by default popup will close on submission/conversion"
454
+ msgstr "Если у вас есть форма или социальной шорткод, по умолчанию всплывающие закроется при подтверждении/конверсии"
455
+
456
+ #: admin/views/metaboxes/metabox-options.php:82
457
+ msgid "Show powered by link?"
458
+ msgstr "Показать ссылку powered by?"
459
+
460
+ #: admin/views/metaboxes/metabox-options.php:86
461
+ #, php-format
462
+ msgid "Shows a \"powered by\" link below your popup. If your affiliate link is set in the <a href=\"%s\">settings</a>, it will be used."
463
+ msgstr "Показать ссылку \"powered by\" под вашим PopUp. Если ваша партнерская ссылка указана в <a href=\"%s\">настройках</a>, она будет использована."
464
+
465
+ #: admin/views/metaboxes/metabox-options.php:91
466
+ msgid "Appearance"
467
+ msgstr "Появление"
468
+
469
+ #: admin/views/metaboxes/metabox-options.php:95
470
+ msgid "Background opacity"
471
+ msgstr "Размытие фона"
472
+
473
+ #: admin/views/metaboxes/metabox-options.php:98
474
+ msgid "Leave at 0 for no background. Max value is 1"
475
+ msgstr "Оставьте 0 для без фона. Максимальное значение равно 1"
476
+
477
+ #: admin/views/metaboxes/metabox-options.php:104
478
+ msgid "Background color"
479
+ msgstr "Цвет фона"
480
+
481
+ #: admin/views/metaboxes/metabox-options.php:108
482
+ msgid "Text color"
483
+ msgstr "Цвет текста"
484
+
485
+ #: admin/views/metaboxes/metabox-options.php:112
486
+ msgid "Box width"
487
+ msgstr "Ширина Бокса"
488
+
489
+ #: admin/views/metaboxes/metabox-options.php:118
490
+ msgid "Border color"
491
+ msgstr "Цвет рамки"
492
+
493
+ #: admin/views/metaboxes/metabox-options.php:122
494
+ msgid "Border width"
495
+ msgstr "Ширина рамки"
496
+
497
+ #: admin/views/metaboxes/metabox-premium.php:16
498
+ msgid "Take the best WordPress Popups plugin to the next level with Popups Premium extension."
499
+ msgstr "Используйте максимум преимуществ плагина \"всплывающие окна\" для WordPress с расширением Popups Premium ."
500
+
501
+ #: admin/views/metaboxes/metabox-premium.php:17
502
+ msgid "Popups Premium Features:"
503
+ msgstr "Преимущества Popups Premium:"
504
+
505
+ #: admin/views/metaboxes/metabox-premium.php:19
506
+ msgid "Beautiful optin forms for popular mail providers"
507
+ msgstr "Красивые OptIn формы для популярных почтовых служб"
508
+
509
+ #: admin/views/metaboxes/metabox-premium.php:20
510
+ msgid "Currently supporting MailChimp, Aweber, Postmatic, Mailpoet"
511
+ msgstr "Сейчас поддерживаются MailChimp, Aweber, Postmatic, Mailpoet"
512
+
513
+ #: admin/views/metaboxes/metabox-premium.php:21
514
+ msgid "Track impressions and Conversions of social likes and forms submissions like Contact Form 7, Gravity forms, etc"
515
+ msgstr "Отслеживать показы и переходы из социальных сетей и формировать отчеты по действиям Contact Form 7, Gravity формы, и т.д."
516
+
517
+ #: admin/views/metaboxes/metabox-premium.php:22
518
+ msgid "Track impressions and Conversions also in Google Analytics"
519
+ msgstr "Отслеживать показы и переходы также и в Google Analytics"
520
+
521
+ #: admin/views/metaboxes/metabox-premium.php:23 admin/views/metaboxes/metabox-premium.php:25
522
+ msgid "Exit Intent technology"
523
+ msgstr "Выход Целевой технологии"
524
+
525
+ #: admin/views/metaboxes/metabox-premium.php:24
526
+ msgid "8 New animations effects"
527
+ msgstr "8 новых анимационных эффектов"
528
+
529
+ #: admin/views/metaboxes/metabox-premium.php:26
530
+ msgid "New trigger methods"
531
+ msgstr "Новые методы отслеживания"
532
+
533
+ #: admin/views/metaboxes/metabox-premium.php:27
534
+ msgid "Timer for auto closing"
535
+ msgstr "Таймер для автоматического закрытия"
536
+
537
+ #: admin/views/metaboxes/metabox-premium.php:28
538
+ msgid "Ability to disable close button"
539
+ msgstr "Возможность отключения кнопки закрытия"
540
+
541
+ #: admin/views/metaboxes/metabox-premium.php:29
542
+ msgid "Ability to disable Advanced close methods like esc or clicking outside of the popup"
543
+ msgstr "Возможность отключения расширенных методов закрытия, такие как нажатие ESC или клик снаружи всплывающего окна"
544
+
545
+ #: admin/views/metaboxes/metabox-premium.php:30
546
+ msgid "Premium support"
547
+ msgstr "Премиум поддержка"
548
+
549
+ #: admin/views/metaboxes/metabox-premium.php:34
550
+ msgid "Buy Now!"
551
+ msgstr "Купить сейчас!"
552
+
553
+ #: admin/views/metaboxes/metabox-rules.php:19
554
+ msgid "Rules"
555
+ msgstr "Правила"
556
+
557
+ #: admin/views/metaboxes/metabox-rules.php:20
558
+ msgid "Create a set of rules to determine where the popup will show"
559
+ msgstr "Создать набор правил для показа всплывающего окна"
560
+
561
+ #: admin/views/metaboxes/metabox-rules.php:31
562
+ msgid "Show this popup if"
563
+ msgstr "Показать это всплывающее окно, если"
564
+
565
+ #: admin/views/metaboxes/metabox-rules.php:61
566
+ msgid "is equal to"
567
+ msgstr "равно"
568
+
569
+ #: admin/views/metaboxes/metabox-rules.php:62
570
+ msgid "is not equal to"
571
+ msgstr "неравно"
572
+
573
+ #: admin/views/metaboxes/metabox-rules.php:93
574
+ msgid "and"
575
+ msgstr "и"
576
+
577
+ #: admin/views/metaboxes/metabox-rules.php:108
578
+ msgid "Add rule group"
579
+ msgstr "Добавить группу правил"
580
+
581
+ #: admin/views/metaboxes/metabox-support.php:6
582
+ #, php-format
583
+ msgid "You are using Popups plugin v%s"
584
+ msgstr "Вы используете плагин Popups v%s"
585
+
586
+ #: admin/views/metaboxes/metabox-support.php:7
587
+ #, php-format
588
+ msgid "If you need support please go to the WordPress.org <a href=\"%s\">support forums</a>"
589
+ msgstr "Если вам нужна поддержка, пожалуйста, перейдите на <a href=\"%s\">форум поддержки</a> WordPress.org"
590
+
591
+ #: admin/views/settings-page.php:17
592
+ msgid "Affiliate link"
593
+ msgstr "Партнерская ссылка"
594
+
595
+ #: admin/views/settings-page.php:20
596
+ #, php-format
597
+ msgid "You can earn money by promoting the plugin! Join <a href=\"%s\">our affiliate program</a> and paste your affiliate link here to earn 35&#37; in commissions . Once entered, it will replace the default \"Powered by\" on the popups."
598
+ msgstr "Вы можете заработать деньги, продвигая плагин! Присоединяйтесь к <a href=\"%s\">нашей партнерской программе</a> и вставьте свою партнерскую ссылку, чтобы заработать 35&#37; комиссионных . После того, как вы введете ее, она заменит значение по умолчанию \"Powered by\" во всплывающих окнах."
599
+
600
+ #: admin/views/settings-page.php:24
601
+ msgid "Ajax mode?"
602
+ msgstr "Режим Ajax?"
603
+
604
+ #: admin/views/settings-page.php:27
605
+ msgid "Load popups using ajax. Compatible with cache plugins, but might not work with all plugins"
606
+ msgstr "Загрузка всплывающего окна с помощью Ajax. Совместима с плагинами кэширования, но не может работать с некоторыми плагинами"
607
+
608
+ #: admin/views/settings-page.php:32
609
+ msgid "Enable Debug mode?"
610
+ msgstr "Включить режим отладки?"
611
+
612
+ #: admin/views/settings-page.php:35
613
+ msgid "Will use uncompressed js"
614
+ msgstr "Будут использоваться несжатые JS"
615
+
616
+ #: admin/views/settings-page.php:40
617
+ msgid "Enable safe mode?"
618
+ msgstr "Включить безопасный режим?"
619
+
620
+ #: admin/views/settings-page.php:43
621
+ msgid "Will move all popups to top of the screen."
622
+ msgstr "Будут передвинуты все всплывающие окна в верхнюю часть экрана."
623
+
624
+ #: admin/views/settings-page.php:48
625
+ msgid "Remove shortcodes style"
626
+ msgstr "Удалить стили Шорткодов"
627
+
628
+ #: admin/views/settings-page.php:51
629
+ msgid "By default the plugin will apply some style to shortcodes. Check here if you want to manually style them"
630
+ msgstr "По умолчанию плагин будет применять некоторые стили Шорткодов. Отметьте здесь, если вы хотите задать их стиль вручную"
631
+
632
+ #: admin/views/settings-page.php:56
633
+ msgid "Unload Facebook javascript"
634
+ msgstr "Выгрузка JavaScript Facebook"
635
+
636
+ #: admin/views/settings-page.php:59
637
+ msgid "If you use your own Facebook script, check this"
638
+ msgstr "Если вы используете свой собственный скрипт Facebook, отметьте это"
639
+
640
+ #: admin/views/settings-page.php:64
641
+ msgid "Unload Google javascript"
642
+ msgstr "Выгрузка JavaScript Google"
643
+
644
+ #: admin/views/settings-page.php:67
645
+ msgid "If you use your own Google script, check this"
646
+ msgstr "Если вы используете свой собственный скрипт Google, отметьте это"
647
+
648
+ #: admin/views/settings-page.php:72
649
+ msgid "Unload Twitter javascript"
650
+ msgstr "Выгрузка JavaScript Twitter"
651
+
652
+ #: admin/views/settings-page.php:75
653
+ msgid "If you use your own Twitter script, check this"
654
+ msgstr "Если вы используете свой собственный скрипт Twitter, отметьте это"
655
+
656
+ #: admin/views/settings-page.php:80
657
+ msgid "Save settings"
658
+ msgstr "Сохранить настройки"
659
+
660
+ #: includes/class-spu-helper.php:133
661
+ msgid "All Pages"
662
+ msgstr "Все страницы"
663
+
664
+ #: includes/class-spu-helper.php:134
665
+ msgid "Front Page"
666
+ msgstr "Титульная страница"
667
+
668
+ #: includes/class-spu-helper.php:135
669
+ msgid "Posts Page"
670
+ msgstr "Страница Публикаций"
671
+
672
+ #: includes/class-spu-helper.php:136
673
+ msgid "Category Page"
674
+ msgstr "Страница Категорий"
675
+
676
+ #: includes/class-spu-helper.php:137
677
+ msgid "Archives Page"
678
+ msgstr "Страница Архивов"
679
+
680
+ #: includes/class-spu-helper.php:138
681
+ msgid "Top Level Page (parent of 0)"
682
+ msgstr "Верхний уровень страницы (родителей 0)"
683
+
684
+ #: includes/class-spu-helper.php:139
685
+ msgid "Parent Page (has children)"
686
+ msgstr "Родительская страница (имеет потомков)"
687
+
688
+ #: includes/class-spu-helper.php:140
689
+ msgid "Child Page (has parent)"
690
+ msgstr "Дочерняя страница (имеет родителя)"
691
+
692
+ #: includes/class-spu-helper.php:148
693
+ msgid "Default Template"
694
+ msgstr "Шаблон по умолчанию"
695
+
696
+ #: includes/class-spu-helper.php:221
697
+ msgid "Publish"
698
+ msgstr "Опубликовать"
699
+
700
+ #: includes/class-spu-helper.php:222
701
+ msgid "Pending Review"
702
+ msgstr "Ожидает оценки"
703
+
704
+ #: includes/class-spu-helper.php:223
705
+ msgid "Draft"
706
+ msgstr "Черновик"
707
+
708
+ #: includes/class-spu-helper.php:224
709
+ msgid "Future"
710
+ msgstr "Запланировать"
711
+
712
+ #: includes/class-spu-helper.php:225
713
+ msgid "Private"
714
+ msgstr "Приватное"
715
+
716
+ #: includes/class-spu-helper.php:226
717
+ msgid "Revision"
718
+ msgstr "Ревизии"
719
+
720
+ #: includes/class-spu-helper.php:227
721
+ msgid "Trash"
722
+ msgstr "Корзина"
723
+
724
+ #: includes/class-spu-helper.php:240
725
+ msgid "Super Admin"
726
+ msgstr "Супер Админ"
727
+
728
+ #: includes/class-spu-helper.php:260
729
+ msgid "True"
730
+ msgstr "Правда"
languages/popups-sr_RS.po CHANGED
@@ -1,821 +1,821 @@
1
- # Copyright (C) 2013 TODO
2
- # This file is distributed under the same license as the TODO package.
3
- msgid ""
4
- msgstr ""
5
- "Project-Id-Version: Popups\n"
6
- "Report-Msgid-Bugs-To: http://wordpress.org/plugins/plugin-name\n"
7
- "POT-Creation-Date: 2015-06-14 10:53-0300\n"
8
- "PO-Revision-Date: 2015-06-14 10:53-0300\n"
9
- "Last-Translator: Damian Logghe <info@timersys.com>\n"
10
- "Language-Team: Timersys <info@timersys.com>\n"
11
- "Language: en_EN\n"
12
- "MIME-Version: 1.0\n"
13
- "Content-Type: text/plain; charset=UTF-8\n"
14
- "Content-Transfer-Encoding: 8bit\n"
15
- "X-Generator: Poedit 1.7.4\n"
16
- "X-Poedit-KeywordsList: __;_e;_n;_x;esc_html_e;esc_html__;esc_attr_e;"
17
- "esc_attr__;_ex:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2;_x:1,2c;_n:1,2\n"
18
- "X-Poedit-Basepath: ../\n"
19
- "Plural-Forms: nplurals=2; plural=n != 1;\n"
20
- "X-Poedit-SearchPath-0: .\n"
21
-
22
- #: admin/class-social-popup-admin.php:154
23
- msgctxt "post type singular name"
24
- msgid "Popups"
25
- msgstr "Popups [pojedinačni naziv vrste posta]"
26
-
27
- #: admin/class-social-popup-admin.php:155
28
- msgctxt "admin menu"
29
- msgid "Popups"
30
- msgstr "Iskačući prozori [meni administratora]"
31
-
32
- #: admin/class-social-popup-admin.php:156
33
- msgctxt "add new on admin bar"
34
- msgid "Popups"
35
- msgstr "Iskačući prozori [dodaj novi na traci sa menijem administratora]"
36
-
37
- #: admin/class-social-popup-admin.php:157
38
- msgctxt "Popups"
39
- msgid "Add New"
40
- msgstr "Dodaj nove [iskačuće prozore]"
41
-
42
- #: admin/class-social-popup-admin.php:158
43
- msgid "Add New Popups"
44
- msgstr "Dodaj nove iskačuće prozore"
45
-
46
- #: admin/class-social-popup-admin.php:159
47
- msgid "New Popups"
48
- msgstr "Novi iskačući prozori "
49
-
50
- #: admin/class-social-popup-admin.php:160
51
- msgid "Edit Popups"
52
- msgstr "Uredi iskačuće prozore"
53
-
54
- #: admin/class-social-popup-admin.php:161
55
- msgid "View Popups"
56
- msgstr "Vidi iskačuće prozore"
57
-
58
- #: admin/class-social-popup-admin.php:162
59
- msgid "All Popups"
60
- msgstr "Svi iskačući prozori "
61
-
62
- #: admin/class-social-popup-admin.php:163
63
- msgid "Search Popups"
64
- msgstr "Pretraži iskačuće prozore"
65
-
66
- #: admin/class-social-popup-admin.php:164
67
- msgid "Parent Popups:"
68
- msgstr "Nadređeni iskačući prozori "
69
-
70
- #: admin/class-social-popup-admin.php:165
71
- msgid "No Popups found."
72
- msgstr "Nisu pronađeni iskačući prozori "
73
-
74
- #: admin/class-social-popup-admin.php:166
75
- msgid "No Popups found in Trash."
76
- msgstr "Nisu pronađeni iskačući prozori u korpi za otpatke"
77
-
78
- #: admin/class-social-popup-admin.php:255
79
- msgid "Popups Premium"
80
- msgstr "Popups Premium"
81
-
82
- #: admin/class-social-popup-admin.php:266
83
- msgid "PopUp Shortcodes"
84
- msgstr "PopUp Shortcodes"
85
-
86
- #: admin/class-social-popup-admin.php:275
87
- msgid "PopUp Display Rules"
88
- msgstr "PopUp pravila prikazivanja"
89
-
90
- #: admin/class-social-popup-admin.php:284
91
- msgid "Display Options"
92
- msgstr "Opcije prikazivanja"
93
-
94
- #: admin/class-social-popup-admin.php:293
95
- msgid "Need support?"
96
- msgstr "Treba vam podrška?"
97
-
98
- #: admin/class-social-popup-admin.php:301
99
- msgid "Donate & support"
100
- msgstr "Donirajte i podržite"
101
-
102
- #: admin/class-social-popup-admin.php:309
103
- msgid "About the developer"
104
- msgstr "O programeru"
105
-
106
- #: admin/class-social-popup-admin.php:557
107
- #: admin/views/metaboxes/metabox-rules.php:33
108
- #: admin/views/metaboxes/metabox-rules.php:106
109
- msgid "or"
110
- msgstr "ili"
111
-
112
- #: admin/class-social-popup-admin.php:584
113
- msgid "Add a Popup"
114
- msgstr "Dodaj iskačući prozor"
115
-
116
- #: admin/class-social-popup-admin.php:708
117
- msgid "User"
118
- msgstr "Korisnik"
119
-
120
- #: admin/class-social-popup-admin.php:709
121
- msgid "User role"
122
- msgstr "Korisnička uloga"
123
-
124
- #: admin/class-social-popup-admin.php:710
125
- msgid "User is logged"
126
- msgstr "Korisnik je prijavljen"
127
-
128
- #: admin/class-social-popup-admin.php:711
129
- msgid "User never left a comment"
130
- msgstr "Korisnik nikad nije ostavio komentar"
131
-
132
- #: admin/class-social-popup-admin.php:712
133
- msgid "User came via a search engine"
134
- msgstr "Korisnik je došao putem pretraživača"
135
-
136
- #: admin/class-social-popup-admin.php:713
137
- msgid "User did not arrive via another page on your site"
138
- msgstr "Korisnik nije došao preko druge stranice na vašem site-u"
139
-
140
- #: admin/class-social-popup-admin.php:715
141
- #: admin/class-social-popup-admin.php:716
142
- msgid "Post"
143
- msgstr "Post"
144
-
145
- #: admin/class-social-popup-admin.php:717
146
- msgid "Post ID"
147
- msgstr ""
148
-
149
- #: admin/class-social-popup-admin.php:718
150
- msgid "Post Type"
151
- msgstr "Vrsta posta"
152
-
153
- #: admin/class-social-popup-admin.php:719
154
- msgid "Post Category"
155
- msgstr "Kategorija posta"
156
-
157
- #: admin/class-social-popup-admin.php:720
158
- msgid "Post Format"
159
- msgstr "Format posta"
160
-
161
- #: admin/class-social-popup-admin.php:721
162
- msgid "Post Status"
163
- msgstr "Status posta"
164
-
165
- #: admin/class-social-popup-admin.php:722
166
- msgid "Post Taxonomy"
167
- msgstr "Taksonomija posta"
168
-
169
- #: admin/class-social-popup-admin.php:724
170
- #: admin/class-social-popup-admin.php:725
171
- msgid "Page"
172
- msgstr "Stranica"
173
-
174
- #: admin/class-social-popup-admin.php:726
175
- msgid "Page Type"
176
- msgstr "Vrsta stranice"
177
-
178
- #: admin/class-social-popup-admin.php:727
179
- msgid "Page Parent"
180
- msgstr "Nadređena stranica"
181
-
182
- #: admin/class-social-popup-admin.php:728
183
- msgid "Page Template"
184
- msgstr "Šablon stranice"
185
-
186
- #: admin/class-social-popup-admin.php:730
187
- msgid "Other"
188
- msgstr "Drugi"
189
-
190
- #: admin/class-social-popup-admin.php:731
191
- msgid "Referrer"
192
- msgstr ""
193
-
194
- #: admin/class-social-popup-admin.php:732
195
- msgid "Mobile Phone"
196
- msgstr "Mobilni telefon"
197
-
198
- #: admin/class-social-popup-admin.php:733
199
- msgid "Tablet"
200
- msgstr "Tablet"
201
-
202
- #: admin/includes/class-spu-notices.php:30
203
- #, php-format
204
- msgid ""
205
- "We noticed that you have been using our plugin for a while and we would like "
206
- "to ask you a little favour. If you are happy with it and can take a minute "
207
- "please <a href=\"%s\" target=\"_blank\">leave a nice review</a> on "
208
- "WordPress. It will be a tremendous help for us!"
209
- msgstr ""
210
-
211
- #: admin/includes/class-spu-notices.php:32
212
- #, php-format
213
- msgid "<a href=\"%s\" target=\"_blank\">Leave a nice review</a>"
214
- msgstr ""
215
-
216
- #: admin/includes/class-spu-notices.php:33
217
- #, php-format
218
- msgid "<a href=\"%s\">No, thanks</a>"
219
- msgstr ""
220
-
221
- #: admin/views/metaboxes/metabox-donate.php:6
222
- msgid "If you like this plugin, consider supporting it by donating."
223
- msgstr ""
224
- "Ako vam se sviđa ovaj plugin, razmislite o tome da ga podržite donacijom."
225
-
226
- #: admin/views/metaboxes/metabox-donate.php:8
227
- msgid "Donate with PayPal"
228
- msgstr "Donirajte putem PayPal-a"
229
-
230
- #: admin/views/metaboxes/metabox-donate.php:10
231
- msgid "Some other ways to support this plugin"
232
- msgstr "Drugi načini za podržavanje ovog plugin-a."
233
-
234
- #: admin/views/metaboxes/metabox-donate.php:12
235
- msgid "Leave a &#9733;&#9733;&#9733;&#9733;&#9733; review on WordPress.org"
236
- msgstr "Ostavite komentar &#9733;&#9733;&#9733;&#9733;&#9733; na WordPress.org"
237
-
238
- #: admin/views/metaboxes/metabox-donate.php:13
239
- msgid "Write about Popups on your blog"
240
- msgstr "Pišite o Popups plugin-u na svom blogu"
241
-
242
- #: admin/views/metaboxes/metabox-donate.php:14
243
- msgid "Tweet about Popups"
244
- msgstr "Pišite na Twitter-u o Popups plugin-u"
245
-
246
- #: admin/views/metaboxes/metabox-donate.php:15
247
- msgid "Vote \"works\" on the WordPress.org plugin page"
248
- msgstr "Glasajte da \"radi\" na WordPress.org plugin stranici."
249
-
250
- #: admin/views/metaboxes/metabox-help.php:6
251
- msgid ""
252
- "You have three social shortcodes to use that will print a Facebook like, a "
253
- "Google+ Follow and a Twitter follow. Check the available options and "
254
- "<strong>configure them with your social accounts</strong>:"
255
- msgstr ""
256
- "Imate tri shortcode-a društvenih mreža na raspolaganju, koji će štampati "
257
- "Facebook ‘sviđa mi se’, Google+ ‘prati’ i Twitter ‘prati’. Pogledajte "
258
- "raspoložive opcije i <strong>uskladite ih sa svojim nalozima na društvenim "
259
- "mrežama</strong>:"
260
-
261
- #: admin/views/metaboxes/metabox-help.php:12
262
- msgid "View Facebook Page Options"
263
- msgstr ""
264
-
265
- #: admin/views/metaboxes/metabox-help.php:14
266
- #: admin/views/metaboxes/metabox-help.php:27
267
- msgid "Your facebook page url"
268
- msgstr "Url vaše Facebook stranice"
269
-
270
- #: admin/views/metaboxes/metabox-help.php:15
271
- msgid "Your page name"
272
- msgstr ""
273
-
274
- #: admin/views/metaboxes/metabox-help.php:16
275
- msgid "true|false <b>Default value:</b> true"
276
- msgstr ""
277
-
278
- #: admin/views/metaboxes/metabox-help.php:17
279
- msgid "true|false <b>Default value:</b> false"
280
- msgstr ""
281
-
282
- #: admin/views/metaboxes/metabox-help.php:25
283
- msgid "View Facebook Options"
284
- msgstr "Vidi Facebook opcije"
285
-
286
- #: admin/views/metaboxes/metabox-help.php:28
287
- msgid "standard, box_count, button <b>Default value:</b> button_count"
288
- msgstr ""
289
- "standardni, box_count, taster <b>Podrazumevana vrednost:</b> button_count"
290
-
291
- #: admin/views/metaboxes/metabox-help.php:29
292
- #: admin/views/metaboxes/metabox-help.php:30
293
- msgid "true <b>Default value:</b> false"
294
- msgstr "istina <b>Podrazumevana vrednost:</b> laž"
295
-
296
- #: admin/views/metaboxes/metabox-help.php:31
297
- msgid "recommend <b>Default value:</b> like"
298
- msgstr "preporučena<b>Podrazumevana vrednost:</b> sviđa mi se"
299
-
300
- #: admin/views/metaboxes/metabox-help.php:38
301
- msgid "View Google+ Options"
302
- msgstr "Vidi Google+ opcije "
303
-
304
- #: admin/views/metaboxes/metabox-help.php:40
305
- msgid "Your Google+ url"
306
- msgstr "Url za vaš Google+"
307
-
308
- #: admin/views/metaboxes/metabox-help.php:41
309
- msgid "small, standard, tall <b>Default value:</b> medium"
310
- msgstr "Mali, standardni, visok<b>Podrazumevana vrednost:</b> srednji"
311
-
312
- #: admin/views/metaboxes/metabox-help.php:42
313
- msgid "inline, none <b>Default value:</b> bubble"
314
- msgstr "inline, nijedan <b>Podrazumevana vrednost:</b>balončić"
315
-
316
- #: admin/views/metaboxes/metabox-help.php:48
317
- msgid "View Twitter Options"
318
- msgstr "Vidi Twitter opcije"
319
-
320
- #: admin/views/metaboxes/metabox-help.php:50
321
- msgid "Your Twitter user <b>Default chifli</b>iiii"
322
- msgstr "Vaš Twitter korisnik <b>Podrazumevani chifli</b>iiii"
323
-
324
- #: admin/views/metaboxes/metabox-help.php:51
325
- msgid "false <b>Default value:</b> true"
326
- msgstr "laž<b>Podrazumevana vrednost:</b> istina"
327
-
328
- #: admin/views/metaboxes/metabox-help.php:52
329
- msgid "large <b>Default value:</b> \"\""
330
- msgstr "veliki <b>Podrazumevana vrednost:</b>\"\""
331
-
332
- #: admin/views/metaboxes/metabox-help.php:55
333
- msgid "Other available Shortcodes:"
334
- msgstr "Drugi raspoloživi shortcode-ovi"
335
-
336
- #: admin/views/metaboxes/metabox-help.php:60
337
- msgid "View Close shortcode Options"
338
- msgstr "Vidi: zatvori shortcode opcije "
339
-
340
- #: admin/views/metaboxes/metabox-help.php:62
341
- msgid "Pass a custom class to style your button"
342
- msgstr "Dodajte prilagođenu klasu da biste stilizovali svoj taster"
343
-
344
- #: admin/views/metaboxes/metabox-help.php:63
345
- msgid "Button label - <b>Default value:</b> Close"
346
- msgstr "Oznaka tastera <b>Podrazumevana vrednost:</b> Zatvori"
347
-
348
- #: admin/views/metaboxes/metabox-help.php:64
349
- msgid "left, right, center, none - <b>Default value:</b> center"
350
- msgstr ""
351
- "evo, desno, u sredini, nijedan <b>Podrazumevana vrednost:</b> u sredini"
352
-
353
- #: admin/views/metaboxes/metabox-links.php:6
354
- msgid "My name is"
355
- msgstr "Zovem se"
356
-
357
- #: admin/views/metaboxes/metabox-links.php:6
358
- msgid "I develop WordPress plugins and themes."
359
- msgstr "Programiram WordPress dodatke i teme."
360
-
361
- #: admin/views/metaboxes/metabox-links.php:7
362
- #, php-format
363
- msgid ""
364
- "Take a look at my <a href=\"%s\">site</a> to see my other plugins or hire "
365
- "me. Subscribe to get updates!"
366
- msgstr ""
367
- "Pogledajte moj <a href=\"%s\">site</a> da biste videli ostale moje dodatke "
368
- "ili da biste me angažovali. Pretplatite se da biste dobijali aržuriranja!"
369
-
370
- #: admin/views/metaboxes/metabox-links.php:8
371
- msgid "Other plugins I built:"
372
- msgstr "Ostali dodaci koje sam napravio:"
373
-
374
- #: admin/views/metaboxes/metabox-links.php:10
375
- msgid "Install multiple plugins and create collections"
376
- msgstr "Instaliraj višestruke dodatke i kreiraj zbirke"
377
-
378
- #: admin/views/metaboxes/metabox-links.php:11
379
- msgid "Geotarget your content"
380
- msgstr ""
381
-
382
- #: admin/views/metaboxes/metabox-links.php:12
383
- msgid "Invite your network friends and import contacts"
384
- msgstr "Pozovite svoje prijatelje sa mreže i uvezite kontakte"
385
-
386
- #: admin/views/metaboxes/metabox-options.php:9
387
- msgid "Box Position"
388
- msgstr "Pozicija okvira"
389
-
390
- #: admin/views/metaboxes/metabox-options.php:12
391
- msgid "Centered"
392
- msgstr "U sredini"
393
-
394
- #: admin/views/metaboxes/metabox-options.php:13
395
- msgid "Top Left"
396
- msgstr "Gore levo"
397
-
398
- #: admin/views/metaboxes/metabox-options.php:14
399
- msgid "Top Right"
400
- msgstr "Gore desno"
401
-
402
- #: admin/views/metaboxes/metabox-options.php:15
403
- msgid "Bottom Left"
404
- msgstr "Dole levo"
405
-
406
- #: admin/views/metaboxes/metabox-options.php:16
407
- msgid "Bottom Right"
408
- msgstr "Dole desno"
409
-
410
- #: admin/views/metaboxes/metabox-options.php:23
411
- msgid "Trigger action"
412
- msgstr "Pokreni aktivnost"
413
-
414
- #: admin/views/metaboxes/metabox-options.php:27
415
- msgid "seconds after page load"
416
- msgstr "sekundi nakon učitavanja stranice"
417
-
418
- #: admin/views/metaboxes/metabox-options.php:28
419
- msgid "of page height"
420
- msgstr "ili visina stranice"
421
-
422
- #: admin/views/metaboxes/metabox-options.php:38
423
- msgid "Auto-hide?"
424
- msgstr "Automatski sakrij?"
425
-
426
- #: admin/views/metaboxes/metabox-options.php:40
427
- #: admin/views/metaboxes/metabox-options.php:68
428
- #: admin/views/metaboxes/metabox-options.php:76
429
- #: admin/views/metaboxes/metabox-options.php:84
430
- msgid "Yes"
431
- msgstr "Da"
432
-
433
- #: admin/views/metaboxes/metabox-options.php:41
434
- #: admin/views/metaboxes/metabox-options.php:69
435
- #: admin/views/metaboxes/metabox-options.php:77
436
- #: admin/views/metaboxes/metabox-options.php:85
437
- msgid "No"
438
- msgstr "Ne"
439
-
440
- #: admin/views/metaboxes/metabox-options.php:42
441
- msgid ""
442
- "Hide box again when visitors scroll back up? Only works when Trigger action "
443
- "is set to &#37; of page height"
444
- msgstr ""
445
-
446
- #: admin/views/metaboxes/metabox-options.php:46
447
- msgid "Animation"
448
- msgstr "Animacija"
449
-
450
- #: admin/views/metaboxes/metabox-options.php:49
451
- msgid "Fade In"
452
- msgstr "Bledi"
453
-
454
- #: admin/views/metaboxes/metabox-options.php:50
455
- msgid "Slide In"
456
- msgstr "Kliza"
457
-
458
- #: admin/views/metaboxes/metabox-options.php:53
459
- msgid "Slide will only apply when popup is on the corners"
460
- msgstr "Klizanje će funkcionisati samo kad je iskačući prozor u ćoškovima"
461
-
462
- #: admin/views/metaboxes/metabox-options.php:58
463
- msgid "Cookie expiration days"
464
- msgstr "Rok trajanja kolačića"
465
-
466
- #: admin/views/metaboxes/metabox-options.php:61
467
- msgid "After closing the box, how many days should it stay hidden?"
468
- msgstr "Koliko dana okvir treba da ostane sakriven nakon zatvaranja?"
469
-
470
- #: admin/views/metaboxes/metabox-options.php:66
471
- msgid "Enable test mode?"
472
- msgstr "Aktiviraj režim testa?"
473
-
474
- #: admin/views/metaboxes/metabox-options.php:70
475
- msgid ""
476
- "If test mode is enabled, the box will show up regardless of whether a cookie "
477
- "has been set. (To admins only)"
478
- msgstr ""
479
- "Ako je aktiviran režim testa, okvir će se prikazati bez obzira na "
480
- "podešavanje kolačića (samo administratorima)."
481
-
482
- #: admin/views/metaboxes/metabox-options.php:74
483
- msgid "Close on conversion?"
484
- msgstr ""
485
-
486
- #: admin/views/metaboxes/metabox-options.php:78
487
- msgid ""
488
- "If you have a form or social shortcode, by default popup will close on "
489
- "submission/conversion"
490
- msgstr ""
491
-
492
- #: admin/views/metaboxes/metabox-options.php:82
493
- msgid "Show powered by link?"
494
- msgstr ""
495
-
496
- #: admin/views/metaboxes/metabox-options.php:86
497
- #, php-format
498
- msgid ""
499
- "Shows a \"powered by\" link below your popup. If your affiliate link is set "
500
- "in the <a href=\"%s\">settings</a>, it will be used."
501
- msgstr ""
502
-
503
- #: admin/views/metaboxes/metabox-options.php:91
504
- msgid "Appearance"
505
- msgstr "Izgled"
506
-
507
- #: admin/views/metaboxes/metabox-options.php:95
508
- msgid "Background opacity"
509
- msgstr "Neprozirnost pozadine"
510
-
511
- #: admin/views/metaboxes/metabox-options.php:98
512
- msgid "Leave at 0 for no background. Max value is 1"
513
- msgstr "Ostavite na 0 ako ne želite pozadinu. Maksimalna vrednost je 1."
514
-
515
- #: admin/views/metaboxes/metabox-options.php:104
516
- msgid "Background color"
517
- msgstr "Boja pozadine"
518
-
519
- #: admin/views/metaboxes/metabox-options.php:108
520
- msgid "Text color"
521
- msgstr "Boja teksta"
522
-
523
- #: admin/views/metaboxes/metabox-options.php:112
524
- msgid "Box width"
525
- msgstr "Širina okvira"
526
-
527
- #: admin/views/metaboxes/metabox-options.php:118
528
- msgid "Border color"
529
- msgstr "Boja ivice"
530
-
531
- #: admin/views/metaboxes/metabox-options.php:122
532
- msgid "Border width"
533
- msgstr "Širina ivice"
534
-
535
- #: admin/views/metaboxes/metabox-premium.php:16
536
- msgid ""
537
- "Take the best WordPress Popups plugin to the next level with Popups Premium "
538
- "extension."
539
- msgstr ""
540
- "Podignite najbolji WordPress Popups plugin na viši nivo Popups Premium "
541
- "ekstenzijom"
542
-
543
- #: admin/views/metaboxes/metabox-premium.php:17
544
- msgid "Popups Premium Features:"
545
- msgstr "Popups Premium funkcionalnosti:"
546
-
547
- #: admin/views/metaboxes/metabox-premium.php:19
548
- msgid "Beautiful optin forms for popular mail providers"
549
- msgstr ""
550
-
551
- #: admin/views/metaboxes/metabox-premium.php:20
552
- msgid "Currently supporting MailChimp, Aweber, Postmatic, Mailpoet"
553
- msgstr ""
554
-
555
- #: admin/views/metaboxes/metabox-premium.php:21
556
- msgid ""
557
- "Track impressions and Conversions of social likes and forms submissions like "
558
- "Contact Form 7, Gravity forms, etc"
559
- msgstr ""
560
-
561
- #: admin/views/metaboxes/metabox-premium.php:22
562
- msgid "Track impressions and Conversions also in Google Analytics"
563
- msgstr "Praćenje utisaka i konverzija u Google analitici"
564
-
565
- #: admin/views/metaboxes/metabox-premium.php:23
566
- #: admin/views/metaboxes/metabox-premium.php:25
567
- msgid "Exit Intent technology"
568
- msgstr "Exit Intent tehnologija"
569
-
570
- #: admin/views/metaboxes/metabox-premium.php:24
571
- msgid "8 New animations effects"
572
- msgstr "8 novih efekata animacije"
573
-
574
- #: admin/views/metaboxes/metabox-premium.php:26
575
- msgid "New trigger methods"
576
- msgstr "Nove metode okidača"
577
-
578
- #: admin/views/metaboxes/metabox-premium.php:27
579
- msgid "Timer for auto closing"
580
- msgstr "Vremensko podešavanje automatskog zatvaranja"
581
-
582
- #: admin/views/metaboxes/metabox-premium.php:28
583
- msgid "Ability to disable close button"
584
- msgstr "Mogućnost deaktiviranja tastera za zatvaranje"
585
-
586
- #: admin/views/metaboxes/metabox-premium.php:29
587
- msgid ""
588
- "Ability to disable Advanced close methods like esc or clicking outside of "
589
- "the popup"
590
- msgstr ""
591
- "Mogućnost deaktiviranja naprednih metoda zatvaranja kao što su esc ili klik "
592
- "izvan iskačućeg prozora"
593
-
594
- #: admin/views/metaboxes/metabox-premium.php:30
595
- msgid "Premium support"
596
- msgstr "Premium podrška"
597
-
598
- #: admin/views/metaboxes/metabox-premium.php:34
599
- msgid "Buy Now!"
600
- msgstr "Kupite sada!"
601
-
602
- #: admin/views/metaboxes/metabox-rules.php:19
603
- msgid "Rules"
604
- msgstr "Pravila"
605
-
606
- #: admin/views/metaboxes/metabox-rules.php:20
607
- msgid "Create a set of rules to determine where the popup will show"
608
- msgstr ""
609
- "Kreirajte skup pravila da biste odredili gde će se pojaviti iskačući prozor"
610
-
611
- #: admin/views/metaboxes/metabox-rules.php:31
612
- msgid "Show this popup if"
613
- msgstr "Prikaži ovaj iskačući prozor ako"
614
-
615
- #: admin/views/metaboxes/metabox-rules.php:61
616
- msgid "is equal to"
617
- msgstr "jednak je"
618
-
619
- #: admin/views/metaboxes/metabox-rules.php:62
620
- msgid "is not equal to"
621
- msgstr "nije jednak"
622
-
623
- #: admin/views/metaboxes/metabox-rules.php:93
624
- msgid "and"
625
- msgstr "i"
626
-
627
- #: admin/views/metaboxes/metabox-rules.php:108
628
- msgid "Add rule group"
629
- msgstr "Dodaj pravilo za grupu"
630
-
631
- #: admin/views/metaboxes/metabox-support.php:6
632
- #, php-format
633
- msgid "You are using Popups plugin v%s"
634
- msgstr "Koristite Popups plugin v%s"
635
-
636
- #: admin/views/metaboxes/metabox-support.php:7
637
- #, php-format
638
- msgid ""
639
- "If you need support please go to the WordPress.org <a href=\"%s\">support "
640
- "forums</a>"
641
- msgstr ""
642
- "Ako vam je potrebna podrška, idite na WordPress.org <a href=\"%s\">forume za "
643
- "podršku</a>"
644
-
645
- #: admin/views/settings-page.php:17
646
- msgid "Affiliate link"
647
- msgstr ""
648
-
649
- #: admin/views/settings-page.php:20
650
- #, php-format
651
- msgid ""
652
- "You can earn money by promoting the plugin! Join <a href=\"%s\">our "
653
- "affiliate program</a> and paste your affiliate link here to earn 35&#37; in "
654
- "commissions . Once entered, it will replace the default \"Powered by\" on "
655
- "the popups."
656
- msgstr ""
657
-
658
- #: admin/views/settings-page.php:24
659
- msgid "Ajax mode?"
660
- msgstr "Ajax režim?"
661
-
662
- #: admin/views/settings-page.php:27
663
- msgid ""
664
- "Load popups using ajax. Compatible with cache plugins, but might not work "
665
- "with all plugins"
666
- msgstr ""
667
- "Koristi Ajax za učitavanje iskačućih prozora. Kompatibilan je sa keš "
668
- "dodacima, ali možda neće raditi sa svim dodacima."
669
-
670
- #: admin/views/settings-page.php:32
671
- msgid "Enable Debug mode?"
672
- msgstr "Aktiviraj režim za otklanjanje grešaka?"
673
-
674
- #: admin/views/settings-page.php:35
675
- msgid "Will use uncompressed js"
676
- msgstr "Koristiće nekompresovan js"
677
-
678
- #: admin/views/settings-page.php:40
679
- msgid "Enable safe mode?"
680
- msgstr "Aktiviraj bezbedni režim?"
681
-
682
- #: admin/views/settings-page.php:43
683
- msgid "Will move all popups to top of the screen."
684
- msgstr "Pomeriće sve iskačuće prozore na vrh ekrana"
685
-
686
- #: admin/views/settings-page.php:48
687
- msgid "Remove shortcodes style"
688
- msgstr "Ukloni shortcode stilove"
689
-
690
- #: admin/views/settings-page.php:51
691
- msgid ""
692
- "By default the plugin will apply some style to shortcodes. Check here if you "
693
- "want to manually style them"
694
- msgstr ""
695
- "Po standardu, plugin će primeniti neki stil na shortcode-ove. Štiklirajte "
696
- "ovde ako želite da ih manuelno stilizujete "
697
-
698
- #: admin/views/settings-page.php:56
699
- msgid "Unload Facebook javascript"
700
- msgstr "Ne učitavaj Facebook javascript"
701
-
702
- #: admin/views/settings-page.php:59
703
- msgid "If you use your own Facebook script, check this"
704
- msgstr "Štiklirajte ovo ako koristite svoj Facebook script, proverite ovo"
705
-
706
- #: admin/views/settings-page.php:64
707
- msgid "Unload Google javascript"
708
- msgstr "Ne učitavaj Google javascript"
709
-
710
- #: admin/views/settings-page.php:67
711
- msgid "If you use your own Google script, check this"
712
- msgstr "Štiklirajte ovo ako koristite svoj Google script"
713
-
714
- #: admin/views/settings-page.php:72
715
- msgid "Unload Twitter javascript"
716
- msgstr "Ne učitavaj Twitter javascript"
717
-
718
- #: admin/views/settings-page.php:75
719
- msgid "If you use your own Twitter script, check this"
720
- msgstr "Ne učitavaj Twitter javascript"
721
-
722
- #: admin/views/settings-page.php:80
723
- msgid "Save settings"
724
- msgstr "Sačuvaj podešavanja"
725
-
726
- #: includes/class-spu-helper.php:133
727
- msgid "All Pages"
728
- msgstr "Sve stranice"
729
-
730
- #: includes/class-spu-helper.php:134
731
- msgid "Front Page"
732
- msgstr "Prva stranica"
733
-
734
- #: includes/class-spu-helper.php:135
735
- msgid "Posts Page"
736
- msgstr "Postovi na stranici"
737
-
738
- #: includes/class-spu-helper.php:136
739
- msgid "Category Page"
740
- msgstr ""
741
-
742
- #: includes/class-spu-helper.php:137
743
- msgid "Archives Page"
744
- msgstr ""
745
-
746
- #: includes/class-spu-helper.php:138
747
- msgid "Top Level Page (parent of 0)"
748
- msgstr "Stranica vrhunskog nivoa (nadređena 0)"
749
-
750
- #: includes/class-spu-helper.php:139
751
- msgid "Parent Page (has children)"
752
- msgstr "Nadređena stranica (ima podređene)"
753
-
754
- #: includes/class-spu-helper.php:140
755
- msgid "Child Page (has parent)"
756
- msgstr "Podređena stranica (ima nadređene)"
757
-
758
- #: includes/class-spu-helper.php:148
759
- msgid "Default Template"
760
- msgstr "Podređena stranica (ima nadređene)"
761
-
762
- #: includes/class-spu-helper.php:221
763
- msgid "Publish"
764
- msgstr "Podrazumevani šablon"
765
-
766
- #: includes/class-spu-helper.php:222
767
- msgid "Pending Review"
768
- msgstr "Objavi"
769
-
770
- #: includes/class-spu-helper.php:223
771
- msgid "Draft"
772
- msgstr "Skica"
773
-
774
- #: includes/class-spu-helper.php:224
775
- msgid "Future"
776
- msgstr "Buduci"
777
-
778
- #: includes/class-spu-helper.php:225
779
- msgid "Private"
780
- msgstr "Privatni"
781
-
782
- #: includes/class-spu-helper.php:226
783
- msgid "Revision"
784
- msgstr "Revizija"
785
-
786
- #: includes/class-spu-helper.php:227
787
- msgid "Trash"
788
- msgstr "Korpa za otpatke"
789
-
790
- #: includes/class-spu-helper.php:240
791
- msgid "Super Admin"
792
- msgstr "Super Admin"
793
-
794
- #: includes/class-spu-helper.php:260
795
- msgid "True"
796
- msgstr "Super Admin"
797
-
798
- #~ msgid ""
799
- #~ "Hide box again when visitors scroll back up? Only works when Trigger "
800
- #~ "action is set to % of page height"
801
- #~ msgstr ""
802
- #~ "Ponovo sakrij okvir kad se posetioci vrate na početak? Radi samo kad je "
803
- #~ "okidač aktivnosti podešen na &#37; visinu stranice"
804
-
805
- #~ msgctxt "post type general name"
806
- #~ msgid "Popups v"
807
- #~ msgstr "Popups v [opšti naziv vrste posta]"
808
-
809
- #~ msgid "What's new"
810
- #~ msgstr "Šta ima novo"
811
-
812
- #~ msgid "Like Facebook like box but for Twitter"
813
- #~ msgstr "Kao Facebook taster ‘sviđa mi se’, samo za Twiter"
814
-
815
- #~ msgid ""
816
- #~ "Track impressions and Conversions of social likes/follow and forms "
817
- #~ "submissions like Contact Form 7, Gravity forms, etc"
818
- #~ msgstr ""
819
- #~ "Praćenje utisaka, konverzija opcija ‘sviđa mi se’ i ‘prati me’ na "
820
- #~ "društvenim mrežama, kao i podnošenje obrazaca, kao što je Obrazac "
821
- #~ "kontakta br 7, obrazaca gravitacije itd."
1
+ # Copyright (C) 2013 TODO
2
+ # This file is distributed under the same license as the TODO package.
3
+ msgid ""
4
+ msgstr ""
5
+ "Project-Id-Version: Popups\n"
6
+ "Report-Msgid-Bugs-To: http://wordpress.org/plugins/plugin-name\n"
7
+ "POT-Creation-Date: 2015-06-14 10:53-0300\n"
8
+ "PO-Revision-Date: 2015-06-14 10:53-0300\n"
9
+ "Last-Translator: Damian Logghe <info@timersys.com>\n"
10
+ "Language-Team: Timersys <info@timersys.com>\n"
11
+ "Language: en_EN\n"
12
+ "MIME-Version: 1.0\n"
13
+ "Content-Type: text/plain; charset=UTF-8\n"
14
+ "Content-Transfer-Encoding: 8bit\n"
15
+ "X-Generator: Poedit 1.7.4\n"
16
+ "X-Poedit-KeywordsList: __;_e;_n;_x;esc_html_e;esc_html__;esc_attr_e;"
17
+ "esc_attr__;_ex:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2;_x:1,2c;_n:1,2\n"
18
+ "X-Poedit-Basepath: ../\n"
19
+ "Plural-Forms: nplurals=2; plural=n != 1;\n"
20
+ "X-Poedit-SearchPath-0: .\n"
21
+
22
+ #: admin/class-social-popup-admin.php:154
23
+ msgctxt "post type singular name"
24
+ msgid "Popups"
25
+ msgstr "Popups [pojedinačni naziv vrste posta]"
26
+
27
+ #: admin/class-social-popup-admin.php:155
28
+ msgctxt "admin menu"
29
+ msgid "Popups"
30
+ msgstr "Iskačući prozori [meni administratora]"
31
+
32
+ #: admin/class-social-popup-admin.php:156
33
+ msgctxt "add new on admin bar"
34
+ msgid "Popups"
35
+ msgstr "Iskačući prozori [dodaj novi na traci sa menijem administratora]"
36
+
37
+ #: admin/class-social-popup-admin.php:157
38
+ msgctxt "Popups"
39
+ msgid "Add New"
40
+ msgstr "Dodaj nove [iskačuće prozore]"
41
+
42
+ #: admin/class-social-popup-admin.php:158
43
+ msgid "Add New Popups"
44
+ msgstr "Dodaj nove iskačuće prozore"
45
+
46
+ #: admin/class-social-popup-admin.php:159
47
+ msgid "New Popups"
48
+ msgstr "Novi iskačući prozori "
49
+
50
+ #: admin/class-social-popup-admin.php:160
51
+ msgid "Edit Popups"
52
+ msgstr "Uredi iskačuće prozore"
53
+
54
+ #: admin/class-social-popup-admin.php:161
55
+ msgid "View Popups"
56
+ msgstr "Vidi iskačuće prozore"
57
+
58
+ #: admin/class-social-popup-admin.php:162
59
+ msgid "All Popups"
60
+ msgstr "Svi iskačući prozori "
61
+
62
+ #: admin/class-social-popup-admin.php:163
63
+ msgid "Search Popups"
64
+ msgstr "Pretraži iskačuće prozore"
65
+
66
+ #: admin/class-social-popup-admin.php:164
67
+ msgid "Parent Popups:"
68
+ msgstr "Nadređeni iskačući prozori "
69
+
70
+ #: admin/class-social-popup-admin.php:165
71
+ msgid "No Popups found."
72
+ msgstr "Nisu pronađeni iskačući prozori "
73
+
74
+ #: admin/class-social-popup-admin.php:166
75
+ msgid "No Popups found in Trash."
76
+ msgstr "Nisu pronađeni iskačući prozori u korpi za otpatke"
77
+
78
+ #: admin/class-social-popup-admin.php:255
79
+ msgid "Popups Premium"
80
+ msgstr "Popups Premium"
81
+
82
+ #: admin/class-social-popup-admin.php:266
83
+ msgid "PopUp Shortcodes"
84
+ msgstr "PopUp Shortcodes"
85
+
86
+ #: admin/class-social-popup-admin.php:275
87
+ msgid "PopUp Display Rules"
88
+ msgstr "PopUp pravila prikazivanja"
89
+
90
+ #: admin/class-social-popup-admin.php:284
91
+ msgid "Display Options"
92
+ msgstr "Opcije prikazivanja"
93
+
94
+ #: admin/class-social-popup-admin.php:293
95
+ msgid "Need support?"
96
+ msgstr "Treba vam podrška?"
97
+
98
+ #: admin/class-social-popup-admin.php:301
99
+ msgid "Donate & support"
100
+ msgstr "Donirajte i podržite"
101
+
102
+ #: admin/class-social-popup-admin.php:309
103
+ msgid "About the developer"
104
+ msgstr "O programeru"
105
+
106
+ #: admin/class-social-popup-admin.php:557
107
+ #: admin/views/metaboxes/metabox-rules.php:33
108
+ #: admin/views/metaboxes/metabox-rules.php:106
109
+ msgid "or"
110
+ msgstr "ili"
111
+
112
+ #: admin/class-social-popup-admin.php:584
113
+ msgid "Add a Popup"
114
+ msgstr "Dodaj iskačući prozor"
115
+
116
+ #: admin/class-social-popup-admin.php:708
117
+ msgid "User"
118
+ msgstr "Korisnik"
119
+
120
+ #: admin/class-social-popup-admin.php:709
121
+ msgid "User role"
122
+ msgstr "Korisnička uloga"
123
+
124
+ #: admin/class-social-popup-admin.php:710
125
+ msgid "User is logged"
126
+ msgstr "Korisnik je prijavljen"
127
+
128
+ #: admin/class-social-popup-admin.php:711
129
+ msgid "User never left a comment"
130
+ msgstr "Korisnik nikad nije ostavio komentar"
131
+
132
+ #: admin/class-social-popup-admin.php:712
133
+ msgid "User came via a search engine"
134
+ msgstr "Korisnik je došao putem pretraživača"
135
+
136
+ #: admin/class-social-popup-admin.php:713
137
+ msgid "User did not arrive via another page on your site"
138
+ msgstr "Korisnik nije došao preko druge stranice na vašem site-u"
139
+
140
+ #: admin/class-social-popup-admin.php:715
141
+ #: admin/class-social-popup-admin.php:716
142
+ msgid "Post"
143
+ msgstr "Post"
144
+
145
+ #: admin/class-social-popup-admin.php:717
146
+ msgid "Post ID"
147
+ msgstr ""
148
+
149
+ #: admin/class-social-popup-admin.php:718
150
+ msgid "Post Type"
151
+ msgstr "Vrsta posta"
152
+
153
+ #: admin/class-social-popup-admin.php:719
154
+ msgid "Post Category"
155
+ msgstr "Kategorija posta"
156
+
157
+ #: admin/class-social-popup-admin.php:720
158
+ msgid "Post Format"
159
+ msgstr "Format posta"
160
+
161
+ #: admin/class-social-popup-admin.php:721
162
+ msgid "Post Status"
163
+ msgstr "Status posta"
164
+
165
+ #: admin/class-social-popup-admin.php:722
166
+ msgid "Post Taxonomy"
167
+ msgstr "Taksonomija posta"
168
+
169
+ #: admin/class-social-popup-admin.php:724
170
+ #: admin/class-social-popup-admin.php:725
171
+ msgid "Page"
172
+ msgstr "Stranica"
173
+
174
+ #: admin/class-social-popup-admin.php:726
175
+ msgid "Page Type"
176
+ msgstr "Vrsta stranice"
177
+
178
+ #: admin/class-social-popup-admin.php:727
179
+ msgid "Page Parent"
180
+ msgstr "Nadređena stranica"
181
+
182
+ #: admin/class-social-popup-admin.php:728
183
+ msgid "Page Template"
184
+ msgstr "Šablon stranice"
185
+
186
+ #: admin/class-social-popup-admin.php:730
187
+ msgid "Other"
188
+ msgstr "Drugi"
189
+
190
+ #: admin/class-social-popup-admin.php:731
191
+ msgid "Referrer"
192
+ msgstr ""
193
+
194
+ #: admin/class-social-popup-admin.php:732
195
+ msgid "Mobile Phone"
196
+ msgstr "Mobilni telefon"
197
+
198
+ #: admin/class-social-popup-admin.php:733
199
+ msgid "Tablet"
200
+ msgstr "Tablet"
201
+
202
+ #: admin/includes/class-spu-notices.php:30
203
+ #, php-format
204
+ msgid ""
205
+ "We noticed that you have been using our plugin for a while and we would like "
206
+ "to ask you a little favour. If you are happy with it and can take a minute "
207
+ "please <a href=\"%s\" target=\"_blank\">leave a nice review</a> on "
208
+ "WordPress. It will be a tremendous help for us!"
209
+ msgstr ""
210
+
211
+ #: admin/includes/class-spu-notices.php:32
212
+ #, php-format
213
+ msgid "<a href=\"%s\" target=\"_blank\">Leave a nice review</a>"
214
+ msgstr ""
215
+
216
+ #: admin/includes/class-spu-notices.php:33
217
+ #, php-format
218
+ msgid "<a href=\"%s\">No, thanks</a>"
219
+ msgstr ""
220
+
221
+ #: admin/views/metaboxes/metabox-donate.php:6
222
+ msgid "If you like this plugin, consider supporting it by donating."
223
+ msgstr ""
224
+ "Ako vam se sviđa ovaj plugin, razmislite o tome da ga podržite donacijom."
225
+
226
+ #: admin/views/metaboxes/metabox-donate.php:8
227
+ msgid "Donate with PayPal"
228
+ msgstr "Donirajte putem PayPal-a"
229
+
230
+ #: admin/views/metaboxes/metabox-donate.php:10
231
+ msgid "Some other ways to support this plugin"
232
+ msgstr "Drugi načini za podržavanje ovog plugin-a."
233
+
234
+ #: admin/views/metaboxes/metabox-donate.php:12
235
+ msgid "Leave a &#9733;&#9733;&#9733;&#9733;&#9733; review on WordPress.org"
236
+ msgstr "Ostavite komentar &#9733;&#9733;&#9733;&#9733;&#9733; na WordPress.org"
237
+
238
+ #: admin/views/metaboxes/metabox-donate.php:13
239
+ msgid "Write about Popups on your blog"
240
+ msgstr "Pišite o Popups plugin-u na svom blogu"
241
+
242
+ #: admin/views/metaboxes/metabox-donate.php:14
243
+ msgid "Tweet about Popups"
244
+ msgstr "Pišite na Twitter-u o Popups plugin-u"
245
+
246
+ #: admin/views/metaboxes/metabox-donate.php:15
247
+ msgid "Vote \"works\" on the WordPress.org plugin page"
248
+ msgstr "Glasajte da \"radi\" na WordPress.org plugin stranici."
249
+
250
+ #: admin/views/metaboxes/metabox-help.php:6
251
+ msgid ""
252
+ "You have three social shortcodes to use that will print a Facebook like, a "
253
+ "Google+ Follow and a Twitter follow. Check the available options and "
254
+ "<strong>configure them with your social accounts</strong>:"
255
+ msgstr ""
256
+ "Imate tri shortcode-a društvenih mreža na raspolaganju, koji će štampati "
257
+ "Facebook ‘sviđa mi se’, Google+ ‘prati’ i Twitter ‘prati’. Pogledajte "
258
+ "raspoložive opcije i <strong>uskladite ih sa svojim nalozima na društvenim "
259
+ "mrežama</strong>:"
260
+
261
+ #: admin/views/metaboxes/metabox-help.php:12
262
+ msgid "View Facebook Page Options"
263
+ msgstr ""
264
+
265
+ #: admin/views/metaboxes/metabox-help.php:14
266
+ #: admin/views/metaboxes/metabox-help.php:27
267
+ msgid "Your facebook page url"
268
+ msgstr "Url vaše Facebook stranice"
269
+
270
+ #: admin/views/metaboxes/metabox-help.php:15
271
+ msgid "Your page name"
272
+ msgstr ""
273
+
274
+ #: admin/views/metaboxes/metabox-help.php:16
275
+ msgid "true|false <b>Default value:</b> true"
276
+ msgstr ""
277
+
278
+ #: admin/views/metaboxes/metabox-help.php:17
279
+ msgid "true|false <b>Default value:</b> false"
280
+ msgstr ""
281
+
282
+ #: admin/views/metaboxes/metabox-help.php:25
283
+ msgid "View Facebook Options"
284
+ msgstr "Vidi Facebook opcije"
285
+
286
+ #: admin/views/metaboxes/metabox-help.php:28
287
+ msgid "standard, box_count, button <b>Default value:</b> button_count"
288
+ msgstr ""
289
+ "standardni, box_count, taster <b>Podrazumevana vrednost:</b> button_count"
290
+
291
+ #: admin/views/metaboxes/metabox-help.php:29
292
+ #: admin/views/metaboxes/metabox-help.php:30
293
+ msgid "true <b>Default value:</b> false"
294
+ msgstr "istina <b>Podrazumevana vrednost:</b> laž"
295
+
296
+ #: admin/views/metaboxes/metabox-help.php:31
297
+ msgid "recommend <b>Default value:</b> like"
298
+ msgstr "preporučena<b>Podrazumevana vrednost:</b> sviđa mi se"
299
+
300
+ #: admin/views/metaboxes/metabox-help.php:38
301
+ msgid "View Google+ Options"
302
+ msgstr "Vidi Google+ opcije "
303
+
304
+ #: admin/views/metaboxes/metabox-help.php:40
305
+ msgid "Your Google+ url"
306
+ msgstr "Url za vaš Google+"
307
+
308
+ #: admin/views/metaboxes/metabox-help.php:41
309
+ msgid "small, standard, tall <b>Default value:</b> medium"
310
+ msgstr "Mali, standardni, visok<b>Podrazumevana vrednost:</b> srednji"
311
+
312
+ #: admin/views/metaboxes/metabox-help.php:42
313
+ msgid "inline, none <b>Default value:</b> bubble"
314
+ msgstr "inline, nijedan <b>Podrazumevana vrednost:</b>balončić"
315
+
316
+ #: admin/views/metaboxes/metabox-help.php:48
317
+ msgid "View Twitter Options"
318
+ msgstr "Vidi Twitter opcije"
319
+
320
+ #: admin/views/metaboxes/metabox-help.php:50
321
+ msgid "Your Twitter user <b>Default chifli</b>iiii"
322
+ msgstr "Vaš Twitter korisnik <b>Podrazumevani chifli</b>iiii"
323
+
324
+ #: admin/views/metaboxes/metabox-help.php:51
325
+ msgid "false <b>Default value:</b> true"
326
+ msgstr "laž<b>Podrazumevana vrednost:</b> istina"
327
+
328
+ #: admin/views/metaboxes/metabox-help.php:52
329
+ msgid "large <b>Default value:</b> \"\""
330
+ msgstr "veliki <b>Podrazumevana vrednost:</b>\"\""
331
+
332
+ #: admin/views/metaboxes/metabox-help.php:55
333
+ msgid "Other available Shortcodes:"
334
+ msgstr "Drugi raspoloživi shortcode-ovi"
335
+
336
+ #: admin/views/metaboxes/metabox-help.php:60
337
+ msgid "View Close shortcode Options"
338
+ msgstr "Vidi: zatvori shortcode opcije "
339
+
340
+ #: admin/views/metaboxes/metabox-help.php:62
341
+ msgid "Pass a custom class to style your button"
342
+ msgstr "Dodajte prilagođenu klasu da biste stilizovali svoj taster"
343
+
344
+ #: admin/views/metaboxes/metabox-help.php:63
345
+ msgid "Button label - <b>Default value:</b> Close"
346
+ msgstr "Oznaka tastera <b>Podrazumevana vrednost:</b> Zatvori"
347
+
348
+ #: admin/views/metaboxes/metabox-help.php:64
349
+ msgid "left, right, center, none - <b>Default value:</b> center"
350
+ msgstr ""
351
+ "evo, desno, u sredini, nijedan <b>Podrazumevana vrednost:</b> u sredini"
352
+
353
+ #: admin/views/metaboxes/metabox-links.php:6
354
+ msgid "My name is"
355
+ msgstr "Zovem se"
356
+
357
+ #: admin/views/metaboxes/metabox-links.php:6
358
+ msgid "I develop WordPress plugins and themes."
359
+ msgstr "Programiram WordPress dodatke i teme."
360
+
361
+ #: admin/views/metaboxes/metabox-links.php:7
362
+ #, php-format
363
+ msgid ""
364
+ "Take a look at my <a href=\"%s\">site</a> to see my other plugins or hire "
365
+ "me. Subscribe to get updates!"
366
+ msgstr ""
367
+ "Pogledajte moj <a href=\"%s\">site</a> da biste videli ostale moje dodatke "
368
+ "ili da biste me angažovali. Pretplatite se da biste dobijali aržuriranja!"
369
+
370
+ #: admin/views/metaboxes/metabox-links.php:8
371
+ msgid "Other plugins I built:"
372
+ msgstr "Ostali dodaci koje sam napravio:"
373
+
374
+ #: admin/views/metaboxes/metabox-links.php:10
375
+ msgid "Install multiple plugins and create collections"
376
+ msgstr "Instaliraj višestruke dodatke i kreiraj zbirke"
377
+
378
+ #: admin/views/metaboxes/metabox-links.php:11
379
+ msgid "Geotarget your content"
380
+ msgstr ""
381
+
382
+ #: admin/views/metaboxes/metabox-links.php:12
383
+ msgid "Invite your network friends and import contacts"
384
+ msgstr "Pozovite svoje prijatelje sa mreže i uvezite kontakte"
385
+
386
+ #: admin/views/metaboxes/metabox-options.php:9
387
+ msgid "Box Position"
388
+ msgstr "Pozicija okvira"
389
+
390
+ #: admin/views/metaboxes/metabox-options.php:12
391
+ msgid "Centered"
392
+ msgstr "U sredini"
393
+
394
+ #: admin/views/metaboxes/metabox-options.php:13
395
+ msgid "Top Left"
396
+ msgstr "Gore levo"
397
+
398
+ #: admin/views/metaboxes/metabox-options.php:14
399
+ msgid "Top Right"
400
+ msgstr "Gore desno"
401
+
402
+ #: admin/views/metaboxes/metabox-options.php:15
403
+ msgid "Bottom Left"
404
+ msgstr "Dole levo"
405
+
406
+ #: admin/views/metaboxes/metabox-options.php:16
407
+ msgid "Bottom Right"
408
+ msgstr "Dole desno"
409
+
410
+ #: admin/views/metaboxes/metabox-options.php:23
411
+ msgid "Trigger action"
412
+ msgstr "Pokreni aktivnost"
413
+
414
+ #: admin/views/metaboxes/metabox-options.php:27
415
+ msgid "seconds after page load"
416
+ msgstr "sekundi nakon učitavanja stranice"
417
+
418
+ #: admin/views/metaboxes/metabox-options.php:28
419
+ msgid "of page height"
420
+ msgstr "ili visina stranice"
421
+
422
+ #: admin/views/metaboxes/metabox-options.php:38
423
+ msgid "Auto-hide?"
424
+ msgstr "Automatski sakrij?"
425
+
426
+ #: admin/views/metaboxes/metabox-options.php:40
427
+ #: admin/views/metaboxes/metabox-options.php:68
428
+ #: admin/views/metaboxes/metabox-options.php:76
429
+ #: admin/views/metaboxes/metabox-options.php:84
430
+ msgid "Yes"
431
+ msgstr "Da"
432
+
433
+ #: admin/views/metaboxes/metabox-options.php:41
434
+ #: admin/views/metaboxes/metabox-options.php:69
435
+ #: admin/views/metaboxes/metabox-options.php:77
436
+ #: admin/views/metaboxes/metabox-options.php:85
437
+ msgid "No"
438
+ msgstr "Ne"
439
+
440
+ #: admin/views/metaboxes/metabox-options.php:42
441
+ msgid ""
442
+ "Hide box again when visitors scroll back up? Only works when Trigger action "
443
+ "is set to &#37; of page height"
444
+ msgstr ""
445
+
446
+ #: admin/views/metaboxes/metabox-options.php:46
447
+ msgid "Animation"
448
+ msgstr "Animacija"
449
+
450
+ #: admin/views/metaboxes/metabox-options.php:49
451
+ msgid "Fade In"
452
+ msgstr "Bledi"
453
+
454
+ #: admin/views/metaboxes/metabox-options.php:50
455
+ msgid "Slide In"
456
+ msgstr "Kliza"
457
+
458
+ #: admin/views/metaboxes/metabox-options.php:53
459
+ msgid "Slide will only apply when popup is on the corners"
460
+ msgstr "Klizanje će funkcionisati samo kad je iskačući prozor u ćoškovima"
461
+
462
+ #: admin/views/metaboxes/metabox-options.php:58
463
+ msgid "Cookie expiration days"
464
+ msgstr "Rok trajanja kolačića"
465
+
466
+ #: admin/views/metaboxes/metabox-options.php:61
467
+ msgid "After closing the box, how many days should it stay hidden?"
468
+ msgstr "Koliko dana okvir treba da ostane sakriven nakon zatvaranja?"
469
+
470
+ #: admin/views/metaboxes/metabox-options.php:66
471
+ msgid "Enable test mode?"
472
+ msgstr "Aktiviraj režim testa?"
473
+
474
+ #: admin/views/metaboxes/metabox-options.php:70
475
+ msgid ""
476
+ "If test mode is enabled, the box will show up regardless of whether a cookie "
477
+ "has been set. (To admins only)"
478
+ msgstr ""
479
+ "Ako je aktiviran režim testa, okvir će se prikazati bez obzira na "
480
+ "podešavanje kolačića (samo administratorima)."
481
+
482
+ #: admin/views/metaboxes/metabox-options.php:74
483
+ msgid "Close on conversion?"
484
+ msgstr ""
485
+
486
+ #: admin/views/metaboxes/metabox-options.php:78
487
+ msgid ""
488
+ "If you have a form or social shortcode, by default popup will close on "
489
+ "submission/conversion"
490
+ msgstr ""
491
+
492
+ #: admin/views/metaboxes/metabox-options.php:82
493
+ msgid "Show powered by link?"
494
+ msgstr ""
495
+
496
+ #: admin/views/metaboxes/metabox-options.php:86
497
+ #, php-format
498
+ msgid ""
499
+ "Shows a \"powered by\" link below your popup. If your affiliate link is set "
500
+ "in the <a href=\"%s\">settings</a>, it will be used."
501
+ msgstr ""
502
+
503
+ #: admin/views/metaboxes/metabox-options.php:91
504
+ msgid "Appearance"
505
+ msgstr "Izgled"
506
+
507
+ #: admin/views/metaboxes/metabox-options.php:95
508
+ msgid "Background opacity"
509
+ msgstr "Neprozirnost pozadine"
510
+
511
+ #: admin/views/metaboxes/metabox-options.php:98
512
+ msgid "Leave at 0 for no background. Max value is 1"
513
+ msgstr "Ostavite na 0 ako ne želite pozadinu. Maksimalna vrednost je 1."
514
+
515
+ #: admin/views/metaboxes/metabox-options.php:104
516
+ msgid "Background color"
517
+ msgstr "Boja pozadine"
518
+
519
+ #: admin/views/metaboxes/metabox-options.php:108
520
+ msgid "Text color"
521
+ msgstr "Boja teksta"
522
+
523
+ #: admin/views/metaboxes/metabox-options.php:112
524
+ msgid "Box width"
525
+ msgstr "Širina okvira"
526
+
527
+ #: admin/views/metaboxes/metabox-options.php:118
528
+ msgid "Border color"
529
+ msgstr "Boja ivice"
530
+
531
+ #: admin/views/metaboxes/metabox-options.php:122
532
+ msgid "Border width"
533
+ msgstr "Širina ivice"
534
+
535
+ #: admin/views/metaboxes/metabox-premium.php:16
536
+ msgid ""
537
+ "Take the best WordPress Popups plugin to the next level with Popups Premium "
538
+ "extension."
539
+ msgstr ""
540
+ "Podignite najbolji WordPress Popups plugin na viši nivo Popups Premium "
541
+ "ekstenzijom"
542
+
543
+ #: admin/views/metaboxes/metabox-premium.php:17
544
+ msgid "Popups Premium Features:"
545
+ msgstr "Popups Premium funkcionalnosti:"
546
+
547
+ #: admin/views/metaboxes/metabox-premium.php:19
548
+ msgid "Beautiful optin forms for popular mail providers"
549
+ msgstr ""
550
+
551
+ #: admin/views/metaboxes/metabox-premium.php:20
552
+ msgid "Currently supporting MailChimp, Aweber, Postmatic, Mailpoet"
553
+ msgstr ""
554
+
555
+ #: admin/views/metaboxes/metabox-premium.php:21
556
+ msgid ""
557
+ "Track impressions and Conversions of social likes and forms submissions like "
558
+ "Contact Form 7, Gravity forms, etc"
559
+ msgstr ""
560
+
561
+ #: admin/views/metaboxes/metabox-premium.php:22
562
+ msgid "Track impressions and Conversions also in Google Analytics"
563
+ msgstr "Praćenje utisaka i konverzija u Google analitici"
564
+
565
+ #: admin/views/metaboxes/metabox-premium.php:23
566
+ #: admin/views/metaboxes/metabox-premium.php:25
567
+ msgid "Exit Intent technology"
568
+ msgstr "Exit Intent tehnologija"
569
+
570
+ #: admin/views/metaboxes/metabox-premium.php:24
571
+ msgid "8 New animations effects"
572
+ msgstr "8 novih efekata animacije"
573
+
574
+ #: admin/views/metaboxes/metabox-premium.php:26
575
+ msgid "New trigger methods"
576
+ msgstr "Nove metode okidača"
577
+
578
+ #: admin/views/metaboxes/metabox-premium.php:27
579
+ msgid "Timer for auto closing"
580
+ msgstr "Vremensko podešavanje automatskog zatvaranja"
581
+
582
+ #: admin/views/metaboxes/metabox-premium.php:28
583
+ msgid "Ability to disable close button"
584
+ msgstr "Mogućnost deaktiviranja tastera za zatvaranje"
585
+
586
+ #: admin/views/metaboxes/metabox-premium.php:29
587
+ msgid ""
588
+ "Ability to disable Advanced close methods like esc or clicking outside of "
589
+ "the popup"
590
+ msgstr ""
591
+ "Mogućnost deaktiviranja naprednih metoda zatvaranja kao što su esc ili klik "
592
+ "izvan iskačućeg prozora"
593
+
594
+ #: admin/views/metaboxes/metabox-premium.php:30
595
+ msgid "Premium support"
596
+ msgstr "Premium podrška"
597
+
598
+ #: admin/views/metaboxes/metabox-premium.php:34
599
+ msgid "Buy Now!"
600
+ msgstr "Kupite sada!"
601
+
602
+ #: admin/views/metaboxes/metabox-rules.php:19
603
+ msgid "Rules"
604
+ msgstr "Pravila"
605
+
606
+ #: admin/views/metaboxes/metabox-rules.php:20
607
+ msgid "Create a set of rules to determine where the popup will show"
608
+ msgstr ""
609
+ "Kreirajte skup pravila da biste odredili gde će se pojaviti iskačući prozor"
610
+
611
+ #: admin/views/metaboxes/metabox-rules.php:31
612
+ msgid "Show this popup if"
613
+ msgstr "Prikaži ovaj iskačući prozor ako"
614
+
615
+ #: admin/views/metaboxes/metabox-rules.php:61
616
+ msgid "is equal to"
617
+ msgstr "jednak je"
618
+
619
+ #: admin/views/metaboxes/metabox-rules.php:62
620
+ msgid "is not equal to"
621
+ msgstr "nije jednak"
622
+
623
+ #: admin/views/metaboxes/metabox-rules.php:93
624
+ msgid "and"
625
+ msgstr "i"
626
+
627
+ #: admin/views/metaboxes/metabox-rules.php:108
628
+ msgid "Add rule group"
629
+ msgstr "Dodaj pravilo za grupu"
630
+
631
+ #: admin/views/metaboxes/metabox-support.php:6
632
+ #, php-format
633
+ msgid "You are using Popups plugin v%s"
634
+ msgstr "Koristite Popups plugin v%s"
635
+
636
+ #: admin/views/metaboxes/metabox-support.php:7
637
+ #, php-format
638
+ msgid ""
639
+ "If you need support please go to the WordPress.org <a href=\"%s\">support "
640
+ "forums</a>"
641
+ msgstr ""
642
+ "Ako vam je potrebna podrška, idite na WordPress.org <a href=\"%s\">forume za "
643
+ "podršku</a>"
644
+
645
+ #: admin/views/settings-page.php:17
646
+ msgid "Affiliate link"
647
+ msgstr ""
648
+
649
+ #: admin/views/settings-page.php:20
650
+ #, php-format
651
+ msgid ""
652
+ "You can earn money by promoting the plugin! Join <a href=\"%s\">our "
653
+ "affiliate program</a> and paste your affiliate link here to earn 35&#37; in "
654
+ "commissions . Once entered, it will replace the default \"Powered by\" on "
655
+ "the popups."
656
+ msgstr ""
657
+
658
+ #: admin/views/settings-page.php:24
659
+ msgid "Ajax mode?"
660
+ msgstr "Ajax režim?"
661
+
662
+ #: admin/views/settings-page.php:27
663
+ msgid ""
664
+ "Load popups using ajax. Compatible with cache plugins, but might not work "
665
+ "with all plugins"
666
+ msgstr ""
667
+ "Koristi Ajax za učitavanje iskačućih prozora. Kompatibilan je sa keš "
668
+ "dodacima, ali možda neće raditi sa svim dodacima."
669
+
670
+ #: admin/views/settings-page.php:32
671
+ msgid "Enable Debug mode?"
672
+ msgstr "Aktiviraj režim za otklanjanje grešaka?"
673
+
674
+ #: admin/views/settings-page.php:35
675
+ msgid "Will use uncompressed js"
676
+ msgstr "Koristiće nekompresovan js"
677
+
678
+ #: admin/views/settings-page.php:40
679
+ msgid "Enable safe mode?"
680
+ msgstr "Aktiviraj bezbedni režim?"
681
+
682
+ #: admin/views/settings-page.php:43
683
+ msgid "Will move all popups to top of the screen."
684
+ msgstr "Pomeriće sve iskačuće prozore na vrh ekrana"
685
+
686
+ #: admin/views/settings-page.php:48
687
+ msgid "Remove shortcodes style"
688
+ msgstr "Ukloni shortcode stilove"
689
+
690
+ #: admin/views/settings-page.php:51
691
+ msgid ""
692
+ "By default the plugin will apply some style to shortcodes. Check here if you "
693
+ "want to manually style them"
694
+ msgstr ""
695
+ "Po standardu, plugin će primeniti neki stil na shortcode-ove. Štiklirajte "
696
+ "ovde ako želite da ih manuelno stilizujete "
697
+
698
+ #: admin/views/settings-page.php:56
699
+ msgid "Unload Facebook javascript"
700
+ msgstr "Ne učitavaj Facebook javascript"
701
+
702
+ #: admin/views/settings-page.php:59
703
+ msgid "If you use your own Facebook script, check this"
704
+ msgstr "Štiklirajte ovo ako koristite svoj Facebook script, proverite ovo"
705
+
706
+ #: admin/views/settings-page.php:64
707
+ msgid "Unload Google javascript"
708
+ msgstr "Ne učitavaj Google javascript"
709
+
710
+ #: admin/views/settings-page.php:67
711
+ msgid "If you use your own Google script, check this"
712
+ msgstr "Štiklirajte ovo ako koristite svoj Google script"
713
+
714
+ #: admin/views/settings-page.php:72
715
+ msgid "Unload Twitter javascript"
716
+ msgstr "Ne učitavaj Twitter javascript"
717
+
718
+ #: admin/views/settings-page.php:75
719
+ msgid "If you use your own Twitter script, check this"
720
+ msgstr "Ne učitavaj Twitter javascript"
721
+
722
+ #: admin/views/settings-page.php:80
723
+ msgid "Save settings"
724
+ msgstr "Sačuvaj podešavanja"
725
+
726
+ #: includes/class-spu-helper.php:133
727
+ msgid "All Pages"
728
+ msgstr "Sve stranice"
729
+
730
+ #: includes/class-spu-helper.php:134
731
+ msgid "Front Page"
732
+ msgstr "Prva stranica"
733
+
734
+ #: includes/class-spu-helper.php:135
735
+ msgid "Posts Page"
736
+ msgstr "Postovi na stranici"
737
+
738
+ #: includes/class-spu-helper.php:136
739
+ msgid "Category Page"
740
+ msgstr ""
741
+
742
+ #: includes/class-spu-helper.php:137
743
+ msgid "Archives Page"
744
+ msgstr ""
745
+
746
+ #: includes/class-spu-helper.php:138
747
+ msgid "Top Level Page (parent of 0)"
748
+ msgstr "Stranica vrhunskog nivoa (nadređena 0)"
749
+
750
+ #: includes/class-spu-helper.php:139
751
+ msgid "Parent Page (has children)"
752
+ msgstr "Nadređena stranica (ima podređene)"
753
+
754
+ #: includes/class-spu-helper.php:140
755
+ msgid "Child Page (has parent)"
756
+ msgstr "Podređena stranica (ima nadređene)"
757
+
758
+ #: includes/class-spu-helper.php:148
759
+ msgid "Default Template"
760
+ msgstr "Podređena stranica (ima nadređene)"
761
+
762
+ #: includes/class-spu-helper.php:221
763
+ msgid "Publish"
764
+ msgstr "Podrazumevani šablon"
765
+
766
+ #: includes/class-spu-helper.php:222
767
+ msgid "Pending Review"
768
+ msgstr "Objavi"
769
+
770
+ #: includes/class-spu-helper.php:223
771
+ msgid "Draft"
772
+ msgstr "Skica"
773
+
774
+ #: includes/class-spu-helper.php:224
775
+ msgid "Future"
776
+ msgstr "Buduci"
777
+
778
+ #: includes/class-spu-helper.php:225
779
+ msgid "Private"
780
+ msgstr "Privatni"
781
+
782
+ #: includes/class-spu-helper.php:226
783
+ msgid "Revision"
784
+ msgstr "Revizija"
785
+
786
+ #: includes/class-spu-helper.php:227
787
+ msgid "Trash"
788
+ msgstr "Korpa za otpatke"
789
+
790
+ #: includes/class-spu-helper.php:240
791
+ msgid "Super Admin"
792
+ msgstr "Super Admin"
793
+
794
+ #: includes/class-spu-helper.php:260
795
+ msgid "True"
796
+ msgstr "Super Admin"
797
+
798
+ #~ msgid ""
799
+ #~ "Hide box again when visitors scroll back up? Only works when Trigger "
800
+ #~ "action is set to % of page height"
801
+ #~ msgstr ""
802
+ #~ "Ponovo sakrij okvir kad se posetioci vrate na početak? Radi samo kad je "
803
+ #~ "okidač aktivnosti podešen na &#37; visinu stranice"
804
+
805
+ #~ msgctxt "post type general name"
806
+ #~ msgid "Popups v"
807
+ #~ msgstr "Popups v [opšti naziv vrste posta]"
808
+
809
+ #~ msgid "What's new"
810
+ #~ msgstr "Šta ima novo"
811
+
812
+ #~ msgid "Like Facebook like box but for Twitter"
813
+ #~ msgstr "Kao Facebook taster ‘sviđa mi se’, samo za Twiter"
814
+
815
+ #~ msgid ""
816
+ #~ "Track impressions and Conversions of social likes/follow and forms "
817
+ #~ "submissions like Contact Form 7, Gravity forms, etc"
818
+ #~ msgstr ""
819
+ #~ "Praćenje utisaka, konverzija opcija ‘sviđa mi se’ i ‘prati me’ na "
820
+ #~ "društvenim mrežama, kao i podnošenje obrazaca, kao što je Obrazac "
821
+ #~ "kontakta br 7, obrazaca gravitacije itd."
popups.php CHANGED
@@ -11,7 +11,7 @@
11
  * @socialpopup
12
  * Plugin Name: Popups - WordPress Popup
13
  * Plugin URI: http://www.timersys.com/free-plugins/social-popup/
14
- * Version: 1.9.3.2
15
  * Description: Most complete free Popups plugin, scroll triggered popups, compatible with social networks, Gravity Forms, Ninja Forms, Contact form 7, Mailpoet, Mailchimp for WP, Postmatic, etc
16
  * Author: timersys
17
  * Author URI: https://timersys.com
@@ -30,7 +30,7 @@ if ( ! defined( 'WPINC' ) ) {
30
  * Public-Facing Functionality
31
  *----------------------------------------------------------------------------*/
32
 
33
- define( 'SPU_VERSION' , '1.9.3.2' );
34
  define( 'SPU_PLUGIN_DIR' , plugin_dir_path(__FILE__) );
35
  define( 'SPU_PLUGIN_URL' , plugin_dir_url(__FILE__) );
36
  define( 'SPU_PLUGIN_HOOK' , basename( dirname( __FILE__ ) ) . '/' . basename( __FILE__ ) );
11
  * @socialpopup
12
  * Plugin Name: Popups - WordPress Popup
13
  * Plugin URI: http://www.timersys.com/free-plugins/social-popup/
14
+ * Version: 1.9.3.3
15
  * Description: Most complete free Popups plugin, scroll triggered popups, compatible with social networks, Gravity Forms, Ninja Forms, Contact form 7, Mailpoet, Mailchimp for WP, Postmatic, etc
16
  * Author: timersys
17
  * Author URI: https://timersys.com
30
  * Public-Facing Functionality
31
  *----------------------------------------------------------------------------*/
32
 
33
+ define( 'SPU_VERSION' , '1.9.3.3' );
34
  define( 'SPU_PLUGIN_DIR' , plugin_dir_path(__FILE__) );
35
  define( 'SPU_PLUGIN_URL' , plugin_dir_url(__FILE__) );
36
  define( 'SPU_PLUGIN_HOOK' , basename( dirname( __FILE__ ) ) . '/' . basename( __FILE__ ) );
public/assets/js/public.js CHANGED
@@ -273,7 +273,7 @@ var SPU_master = function() {
273
  tail = button ? button.attr('name')+'='+button.val() : 'button=send',
274
  data = form.serialize()+"&"+tail,
275
  referer = form.find('input[name="_wp_http_referer"]'),
276
- urlref = referer ? spuvar.site_url+referer.val() : window.location.href,
277
  action = form.attr('action') ? form.attr('action') : urlref,
278
  url = form.hasClass('mc4wp-form') ? spuvar.site_url +'/' : action,
279
  error_cb = function (data, error, errorThrown){
273
  tail = button ? button.attr('name')+'='+button.val() : 'button=send',
274
  data = form.serialize()+"&"+tail,
275
  referer = form.find('input[name="_wp_http_referer"]'),
276
+ urlref = referer && referer.val() !== undefined ? spuvar.site_url+referer.val() : window.location.href,
277
  action = form.attr('action') ? form.attr('action') : urlref,
278
  url = form.hasClass('mc4wp-form') ? spuvar.site_url +'/' : action,
279
  error_cb = function (data, error, errorThrown){
public/class-social-popup.php CHANGED
@@ -1,855 +1,855 @@
1
- <?php
2
- /**
3
- * Popups.
4
- *
5
- * @package Popups
6
- * @author Damian Logghe <info@timersys.com>
7
- * @license GPL-2.0+
8
- * @link http://example.com
9
- * @copyright 2014 Your Name or Company Name
10
- */
11
-
12
- /**
13
- * Public Class of the plugin
14
- * @package Popups
15
- * @author Damian Logghe <info@timersys.com>
16
- */
17
- class SocialPopup {
18
-
19
- /**
20
- * Plugin version, used for cache-busting of style and script file references.
21
- *
22
- * @since 1.0.0
23
- *
24
- * @var string
25
- */
26
- const VERSION = SPU_VERSION;
27
-
28
- /**
29
- * Popups to use acrros files
30
- *
31
- * @since 1.7
32
- *
33
- * @var string
34
- */
35
- const PLUGIN_NAME = 'Popups';
36
-
37
- /**
38
- *
39
- * The variable name is used as the text domain when internationalizing strings
40
- * of text. Its value should match the Text Domain file header in the main
41
- * plugin file.
42
- *
43
- * @since 1.0.0
44
- *
45
- * @var string
46
- */
47
- protected $plugin_slug = 'spu';
48
-
49
- /**
50
- * Plugins settings
51
- * @var array
52
- */
53
- protected $spu_settings = array();
54
-
55
- /**
56
- * Instance of this class.
57
- *
58
- * @since 1.0.0
59
- *
60
- * @var object
61
- */
62
- protected static $instance = null;
63
-
64
- /**
65
- * Plugin info accesible everywhere
66
- * @var array
67
- *
68
- * @since 1.0.0
69
- */
70
- public $info;
71
-
72
- /**
73
- * Initialize the plugin by setting localization and loading public scripts
74
- * and styles.
75
- *
76
- * @since 1.0.0
77
- */
78
- private function __construct() {
79
-
80
- // vars
81
- $this->info = array(
82
- 'dir' => SPU_PLUGIN_DIR,
83
- 'url' => SPU_PLUGIN_URL,
84
- 'hook' => SPU_PLUGIN_HOOK,
85
- 'version' => self::VERSION,
86
- 'upgrade_version' => '1.6.4.3',
87
- 'wpml_lang' => defined('ICL_LANGUAGE_CODE') ? ICL_LANGUAGE_CODE : '',
88
- );
89
- // Load plugin text domain
90
- $this->load_plugin_textdomain();
91
-
92
- $this->load_dependencies();
93
-
94
- $this->spu_settings = apply_filters('spu/settings_page/opts', get_option( 'spu_settings' ) );
95
- //Register cpt
96
- add_action( 'init', array( $this, 'register_cpt' ) );
97
-
98
- // Add noindex to cpt
99
- add_action('wp_head', array($this, 'add_no_index') );
100
-
101
- // Activate plugin when new blog is added
102
- add_action( 'wpmu_new_blog', array( $this, 'activate_new_site' ) );
103
-
104
- // Register public-facing style sheet and JavaScript.
105
- add_action( 'wp_enqueue_scripts', array( $this, 'register_scripts' ) );
106
- add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_scripts' ) );
107
-
108
- if( empty($this->spu_settings['ajax_mode'] ) ) {
109
- //print boxes
110
- add_action( 'wp_footer', array( $this, 'print_boxes' ), 1 );
111
- }
112
- add_action( 'init', array( $this, 'register_spu_ajax' ), 11 );
113
-
114
- //FILTERS
115
- add_filter('spu/get_info', array($this, 'get_info'), 1, 1);
116
-
117
- //spu content function
118
- add_filter( 'spu/popup/content', 'wptexturize') ;
119
- add_filter( 'spu/popup/content', 'convert_smilies' );
120
- add_filter( 'spu/popup/content', 'convert_chars' );
121
- add_filter( 'spu/popup/content', 'wpautop' );
122
- add_filter( 'spu/popup/content', 'shortcode_unautop' );
123
- add_filter( 'spu/popup/content', 'do_shortcode', 11 );
124
-
125
- //Register shortcodes
126
- add_shortcode( 'spu-facebook', array( $this, 'facebook_shortcode' ) );
127
- add_shortcode( 'spu-facebook-page', array( $this, 'facebook_page_shortcode' ) );
128
- add_shortcode( 'spu-twitter', array( $this, 'twitter_shortcode' ) );
129
- add_shortcode( 'spu-google', array( $this, 'google_shortcode' ) );
130
- add_shortcode( 'spu-close', array( $this, 'close_shortcode' ) );
131
- add_shortcode( 'spu', array( $this, 'popup_link_shortcode' ) );
132
-
133
- }
134
- /**
135
- * Return the plugin slug.
136
- *
137
- * @since 1.0.0
138
- *
139
- * @return Plugin slug variable.
140
- */
141
- public function get_plugin_slug() {
142
- return $this->plugin_slug;
143
- }
144
-
145
- /**
146
- * Return an instance of this class.
147
- *
148
- * @since 1.0.0
149
- *
150
- * @return object A single instance of this class.
151
- */
152
- public static function get_instance() {
153
-
154
- // If the single instance hasn't been set, set it now.
155
- if ( null == self::$instance ) {
156
- self::$instance = new self;
157
- }
158
-
159
- return self::$instance;
160
- }
161
-
162
- /**
163
- * Fired when the plugin is activated.
164
- *
165
- * @since 1.0.0
166
- *
167
- * @param boolean $network_wide True if WPMU superadmin uses
168
- * "Network Activate" action, false if
169
- * WPMU is disabled or plugin is
170
- * activated on an individual blog.
171
- */
172
- public static function activate( $network_wide ) {
173
-
174
- if ( function_exists( 'is_multisite' ) && is_multisite() ) {
175
-
176
- if ( $network_wide ) {
177
-
178
- // Get all blog ids
179
- $blog_ids = self::get_blog_ids();
180
-
181
- foreach ( $blog_ids as $blog_id ) {
182
-
183
- switch_to_blog( $blog_id );
184
- self::single_activate();
185
- }
186
-
187
- restore_current_blog();
188
-
189
- } else {
190
- self::single_activate();
191
- }
192
-
193
- } else {
194
- self::single_activate();
195
- }
196
- }
197
-
198
- /**
199
- * Fired when the plugin is deactivated.
200
- *
201
- * @since 1.0.0
202
- *
203
- * @param boolean $network_wide True if WPMU superadmin uses
204
- * "Network Deactivate" action, false if
205
- * WPMU is disabled or plugin is
206
- * deactivated on an individual blog.
207
- */
208
- public static function deactivate( $network_wide ) {
209
-
210
- if ( function_exists( 'is_multisite' ) && is_multisite() ) {
211
-
212
- if ( $network_wide ) {
213
-
214
- // Get all blog ids
215
- $blog_ids = self::get_blog_ids();
216
-
217
- foreach ( $blog_ids as $blog_id ) {
218
-
219
- switch_to_blog( $blog_id );
220
- self::single_deactivate();
221
-
222
- }
223
-
224
- restore_current_blog();
225
-
226
- } else {
227
- self::single_deactivate();
228
- }
229
-
230
- } else {
231
- self::single_deactivate();
232
- }
233
-
234
- }
235
-
236
- /**
237
- * Fired when a new site is activated with a WPMU environment.
238
- *
239
- * @since 1.0.0
240
- *
241
- * @param int $blog_id ID of the new blog.
242
- */
243
- public function activate_new_site( $blog_id ) {
244
-
245
- if ( 1 !== did_action( 'wpmu_new_blog' ) ) {
246
- return;
247
- }
248
-
249
- switch_to_blog( $blog_id );
250
- self::single_activate();
251
- restore_current_blog();
252
-
253
- }
254
-
255
- /**
256
- * Register custom post types
257
- * @return void
258
- */
259
- function register_cpt() {
260
-
261
- $name = 'Popups v' . SocialPopup::VERSION;
262
- if( class_exists('PopupsP') ){
263
- $name .= ' - Premium v'. PopupsP::VERSION;
264
- }
265
- $name = apply_filters( 'spu/display/title', $name );
266
- $labels = array(
267
- 'name' => $name,
268
- 'singular_name' => _x( 'Popups', 'post type singular name', 'popups' ),
269
- 'menu_name' => _x( 'Popups', 'admin menu', 'popups' ),
270
- 'name_admin_bar' => _x( 'Popups', 'add new on admin bar', 'popups' ),
271
- 'add_new' => _x( 'Add New', 'Popups', 'popups' ),
272
- 'add_new_item' => __( 'Add New Popups', 'popups' ),
273
- 'new_item' => __( 'New Popups', 'popups' ),
274
- 'edit_item' => __( 'Edit Popups', 'popups' ),
275
- 'view_item' => __( 'View Popups', 'popups' ),
276
- 'all_items' => __( 'All Popups', 'popups' ),
277
- 'search_items' => __( 'Search Popups', 'popups' ),
278
- 'parent_item_colon' => __( 'Parent Popups:', 'popups' ),
279
- 'not_found' => __( 'No Popups found.', 'popups' ),
280
- 'not_found_in_trash' => __( 'No Popups found in Trash.', 'popups' )
281
- );
282
-
283
- $args = array(
284
- 'labels' => $labels,
285
- 'public' => true,
286
- 'publicly_queryable' => true,
287
- 'show_ui' => true,
288
- 'show_in_menu' => true,
289
- 'query_var' => true,
290
- 'rewrite' => array( 'slug' => 'spucpt' ),
291
- 'capability_type' => 'post',
292
- 'capabilities' => array(
293
- 'publish_posts' => apply_filters( 'spu/settings_page/roles', 'manage_options'),
294
- 'edit_posts' => apply_filters( 'spu/settings_page/roles', 'manage_options'),
295
- 'edit_others_posts' => apply_filters( 'spu/settings_page/roles', 'manage_options'),
296
- 'delete_posts' => apply_filters( 'spu/settings_page/roles', 'manage_options'),
297
- 'delete_others_posts' => apply_filters( 'spu/settings_page/roles', 'manage_options'),
298
- 'read_private_posts' => apply_filters( 'spu/settings_page/roles', 'manage_options'),
299
- 'edit_post' => apply_filters( 'spu/settings_page/roles', 'manage_options'),
300
- 'delete_post' => apply_filters( 'spu/settings_page/roles', 'manage_options'),
301
- 'read_post' => apply_filters( 'spu/settings_page/roles', 'manage_options'),
302
- ),
303
- 'has_archive' => true,
304
- 'hierarchical' => false,
305
- 'menu_position' => null,
306
- 'menu_icon' => 'dashicons-share-alt',
307
- 'supports' => array( 'title', 'editor','author' )
308
- );
309
-
310
- register_post_type( 'spucpt', $args );
311
-
312
- }
313
-
314
-
315
- function add_no_index() {
316
- global $post;
317
-
318
- if( get_post_type() == 'spucpt' && is_single() )
319
- echo '<meta name="robots" content="noindex, nofollow" />';
320
- }
321
-
322
- /**
323
- * Get all blog ids of blogs in the current network that are:
324
- * - not archived
325
- * - not spam
326
- * - not deleted
327
- *
328
- * @since 1.0.0
329
- *
330
- * @return array|false The blog ids, false if no matches.
331
- */
332
- private static function get_blog_ids() {
333
-
334
- global $wpdb;
335
-
336
- // get an array of blog ids
337
- $sql = "SELECT blog_id FROM $wpdb->blogs
338
- WHERE archived = '0' AND spam = '0'
339
- AND deleted = '0'";
340
-
341
- return $wpdb->get_col( $sql );
342
-
343
- }
344
-
345
- /**
346
- * Fired for each blog when the plugin is activated.
347
- *
348
- * @since 1.0.0
349
- */
350
- private static function single_activate() {
351
- // If there are not popups created let's create a default one
352
- global $wpdb;
353
-
354
- $spus = $wpdb->get_results( "SELECT ID FROM $wpdb->posts WHERE post_type='spucpt'");
355
-
356
-
357
- if ( empty( $spus) ) {
358
- $post_content ='<h2 style="text-align:center">Welcome!</h2><p style="text-align:center">This is popup preview that you can fill with any content you want.</p><p style="text-align:center">The plugin include some shortcodes, you can read more about them at the bottom of this page. The main 3 sections to configure the popup are:</p><p>Appearance: Where you edit the look and feel of the popup.<br>Display Rules: Here you choose on which page to display the popup (Set to all by default)<br>Display options: Some important settings about the plugin, being the more important trigger action.</br></p>';
359
- $defaults = array(
360
- 'post_status' => 'draft',
361
- 'post_type' => 'spucpt',
362
- 'post_content' => $post_content,
363
- 'post_title' => 'Popups Example'
364
- );
365
- wp_insert_post( $defaults, $wp_error );
366
- }
367
-
368
- $upgrader = new SocialPopup_Upgrader();
369
- $upgrader->upgrade_plugin();
370
-
371
- update_option('spu-version', SPU_VERSION);
372
-
373
- do_action( 'spu/activate' );
374
-
375
- }
376
-
377
- /**
378
- * Fired for each blog when the plugin is deactivated.
379
- *
380
- * @since 1.0.0
381
- */
382
- private static function single_deactivate() {
383
- // @TODO: Define deactivation functionality here
384
- }
385
-
386
- /**
387
- * Load the plugin text domain for translation.
388
- *
389
- * @since 1.0.0
390
- */
391
- public function load_plugin_textdomain() {
392
-
393
- $domain = 'popups';
394
- $locale = apply_filters( 'plugin_locale', get_locale(), $domain );
395
-
396
- load_textdomain( $domain, trailingslashit( WP_LANG_DIR ) . $domain . '/' . $domain . '-' . $locale . '.mo' );
397
- load_plugin_textdomain( $domain, FALSE, dirname( dirname( plugin_basename( __FILE__ ) ) ) . '/languages/' );
398
-
399
- }
400
-
401
-
402
-
403
- /**
404
- * Register and enqueues public-facing JavaScript files.
405
- *
406
- * @since 1.0.0
407
- */
408
- public function register_scripts() {
409
-
410
- $js_url = plugins_url( 'assets/js/public.js', __FILE__ );
411
- $handle = 'spu-public';
412
-
413
- $opts = $this->spu_settings;
414
-
415
- wp_register_style( 'spu-public-css', plugins_url( 'assets/css/public.css', __FILE__ ), array(), self::VERSION );
416
-
417
- wp_register_script( $handle, $js_url, array( 'jquery' ), self::VERSION, true );
418
-
419
- wp_register_script( 'spu-facebook', '//connect.facebook.net/'.get_locale().'/sdk.js#xfbml=1&version=v2.3', array('jquery'), null, FALSE);
420
-
421
- wp_register_script( 'spu-twitter', '//platform.twitter.com/widgets.js', array('jquery'), self::VERSION, FALSE);
422
-
423
- wp_register_script( 'spu-google', '//apis.google.com/js/platform.js', array('jquery'), self::VERSION, FALSE);
424
-
425
- }
426
-
427
- /**
428
- * load and print SPU popup when rules matches
429
- *
430
- * @since 1.0.0
431
- */
432
- public function check_for_matches() {
433
-
434
- $spu_matches = false;
435
-
436
- $spu_rules = new Spu_Rules();
437
-
438
- //Grab all popups ids
439
- $spu_ids = $this->get_spu_ids();
440
-
441
- if( !empty($spu_ids) ) {
442
- foreach ( $spu_ids as $spu ) {
443
- $rules = !empty($spu->spu_rules) ? unserialize($spu->spu_rules) : array();
444
- $match = $spu_rules->check_rules( $rules );
445
- if ( $match ) {
446
- $spu_matches[$spu->ID] = $spu->ID;
447
- }
448
- }
449
- // check if we are viewing a popup, and only show that one (preview mode)
450
- $viewing_id = defined('DOING_AJAX') && isset($_REQUEST['pid']) ? $_REQUEST['pid'] : get_queried_object_id();
451
- foreach ( $spu_ids as $spu ) {
452
- if ( $spu->ID == $viewing_id ) {
453
- $spu_matches = array();
454
- $spu_matches[$spu->ID] = $spu->ID;
455
- }
456
- }
457
- }
458
- return apply_filters( 'spu/check_for_matches', $spu_matches, $spu_ids, $spu_rules );
459
- }
460
-
461
- /**
462
- * Return array of popups ids
463
- */
464
- function get_spu_ids() {
465
- global $wpdb;
466
- // IF wpml is active and spucpt is translated get correct ids for language
467
- if( function_exists('icl_object_id') ) {
468
- $spu_ids = $this->get_wpml_ids();
469
- if(!empty($spu_ids)) {
470
- return $spu_ids;
471
- }
472
- }
473
- // IF polylang is active and spucpt is translated get correct ids for language
474
- if( function_exists('pll_current_language') ) {
475
- $spu_ids = $this->get_polylang_ids();
476
- if(!empty($spu_ids)) {
477
- return $spu_ids;
478
- }
479
- }
480
- $post_status = isset( $_REQUEST['is_preview'] ) && $_REQUEST['is_preview'] == '1' ? "AND (post_status='publish' OR post_status='draft')" : "AND post_status='publish'";
481
- return $wpdb->get_results( "SELECT ID, post_content, MAX(CASE WHEN pm1.meta_key = 'spu_rules' then pm1.meta_value ELSE NULL END) as spu_rules,
482
- MAX(CASE WHEN pm1.meta_key = 'spu_ab_parent' then pm1.meta_value ELSE NULL END) as spu_ab_parent
483
- FROM $wpdb->posts p LEFT JOIN $wpdb->postmeta pm1 ON ( pm1.post_id = p.ID) WHERE post_type='spucpt' {$post_status} GROUP BY p.ID");
484
- }
485
-
486
- /**
487
- * Function that enqueue all needed scritps and styles
488
- * @since 1.3
489
- */
490
- public function enqueue_scripts() {
491
- $handle = 'spu-public';
492
-
493
- $opts = $this->spu_settings;
494
-
495
- wp_enqueue_script($handle);
496
- wp_enqueue_style('spu-public-css');
497
- wp_localize_script( $handle, 'spuvar',
498
- array(
499
- 'is_admin' => current_user_can( apply_filters( 'spu/capabilities/testmode', 'administrator' ) ),
500
- 'disable_style' => isset( $this->spu_settings['shortcodes_style'] ) ? esc_attr( $this->spu_settings['shortcodes_style'] ) : '',
501
- 'ajax_mode' => isset( $this->spu_settings['ajax_mode'] ) ? esc_attr( $this->spu_settings['ajax_mode'] ) :'',
502
- 'ajax_url' => admin_url('admin-ajax.php'),
503
- 'ajax_mode_url' => site_url('/?spu_action=spu_load&lang='.$this->info['wpml_lang']),
504
- 'pid' => get_queried_object_id(),
505
- 'is_front_page' => is_front_page(),
506
- 'is_category' => is_category(),
507
- 'site_url' => site_url(),
508
- 'is_archive' => is_archive(),
509
- 'is_search' => is_search(),
510
- 'is_preview' => (get_post_type() == 'spucpt'),
511
- 'seconds_confirmation_close' => apply_filters( 'spu/spuvar/seconds_confirmation_close', 5 ),
512
- )
513
- );
514
- $this->enqueue_social_shortcodes();
515
- }
516
-
517
- /**
518
- * Function that runs the different checks to see if social is enqueue or not
519
- * @since 1.3
520
- */
521
- private function enqueue_social_shortcodes(){
522
- global $wpdb,$spuvar_social;
523
-
524
- $opts = $this->spu_settings;
525
- $spuvar_social = array();
526
-
527
- $handle = 'spu-public';
528
-
529
- // Check if any popup have facebook, then enqueue js
530
- if( $fb = $wpdb->get_var( "SELECT meta_value FROM $wpdb->postmeta WHERE meta_key = 'spu_fb' " ) ) {
531
- // Check if defined or remove js in options
532
- if( !defined( 'SPU_UNLOAD_FB_JS') && empty( $opts['facebook'] ) )
533
- wp_enqueue_script( 'spu-facebook');
534
-
535
- $spuvar_social['facebook'] = true;
536
-
537
- }
538
-
539
- if( $fb = $wpdb->get_var( "SELECT meta_value FROM $wpdb->postmeta WHERE meta_key ='spu_tw' " ) ) {
540
- if( ! defined( 'SPU_UNLOAD_TW_JS') && empty( $opts['twitter'] ) )
541
- wp_enqueue_script( 'spu-twitter');
542
-
543
- $spuvar_social['twitter'] = true;
544
-
545
- }
546
-
547
- if( $fb = $wpdb->get_var( "SELECT meta_value FROM $wpdb->postmeta WHERE meta_key ='spu_google' " ) ) {
548
- if( ! defined( 'SPU_UNLOAD_GO_JS') && empty( $opts['google'] ) )
549
- wp_enqueue_script( 'spu-google');
550
-
551
- $spuvar_social['google'] = true;
552
- }
553
- wp_localize_script( $handle, 'spuvar_social', $spuvar_social);
554
-
555
-
556
- //also include gravity forms if needed
557
- if( $gf = $wpdb->get_var( "SELECT meta_value FROM $wpdb->postmeta WHERE meta_key ='spu_gravity' " ) ) {
558
- if( function_exists('gravity_form_enqueue_scripts'))
559
- gravity_form_enqueue_scripts($gf, true);
560
- }
561
- }
562
-
563
- /**
564
- * [facebook_shortcode description]
565
- *
566
- * @param $atts
567
- * @param $content
568
- *
569
- * @internal param $ $content [description] $content [description]
570
- * @internal param $atts [description] $atts [description]
571
- * @return string [description]
572
- */
573
- function facebook_shortcode( $atts, $content ) {
574
-
575
- extract( shortcode_atts( array(
576
- 'href' => apply_filters( 'spu/social/fb_href', 'https://www.facebook.com/pages/Timersys/146687622031640' ),
577
- 'layout' => 'button_count', // standard, box_count, button_count, button
578
- 'show_faces' => 'false', // true
579
- 'share' => 'false', // true
580
- 'action' => 'like', // recommend
581
- 'width' => '',
582
- ), $atts ) );
583
-
584
- $layout = strtolower( trim( $layout ) );
585
- $action = strtolower( trim( $action ) );
586
-
587
- // to avoid problems
588
- if( 'standard' != $layout && 'box_count' != $layout && 'button_count' != $layout && 'button' != $layout ) {
589
- $layout = 'button_count';
590
- }
591
- if( 'like' != $action && 'recommend' != $action ) {
592
- $action = 'like';
593
- }
594
-
595
- return '<div class="spu-facebook spu-shortcode"><div class="fb-like" data-width="'.strtolower( trim( $width ) ).'" data-href="'. $href .'" data-layout="'.$layout.'" data-action="'.$action.'" data-show-faces="'.strtolower( trim( $show_faces ) ).'" data-share="'.strtolower( trim( $share ) ).'"></div></div>';
596
-
597
- }
598
-
599
- /**
600
- * Shortcode for facebook page
601
- *
602
- * @param $atts
603
- * @param $content
604
- *
605
- * @internal param $ $content [description] $content [description]
606
- * @internal param $atts [description] $atts [description]
607
- * @return string [description]
608
- */
609
- function facebook_page_shortcode( $atts, $content ) {
610
-
611
- extract( shortcode_atts( array(
612
- 'href' => apply_filters( 'spu/social/fb_href', 'https://www.facebook.com/pages/Timersys/146687622031640' ),
613
- 'name' => apply_filters( 'spu/social/fb_name', 'Timersys' ),
614
- 'show_faces' => 'true', // false
615
- 'hide_cover' => 'false', // true
616
- 'width' => '500',
617
- ), $atts ) );
618
-
619
- return '<div class="spu-facebook-page"><div class="fb-page" data-href="'. $href .'" data-width="'.strtolower( trim( $width ) ).'" data-hide-cover="'.strtolower( trim( $hide_cover ) ).'" data-show-facepile="'.strtolower( trim( $show_faces ) ).'" data-show-posts="false"><div class="fb-xfbml-parse-ignore"><blockquote cite="'. $href .'"><a href="'. $href .'">'.esc_attr( $name ).'</a></blockquote></div></div></div>';
620
-
621
- }
622
-
623
- /**
624
- * [twitter_shortcode description]
625
- * @param string $content [description]
626
- * @param array $atts [description]
627
- * @return string [description]
628
- */
629
- function twitter_shortcode( $atts, $content ) {
630
-
631
- extract( shortcode_atts( array(
632
- 'user' => apply_filters( 'spu/social/tw_user', 'chifliiiii' ),
633
- 'show_count' => 'true', // false
634
- 'size' => '', // large
635
- 'lang' => '',
636
- ), $atts ) );
637
-
638
- return '<div class="spu-twitter spu-shortcode"><a href="https://twitter.com/'.$user.'" class="twitter-follow-button" data-show-count="'.strtolower( trim( $show_count ) ).'" data-size="'.strtolower( trim( $size ) ).'" data-lang="'.$lang.'"></a></div>';
639
-
640
- }
641
-
642
- /**
643
- * [google_shortcode description]
644
- * @param [type] $atts [description]
645
- * @param [type] $content [description]
646
- * @return string [description]
647
- */
648
- function google_shortcode( $atts, $content ) {
649
- extract( shortcode_atts( array(
650
- 'type' => 'g-plusone', //small standard tall
651
- 'size' => 'medium', //small standard tall
652
- 'annotation' => 'bubble', //inline none
653
- 'url' => apply_filters( 'spu/social/gp_url', 'https://plus.google.com/u/0/103508783120806246698/posts' ),
654
- ), $atts ) );
655
-
656
- $size = strtolower( trim( $size ) );
657
- $annotation = strtolower( trim( $annotation ) );
658
-
659
- //to avoid problems
660
- if( 'medium' != $size && 'small' != $size && 'standard' != $size && 'tall' != $size ) {
661
- $size = 'medium';
662
- }
663
- if( 'bubble' != $annotation && 'inline' != $annotation && 'none' != $annotation ) {
664
- $annotation = 'bubble';
665
- }
666
- if( 'g-plusone' != $type && 'g-follow' != $type ) {
667
- $type = 'g-plusone';
668
- }
669
-
670
- return '<div class="spu-google spu-shortcode"><div class="'.$type.'" data-callback="googleCB" data-onendinteraction="closeGoogle" data-recommendations="false" data-annotation="'.$annotation.'" data-size="'.$size.'" data-href="'.$url.'"></div></div>';
671
-
672
- }
673
-
674
- function close_shortcode( $atts, $content ) {
675
- extract( shortcode_atts( array(
676
- 'class' => 'button-primary btn-primary',
677
- 'text' => 'Close',
678
- 'conversion' => false
679
- ), $atts ) );
680
- $button_class = ! $conversion || $conversion == 'false' ? 'spu-close-popup ' : 'spu-close-convert ';
681
-
682
- return '<button class="'.$button_class.$class.'">'.$text.'</button>';
683
- }
684
-
685
- /**
686
- * Returns plugin info
687
- * @param string $i info name
688
- * @return mixed one all or none
689
- */
690
- function get_info( $i )
691
- {
692
- // vars
693
- $return = false;
694
-
695
-
696
- // specific
697
- if( isset($this->info[ $i ]) )
698
- {
699
- $return = $this->info[ $i ];
700
- }
701
-
702
-
703
- // all
704
- if( $i == 'all' )
705
- {
706
- $return = $this->info;
707
- }
708
-
709
-
710
- // return
711
- return $return;
712
- }
713
-
714
- /**
715
- * Print the actual popup
716
- * @return mixed echo popup html
717
- */
718
- function print_boxes( ) {
719
-
720
- do_action('spu/print_boxes');
721
-
722
- $spu_matches = $this->check_for_matches();
723
-
724
- //if we have matches continue
725
- if( ! empty( $spu_matches) ) {
726
-
727
- foreach ($spu_matches as $spu_id ) {
728
-
729
- include( 'views/popup.php');
730
-
731
- } //endforeach
732
- echo '<div id="fb-root" class=" fb_reset"></div>';
733
-
734
- }
735
-
736
- }
737
-
738
- /**
739
- * Return plugin settings
740
- * @return array
741
- * @since 1.1
742
- */
743
- function get_settings() {
744
-
745
- return $this->spu_settings;
746
-
747
- }
748
-
749
- /**
750
- * Load necessary files
751
- * @since 1.2.3
752
- */
753
- private function load_dependencies(){
754
- // Include Helper class
755
- require_once( SPU_PLUGIN_DIR . 'includes/class-spu-helper.php' );
756
- // Include Rules Class
757
- require_once( SPU_PLUGIN_DIR . 'public/includes/class-spu-rules.php' );
758
- }
759
-
760
- /**
761
- * Custom ajax hook. Wp_ajax won't let us do_shortcode for example
762
- * @return mixed Prints all spus
763
- */
764
- function register_spu_ajax() {
765
-
766
- if ( empty( $_REQUEST['spu_action'] ) || $_REQUEST['spu_action'] != 'spu_load' )
767
- return;
768
-
769
- define( 'DOING_AJAX', TRUE );
770
-
771
- $this->print_boxes();
772
-
773
- die();
774
- }
775
-
776
-
777
- /**
778
- * Return popups for current language
779
- * @return bool | array of ids
780
- */
781
- protected function get_polylang_ids( ) {
782
- global $wpdb;
783
- $post_status = isset( $_REQUEST['is_preview'] ) && $_REQUEST['is_preview'] == '1' ? "AND (post_status='publish' OR post_status='draft')" : "AND post_status='publish'";
784
-
785
- $sql = "SELECT description
786
- FROM $wpdb->posts p
787
- LEFT JOIN $wpdb->term_relationships as tr ON p.ID = tr.object_id
788
- LEFT JOIN $wpdb->term_taxonomy as tt ON tt.term_taxonomy_id = tr.term_taxonomy_id
789
- WHERE post_type='spucpt' {$post_status} AND tt.taxonomy = 'post_translations'
790
- GROUP BY p.ID";
791
-
792
- $ids = array();
793
- $popups = $wpdb->get_results( $sql );
794
- if( !empty($popups) ) {
795
- $current = pll_current_language();
796
- foreach ($popups as $p) {
797
- $langs = unserialize($p->description);
798
-
799
- if( isset($langs[$current]) )
800
- $ids[] = $langs[$current];
801
- }
802
- }
803
-
804
- if( !empty($ids)){
805
- $sql = "SELECT DISTINCT ID, post_content,
806
- MAX(CASE WHEN pm1.meta_key = 'spu_rules' then pm1.meta_value ELSE NULL END) as spu_rules,
807
- MAX(CASE WHEN pm1.meta_key = 'spu_ab_parent' then pm1.meta_value ELSE NULL END) as spu_ab_parent
808
- FROM $wpdb->posts p
809
- LEFT JOIN $wpdb->postmeta pm1 ON ( pm1.post_id = p.ID)
810
- WHERE post_type='spucpt' {$post_status} AND ID IN (".implode(',',array_unique($ids)).")
811
- GROUP BY p.ID";
812
- return $wpdb->get_results( $sql );
813
- }
814
-
815
- return false;
816
- }
817
- /**
818
- * Return popups for current language
819
- * @return bool | array of ids
820
- */
821
- protected function get_wpml_ids( ) {
822
- global $wpdb;
823
- $wpml_settings = get_option( 'icl_sitepress_settings', true);
824
-
825
- if ( ! empty( $wpml_settings['custom_posts_sync_option']['spucpt'] ) ) {
826
- $post_status = isset( $_REQUEST['is_preview'] ) && $_REQUEST['is_preview'] == '1' ? "AND (post_status='publish' OR post_status='draft')" : "AND post_status='publish'";
827
- $lang_code = isset( $_GET['lang'] ) ? $_GET['lang'] : ICL_LANGUAGE_CODE;
828
- $sql = "SELECT DISTINCT ID, post_content,
829
- MAX(CASE WHEN pm1.meta_key = 'spu_rules' then pm1.meta_value ELSE NULL END) as spu_rules,
830
- MAX(CASE WHEN pm1.meta_key = 'spu_ab_parent' then pm1.meta_value ELSE NULL END) as spu_ab_parent
831
- FROM $wpdb->posts p
832
- LEFT JOIN $wpdb->postmeta pm1 ON ( pm1.post_id = p.ID)
833
- LEFT JOIN {$wpdb->prefix}icl_translations as b ON p.ID = b.element_id
834
- WHERE post_type='spucpt' {$post_status} AND b.language_code = '" . esc_sql( $lang_code ) . "'
835
- GROUP BY p.ID";
836
-
837
- $ids = $wpdb->get_results( $sql );
838
- if( !empty($ids) )
839
- return $ids;
840
- }
841
-
842
- return false;
843
- }
844
-
845
- /**
846
- * Popup button
847
- * @param [type] $atts [description]
848
- * @param [type] $content [description]
849
- * @return [type] [description]
850
- */
851
- public function popup_link_shortcode($atts, $content ) {
852
- return '<a href="#" class="spu-open-'.$atts['popup'].'">'.do_shortcode( $content ).'</a>';
853
- }
854
-
855
- }
1
+ <?php
2
+ /**
3
+ * Popups.
4
+ *
5
+ * @package Popups
6
+ * @author Damian Logghe <info@timersys.com>
7
+ * @license GPL-2.0+
8
+ * @link http://example.com
9
+ * @copyright 2014 Your Name or Company Name
10
+ */
11
+
12
+ /**
13
+ * Public Class of the plugin
14
+ * @package Popups
15
+ * @author Damian Logghe <info@timersys.com>
16
+ */
17
+ class SocialPopup {
18
+
19
+ /**
20
+ * Plugin version, used for cache-busting of style and script file references.
21
+ *
22
+ * @since 1.0.0
23
+ *
24
+ * @var string
25
+ */
26
+ const VERSION = SPU_VERSION;
27
+
28
+ /**
29
+ * Popups to use acrros files
30
+ *
31
+ * @since 1.7
32
+ *
33
+ * @var string
34
+ */
35
+ const PLUGIN_NAME = 'Popups';
36
+
37
+ /**
38
+ *
39
+ * The variable name is used as the text domain when internationalizing strings
40
+ * of text. Its value should match the Text Domain file header in the main
41
+ * plugin file.
42
+ *
43
+ * @since 1.0.0
44
+ *
45
+ * @var string
46
+ */
47
+ protected $plugin_slug = 'spu';
48
+
49
+ /**
50
+ * Plugins settings
51
+ * @var array
52
+ */
53
+ protected $spu_settings = array();
54
+
55
+ /**
56
+ * Instance of this class.
57
+ *
58
+ * @since 1.0.0
59
+ *
60
+ * @var object
61
+ */
62
+ protected static $instance = null;
63
+
64
+ /**
65
+ * Plugin info accesible everywhere
66
+ * @var array
67
+ *
68
+ * @since 1.0.0
69
+ */
70
+ public $info;
71
+
72
+ /**
73
+ * Initialize the plugin by setting localization and loading public scripts
74
+ * and styles.
75
+ *
76
+ * @since 1.0.0
77
+ */
78
+ private function __construct() {
79
+
80
+ // vars
81
+ $this->info = array(
82
+ 'dir' => SPU_PLUGIN_DIR,
83
+ 'url' => SPU_PLUGIN_URL,
84
+ 'hook' => SPU_PLUGIN_HOOK,
85
+ 'version' => self::VERSION,
86
+ 'upgrade_version' => '1.6.4.3',
87
+ 'wpml_lang' => defined('ICL_LANGUAGE_CODE') ? ICL_LANGUAGE_CODE : '',
88
+ );
89
+ // Load plugin text domain
90
+ $this->load_plugin_textdomain();
91
+
92
+ $this->load_dependencies();
93
+
94
+ $this->spu_settings = apply_filters('spu/settings_page/opts', get_option( 'spu_settings' ) );
95
+ //Register cpt
96
+ add_action( 'init', array( $this, 'register_cpt' ) );
97
+
98
+ // Add noindex to cpt
99
+ add_action('wp_head', array($this, 'add_no_index') );
100
+
101
+ // Activate plugin when new blog is added
102
+ add_action( 'wpmu_new_blog', array( $this, 'activate_new_site' ) );
103
+
104
+ // Register public-facing style sheet and JavaScript.
105
+ add_action( 'wp_enqueue_scripts', array( $this, 'register_scripts' ) );
106
+ add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_scripts' ) );
107
+
108
+ if( empty($this->spu_settings['ajax_mode'] ) ) {
109
+ //print boxes
110
+ add_action( 'wp_footer', array( $this, 'print_boxes' ), 1 );
111
+ }
112
+ add_action( 'init', array( $this, 'register_spu_ajax' ), 11 );
113
+
114
+ //FILTERS
115
+ add_filter('spu/get_info', array($this, 'get_info'), 1, 1);
116
+
117
+ //spu content function
118
+ add_filter( 'spu/popup/content', 'wptexturize') ;
119
+ add_filter( 'spu/popup/content', 'convert_smilies' );
120
+ add_filter( 'spu/popup/content', 'convert_chars' );
121
+ add_filter( 'spu/popup/content', 'wpautop' );
122
+ add_filter( 'spu/popup/content', 'shortcode_unautop' );
123
+ add_filter( 'spu/popup/content', 'do_shortcode', 11 );
124
+
125
+ //Register shortcodes
126
+ add_shortcode( 'spu-facebook', array( $this, 'facebook_shortcode' ) );
127
+ add_shortcode( 'spu-facebook-page', array( $this, 'facebook_page_shortcode' ) );
128
+ add_shortcode( 'spu-twitter', array( $this, 'twitter_shortcode' ) );
129
+ add_shortcode( 'spu-google', array( $this, 'google_shortcode' ) );
130
+ add_shortcode( 'spu-close', array( $this, 'close_shortcode' ) );
131
+ add_shortcode( 'spu', array( $this, 'popup_link_shortcode' ) );
132
+
133
+ }
134
+ /**
135
+ * Return the plugin slug.
136
+ *
137
+ * @since 1.0.0
138
+ *
139
+ * @return Plugin slug variable.
140
+ */
141
+ public function get_plugin_slug() {
142
+ return $this->plugin_slug;
143
+ }
144
+
145
+ /**
146
+ * Return an instance of this class.
147
+ *
148
+ * @since 1.0.0
149
+ *
150
+ * @return object A single instance of this class.
151
+ */
152
+ public static function get_instance() {
153
+
154
+ // If the single instance hasn't been set, set it now.
155
+ if ( null == self::$instance ) {
156
+ self::$instance = new self;
157
+ }
158
+
159
+ return self::$instance;
160
+ }
161
+
162
+ /**
163
+ * Fired when the plugin is activated.
164
+ *
165
+ * @since 1.0.0
166
+ *
167
+ * @param boolean $network_wide True if WPMU superadmin uses
168
+ * "Network Activate" action, false if
169
+ * WPMU is disabled or plugin is
170
+ * activated on an individual blog.
171
+ */
172
+ public static function activate( $network_wide ) {
173
+
174
+ if ( function_exists( 'is_multisite' ) && is_multisite() ) {
175
+
176
+ if ( $network_wide ) {
177
+
178
+ // Get all blog ids
179
+ $blog_ids = self::get_blog_ids();
180
+
181
+ foreach ( $blog_ids as $blog_id ) {
182
+
183
+ switch_to_blog( $blog_id );
184
+ self::single_activate();
185
+ }
186
+
187
+ restore_current_blog();
188
+
189
+ } else {
190
+ self::single_activate();
191
+ }
192
+
193
+ } else {
194
+ self::single_activate();
195
+ }
196
+ }
197
+
198
+ /**
199
+ * Fired when the plugin is deactivated.
200
+ *
201
+ * @since 1.0.0
202
+ *
203
+ * @param boolean $network_wide True if WPMU superadmin uses
204
+ * "Network Deactivate" action, false if
205
+ * WPMU is disabled or plugin is
206
+ * deactivated on an individual blog.
207
+ */
208
+ public static function deactivate( $network_wide ) {
209
+
210
+ if ( function_exists( 'is_multisite' ) && is_multisite() ) {
211
+
212
+ if ( $network_wide ) {
213
+
214
+ // Get all blog ids
215
+ $blog_ids = self::get_blog_ids();
216
+
217
+ foreach ( $blog_ids as $blog_id ) {
218
+
219
+ switch_to_blog( $blog_id );
220
+ self::single_deactivate();
221
+
222
+ }
223
+
224
+ restore_current_blog();
225
+
226
+ } else {
227
+ self::single_deactivate();
228
+ }
229
+
230
+ } else {
231
+ self::single_deactivate();
232
+ }
233
+
234
+ }
235
+
236
+ /**
237
+ * Fired when a new site is activated with a WPMU environment.
238
+ *
239
+ * @since 1.0.0
240
+ *
241
+ * @param int $blog_id ID of the new blog.
242
+ */
243
+ public function activate_new_site( $blog_id ) {
244
+
245
+ if ( 1 !== did_action( 'wpmu_new_blog' ) ) {
246
+ return;
247
+ }
248
+
249
+ switch_to_blog( $blog_id );
250
+ self::single_activate();
251
+ restore_current_blog();
252
+
253
+ }
254
+
255
+ /**
256
+ * Register custom post types
257
+ * @return void
258
+ */
259
+ function register_cpt() {
260
+
261
+ $name = 'Popups v' . SocialPopup::VERSION;
262
+ if( class_exists('PopupsP') ){
263
+ $name .= ' - Premium v'. PopupsP::VERSION;
264
+ }
265
+ $name = apply_filters( 'spu/display/title', $name );
266
+ $labels = array(
267
+ 'name' => $name,
268
+ 'singular_name' => _x( 'Popups', 'post type singular name', 'popups' ),
269
+ 'menu_name' => _x( 'Popups', 'admin menu', 'popups' ),
270
+ 'name_admin_bar' => _x( 'Popups', 'add new on admin bar', 'popups' ),
271
+ 'add_new' => _x( 'Add New', 'Popups', 'popups' ),
272
+ 'add_new_item' => __( 'Add New Popups', 'popups' ),
273
+ 'new_item' => __( 'New Popups', 'popups' ),
274
+ 'edit_item' => __( 'Edit Popups', 'popups' ),
275
+ 'view_item' => __( 'View Popups', 'popups' ),
276
+ 'all_items' => __( 'All Popups', 'popups' ),
277
+ 'search_items' => __( 'Search Popups', 'popups' ),
278
+ 'parent_item_colon' => __( 'Parent Popups:', 'popups' ),
279
+ 'not_found' => __( 'No Popups found.', 'popups' ),
280
+ 'not_found_in_trash' => __( 'No Popups found in Trash.', 'popups' )
281
+ );
282
+
283
+ $args = array(
284
+ 'labels' => $labels,
285
+ 'public' => true,
286
+ 'publicly_queryable' => true,
287
+ 'show_ui' => true,
288
+ 'show_in_menu' => true,
289
+ 'query_var' => true,
290
+ 'rewrite' => array( 'slug' => 'spucpt' ),
291
+ 'capability_type' => 'post',
292
+ 'capabilities' => array(
293
+ 'publish_posts' => apply_filters( 'spu/settings_page/roles', 'manage_options'),
294
+ 'edit_posts' => apply_filters( 'spu/settings_page/roles', 'manage_options'),
295
+ 'edit_others_posts' => apply_filters( 'spu/settings_page/roles', 'manage_options'),
296
+ 'delete_posts' => apply_filters( 'spu/settings_page/roles', 'manage_options'),
297
+ 'delete_others_posts' => apply_filters( 'spu/settings_page/roles', 'manage_options'),
298
+ 'read_private_posts' => apply_filters( 'spu/settings_page/roles', 'manage_options'),
299
+ 'edit_post' => apply_filters( 'spu/settings_page/roles', 'manage_options'),
300
+ 'delete_post' => apply_filters( 'spu/settings_page/roles', 'manage_options'),
301
+ 'read_post' => apply_filters( 'spu/settings_page/roles', 'manage_options'),
302
+ ),
303
+ 'has_archive' => true,
304
+ 'hierarchical' => false,
305
+ 'menu_position' => null,
306
+ 'menu_icon' => 'dashicons-share-alt',
307
+ 'supports' => array( 'title', 'editor','author' )
308
+ );
309
+
310
+ register_post_type( 'spucpt', $args );
311
+
312
+ }
313
+
314
+
315
+ function add_no_index() {
316
+ global $post;
317
+
318
+ if( get_post_type() == 'spucpt' && is_single() )
319
+ echo '<meta name="robots" content="noindex, nofollow" />';
320
+ }
321
+
322
+ /**
323
+ * Get all blog ids of blogs in the current network that are:
324
+ * - not archived
325
+ * - not spam
326
+ * - not deleted
327
+ *
328
+ * @since 1.0.0
329
+ *
330
+ * @return array|false The blog ids, false if no matches.
331
+ */
332
+ private static function get_blog_ids() {
333
+
334
+ global $wpdb;
335
+
336
+ // get an array of blog ids
337
+ $sql = "SELECT blog_id FROM $wpdb->blogs
338
+ WHERE archived = '0' AND spam = '0'
339
+ AND deleted = '0'";
340
+
341
+ return $wpdb->get_col( $sql );
342
+
343
+ }
344
+
345
+ /**
346
+ * Fired for each blog when the plugin is activated.
347
+ *
348
+ * @since 1.0.0
349
+ */
350
+ private static function single_activate() {
351
+ // If there are not popups created let's create a default one
352
+ global $wpdb;
353
+
354
+ $spus = $wpdb->get_results( "SELECT ID FROM $wpdb->posts WHERE post_type='spucpt'");
355
+
356
+
357
+ if ( empty( $spus) ) {
358
+ $post_content ='<h2 style="text-align:center">Welcome!</h2><p style="text-align:center">This is popup preview that you can fill with any content you want.</p><p style="text-align:center">The plugin include some shortcodes, you can read more about them at the bottom of this page. The main 3 sections to configure the popup are:</p><p>Appearance: Where you edit the look and feel of the popup.<br>Display Rules: Here you choose on which page to display the popup (Set to all by default)<br>Display options: Some important settings about the plugin, being the more important trigger action.</br></p>';
359
+ $defaults = array(
360
+ 'post_status' => 'draft',
361
+ 'post_type' => 'spucpt',
362
+ 'post_content' => $post_content,
363
+ 'post_title' => 'Popups Example'
364
+ );
365
+ wp_insert_post( $defaults, $wp_error );
366
+ }
367
+
368
+ $upgrader = new SocialPopup_Upgrader();
369
+ $upgrader->upgrade_plugin();
370
+
371
+ update_option('spu-version', SPU_VERSION);
372
+
373
+ do_action( 'spu/activate' );
374
+
375
+ }
376
+
377
+ /**
378
+ * Fired for each blog when the plugin is deactivated.
379
+ *
380
+ * @since 1.0.0
381
+ */
382
+ private static function single_deactivate() {
383
+ // @TODO: Define deactivation functionality here
384
+ }
385
+
386
+ /**
387
+ * Load the plugin text domain for translation.
388
+ *
389
+ * @since 1.0.0
390
+ */
391
+ public function load_plugin_textdomain() {
392
+
393
+ $domain = 'popups';
394
+ $locale = apply_filters( 'plugin_locale', get_locale(), $domain );
395
+
396
+ load_textdomain( $domain, trailingslashit( WP_LANG_DIR ) . $domain . '/' . $domain . '-' . $locale . '.mo' );
397
+ load_plugin_textdomain( $domain, FALSE, dirname( dirname( plugin_basename( __FILE__ ) ) ) . '/languages/' );
398
+
399
+ }
400
+
401
+
402
+
403
+ /**
404
+ * Register and enqueues public-facing JavaScript files.
405
+ *
406
+ * @since 1.0.0
407
+ */
408
+ public function register_scripts() {
409
+
410
+ $js_url = plugins_url( 'assets/js/public.js', __FILE__ );
411
+ $handle = 'spu-public';
412
+
413
+ $opts = $this->spu_settings;
414
+
415
+ wp_register_style( 'spu-public-css', plugins_url( 'assets/css/public.css', __FILE__ ), array(), self::VERSION );
416
+
417
+ wp_register_script( $handle, $js_url, array( 'jquery' ), self::VERSION, true );
418
+
419
+ wp_register_script( 'spu-facebook', '//connect.facebook.net/'.get_locale().'/sdk.js#xfbml=1&version=v2.3', array('jquery'), null, FALSE);
420
+
421
+ wp_register_script( 'spu-twitter', '//platform.twitter.com/widgets.js', array('jquery'), self::VERSION, FALSE);
422
+
423
+ wp_register_script( 'spu-google', '//apis.google.com/js/platform.js', array('jquery'), self::VERSION, FALSE);
424
+
425
+ }
426
+
427
+ /**
428
+ * load and print SPU popup when rules matches
429
+ *
430
+ * @since 1.0.0
431
+ */
432
+ public function check_for_matches() {
433
+
434
+ $spu_matches = false;
435
+
436
+ $spu_rules = new Spu_Rules();
437
+
438
+ //Grab all popups ids
439
+ $spu_ids = $this->get_spu_ids();
440
+
441
+ if( !empty($spu_ids) ) {
442
+ foreach ( $spu_ids as $spu ) {
443
+ $rules = !empty($spu->spu_rules) ? unserialize($spu->spu_rules) : array();
444
+ $match = $spu_rules->check_rules( $rules );
445
+ if ( $match ) {
446
+ $spu_matches[$spu->ID] = $spu->ID;
447
+ }
448
+ }
449
+ // check if we are viewing a popup, and only show that one (preview mode)
450
+ $viewing_id = defined('DOING_AJAX') && isset($_REQUEST['pid']) ? $_REQUEST['pid'] : get_queried_object_id();
451
+ foreach ( $spu_ids as $spu ) {
452
+ if ( $spu->ID == $viewing_id ) {
453
+ $spu_matches = array();
454
+ $spu_matches[$spu->ID] = $spu->ID;
455
+ }
456
+ }
457
+ }
458
+ return apply_filters( 'spu/check_for_matches', $spu_matches, $spu_ids, $spu_rules );
459
+ }
460
+
461
+ /**
462
+ * Return array of popups ids
463
+ */
464
+ function get_spu_ids() {
465
+ global $wpdb;
466
+ // IF wpml is active and spucpt is translated get correct ids for language
467
+ if( function_exists('icl_object_id') ) {
468
+ $spu_ids = $this->get_wpml_ids();
469
+ if(!empty($spu_ids)) {
470
+ return $spu_ids;
471
+ }
472
+ }
473
+ // IF polylang is active and spucpt is translated get correct ids for language
474
+ if( function_exists('pll_current_language') ) {
475
+ $spu_ids = $this->get_polylang_ids();
476
+ if(!empty($spu_ids)) {
477
+ return $spu_ids;
478
+ }
479
+ }
480
+ $post_status = isset( $_REQUEST['is_preview'] ) && $_REQUEST['is_preview'] == '1' ? "AND (post_status='publish' OR post_status='draft')" : "AND post_status='publish'";
481
+ return $wpdb->get_results( "SELECT ID, post_content, MAX(CASE WHEN pm1.meta_key = 'spu_rules' then pm1.meta_value ELSE NULL END) as spu_rules,
482
+ MAX(CASE WHEN pm1.meta_key = 'spu_ab_parent' then pm1.meta_value ELSE NULL END) as spu_ab_parent
483
+ FROM $wpdb->posts p LEFT JOIN $wpdb->postmeta pm1 ON ( pm1.post_id = p.ID) WHERE post_type='spucpt' {$post_status} GROUP BY p.ID");
484
+ }
485
+
486
+ /**
487
+ * Function that enqueue all needed scritps and styles
488
+ * @since 1.3
489
+ */
490
+ public function enqueue_scripts() {
491
+ $handle = 'spu-public';
492
+
493
+ $opts = $this->spu_settings;
494
+
495
+ wp_enqueue_script($handle);
496
+ wp_enqueue_style('spu-public-css');
497
+ wp_localize_script( $handle, 'spuvar',
498
+ array(
499
+ 'is_admin' => current_user_can( apply_filters( 'spu/capabilities/testmode', 'administrator' ) ),
500
+ 'disable_style' => isset( $this->spu_settings['shortcodes_style'] ) ? esc_attr( $this->spu_settings['shortcodes_style'] ) : '',
501
+ 'ajax_mode' => isset( $this->spu_settings['ajax_mode'] ) ? esc_attr( $this->spu_settings['ajax_mode'] ) :'',
502
+ 'ajax_url' => admin_url('admin-ajax.php'),
503
+ 'ajax_mode_url' => site_url('/?spu_action=spu_load&lang='.$this->info['wpml_lang']),
504
+ 'pid' => get_queried_object_id(),
505
+ 'is_front_page' => is_front_page(),
506
+ 'is_category' => is_category(),
507
+ 'site_url' => site_url(),
508
+ 'is_archive' => is_archive(),
509
+ 'is_search' => is_search(),
510
+ 'is_preview' => (get_post_type() == 'spucpt'),
511
+ 'seconds_confirmation_close' => apply_filters( 'spu/spuvar/seconds_confirmation_close', 5 ),
512
+ )
513
+ );
514
+ $this->enqueue_social_shortcodes();
515
+ }
516
+
517
+ /**
518
+ * Function that runs the different checks to see if social is enqueue or not
519
+ * @since 1.3
520
+ */
521
+ private function enqueue_social_shortcodes(){
522
+ global $wpdb,$spuvar_social;
523
+
524
+ $opts = $this->spu_settings;
525
+ $spuvar_social = array();
526
+
527
+ $handle = 'spu-public';
528
+
529
+ // Check if any popup have facebook, then enqueue js
530
+ if( $fb = $wpdb->get_var( "SELECT meta_value FROM $wpdb->postmeta WHERE meta_key = 'spu_fb' " ) ) {
531
+ // Check if defined or remove js in options
532
+ if( !defined( 'SPU_UNLOAD_FB_JS') && empty( $opts['facebook'] ) )
533
+ wp_enqueue_script( 'spu-facebook');
534
+
535
+ $spuvar_social['facebook'] = true;
536
+
537
+ }
538
+
539
+ if( $fb = $wpdb->get_var( "SELECT meta_value FROM $wpdb->postmeta WHERE meta_key ='spu_tw' " ) ) {
540
+ if( ! defined( 'SPU_UNLOAD_TW_JS') && empty( $opts['twitter'] ) )
541
+ wp_enqueue_script( 'spu-twitter');
542
+
543
+ $spuvar_social['twitter'] = true;
544
+
545
+ }
546
+
547
+ if( $fb = $wpdb->get_var( "SELECT meta_value FROM $wpdb->postmeta WHERE meta_key ='spu_google' " ) ) {
548
+ if( ! defined( 'SPU_UNLOAD_GO_JS') && empty( $opts['google'] ) )
549
+ wp_enqueue_script( 'spu-google');
550
+
551
+ $spuvar_social['google'] = true;
552
+ }
553
+ wp_localize_script( $handle, 'spuvar_social', $spuvar_social);
554
+
555
+
556
+ //also include gravity forms if needed
557
+ if( $gf = $wpdb->get_var( "SELECT meta_value FROM $wpdb->postmeta WHERE meta_key ='spu_gravity' " ) ) {
558
+ if( function_exists('gravity_form_enqueue_scripts'))
559
+ gravity_form_enqueue_scripts($gf, true);
560
+ }
561
+ }
562
+
563
+ /**
564
+ * [facebook_shortcode description]
565
+ *
566
+ * @param $atts
567
+ * @param $content
568
+ *
569
+ * @internal param $ $content [description] $content [description]
570
+ * @internal param $atts [description] $atts [description]
571
+ * @return string [description]
572
+ */
573
+ function facebook_shortcode( $atts, $content ) {
574
+
575
+ extract( shortcode_atts( array(
576
+ 'href' => apply_filters( 'spu/social/fb_href', 'https://www.facebook.com/pages/Timersys/146687622031640' ),
577
+ 'layout' => 'button_count', // standard, box_count, button_count, button
578
+ 'show_faces' => 'false', // true
579
+ 'share' => 'false', // true
580
+ 'action' => 'like', // recommend
581
+ 'width' => '',
582
+ ), $atts ) );
583
+
584
+ $layout = strtolower( trim( $layout ) );
585
+ $action = strtolower( trim( $action ) );
586
+
587
+ // to avoid problems
588
+ if( 'standard' != $layout && 'box_count' != $layout && 'button_count' != $layout && 'button' != $layout ) {
589
+ $layout = 'button_count';
590
+ }
591
+ if( 'like' != $action && 'recommend' != $action ) {
592
+ $action = 'like';
593
+ }
594
+
595
+ return '<div class="spu-facebook spu-shortcode"><div class="fb-like" data-width="'.strtolower( trim( $width ) ).'" data-href="'. $href .'" data-layout="'.$layout.'" data-action="'.$action.'" data-show-faces="'.strtolower( trim( $show_faces ) ).'" data-share="'.strtolower( trim( $share ) ).'"></div></div>';
596
+
597
+ }
598
+
599
+ /**
600
+ * Shortcode for facebook page
601
+ *
602
+ * @param $atts
603
+ * @param $content
604
+ *
605
+ * @internal param $ $content [description] $content [description]
606
+ * @internal param $atts [description] $atts [description]
607
+ * @return string [description]
608
+ */
609
+ function facebook_page_shortcode( $atts, $content ) {
610
+
611
+ extract( shortcode_atts( array(
612
+ 'href' => apply_filters( 'spu/social/fb_href', 'https://www.facebook.com/pages/Timersys/146687622031640' ),
613
+ 'name' => apply_filters( 'spu/social/fb_name', 'Timersys' ),
614
+ 'show_faces' => 'true', // false
615
+ 'hide_cover' => 'false', // true
616
+ 'width' => '500',
617
+ ), $atts ) );
618
+
619
+ return '<div class="spu-facebook-page"><div class="fb-page" data-href="'. $href .'" data-width="'.strtolower( trim( $width ) ).'" data-hide-cover="'.strtolower( trim( $hide_cover ) ).'" data-show-facepile="'.strtolower( trim( $show_faces ) ).'" data-show-posts="false"><div class="fb-xfbml-parse-ignore"><blockquote cite="'. $href .'"><a href="'. $href .'">'.esc_attr( $name ).'</a></blockquote></div></div></div>';
620
+
621
+ }
622
+
623
+ /**
624
+ * [twitter_shortcode description]
625
+ * @param string $content [description]
626
+ * @param array $atts [description]
627
+ * @return string [description]
628
+ */
629
+ function twitter_shortcode( $atts, $content ) {
630
+
631
+ extract( shortcode_atts( array(
632
+ 'user' => apply_filters( 'spu/social/tw_user', 'chifliiiii' ),
633
+ 'show_count' => 'true', // false
634
+ 'size' => '', // large
635
+ 'lang' => '',
636
+ ), $atts ) );
637
+
638
+ return '<div class="spu-twitter spu-shortcode"><a href="https://twitter.com/'.$user.'" class="twitter-follow-button" data-show-count="'.strtolower( trim( $show_count ) ).'" data-size="'.strtolower( trim( $size ) ).'" data-lang="'.$lang.'"></a></div>';
639
+
640
+ }
641
+
642
+ /**
643
+ * [google_shortcode description]
644
+ * @param [type] $atts [description]
645
+ * @param [type] $content [description]
646
+ * @return string [description]
647
+ */
648
+ function google_shortcode( $atts, $content ) {
649
+ extract( shortcode_atts( array(
650
+ 'type' => 'g-plusone', //small standard tall
651
+ 'size' => 'medium', //small standard tall
652
+ 'annotation' => 'bubble', //inline none
653
+ 'url' => apply_filters( 'spu/social/gp_url', 'https://plus.google.com/u/0/103508783120806246698/posts' ),
654
+ ), $atts ) );
655
+
656
+ $size = strtolower( trim( $size ) );
657
+ $annotation = strtolower( trim( $annotation ) );
658
+
659
+ //to avoid problems
660
+ if( 'medium' != $size && 'small' != $size && 'standard' != $size && 'tall' != $size ) {
661
+ $size = 'medium';
662
+ }
663
+ if( 'bubble' != $annotation && 'inline' != $annotation && 'none' != $annotation ) {
664
+ $annotation = 'bubble';
665
+ }
666
+ if( 'g-plusone' != $type && 'g-follow' != $type ) {
667
+ $type = 'g-plusone';
668
+ }
669
+
670
+ return '<div class="spu-google spu-shortcode"><div class="'.$type.'" data-callback="googleCB" data-onendinteraction="closeGoogle" data-recommendations="false" data-annotation="'.$annotation.'" data-size="'.$size.'" data-href="'.$url.'"></div></div>';
671
+
672
+ }
673
+
674
+ function close_shortcode( $atts, $content ) {
675
+ extract( shortcode_atts( array(
676
+ 'class' => 'button-primary btn-primary',
677
+ 'text' => 'Close',
678
+ 'conversion' => false
679
+ ), $atts ) );
680
+ $button_class = ! $conversion || $conversion == 'false' ? 'spu-close-popup ' : 'spu-close-convert ';
681
+
682
+ return '<button class="'.$button_class.$class.'">'.$text.'</button>';
683
+ }
684
+
685
+ /**
686
+ * Returns plugin info
687
+ * @param string $i info name
688
+ * @return mixed one all or none
689
+ */
690
+ function get_info( $i )
691
+ {
692
+ // vars
693
+ $return = false;
694
+
695
+
696
+ // specific
697
+ if( isset($this->info[ $i ]) )
698
+ {
699
+ $return = $this->info[ $i ];
700
+ }
701
+
702
+
703
+ // all
704
+ if( $i == 'all' )
705
+ {
706
+ $return = $this->info;
707
+ }
708
+
709
+
710
+ // return
711
+ return $return;
712
+ }
713
+
714
+ /**
715
+ * Print the actual popup
716
+ * @return mixed echo popup html
717
+ */
718
+ function print_boxes( ) {
719
+
720
+ do_action('spu/print_boxes');
721
+
722
+ $spu_matches = $this->check_for_matches();
723
+
724
+ //if we have matches continue
725
+ if( ! empty( $spu_matches) ) {
726
+
727
+ foreach ($spu_matches as $spu_id ) {
728
+
729
+ include( 'views/popup.php');
730
+
731
+ } //endforeach
732
+ echo '<div id="fb-root" class=" fb_reset"></div>';
733
+
734
+ }
735
+
736
+ }
737
+
738
+ /**
739
+ * Return plugin settings
740
+ * @return array
741
+ * @since 1.1
742
+ */
743
+ function get_settings() {
744
+
745
+ return $this->spu_settings;
746
+
747
+ }
748
+
749
+ /**
750
+ * Load necessary files
751
+ * @since 1.2.3
752
+ */
753
+ private function load_dependencies(){
754
+ // Include Helper class
755
+ require_once( SPU_PLUGIN_DIR . 'includes/class-spu-helper.php' );
756
+ // Include Rules Class
757
+ require_once( SPU_PLUGIN_DIR . 'public/includes/class-spu-rules.php' );
758
+ }
759
+
760
+ /**
761
+ * Custom ajax hook. Wp_ajax won't let us do_shortcode for example
762
+ * @return mixed Prints all spus
763
+ */
764
+ function register_spu_ajax() {
765
+
766
+ if ( empty( $_REQUEST['spu_action'] ) || $_REQUEST['spu_action'] != 'spu_load' )
767
+ return;
768
+
769
+ define( 'DOING_AJAX', TRUE );
770
+
771
+ $this->print_boxes();
772
+
773
+ die();
774
+ }
775
+
776
+
777
+ /**
778
+ * Return popups for current language
779
+ * @return bool | array of ids
780
+ */
781
+ protected function get_polylang_ids( ) {
782
+ global $wpdb;
783
+ $post_status = isset( $_REQUEST['is_preview'] ) && $_REQUEST['is_preview'] == '1' ? "AND (post_status='publish' OR post_status='draft')" : "AND post_status='publish'";
784
+
785
+ $sql = "SELECT description
786
+ FROM $wpdb->posts p
787
+ LEFT JOIN $wpdb->term_relationships as tr ON p.ID = tr.object_id
788
+ LEFT JOIN $wpdb->term_taxonomy as tt ON tt.term_taxonomy_id = tr.term_taxonomy_id
789
+ WHERE post_type='spucpt' {$post_status} AND tt.taxonomy = 'post_translations'
790
+ GROUP BY p.ID";
791
+
792
+ $ids = array();
793
+ $popups = $wpdb->get_results( $sql );
794
+ if( !empty($popups) ) {
795
+ $current = pll_current_language();
796
+ foreach ($popups as $p) {
797
+ $langs = unserialize($p->description);
798
+
799
+ if( isset($langs[$current]) )
800
+ $ids[] = $langs[$current];
801
+ }
802
+ }
803
+
804
+ if( !empty($ids)){
805
+ $sql = "SELECT DISTINCT ID, post_content,
806
+ MAX(CASE WHEN pm1.meta_key = 'spu_rules' then pm1.meta_value ELSE NULL END) as spu_rules,
807
+ MAX(CASE WHEN pm1.meta_key = 'spu_ab_parent' then pm1.meta_value ELSE NULL END) as spu_ab_parent
808
+ FROM $wpdb->posts p
809
+ LEFT JOIN $wpdb->postmeta pm1 ON ( pm1.post_id = p.ID)
810
+ WHERE post_type='spucpt' {$post_status} AND ID IN (".implode(',',array_unique($ids)).")
811
+ GROUP BY p.ID";
812
+ return $wpdb->get_results( $sql );
813
+ }
814
+
815
+ return false;
816
+ }
817
+ /**
818
+ * Return popups for current language
819
+ * @return bool | array of ids
820
+ */
821
+ protected function get_wpml_ids( ) {
822
+ global $wpdb;
823
+ $wpml_settings = get_option( 'icl_sitepress_settings', true);
824
+
825
+ if ( ! empty( $wpml_settings['custom_posts_sync_option']['spucpt'] ) ) {
826
+ $post_status = isset( $_REQUEST['is_preview'] ) && $_REQUEST['is_preview'] == '1' ? "AND (post_status='publish' OR post_status='draft')" : "AND post_status='publish'";
827
+ $lang_code = isset( $_GET['lang'] ) ? $_GET['lang'] : ICL_LANGUAGE_CODE;
828
+ $sql = "SELECT DISTINCT ID, post_content,
829
+ MAX(CASE WHEN pm1.meta_key = 'spu_rules' then pm1.meta_value ELSE NULL END) as spu_rules,
830
+ MAX(CASE WHEN pm1.meta_key = 'spu_ab_parent' then pm1.meta_value ELSE NULL END) as spu_ab_parent
831
+ FROM $wpdb->posts p
832
+ LEFT JOIN $wpdb->postmeta pm1 ON ( pm1.post_id = p.ID)
833
+ LEFT JOIN {$wpdb->prefix}icl_translations as b ON p.ID = b.element_id
834
+ WHERE post_type='spucpt' {$post_status} AND b.language_code = '" . esc_sql( $lang_code ) . "'
835
+ GROUP BY p.ID";
836
+
837
+ $ids = $wpdb->get_results( $sql );
838
+ if( !empty($ids) )
839
+ return $ids;
840
+ }
841
+
842
+ return false;
843
+ }
844
+
845
+ /**
846
+ * Popup button
847
+ * @param [type] $atts [description]
848
+ * @param [type] $content [description]
849
+ * @return [type] [description]
850
+ */
851
+ public function popup_link_shortcode($atts, $content ) {
852
+ return '<a href="#" class="spu-open-'.$atts['popup'].'">'.do_shortcode( $content ).'</a>';
853
+ }
854
+
855
+ }
public/includes/class-spu-rules.php CHANGED
@@ -1,1157 +1,1151 @@
1
- <?php
2
- use Jaybizzle\CrawlerDetect\CrawlerDetect;
3
- /*
4
- * Spu Rules
5
- * Class that will compare rules and determine if popup needs to show
6
- * @since: 2.0
7
- */
8
- class Spu_Rules
9
- {
10
- /**
11
- * post id used to check rules
12
- * @var int
13
- */
14
- protected $post_id;
15
-
16
- /**
17
- * referrer using in ajax calls
18
- * @var string
19
- */
20
- protected $referrer;
21
-
22
- /**
23
- * Is category using in ajax calls
24
- * @var boolean
25
- */
26
- protected $is_category = false;
27
-
28
- /**
29
- * Is archive using in ajax calls
30
- * @var boolean
31
- */
32
- protected $is_archive = false;
33
-
34
- /**
35
- * Is searchu sed in ajax calls
36
- * @var boolean
37
- */
38
- protected $is_search = false;
39
-
40
- /**
41
- * Holds current url
42
- * @var string
43
- */
44
- protected $current_url;
45
-
46
- /**
47
- * Holds query string
48
- * @var
49
- */
50
- protected $query_string;
51
-
52
- /*
53
- * __construct
54
- * Add all the filters to use later
55
- */
56
-
57
- function __construct()
58
- {
59
- global $post;
60
-
61
- // User
62
- add_filter('spu/rules/rule_match/user_type', array($this, 'rule_match_user_type'), 10, 2);
63
- add_filter('spu/rules/rule_match/logged_user', array($this, 'rule_match_logged_user'), 10, 2);
64
- add_filter('spu/rules/rule_match/left_comment', array($this, 'rule_match_left_comment'), 10, 2);
65
- add_filter('spu/rules/rule_match/search_engine', array($this, 'rule_match_search_engine'), 10, 2);
66
- add_filter('spu/rules/rule_match/same_site', array($this, 'rule_match_same_site'), 10, 2);
67
-
68
- // Post
69
- add_filter('spu/rules/rule_match/post_type', array($this, 'rule_match_post_type'), 10, 2);
70
- add_filter('spu/rules/rule_match/post_id', array($this, 'rule_match_post'), 10, 2);
71
- add_filter('spu/rules/rule_match/post', array($this, 'rule_match_post'), 10, 2);
72
- add_filter('spu/rules/rule_match/post_category', array($this, 'rule_match_post_category'), 10, 2);
73
- add_filter('spu/rules/rule_match/post_format', array($this, 'rule_match_post_format'), 10, 2);
74
- add_filter('spu/rules/rule_match/post_status', array($this, 'rule_match_post_status'), 10, 2);
75
- add_filter('spu/rules/rule_match/taxonomy', array($this, 'rule_match_taxonomy'), 10, 2);
76
-
77
- // Page
78
- add_filter('spu/rules/rule_match/page', array($this, 'rule_match_post'), 10, 2);
79
- add_filter('spu/rules/rule_match/page_type', array($this, 'rule_match_page_type'), 10, 2);
80
- add_filter('spu/rules/rule_match/page_parent', array($this, 'rule_match_page_parent'), 10, 2);
81
- add_filter('spu/rules/rule_match/page_template', array($this, 'rule_match_page_template'), 10, 2);
82
-
83
- //Other
84
- add_filter('spu/rules/rule_match/mobiles', array($this, 'rule_match_mobiles'), 10, 2);
85
- add_filter('spu/rules/rule_match/tablets', array($this, 'rule_match_tablets'), 10, 2);
86
- add_filter('spu/rules/rule_match/desktop', array($this, 'rule_match_desktop'), 10, 2);
87
- add_filter('spu/rules/rule_match/referrer', array($this, 'rule_match_referrer'), 10, 2);
88
- add_filter('spu/rules/rule_match/crawlers', array($this, 'rule_match_crawlers'), 10, 2);
89
- add_filter('spu/rules/rule_match/browser', array($this, 'rule_match_browser'), 10, 2);
90
- add_filter('spu/rules/rule_match/query_string', array($this, 'rule_match_query_string'), 10, 2);
91
- add_filter('spu/rules/rule_match/custom_url', array($this, 'rule_match_custom_url'), 10, 2);
92
- add_filter('spu/rules/rule_match/keyword_url', array($this, 'rule_match_keyword_url'), 10, 2);
93
-
94
- $this->post_id = get_queried_object_id();
95
- $this->referrer = isset($_SERVER['HTTP_REFERER']) && !defined('DOING_AJAX') ? $_SERVER['HTTP_REFERER'] : '';
96
- $this->query_string = isset($_SERVER['QUERY_STRING']) ? $_SERVER['QUERY_STRING'] : '';
97
- $this->current_url = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
98
-
99
-
100
- if( defined('DOING_AJAX') ) {
101
-
102
- if( isset( $_REQUEST['pid'] ) ) {
103
- $this->post_id = $_REQUEST['pid'];
104
- }
105
- if( !empty( $_REQUEST['referrer'] ) ) {
106
- $this->referrer = $_REQUEST['referrer'];
107
- }
108
- if( !empty( $_REQUEST['current_url'] ) ) {
109
- $this->current_url = $_REQUEST['current_url'];
110
- }
111
- if( !empty( $_REQUEST['query_string'] ) ) {
112
- $this->query_string = $_REQUEST['query_string'];
113
- }
114
- if( !empty( $_REQUEST['is_category'] ) ) {
115
- $this->is_category = true;
116
- }
117
- if( !empty( $_REQUEST['is_archive'] ) ) {
118
- $this->is_archive = true;
119
- }
120
- if( !empty( $_REQUEST['is_search'] ) ) {
121
- $this->is_search = true;
122
- }
123
- }
124
-
125
- }
126
-
127
-
128
- /*
129
- * check_rules
130
- *
131
- * @since 1.0.0
132
- */
133
-
134
- function check_rules( $rules = '' )
135
- {
136
-
137
- //if no rules, add the box
138
- $add_box = true;
139
-
140
- if( !empty( $rules ) ) {
141
- // vars
142
- $add_box = false;
143
-
144
-
145
- foreach( $rules as $group_id => $group ) {
146
- // start of as true, this way, any rule that doesn't match will cause this varaible to false
147
- $match_group = true;
148
-
149
- if( is_array($group) )
150
- {
151
-
152
- foreach( $group as $rule_id => $rule )
153
- {
154
-
155
- // $match = true / false
156
- $match = apply_filters( 'spu/rules/rule_match/' . $rule['param'] , false, $rule );
157
-
158
- if( !$match )
159
- {
160
- $match_group = false;
161
- // if one rule fails we don't need to check the rest of the rules in the group
162
- // that way if we add geo rules down it won't get executed and will save credits
163
- break;
164
- }
165
-
166
- }
167
- }
168
-
169
-
170
- // all rules must havematched!
171
- if( $match_group )
172
- {
173
- $add_box = true;
174
- }
175
-
176
- }
177
-
178
-
179
- }
180
-
181
-
182
- return $add_box;
183
- }
184
-
185
- /**
186
- * [rule_match_logged_user description]
187
- * @param bool $match false default
188
- * @param array $rule rule to compare
189
- * @return boolean true if match
190
- */
191
- function rule_match_logged_user( $match, $rule ) {
192
-
193
- if ( $rule['operator'] == "==" ) {
194
-
195
- return is_user_logged_in();
196
-
197
- } else {
198
-
199
- return !is_user_logged_in();
200
-
201
- }
202
-
203
- }
204
-
205
- /**
206
- * [rule_match_mobiles description]
207
- * @param bool $match false default
208
- * @param array $rule rule to compare
209
- * @return boolean true if match
210
- */
211
- function rule_match_mobiles( $match, $rule ) {
212
-
213
- $detect = new Mobile_Detect;
214
-
215
- if ( $rule['operator'] == "==" ) {
216
-
217
- return $detect->isMobile();
218
-
219
- } else {
220
-
221
- return !$detect->isMobile();
222
-
223
- }
224
-
225
- }
226
- /**
227
- * [rule_match_browser description]
228
- * @param bool $match false default
229
- * @param array $rule rule to compare
230
- * @return boolean true if match
231
- */
232
- function rule_match_browser( $match, $rule ) {
233
-
234
- $detect = new Browser();
235
-
236
- //check $detect $browsers for valid keys
237
- if ( $rule['operator'] == "==" ) {
238
-
239
- return $detect->getBrowser() == $rule['value'];
240
-
241
- } else {
242
-
243
- return $detect->getBrowser() != $rule['value'];
244
-
245
- }
246
-
247
- }
248
- /**
249
- * [rule_match_tablets description]
250
- * @param bool $match false default
251
- * @param array $rule rule to compare
252
- * @return boolean true if match
253
- */
254
- function rule_match_tablets( $match, $rule ) {
255
-
256
- $detect = new Mobile_Detect;
257
-
258
- if ( $rule['operator'] == "==" ) {
259
-
260
- return $detect->isTablet();
261
-
262
- } else {
263
-
264
- return !$detect->isTablet();
265
-
266
- }
267
-
268
- }
269
- /**
270
- * [rule_match_desktop description]
271
- * @param bool $match false default
272
- * @param array $rule rule to compare
273
- * @return boolean true if match
274
- */
275
- function rule_match_desktop( $match, $rule ) {
276
-
277
- $detect = new Mobile_Detect;
278
-
279
- if ( $rule['operator'] == "==" ) {
280
-
281
- return ( ! $detect->isTablet() && ! $detect->isMobile() );
282
-
283
- } else {
284
-
285
- return ( $detect->isTablet() || $detect->isMobile() );
286
-
287
- }
288
-
289
- }
290
-
291
- /**
292
- * [rule_match_left_comment description]
293
- * @param bool $match false default
294
- * @param array $rule rule to compare
295
- * @return boolean true if match
296
- */
297
- function rule_match_left_comment( $match, $rule ) {
298
-
299
- if ( $rule['operator'] == "==" ) {
300
-
301
- return !empty( $_COOKIE['comment_author_'.COOKIEHASH] );
302
-
303
- } else {
304
-
305
- return empty( $_COOKIE['comment_author_'.COOKIEHASH] );
306
-
307
- }
308
-
309
- }
310
- /**
311
- * [rule_match_search_engine description]
312
- * @param bool $match false default
313
- * @param array $rule rule to compare
314
- * @return boolean true if match
315
- */
316
- function rule_match_search_engine( $match, $rule ) {
317
-
318
- $ref = $this->referrer;
319
-
320
- $SE = apply_filters( 'spu/rules/search_engines', array('/search?', '.google.', 'web.info.com', 'search.', 'del.icio.us/search', 'soso.com', '/search/', '.yahoo.', '.bing.' ) );
321
-
322
- foreach ($SE as $url) {
323
- if ( strpos( $ref,$url ) !==false ){
324
-
325
- return $rule['operator'] == "==" ? true : false;
326
- }
327
- }
328
-
329
- return $rule['operator'] == "==" ? false : true;
330
-
331
- }
332
-
333
- /**
334
- * Check for user referrer
335
- * @param bool $match false default
336
- * @param array $rule rule to compare
337
- * @return boolean true if match
338
- */
339
- function rule_match_referrer( $match, $rule ) {
340
-
341
- $ref = $this->referrer;
342
-
343
- if ( strpos( $ref,$rule['value'] ) !==false ){
344
- return $rule['operator'] == "==" ? true : false;
345
- }
346
-
347
- return $rule['operator'] == "==" ? false : true;
348
-
349
- }
350
-
351
- /**
352
- * Check for crawlers / bots
353
- * @param bool $match false default
354
- * @param array $rule rule to compare
355
- * @return boolean true if match
356
- */
357
- function rule_match_crawlers( $match, $rule ) {
358
-
359
- $detect = new CrawlerDetect;
360
-
361
- if ( $rule['operator'] == "==" ) {
362
-
363
- return $detect->isCrawler();
364
-
365
- } else {
366
-
367
- return !$detect->isCrawler();
368
-
369
- }
370
-
371
- }
372
-
373
- /**
374
- * Check for query string to see if matchs all given ones
375
- * @param bool $match false default
376
- * @param array $rule rule to compare
377
- * @return boolean true if match
378
- */
379
- function rule_match_query_string( $match, $rule ) {
380
-
381
-
382
- $found = strpos($this->query_string, str_replace('?','', $rule['value'] ) ) > -1 ? true: false;
383
-
384
-
385
- if ( $rule['operator'] == "==" )
386
- return $found;
387
-
388
- return ! $found;
389
-
390
- }
391
-
392
- /**
393
- * [rule_match_same_site description]
394
- * @param bool $match false default
395
- * @param array $rule rule to compare
396
- * @return boolean true if match
397
- */
398
- function rule_match_same_site( $match, $rule ) {
399
-
400
-
401
- $ref = $this->referrer;
402
-
403
- $internal = str_replace( array( 'http://','https://' ), '', home_url() );
404
-
405
- if( $rule['operator'] == "==" ) {
406
-
407
- return !preg_match( '~' . $internal . '~i', $ref );
408
-
409
- } else {
410
- return preg_match( '~' . $internal . '~i', $ref );
411
-
412
- }
413
-
414
- }
415
-
416
- /*
417
- * rule_match_post_type
418
- *
419
- * @since 1.0.0
420
- */
421
-
422
- function rule_match_post_type( $match, $rule )
423
- {
424
-
425
-
426
- $post_type = $this->get_post_type();
427
-
428
-
429
- if( $rule['operator'] == "==" )
430
- {
431
- $match = ( $post_type === $rule['value'] );
432
- }
433
- elseif( $rule['operator'] == "!=" )
434
- {
435
- $match = ( $post_type !== $rule['value'] );
436
- }
437
-
438
-
439
- return $match;
440
- }
441
-
442
-
443
- /*
444
- * rule_match_post
445
- *
446
- * @since 1.0.0
447
- */
448
-
449
- function rule_match_post( $match, $rule )
450
- {
451
-
452
- $post_id = $this->post_id;
453
- // in case multiple ids are passed
454
- $ids = array_map('trim',explode(',',$rule['value']));
455
-
456
- if($rule['operator'] == "==")
457
- {
458
- $match = in_array($post_id, $ids );
459
- }
460
- elseif($rule['operator'] == "!=")
461
- {
462
- $match = ! in_array($post_id, $ids );
463
- }
464
-
465
- return $match;
466
-
467
- }
468
-
469
-
470
- /*
471
- * rule_match_page_type
472
- *
473
- * @since 1.0.0
474
- */
475
-
476
- function rule_match_page_type( $match, $rule )
477
- {
478
-
479
-
480
- $post_id = $this->post_id;
481
-
482
- $post = get_post( $post_id );
483
-
484
- $post_parent = isset( $post->post_parent ) ? $post->post_parent : '';
485
-
486
- $post_type = $this->get_post_type();
487
-
488
- if( $rule['value'] == 'front_page') {
489
-
490
- $front_page = (int) get_option('page_on_front');
491
-
492
- if( $front_page !== 0 ) {
493
-
494
- if($rule['operator'] == "==") {
495
-
496
- $match = ( $front_page == $post_id );
497
-
498
- } elseif($rule['operator'] == "!=") {
499
-
500
- $match = ( $front_page != $post_id );
501
-
502
- }
503
- } else {
504
- // if doing ajax is_home won't work so we do a workaround
505
- if( defined( 'DOING_AJAX') ) {
506
-
507
- $front_page = get_option( 'show_on_front' );
508
-
509
- if($rule['operator'] == "==") {
510
-
511
- $match = ( 'posts' == $front_page && $post_id == 0 );
512
-
513
- } elseif($rule['operator'] == "!=") {
514
-
515
- $match = !( 'posts' == $front_page && $post_id == 0 );
516
-
517
- }
518
-
519
-
520
- } else {
521
-
522
- if($rule['operator'] == "==") {
523
-
524
- $match = is_home();
525
-
526
- } elseif($rule['operator'] == "!=") {
527
-
528
- $match = !is_home();
529
-
530
- }
531
- }
532
-
533
- }
534
-
535
- }
536
- elseif( $rule['value'] == 'category_page') {
537
-
538
- if( defined( 'DOING_AJAX') ) {
539
- if($rule['operator'] == "==") {
540
-
541
- $match = $this->is_category;
542
-
543
- } elseif($rule['operator'] == "!=") {
544
-
545
- $match = !$this->is_category;
546
-
547
- }
548
- } else {
549
- if ( $rule['operator'] == "==" ) {
550
-
551
- $match = is_category();
552
-
553
- } elseif ( $rule['operator'] == "!=" ) {
554
-
555
- $match = ! is_category();
556
-
557
- }
558
- }
559
- }
560
- elseif( $rule['value'] == 'archive_page') {
561
- if( defined( 'DOING_AJAX') ) {
562
- if($rule['operator'] == "==") {
563
-
564
- $match = $this->is_archive;
565
-
566
- } elseif($rule['operator'] == "!=") {
567
-
568
- $match = !$this->is_archive;
569
-
570
- }
571
- } else {
572
- if ( $rule['operator'] == "==" ) {
573
-
574
- $match = is_archive();
575
-
576
- } elseif ( $rule['operator'] == "!=" ) {
577
-
578
- $match = ! is_archive();
579
-
580
- }
581
- }
582
- }
583
- elseif( $rule['value'] == 'search_page') {
584
- if( defined( 'DOING_AJAX') ) {
585
- if($rule['operator'] == "==") {
586
-
587
- $match = $this->is_search;
588
-
589
- } elseif($rule['operator'] == "!=") {
590
-
591
- $match = !$this->is_search;
592
-
593
- }
594
- } else {
595
- if ( $rule['operator'] == "==" ) {
596
-
597
- $match = is_search();
598
-
599
- } elseif ( $rule['operator'] == "!=" ) {
600
-
601
- $match = ! is_search();
602
-
603
- }
604
- }
605
- }
606
- elseif( $rule['value'] == 'posts_page') {
607
-
608
- $posts_page = (int) get_option('page_for_posts');
609
-
610
- if( $posts_page !== 0 ) {
611
- if($rule['operator'] == "==") {
612
-
613
- $match = ( $posts_page == $post_id );
614
-
615
- } elseif($rule['operator'] == "!=") {
616
-
617
- $match = ( $posts_page != $post_id );
618
-
619
- }
620
- } else {
621
- // if doing ajax is_home won't work so we do a workaround
622
- if( defined( 'DOING_AJAX') ) {
623
-
624
-
625
- if($rule['operator'] == "==") {
626
-
627
- $match = ( 0 === $posts_page && $post_id == 0 );
628
-
629
- } elseif($rule['operator'] == "!=") {
630
-
631
- $match = !( 0 === $posts_page && $post_id == 0 );
632
-
633
- }
634
-
635
-
636
- } else {
637
- if($rule['operator'] == "==") {
638
-
639
- $match = is_home();
640
-
641
- } elseif($rule['operator'] == "!=") {
642
-
643
- $match = !is_home();
644
-
645
- }
646
- }
647
- }
648
-
649
- }
650
- elseif( $rule['value'] == 'top_level') {
651
-
652
-
653
- if($rule['operator'] == "==")
654
- {
655
- $match = ( $post_parent == 0 );
656
- }
657
- elseif($rule['operator'] == "!=")
658
- {
659
- $match = ( $post_parent != 0 );
660
- }
661
-
662
- }
663
- elseif( $rule['value'] == 'parent') {
664
-
665
- $children = get_pages(array(
666
- 'post_type' => $post_type,
667
- 'child_of' => $post_id,
668
- ));
669
-
670
-
671
- if($rule['operator'] == "==") {
672
- $match = ( count($children) > 0 );
673
- }
674
- elseif($rule['operator'] == "!=")
675
- {
676
- $match = ( count($children) == 0 );
677
- }
678
-
679
- }
680
- elseif( $rule['value'] == 'child') {
681
-
682
-
683
-
684
- if($rule['operator'] == "==")
685
- {
686
- $match = ( $post_parent != 0 );
687
- }
688
- elseif($rule['operator'] == "!=")
689
- {
690
- $match = ( $post_parent == 0 );
691
- }
692
-
693
- } elseif( $rule['value'] == 'all_pages') {
694
-
695
- $match = true;
696
-
697
- }
698
-
699
- return $match;
700
-
701
- }
702
-
703
-
704
- /*
705
- * rule_match_page_parent
706
- *
707
- * @since 1.0.0
708
- */
709
-
710
- function rule_match_page_parent( $match, $rule )
711
- {
712
-
713
- // validation
714
- if( !$this->post_id )
715
- {
716
- return false;
717
- }
718
-
719
-
720
- // vars
721
- $post = get_post( $this->post_id );
722
-
723
- $post_parent = $post->post_parent;
724
- if( $options['page_parent'] )
725
- {
726
- $post_parent = $options['page_parent'];
727
- }
728
-
729
-
730
- if($rule['operator'] == "==")
731
- {
732
- $match = ( $post_parent == $rule['value'] );
733
- }
734
- elseif($rule['operator'] == "!=")
735
- {
736
- $match = ( $post_parent != $rule['value'] );
737
- }
738
-
739
-
740
- return $match;
741
-
742
- }
743
-
744
-
745
- /*
746
- * rule_match_page_template
747
- *
748
- * @since 1.0.0
749
- */
750
-
751
- function rule_match_page_template( $match, $rule )
752
- {
753
-
754
-
755
- $page_template = get_post_meta( $this->post_id, '_wp_page_template', true );
756
-
757
-
758
- if( ! $page_template ) {
759
-
760
- if( 'page' == get_post_type( $this->post_id ) ) {
761
-
762
- $page_template = "default";
763
-
764
- }
765
- }
766
-
767
-
768
- if($rule['operator'] == "==")
769
- {
770
- $match = ( $page_template === $rule['value'] );
771
- }
772
- elseif($rule['operator'] == "!=")
773
- {
774
- $match = ( $page_template !== $rule['value'] );
775
- }
776
-
777
- return $match;
778
-
779
- }
780
-
781
-
782
- /*
783
- * rule_match_post_category
784
- *
785
- * @since 1.0.0
786
- */
787
-
788
- function rule_match_post_category( $match, $rule )
789
- {
790
-
791
-
792
- // validate
793
- if( !$this->post_id )
794
- {
795
- return false;
796
- }
797
- //check if we are in category page
798
- if( ($cat = get_category($this->post_id) ) ) {
799
- if($rule['operator'] == "==")
800
- return $rule['value'] == $this->post_id;
801
- return !($rule['value'] == $this->post_id);
802
- }// otherwise think this of a single post page
803
-
804
-
805
- // post type
806
- $post_type = $this->get_post_type();
807
-
808
- // vars
809
- $taxonomies = get_object_taxonomies( $post_type );
810
-
811
- $all_terms = get_the_terms( $this->post_id, 'category' );
812
- if($all_terms)
813
- {
814
- foreach($all_terms as $all_term)
815
- {
816
- $terms[] = $all_term->term_id;
817
- }
818
- }
819
-
820
- // no terms at all?
821
- if( empty($terms) )
822
- {
823
- // If no ters, this is a new post and should be treated as if it has the "Uncategorized" (1) category ticked
824
- if( is_array($taxonomies) && in_array('category', $taxonomies) )
825
- {
826
- $terms[] = '1';
827
- }
828
- }
829
-
830
-
831
- if($rule['operator'] == "==")
832
- {
833
- $match = false;
834
-
835
- if(!empty($terms))
836
- {
837
- if( in_array($rule['value'], $terms) )
838
- {
839
- $match = true;
840
- }
841
- }
842
-
843
- }
844
- elseif($rule['operator'] == "!=")
845
- {
846
- $match = true;
847
-
848
- if($terms)
849
- {
850
- if( in_array($rule['value'], $terms) )
851
- {
852
- $match = false;
853
- }
854
- }
855
-
856
- }
857
-
858
-
859
- return $match;
860
-
861
- }
862
-
863
-
864
- /*
865
- * rule_match_user_type
866
- *
867
- * @since 1.0.0
868
- */
869
-
870
- function rule_match_user_type( $match, $rule )
871
- {
872
- $user = wp_get_current_user();
873
-
874
- if( $rule['operator'] == "==" )
875
- {
876
- if( $rule['value'] == 'super_admin' )
877
- {
878
- $match = is_super_admin( $user->ID );
879
- }
880
- else
881
- {
882
- $match = in_array( $rule['value'], $user->roles );
883
- }
884
-
885
- }
886
- elseif( $rule['operator'] == "!=" )
887
- {
888
- if( $rule['value'] == 'super_admin' )
889
- {
890
- $match = !is_super_admin( $user->ID );
891
- }
892
- else
893
- {
894
- $match = ( ! in_array( $rule['value'], $user->roles ) );
895
- }
896
- }
897
-
898
- return $match;
899
-
900
- }
901
-
902
-
903
-
904
-
905
- /*
906
- * rule_match_post_format
907
- *
908
- * @since 1.0.0
909
- */
910
-
911
- function rule_match_post_format( $match, $rule )
912
- {
913
-
914
-
915
- // validate
916
- if( !$this->post_id )
917
- {
918
- return false;
919
- }
920
-
921
- $post_type = $this->get_post_type();
922
-
923
-
924
- // does post_type support 'post-format'
925
- if( post_type_supports( $post_type, 'post-formats' ) )
926
- {
927
- $post_format = get_post_format( $this->post_id );
928
-
929
- if( $post_format === false )
930
- {
931
- $post_format = 'standard';
932
- }
933
- }
934
-
935
-
936
-
937
- if($rule['operator'] == "==")
938
- {
939
- $match = ( $post_format === $rule['value'] );
940
-
941
- }
942
- elseif($rule['operator'] == "!=")
943
- {
944
- $match = ( $post_format !== $rule['value'] );
945
- }
946
-
947
-
948
-
949
- return $match;
950
-
951
- }
952
-
953
-
954
- /*
955
- * rule_match_post_status
956
- *
957
- * @since 1.0.0
958
- */
959
-
960
- function rule_match_post_status( $match, $rule )
961
- {
962
-
963
-
964
- // validate
965
- if( !$this->post_id )
966
- {
967
- return false;
968
- }
969
-
970
-
971
- // vars
972
- $post_status = get_post_status( $this->post_id );
973
-
974
-
975
- // auto-draft = draft
976
- if( $post_status == 'auto-draft' )
977
- {
978
- $post_status = 'draft';
979
- }
980
-
981
-
982
- // match
983
- if($rule['operator'] == "==")
984
- {
985
- $match = ( $post_status === $rule['value'] );
986
-
987
- }
988
- elseif($rule['operator'] == "!=")
989
- {
990
- $match = ( $post_status !== $rule['value'] );
991
- }
992
-
993
-
994
- // return
995
- return $match;
996
-
997
- }
998
-
999
-
1000
- /*
1001
- * rule_match_taxonomy
1002
- *
1003
- * @since 1.0.0
1004
- */
1005
-
1006
- function rule_match_taxonomy( $match, $rule )
1007
- {
1008
-
1009
- // validate
1010
- if( !$this->post_id )
1011
- {
1012
- return false;
1013
- }
1014
- // if we are inside taxonomy archive page (Ajax mode)
1015
- if( $this->is_archive ){
1016
- if($rule['operator'] == "==")
1017
- return $rule['value'] == $this->post_id;
1018
- else
1019
- return $rule['value'] != $this->post_id;
1020
- }
1021
-
1022
- $qo = get_queried_object();
1023
-
1024
- // if we are inside taxonomy archive page
1025
- if( isset($qo->term_id) && $qo->term_id == $this->post_id ){
1026
- if($rule['operator'] == "==")
1027
- return $rule['value'] == $qo->term_id;
1028
- else
1029
- return $rule['value'] != $qo->term_id;
1030
- } else {
1031
- // post type
1032
- $post_type = $this->get_post_type();
1033
- // vars
1034
- $taxonomies = get_object_taxonomies( $post_type );
1035
- }
1036
-
1037
- $terms = array();
1038
-
1039
-
1040
- if( is_array($taxonomies) )
1041
- {
1042
- foreach( $taxonomies as $tax )
1043
- {
1044
- $all_terms = get_the_terms( $this->post_id, $tax );
1045
- if($all_terms)
1046
- {
1047
- foreach($all_terms as $all_term)
1048
- {
1049
- $terms[] = $all_term->term_id;
1050
- }
1051
- }
1052
- }
1053
- }
1054
-
1055
- // no terms at all?
1056
- if( empty($terms) )
1057
- {
1058
- // If no ters, this is a new post and should be treated as if it has the "Uncategorized" (1) category ticked
1059
- if( is_array($taxonomies) && in_array('category', $taxonomies) )
1060
- {
1061
- $terms[] = '1';
1062
- }
1063
- }
1064
-
1065
-
1066
-
1067
- if($rule['operator'] == "==")
1068
- {
1069
- $match = false;
1070
-
1071
- if($terms)
1072
- {
1073
- if( in_array($rule['value'], $terms) )
1074
- {
1075
- $match = true;
1076
- }
1077
- }
1078
-
1079
- }
1080
- elseif($rule['operator'] == "!=")
1081
- {
1082
- $match = true;
1083
-
1084
- if($terms)
1085
- {
1086
- if( in_array($rule['value'], $terms) )
1087
- {
1088
- $match = false;
1089
- }
1090
- }
1091
-
1092
- }
1093
-
1094
-
1095
- return $match;
1096
-
1097
- }
1098
-
1099
- /**
1100
- * Helper function to get post type
1101
- * @since 1.2.3
1102
- * @return string
1103
- *
1104
- */
1105
- function get_post_type(){
1106
- global $wp_query;
1107
-
1108
- $post_type = isset( $wp_query->query_vars['post_type'] ) ? $wp_query->query_vars['post_type'] : '';
1109
-
1110
- $post_type = empty( $post_type ) ? get_post_type($this->post_id) : get_post_type();
1111
-
1112
- return $post_type;
1113
- }
1114
-
1115
- /**
1116
- * Check for custom url
1117
- *
1118
- * @param array $rule rule to compare
1119
- *
1120
- * @return boolean true if match
1121
- */
1122
- public function rule_match_custom_url( $match, $rule ) {
1123
-
1124
- $wide_search = strpos($rule['value'],'*') !== false ? true : false;
1125
-
1126
- if( $wide_search ) {
1127
- if( strpos( $this->current_url, trim($rule['value'],'*') ) === 0 ) {
1128
- return ( $rule['operator'] == "==" );
1129
- }
1130
- return ! ( $rule['operator'] == "==" );
1131
- }
1132
-
1133
- if( $rule['operator'] == "==" )
1134
- return ($this->current_url == $rule['value']);
1135
-
1136
- return ! ($this->current_url == $rule['value']);
1137
-
1138
- }
1139
-
1140
- /**
1141
- * Check for keyword url
1142
- *
1143
- * @param array $rule rule to compare
1144
- *
1145
- * @return boolean true if match
1146
- */
1147
- function rule_match_keyword_url($match, $rule) {
1148
-
1149
- $search_url = str_replace(site_url(), '', $this->current_url);
1150
-
1151
- if( strlen($search_url) > 0 && strpos($search_url, trim($rule['value'])) !== false )
1152
- return ($rule['operator'] == "==");
1153
- else
1154
- return !($rule['operator'] == "==");
1155
-
1156
- }
1157
  }
1
+ <?php
2
+ use Jaybizzle\CrawlerDetect\CrawlerDetect;
3
+ /*
4
+ * Spu Rules
5
+ * Class that will compare rules and determine if popup needs to show
6
+ * @since: 2.0
7
+ */
8
+ class Spu_Rules
9
+ {
10
+ /**
11
+ * post id used to check rules
12
+ * @var int
13
+ */
14
+ protected $post_id;
15
+
16
+ /**
17
+ * referrer using in ajax calls
18
+ * @var string
19
+ */
20
+ protected $referrer;
21
+
22
+ /**
23
+ * Is category using in ajax calls
24
+ * @var boolean
25
+ */
26
+ protected $is_category = false;
27
+
28
+ /**
29
+ * Is archive using in ajax calls
30
+ * @var boolean
31
+ */
32
+ protected $is_archive = false;
33
+
34
+ /**
35
+ * Is searchu sed in ajax calls
36
+ * @var boolean
37
+ */
38
+ protected $is_search = false;
39
+
40
+ /**
41
+ * Holds current url
42
+ * @var string
43
+ */
44
+ protected $current_url;
45
+
46
+ /**
47
+ * Holds query string
48
+ * @var
49
+ */
50
+ protected $query_string;
51
+
52
+ /*
53
+ * __construct
54
+ * Add all the filters to use later
55
+ */
56
+
57
+ function __construct()
58
+ {
59
+ global $post;
60
+
61
+ // User
62
+ add_filter('spu/rules/rule_match/user_type', array($this, 'rule_match_user_type'), 10, 2);
63
+ add_filter('spu/rules/rule_match/logged_user', array($this, 'rule_match_logged_user'), 10, 2);
64
+ add_filter('spu/rules/rule_match/left_comment', array($this, 'rule_match_left_comment'), 10, 2);
65
+ add_filter('spu/rules/rule_match/search_engine', array($this, 'rule_match_search_engine'), 10, 2);
66
+ add_filter('spu/rules/rule_match/same_site', array($this, 'rule_match_same_site'), 10, 2);
67
+
68
+ // Post
69
+ add_filter('spu/rules/rule_match/post_type', array($this, 'rule_match_post_type'), 10, 2);
70
+ add_filter('spu/rules/rule_match/post_id', array($this, 'rule_match_post'), 10, 2);
71
+ add_filter('spu/rules/rule_match/post', array($this, 'rule_match_post'), 10, 2);
72
+ add_filter('spu/rules/rule_match/post_category', array($this, 'rule_match_post_category'), 10, 2);
73
+ add_filter('spu/rules/rule_match/post_format', array($this, 'rule_match_post_format'), 10, 2);
74
+ add_filter('spu/rules/rule_match/post_status', array($this, 'rule_match_post_status'), 10, 2);
75
+ add_filter('spu/rules/rule_match/taxonomy', array($this, 'rule_match_taxonomy'), 10, 2);
76
+
77
+ // Page
78
+ add_filter('spu/rules/rule_match/page', array($this, 'rule_match_post'), 10, 2);
79
+ add_filter('spu/rules/rule_match/page_type', array($this, 'rule_match_page_type'), 10, 2);
80
+ add_filter('spu/rules/rule_match/page_parent', array($this, 'rule_match_page_parent'), 10, 2);
81
+ add_filter('spu/rules/rule_match/page_template', array($this, 'rule_match_page_template'), 10, 2);
82
+
83
+ //Other
84
+ add_filter('spu/rules/rule_match/mobiles', array($this, 'rule_match_mobiles'), 10, 2);
85
+ add_filter('spu/rules/rule_match/tablets', array($this, 'rule_match_tablets'), 10, 2);
86
+ add_filter('spu/rules/rule_match/desktop', array($this, 'rule_match_desktop'), 10, 2);
87
+ add_filter('spu/rules/rule_match/referrer', array($this, 'rule_match_referrer'), 10, 2);
88
+ add_filter('spu/rules/rule_match/crawlers', array($this, 'rule_match_crawlers'), 10, 2);
89
+ add_filter('spu/rules/rule_match/browser', array($this, 'rule_match_browser'), 10, 2);
90
+ add_filter('spu/rules/rule_match/query_string', array($this, 'rule_match_query_string'), 10, 2);
91
+ add_filter('spu/rules/rule_match/custom_url', array($this, 'rule_match_custom_url'), 10, 2);
92
+ add_filter('spu/rules/rule_match/keyword_url', array($this, 'rule_match_keyword_url'), 10, 2);
93
+
94
+ $this->post_id = get_queried_object_id();
95
+ $this->referrer = isset($_SERVER['HTTP_REFERER']) && !defined('DOING_AJAX') ? $_SERVER['HTTP_REFERER'] : '';
96
+ $this->query_string = isset($_SERVER['QUERY_STRING']) ? $_SERVER['QUERY_STRING'] : '';
97
+ $this->current_url = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
98
+
99
+
100
+ if( defined('DOING_AJAX') ) {
101
+
102
+ if( isset( $_REQUEST['pid'] ) ) {
103
+ $this->post_id = $_REQUEST['pid'];
104
+ }
105
+ if( !empty( $_REQUEST['referrer'] ) ) {
106
+ $this->referrer = $_REQUEST['referrer'];
107
+ }
108
+ if( !empty( $_REQUEST['current_url'] ) ) {
109
+ $this->current_url = $_REQUEST['current_url'];
110
+ }
111
+ if( !empty( $_REQUEST['query_string'] ) ) {
112
+ $this->query_string = $_REQUEST['query_string'];
113
+ }
114
+ if( !empty( $_REQUEST['is_category'] ) ) {
115
+ $this->is_category = true;
116
+ }
117
+ if( !empty( $_REQUEST['is_archive'] ) ) {
118
+ $this->is_archive = true;
119
+ }
120
+ if( !empty( $_REQUEST['is_search'] ) ) {
121
+ $this->is_search = true;
122
+ }
123
+ }
124
+
125
+ }
126
+
127
+
128
+ /*
129
+ * check_rules
130
+ *
131
+ * @since 1.0.0
132
+ */
133
+
134
+ function check_rules( $rules = '' )
135
+ {
136
+
137
+ //if no rules, add the box
138
+ $add_box = true;
139
+
140
+ if( !empty( $rules ) ) {
141
+ // vars
142
+ $add_box = false;
143
+
144
+
145
+ foreach( $rules as $group_id => $group ) {
146
+ // start of as true, this way, any rule that doesn't match will cause this varaible to false
147
+ $match_group = true;
148
+
149
+ if( is_array($group) )
150
+ {
151
+
152
+ foreach( $group as $rule_id => $rule )
153
+ {
154
+
155
+ // $match = true / false
156
+ $match = apply_filters( 'spu/rules/rule_match/' . $rule['param'] , false, $rule );
157
+
158
+ if( !$match )
159
+ {
160
+ $match_group = false;
161
+ // if one rule fails we don't need to check the rest of the rules in the group
162
+ // that way if we add geo rules down it won't get executed and will save credits
163
+ break;
164
+ }
165
+
166
+ }
167
+ }
168
+
169
+
170
+ // all rules must havematched!
171
+ if( $match_group )
172
+ {
173
+ $add_box = true;
174
+ }
175
+
176
+ }
177
+
178
+
179
+ }
180
+
181
+
182
+ return $add_box;
183
+ }
184
+
185
+ /**
186
+ * [rule_match_logged_user description]
187
+ * @param bool $match false default
188
+ * @param array $rule rule to compare
189
+ * @return boolean true if match
190
+ */
191
+ function rule_match_logged_user( $match, $rule ) {
192
+
193
+ if ( $rule['operator'] == "==" ) {
194
+
195
+ return is_user_logged_in();
196
+
197
+ } else {
198
+
199
+ return !is_user_logged_in();
200
+
201
+ }
202
+
203
+ }
204
+
205
+ /**
206
+ * [rule_match_mobiles description]
207
+ * @param bool $match false default
208
+ * @param array $rule rule to compare
209
+ * @return boolean true if match
210
+ */
211
+ function rule_match_mobiles( $match, $rule ) {
212
+
213
+ $detect = new Mobile_Detect;
214
+
215
+ if ( $rule['operator'] == "==" ) {
216
+
217
+ return $detect->isMobile();
218
+
219
+ } else {
220
+
221
+ return !$detect->isMobile();
222
+
223
+ }
224
+
225
+ }
226
+ /**
227
+ * [rule_match_browser description]
228
+ * @param bool $match false default
229
+ * @param array $rule rule to compare
230
+ * @return boolean true if match
231
+ */
232
+ function rule_match_browser( $match, $rule ) {
233
+
234
+ $detect = new Browser();
235
+
236
+ //check $detect $browsers for valid keys
237
+ if ( $rule['operator'] == "==" ) {
238
+
239
+ return $detect->getBrowser() == $rule['value'];
240
+
241
+ } else {
242
+
243
+ return $detect->getBrowser() != $rule['value'];
244
+
245
+ }
246
+
247
+ }
248
+ /**
249
+ * [rule_match_tablets description]
250
+ * @param bool $match false default
251
+ * @param array $rule rule to compare
252
+ * @return boolean true if match
253
+ */
254
+ function rule_match_tablets( $match, $rule ) {
255
+
256
+ $detect = new Mobile_Detect;
257
+
258
+ if ( $rule['operator'] == "==" ) {
259
+
260
+ return $detect->isTablet();
261
+
262
+ } else {
263
+
264
+ return !$detect->isTablet();
265
+
266
+ }
267
+
268
+ }
269
+ /**
270
+ * [rule_match_desktop description]
271
+ * @param bool $match false default
272
+ * @param array $rule rule to compare
273
+ * @return boolean true if match
274
+ */
275
+ function rule_match_desktop( $match, $rule ) {
276
+
277
+ $detect = new Mobile_Detect;
278
+
279
+ if ( $rule['operator'] == "==" ) {
280
+
281
+ return ( ! $detect->isTablet() && ! $detect->isMobile() );
282
+
283
+ } else {
284
+
285
+ return ( $detect->isTablet() || $detect->isMobile() );
286
+
287
+ }
288
+
289
+ }
290
+
291
+ /**
292
+ * [rule_match_left_comment description]
293
+ * @param bool $match false default
294
+ * @param array $rule rule to compare
295
+ * @return boolean true if match
296
+ */
297
+ function rule_match_left_comment( $match, $rule ) {
298
+
299
+ if ( $rule['operator'] == "==" ) {
300
+
301
+ return !empty( $_COOKIE['comment_author_'.COOKIEHASH] );
302
+
303
+ } else {
304
+
305
+ return empty( $_COOKIE['comment_author_'.COOKIEHASH] );
306
+
307
+ }
308
+
309
+ }
310
+ /**
311
+ * [rule_match_search_engine description]
312
+ * @param bool $match false default
313
+ * @param array $rule rule to compare
314
+ * @return boolean true if match
315
+ */
316
+ function rule_match_search_engine( $match, $rule ) {
317
+
318
+ $ref = $this->referrer;
319
+
320
+ $SE = apply_filters( 'spu/rules/search_engines', array('/search?', '.google.', 'web.info.com', 'search.', 'del.icio.us/search', 'soso.com', '/search/', '.yahoo.', '.bing.' ) );
321
+
322
+ foreach ($SE as $url) {
323
+ if ( strpos( $ref,$url ) !==false ){
324
+
325
+ return $rule['operator'] == "==" ? true : false;
326
+ }
327
+ }
328
+
329
+ return $rule['operator'] == "==" ? false : true;
330
+
331
+ }
332
+
333
+ /**
334
+ * Check for user referrer
335
+ * @param bool $match false default
336
+ * @param array $rule rule to compare
337
+ * @return boolean true if match
338
+ */
339
+ function rule_match_referrer( $match, $rule ) {
340
+
341
+ $ref = $this->referrer;
342
+
343
+ if ( strpos( $ref,$rule['value'] ) !==false ){
344
+ return $rule['operator'] == "==" ? true : false;
345
+ }
346
+
347
+ return $rule['operator'] == "==" ? false : true;
348
+
349
+ }
350
+
351
+ /**
352
+ * Check for crawlers / bots
353
+ * @param bool $match false default
354
+ * @param array $rule rule to compare
355
+ * @return boolean true if match
356
+ */
357
+ function rule_match_crawlers( $match, $rule ) {
358
+
359
+ $detect = new CrawlerDetect;
360
+
361
+ if ( $rule['operator'] == "==" ) {
362
+
363
+ return $detect->isCrawler();
364
+
365
+ } else {
366
+
367
+ return !$detect->isCrawler();
368
+
369
+ }
370
+
371
+ }
372
+
373
+ /**
374
+ * Check for query string to see if matchs all given ones
375
+ * @param bool $match false default
376
+ * @param array $rule rule to compare
377
+ * @return boolean true if match
378
+ */
379
+ function rule_match_query_string( $match, $rule ) {
380
+
381
+
382
+ $found = strpos($this->query_string, str_replace('?','', $rule['value'] ) ) > -1 ? true: false;
383
+
384
+
385
+ if ( $rule['operator'] == "==" )
386
+ return $found;
387
+
388
+ return ! $found;
389
+
390
+ }
391
+
392
+ /**
393
+ * [rule_match_same_site description]
394
+ * @param bool $match false default
395
+ * @param array $rule rule to compare
396
+ * @return boolean true if match
397
+ */
398
+ function rule_match_same_site( $match, $rule ) {
399
+
400
+
401
+ $ref = $this->referrer;
402
+
403
+ $internal = str_replace( array( 'http://','https://' ), '', home_url() );
404
+
405
+ if( $rule['operator'] == "==" ) {
406
+
407
+ return !preg_match( '~' . $internal . '~i', $ref );
408
+
409
+ } else {
410
+ return preg_match( '~' . $internal . '~i', $ref );
411
+
412
+ }
413
+
414
+ }
415
+
416
+ /*
417
+ * rule_match_post_type
418
+ *
419
+ * @since 1.0.0
420
+ */
421
+
422
+ function rule_match_post_type( $match, $rule )
423
+ {
424
+
425
+
426
+ $post_type = $this->get_post_type();
427
+
428
+
429
+ if( $rule['operator'] == "==" )
430
+ {
431
+ $match = ( $post_type === $rule['value'] );
432
+ }
433
+ elseif( $rule['operator'] == "!=" )
434
+ {
435
+ $match = ( $post_type !== $rule['value'] );
436
+ }
437
+
438
+
439
+ return $match;
440
+ }
441
+
442
+
443
+ /*
444
+ * rule_match_post
445
+ *
446
+ * @since 1.0.0
447
+ */
448
+
449
+ function rule_match_post( $match, $rule )
450
+ {
451
+
452
+ $post_id = $this->post_id;
453
+ // in case multiple ids are passed
454
+ $ids = array_map('trim',explode(',',$rule['value']));
455
+
456
+ if($rule['operator'] == "==")
457
+ {
458
+ $match = in_array($post_id, $ids );
459
+ }
460
+ elseif($rule['operator'] == "!=")
461
+ {
462
+ $match = ! in_array($post_id, $ids );
463
+ }
464
+
465
+ return $match;
466
+
467
+ }
468
+
469
+
470
+ /*
471
+ * rule_match_page_type
472
+ *
473
+ * @since 1.0.0
474
+ */
475
+
476
+ function rule_match_page_type( $match, $rule )
477
+ {
478
+
479
+
480
+ $post_id = $this->post_id;
481
+
482
+ $post = get_post( $post_id );
483
+
484
+ $post_parent = isset( $post->post_parent ) ? $post->post_parent : '';
485
+
486
+ $post_type = $this->get_post_type();
487
+
488
+ if( $rule['value'] == 'front_page') {
489
+
490
+ $front_page = (int) get_option('page_on_front');
491
+
492
+ if( $front_page !== 0 ) {
493
+
494
+ if($rule['operator'] == "==") {
495
+
496
+ $match = ( $front_page == $post_id );
497
+
498
+ } elseif($rule['operator'] == "!=") {
499
+
500
+ $match = ( $front_page != $post_id );
501
+
502
+ }
503
+ } else {
504
+ // if doing ajax is_home won't work so we do a workaround
505
+ if( defined( 'DOING_AJAX') ) {
506
+
507
+ $front_page = get_option( 'show_on_front' );
508
+
509
+ if($rule['operator'] == "==") {
510
+
511
+ $match = ( 'posts' == $front_page && $post_id == 0 );
512
+
513
+ } elseif($rule['operator'] == "!=") {
514
+
515
+ $match = !( 'posts' == $front_page && $post_id == 0 );
516
+
517
+ }
518
+
519
+
520
+ } else {
521
+
522
+ if($rule['operator'] == "==") {
523
+
524
+ $match = is_home();
525
+
526
+ } elseif($rule['operator'] == "!=") {
527
+
528
+ $match = !is_home();
529
+
530
+ }
531
+ }
532
+
533
+ }
534
+
535
+ }
536
+ elseif( $rule['value'] == 'category_page') {
537
+
538
+ if( defined( 'DOING_AJAX') ) {
539
+ if($rule['operator'] == "==") {
540
+
541
+ $match = $this->is_category;
542
+
543
+ } elseif($rule['operator'] == "!=") {
544
+
545
+ $match = !$this->is_category;
546
+
547
+ }
548
+ } else {
549
+ if ( $rule['operator'] == "==" ) {
550
+
551
+ $match = is_category();
552
+
553
+ } elseif ( $rule['operator'] == "!=" ) {
554
+
555
+ $match = ! is_category();
556
+
557
+ }
558
+ }
559
+ }
560
+ elseif( $rule['value'] == 'archive_page') {
561
+ if( defined( 'DOING_AJAX') ) {
562
+ if($rule['operator'] == "==") {
563
+
564
+ $match = $this->is_archive;
565
+
566
+ } elseif($rule['operator'] == "!=") {
567
+
568
+ $match = !$this->is_archive;
569
+
570
+ }
571
+ } else {
572
+ if ( $rule['operator'] == "==" ) {
573
+
574
+ $match = is_archive();
575
+
576
+ } elseif ( $rule['operator'] == "!=" ) {
577
+
578
+ $match = ! is_archive();
579
+
580
+ }
581
+ }
582
+ }
583
+ elseif( $rule['value'] == 'search_page') {
584
+ if( defined( 'DOING_AJAX') ) {
585
+ if($rule['operator'] == "==") {
586
+
587
+ $match = $this->is_search;
588
+
589
+ } elseif($rule['operator'] == "!=") {
590
+
591
+ $match = !$this->is_search;
592
+
593
+ }
594
+ } else {
595
+ if ( $rule['operator'] == "==" ) {
596
+
597
+ $match = is_search();
598
+
599
+ } elseif ( $rule['operator'] == "!=" ) {
600
+
601
+ $match = ! is_search();
602
+
603
+ }
604
+ }
605
+ }
606
+ elseif( $rule['value'] == 'posts_page') {
607
+
608
+ $posts_page = (int) get_option('page_for_posts');
609
+
610
+ if( $posts_page !== 0 ) {
611
+ if($rule['operator'] == "==") {
612
+
613
+ $match = ( $posts_page == $post_id );
614
+
615
+ } elseif($rule['operator'] == "!=") {
616
+
617
+ $match = ( $posts_page != $post_id );
618
+
619
+ }
620
+ } else {
621
+ // if doing ajax is_home won't work so we do a workaround
622
+ if( defined( 'DOING_AJAX') ) {
623
+
624
+
625
+ if($rule['operator'] == "==") {
626
+
627
+ $match = ( 0 === $posts_page && $post_id == 0 );
628
+
629
+ } elseif($rule['operator'] == "!=") {
630
+
631
+ $match = !( 0 === $posts_page && $post_id == 0 );
632
+
633
+ }
634
+
635
+
636
+ } else {
637
+ if($rule['operator'] == "==") {
638
+
639
+ $match = is_home();
640
+
641
+ } elseif($rule['operator'] == "!=") {
642
+
643
+ $match = !is_home();
644
+
645
+ }
646
+ }
647
+ }
648
+
649
+ }
650
+ elseif( $rule['value'] == 'top_level') {
651
+
652
+
653
+ if($rule['operator'] == "==")
654
+ {
655
+ $match = ( $post_parent == 0 );
656
+ }
657
+ elseif($rule['operator'] == "!=")
658
+ {
659
+ $match = ( $post_parent != 0 );
660
+ }
661
+
662
+ }
663
+ elseif( $rule['value'] == 'parent') {
664
+
665
+ $children = get_pages(array(
666
+ 'post_type' => $post_type,
667
+ 'child_of' => $post_id,
668
+ ));
669
+
670
+
671
+ if($rule['operator'] == "==") {
672
+ $match = ( count($children) > 0 );
673
+ }
674
+ elseif($rule['operator'] == "!=")
675
+ {
676
+ $match = ( count($children) == 0 );
677
+ }
678
+
679
+ }
680
+ elseif( $rule['value'] == 'child') {
681
+
682
+
683
+
684
+ if($rule['operator'] == "==")
685
+ {
686
+ $match = ( $post_parent != 0 );
687
+ }
688
+ elseif($rule['operator'] == "!=")
689
+ {
690
+ $match = ( $post_parent == 0 );
691
+ }
692
+
693
+ } elseif( $rule['value'] == 'all_pages') {
694
+
695
+ $match = true;
696
+
697
+ }
698
+
699
+ return $match;
700
+
701
+ }
702
+
703
+
704
+ /*
705
+ * rule_match_page_parent
706
+ *
707
+ * @since 1.0.0
708
+ */
709
+
710
+ function rule_match_page_parent( $match, $rule )
711
+ {
712
+
713
+ // validation
714
+ if( !$this->post_id )
715
+ {
716
+ return false;
717
+ }
718
+
719
+ // vars
720
+ $post = get_post( $this->post_id );
721
+
722
+ $post_parent = $post->post_parent;
723
+
724
+ if($rule['operator'] == "==")
725
+ {
726
+ $match = ( $post_parent == $rule['value'] );
727
+ }
728
+ elseif($rule['operator'] == "!=")
729
+ {
730
+ $match = ( $post_parent != $rule['value'] );
731
+ }
732
+
733
+
734
+ return $match;
735
+
736
+ }
737
+
738
+
739
+ /*
740
+ * rule_match_page_template
741
+ *
742
+ * @since 1.0.0
743
+ */
744
+
745
+ function rule_match_page_template( $match, $rule )
746
+ {
747
+
748
+
749
+ $page_template = get_post_meta( $this->post_id, '_wp_page_template', true );
750
+
751
+
752
+ if( ! $page_template ) {
753
+
754
+ if( 'page' == get_post_type( $this->post_id ) ) {
755
+
756
+ $page_template = "default";
757
+
758
+ }
759
+ }
760
+
761
+
762
+ if($rule['operator'] == "==")
763
+ {
764
+ $match = ( $page_template === $rule['value'] );
765
+ }
766
+ elseif($rule['operator'] == "!=")
767
+ {
768
+ $match = ( $page_template !== $rule['value'] );
769
+ }
770
+
771
+ return $match;
772
+
773
+ }
774
+
775
+
776
+ /*
777
+ * rule_match_post_category
778
+ *
779
+ * @since 1.0.0
780
+ */
781
+
782
+ function rule_match_post_category( $match, $rule )
783
+ {
784
+
785
+
786
+ // validate
787
+ if( !$this->post_id )
788
+ {
789
+ return false;
790
+ }
791
+ //check if we are in category page
792
+ if( ($cat = get_category($this->post_id) ) ) {
793
+ if($rule['operator'] == "==")
794
+ return $rule['value'] == $this->post_id;
795
+ return !($rule['value'] == $this->post_id);
796
+ }// otherwise think this of a single post page
797
+
798
+
799
+ // post type
800
+ $post_type = $this->get_post_type();
801
+
802
+ // vars
803
+ $taxonomies = get_object_taxonomies( $post_type );
804
+
805
+ $all_terms = get_the_terms( $this->post_id, 'category' );
806
+ if($all_terms)
807
+ {
808
+ foreach($all_terms as $all_term)
809
+ {
810
+ $terms[] = $all_term->term_id;
811
+ }
812
+ }
813
+
814
+ // no terms at all?
815
+ if( empty($terms) )
816
+ {
817
+ // If no ters, this is a new post and should be treated as if it has the "Uncategorized" (1) category ticked
818
+ if( is_array($taxonomies) && in_array('category', $taxonomies) )
819
+ {
820
+ $terms[] = '1';
821
+ }
822
+ }
823
+
824
+
825
+ if($rule['operator'] == "==")
826
+ {
827
+ $match = false;
828
+
829
+ if(!empty($terms))
830
+ {
831
+ if( in_array($rule['value'], $terms) )
832
+ {
833
+ $match = true;
834
+ }
835
+ }
836
+
837
+ }
838
+ elseif($rule['operator'] == "!=")
839
+ {
840
+ $match = true;
841
+
842
+ if($terms)
843
+ {
844
+ if( in_array($rule['value'], $terms) )
845
+ {
846
+ $match = false;
847
+ }
848
+ }
849
+
850
+ }
851
+
852
+
853
+ return $match;
854
+
855
+ }
856
+
857
+
858
+ /*
859
+ * rule_match_user_type
860
+ *
861
+ * @since 1.0.0
862
+ */
863
+
864
+ function rule_match_user_type( $match, $rule )
865
+ {
866
+ $user = wp_get_current_user();
867
+
868
+ if( $rule['operator'] == "==" )
869
+ {
870
+ if( $rule['value'] == 'super_admin' )
871
+ {
872
+ $match = is_super_admin( $user->ID );
873
+ }
874
+ else
875
+ {
876
+ $match = in_array( $rule['value'], $user->roles );
877
+ }
878
+
879
+ }
880
+ elseif( $rule['operator'] == "!=" )
881
+ {
882
+ if( $rule['value'] == 'super_admin' )
883
+ {
884
+ $match = !is_super_admin( $user->ID );
885
+ }
886
+ else
887
+ {
888
+ $match = ( ! in_array( $rule['value'], $user->roles ) );
889
+ }
890
+ }
891
+
892
+ return $match;
893
+
894
+ }
895
+
896
+
897
+
898
+
899
+ /*
900
+ * rule_match_post_format
901
+ *
902
+ * @since 1.0.0
903
+ */
904
+
905
+ function rule_match_post_format( $match, $rule )
906
+ {
907
+
908
+
909
+ // validate
910
+ if( !$this->post_id )
911
+ {
912
+ return false;
913
+ }
914
+
915
+ $post_type = $this->get_post_type();
916
+
917
+
918
+ // does post_type support 'post-format'
919
+ if( post_type_supports( $post_type, 'post-formats' ) )
920
+ {
921
+ $post_format = get_post_format( $this->post_id );
922
+
923
+ if( $post_format === false )
924
+ {
925
+ $post_format = 'standard';
926
+ }
927
+ }
928
+
929
+
930
+
931
+ if($rule['operator'] == "==")
932
+ {
933
+ $match = ( $post_format === $rule['value'] );
934
+
935
+ }
936
+ elseif($rule['operator'] == "!=")
937
+ {
938
+ $match = ( $post_format !== $rule['value'] );
939
+ }
940
+
941
+
942
+
943
+ return $match;
944
+
945
+ }
946
+
947
+
948
+ /*
949
+ * rule_match_post_status
950
+ *
951
+ * @since 1.0.0
952
+ */
953
+
954
+ function rule_match_post_status( $match, $rule )
955
+ {
956
+
957
+
958
+ // validate
959
+ if( !$this->post_id )
960
+ {
961
+ return false;
962
+ }
963
+
964
+
965
+ // vars
966
+ $post_status = get_post_status( $this->post_id );
967
+
968
+
969
+ // auto-draft = draft
970
+ if( $post_status == 'auto-draft' )
971
+ {
972
+ $post_status = 'draft';
973
+ }
974
+
975
+
976
+ // match
977
+ if($rule['operator'] == "==")
978
+ {
979
+ $match = ( $post_status === $rule['value'] );
980
+
981
+ }
982
+ elseif($rule['operator'] == "!=")
983
+ {
984
+ $match = ( $post_status !== $rule['value'] );
985
+ }
986
+
987
+
988
+ // return
989
+ return $match;
990
+
991
+ }
992
+
993
+
994
+ /*
995
+ * rule_match_taxonomy
996
+ *
997
+ * @since 1.0.0
998
+ */
999
+
1000
+ function rule_match_taxonomy( $match, $rule )
1001
+ {
1002
+
1003
+ // validate
1004
+ if( !$this->post_id )
1005
+ {
1006
+ return false;
1007
+ }
1008
+ // if we are inside taxonomy archive page (Ajax mode)
1009
+ if( $this->is_archive ){
1010
+ if($rule['operator'] == "==")
1011
+ return $rule['value'] == $this->post_id;
1012
+ else
1013
+ return $rule['value'] != $this->post_id;
1014
+ }
1015
+
1016
+ $qo = get_queried_object();
1017
+
1018
+ // if we are inside taxonomy archive page
1019
+ if( isset($qo->term_id) && $qo->term_id == $this->post_id ){
1020
+ if($rule['operator'] == "==")
1021
+ return $rule['value'] == $qo->term_id;
1022
+ else
1023
+ return $rule['value'] != $qo->term_id;
1024
+ } else {
1025
+ // post type
1026
+ $post_type = $this->get_post_type();
1027
+ // vars
1028
+ $taxonomies = get_object_taxonomies( $post_type );
1029
+ }
1030
+
1031
+ $terms = array();
1032
+
1033
+
1034
+ if( is_array($taxonomies) )
1035
+ {
1036
+ foreach( $taxonomies as $tax )
1037
+ {
1038
+ $all_terms = get_the_terms( $this->post_id, $tax );
1039
+ if($all_terms)
1040
+ {
1041
+ foreach($all_terms as $all_term)
1042
+ {
1043
+ $terms[] = $all_term->term_id;
1044
+ }
1045
+ }
1046
+ }
1047
+ }
1048
+
1049
+ // no terms at all?
1050
+ if( empty($terms) )
1051
+ {
1052
+ // If no ters, this is a new post and should be treated as if it has the "Uncategorized" (1) category ticked
1053
+ if( is_array($taxonomies) && in_array('category', $taxonomies) )
1054
+ {
1055
+ $terms[] = '1';
1056
+ }
1057
+ }
1058
+
1059
+
1060
+
1061
+ if($rule['operator'] == "==")
1062
+ {
1063
+ $match = false;
1064
+
1065
+ if($terms)
1066
+ {
1067
+ if( in_array($rule['value'], $terms) )
1068
+ {
1069
+ $match = true;
1070
+ }
1071
+ }
1072
+
1073
+ }
1074
+ elseif($rule['operator'] == "!=")
1075
+ {
1076
+ $match = true;
1077
+
1078
+ if($terms)
1079
+ {
1080
+ if( in_array($rule['value'], $terms) )
1081
+ {
1082
+ $match = false;
1083
+ }
1084
+ }
1085
+
1086
+ }
1087
+
1088
+
1089
+ return $match;
1090
+
1091
+ }
1092
+
1093
+ /**
1094
+ * Helper function to get post type
1095
+ * @since 1.2.3
1096
+ * @return string
1097
+ *
1098
+ */
1099
+ function get_post_type(){
1100
+ global $wp_query;
1101
+
1102
+ $post_type = isset( $wp_query->query_vars['post_type'] ) ? $wp_query->query_vars['post_type'] : '';
1103
+
1104
+ $post_type = empty( $post_type ) ? get_post_type($this->post_id) : get_post_type();
1105
+
1106
+ return $post_type;
1107
+ }
1108
+
1109
+ /**
1110
+ * Check for custom url
1111
+ *
1112
+ * @param array $rule rule to compare
1113
+ *
1114
+ * @return boolean true if match
1115
+ */
1116
+ public function rule_match_custom_url( $match, $rule ) {
1117
+
1118
+ $wide_search = strpos($rule['value'],'*') !== false ? true : false;
1119
+
1120
+ if( $wide_search ) {
1121
+ if( strpos( $this->current_url, trim($rule['value'],'*') ) === 0 ) {
1122
+ return ( $rule['operator'] == "==" );
1123
+ }
1124
+ return ! ( $rule['operator'] == "==" );
1125
+ }
1126
+
1127
+ if( $rule['operator'] == "==" )
1128
+ return ($this->current_url == $rule['value']);
1129
+
1130
+ return ! ($this->current_url == $rule['value']);
1131
+
1132
+ }
1133
+
1134
+ /**
1135
+ * Check for keyword url
1136
+ *
1137
+ * @param array $rule rule to compare
1138
+ *
1139
+ * @return boolean true if match
1140
+ */
1141
+ function rule_match_keyword_url($match, $rule) {
1142
+
1143
+ $search_url = str_replace(site_url(), '', $this->current_url);
1144
+
1145
+ if( strlen($search_url) > 0 && strpos($search_url, trim($rule['value'])) !== false )
1146
+ return ($rule['operator'] == "==");
1147
+ else
1148
+ return !($rule['operator'] == "==");
1149
+
1150
+ }
 
 
 
 
 
 
1151
  }
uninstall.php CHANGED
@@ -1,22 +1,22 @@
1
- <?php
2
- /**
3
- * Uninstall file. If selected all data from popups plugin will be deleted
4
- */
5
- if( !defined( 'ABSPATH') && !defined('WP_UNINSTALL_PLUGIN') ) exit();
6
-
7
- $opts = get_option( 'spu_settings' );
8
-
9
- if( isset( $opts['uninstall']) && '1' == $opts['uninstall'] ) {
10
- // delete settings
11
- delete_option('spu_settings');
12
- delete_option('spu-version');
13
- // delete popups
14
- global $wpdb;
15
- // IF wpml is active and spucpt is translated get correct ids for language
16
- $ids = $wpdb->get_results( "SELECT ID FROM $wpdb->posts WHERE post_type='spucpt'");
17
- if( !empty( $ids ) ) {
18
- foreach( $ids as $p ) {
19
- wp_delete_post( $p->ID, true);
20
- }
21
- }
22
- }
1
+ <?php
2
+ /**
3
+ * Uninstall file. If selected all data from popups plugin will be deleted
4
+ */
5
+ if( !defined( 'ABSPATH') && !defined('WP_UNINSTALL_PLUGIN') ) exit();
6
+
7
+ $opts = get_option( 'spu_settings' );
8
+
9
+ if( isset( $opts['uninstall']) && '1' == $opts['uninstall'] ) {
10
+ // delete settings
11
+ delete_option('spu_settings');
12
+ delete_option('spu-version');
13
+ // delete popups
14
+ global $wpdb;
15
+ // IF wpml is active and spucpt is translated get correct ids for language
16
+ $ids = $wpdb->get_results( "SELECT ID FROM $wpdb->posts WHERE post_type='spucpt'");
17
+ if( !empty( $ids ) ) {
18
+ foreach( $ids as $p ) {
19
+ wp_delete_post( $p->ID, true);
20
+ }
21
+ }
22
+ }
vendor/autoload.php CHANGED
@@ -1,7 +1,7 @@
1
- <?php
2
-
3
- // autoload.php @generated by Composer
4
-
5
- require_once __DIR__ . '/composer/autoload_real.php';
6
-
7
- return ComposerAutoloaderInit28a0833b49959d9021dc40cd45dfc52b::getLoader();
1
+ <?php
2
+
3
+ // autoload.php @generated by Composer
4
+
5
+ require_once __DIR__ . '/composer/autoload_real.php';
6
+
7
+ return ComposerAutoloaderInit28a0833b49959d9021dc40cd45dfc52b::getLoader();
vendor/cbschuld/browser.php/.travis.yml CHANGED
@@ -1,10 +1,10 @@
1
- language: php
2
-
3
- php:
4
- - 7.0
5
- - 5.6
6
- - 5.5
7
- - 5.4
8
- - 5.3
9
-
10
- script: phpunit --configuration phpunit.xml.dist
1
+ language: php
2
+
3
+ php:
4
+ - 7.0
5
+ - 5.6
6
+ - 5.5
7
+ - 5.4
8
+ - 5.3
9
+
10
+ script: phpunit --configuration phpunit.xml.dist
vendor/cbschuld/browser.php/LICENSE.md CHANGED
@@ -1,7 +1,7 @@
1
- Copyright (c) 2013 Chris Schuld
2
-
3
- Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
4
-
5
- The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
6
-
7
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
1
+ Copyright (c) 2013 Chris Schuld
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
4
+
5
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
6
+
7
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
vendor/cbschuld/browser.php/README.md CHANGED
@@ -1,149 +1,149 @@
1
- Browser.php
2
- =============
3
-
4
- [![Build Status](https://travis-ci.org/cbschuld/Browser.php.png?branch=master)](https://travis-ci.org/cbschuld/Browser.php)
5
-
6
- Helps detect the user's browser and platform at the PHP level via the user agent
7
-
8
-
9
- Installation
10
- ============
11
-
12
- To install, simply `require` the `Browser.php` file under `lib`.
13
-
14
- You can also install it via `Composer` by using the [Packagist archive](https://packagist.org/packages/cbschuld/browser.php).
15
-
16
-
17
- Background
18
- ============
19
-
20
- Detecting the user's browser type and version is helpful in web applications that harness some of the newer bleeding edge concepts. With the browser type and version you can notify users about challenges they may experience and suggest they upgrade before using such application. Not a great idea on a large scale public site; but on a private application this type of check can be helpful.
21
-
22
- In an active project of mine we have a pretty graphically intensive and visually appealing user interface which leverages a lot of transparent PNG files. Because we all know how great IE6 supports PNG files it was necessary for us to tell our users the lack of power their browser has in a kind way.
23
-
24
- Searching for a way to do this at the PHP layer and not at the client layer was more of a challenge than I would have guessed; the only script available was written by Gary White and Gary no longer maintains this script because of reliability. I do agree 100% with Gary about the readability; however, there are realistic reasons to desire the user.s browser and browser version and if your visitor is not echoing a false user agent we can take an educated guess.
25
-
26
- I based this solution off of Gary White.s original solution but added a few things:
27
-
28
- I added the ability to view the return values as class constants to increase the readability
29
-
30
- * Added version detectionf for edge via [pixelbacon](https://github.com/pixelbacon)
31
- * Updated the version detection for Amaya
32
- * Updated the version detection for Firefox
33
- * Updated the version detection for Lynx
34
- * Updated the version detection for WebTV
35
- * Updated the version detection for NetPositive
36
- * Updated the version detection for IE
37
- * Updated the version detection for OmniWeb
38
- * Updated the version detection for iCab
39
- * Updated the version detection for Safari
40
- * Added detection for Chrome
41
- * Added detection for iPhone
42
- * Added detection for robots
43
- * Added detection for mobile devices
44
- * Added detection for BlackBerry
45
- * Added detection for iPhone
46
- * Added detection for iPad
47
- * Added detection for Android
48
- * Removed Netscape checks
49
- * Updated Safari to remove mobile devices (iPhone)
50
-
51
- **This solution identifies the following Operating Systems:**
52
-
53
- * Windows (Browser::PLATFORM_WINDOWS)
54
- * Windows CE (Browser::PLATFORM_WINDOWS_CE)
55
- * Apple (Browser::PLATFORM_APPLE)
56
- * Linux (Browser::PLATFORM_LINUX)
57
- * Android (Browser::PLATFORM_ANDROID)
58
- * OS/2 (Browser::PLATFORM_OS2)
59
- * BeOS (Browser::PLATFORM_BEOS)
60
- * iPhone (Browser::PLATFORM_IPHONE)
61
- * iPod (Browser::PLATFORM_IPOD)
62
- * BlackBerry (Browser::PLATFORM_BLACKBERRY)
63
- * FreeBSD (Browser::PLATFORM_FREEBSD)
64
- * OpenBSD (Browser::PLATFORM_OPENBSD)
65
- * NetBSD (Browser::PLATFORM_NETBSD)
66
- * SunOS (Browser::PLATFORM_SUNOS)
67
- * OpenSolaris (Browser::PLATFORM_OPENSOLARIS)
68
- * iPad (Browser::PLATFORM_IPAD)
69
-
70
- **This solution identifies the following Browsers and does a best-guess on the version:**
71
-
72
- * Opera (Browser::BROWSER_OPERA)
73
- * WebTV (Browser::BROWSER_WEBTV)
74
- * NetPositive (Browser::BROWSER_NETPOSITIVE)
75
- * Edge (Browser::BROWSER_EDGE)
76
- * Internet Explorer (Browser::BROWSER_IE)
77
- * Pocket Internet Explorer (Browser::BROWSER_POCKET_IE)
78
- * Galeon (Browser::BROWSER_GALEON)
79
- * Konqueror (Browser::BROWSER_KONQUEROR)
80
- * iCab (Browser::BROWSER_ICAB)
81
- * OmniWeb (Browser::BROWSER_OMNIWEB)
82
- * Phoenix (Browser::BROWSER_PHOENIX)
83
- * Firebird (Browser::BROWSER_FIREBIRD)
84
- * Firefox (Browser::BROWSER_FIREFOX)
85
- * Mozilla (Browser::BROWSER_MOZILLA)
86
- * Amaya (Browser::BROWSER_AMAYA)
87
- * Lynx (Browser::BROWSER_LYNX)
88
- * Safari (Browser::BROWSER_SAFARI)
89
- * iPhone (Browser::BROWSER_IPHONE)
90
- * iPod (Browser::BROWSER_IPOD)
91
- * Google.s Android(Browser::BROWSER_ANDROID)
92
- * Google.s Chrome(Browser::BROWSER_CHROME)
93
- * GoogleBot(Browser::BROWSER_GOOGLEBOT)
94
- * Yahoo!.s Slurp(Browser::BROWSER_SLURP)
95
- * W3C.s Validator(Browser::BROWSER_W3CVALIDATOR)
96
- * BlackBerry(Browser::BROWSER_BLACKBERRY)
97
-
98
- **Typical Usage:**
99
-
100
- ```php
101
- $browser = new Browser();
102
- if( $browser->getBrowser() == Browser::BROWSER_FIREFOX && $browser->getVersion() >= 2 ) {
103
- echo 'You have FireFox version 2 or greater';
104
- }
105
- ```
106
-
107
- 12/9/2008 Update
108
- * removed an unused constant and renamed the constructor to use the PHP magic method __construct (thanks to Robin for locating the legacy constant and suggesting the use of the magic method).
109
-
110
- 2/19/2009 Update
111
- * updated typical usage to show a correct example! (thanks David!)
112
-
113
- 2/24/2009 Update
114
- * fixed typo in the usage! (thanks Adam!)
115
-
116
- 3/14/2009 Update
117
- * added support for the iPod; added iPod and iPhone as platforms; added Google.s Android
118
-
119
- 4/22/2009 Update
120
- * added support for GoogleBot, the W3C Validator and Yahoo! Slurp
121
-
122
- 4/27/2009 Update
123
- * John pointed out a terrible typo (see below) . removed the typo
124
-
125
- 11/08/2009 Update
126
- * A lot of changes to the script, thank you to everyone for the suggestions and emails. This release should add all of the requested features. Added BlackBerry, mobile detection, Opera Mini support, robot detection, Opera 10.s UserAgent .mess., detection for IceCat and Shiretoko!
127
-
128
- 3/7/2010 Update
129
- * Version 1.7 was a *MAJOR* Rebuild (preg_match and other .slow. routine removal(s)) included the following changes:
130
- * Almost allof Gary.s original code has been replaced
131
- * Large PHPUNIT testing environment created to validate new releases and additions
132
- * Added FreeBSD Platform
133
- * Added OpenBSD Platform
134
- * Added NetBSD Platform
135
- * Added SunOS Platform
136
- * Added OpenSolaris Platform
137
- * Added support of the Iceweazel Browser
138
- * Added isChromeFrame() call to check if chromeframe is in use
139
- * Moved the Opera check in front of the Firefox check due to legacy Opera User Agents
140
- * Added the __toString() method (Thanks Deano)
141
-
142
- 4/27/2010: Update (Version 1.8)
143
- * Added iPad support
144
-
145
- 8/20/2010: Update (Version 1.9)
146
- * Added MSN Explorer Browser
147
- * Added Bing/MSN Robot
148
- * Added the Android Platform
149
- * Fixed issue with Android 1.6/2.2
1
+ Browser.php
2
+ =============
3
+
4
+ [![Build Status](https://travis-ci.org/cbschuld/Browser.php.png?branch=master)](https://travis-ci.org/cbschuld/Browser.php)
5
+
6
+ Helps detect the user's browser and platform at the PHP level via the user agent
7
+
8
+
9
+ Installation
10
+ ============
11
+
12
+ To install, simply `require` the `Browser.php` file under `lib`.
13
+
14
+ You can also install it via `Composer` by using the [Packagist archive](https://packagist.org/packages/cbschuld/browser.php).
15
+
16
+
17
+ Background
18
+ ============
19
+
20
+ Detecting the user's browser type and version is helpful in web applications that harness some of the newer bleeding edge concepts. With the browser type and version you can notify users about challenges they may experience and suggest they upgrade before using such application. Not a great idea on a large scale public site; but on a private application this type of check can be helpful.
21
+
22
+ In an active project of mine we have a pretty graphically intensive and visually appealing user interface which leverages a lot of transparent PNG files. Because we all know how great IE6 supports PNG files it was necessary for us to tell our users the lack of power their browser has in a kind way.
23
+
24
+ Searching for a way to do this at the PHP layer and not at the client layer was more of a challenge than I would have guessed; the only script available was written by Gary White and Gary no longer maintains this script because of reliability. I do agree 100% with Gary about the readability; however, there are realistic reasons to desire the user.s browser and browser version and if your visitor is not echoing a false user agent we can take an educated guess.
25
+
26
+ I based this solution off of Gary White.s original solution but added a few things:
27
+
28
+ I added the ability to view the return values as class constants to increase the readability
29
+
30
+ * Added version detectionf for edge via [pixelbacon](https://github.com/pixelbacon)
31
+ * Updated the version detection for Amaya
32
+ * Updated the version detection for Firefox
33
+ * Updated the version detection for Lynx
34
+ * Updated the version detection for WebTV
35
+ * Updated the version detection for NetPositive
36
+ * Updated the version detection for IE
37
+ * Updated the version detection for OmniWeb
38
+ * Updated the version detection for iCab
39
+ * Updated the version detection for Safari
40
+ * Added detection for Chrome
41
+ * Added detection for iPhone
42
+ * Added detection for robots
43
+ * Added detection for mobile devices
44
+ * Added detection for BlackBerry
45
+ * Added detection for iPhone
46
+ * Added detection for iPad
47
+ * Added detection for Android
48
+ * Removed Netscape checks
49
+ * Updated Safari to remove mobile devices (iPhone)
50
+
51
+ **This solution identifies the following Operating Systems:**
52
+
53
+ * Windows (Browser::PLATFORM_WINDOWS)
54
+ * Windows CE (Browser::PLATFORM_WINDOWS_CE)
55
+ * Apple (Browser::PLATFORM_APPLE)
56
+ * Linux (Browser::PLATFORM_LINUX)
57
+ * Android (Browser::PLATFORM_ANDROID)
58
+ * OS/2 (Browser::PLATFORM_OS2)
59
+ * BeOS (Browser::PLATFORM_BEOS)
60
+ * iPhone (Browser::PLATFORM_IPHONE)
61
+ * iPod (Browser::PLATFORM_IPOD)
62
+ * BlackBerry (Browser::PLATFORM_BLACKBERRY)
63
+ * FreeBSD (Browser::PLATFORM_FREEBSD)
64
+ * OpenBSD (Browser::PLATFORM_OPENBSD)
65
+ * NetBSD (Browser::PLATFORM_NETBSD)
66
+ * SunOS (Browser::PLATFORM_SUNOS)
67
+ * OpenSolaris (Browser::PLATFORM_OPENSOLARIS)
68
+ * iPad (Browser::PLATFORM_IPAD)
69
+
70
+ **This solution identifies the following Browsers and does a best-guess on the version:**
71
+
72
+ * Opera (Browser::BROWSER_OPERA)
73
+ * WebTV (Browser::BROWSER_WEBTV)
74
+ * NetPositive (Browser::BROWSER_NETPOSITIVE)
75
+ * Edge (Browser::BROWSER_EDGE)
76
+ * Internet Explorer (Browser::BROWSER_IE)
77
+ * Pocket Internet Explorer (Browser::BROWSER_POCKET_IE)
78
+ * Galeon (Browser::BROWSER_GALEON)
79
+ * Konqueror (Browser::BROWSER_KONQUEROR)
80
+ * iCab (Browser::BROWSER_ICAB)
81
+ * OmniWeb (Browser::BROWSER_OMNIWEB)
82
+ * Phoenix (Browser::BROWSER_PHOENIX)
83
+ * Firebird (Browser::BROWSER_FIREBIRD)
84
+ * Firefox (Browser::BROWSER_FIREFOX)
85
+ * Mozilla (Browser::BROWSER_MOZILLA)
86
+ * Amaya (Browser::BROWSER_AMAYA)
87
+ * Lynx (Browser::BROWSER_LYNX)
88
+ * Safari (Browser::BROWSER_SAFARI)
89
+ * iPhone (Browser::BROWSER_IPHONE)
90
+ * iPod (Browser::BROWSER_IPOD)
91
+ * Google.s Android(Browser::BROWSER_ANDROID)
92
+ * Google.s Chrome(Browser::BROWSER_CHROME)
93
+ * GoogleBot(Browser::BROWSER_GOOGLEBOT)
94
+ * Yahoo!.s Slurp(Browser::BROWSER_SLURP)
95
+ * W3C.s Validator(Browser::BROWSER_W3CVALIDATOR)
96
+ * BlackBerry(Browser::BROWSER_BLACKBERRY)
97
+
98
+ **Typical Usage:**
99
+
100
+ ```php
101
+ $browser = new Browser();
102
+ if( $browser->getBrowser() == Browser::BROWSER_FIREFOX && $browser->getVersion() >= 2 ) {
103
+ echo 'You have FireFox version 2 or greater';
104
+ }
105
+ ```
106
+
107
+ 12/9/2008 Update
108
+ * removed an unused constant and renamed the constructor to use the PHP magic method __construct (thanks to Robin for locating the legacy constant and suggesting the use of the magic method).
109
+
110
+ 2/19/2009 Update
111
+ * updated typical usage to show a correct example! (thanks David!)
112
+
113
+ 2/24/2009 Update
114
+ * fixed typo in the usage! (thanks Adam!)
115
+
116
+ 3/14/2009 Update
117
+ * added support for the iPod; added iPod and iPhone as platforms; added Google.s Android
118
+
119
+ 4/22/2009 Update
120
+ * added support for GoogleBot, the W3C Validator and Yahoo! Slurp
121
+
122
+ 4/27/2009 Update
123
+ * John pointed out a terrible typo (see below) . removed the typo
124
+
125
+ 11/08/2009 Update
126
+ * A lot of changes to the script, thank you to everyone for the suggestions and emails. This release should add all of the requested features. Added BlackBerry, mobile detection, Opera Mini support, robot detection, Opera 10.s UserAgent .mess., detection for IceCat and Shiretoko!
127
+
128
+ 3/7/2010 Update
129
+ * Version 1.7 was a *MAJOR* Rebuild (preg_match and other .slow. routine removal(s)) included the following changes:
130
+ * Almost allof Gary.s original code has been replaced
131
+ * Large PHPUNIT testing environment created to validate new releases and additions
132
+ * Added FreeBSD Platform
133
+ * Added OpenBSD Platform
134
+ * Added NetBSD Platform
135
+ * Added SunOS Platform
136
+ * Added OpenSolaris Platform
137
+ * Added support of the Iceweazel Browser
138
+ * Added isChromeFrame() call to check if chromeframe is in use
139
+ * Moved the Opera check in front of the Firefox check due to legacy Opera User Agents
140
+ * Added the __toString() method (Thanks Deano)
141
+
142
+ 4/27/2010: Update (Version 1.8)
143
+ * Added iPad support
144
+
145
+ 8/20/2010: Update (Version 1.9)
146
+ * Added MSN Explorer Browser
147
+ * Added Bing/MSN Robot
148
+ * Added the Android Platform
149
+ * Fixed issue with Android 1.6/2.2
vendor/cbschuld/browser.php/composer.json CHANGED
@@ -1,22 +1,22 @@
1
- {
2
- "name": "cbschuld/browser.php",
3
- "description": "A PHP Class to detect a user's Browser",
4
- "keywords": ["browser", "user agent", "detection"],
5
- "homepage": "http://chrisschuld.com/projects/browser-php-detecting-a-users-browser-from-php.html",
6
- "license": "MIT",
7
- "authors": [
8
- {
9
- "name": "Chris Schuld",
10
- "email": "chris@chrisschuld.com",
11
- "homepage": "http://chrisschuld.com"
12
- }
13
- ],
14
- "autoload": {
15
- "files": ["lib/Browser.php"]
16
- },
17
- "extra": {
18
- "branch-alias": {
19
- "dev-master": "1.95-dev"
20
- }
21
- }
22
- }
1
+ {
2
+ "name": "cbschuld/browser.php",
3
+ "description": "A PHP Class to detect a user's Browser",
4
+ "keywords": ["browser", "user agent", "detection"],
5
+ "homepage": "http://chrisschuld.com/projects/browser-php-detecting-a-users-browser-from-php.html",
6
+ "license": "MIT",
7
+ "authors": [
8
+ {
9
+ "name": "Chris Schuld",
10
+ "email": "chris@chrisschuld.com",
11
+ "homepage": "http://chrisschuld.com"
12
+ }
13
+ ],
14
+ "autoload": {
15
+ "files": ["lib/Browser.php"]
16
+ },
17
+ "extra": {
18
+ "branch-alias": {
19
+ "dev-master": "1.95-dev"
20
+ }
21
+ }
22
+ }
vendor/cbschuld/browser.php/lib/Browser.php CHANGED
@@ -1,1732 +1,1732 @@
1
- <?php
2
-
3
- /**
4
- * File: Browser.php
5
- * Author: Chris Schuld (http://chrisschuld.com/)
6
- * Last Modified: July 22nd, 2016
7
- * @version 2.0
8
- * @package PegasusPHP
9
- *
10
- * Copyright (C) 2008-2010 Chris Schuld (chris@chrisschuld.com)
11
- *
12
- * This program is free software; you can redistribute it and/or
13
- * modify it under the terms of the GNU General Public License as
14
- * published by the Free Software Foundation; either version 2 of
15
- * the License, or (at your option) any later version.
16
- *
17
- * This program is distributed in the hope that it will be useful,
18
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
19
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20
- * GNU General Public License for more details at:
21
- * http://www.gnu.org/copyleft/gpl.html
22
- *
23
- *
24
- * Typical Usage:
25
- *
26
- * $browser = new Browser();
27
- * if( $browser->getBrowser() == Browser::BROWSER_FIREFOX && $browser->getVersion() >= 2 ) {
28
- * echo 'You have FireFox version 2 or greater';
29
- * }
30
- *
31
- * User Agents Sampled from: http://www.useragentstring.com/
32
- *
33
- * This implementation is based on the original work from Gary White
34
- * http://apptools.com/phptools/browser/
35
- *
36
- */
37
- class Browser
38
- {
39
- private $_agent = '';
40
- private $_browser_name = '';
41
- private $_version = '';
42
- private $_platform = '';
43
- private $_os = '';
44
- private $_is_aol = false;
45
- private $_is_mobile = false;
46
- private $_is_tablet = false;
47
- private $_is_robot = false;
48
- private $_is_facebook = false;
49
- private $_aol_version = '';
50
-
51
- const BROWSER_UNKNOWN = 'unknown';
52
- const VERSION_UNKNOWN = 'unknown';
53
-
54
- const BROWSER_OPERA = 'Opera'; // http://www.opera.com/
55
- const BROWSER_OPERA_MINI = 'Opera Mini'; // http://www.opera.com/mini/
56
- const BROWSER_WEBTV = 'WebTV'; // http://www.webtv.net/pc/
57
- const BROWSER_EDGE = 'Edge'; // https://www.microsoft.com/edge
58
- const BROWSER_IE = 'Internet Explorer'; // http://www.microsoft.com/ie/
59
- const BROWSER_POCKET_IE = 'Pocket Internet Explorer'; // http://en.wikipedia.org/wiki/Internet_Explorer_Mobile
60
- const BROWSER_KONQUEROR = 'Konqueror'; // http://www.konqueror.org/
61
- const BROWSER_ICAB = 'iCab'; // http://www.icab.de/
62
- const BROWSER_OMNIWEB = 'OmniWeb'; // http://www.omnigroup.com/applications/omniweb/
63
- const BROWSER_FIREBIRD = 'Firebird'; // http://www.ibphoenix.com/
64
- const BROWSER_FIREFOX = 'Firefox'; // http://www.mozilla.com/en-US/firefox/firefox.html
65
- const BROWSER_ICEWEASEL = 'Iceweasel'; // http://www.geticeweasel.org/
66
- const BROWSER_SHIRETOKO = 'Shiretoko'; // http://wiki.mozilla.org/Projects/shiretoko
67
- const BROWSER_MOZILLA = 'Mozilla'; // http://www.mozilla.com/en-US/
68
- const BROWSER_AMAYA = 'Amaya'; // http://www.w3.org/Amaya/
69
- const BROWSER_LYNX = 'Lynx'; // http://en.wikipedia.org/wiki/Lynx
70
- const BROWSER_SAFARI = 'Safari'; // http://apple.com
71
- const BROWSER_IPHONE = 'iPhone'; // http://apple.com
72
- const BROWSER_IPOD = 'iPod'; // http://apple.com
73
- const BROWSER_IPAD = 'iPad'; // http://apple.com
74
- const BROWSER_CHROME = 'Chrome'; // http://www.google.com/chrome
75
- const BROWSER_ANDROID = 'Android'; // http://www.android.com/
76
- const BROWSER_GOOGLEBOT = 'GoogleBot'; // http://en.wikipedia.org/wiki/Googlebot
77
-
78
- const BROWSER_YANDEXBOT = 'YandexBot'; // http://yandex.com/bots
79
- const BROWSER_YANDEXIMAGERESIZER_BOT = 'YandexImageResizer'; // http://yandex.com/bots
80
- const BROWSER_YANDEXIMAGES_BOT = 'YandexImages'; // http://yandex.com/bots
81
- const BROWSER_YANDEXVIDEO_BOT = 'YandexVideo'; // http://yandex.com/bots
82
- const BROWSER_YANDEXMEDIA_BOT = 'YandexMedia'; // http://yandex.com/bots
83
- const BROWSER_YANDEXBLOGS_BOT = 'YandexBlogs'; // http://yandex.com/bots
84
- const BROWSER_YANDEXFAVICONS_BOT = 'YandexFavicons'; // http://yandex.com/bots
85
- const BROWSER_YANDEXWEBMASTER_BOT = 'YandexWebmaster'; // http://yandex.com/bots
86
- const BROWSER_YANDEXDIRECT_BOT = 'YandexDirect'; // http://yandex.com/bots
87
- const BROWSER_YANDEXMETRIKA_BOT = 'YandexMetrika'; // http://yandex.com/bots
88
- const BROWSER_YANDEXNEWS_BOT = 'YandexNews'; // http://yandex.com/bots
89
- const BROWSER_YANDEXCATALOG_BOT = 'YandexCatalog'; // http://yandex.com/bots
90
-
91
- const BROWSER_SLURP = 'Yahoo! Slurp'; // http://en.wikipedia.org/wiki/Yahoo!_Slurp
92
- const BROWSER_W3CVALIDATOR = 'W3C Validator'; // http://validator.w3.org/
93
- const BROWSER_BLACKBERRY = 'BlackBerry'; // http://www.blackberry.com/
94
- const BROWSER_ICECAT = 'IceCat'; // http://en.wikipedia.org/wiki/GNU_IceCat
95
- const BROWSER_NOKIA_S60 = 'Nokia S60 OSS Browser'; // http://en.wikipedia.org/wiki/Web_Browser_for_S60
96
- const BROWSER_NOKIA = 'Nokia Browser'; // * all other WAP-based browsers on the Nokia Platform
97
- const BROWSER_MSN = 'MSN Browser'; // http://explorer.msn.com/
98
- const BROWSER_MSNBOT = 'MSN Bot'; // http://search.msn.com/msnbot.htm
99
- const BROWSER_BINGBOT = 'Bing Bot'; // http://en.wikipedia.org/wiki/Bingbot
100
- const BROWSER_VIVALDI = 'Vivalidi'; // https://vivaldi.com/
101
- const BROWSER_YANDEX = 'Yandex'; // https://browser.yandex.ua/
102
-
103
- const BROWSER_NETSCAPE_NAVIGATOR = 'Netscape Navigator'; // http://browser.netscape.com/ (DEPRECATED)
104
- const BROWSER_GALEON = 'Galeon'; // http://galeon.sourceforge.net/ (DEPRECATED)
105
- const BROWSER_NETPOSITIVE = 'NetPositive'; // http://en.wikipedia.org/wiki/NetPositive (DEPRECATED)
106
- const BROWSER_PHOENIX = 'Phoenix'; // http://en.wikipedia.org/wiki/History_of_Mozilla_Firefox (DEPRECATED)
107
- const BROWSER_PLAYSTATION = "PlayStation";
108
- const BROWSER_SAMSUNG = "SamsungBrowser";
109
- const BROWSER_SILK = "Silk";
110
- const BROWSER_I_FRAME = "Iframely";
111
- const BROWSER_COCOA = "CocoaRestClient";
112
-
113
- const PLATFORM_UNKNOWN = 'unknown';
114
- const PLATFORM_WINDOWS = 'Windows';
115
- const PLATFORM_WINDOWS_CE = 'Windows CE';
116
- const PLATFORM_APPLE = 'Apple';
117
- const PLATFORM_LINUX = 'Linux';
118
- const PLATFORM_OS2 = 'OS/2';
119
- const PLATFORM_BEOS = 'BeOS';
120
- const PLATFORM_IPHONE = 'iPhone';
121
- const PLATFORM_IPOD = 'iPod';
122
- const PLATFORM_IPAD = 'iPad';
123
- const PLATFORM_BLACKBERRY = 'BlackBerry';
124
- const PLATFORM_NOKIA = 'Nokia';
125
- const PLATFORM_FREEBSD = 'FreeBSD';
126
- const PLATFORM_OPENBSD = 'OpenBSD';
127
- const PLATFORM_NETBSD = 'NetBSD';
128
- const PLATFORM_SUNOS = 'SunOS';
129
- const PLATFORM_OPENSOLARIS = 'OpenSolaris';
130
- const PLATFORM_ANDROID = 'Android';
131
- const PLATFORM_PLAYSTATION = "Sony PlayStation";
132
- const PLATFORM_ROKU = "Roku";
133
- const PLATFORM_APPLE_TV = "Apple TV";
134
- const PLATFORM_TERMINAL = "Terminal";
135
- const PLATFORM_FIRE_OS = "Fire OS";
136
- const PLATFORM_SMART_TV = "SMART-TV";
137
- const PLATFORM_CHROME_OS = "Chrome OS";
138
- const PLATFORM_JAVA_ANDROID = "Java/Android";
139
- const PLATFORM_POSTMAN = "Postman";
140
- const PLATFORM_I_FRAME = "Iframely";
141
-
142
- const OPERATING_SYSTEM_UNKNOWN = 'unknown';
143
-
144
- /**
145
- * Class constructor
146
- */
147
- public function __construct($userAgent = "")
148
- {
149
- $this->reset();
150
- if ($userAgent != "") {
151
- $this->setUserAgent($userAgent);
152
- } else {
153
- $this->determine();
154
- }
155
- }
156
-
157
- /**
158
- * Reset all properties
159
- */
160
- public function reset()
161
- {
162
- $this->_agent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : "";
163
- $this->_browser_name = self::BROWSER_UNKNOWN;
164
- $this->_version = self::VERSION_UNKNOWN;
165
- $this->_platform = self::PLATFORM_UNKNOWN;
166
- $this->_os = self::OPERATING_SYSTEM_UNKNOWN;
167
- $this->_is_aol = false;
168
- $this->_is_mobile = false;
169
- $this->_is_tablet = false;
170
- $this->_is_robot = false;
171
- $this->_is_facebook = false;
172
- $this->_aol_version = self::VERSION_UNKNOWN;
173
- }
174
-
175
- /**
176
- * Check to see if the specific browser is valid
177
- * @param string $browserName
178
- * @return bool True if the browser is the specified browser
179
- */
180
- function isBrowser($browserName)
181
- {
182
- return (0 == strcasecmp($this->_browser_name, trim($browserName)));
183
- }
184
-
185
- /**
186
- * The name of the browser. All return types are from the class contants
187
- * @return string Name of the browser
188
- */
189
- public function getBrowser()
190
- {
191
- return $this->_browser_name;
192
- }
193
-
194
- /**
195
- * Set the name of the browser
196
- * @param $browser string The name of the Browser
197
- */
198
- public function setBrowser($browser)
199
- {
200
- $this->_browser_name = $browser;
201
- }
202
-
203
- /**
204
- * The name of the platform. All return types are from the class contants
205
- * @return string Name of the browser
206
- */
207
- public function getPlatform()
208
- {
209
- return $this->_platform;
210
- }
211
-
212
- /**
213
- * Set the name of the platform
214
- * @param string $platform The name of the Platform
215
- */
216
- public function setPlatform($platform)
217
- {
218
- $this->_platform = $platform;
219
- }
220
-
221
- /**
222
- * The version of the browser.
223
- * @return string Version of the browser (will only contain alpha-numeric characters and a period)
224
- */
225
- public function getVersion()
226
- {
227
- return $this->_version;
228
- }
229
-
230
- /**
231
- * Set the version of the browser
232
- * @param string $version The version of the Browser
233
- */
234
- public function setVersion($version)
235
- {
236
- $this->_version = preg_replace('/[^0-9,.,a-z,A-Z-]/', '', $version);
237
- }
238
-
239
- /**
240
- * The version of AOL.
241
- * @return string Version of AOL (will only contain alpha-numeric characters and a period)
242
- */
243
- public function getAolVersion()
244
- {
245
- return $this->_aol_version;
246
- }
247
-
248
- /**
249
- * Set the version of AOL
250
- * @param string $version The version of AOL
251
- */
252
- public function setAolVersion($version)
253
- {
254
- $this->_aol_version = preg_replace('/[^0-9,.,a-z,A-Z]/', '', $version);
255
- }
256
-
257
- /**
258
- * Is the browser from AOL?
259
- * @return boolean True if the browser is from AOL otherwise false
260
- */
261
- public function isAol()
262
- {
263
- return $this->_is_aol;
264
- }
265
-
266
- /**
267
- * Is the browser from a mobile device?
268
- * @return boolean True if the browser is from a mobile device otherwise false
269
- */
270
- public function isMobile()
271
- {
272
- return $this->_is_mobile;
273
- }
274
-
275
- /**
276
- * Is the browser from a tablet device?
277
- * @return boolean True if the browser is from a tablet device otherwise false
278
- */
279
- public function isTablet()
280
- {
281
- return $this->_is_tablet;
282
- }
283
-
284
- /**
285
- * Is the browser from a robot (ex Slurp,GoogleBot)?
286
- * @return boolean True if the browser is from a robot otherwise false
287
- */
288
- public function isRobot()
289
- {
290
- return $this->_is_robot;
291
- }
292
-
293
- /**
294
- * Is the browser from facebook?
295
- * @return boolean True if the browser is from facebook otherwise false
296
- */
297
- public function isFacebook()
298
- {
299
- return $this->_is_facebook;
300
- }
301
-
302
- /**
303
- * Set the browser to be from AOL
304
- * @param $isAol
305
- */
306
- public function setAol($isAol)
307
- {
308
- $this->_is_aol = $isAol;
309
- }
310
-
311
- /**
312
- * Set the Browser to be mobile
313
- * @param boolean $value is the browser a mobile browser or not
314
- */
315
- protected function setMobile($value = true)
316
- {
317
- $this->_is_mobile = $value;
318
- }
319
-
320
- /**
321
- * Set the Browser to be tablet
322
- * @param boolean $value is the browser a tablet browser or not
323
- */
324
- protected function setTablet($value = true)
325
- {
326
- $this->_is_tablet = $value;
327
- }
328
-
329
- /**
330
- * Set the Browser to be a robot
331
- * @param boolean $value is the browser a robot or not
332
- */
333
- protected function setRobot($value = true)
334
- {
335
- $this->_is_robot = $value;
336
- }
337
-
338
- /**
339
- * Set the Browser to be a Facebook request
340
- * @param boolean $value is the browser a robot or not
341
- */
342
- protected function setFacebook($value = true)
343
- {
344
- $this->_is_facebook = $value;
345
- }
346
-
347
- /**
348
- * Get the user agent value in use to determine the browser
349
- * @return string The user agent from the HTTP header
350
- */
351
- public function getUserAgent()
352
- {
353
- return $this->_agent;
354
- }
355
-
356
- /**
357
- * Set the user agent value (the construction will use the HTTP header value - this will overwrite it)
358
- * @param string $agent_string The value for the User Agent
359
- */
360
- public function setUserAgent($agent_string)
361
- {
362
- $this->reset();
363
- $this->_agent = $agent_string;
364
- $this->determine();
365
- }
366
-
367
- /**
368
- * Used to determine if the browser is actually "chromeframe"
369
- * @since 1.7
370
- * @return boolean True if the browser is using chromeframe
371
- */
372
- public function isChromeFrame()
373
- {
374
- return (strpos($this->_agent, "chromeframe") !== false);
375
- }
376
-
377
- /**
378
- * Returns a formatted string with a summary of the details of the browser.
379
- * @return string formatted string with a summary of the browser
380
- */
381
- public function __toString()
382
- {
383
- return "<strong>Browser Name:</strong> {$this->getBrowser()}<br/>\n" .
384
- "<strong>Browser Version:</strong> {$this->getVersion()}<br/>\n" .
385
- "<strong>Browser User Agent String:</strong> {$this->getUserAgent()}<br/>\n" .
386
- "<strong>Platform:</strong> {$this->getPlatform()}<br/>";
387
- }
388
-
389
- /**
390
- * Protected routine to calculate and determine what the browser is in use (including platform)
391
- */
392
- protected function determine()
393
- {
394
- $this->checkPlatform();
395
- $this->checkBrowsers();
396
- $this->checkForAol();
397
- }
398
-
399
- /**
400
- * Protected routine to determine the browser type
401
- * @return boolean True if the browser was detected otherwise false
402
- */
403
- protected function checkBrowsers()
404
- {
405
- return (
406
- // well-known, well-used
407
- // Special Notes:
408
- // (1) Opera must be checked before FireFox due to the odd
409
- // user agents used in some older versions of Opera
410
- // (2) WebTV is strapped onto Internet Explorer so we must
411
- // check for WebTV before IE
412
- // (3) (deprecated) Galeon is based on Firefox and needs to be
413
- // tested before Firefox is tested
414
- // (4) OmniWeb is based on Safari so OmniWeb check must occur
415
- // before Safari
416
- // (5) Netscape 9+ is based on Firefox so Netscape checks
417
- // before FireFox are necessary
418
- // (6) Vivalid is UA contains both Firefox and Chrome so Vivalid checks
419
- // before Firefox and Chrome
420
- $this->checkBrowserWebTv() ||
421
- $this->checkBrowserEdge() ||
422
- $this->checkBrowserInternetExplorer() ||
423
- $this->checkBrowserOpera() ||
424
- $this->checkBrowserGaleon() ||
425
- $this->checkBrowserNetscapeNavigator9Plus() ||
426
- $this->checkBrowserVivaldi() ||
427
- $this->checkBrowserYandex() ||
428
- $this->checkBrowserFirefox() ||
429
- $this->checkBrowserChrome() ||
430
- $this->checkBrowserOmniWeb() ||
431
-
432
- // common mobile
433
- $this->checkBrowserAndroid() ||
434
- $this->checkBrowseriPad() ||
435
- $this->checkBrowseriPod() ||
436
- $this->checkBrowseriPhone() ||
437
- $this->checkBrowserBlackBerry() ||
438
- $this->checkBrowserNokia() ||
439
-
440
- // common bots
441
- $this->checkBrowserGoogleBot() ||
442
- $this->checkBrowserMSNBot() ||
443
- $this->checkBrowserBingBot() ||
444
- $this->checkBrowserSlurp() ||
445
-
446
- // Yandex bots
447
- $this->checkBrowserYandexBot() ||
448
- $this->checkBrowserYandexImageResizerBot() ||
449
- $this->checkBrowserYandexBlogsBot() ||
450
- $this->checkBrowserYandexCatalogBot() ||
451
- $this->checkBrowserYandexDirectBot() ||
452
- $this->checkBrowserYandexFaviconsBot() ||
453
- $this->checkBrowserYandexImagesBot() ||
454
- $this->checkBrowserYandexMediaBot() ||
455
- $this->checkBrowserYandexMetrikaBot() ||
456
- $this->checkBrowserYandexNewsBot() ||
457
- $this->checkBrowserYandexVideoBot() ||
458
- $this->checkBrowserYandexWebmasterBot() ||
459
-
460
- // check for facebook external hit when loading URL
461
- $this->checkFacebookExternalHit() ||
462
-
463
- // WebKit base check (post mobile and others)
464
- $this->checkBrowserSamsung() ||
465
- $this->checkBrowserSilk() ||
466
- $this->checkBrowserSafari() ||
467
-
468
- // everyone else
469
- $this->checkBrowserNetPositive() ||
470
- $this->checkBrowserFirebird() ||
471
- $this->checkBrowserKonqueror() ||
472
- $this->checkBrowserIcab() ||
473
- $this->checkBrowserPhoenix() ||
474
- $this->checkBrowserAmaya() ||
475
- $this->checkBrowserLynx() ||
476
- $this->checkBrowserShiretoko() ||
477
- $this->checkBrowserIceCat() ||
478
- $this->checkBrowserIceweasel() ||
479
- $this->checkBrowserW3CValidator() ||
480
- $this->checkBrowserPlayStation() ||
481
- $this->checkBrowserIframely() ||
482
- $this->checkBrowserCocoa() ||
483
- $this->checkBrowserMozilla() /* Mozilla is such an open standard that you must check it last */
484
-
485
-
486
- );
487
- }
488
-
489
- /**
490
- * Determine if the user is using a BlackBerry (last updated 1.7)
491
- * @return boolean True if the browser is the BlackBerry browser otherwise false
492
- */
493
- protected function checkBrowserBlackBerry()
494
- {
495
- if (stripos($this->_agent, 'blackberry') !== false) {
496
- $aresult = explode("/", stristr($this->_agent, "BlackBerry"));
497
- if (isset($aresult[1])) {
498
- $aversion = explode(' ', $aresult[1]);
499
- $this->setVersion($aversion[0]);
500
- $this->_browser_name = self::BROWSER_BLACKBERRY;
501
- $this->setMobile(true);
502
- return true;
503
- }
504
- }
505
- return false;
506
- }
507
-
508
- /**
509
- * Determine if the user is using an AOL User Agent (last updated 1.7)
510
- * @return boolean True if the browser is from AOL otherwise false
511
- */
512
- protected function checkForAol()
513
- {
514
- $this->setAol(false);
515
- $this->setAolVersion(self::VERSION_UNKNOWN);
516
-
517
- if (stripos($this->_agent, 'aol') !== false) {
518
- $aversion = explode(' ', stristr($this->_agent, 'AOL'));
519
- if (isset($aversion[1])) {
520
- $this->setAol(true);
521
- $this->setAolVersion(preg_replace('/[^0-9\.a-z]/i', '', $aversion[1]));
522
- return true;
523
- }
524
- }
525
- return false;
526
- }
527
-
528
- /**
529
- * Determine if the browser is the GoogleBot or not (last updated 1.7)
530
- * @return boolean True if the browser is the GoogletBot otherwise false
531
- */
532
- protected function checkBrowserGoogleBot()
533
- {
534
- if (stripos($this->_agent, 'googlebot') !== false) {
535
- $aresult = explode('/', stristr($this->_agent, 'googlebot'));
536
- if (isset($aresult[1])) {
537
- $aversion = explode(' ', $aresult[1]);
538
- $this->setVersion(str_replace(';', '', $aversion[0]));
539
- $this->_browser_name = self::BROWSER_GOOGLEBOT;
540
- $this->setRobot(true);
541
- return true;
542
- }
543
- }
544
- return false;
545
- }
546
-
547
- /**
548
- * Determine if the browser is the YandexBot or not
549
- * @return boolean True if the browser is the YandexBot otherwise false
550
- */
551
- protected function checkBrowserYandexBot()
552
- {
553
- if (stripos($this->_agent, 'YandexBot') !== false) {
554
- $aresult = explode('/', stristr($this->_agent, 'YandexBot'));
555
- if (isset($aresult[1])) {
556
- $aversion = explode(' ', $aresult[1]);
557
- $this->setVersion(str_replace(';', '', $aversion[0]));
558
- $this->_browser_name = self::BROWSER_YANDEXBOT;
559
- $this->setRobot(true);
560
- return true;
561
- }
562
- }
563
- return false;
564
- }
565
-
566
- /**
567
- * Determine if the browser is the YandexImageResizer or not
568
- * @return boolean True if the browser is the YandexImageResizer otherwise false
569
- */
570
- protected function checkBrowserYandexImageResizerBot()
571
- {
572
- if (stripos($this->_agent, 'YandexImageResizer') !== false) {
573
- $aresult = explode('/', stristr($this->_agent, 'YandexImageResizer'));
574
- if (isset($aresult[1])) {
575
- $aversion = explode(' ', $aresult[1]);
576
- $this->setVersion(str_replace(';', '', $aversion[0]));
577
- $this->_browser_name = self::BROWSER_YANDEXIMAGERESIZER_BOT;
578
- $this->setRobot(true);
579
- return true;
580
- }
581
- }
582
- return false;
583
- }
584
-
585
- /**
586
- * Determine if the browser is the YandexCatalog or not
587
- * @return boolean True if the browser is the YandexCatalog otherwise false
588
- */
589
- protected function checkBrowserYandexCatalogBot()
590
- {
591
- if (stripos($this->_agent, 'YandexCatalog') !== false) {
592
- $aresult = explode('/', stristr($this->_agent, 'YandexCatalog'));
593
- if (isset($aresult[1])) {
594
- $aversion = explode(' ', $aresult[1]);
595
- $this->setVersion(str_replace(';', '', $aversion[0]));
596
- $this->_browser_name = self::BROWSER_YANDEXCATALOG_BOT;
597
- $this->setRobot(true);
598
- return true;
599
- }
600
- }
601
- return false;
602
- }
603
-
604
- /**
605
- * Determine if the browser is the YandexNews or not
606
- * @return boolean True if the browser is the YandexNews otherwise false
607
- */
608
- protected function checkBrowserYandexNewsBot()
609
- {
610
- if (stripos($this->_agent, 'YandexNews') !== false) {
611
- $aresult = explode('/', stristr($this->_agent, 'YandexNews'));
612
- if (isset($aresult[1])) {
613
- $aversion = explode(' ', $aresult[1]);
614
- $this->setVersion(str_replace(';', '', $aversion[0]));
615
- $this->_browser_name = self::BROWSER_YANDEXNEWS_BOT;
616
- $this->setRobot(true);
617
- return true;
618
- }
619
- }
620
- return false;
621
- }
622
-
623
- /**
624
- * Determine if the browser is the YandexMetrika or not
625
- * @return boolean True if the browser is the YandexMetrika otherwise false
626
- */
627
- protected function checkBrowserYandexMetrikaBot()
628
- {
629
- if (stripos($this->_agent, 'YandexMetrika') !== false) {
630
- $aresult = explode('/', stristr($this->_agent, 'YandexMetrika'));
631
- if (isset($aresult[1])) {
632
- $aversion = explode(' ', $aresult[1]);
633
- $this->setVersion(str_replace(';', '', $aversion[0]));
634
- $this->_browser_name = self::BROWSER_YANDEXMETRIKA_BOT;
635
- $this->setRobot(true);
636
- return true;
637
- }
638
- }
639
- return false;
640
- }
641
-
642
- /**
643
- * Determine if the browser is the YandexDirect or not
644
- * @return boolean True if the browser is the YandexDirect otherwise false
645
- */
646
- protected function checkBrowserYandexDirectBot()
647
- {
648
- if (stripos($this->_agent, 'YandexDirect') !== false) {
649
- $aresult = explode('/', stristr($this->_agent, 'YandexDirect'));
650
- if (isset($aresult[1])) {
651
- $aversion = explode(' ', $aresult[1]);
652
- $this->setVersion(str_replace(';', '', $aversion[0]));
653
- $this->_browser_name = self::BROWSER_YANDEXDIRECT_BOT;
654
- $this->setRobot(true);
655
- return true;
656
- }
657
- }
658
- return false;
659
- }
660
-
661
- /**
662
- * Determine if the browser is the YandexWebmaster or not
663
- * @return boolean True if the browser is the YandexWebmaster otherwise false
664
- */
665
- protected function checkBrowserYandexWebmasterBot()
666
- {
667
- if (stripos($this->_agent, 'YandexWebmaster') !== false) {
668
- $aresult = explode('/', stristr($this->_agent, 'YandexWebmaster'));
669
- if (isset($aresult[1])) {
670
- $aversion = explode(' ', $aresult[1]);
671
- $this->setVersion(str_replace(';', '', $aversion[0]));
672
- $this->_browser_name = self::BROWSER_YANDEXWEBMASTER_BOT;
673
- $this->setRobot(true);
674
- return true;
675
- }
676
- }
677
- return false;
678
- }
679
-
680
- /**
681
- * Determine if the browser is the YandexFavicons or not
682
- * @return boolean True if the browser is the YandexFavicons otherwise false
683
- */
684
- protected function checkBrowserYandexFaviconsBot()
685
- {
686
- if (stripos($this->_agent, 'YandexFavicons') !== false) {
687
- $aresult = explode('/', stristr($this->_agent, 'YandexFavicons'));
688
- if (isset($aresult[1])) {
689
- $aversion = explode(' ', $aresult[1]);
690
- $this->setVersion(str_replace(';', '', $aversion[0]));
691
- $this->_browser_name = self::BROWSER_YANDEXFAVICONS_BOT;
692
- $this->setRobot(true);
693
- return true;
694
- }
695
- }
696
- return false;
697
- }
698
-
699
- /**
700
- * Determine if the browser is the YandexBlogs or not
701
- * @return boolean True if the browser is the YandexBlogs otherwise false
702
- */
703
- protected function checkBrowserYandexBlogsBot()
704
- {
705
- if (stripos($this->_agent, 'YandexBlogs') !== false) {
706
- $aresult = explode('/', stristr($this->_agent, 'YandexBlogs'));
707
- if (isset($aresult[1])) {
708
- $aversion = explode(' ', $aresult[1]);
709
- $this->setVersion(str_replace(';', '', $aversion[0]));
710
- $this->_browser_name = self::BROWSER_YANDEXBLOGS_BOT;
711
- $this->setRobot(true);
712
- return true;
713
- }
714
- }
715
- return false;
716
- }
717
-
718
- /**
719
- * Determine if the browser is the YandexMedia or not
720
- * @return boolean True if the browser is the YandexMedia otherwise false
721
- */
722
- protected function checkBrowserYandexMediaBot()
723
- {
724
- if (stripos($this->_agent, 'YandexMedia') !== false) {
725
- $aresult = explode('/', stristr($this->_agent, 'YandexMedia'));
726
- if (isset($aresult[1])) {
727
- $aversion = explode(' ', $aresult[1]);
728
- $this->setVersion(str_replace(';', '', $aversion[0]));
729
- $this->_browser_name = self::BROWSER_YANDEXMEDIA_BOT;
730
- $this->setRobot(true);
731
- return true;
732
- }
733
- }
734
- return false;
735
- }
736
-
737
- /**
738
- * Determine if the browser is the YandexVideo or not
739
- * @return boolean True if the browser is the YandexVideo otherwise false
740
- */
741
- protected function checkBrowserYandexVideoBot()
742
- {
743
- if (stripos($this->_agent, 'YandexVideo') !== false) {
744
- $aresult = explode('/', stristr($this->_agent, 'YandexVideo'));
745
- if (isset($aresult[1])) {
746
- $aversion = explode(' ', $aresult[1]);
747
- $this->setVersion(str_replace(';', '', $aversion[0]));
748
- $this->_browser_name = self::BROWSER_YANDEXVIDEO_BOT;
749
- $this->setRobot(true);
750
- return true;
751
- }
752
- }
753
- return false;
754
- }
755
-
756
- /**
757
- * Determine if the browser is the YandexImages or not
758
- * @return boolean True if the browser is the YandexImages otherwise false
759
- */
760
- protected function checkBrowserYandexImagesBot()
761
- {
762
- if (stripos($this->_agent, 'YandexImages') !== false) {
763
- $aresult = explode('/', stristr($this->_agent, 'YandexImages'));
764
- if (isset($aresult[1])) {
765
- $aversion = explode(' ', $aresult[1]);
766
- $this->setVersion(str_replace(';', '', $aversion[0]));
767
- $this->_browser_name = self::BROWSER_YANDEXIMAGES_BOT;
768
- $this->setRobot(true);
769
- return true;
770
- }
771
- }
772
- return false;
773
- }
774
-
775
- /**
776
- * Determine if the browser is the MSNBot or not (last updated 1.9)
777
- * @return boolean True if the browser is the MSNBot otherwise false
778
- */
779
- protected function checkBrowserMSNBot()
780
- {
781
- if (stripos($this->_agent, "msnbot") !== false) {
782
- $aresult = explode("/", stristr($this->_agent, "msnbot"));
783
- if (isset($aresult[1])) {
784
- $aversion = explode(" ", $aresult[1]);
785
- $this->setVersion(str_replace(";", "", $aversion[0]));
786
- $this->_browser_name = self::BROWSER_MSNBOT;
787
- $this->setRobot(true);
788
- return true;
789
- }
790
- }
791
- return false;
792
- }
793
-
794
- /**
795
- * Determine if the browser is the BingBot or not (last updated 1.9)
796
- * @return boolean True if the browser is the BingBot otherwise false
797
- */
798
- protected function checkBrowserBingBot()
799
- {
800
- if (stripos($this->_agent, "bingbot") !== false) {
801
- $aresult = explode("/", stristr($this->_agent, "bingbot"));
802
- if (isset($aresult[1])) {
803
- $aversion = explode(" ", $aresult[1]);
804
- $this->setVersion(str_replace(";", "", $aversion[0]));
805
- $this->_browser_name = self::BROWSER_BINGBOT;
806
- $this->setRobot(true);
807
- return true;
808
- }
809
- }
810
- return false;
811
- }
812
-
813
- /**
814
- * Determine if the browser is the W3C Validator or not (last updated 1.7)
815
- * @return boolean True if the browser is the W3C Validator otherwise false
816
- */
817
- protected function checkBrowserW3CValidator()
818
- {
819
- if (stripos($this->_agent, 'W3C-checklink') !== false) {
820
- $aresult = explode('/', stristr($this->_agent, 'W3C-checklink'));
821
- if (isset($aresult[1])) {
822
- $aversion = explode(' ', $aresult[1]);
823
- $this->setVersion($aversion[0]);
824
- $this->_browser_name = self::BROWSER_W3CVALIDATOR;
825
- return true;
826
- }
827
- } else if (stripos($this->_agent, 'W3C_Validator') !== false) {
828
- // Some of the Validator versions do not delineate w/ a slash - add it back in
829
- $ua = str_replace("W3C_Validator ", "W3C_Validator/", $this->_agent);
830
- $aresult = explode('/', stristr($ua, 'W3C_Validator'));
831
- if (isset($aresult[1])) {
832
- $aversion = explode(' ', $aresult[1]);
833
- $this->setVersion($aversion[0]);
834
- $this->_browser_name = self::BROWSER_W3CVALIDATOR;
835
- return true;
836
- }
837
- } else if (stripos($this->_agent, 'W3C-mobileOK') !== false) {
838
- $this->_browser_name = self::BROWSER_W3CVALIDATOR;
839
- $this->setMobile(true);
840
- return true;
841
- }
842
- return false;
843
- }
844
-
845
- /**
846
- * Determine if the browser is the Yahoo! Slurp Robot or not (last updated 1.7)
847
- * @return boolean True if the browser is the Yahoo! Slurp Robot otherwise false
848
- */
849
- protected function checkBrowserSlurp()
850
- {
851
- if (stripos($this->_agent, 'slurp') !== false) {
852
- $aresult = explode('/', stristr($this->_agent, 'Slurp'));
853
- if (isset($aresult[1])) {
854
- $aversion = explode(' ', $aresult[1]);
855
- $this->setVersion($aversion[0]);
856
- $this->_browser_name = self::BROWSER_SLURP;
857
- $this->setRobot(true);
858
- $this->setMobile(false);
859
- return true;
860
- }
861
- }
862
- return false;
863
- }
864
-
865
- /**
866
- * Determine if the browser is Edge or not
867
- * @return boolean True if the browser is Edge otherwise false
868
- */
869
- protected function checkBrowserEdge()
870
- {
871
- if (stripos($this->_agent, 'Edge/') !== false) {
872
- $aresult = explode('/', stristr($this->_agent, 'Edge'));
873
- if (isset($aresult[1])) {
874
- $aversion = explode(' ', $aresult[1]);
875
- $this->setVersion($aversion[0]);
876
- $this->setBrowser(self::BROWSER_EDGE);
877
- if (stripos($this->_agent, 'Windows Phone') !== false || stripos($this->_agent, 'Android') !== false) {
878
- $this->setMobile(true);
879
- }
880
- return true;
881
- }
882
- }
883
- return false;
884
- }
885
-
886
- /**
887
- * Determine if the browser is Internet Explorer or not (last updated 1.7)
888
- * @return boolean True if the browser is Internet Explorer otherwise false
889
- */
890
- protected function checkBrowserInternetExplorer()
891
- {
892
- // Test for IE11
893
- if (stripos($this->_agent, 'Trident/7.0; rv:11.0') !== false) {
894
- $this->setBrowser(self::BROWSER_IE);
895
- $this->setVersion('11.0');
896
- return true;
897
- } // Test for v1 - v1.5 IE
898
- else if (stripos($this->_agent, 'microsoft internet explorer') !== false) {
899
- $this->setBrowser(self::BROWSER_IE);
900
- $this->setVersion('1.0');
901
- $aresult = stristr($this->_agent, '/');
902
- if (preg_match('/308|425|426|474|0b1/i', $aresult)) {
903
- $this->setVersion('1.5');
904
- }
905
- return true;
906
- } // Test for versions > 1.5
907
- else if (stripos($this->_agent, 'msie') !== false && stripos($this->_agent, 'opera') === false) {
908
- // See if the browser is the odd MSN Explorer
909
- if (stripos($this->_agent, 'msnb') !== false) {
910
- $aresult = explode(' ', stristr(str_replace(';', '; ', $this->_agent), 'MSN'));
911
- if (isset($aresult[1])) {
912
- $this->setBrowser(self::BROWSER_MSN);
913
- $this->setVersion(str_replace(array('(', ')', ';'), '', $aresult[1]));
914
- return true;
915
- }
916
- }
917
- $aresult = explode(' ', stristr(str_replace(';', '; ', $this->_agent), 'msie'));
918
- if (isset($aresult[1])) {
919
- $this->setBrowser(self::BROWSER_IE);
920
- $this->setVersion(str_replace(array('(', ')', ';'), '', $aresult[1]));
921
- if(preg_match('#trident/([0-9\.]+);#i', $this->_agent, $aresult)){
922
- if($aresult[1] == '3.1'){
923
- $this->setVersion('7.0');
924
- }
925
- else if($aresult[1] == '4.0'){
926
- $this->setVersion('8.0');
927
- }
928
- else if($aresult[1] == '5.0'){
929
- $this->setVersion('9.0');
930
- }
931
- else if($aresult[1] == '6.0'){
932
- $this->setVersion('10.0');
933
- }
934
- else if($aresult[1] == '7.0'){
935
- $this->setVersion('11.0');
936
- }
937
- else if($aresult[1] == '8.0'){
938
- $this->setVersion('11.0');
939
- }
940
- }
941
- if(stripos($this->_agent, 'IEMobile') !== false) {
942
- $this->setBrowser(self::BROWSER_POCKET_IE);
943
- $this->setMobile(true);
944
- }
945
- return true;
946
- }
947
- } // Test for versions > IE 10
948
- else if (stripos($this->_agent, 'trident') !== false) {
949
- $this->setBrowser(self::BROWSER_IE);
950
- $result = explode('rv:', $this->_agent);
951
- if (isset($result[1])) {
952
- $this->setVersion(preg_replace('/[^0-9.]+/', '', $result[1]));
953
- $this->_agent = str_replace(array("Mozilla", "Gecko"), "MSIE", $this->_agent);
954
- }
955
- } // Test for Pocket IE
956
- else if (stripos($this->_agent, 'mspie') !== false || stripos($this->_agent, 'pocket') !== false) {
957
- $aresult = explode(' ', stristr($this->_agent, 'mspie'));
958
- if (isset($aresult[1])) {
959
- $this->setPlatform(self::PLATFORM_WINDOWS_CE);
960
- $this->setBrowser(self::BROWSER_POCKET_IE);
961
- $this->setMobile(true);
962
-
963
- if (stripos($this->_agent, 'mspie') !== false) {
964
- $this->setVersion($aresult[1]);
965
- } else {
966
- $aversion = explode('/', $this->_agent);
967
- if (isset($aversion[1])) {
968
- $this->setVersion($aversion[1]);
969
- }
970
- }
971
- return true;
972
- }
973
- }
974
- return false;
975
- }
976
-
977
- /**
978
- * Determine if the browser is Opera or not (last updated 1.7)
979
- * @return boolean True if the browser is Opera otherwise false
980
- */
981
- protected function checkBrowserOpera()
982
- {
983
- if (stripos($this->_agent, 'opera mini') !== false) {
984
- $resultant = stristr($this->_agent, 'opera mini');
985
- if (preg_match('/\//', $resultant)) {
986
- $aresult = explode('/', $resultant);
987
- if (isset($aresult[1])) {
988
- $aversion = explode(' ', $aresult[1]);
989
- $this->setVersion($aversion[0]);
990
- }
991
- } else {
992
- $aversion = explode(' ', stristr($resultant, 'opera mini'));
993
- if (isset($aversion[1])) {
994
- $this->setVersion($aversion[1]);
995
- }
996
- }
997
- $this->_browser_name = self::BROWSER_OPERA_MINI;
998
- $this->setMobile(true);
999
- return true;
1000
- } else if (stripos($this->_agent, 'opera') !== false) {
1001
- $resultant = stristr($this->_agent, 'opera');
1002
- if (preg_match('/Version\/(1*.*)$/', $resultant, $matches)) {
1003
- $this->setVersion($matches[1]);
1004
- } else if (preg_match('/\//', $resultant)) {
1005
- $aresult = explode('/', str_replace("(", " ", $resultant));
1006
- if (isset($aresult[1])) {
1007
- $aversion = explode(' ', $aresult[1]);
1008
- $this->setVersion($aversion[0]);
1009
- }
1010
- } else {
1011
- $aversion = explode(' ', stristr($resultant, 'opera'));
1012
- $this->setVersion(isset($aversion[1]) ? $aversion[1] : "");
1013
- }
1014
- if (stripos($this->_agent, 'Opera Mobi') !== false) {
1015
- $this->setMobile(true);
1016
- }
1017
- $this->_browser_name = self::BROWSER_OPERA;
1018
- return true;
1019
- } else if (stripos($this->_agent, 'OPR') !== false) {
1020
- $resultant = stristr($this->_agent, 'OPR');
1021
- if (preg_match('/\//', $resultant)) {
1022
- $aresult = explode('/', str_replace("(", " ", $resultant));
1023
- if (isset($aresult[1])) {
1024
- $aversion = explode(' ', $aresult[1]);
1025
- $this->setVersion($aversion[0]);
1026
- }
1027
- }
1028
- if (stripos($this->_agent, 'Mobile') !== false) {
1029
- $this->setMobile(true);
1030
- }
1031
- $this->_browser_name = self::BROWSER_OPERA;
1032
- return true;
1033
- }
1034
- return false;
1035
- }
1036
-
1037
- /**
1038
- * Determine if the browser is Chrome or not (last updated 1.7)
1039
- * @return boolean True if the browser is Chrome otherwise false
1040
- */
1041
- protected function checkBrowserChrome()
1042
- {
1043
- if (stripos($this->_agent, 'Chrome') !== false) {
1044
- $aresult = explode('/', stristr($this->_agent, 'Chrome'));
1045
- if (isset($aresult[1])) {
1046
- $aversion = explode(' ', $aresult[1]);
1047
- $this->setVersion($aversion[0]);
1048
- $this->setBrowser(self::BROWSER_CHROME);
1049
- //Chrome on Android
1050
- if (stripos($this->_agent, 'Android') !== false) {
1051
- if (stripos($this->_agent, 'Mobile') !== false) {
1052
- $this->setMobile(true);
1053
- } else {
1054
- $this->setTablet(true);
1055
- }
1056
- }
1057
- return true;
1058
- }
1059
- }
1060
- return false;
1061
- }
1062
-
1063
-
1064
- /**
1065
- * Determine if the browser is WebTv or not (last updated 1.7)
1066
- * @return boolean True if the browser is WebTv otherwise false
1067
- */
1068
- protected function checkBrowserWebTv()
1069
- {
1070
- if (stripos($this->_agent, 'webtv') !== false) {
1071
- $aresult = explode('/', stristr($this->_agent, 'webtv'));
1072
- if (isset($aresult[1])) {
1073
- $aversion = explode(' ', $aresult[1]);
1074
- $this->setVersion($aversion[0]);
1075
- $this->setBrowser(self::BROWSER_WEBTV);
1076
- return true;
1077
- }
1078
- }
1079
- return false;
1080
- }
1081
-
1082
- /**
1083
- * Determine if the browser is NetPositive or not (last updated 1.7)
1084
- * @return boolean True if the browser is NetPositive otherwise false
1085
- */
1086
- protected function checkBrowserNetPositive()
1087
- {
1088
- if (stripos($this->_agent, 'NetPositive') !== false) {
1089
- $aresult = explode('/', stristr($this->_agent, 'NetPositive'));
1090
- if (isset($aresult[1])) {
1091
- $aversion = explode(' ', $aresult[1]);
1092
- $this->setVersion(str_replace(array('(', ')', ';'), '', $aversion[0]));
1093
- $this->setBrowser(self::BROWSER_NETPOSITIVE);
1094
- return true;
1095
- }
1096
- }
1097
- return false;
1098
- }
1099
-
1100
- /**
1101
- * Determine if the browser is Galeon or not (last updated 1.7)
1102
- * @return boolean True if the browser is Galeon otherwise false
1103
- */
1104
- protected function checkBrowserGaleon()
1105
- {
1106
- if (stripos($this->_agent, 'galeon') !== false) {
1107
- $aresult = explode(' ', stristr($this->_agent, 'galeon'));
1108
- $aversion = explode('/', $aresult[0]);
1109
- if (isset($aversion[1])) {
1110
- $this->setVersion($aversion[1]);
1111
- $this->setBrowser(self::BROWSER_GALEON);
1112
- return true;
1113
- }
1114
- }
1115
- return false;
1116
- }
1117
-
1118
- /**
1119
- * Determine if the browser is Konqueror or not (last updated 1.7)
1120
- * @return boolean True if the browser is Konqueror otherwise false
1121
- */
1122
- protected function checkBrowserKonqueror()
1123
- {
1124
- if (stripos($this->_agent, 'Konqueror') !== false) {
1125
- $aresult = explode(' ', stristr($this->_agent, 'Konqueror'));
1126
- $aversion = explode('/', $aresult[0]);
1127
- if (isset($aversion[1])) {
1128
- $this->setVersion($aversion[1]);
1129
- $this->setBrowser(self::BROWSER_KONQUEROR);
1130
- return true;
1131
- }
1132
- }
1133
- return false;
1134
- }
1135
-
1136
- /**
1137
- * Determine if the browser is iCab or not (last updated 1.7)
1138
- * @return boolean True if the browser is iCab otherwise false
1139
- */
1140
- protected function checkBrowserIcab()
1141
- {
1142
- if (stripos($this->_agent, 'icab') !== false) {
1143
- $aversion = explode(' ', stristr(str_replace('/', ' ', $this->_agent), 'icab'));
1144
- if (isset($aversion[1])) {
1145
- $this->setVersion($aversion[1]);
1146
- $this->setBrowser(self::BROWSER_ICAB);
1147
- return true;
1148
- }
1149
- }
1150
- return false;
1151
- }
1152
-
1153
- /**
1154
- * Determine if the browser is OmniWeb or not (last updated 1.7)
1155
- * @return boolean True if the browser is OmniWeb otherwise false
1156
- */
1157
- protected function checkBrowserOmniWeb()
1158
- {
1159
- if (stripos($this->_agent, 'omniweb') !== false) {
1160
- $aresult = explode('/', stristr($this->_agent, 'omniweb'));
1161
- $aversion = explode(' ', isset($aresult[1]) ? $aresult[1] : "");
1162
- $this->setVersion($aversion[0]);
1163
- $this->setBrowser(self::BROWSER_OMNIWEB);
1164
- return true;
1165
- }
1166
- return false;
1167
- }
1168
-
1169
- /**
1170
- * Determine if the browser is Phoenix or not (last updated 1.7)
1171
- * @return boolean True if the browser is Phoenix otherwise false
1172
- */
1173
- protected function checkBrowserPhoenix()
1174
- {
1175
- if (stripos($this->_agent, 'Phoenix') !== false) {
1176
- $aversion = explode('/', stristr($this->_agent, 'Phoenix'));
1177
- if (isset($aversion[1])) {
1178
- $this->setVersion($aversion[1]);
1179
- $this->setBrowser(self::BROWSER_PHOENIX);
1180
- return true;
1181
- }
1182
- }
1183
- return false;
1184
- }
1185
-
1186
- /**
1187
- * Determine if the browser is Firebird or not (last updated 1.7)
1188
- * @return boolean True if the browser is Firebird otherwise false
1189
- */
1190
- protected function checkBrowserFirebird()
1191
- {
1192
- if (stripos($this->_agent, 'Firebird') !== false) {
1193
- $aversion = explode('/', stristr($this->_agent, 'Firebird'));
1194
- if (isset($aversion[1])) {
1195
- $this->setVersion($aversion[1]);
1196
- $this->setBrowser(self::BROWSER_FIREBIRD);
1197
- return true;
1198
- }
1199
- }
1200
- return false;
1201
- }
1202
-
1203
- /**
1204
- * Determine if the browser is Netscape Navigator 9+ or not (last updated 1.7)
1205
- * NOTE: (http://browser.netscape.com/ - Official support ended on March 1st, 2008)
1206
- * @return boolean True if the browser is Netscape Navigator 9+ otherwise false
1207
- */
1208
- protected function checkBrowserNetscapeNavigator9Plus()
1209
- {
1210
- if (stripos($this->_agent, 'Firefox') !== false && preg_match('/Navigator\/([^ ]*)/i', $this->_agent, $matches)) {
1211
- $this->setVersion($matches[1]);
1212
- $this->setBrowser(self::BROWSER_NETSCAPE_NAVIGATOR);
1213
- return true;
1214
- } else if (stripos($this->_agent, 'Firefox') === false && preg_match('/Netscape6?\/([^ ]*)/i', $this->_agent, $matches)) {
1215
- $this->setVersion($matches[1]);
1216
- $this->setBrowser(self::BROWSER_NETSCAPE_NAVIGATOR);
1217
- return true;
1218
- }
1219
- return false;
1220
- }
1221
-
1222
- /**
1223
- * Determine if the browser is Shiretoko or not (https://wiki.mozilla.org/Projects/shiretoko) (last updated 1.7)
1224
- * @return boolean True if the browser is Shiretoko otherwise false
1225
- */
1226
- protected function checkBrowserShiretoko()
1227
- {
1228
- if (stripos($this->_agent, 'Mozilla') !== false && preg_match('/Shiretoko\/([^ ]*)/i', $this->_agent, $matches)) {
1229
- $this->setVersion($matches[1]);
1230
- $this->setBrowser(self::BROWSER_SHIRETOKO);
1231
- return true;
1232
- }
1233
- return false;
1234
- }
1235
-
1236
- /**
1237
- * Determine if the browser is Ice Cat or not (http://en.wikipedia.org/wiki/GNU_IceCat) (last updated 1.7)
1238
- * @return boolean True if the browser is Ice Cat otherwise false
1239
- */
1240
- protected function checkBrowserIceCat()
1241
- {
1242
- if (stripos($this->_agent, 'Mozilla') !== false && preg_match('/IceCat\/([^ ]*)/i', $this->_agent, $matches)) {
1243
- $this->setVersion($matches[1]);
1244
- $this->setBrowser(self::BROWSER_ICECAT);
1245
- return true;
1246
- }
1247
- return false;
1248
- }
1249
-
1250
- /**
1251
- * Determine if the browser is Nokia or not (last updated 1.7)
1252
- * @return boolean True if the browser is Nokia otherwise false
1253
- */
1254
- protected function checkBrowserNokia()
1255
- {
1256
- if (preg_match("/Nokia([^\/]+)\/([^ SP]+)/i", $this->_agent, $matches)) {
1257
- $this->setVersion($matches[2]);
1258
- if (stripos($this->_agent, 'Series60') !== false || strpos($this->_agent, 'S60') !== false) {
1259
- $this->setBrowser(self::BROWSER_NOKIA_S60);
1260
- } else {
1261
- $this->setBrowser(self::BROWSER_NOKIA);
1262
- }
1263
- $this->setMobile(true);
1264
- return true;
1265
- }
1266
- return false;
1267
- }
1268
-
1269
- /**
1270
- * Determine if the browser is Firefox or not (last updated 1.7)
1271
- * @return boolean True if the browser is Firefox otherwise false
1272
- */
1273
- protected function checkBrowserFirefox()
1274
- {
1275
- if (stripos($this->_agent, 'safari') === false) {
1276
- if (preg_match("/Firefox[\/ \(]([^ ;\)]+)/i", $this->_agent, $matches)) {
1277
- $this->setVersion($matches[1]);
1278
- $this->setBrowser(self::BROWSER_FIREFOX);
1279
- //Firefox on Android
1280
- if (stripos($this->_agent, 'Android') !== false) {
1281
- if (stripos($this->_agent, 'Mobile') !== false) {
1282
- $this->setMobile(true);
1283
- } else {
1284
- $this->setTablet(true);
1285
- }
1286
- }
1287
- return true;
1288
- } else if (preg_match("/Firefox$/i", $this->_agent, $matches)) {
1289
- $this->setVersion("");
1290
- $this->setBrowser(self::BROWSER_FIREFOX);
1291
- return true;
1292
- }
1293
- }
1294
- return false;
1295
- }
1296
-
1297
- /**
1298
- * Determine if the browser is Firefox or not (last updated 1.7)
1299
- * @return boolean True if the browser is Firefox otherwise false
1300
- */
1301
- protected function checkBrowserIceweasel()
1302
- {
1303
- if (stripos($this->_agent, 'Iceweasel') !== false) {
1304
- $aresult = explode('/', stristr($this->_agent, 'Iceweasel'));
1305
- if (isset($aresult[1])) {
1306
- $aversion = explode(' ', $aresult[1]);
1307
- $this->setVersion($aversion[0]);
1308
- $this->setBrowser(self::BROWSER_ICEWEASEL);
1309
- return true;
1310
- }
1311
- }
1312
- return false;
1313
- }
1314
-
1315
- /**
1316
- * Determine if the browser is Mozilla or not (last updated 1.7)
1317
- * @return boolean True if the browser is Mozilla otherwise false
1318
- */
1319
- protected function checkBrowserMozilla()
1320
- {
1321
- if (stripos($this->_agent, 'mozilla') !== false && preg_match('/rv:[0-9].[0-9][a-b]?/i', $this->_agent) && stripos($this->_agent, 'netscape') === false) {
1322
- $aversion = explode(' ', stristr($this->_agent, 'rv:'));
1323
- preg_match('/rv:[0-9].[0-9][a-b]?/i', $this->_agent, $aversion);
1324
- $this->setVersion(str_replace('rv:', '', $aversion[0]));
1325
- $this->setBrowser(self::BROWSER_MOZILLA);
1326
- return true;
1327
- } else if (stripos($this->_agent, 'mozilla') !== false && preg_match('/rv:[0-9]\.[0-9]/i', $this->_agent) && stripos($this->_agent, 'netscape') === false) {
1328
- $aversion = explode('', stristr($this->_agent, 'rv:'));
1329
- $this->setVersion(str_replace('rv:', '', $aversion[0]));
1330
- $this->setBrowser(self::BROWSER_MOZILLA);
1331
- return true;
1332
- } else if (stripos($this->_agent, 'mozilla') !== false && preg_match('/mozilla\/([^ ]*)/i', $this->_agent, $matches) && stripos($this->_agent, 'netscape') === false) {
1333
- $this->setVersion($matches[1]);
1334
- $this->setBrowser(self::BROWSER_MOZILLA);
1335
- return true;
1336
- }
1337
- return false;
1338
- }
1339
-
1340
- /**
1341
- * Determine if the browser is Lynx or not (last updated 1.7)
1342
- * @return boolean True if the browser is Lynx otherwise false
1343
- */
1344
- protected function checkBrowserLynx()
1345
- {
1346
- if (stripos($this->_agent, 'lynx') !== false) {
1347
- $aresult = explode('/', stristr($this->_agent, 'Lynx'));
1348
- $aversion = explode(' ', (isset($aresult[1]) ? $aresult[1] : ""));
1349
- $this->setVersion($aversion[0]);
1350
- $this->setBrowser(self::BROWSER_LYNX);
1351
- return true;
1352
- }
1353
- return false;
1354
- }
1355
-
1356
- /**
1357
- * Determine if the browser is Amaya or not (last updated 1.7)
1358
- * @return boolean True if the browser is Amaya otherwise false
1359
- */
1360
- protected function checkBrowserAmaya()
1361
- {
1362
- if (stripos($this->_agent, 'amaya') !== false) {
1363
- $aresult = explode('/', stristr($this->_agent, 'Amaya'));
1364
- if (isset($aresult[1])) {
1365
- $aversion = explode(' ', $aresult[1]);
1366
- $this->setVersion($aversion[0]);
1367
- $this->setBrowser(self::BROWSER_AMAYA);
1368
- return true;
1369
- }
1370
- }
1371
- return false;
1372
- }
1373
-
1374
- /**
1375
- * Determine if the browser is Safari or not (last updated 1.7)
1376
- * @return boolean True if the browser is Safari otherwise false
1377
- */
1378
- protected function checkBrowserSafari()
1379
- {
1380
- if (stripos($this->_agent, 'Safari') !== false
1381
- && stripos($this->_agent, 'iPhone') === false
1382
- && stripos($this->_agent, 'iPod') === false
1383
- ) {
1384
-
1385
- $aresult = explode('/', stristr($this->_agent, 'Version'));
1386
- if (isset($aresult[1])) {
1387
- $aversion = explode(' ', $aresult[1]);
1388
- $this->setVersion($aversion[0]);
1389
- } else {
1390
- $this->setVersion(self::VERSION_UNKNOWN);
1391
- }
1392
- $this->setBrowser(self::BROWSER_SAFARI);
1393
- return true;
1394
- }
1395
- return false;
1396
- }
1397
-
1398
- protected function checkBrowserSamsung()
1399
- {
1400
- if (stripos($this->_agent, 'SamsungBrowser') !== false) {
1401
-
1402
- $aresult = explode('/', stristr($this->_agent, 'SamsungBrowser'));
1403
- if (isset($aresult[1])) {
1404
- $aversion = explode(' ', $aresult[1]);
1405
- $this->setVersion($aversion[0]);
1406
- } else {
1407
- $this->setVersion(self::VERSION_UNKNOWN);
1408
- }
1409
- $this->setBrowser(self::BROWSER_SAMSUNG);
1410
- return true;
1411
- }
1412
- return false;
1413
- }
1414
-
1415
- protected function checkBrowserSilk()
1416
- {
1417
- if (stripos($this->_agent, 'Silk') !== false) {
1418
- $aresult = explode('/', stristr($this->_agent, 'Silk'));
1419
- if (isset($aresult[1])) {
1420
- $aversion = explode(' ', $aresult[1]);
1421
- $this->setVersion($aversion[0]);
1422
- } else {
1423
- $this->setVersion(self::VERSION_UNKNOWN);
1424
- }
1425
- $this->setBrowser(self::BROWSER_SILK);
1426
- return true;
1427
- }
1428
- return false;
1429
- }
1430
-
1431
- protected function checkBrowserIframely()
1432
- {
1433
- if (stripos($this->_agent, 'Iframely') !== false) {
1434
- $aresult = explode('/', stristr($this->_agent, 'Iframely'));
1435
- if (isset($aresult[1])) {
1436
- $aversion = explode(' ', $aresult[1]);
1437
- $this->setVersion($aversion[0]);
1438
- } else {
1439
- $this->setVersion(self::VERSION_UNKNOWN);
1440
- }
1441
- $this->setBrowser(self::BROWSER_I_FRAME);
1442
- return true;
1443
- }
1444
- return false;
1445
- }
1446
-
1447
- protected function checkBrowserCocoa()
1448
- {
1449
- if (stripos($this->_agent, 'CocoaRestClient') !== false) {
1450
- $aresult = explode('/', stristr($this->_agent, 'CocoaRestClient'));
1451
- if (isset($aresult[1])) {
1452
- $aversion = explode(' ', $aresult[1]);
1453
- $this->setVersion($aversion[0]);
1454
- } else {
1455
- $this->setVersion(self::VERSION_UNKNOWN);
1456
- }
1457
- $this->setBrowser(self::BROWSER_COCOA);
1458
- return true;
1459
- }
1460
- return false;
1461
- }
1462
-
1463
- /**
1464
- * Detect if URL is loaded from FacebookExternalHit
1465
- * @return boolean True if it detects FacebookExternalHit otherwise false
1466
- */
1467
- protected function checkFacebookExternalHit()
1468
- {
1469
- if (stristr($this->_agent, 'FacebookExternalHit')) {
1470
- $this->setRobot(true);
1471
- $this->setFacebook(true);
1472
- return true;
1473
- }
1474
- return false;
1475
- }
1476
-
1477
- /**
1478
- * Detect if URL is being loaded from internal Facebook browser
1479
- * @return boolean True if it detects internal Facebook browser otherwise false
1480
- */
1481
- protected function checkForFacebookIos()
1482
- {
1483
- if (stristr($this->_agent, 'FBIOS')) {
1484
- $this->setFacebook(true);
1485
- return true;
1486
- }
1487
- return false;
1488
- }
1489
-
1490
- /**
1491
- * Detect Version for the Safari browser on iOS devices
1492
- * @return boolean True if it detects the version correctly otherwise false
1493
- */
1494
- protected function getSafariVersionOnIos()
1495
- {
1496
- $aresult = explode('/', stristr($this->_agent, 'Version'));
1497
- if (isset($aresult[1])) {
1498
- $aversion = explode(' ', $aresult[1]);
1499
- $this->setVersion($aversion[0]);
1500
- return true;
1501
- }
1502
- return false;
1503
- }
1504
-
1505
- /**
1506
- * Detect Version for the Chrome browser on iOS devices
1507
- * @return boolean True if it detects the version correctly otherwise false
1508
- */
1509
- protected function getChromeVersionOnIos()
1510
- {
1511
- $aresult = explode('/', stristr($this->_agent, 'CriOS'));
1512
- if (isset($aresult[1])) {
1513
- $aversion = explode(' ', $aresult[1]);
1514
- $this->setVersion($aversion[0]);
1515
- $this->setBrowser(self::BROWSER_CHROME);
1516
- return true;
1517
- }
1518
- return false;
1519
- }
1520
-
1521
- /**
1522
- * Determine if the browser is iPhone or not (last updated 1.7)
1523
- * @return boolean True if the browser is iPhone otherwise false
1524
- */
1525
- protected function checkBrowseriPhone()
1526
- {
1527
- if (stripos($this->_agent, 'iPhone') !== false) {
1528
- $this->setVersion(self::VERSION_UNKNOWN);
1529
- $this->setBrowser(self::BROWSER_IPHONE);
1530
- $this->getSafariVersionOnIos();
1531
- $this->getChromeVersionOnIos();
1532
- $this->checkForFacebookIos();
1533
- $this->setMobile(true);
1534
- return true;
1535
-
1536
- }
1537
- return false;
1538
- }
1539
-
1540
- /**
1541
- * Determine if the browser is iPad or not (last updated 1.7)
1542
- * @return boolean True if the browser is iPad otherwise false
1543
- */
1544
- protected function checkBrowseriPad()
1545
- {
1546
- if (stripos($this->_agent, 'iPad') !== false) {
1547
- $this->setVersion(self::VERSION_UNKNOWN);
1548
- $this->setBrowser(self::BROWSER_IPAD);
1549
- $this->getSafariVersionOnIos();
1550
- $this->getChromeVersionOnIos();
1551
- $this->checkForFacebookIos();
1552
- $this->setTablet(true);
1553
- return true;
1554
- }
1555
- return false;
1556
- }
1557
-
1558
- /**
1559
- * Determine if the browser is iPod or not (last updated 1.7)
1560
- * @return boolean True if the browser is iPod otherwise false
1561
- */
1562
- protected function checkBrowseriPod()
1563
- {
1564
- if (stripos($this->_agent, 'iPod') !== false) {
1565
- $this->setVersion(self::VERSION_UNKNOWN);
1566
- $this->setBrowser(self::BROWSER_IPOD);
1567
- $this->getSafariVersionOnIos();
1568
- $this->getChromeVersionOnIos();
1569
- $this->checkForFacebookIos();
1570
- $this->setMobile(true);
1571
- return true;
1572
- }
1573
- return false;
1574
- }
1575
-
1576
- /**
1577
- * Determine if the browser is Android or not (last updated 1.7)
1578
- * @return boolean True if the browser is Android otherwise false
1579
- */
1580
- protected function checkBrowserAndroid()
1581
- {
1582
- if (stripos($this->_agent, 'Android') !== false) {
1583
- $aresult = explode(' ', stristr($this->_agent, 'Android'));
1584
- if (isset($aresult[1])) {
1585
- $aversion = explode(' ', $aresult[1]);
1586
- $this->setVersion($aversion[0]);
1587
- } else {
1588
- $this->setVersion(self::VERSION_UNKNOWN);
1589
- }
1590
- if (stripos($this->_agent, 'Mobile') !== false) {
1591
- $this->setMobile(true);
1592
- } else {
1593
- $this->setTablet(true);
1594
- }
1595
- $this->setBrowser(self::BROWSER_ANDROID);
1596
- return true;
1597
- }
1598
- return false;
1599
- }
1600
-
1601
- /**
1602
- * Determine if the browser is Vivaldi
1603
- * @return boolean True if the browser is Vivaldi otherwise false
1604
- */
1605
- protected function checkBrowserVivaldi()
1606
- {
1607
- if (stripos($this->_agent, 'Vivaldi') !== false) {
1608
- $aresult = explode('/', stristr($this->_agent, 'Vivaldi'));
1609
- if (isset($aresult[1])) {
1610
- $aversion = explode(' ', $aresult[1]);
1611
- $this->setVersion($aversion[0]);
1612
- $this->setBrowser(self::BROWSER_VIVALDI);
1613
- return true;
1614
- }
1615
- }
1616
- return false;
1617
- }
1618
-
1619
- /**
1620
- * Determine if the browser is Yandex
1621
- * @return boolean True if the browser is Yandex otherwise false
1622
- */
1623
- protected function checkBrowserYandex()
1624
- {
1625
- if (stripos($this->_agent, 'YaBrowser') !== false) {
1626
- $aresult = explode('/', stristr($this->_agent, 'YaBrowser'));
1627
- if (isset($aresult[1])) {
1628
- $aversion = explode(' ', $aresult[1]);
1629
- $this->setVersion($aversion[0]);
1630
- $this->setBrowser(self::BROWSER_YANDEX);
1631
-
1632
- if (stripos($this->_agent, 'iPad') !== false) {
1633
- $this->setTablet(true);
1634
- } elseif (stripos($this->_agent, 'Mobile') !== false) {
1635
- $this->setMobile(true);
1636
- } elseif (stripos($this->_agent, 'Android') !== false) {
1637
- $this->setTablet(true);
1638
- }
1639
-
1640
- return true;
1641
- }
1642
- }
1643
-
1644
- return false;
1645
- }
1646
-
1647
- /**
1648
- * Determine if the browser is a PlayStation
1649
- * @return boolean True if the browser is PlayStation otherwise false
1650
- */
1651
- protected function checkBrowserPlayStation()
1652
- {
1653
- if (stripos($this->_agent, 'PlayStation ') !== false) {
1654
- $aresult = explode(' ', stristr($this->_agent, 'PlayStation '));
1655
- $this->setBrowser(self::BROWSER_PLAYSTATION);
1656
- if (isset($aresult[0])) {
1657
- $aversion = explode(')', $aresult[2]);
1658
- $this->setVersion($aversion[0]);
1659
- if (stripos($this->_agent, 'Portable)') !== false || stripos($this->_agent, 'Vita') !== false) {
1660
- $this->setMobile(true);
1661
- }
1662
- return true;
1663
- }
1664
- }
1665
- return false;
1666
- }
1667
-
1668
- /**
1669
- * Determine the user's platform (last updated 2.0)
1670
- */
1671
- protected function checkPlatform()
1672
- {
1673
- if (stripos($this->_agent, 'windows') !== false) {
1674
- $this->_platform = self::PLATFORM_WINDOWS;
1675
- } else if (stripos($this->_agent, 'iPad') !== false) {
1676
- $this->_platform = self::PLATFORM_IPAD;
1677
- } else if (stripos($this->_agent, 'iPod') !== false) {
1678
- $this->_platform = self::PLATFORM_IPOD;
1679
- } else if (stripos($this->_agent, 'iPhone') !== false) {
1680
- $this->_platform = self::PLATFORM_IPHONE;
1681
- } elseif (stripos($this->_agent, 'mac') !== false) {
1682
- $this->_platform = self::PLATFORM_APPLE;
1683
- } elseif (stripos($this->_agent, 'android') !== false) {
1684
- $this->_platform = self::PLATFORM_ANDROID;
1685
- } elseif (stripos($this->_agent, 'Silk') !== false) {
1686
- $this->_platform = self::PLATFORM_FIRE_OS;
1687
- } elseif (stripos($this->_agent, 'linux') !== false && stripos($this->_agent, 'SMART-TV') !== false ) {
1688
- $this->_platform = self::PLATFORM_LINUX .'/'.self::PLATFORM_SMART_TV;
1689
- } elseif (stripos($this->_agent, 'linux') !== false) {
1690
- $this->_platform = self::PLATFORM_LINUX;
1691
- } else if (stripos($this->_agent, 'Nokia') !== false) {
1692
- $this->_platform = self::PLATFORM_NOKIA;
1693
- } else if (stripos($this->_agent, 'BlackBerry') !== false) {
1694
- $this->_platform = self::PLATFORM_BLACKBERRY;
1695
- } elseif (stripos($this->_agent, 'FreeBSD') !== false) {
1696
- $this->_platform = self::PLATFORM_FREEBSD;
1697
- } elseif (stripos($this->_agent, 'OpenBSD') !== false) {
1698
- $this->_platform = self::PLATFORM_OPENBSD;
1699
- } elseif (stripos($this->_agent, 'NetBSD') !== false) {
1700
- $this->_platform = self::PLATFORM_NETBSD;
1701
- } elseif (stripos($this->_agent, 'OpenSolaris') !== false) {
1702
- $this->_platform = self::PLATFORM_OPENSOLARIS;
1703
- } elseif (stripos($this->_agent, 'SunOS') !== false) {
1704
- $this->_platform = self::PLATFORM_SUNOS;
1705
- } elseif (stripos($this->_agent, 'OS\/2') !== false) {
1706
- $this->_platform = self::PLATFORM_OS2;
1707
- } elseif (stripos($this->_agent, 'BeOS') !== false) {
1708
- $this->_platform = self::PLATFORM_BEOS;
1709
- } elseif (stripos($this->_agent, 'win') !== false) {
1710
- $this->_platform = self::PLATFORM_WINDOWS;
1711
- } elseif (stripos($this->_agent, 'Playstation') !== false) {
1712
- $this->_platform = self::PLATFORM_PLAYSTATION;
1713
- } elseif (stripos($this->_agent, 'Roku') !== false) {
1714
- $this->_platform = self::PLATFORM_ROKU;
1715
- } elseif (stripos($this->_agent, 'iOS') !== false) {
1716
- $this->_platform = self::PLATFORM_IPHONE . '/' . self::PLATFORM_IPAD;
1717
- } elseif (stripos($this->_agent, 'tvOS') !== false) {
1718
- $this->_platform = self::PLATFORM_APPLE_TV;
1719
- } elseif (stripos($this->_agent, 'curl') !== false) {
1720
- $this->_platform = self::PLATFORM_TERMINAL;
1721
- } elseif (stripos($this->_agent, 'CrOS') !== false) {
1722
- $this->_platform = self::PLATFORM_CHROME_OS;
1723
- } elseif (stripos($this->_agent, 'okhttp') !== false) {
1724
- $this->_platform = self::PLATFORM_JAVA_ANDROID;
1725
- } elseif (stripos($this->_agent, 'PostmanRuntime') !== false) {
1726
- $this->_platform = self::PLATFORM_POSTMAN;
1727
- } elseif (stripos($this->_agent, 'Iframely') !== false) {
1728
- $this->_platform = self::PLATFORM_I_FRAME;
1729
- }
1730
-
1731
- }
1732
- }
1
+ <?php
2
+
3
+ /**
4
+ * File: Browser.php
5
+ * Author: Chris Schuld (http://chrisschuld.com/)
6
+ * Last Modified: July 22nd, 2016
7
+ * @version 2.0
8
+ * @package PegasusPHP
9
+ *
10
+ * Copyright (C) 2008-2010 Chris Schuld (chris@chrisschuld.com)
11
+ *
12
+ * This program is free software; you can redistribute it and/or
13
+ * modify it under the terms of the GNU General Public License as
14
+ * published by the Free Software Foundation; either version 2 of
15
+ * the License, or (at your option) any later version.
16
+ *
17
+ * This program is distributed in the hope that it will be useful,
18
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
19
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20
+ * GNU General Public License for more details at:
21
+ * http://www.gnu.org/copyleft/gpl.html
22
+ *
23
+ *
24
+ * Typical Usage:
25
+ *
26
+ * $browser = new Browser();
27
+ * if( $browser->getBrowser() == Browser::BROWSER_FIREFOX && $browser->getVersion() >= 2 ) {
28
+ * echo 'You have FireFox version 2 or greater';
29
+ * }
30
+ *
31
+ * User Agents Sampled from: http://www.useragentstring.com/
32
+ *
33
+ * This implementation is based on the original work from Gary White
34
+ * http://apptools.com/phptools/browser/
35
+ *
36
+ */
37
+ class Browser
38
+ {
39
+ private $_agent = '';
40
+ private $_browser_name = '';
41
+ private $_version = '';
42
+ private $_platform = '';
43
+ private $_os = '';
44
+ private $_is_aol = false;
45
+ private $_is_mobile = false;
46
+ private $_is_tablet = false;
47
+ private $_is_robot = false;
48
+ private $_is_facebook = false;
49
+ private $_aol_version = '';
50
+
51
+ const BROWSER_UNKNOWN = 'unknown';
52
+ const VERSION_UNKNOWN = 'unknown';
53
+
54
+ const BROWSER_OPERA = 'Opera'; // http://www.opera.com/
55
+ const BROWSER_OPERA_MINI = 'Opera Mini'; // http://www.opera.com/mini/
56
+ const BROWSER_WEBTV = 'WebTV'; // http://www.webtv.net/pc/
57
+ const BROWSER_EDGE = 'Edge'; // https://www.microsoft.com/edge
58
+ const BROWSER_IE = 'Internet Explorer'; // http://www.microsoft.com/ie/
59
+ const BROWSER_POCKET_IE = 'Pocket Internet Explorer'; // http://en.wikipedia.org/wiki/Internet_Explorer_Mobile
60
+ const BROWSER_KONQUEROR = 'Konqueror'; // http://www.konqueror.org/
61
+ const BROWSER_ICAB = 'iCab'; // http://www.icab.de/
62
+ const BROWSER_OMNIWEB = 'OmniWeb'; // http://www.omnigroup.com/applications/omniweb/
63
+ const BROWSER_FIREBIRD = 'Firebird'; // http://www.ibphoenix.com/
64
+ const BROWSER_FIREFOX = 'Firefox'; // http://www.mozilla.com/en-US/firefox/firefox.html
65
+ const BROWSER_ICEWEASEL = 'Iceweasel'; // http://www.geticeweasel.org/
66
+ const BROWSER_SHIRETOKO = 'Shiretoko'; // http://wiki.mozilla.org/Projects/shiretoko
67
+ const BROWSER_MOZILLA = 'Mozilla'; // http://www.mozilla.com/en-US/
68
+ const BROWSER_AMAYA = 'Amaya'; // http://www.w3.org/Amaya/
69
+ const BROWSER_LYNX = 'Lynx'; // http://en.wikipedia.org/wiki/Lynx
70
+ const BROWSER_SAFARI = 'Safari'; // http://apple.com
71
+ const BROWSER_IPHONE = 'iPhone'; // http://apple.com
72
+ const BROWSER_IPOD = 'iPod'; // http://apple.com
73
+ const BROWSER_IPAD = 'iPad'; // http://apple.com
74
+ const BROWSER_CHROME = 'Chrome'; // http://www.google.com/chrome
75
+ const BROWSER_ANDROID = 'Android'; // http://www.android.com/
76
+ const BROWSER_GOOGLEBOT = 'GoogleBot'; // http://en.wikipedia.org/wiki/Googlebot
77
+
78
+ const BROWSER_YANDEXBOT = 'YandexBot'; // http://yandex.com/bots
79
+ const BROWSER_YANDEXIMAGERESIZER_BOT = 'YandexImageResizer'; // http://yandex.com/bots
80
+ const BROWSER_YANDEXIMAGES_BOT = 'YandexImages'; // http://yandex.com/bots
81
+ const BROWSER_YANDEXVIDEO_BOT = 'YandexVideo'; // http://yandex.com/bots
82
+ const BROWSER_YANDEXMEDIA_BOT = 'YandexMedia'; // http://yandex.com/bots
83
+ const BROWSER_YANDEXBLOGS_BOT = 'YandexBlogs'; // http://yandex.com/bots
84
+ const BROWSER_YANDEXFAVICONS_BOT = 'YandexFavicons'; // http://yandex.com/bots
85
+ const BROWSER_YANDEXWEBMASTER_BOT = 'YandexWebmaster'; // http://yandex.com/bots
86
+ const BROWSER_YANDEXDIRECT_BOT = 'YandexDirect'; // http://yandex.com/bots
87
+ const BROWSER_YANDEXMETRIKA_BOT = 'YandexMetrika'; // http://yandex.com/bots
88
+ const BROWSER_YANDEXNEWS_BOT = 'YandexNews'; // http://yandex.com/bots
89
+ const BROWSER_YANDEXCATALOG_BOT = 'YandexCatalog'; // http://yandex.com/bots
90
+
91
+ const BROWSER_SLURP = 'Yahoo! Slurp'; // http://en.wikipedia.org/wiki/Yahoo!_Slurp
92
+ const BROWSER_W3CVALIDATOR = 'W3C Validator'; // http://validator.w3.org/
93
+ const BROWSER_BLACKBERRY = 'BlackBerry'; // http://www.blackberry.com/
94
+ const BROWSER_ICECAT = 'IceCat'; // http://en.wikipedia.org/wiki/GNU_IceCat
95
+ const BROWSER_NOKIA_S60 = 'Nokia S60 OSS Browser'; // http://en.wikipedia.org/wiki/Web_Browser_for_S60
96
+ const BROWSER_NOKIA = 'Nokia Browser'; // * all other WAP-based browsers on the Nokia Platform
97
+ const BROWSER_MSN = 'MSN Browser'; // http://explorer.msn.com/
98
+ const BROWSER_MSNBOT = 'MSN Bot'; // http://search.msn.com/msnbot.htm
99
+ const BROWSER_BINGBOT = 'Bing Bot'; // http://en.wikipedia.org/wiki/Bingbot
100
+ const BROWSER_VIVALDI = 'Vivalidi'; // https://vivaldi.com/
101
+ const BROWSER_YANDEX = 'Yandex'; // https://browser.yandex.ua/
102
+
103
+ const BROWSER_NETSCAPE_NAVIGATOR = 'Netscape Navigator'; // http://browser.netscape.com/ (DEPRECATED)
104
+ const BROWSER_GALEON = 'Galeon'; // http://galeon.sourceforge.net/ (DEPRECATED)
105
+ const BROWSER_NETPOSITIVE = 'NetPositive'; // http://en.wikipedia.org/wiki/NetPositive (DEPRECATED)
106
+ const BROWSER_PHOENIX = 'Phoenix'; // http://en.wikipedia.org/wiki/History_of_Mozilla_Firefox (DEPRECATED)
107
+ const BROWSER_PLAYSTATION = "PlayStation";
108
+ const BROWSER_SAMSUNG = "SamsungBrowser";
109
+ const BROWSER_SILK = "Silk";
110
+ const BROWSER_I_FRAME = "Iframely";
111
+ const BROWSER_COCOA = "CocoaRestClient";
112
+
113
+ const PLATFORM_UNKNOWN = 'unknown';
114
+ const PLATFORM_WINDOWS = 'Windows';
115
+ const PLATFORM_WINDOWS_CE = 'Windows CE';
116
+ const PLATFORM_APPLE = 'Apple';
117
+ const PLATFORM_LINUX = 'Linux';
118
+ const PLATFORM_OS2 = 'OS/2';
119
+ const PLATFORM_BEOS = 'BeOS';
120
+ const PLATFORM_IPHONE = 'iPhone';
121
+ const PLATFORM_IPOD = 'iPod';
122
+ const PLATFORM_IPAD = 'iPad';
123
+ const PLATFORM_BLACKBERRY = 'BlackBerry';
124
+ const PLATFORM_NOKIA = 'Nokia';
125
+ const PLATFORM_FREEBSD = 'FreeBSD';
126
+ const PLATFORM_OPENBSD = 'OpenBSD';
127
+ const PLATFORM_NETBSD = 'NetBSD';
128
+ const PLATFORM_SUNOS = 'SunOS';
129
+ const PLATFORM_OPENSOLARIS = 'OpenSolaris';
130
+ const PLATFORM_ANDROID = 'Android';
131
+ const PLATFORM_PLAYSTATION = "Sony PlayStation";
132
+ const PLATFORM_ROKU = "Roku";
133
+ const PLATFORM_APPLE_TV = "Apple TV";
134
+ const PLATFORM_TERMINAL = "Terminal";
135
+ const PLATFORM_FIRE_OS = "Fire OS";
136
+ const PLATFORM_SMART_TV = "SMART-TV";
137
+ const PLATFORM_CHROME_OS = "Chrome OS";
138
+ const PLATFORM_JAVA_ANDROID = "Java/Android";
139
+ const PLATFORM_POSTMAN = "Postman";
140
+ const PLATFORM_I_FRAME = "Iframely";
141
+
142
+ const OPERATING_SYSTEM_UNKNOWN = 'unknown';
143
+
144
+ /**
145
+ * Class constructor
146
+ */
147
+ public function __construct($userAgent = "")
148
+ {
149
+ $this->reset();
150
+ if ($userAgent != "") {
151
+ $this->setUserAgent($userAgent);
152
+ } else {
153
+ $this->determine();
154
+ }
155
+ }
156
+
157
+ /**
158
+ * Reset all properties
159
+ */
160
+ public function reset()
161
+ {
162
+ $this->_agent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : "";
163
+ $this->_browser_name = self::BROWSER_UNKNOWN;
164
+ $this->_version = self::VERSION_UNKNOWN;
165
+ $this->_platform = self::PLATFORM_UNKNOWN;
166
+ $this->_os = self::OPERATING_SYSTEM_UNKNOWN;
167
+ $this->_is_aol = false;
168
+ $this->_is_mobile = false;
169
+ $this->_is_tablet = false;
170
+ $this->_is_robot = false;
171
+ $this->_is_facebook = false;
172
+ $this->_aol_version = self::VERSION_UNKNOWN;
173
+ }
174
+
175
+ /**
176
+ * Check to see if the specific browser is valid
177
+ * @param string $browserName
178
+ * @return bool True if the browser is the specified browser
179
+ */
180
+ function isBrowser($browserName)
181
+ {
182
+ return (0 == strcasecmp($this->_browser_name, trim($browserName)));
183
+ }
184
+
185
+ /**
186
+ * The name of the browser. All return types are from the class contants
187
+ * @return string Name of the browser
188
+ */
189
+ public function getBrowser()
190
+ {
191
+ return $this->_browser_name;
192
+ }
193
+
194
+ /**
195
+ * Set the name of the browser
196
+ * @param $browser string The name of the Browser
197
+ */
198
+ public function setBrowser($browser)
199
+ {
200
+ $this->_browser_name = $browser;
201
+ }
202
+
203
+ /**
204
+ * The name of the platform. All return types are from the class contants
205
+ * @return string Name of the browser
206
+ */
207
+ public function getPlatform()
208
+ {
209
+ return $this->_platform;
210
+ }
211
+
212
+ /**
213
+ * Set the name of the platform
214
+ * @param string $platform The name of the Platform
215
+ */
216
+ public function setPlatform($platform)
217
+ {
218
+ $this->_platform = $platform;
219
+ }
220
+
221
+ /**
222
+ * The version of the browser.
223
+ * @return string Version of the browser (will only contain alpha-numeric characters and a period)
224
+ */
225
+ public function getVersion()
226
+ {
227
+ return $this->_version;
228
+ }
229
+
230
+ /**
231
+ * Set the version of the browser
232
+ * @param string $version The version of the Browser
233
+ */
234
+ public function setVersion($version)
235
+ {
236
+ $this->_version = preg_replace('/[^0-9,.,a-z,A-Z-]/', '', $version);
237
+ }
238
+
239
+ /**
240
+ * The version of AOL.
241
+ * @return string Version of AOL (will only contain alpha-numeric characters and a period)
242
+ */
243
+ public function getAolVersion()
244
+ {
245
+ return $this->_aol_version;
246
+ }
247
+
248
+ /**
249
+ * Set the version of AOL
250
+ * @param string $version The version of AOL
251
+ */
252
+ public function setAolVersion($version)
253
+ {
254
+ $this->_aol_version = preg_replace('/[^0-9,.,a-z,A-Z]/', '', $version);
255
+ }
256
+
257
+ /**
258
+ * Is the browser from AOL?
259
+ * @return boolean True if the browser is from AOL otherwise false
260
+ */
261
+ public function isAol()
262
+ {
263
+ return $this->_is_aol;
264
+ }
265
+
266
+ /**
267
+ * Is the browser from a mobile device?
268
+ * @return boolean True if the browser is from a mobile device otherwise false
269
+ */
270
+ public function isMobile()
271
+ {
272
+ return $this->_is_mobile;
273
+ }
274
+
275
+ /**
276
+ * Is the browser from a tablet device?
277
+ * @return boolean True if the browser is from a tablet device otherwise false
278
+ */
279
+ public function isTablet()
280
+ {
281
+ return $this->_is_tablet;
282
+ }
283
+
284
+ /**
285
+ * Is the browser from a robot (ex Slurp,GoogleBot)?
286
+ * @return boolean True if the browser is from a robot otherwise false
287
+ */
288
+ public function isRobot()
289
+ {
290
+ return $this->_is_robot;
291
+ }
292
+
293
+ /**
294
+ * Is the browser from facebook?
295
+ * @return boolean True if the browser is from facebook otherwise false
296
+ */
297
+ public function isFacebook()
298
+ {
299
+ return $this->_is_facebook;
300
+ }
301
+
302
+ /**
303
+ * Set the browser to be from AOL
304
+ * @param $isAol
305
+ */
306
+ public function setAol($isAol)
307
+ {
308
+ $this->_is_aol = $isAol;
309
+ }
310
+
311
+ /**
312
+ * Set the Browser to be mobile
313
+ * @param boolean $value is the browser a mobile browser or not
314
+ */
315
+ protected function setMobile($value = true)
316
+ {
317
+ $this->_is_mobile = $value;
318
+ }
319
+
320
+ /**
321
+ * Set the Browser to be tablet
322
+ * @param boolean $value is the browser a tablet browser or not
323
+ */
324
+ protected function setTablet($value = true)
325
+ {
326
+ $this->_is_tablet = $value;
327
+ }
328
+
329
+ /**
330
+ * Set the Browser to be a robot
331
+ * @param boolean $value is the browser a robot or not
332
+ */
333
+ protected function setRobot($value = true)
334
+ {
335
+ $this->_is_robot = $value;
336
+ }
337
+
338
+ /**
339
+ * Set the Browser to be a Facebook request
340
+ * @param boolean $value is the browser a robot or not
341
+ */
342
+ protected function setFacebook($value = true)
343
+ {
344
+ $this->_is_facebook = $value;
345
+ }
346
+
347
+ /**
348
+ * Get the user agent value in use to determine the browser
349
+ * @return string The user agent from the HTTP header
350
+ */
351
+ public function getUserAgent()
352
+ {
353
+ return $this->_agent;
354
+ }
355
+
356
+ /**
357
+ * Set the user agent value (the construction will use the HTTP header value - this will overwrite it)
358
+ * @param string $agent_string The value for the User Agent
359
+ */
360
+ public function setUserAgent($agent_string)
361
+ {
362
+ $this->reset();
363
+ $this->_agent = $agent_string;
364
+ $this->determine();
365
+ }
366
+
367
+ /**
368
+ * Used to determine if the browser is actually "chromeframe"
369
+ * @since 1.7
370
+ * @return boolean True if the browser is using chromeframe
371
+ */
372
+ public function isChromeFrame()
373
+ {
374
+ return (strpos($this->_agent, "chromeframe") !== false);
375
+ }
376
+
377
+ /**
378
+ * Returns a formatted string with a summary of the details of the browser.
379
+ * @return string formatted string with a summary of the browser
380
+ */
381
+ public function __toString()
382
+ {
383
+ return "<strong>Browser Name:</strong> {$this->getBrowser()}<br/>\n" .
384
+ "<strong>Browser Version:</strong> {$this->getVersion()}<br/>\n" .
385
+ "<strong>Browser User Agent String:</strong> {$this->getUserAgent()}<br/>\n" .
386
+ "<strong>Platform:</strong> {$this->getPlatform()}<br/>";
387
+ }
388
+
389
+ /**
390
+ * Protected routine to calculate and determine what the browser is in use (including platform)
391
+ */
392
+ protected function determine()
393
+ {
394
+ $this->checkPlatform();
395
+ $this->checkBrowsers();
396
+ $this->checkForAol();
397
+ }
398
+
399
+ /**
400
+ * Protected routine to determine the browser type
401
+ * @return boolean True if the browser was detected otherwise false
402
+ */
403
+ protected function checkBrowsers()
404
+ {
405
+ return (
406
+ // well-known, well-used
407
+ // Special Notes:
408
+ // (1) Opera must be checked before FireFox due to the odd
409
+ // user agents used in some older versions of Opera
410
+ // (2) WebTV is strapped onto Internet Explorer so we must
411
+ // check for WebTV before IE
412
+ // (3) (deprecated) Galeon is based on Firefox and needs to be
413
+ // tested before Firefox is tested
414
+ // (4) OmniWeb is based on Safari so OmniWeb check must occur
415
+ // before Safari
416
+ // (5) Netscape 9+ is based on Firefox so Netscape checks
417
+ // before FireFox are necessary
418
+ // (6) Vivalid is UA contains both Firefox and Chrome so Vivalid checks
419
+ // before Firefox and Chrome
420
+ $this->checkBrowserWebTv() ||
421
+ $this->checkBrowserEdge() ||
422
+ $this->checkBrowserInternetExplorer() ||
423
+ $this->checkBrowserOpera() ||
424
+ $this->checkBrowserGaleon() ||
425
+ $this->checkBrowserNetscapeNavigator9Plus() ||
426
+ $this->checkBrowserVivaldi() ||
427
+ $this->checkBrowserYandex() ||
428
+ $this->checkBrowserFirefox() ||
429
+ $this->checkBrowserChrome() ||
430
+ $this->checkBrowserOmniWeb() ||
431
+
432
+ // common mobile
433
+ $this->checkBrowserAndroid() ||
434
+ $this->checkBrowseriPad() ||
435
+ $this->checkBrowseriPod() ||
436
+ $this->checkBrowseriPhone() ||
437
+ $this->checkBrowserBlackBerry() ||
438
+ $this->checkBrowserNokia() ||
439
+
440
+ // common bots
441
+ $this->checkBrowserGoogleBot() ||
442
+ $this->checkBrowserMSNBot() ||
443
+ $this->checkBrowserBingBot() ||
444
+ $this->checkBrowserSlurp() ||
445
+
446
+ // Yandex bots
447
+ $this->checkBrowserYandexBot() ||
448
+ $this->checkBrowserYandexImageResizerBot() ||
449
+ $this->checkBrowserYandexBlogsBot() ||
450
+ $this->checkBrowserYandexCatalogBot() ||
451
+ $this->checkBrowserYandexDirectBot() ||
452
+ $this->checkBrowserYandexFaviconsBot() ||
453
+ $this->checkBrowserYandexImagesBot() ||
454
+ $this->checkBrowserYandexMediaBot() ||
455
+ $this->checkBrowserYandexMetrikaBot() ||
456
+ $this->checkBrowserYandexNewsBot() ||
457
+ $this->checkBrowserYandexVideoBot() ||
458
+ $this->checkBrowserYandexWebmasterBot() ||
459
+
460
+ // check for facebook external hit when loading URL
461
+ $this->checkFacebookExternalHit() ||
462
+
463
+ // WebKit base check (post mobile and others)
464
+ $this->checkBrowserSamsung() ||
465
+ $this->checkBrowserSilk() ||
466
+ $this->checkBrowserSafari() ||
467
+
468
+ // everyone else
469
+ $this->checkBrowserNetPositive() ||
470
+ $this->checkBrowserFirebird() ||
471
+ $this->checkBrowserKonqueror() ||
472
+ $this->checkBrowserIcab() ||
473
+ $this->checkBrowserPhoenix() ||
474
+ $this->checkBrowserAmaya() ||
475
+ $this->checkBrowserLynx() ||
476
+ $this->checkBrowserShiretoko() ||
477
+ $this->checkBrowserIceCat() ||
478
+ $this->checkBrowserIceweasel() ||
479
+ $this->checkBrowserW3CValidator() ||
480
+ $this->checkBrowserPlayStation() ||
481
+ $this->checkBrowserIframely() ||
482
+ $this->checkBrowserCocoa() ||
483
+ $this->checkBrowserMozilla() /* Mozilla is such an open standard that you must check it last */
484
+
485
+
486
+ );
487
+ }
488
+
489
+ /**
490
+ * Determine if the user is using a BlackBerry (last updated 1.7)
491
+ * @return boolean True if the browser is the BlackBerry browser otherwise false
492
+ */
493
+ protected function checkBrowserBlackBerry()
494
+ {
495
+ if (stripos($this->_agent, 'blackberry') !== false) {
496
+ $aresult = explode("/", stristr($this->_agent, "BlackBerry"));
497
+ if (isset($aresult[1])) {
498
+ $aversion = explode(' ', $aresult[1]);
499
+ $this->setVersion($aversion[0]);
500
+ $this->_browser_name = self::BROWSER_BLACKBERRY;
501
+ $this->setMobile(true);
502
+ return true;
503
+ }
504
+ }
505
+ return false;
506
+ }
507
+
508
+ /**
509
+ * Determine if the user is using an AOL User Agent (last updated 1.7)
510
+ * @return boolean True if the browser is from AOL otherwise false
511
+ */
512
+ protected function checkForAol()
513
+ {
514
+ $this->setAol(false);
515
+ $this->setAolVersion(self::VERSION_UNKNOWN);
516
+
517
+ if (stripos($this->_agent, 'aol') !== false) {
518
+ $aversion = explode(' ', stristr($this->_agent, 'AOL'));
519
+ if (isset($aversion[1])) {
520
+ $this->setAol(true);
521
+ $this->setAolVersion(preg_replace('/[^0-9\.a-z]/i', '', $aversion[1]));
522
+ return true;
523
+ }
524
+ }
525
+ return false;
526
+ }
527
+
528
+ /**
529
+ * Determine if the browser is the GoogleBot or not (last updated 1.7)
530
+ * @return boolean True if the browser is the GoogletBot otherwise false
531
+ */
532
+ protected function checkBrowserGoogleBot()
533
+ {
534
+ if (stripos($this->_agent, 'googlebot') !== false) {
535
+ $aresult = explode('/', stristr($this->_agent, 'googlebot'));
536
+ if (isset($aresult[1])) {
537
+ $aversion = explode(' ', $aresult[1]);
538
+ $this->setVersion(str_replace(';', '', $aversion[0]));
539
+ $this->_browser_name = self::BROWSER_GOOGLEBOT;
540
+ $this->setRobot(true);
541
+ return true;
542
+ }
543
+ }
544
+ return false;
545
+ }
546
+
547
+ /**
548
+ * Determine if the browser is the YandexBot or not
549
+ * @return boolean True if the browser is the YandexBot otherwise false
550
+ */
551
+ protected function checkBrowserYandexBot()
552
+ {
553
+ if (stripos($this->_agent, 'YandexBot') !== false) {
554
+ $aresult = explode('/', stristr($this->_agent, 'YandexBot'));
555
+ if (isset($aresult[1])) {
556
+ $aversion = explode(' ', $aresult[1]);
557
+ $this->setVersion(str_replace(';', '', $aversion[0]));
558
+ $this->_browser_name = self::BROWSER_YANDEXBOT;
559
+ $this->setRobot(true);
560
+ return true;
561
+ }
562
+ }
563
+ return false;
564
+ }
565
+
566
+ /**
567
+ * Determine if the browser is the YandexImageResizer or not
568
+ * @return boolean True if the browser is the YandexImageResizer otherwise false
569
+ */
570
+ protected function checkBrowserYandexImageResizerBot()
571
+ {
572
+ if (stripos($this->_agent, 'YandexImageResizer') !== false) {
573
+ $aresult = explode('/', stristr($this->_agent, 'YandexImageResizer'));
574
+ if (isset($aresult[1])) {
575
+ $aversion = explode(' ', $aresult[1]);
576
+ $this->setVersion(str_replace(';', '', $aversion[0]));
577
+ $this->_browser_name = self::BROWSER_YANDEXIMAGERESIZER_BOT;
578
+ $this->setRobot(true);
579
+ return true;
580
+ }
581
+ }
582
+ return false;
583
+ }
584
+
585
+ /**
586
+ * Determine if the browser is the YandexCatalog or not
587
+ * @return boolean True if the browser is the YandexCatalog otherwise false
588
+ */
589
+ protected function checkBrowserYandexCatalogBot()
590
+ {
591
+ if (stripos($this->_agent, 'YandexCatalog') !== false) {
592
+ $aresult = explode('/', stristr($this->_agent, 'YandexCatalog'));
593
+ if (isset($aresult[1])) {
594
+ $aversion = explode(' ', $aresult[1]);
595
+ $this->setVersion(str_replace(';', '', $aversion[0]));
596
+ $this->_browser_name = self::BROWSER_YANDEXCATALOG_BOT;
597
+ $this->setRobot(true);
598
+ return true;
599
+ }
600
+ }
601
+ return false;
602
+ }
603
+
604
+ /**
605
+ * Determine if the browser is the YandexNews or not
606
+ * @return boolean True if the browser is the YandexNews otherwise false
607
+ */
608
+ protected function checkBrowserYandexNewsBot()
609
+ {
610
+ if (stripos($this->_agent, 'YandexNews') !== false) {
611
+ $aresult = explode('/', stristr($this->_agent, 'YandexNews'));
612
+ if (isset($aresult[1])) {
613
+ $aversion = explode(' ', $aresult[1]);
614
+ $this->setVersion(str_replace(';', '', $aversion[0]));
615
+ $this->_browser_name = self::BROWSER_YANDEXNEWS_BOT;
616
+ $this->setRobot(true);
617
+ return true;
618
+ }
619
+ }
620
+ return false;
621
+ }
622
+
623
+ /**
624
+ * Determine if the browser is the YandexMetrika or not
625
+ * @return boolean True if the browser is the YandexMetrika otherwise false
626
+ */
627
+ protected function checkBrowserYandexMetrikaBot()
628
+ {
629
+ if (stripos($this->_agent, 'YandexMetrika') !== false) {
630
+ $aresult = explode('/', stristr($this->_agent, 'YandexMetrika'));
631
+ if (isset($aresult[1])) {
632
+ $aversion = explode(' ', $aresult[1]);
633
+ $this->setVersion(str_replace(';', '', $aversion[0]));
634
+ $this->_browser_name = self::BROWSER_YANDEXMETRIKA_BOT;
635
+ $this->setRobot(true);
636
+ return true;
637
+ }
638
+ }
639
+ return false;
640
+ }
641
+
642
+ /**
643
+ * Determine if the browser is the YandexDirect or not
644
+ * @return boolean True if the browser is the YandexDirect otherwise false
645
+ */
646
+ protected function checkBrowserYandexDirectBot()
647
+ {
648
+ if (stripos($this->_agent, 'YandexDirect') !== false) {
649
+ $aresult = explode('/', stristr($this->_agent, 'YandexDirect'));
650
+ if (isset($aresult[1])) {
651
+ $aversion = explode(' ', $aresult[1]);
652
+ $this->setVersion(str_replace(';', '', $aversion[0]));
653
+ $this->_browser_name = self::BROWSER_YANDEXDIRECT_BOT;
654
+ $this->setRobot(true);
655
+ return true;
656
+ }
657
+ }
658
+ return false;
659
+ }
660
+
661
+ /**
662
+ * Determine if the browser is the YandexWebmaster or not
663
+ * @return boolean True if the browser is the YandexWebmaster otherwise false
664
+ */
665
+ protected function checkBrowserYandexWebmasterBot()
666
+ {
667
+ if (stripos($this->_agent, 'YandexWebmaster') !== false) {
668
+ $aresult = explode('/', stristr($this->_agent, 'YandexWebmaster'));
669
+ if (isset($aresult[1])) {
670
+ $aversion = explode(' ', $aresult[1]);
671
+ $this->setVersion(str_replace(';', '', $aversion[0]));
672
+ $this->_browser_name = self::BROWSER_YANDEXWEBMASTER_BOT;
673
+ $this->setRobot(true);
674
+ return true;
675
+ }
676
+ }
677
+ return false;
678
+ }
679
+
680
+ /**
681
+ * Determine if the browser is the YandexFavicons or not
682
+ * @return boolean True if the browser is the YandexFavicons otherwise false
683
+ */
684
+ protected function checkBrowserYandexFaviconsBot()
685
+ {
686
+ if (stripos($this->_agent, 'YandexFavicons') !== false) {
687
+ $aresult = explode('/', stristr($this->_agent, 'YandexFavicons'));
688
+ if (isset($aresult[1])) {
689
+ $aversion = explode(' ', $aresult[1]);
690
+ $this->setVersion(str_replace(';', '', $aversion[0]));
691
+ $this->_browser_name = self::BROWSER_YANDEXFAVICONS_BOT;
692
+ $this->setRobot(true);
693
+ return true;
694
+ }
695
+ }
696
+ return false;
697
+ }
698
+
699
+ /**
700
+ * Determine if the browser is the YandexBlogs or not
701
+ * @return boolean True if the browser is the YandexBlogs otherwise false
702
+ */
703
+ protected function checkBrowserYandexBlogsBot()
704
+ {
705
+ if (stripos($this->_agent, 'YandexBlogs') !== false) {
706
+ $aresult = explode('/', stristr($this->_agent, 'YandexBlogs'));
707
+ if (isset($aresult[1])) {
708
+ $aversion = explode(' ', $aresult[1]);
709
+ $this->setVersion(str_replace(';', '', $aversion[0]));
710
+ $this->_browser_name = self::BROWSER_YANDEXBLOGS_BOT;
711
+ $this->setRobot(true);
712
+ return true;
713
+ }
714
+ }
715
+ return false;
716
+ }
717
+
718
+ /**
719
+ * Determine if the browser is the YandexMedia or not
720
+ * @return boolean True if the browser is the YandexMedia otherwise false
721
+ */
722
+ protected function checkBrowserYandexMediaBot()
723
+ {
724
+ if (stripos($this->_agent, 'YandexMedia') !== false) {
725
+ $aresult = explode('/', stristr($this->_agent, 'YandexMedia'));
726
+ if (isset($aresult[1])) {
727
+ $aversion = explode(' ', $aresult[1]);
728
+ $this->setVersion(str_replace(';', '', $aversion[0]));
729
+ $this->_browser_name = self::BROWSER_YANDEXMEDIA_BOT;
730
+ $this->setRobot(true);
731
+ return true;
732
+ }
733
+ }
734
+ return false;
735
+ }
736
+
737
+ /**
738
+ * Determine if the browser is the YandexVideo or not
739
+ * @return boolean True if the browser is the YandexVideo otherwise false
740
+ */
741
+ protected function checkBrowserYandexVideoBot()
742
+ {
743
+ if (stripos($this->_agent, 'YandexVideo') !== false) {
744
+ $aresult = explode('/', stristr($this->_agent, 'YandexVideo'));
745
+ if (isset($aresult[1])) {
746
+ $aversion = explode(' ', $aresult[1]);
747
+ $this->setVersion(str_replace(';', '', $aversion[0]));
748
+ $this->_browser_name = self::BROWSER_YANDEXVIDEO_BOT;
749
+ $this->setRobot(true);
750
+ return true;
751
+ }
752
+ }
753
+ return false;
754
+ }
755
+
756
+ /**
757
+ * Determine if the browser is the YandexImages or not
758
+ * @return boolean True if the browser is the YandexImages otherwise false
759
+ */
760
+ protected function checkBrowserYandexImagesBot()
761
+ {
762
+ if (stripos($this->_agent, 'YandexImages') !== false) {
763
+ $aresult = explode('/', stristr($this->_agent, 'YandexImages'));
764
+ if (isset($aresult[1])) {
765
+ $aversion = explode(' ', $aresult[1]);
766
+ $this->setVersion(str_replace(';', '', $aversion[0]));
767
+ $this->_browser_name = self::BROWSER_YANDEXIMAGES_BOT;
768
+ $this->setRobot(true);
769
+ return true;
770
+ }
771
+ }
772
+ return false;
773
+ }
774
+
775
+ /**
776
+ * Determine if the browser is the MSNBot or not (last updated 1.9)
777
+ * @return boolean True if the browser is the MSNBot otherwise false
778
+ */
779
+ protected function checkBrowserMSNBot()
780
+ {
781
+ if (stripos($this->_agent, "msnbot") !== false) {
782
+ $aresult = explode("/", stristr($this->_agent, "msnbot"));
783
+ if (isset($aresult[1])) {
784
+ $aversion = explode(" ", $aresult[1]);
785
+ $this->setVersion(str_replace(";", "", $aversion[0]));
786
+ $this->_browser_name = self::BROWSER_MSNBOT;
787
+ $this->setRobot(true);
788
+ return true;
789
+ }
790
+ }
791
+ return false;
792
+ }
793
+
794
+ /**
795
+ * Determine if the browser is the BingBot or not (last updated 1.9)
796
+ * @return boolean True if the browser is the BingBot otherwise false
797
+ */
798
+ protected function checkBrowserBingBot()
799
+ {
800
+ if (stripos($this->_agent, "bingbot") !== false) {
801
+ $aresult = explode("/", stristr($this->_agent, "bingbot"));
802
+ if (isset($aresult[1])) {
803
+ $aversion = explode(" ", $aresult[1]);
804
+ $this->setVersion(str_replace(";", "", $aversion[0]));
805
+ $this->_browser_name = self::BROWSER_BINGBOT;
806
+ $this->setRobot(true);
807
+ return true;
808
+ }
809
+ }
810
+ return false;
811
+ }
812
+
813
+ /**
814
+ * Determine if the browser is the W3C Validator or not (last updated 1.7)
815
+ * @return boolean True if the browser is the W3C Validator otherwise false
816
+ */
817
+ protected function checkBrowserW3CValidator()
818
+ {
819
+ if (stripos($this->_agent, 'W3C-checklink') !== false) {
820
+ $aresult = explode('/', stristr($this->_agent, 'W3C-checklink'));
821
+ if (isset($aresult[1])) {
822
+ $aversion = explode(' ', $aresult[1]);
823
+ $this->setVersion($aversion[0]);
824
+ $this->_browser_name = self::BROWSER_W3CVALIDATOR;
825
+ return true;
826
+ }
827
+ } else if (stripos($this->_agent, 'W3C_Validator') !== false) {
828
+ // Some of the Validator versions do not delineate w/ a slash - add it back in
829
+ $ua = str_replace("W3C_Validator ", "W3C_Validator/", $this->_agent);
830
+ $aresult = explode('/', stristr($ua, 'W3C_Validator'));
831
+ if (isset($aresult[1])) {
832
+ $aversion = explode(' ', $aresult[1]);
833
+ $this->setVersion($aversion[0]);
834
+ $this->_browser_name = self::BROWSER_W3CVALIDATOR;
835
+ return true;
836
+ }
837
+ } else if (stripos($this->_agent, 'W3C-mobileOK') !== false) {
838
+ $this->_browser_name = self::BROWSER_W3CVALIDATOR;
839
+ $this->setMobile(true);
840
+ return true;
841
+ }
842
+ return false;
843
+ }
844
+
845
+ /**
846
+ * Determine if the browser is the Yahoo! Slurp Robot or not (last updated 1.7)
847
+ * @return boolean True if the browser is the Yahoo! Slurp Robot otherwise false
848
+ */
849
+ protected function checkBrowserSlurp()
850
+ {
851
+ if (stripos($this->_agent, 'slurp') !== false) {
852
+ $aresult = explode('/', stristr($this->_agent, 'Slurp'));
853
+ if (isset($aresult[1])) {
854
+ $aversion = explode(' ', $aresult[1]);
855
+ $this->setVersion($aversion[0]);
856
+ $this->_browser_name = self::BROWSER_SLURP;
857
+ $this->setRobot(true);
858
+ $this->setMobile(false);
859
+ return true;
860
+ }
861
+ }
862
+ return false;
863
+ }
864
+
865
+ /**
866
+ * Determine if the browser is Edge or not
867
+ * @return boolean True if the browser is Edge otherwise false
868
+ */
869
+ protected function checkBrowserEdge()
870
+ {
871
+ if (stripos($this->_agent, 'Edge/') !== false) {
872
+ $aresult = explode('/', stristr($this->_agent, 'Edge'));
873
+ if (isset($aresult[1])) {
874
+ $aversion = explode(' ', $aresult[1]);
875
+ $this->setVersion($aversion[0]);
876
+ $this->setBrowser(self::BROWSER_EDGE);
877
+ if (stripos($this->_agent, 'Windows Phone') !== false || stripos($this->_agent, 'Android') !== false) {
878
+ $this->setMobile(true);
879
+ }
880
+ return true;
881
+ }
882
+ }
883
+ return false;
884
+ }
885
+
886
+ /**
887
+ * Determine if the browser is Internet Explorer or not (last updated 1.7)
888
+ * @return boolean True if the browser is Internet Explorer otherwise false
889
+ */
890
+ protected function checkBrowserInternetExplorer()
891
+ {
892
+ // Test for IE11
893
+ if (stripos($this->_agent, 'Trident/7.0; rv:11.0') !== false) {
894
+ $this->setBrowser(self::BROWSER_IE);
895
+ $this->setVersion('11.0');
896
+ return true;
897
+ } // Test for v1 - v1.5 IE
898
+ else if (stripos($this->_agent, 'microsoft internet explorer') !== false) {
899
+ $this->setBrowser(self::BROWSER_IE);
900
+ $this->setVersion('1.0');
901
+ $aresult = stristr($this->_agent, '/');
902
+ if (preg_match('/308|425|426|474|0b1/i', $aresult)) {
903
+ $this->setVersion('1.5');
904
+ }
905
+ return true;
906
+ } // Test for versions > 1.5
907
+ else if (stripos($this->_agent, 'msie') !== false && stripos($this->_agent, 'opera') === false) {
908
+ // See if the browser is the odd MSN Explorer
909
+ if (stripos($this->_agent, 'msnb') !== false) {
910
+ $aresult = explode(' ', stristr(str_replace(';', '; ', $this->_agent), 'MSN'));
911
+ if (isset($aresult[1])) {
912
+ $this->setBrowser(self::BROWSER_MSN);
913
+ $this->setVersion(str_replace(array('(', ')', ';'), '', $aresult[1]));
914
+ return true;
915
+ }
916
+ }
917
+ $aresult = explode(' ', stristr(str_replace(';', '; ', $this->_agent), 'msie'));
918
+ if (isset($aresult[1])) {
919
+ $this->setBrowser(self::BROWSER_IE);
920
+ $this->setVersion(str_replace(array('(', ')', ';'), '', $aresult[1]));
921
+ if(preg_match('#trident/([0-9\.]+);#i', $this->_agent, $aresult)){
922
+ if($aresult[1] == '3.1'){
923
+ $this->setVersion('7.0');
924
+ }
925
+ else if($aresult[1] == '4.0'){
926
+ $this->setVersion('8.0');
927
+ }
928
+ else if($aresult[1] == '5.0'){
929
+ $this->setVersion('9.0');
930
+ }
931
+ else if($aresult[1] == '6.0'){
932
+ $this->setVersion('10.0');
933
+ }
934
+ else if($aresult[1] == '7.0'){
935
+ $this->setVersion('11.0');
936
+ }
937
+ else if($aresult[1] == '8.0'){
938
+ $this->setVersion('11.0');
939
+ }
940
+ }
941
+ if(stripos($this->_agent, 'IEMobile') !== false) {
942
+ $this->setBrowser(self::BROWSER_POCKET_IE);
943
+ $this->setMobile(true);
944
+ }
945
+ return true;
946
+ }
947
+ } // Test for versions > IE 10
948
+ else if (stripos($this->_agent, 'trident') !== false) {
949
+ $this->setBrowser(self::BROWSER_IE);
950
+ $result = explode('rv:', $this->_agent);
951
+ if (isset($result[1])) {
952
+ $this->setVersion(preg_replace('/[^0-9.]+/', '', $result[1]));
953
+ $this->_agent = str_replace(array("Mozilla", "Gecko"), "MSIE", $this->_agent);
954
+ }
955
+ } // Test for Pocket IE
956
+ else if (stripos($this->_agent, 'mspie') !== false || stripos($this->_agent, 'pocket') !== false) {
957
+ $aresult = explode(' ', stristr($this->_agent, 'mspie'));
958
+ if (isset($aresult[1])) {
959
+ $this->setPlatform(self::PLATFORM_WINDOWS_CE);
960
+ $this->setBrowser(self::BROWSER_POCKET_IE);
961
+ $this->setMobile(true);
962
+
963
+ if (stripos($this->_agent, 'mspie') !== false) {
964
+ $this->setVersion($aresult[1]);
965
+ } else {
966
+ $aversion = explode('/', $this->_agent);
967
+ if (isset($aversion[1])) {
968
+ $this->setVersion($aversion[1]);
969
+ }
970
+ }
971
+ return true;
972
+ }
973
+ }
974
+ return false;
975
+ }
976
+
977
+ /**
978
+ * Determine if the browser is Opera or not (last updated 1.7)
979
+ * @return boolean True if the browser is Opera otherwise false
980
+ */
981
+ protected function checkBrowserOpera()
982
+ {
983
+ if (stripos($this->_agent, 'opera mini') !== false) {
984
+ $resultant = stristr($this->_agent, 'opera mini');
985
+ if (preg_match('/\//', $resultant)) {
986
+ $aresult = explode('/', $resultant);
987
+ if (isset($aresult[1])) {
988
+ $aversion = explode(' ', $aresult[1]);
989
+ $this->setVersion($aversion[0]);
990
+ }
991
+ } else {
992
+ $aversion = explode(' ', stristr($resultant, 'opera mini'));
993
+ if (isset($aversion[1])) {
994
+ $this->setVersion($aversion[1]);
995
+ }
996
+ }
997
+ $this->_browser_name = self::BROWSER_OPERA_MINI;
998
+ $this->setMobile(true);
999
+ return true;
1000
+ } else if (stripos($this->_agent, 'opera') !== false) {
1001
+ $resultant = stristr($this->_agent, 'opera');
1002
+ if (preg_match('/Version\/(1*.*)$/', $resultant, $matches)) {
1003
+ $this->setVersion($matches[1]);
1004
+ } else if (preg_match('/\//', $resultant)) {
1005
+ $aresult = explode('/', str_replace("(", " ", $resultant));
1006
+ if (isset($aresult[1])) {
1007
+ $aversion = explode(' ', $aresult[1]);
1008
+ $this->setVersion($aversion[0]);
1009
+ }
1010
+ } else {
1011
+ $aversion = explode(' ', stristr($resultant, 'opera'));
1012
+ $this->setVersion(isset($aversion[1]) ? $aversion[1] : "");
1013
+ }
1014
+ if (stripos($this->_agent, 'Opera Mobi') !== false) {
1015
+ $this->setMobile(true);
1016
+ }
1017
+ $this->_browser_name = self::BROWSER_OPERA;
1018
+ return true;
1019
+ } else if (stripos($this->_agent, 'OPR') !== false) {
1020
+ $resultant = stristr($this->_agent, 'OPR');
1021
+ if (preg_match('/\//', $resultant)) {
1022
+ $aresult = explode('/', str_replace("(", " ", $resultant));
1023
+ if (isset($aresult[1])) {
1024
+ $aversion = explode(' ', $aresult[1]);
1025
+ $this->setVersion($aversion[0]);
1026
+ }
1027
+ }
1028
+ if (stripos($this->_agent, 'Mobile') !== false) {
1029
+ $this->setMobile(true);
1030
+ }
1031
+ $this->_browser_name = self::BROWSER_OPERA;
1032
+ return true;
1033
+ }
1034
+ return false;
1035
+ }
1036
+
1037
+ /**
1038
+ * Determine if the browser is Chrome or not (last updated 1.7)
1039
+ * @return boolean True if the browser is Chrome otherwise false
1040
+ */
1041
+ protected function checkBrowserChrome()
1042
+ {
1043
+ if (stripos($this->_agent, 'Chrome') !== false) {
1044
+ $aresult = explode('/', stristr($this->_agent, 'Chrome'));
1045
+ if (isset($aresult[1])) {
1046
+ $aversion = explode(' ', $aresult[1]);
1047
+ $this->setVersion($aversion[0]);
1048
+ $this->setBrowser(self::BROWSER_CHROME);
1049
+ //Chrome on Android
1050
+ if (stripos($this->_agent, 'Android') !== false) {
1051
+ if (stripos($this->_agent, 'Mobile') !== false) {
1052
+ $this->setMobile(true);
1053
+ } else {
1054
+ $this->setTablet(true);
1055
+ }
1056
+ }
1057
+ return true;
1058
+ }
1059
+ }
1060
+ return false;
1061
+ }
1062
+
1063
+
1064
+ /**
1065
+ * Determine if the browser is WebTv or not (last updated 1.7)
1066
+ * @return boolean True if the browser is WebTv otherwise false
1067
+ */
1068
+ protected function checkBrowserWebTv()
1069
+ {
1070
+ if (stripos($this->_agent, 'webtv') !== false) {
1071
+ $aresult = explode('/', stristr($this->_agent, 'webtv'));
1072
+ if (isset($aresult[1])) {
1073
+ $aversion = explode(' ', $aresult[1]);
1074
+ $this->setVersion($aversion[0]);
1075
+ $this->setBrowser(self::BROWSER_WEBTV);
1076
+ return true;
1077
+ }
1078
+ }
1079
+ return false;
1080
+ }
1081
+
1082
+ /**
1083
+ * Determine if the browser is NetPositive or not (last updated 1.7)
1084
+ * @return boolean True if the browser is NetPositive otherwise false
1085
+ */
1086
+ protected function checkBrowserNetPositive()
1087
+ {
1088
+ if (stripos($this->_agent, 'NetPositive') !== false) {
1089
+ $aresult = explode('/', stristr($this->_agent, 'NetPositive'));
1090
+ if (isset($aresult[1])) {
1091
+ $aversion = explode(' ', $aresult[1]);
1092
+ $this->setVersion(str_replace(array('(', ')', ';'), '', $aversion[0]));
1093
+ $this->setBrowser(self::BROWSER_NETPOSITIVE);
1094
+ return true;
1095
+ }
1096
+ }
1097
+ return false;
1098
+ }
1099
+
1100
+ /**
1101
+ * Determine if the browser is Galeon or not (last updated 1.7)
1102
+ * @return boolean True if the browser is Galeon otherwise false
1103
+ */
1104
+ protected function checkBrowserGaleon()
1105
+ {
1106
+ if (stripos($this->_agent, 'galeon') !== false) {
1107
+ $aresult = explode(' ', stristr($this->_agent, 'galeon'));
1108
+ $aversion = explode('/', $aresult[0]);
1109
+ if (isset($aversion[1])) {
1110
+ $this->setVersion($aversion[1]);
1111
+ $this->setBrowser(self::BROWSER_GALEON);
1112
+ return true;
1113
+ }
1114
+ }
1115
+ return false;
1116
+ }
1117
+
1118
+ /**
1119
+ * Determine if the browser is Konqueror or not (last updated 1.7)
1120
+ * @return boolean True if the browser is Konqueror otherwise false
1121
+ */
1122
+ protected function checkBrowserKonqueror()
1123
+ {
1124
+ if (stripos($this->_agent, 'Konqueror') !== false) {
1125
+ $aresult = explode(' ', stristr($this->_agent, 'Konqueror'));
1126
+ $aversion = explode('/', $aresult[0]);
1127
+ if (isset($aversion[1])) {
1128
+ $this->setVersion($aversion[1]);
1129
+ $this->setBrowser(self::BROWSER_KONQUEROR);
1130
+ return true;
1131
+ }
1132
+ }
1133
+ return false;
1134
+ }
1135
+
1136
+ /**
1137
+ * Determine if the browser is iCab or not (last updated 1.7)
1138
+ * @return boolean True if the browser is iCab otherwise false
1139
+ */
1140
+ protected function checkBrowserIcab()
1141
+ {
1142
+ if (stripos($this->_agent, 'icab') !== false) {
1143
+ $aversion = explode(' ', stristr(str_replace('/', ' ', $this->_agent), 'icab'));
1144
+ if (isset($aversion[1])) {
1145
+ $this->setVersion($aversion[1]);
1146
+ $this->setBrowser(self::BROWSER_ICAB);
1147
+ return true;
1148
+ }
1149
+ }
1150
+ return false;
1151
+ }
1152
+
1153
+ /**
1154
+ * Determine if the browser is OmniWeb or not (last updated 1.7)
1155
+ * @return boolean True if the browser is OmniWeb otherwise false
1156
+ */
1157
+ protected function checkBrowserOmniWeb()
1158
+ {
1159
+ if (stripos($this->_agent, 'omniweb') !== false) {
1160
+ $aresult = explode('/', stristr($this->_agent, 'omniweb'));
1161
+ $aversion = explode(' ', isset($aresult[1]) ? $aresult[1] : "");
1162
+ $this->setVersion($aversion[0]);
1163
+ $this->setBrowser(self::BROWSER_OMNIWEB);
1164
+ return true;
1165
+ }
1166
+ return false;
1167
+ }
1168
+
1169
+ /**
1170
+ * Determine if the browser is Phoenix or not (last updated 1.7)
1171
+ * @return boolean True if the browser is Phoenix otherwise false
1172
+ */
1173
+ protected function checkBrowserPhoenix()
1174
+ {
1175
+ if (stripos($this->_agent, 'Phoenix') !== false) {
1176
+ $aversion = explode('/', stristr($this->_agent, 'Phoenix'));
1177
+ if (isset($aversion[1])) {
1178
+ $this->setVersion($aversion[1]);
1179
+ $this->setBrowser(self::BROWSER_PHOENIX);
1180
+ return true;
1181
+ }
1182
+ }
1183
+ return false;
1184
+ }
1185
+
1186
+ /**
1187
+ * Determine if the browser is Firebird or not (last updated 1.7)
1188
+ * @return boolean True if the browser is Firebird otherwise false
1189
+ */
1190
+ protected function checkBrowserFirebird()
1191
+ {
1192
+ if (stripos($this->_agent, 'Firebird') !== false) {
1193
+ $aversion = explode('/', stristr($this->_agent, 'Firebird'));
1194
+ if (isset($aversion[1])) {
1195
+ $this->setVersion($aversion[1]);
1196
+ $this->setBrowser(self::BROWSER_FIREBIRD);
1197
+ return true;
1198
+ }
1199
+ }
1200
+ return false;
1201
+ }
1202
+
1203
+ /**
1204
+ * Determine if the browser is Netscape Navigator 9+ or not (last updated 1.7)
1205
+ * NOTE: (http://browser.netscape.com/ - Official support ended on March 1st, 2008)
1206
+ * @return boolean True if the browser is Netscape Navigator 9+ otherwise false
1207
+ */
1208
+ protected function checkBrowserNetscapeNavigator9Plus()
1209
+ {
1210
+ if (stripos($this->_agent, 'Firefox') !== false && preg_match('/Navigator\/([^ ]*)/i', $this->_agent, $matches)) {
1211
+ $this->setVersion($matches[1]);
1212
+ $this->setBrowser(self::BROWSER_NETSCAPE_NAVIGATOR);
1213
+ return true;
1214
+ } else if (stripos($this->_agent, 'Firefox') === false && preg_match('/Netscape6?\/([^ ]*)/i', $this->_agent, $matches)) {
1215
+ $this->setVersion($matches[1]);
1216
+ $this->setBrowser(self::BROWSER_NETSCAPE_NAVIGATOR);
1217
+ return true;
1218
+ }
1219
+ return false;
1220
+ }
1221
+
1222
+ /**
1223
+ * Determine if the browser is Shiretoko or not (https://wiki.mozilla.org/Projects/shiretoko) (last updated 1.7)
1224
+ * @return boolean True if the browser is Shiretoko otherwise false
1225
+ */
1226
+ protected function checkBrowserShiretoko()
1227
+ {
1228
+ if (stripos($this->_agent, 'Mozilla') !== false && preg_match('/Shiretoko\/([^ ]*)/i', $this->_agent, $matches)) {
1229
+ $this->setVersion($matches[1]);
1230
+ $this->setBrowser(self::BROWSER_SHIRETOKO);
1231
+ return true;
1232
+ }
1233
+ return false;
1234
+ }
1235
+
1236
+ /**
1237
+ * Determine if the browser is Ice Cat or not (http://en.wikipedia.org/wiki/GNU_IceCat) (last updated 1.7)
1238
+ * @return boolean True if the browser is Ice Cat otherwise false
1239
+ */
1240
+ protected function checkBrowserIceCat()
1241
+ {
1242
+ if (stripos($this->_agent, 'Mozilla') !== false && preg_match('/IceCat\/([^ ]*)/i', $this->_agent, $matches)) {
1243
+ $this->setVersion($matches[1]);
1244
+ $this->setBrowser(self::BROWSER_ICECAT);
1245
+ return true;
1246
+ }
1247
+ return false;
1248
+ }
1249
+
1250
+ /**
1251
+ * Determine if the browser is Nokia or not (last updated 1.7)
1252
+ * @return boolean True if the browser is Nokia otherwise false
1253
+ */
1254
+ protected function checkBrowserNokia()
1255
+ {
1256
+ if (preg_match("/Nokia([^\/]+)\/([^ SP]+)/i", $this->_agent, $matches)) {
1257
+ $this->setVersion($matches[2]);
1258
+ if (stripos($this->_agent, 'Series60') !== false || strpos($this->_agent, 'S60') !== false) {
1259
+ $this->setBrowser(self::BROWSER_NOKIA_S60);
1260
+ } else {
1261
+ $this->setBrowser(self::BROWSER_NOKIA);
1262
+ }
1263
+ $this->setMobile(true);
1264
+ return true;
1265
+ }
1266
+ return false;
1267
+ }
1268
+
1269
+ /**
1270
+ * Determine if the browser is Firefox or not (last updated 1.7)
1271
+ * @return boolean True if the browser is Firefox otherwise false
1272
+ */
1273
+ protected function checkBrowserFirefox()
1274
+ {
1275
+ if (stripos($this->_agent, 'safari') === false) {
1276
+ if (preg_match("/Firefox[\/ \(]([^ ;\)]+)/i", $this->_agent, $matches)) {
1277
+ $this->setVersion($matches[1]);
1278
+ $this->setBrowser(self::BROWSER_FIREFOX);
1279
+ //Firefox on Android
1280
+ if (stripos($this->_agent, 'Android') !== false) {
1281
+ if (stripos($this->_agent, 'Mobile') !== false) {
1282
+ $this->setMobile(true);
1283
+ } else {
1284
+ $this->setTablet(true);
1285
+ }
1286
+ }
1287
+ return true;
1288
+ } else if (preg_match("/Firefox$/i", $this->_agent, $matches)) {
1289
+ $this->setVersion("");
1290
+ $this->setBrowser(self::BROWSER_FIREFOX);
1291
+ return true;
1292
+ }
1293
+ }
1294
+ return false;
1295
+ }
1296
+
1297
+ /**
1298
+ * Determine if the browser is Firefox or not (last updated 1.7)
1299
+ * @return boolean True if the browser is Firefox otherwise false
1300
+ */
1301
+ protected function checkBrowserIceweasel()
1302
+ {
1303
+ if (stripos($this->_agent, 'Iceweasel') !== false) {
1304
+ $aresult = explode('/', stristr($this->_agent, 'Iceweasel'));
1305
+ if (isset($aresult[1])) {
1306
+ $aversion = explode(' ', $aresult[1]);
1307
+ $this->setVersion($aversion[0]);
1308
+ $this->setBrowser(self::BROWSER_ICEWEASEL);
1309
+ return true;
1310
+ }
1311
+ }
1312
+ return false;
1313
+ }
1314
+
1315
+ /**
1316
+ * Determine if the browser is Mozilla or not (last updated 1.7)
1317
+ * @return boolean True if the browser is Mozilla otherwise false
1318
+ */
1319
+ protected function checkBrowserMozilla()
1320
+ {
1321
+ if (stripos($this->_agent, 'mozilla') !== false && preg_match('/rv:[0-9].[0-9][a-b]?/i', $this->_agent) && stripos($this->_agent, 'netscape') === false) {
1322
+ $aversion = explode(' ', stristr($this->_agent, 'rv:'));
1323
+ preg_match('/rv:[0-9].[0-9][a-b]?/i', $this->_agent, $aversion);
1324
+ $this->setVersion(str_replace('rv:', '', $aversion[0]));
1325
+ $this->setBrowser(self::BROWSER_MOZILLA);
1326
+ return true;
1327
+ } else if (stripos($this->_agent, 'mozilla') !== false && preg_match('/rv:[0-9]\.[0-9]/i', $this->_agent) && stripos($this->_agent, 'netscape') === false) {
1328
+ $aversion = explode('', stristr($this->_agent, 'rv:'));
1329
+ $this->setVersion(str_replace('rv:', '', $aversion[0]));
1330
+ $this->setBrowser(self::BROWSER_MOZILLA);
1331
+ return true;
1332
+ } else if (stripos($this->_agent, 'mozilla') !== false && preg_match('/mozilla\/([^ ]*)/i', $this->_agent, $matches) && stripos($this->_agent, 'netscape') === false) {
1333
+ $this->setVersion($matches[1]);
1334
+ $this->setBrowser(self::BROWSER_MOZILLA);
1335
+ return true;
1336
+ }
1337
+ return false;
1338
+ }
1339
+
1340
+ /**
1341
+ * Determine if the browser is Lynx or not (last updated 1.7)
1342
+ * @return boolean True if the browser is Lynx otherwise false
1343
+ */
1344
+ protected function checkBrowserLynx()
1345
+ {
1346
+ if (stripos($this->_agent, 'lynx') !== false) {
1347
+ $aresult = explode('/', stristr($this->_agent, 'Lynx'));
1348
+ $aversion = explode(' ', (isset($aresult[1]) ? $aresult[1] : ""));
1349
+ $this->setVersion($aversion[0]);
1350
+ $this->setBrowser(self::BROWSER_LYNX);
1351
+ return true;
1352
+ }
1353
+ return false;
1354
+ }
1355
+
1356
+ /**
1357
+ * Determine if the browser is Amaya or not (last updated 1.7)
1358
+ * @return boolean True if the browser is Amaya otherwise false
1359
+ */
1360
+ protected function checkBrowserAmaya()
1361
+ {
1362
+ if (stripos($this->_agent, 'amaya') !== false) {
1363
+ $aresult = explode('/', stristr($this->_agent, 'Amaya'));
1364
+ if (isset($aresult[1])) {
1365
+ $aversion = explode(' ', $aresult[1]);
1366
+ $this->setVersion($aversion[0]);
1367
+ $this->setBrowser(self::BROWSER_AMAYA);
1368
+ return true;
1369
+ }
1370
+ }
1371
+ return false;
1372
+ }
1373
+
1374
+ /**
1375
+ * Determine if the browser is Safari or not (last updated 1.7)
1376
+ * @return boolean True if the browser is Safari otherwise false
1377
+ */
1378
+ protected function checkBrowserSafari()
1379
+ {
1380
+ if (stripos($this->_agent, 'Safari') !== false
1381
+ && stripos($this->_agent, 'iPhone') === false
1382
+ && stripos($this->_agent, 'iPod') === false
1383
+ ) {
1384
+
1385
+ $aresult = explode('/', stristr($this->_agent, 'Version'));
1386
+ if (isset($aresult[1])) {
1387
+ $aversion = explode(' ', $aresult[1]);
1388
+ $this->setVersion($aversion[0]);
1389
+ } else {
1390
+ $this->setVersion(self::VERSION_UNKNOWN);
1391
+ }
1392
+ $this->setBrowser(self::BROWSER_SAFARI);
1393
+ return true;
1394
+ }
1395
+ return false;
1396
+ }
1397
+
1398
+ protected function checkBrowserSamsung()
1399
+ {
1400
+ if (stripos($this->_agent, 'SamsungBrowser') !== false) {
1401
+
1402
+ $aresult = explode('/', stristr($this->_agent, 'SamsungBrowser'));
1403
+ if (isset($aresult[1])) {
1404
+ $aversion = explode(' ', $aresult[1]);
1405
+ $this->setVersion($aversion[0]);
1406
+ } else {
1407
+ $this->setVersion(self::VERSION_UNKNOWN);
1408
+ }
1409
+ $this->setBrowser(self::BROWSER_SAMSUNG);
1410
+ return true;
1411
+ }
1412
+ return false;
1413
+ }
1414
+
1415
+ protected function checkBrowserSilk()
1416
+ {
1417
+ if (stripos($this->_agent, 'Silk') !== false) {
1418
+ $aresult = explode('/', stristr($this->_agent, 'Silk'));
1419
+ if (isset($aresult[1])) {
1420
+ $aversion = explode(' ', $aresult[1]);
1421
+ $this->setVersion($aversion[0]);
1422
+ } else {
1423
+ $this->setVersion(self::VERSION_UNKNOWN);
1424
+ }
1425
+ $this->setBrowser(self::BROWSER_SILK);
1426
+ return true;
1427
+ }
1428
+ return false;
1429
+ }
1430
+
1431
+ protected function checkBrowserIframely()
1432
+ {
1433
+ if (stripos($this->_agent, 'Iframely') !== false) {
1434
+ $aresult = explode('/', stristr($this->_agent, 'Iframely'));
1435
+ if (isset($aresult[1])) {
1436
+ $aversion = explode(' ', $aresult[1]);
1437
+ $this->setVersion($aversion[0]);
1438
+ } else {
1439
+ $this->setVersion(self::VERSION_UNKNOWN);
1440
+ }
1441
+ $this->setBrowser(self::BROWSER_I_FRAME);
1442
+ return true;
1443
+ }
1444
+ return false;
1445
+ }
1446
+
1447
+ protected function checkBrowserCocoa()
1448
+ {
1449
+ if (stripos($this->_agent, 'CocoaRestClient') !== false) {
1450
+ $aresult = explode('/', stristr($this->_agent, 'CocoaRestClient'));
1451
+ if (isset($aresult[1])) {
1452
+ $aversion = explode(' ', $aresult[1]);
1453
+ $this->setVersion($aversion[0]);
1454
+ } else {
1455
+ $this->setVersion(self::VERSION_UNKNOWN);
1456
+ }
1457
+ $this->setBrowser(self::BROWSER_COCOA);
1458
+ return true;
1459
+ }
1460
+ return false;
1461
+ }
1462
+
1463
+ /**
1464
+ * Detect if URL is loaded from FacebookExternalHit
1465
+ * @return boolean True if it detects FacebookExternalHit otherwise false
1466
+ */
1467
+ protected function checkFacebookExternalHit()
1468
+ {
1469
+ if (stristr($this->_agent, 'FacebookExternalHit')) {
1470
+ $this->setRobot(true);
1471
+ $this->setFacebook(true);
1472
+ return true;
1473
+ }
1474
+ return false;
1475
+ }
1476
+
1477
+ /**
1478
+ * Detect if URL is being loaded from internal Facebook browser
1479
+ * @return boolean True if it detects internal Facebook browser otherwise false
1480
+ */
1481
+ protected function checkForFacebookIos()
1482
+ {
1483
+ if (stristr($this->_agent, 'FBIOS')) {
1484
+ $this->setFacebook(true);
1485
+ return true;
1486
+ }
1487
+ return false;
1488
+ }
1489
+
1490
+ /**
1491
+ * Detect Version for the Safari browser on iOS devices
1492
+ * @return boolean True if it detects the version correctly otherwise false
1493
+ */
1494
+ protected function getSafariVersionOnIos()
1495
+ {
1496
+ $aresult = explode('/', stristr($this->_agent, 'Version'));
1497
+ if (isset($aresult[1])) {
1498
+ $aversion = explode(' ', $aresult[1]);
1499
+ $this->setVersion($aversion[0]);
1500
+ return true;
1501
+ }
1502
+ return false;
1503
+ }
1504
+
1505
+ /**
1506
+ * Detect Version for the Chrome browser on iOS devices
1507
+ * @return boolean True if it detects the version correctly otherwise false
1508
+ */
1509
+ protected function getChromeVersionOnIos()
1510
+ {
1511
+ $aresult = explode('/', stristr($this->_agent, 'CriOS'));
1512
+ if (isset($aresult[1])) {
1513
+ $aversion = explode(' ', $aresult[1]);
1514
+ $this->setVersion($aversion[0]);
1515
+ $this->setBrowser(self::BROWSER_CHROME);
1516
+ return true;
1517
+ }
1518
+ return false;
1519
+ }
1520
+
1521
+ /**
1522
+ * Determine if the browser is iPhone or not (last updated 1.7)
1523
+ * @return boolean True if the browser is iPhone otherwise false
1524
+ */
1525
+ protected function checkBrowseriPhone()
1526
+ {
1527
+ if (stripos($this->_agent, 'iPhone') !== false) {
1528
+ $this->setVersion(self::VERSION_UNKNOWN);
1529
+ $this->setBrowser(self::BROWSER_IPHONE);
1530
+ $this->getSafariVersionOnIos();
1531
+ $this->getChromeVersionOnIos();
1532
+ $this->checkForFacebookIos();
1533
+ $this->setMobile(true);
1534
+ return true;
1535
+
1536
+ }
1537
+ return false;
1538
+ }
1539
+
1540
+ /**
1541
+ * Determine if the browser is iPad or not (last updated 1.7)
1542
+ * @return boolean True if the browser is iPad otherwise false
1543
+ */
1544
+ protected function checkBrowseriPad()
1545
+ {
1546
+ if (stripos($this->_agent, 'iPad') !== false) {
1547
+ $this->setVersion(self::VERSION_UNKNOWN);
1548
+ $this->setBrowser(self::BROWSER_IPAD);
1549
+ $this->getSafariVersionOnIos();
1550
+ $this->getChromeVersionOnIos();
1551
+ $this->checkForFacebookIos();
1552
+ $this->setTablet(true);
1553
+ return true;
1554
+ }
1555
+ return false;
1556
+ }
1557
+
1558
+ /**
1559
+ * Determine if the browser is iPod or not (last updated 1.7)
1560
+ * @return boolean True if the browser is iPod otherwise false
1561
+ */
1562
+ protected function checkBrowseriPod()
1563
+ {
1564
+ if (stripos($this->_agent, 'iPod') !== false) {
1565
+ $this->setVersion(self::VERSION_UNKNOWN);
1566
+ $this->setBrowser(self::BROWSER_IPOD);
1567
+ $this->getSafariVersionOnIos();
1568
+ $this->getChromeVersionOnIos();
1569
+ $this->checkForFacebookIos();
1570
+ $this->setMobile(true);
1571
+ return true;
1572
+ }
1573
+ return false;
1574
+ }
1575
+
1576
+ /**
1577
+ * Determine if the browser is Android or not (last updated 1.7)
1578
+ * @return boolean True if the browser is Android otherwise false
1579
+ */
1580
+ protected function checkBrowserAndroid()
1581
+ {
1582
+ if (stripos($this->_agent, 'Android') !== false) {
1583
+ $aresult = explode(' ', stristr($this->_agent, 'Android'));
1584
+ if (isset($aresult[1])) {
1585
+ $aversion = explode(' ', $aresult[1]);
1586
+ $this->setVersion($aversion[0]);
1587
+ } else {
1588
+ $this->setVersion(self::VERSION_UNKNOWN);
1589
+ }
1590
+ if (stripos($this->_agent, 'Mobile') !== false) {
1591
+ $this->setMobile(true);
1592
+ } else {
1593
+ $this->setTablet(true);
1594
+ }
1595
+ $this->setBrowser(self::BROWSER_ANDROID);
1596
+ return true;
1597
+ }
1598
+ return false;
1599
+ }
1600
+
1601
+ /**
1602
+ * Determine if the browser is Vivaldi
1603
+ * @return boolean True if the browser is Vivaldi otherwise false
1604
+ */
1605
+ protected function checkBrowserVivaldi()
1606
+ {
1607
+ if (stripos($this->_agent, 'Vivaldi') !== false) {
1608
+ $aresult = explode('/', stristr($this->_agent, 'Vivaldi'));
1609
+ if (isset($aresult[1])) {
1610
+ $aversion = explode(' ', $aresult[1]);
1611
+ $this->setVersion($aversion[0]);
1612
+ $this->setBrowser(self::BROWSER_VIVALDI);
1613
+ return true;
1614
+ }
1615
+ }
1616
+ return false;
1617
+ }
1618
+
1619
+ /**
1620
+ * Determine if the browser is Yandex
1621
+ * @return boolean True if the browser is Yandex otherwise false
1622
+ */
1623
+ protected function checkBrowserYandex()
1624
+ {
1625
+ if (stripos($this->_agent, 'YaBrowser') !== false) {
1626
+ $aresult = explode('/', stristr($this->_agent, 'YaBrowser'));
1627
+ if (isset($aresult[1])) {
1628
+ $aversion = explode(' ', $aresult[1]);
1629
+ $this->setVersion($aversion[0]);
1630
+ $this->setBrowser(self::BROWSER_YANDEX);
1631
+
1632
+ if (stripos($this->_agent, 'iPad') !== false) {
1633
+ $this->setTablet(true);
1634
+ } elseif (stripos($this->_agent, 'Mobile') !== false) {
1635
+ $this->setMobile(true);
1636
+ } elseif (stripos($this->_agent, 'Android') !== false) {
1637
+ $this->setTablet(true);
1638
+ }
1639
+
1640
+ return true;
1641
+ }
1642
+ }
1643
+
1644
+ return false;
1645
+ }
1646
+
1647
+ /**
1648
+ * Determine if the browser is a PlayStation
1649
+ * @return boolean True if the browser is PlayStation otherwise false
1650
+ */
1651
+ protected function checkBrowserPlayStation()
1652
+ {
1653
+ if (stripos($this->_agent, 'PlayStation ') !== false) {
1654
+ $aresult = explode(' ', stristr($this->_agent, 'PlayStation '));
1655
+ $this->setBrowser(self::BROWSER_PLAYSTATION);
1656
+ if (isset($aresult[0])) {
1657
+ $aversion = explode(')', $aresult[2]);
1658
+ $this->setVersion($aversion[0]);
1659
+ if (stripos($this->_agent, 'Portable)') !== false || stripos($this->_agent, 'Vita') !== false) {
1660
+ $this->setMobile(true);
1661
+ }
1662
+ return true;
1663
+ }
1664
+ }
1665
+ return false;
1666
+ }
1667
+
1668
+ /**
1669
+ * Determine the user's platform (last updated 2.0)
1670
+ */
1671
+ protected function checkPlatform()
1672
+ {
1673
+ if (stripos($this->_agent, 'windows') !== false) {
1674
+ $this->_platform = self::PLATFORM_WINDOWS;
1675
+ } else if (stripos($this->_agent, 'iPad') !== false) {
1676
+ $this->_platform = self::PLATFORM_IPAD;
1677
+ } else if (stripos($this->_agent, 'iPod') !== false) {
1678
+ $this->_platform = self::PLATFORM_IPOD;
1679
+ } else if (stripos($this->_agent, 'iPhone') !== false) {
1680
+ $this->_platform = self::PLATFORM_IPHONE;
1681
+ } elseif (stripos($this->_agent, 'mac') !== false) {
1682
+ $this->_platform = self::PLATFORM_APPLE;
1683
+ } elseif (stripos($this->_agent, 'android') !== false) {
1684
+ $this->_platform = self::PLATFORM_ANDROID;
1685
+ } elseif (stripos($this->_agent, 'Silk') !== false) {
1686
+ $this->_platform = self::PLATFORM_FIRE_OS;
1687
+ } elseif (stripos($this->_agent, 'linux') !== false && stripos($this->_agent, 'SMART-TV') !== false ) {
1688
+ $this->_platform = self::PLATFORM_LINUX .'/'.self::PLATFORM_SMART_TV;
1689
+ } elseif (stripos($this->_agent, 'linux') !== false) {
1690
+ $this->_platform = self::PLATFORM_LINUX;
1691
+ } else if (stripos($this->_agent, 'Nokia') !== false) {
1692
+ $this->_platform = self::PLATFORM_NOKIA;
1693
+ } else if (stripos($this->_agent, 'BlackBerry') !== false) {
1694
+ $this->_platform = self::PLATFORM_BLACKBERRY;
1695
+ } elseif (stripos($this->_agent, 'FreeBSD') !== false) {
1696
+ $this->_platform = self::PLATFORM_FREEBSD;
1697
+ } elseif (stripos($this->_agent, 'OpenBSD') !== false) {
1698
+ $this->_platform = self::PLATFORM_OPENBSD;
1699
+ } elseif (stripos($this->_agent, 'NetBSD') !== false) {
1700
+ $this->_platform = self::PLATFORM_NETBSD;
1701
+ } elseif (stripos($this->_agent, 'OpenSolaris') !== false) {
1702
+ $this->_platform = self::PLATFORM_OPENSOLARIS;
1703
+ } elseif (stripos($this->_agent, 'SunOS') !== false) {
1704
+ $this->_platform = self::PLATFORM_SUNOS;
1705
+ } elseif (stripos($this->_agent, 'OS\/2') !== false) {
1706
+ $this->_platform = self::PLATFORM_OS2;
1707
+ } elseif (stripos($this->_agent, 'BeOS') !== false) {
1708
+ $this->_platform = self::PLATFORM_BEOS;
1709
+ } elseif (stripos($this->_agent, 'win') !== false) {
1710
+ $this->_platform = self::PLATFORM_WINDOWS;
1711
+ } elseif (stripos($this->_agent, 'Playstation') !== false) {
1712
+ $this->_platform = self::PLATFORM_PLAYSTATION;
1713
+ } elseif (stripos($this->_agent, 'Roku') !== false) {
1714
+ $this->_platform = self::PLATFORM_ROKU;
1715
+ } elseif (stripos($this->_agent, 'iOS') !== false) {
1716
+ $this->_platform = self::PLATFORM_IPHONE . '/' . self::PLATFORM_IPAD;
1717
+ } elseif (stripos($this->_agent, 'tvOS') !== false) {
1718
+ $this->_platform = self::PLATFORM_APPLE_TV;
1719
+ } elseif (stripos($this->_agent, 'curl') !== false) {
1720
+ $this->_platform = self::PLATFORM_TERMINAL;
1721
+ } elseif (stripos($this->_agent, 'CrOS') !== false) {
1722
+ $this->_platform = self::PLATFORM_CHROME_OS;
1723
+ } elseif (stripos($this->_agent, 'okhttp') !== false) {
1724
+ $this->_platform = self::PLATFORM_JAVA_ANDROID;
1725
+ } elseif (stripos($this->_agent, 'PostmanRuntime') !== false) {
1726
+ $this->_platform = self::PLATFORM_POSTMAN;
1727
+ } elseif (stripos($this->_agent, 'Iframely') !== false) {
1728
+ $this->_platform = self::PLATFORM_I_FRAME;
1729
+ }
1730
+
1731
+ }
1732
+ }
vendor/cbschuld/browser.php/phpunit.xml.dist CHANGED
@@ -1,29 +1,29 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <phpunit backupGlobals="true"
3
- backupStaticAttributes="false"
4
- bootstrap="lib/Browser.php"
5
- colors="false"
6
- convertErrorsToExceptions="true"
7
- convertNoticesToExceptions="true"
8
- convertWarningsToExceptions="true"
9
- forceCoversAnnotation="false"
10
- mapTestClassNameToCoveredClassName="false"
11
- processIsolation="false"
12
- stopOnError="false"
13
- stopOnFailure="false"
14
- stopOnIncomplete="false"
15
- stopOnSkipped="false"
16
- testSuiteLoaderFile="phpunit/src/Runner/StandardTestSuiteLoader.php"
17
- strict="false"
18
- verbose="false">
19
- <testsuites>
20
- <testsuite name="Unit">
21
- <directory>test/Unit</directory>
22
- </testsuite>
23
- </testsuites>
24
- <filter>
25
- <whitelist>
26
- <directory suffix=".php">lib/</directory>
27
- </whitelist>
28
- </filter>
29
- </phpunit>
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <phpunit backupGlobals="true"
3
+ backupStaticAttributes="false"
4
+ bootstrap="lib/Browser.php"
5
+ colors="false"
6
+ convertErrorsToExceptions="true"
7
+ convertNoticesToExceptions="true"
8
+ convertWarningsToExceptions="true"
9
+ forceCoversAnnotation="false"
10
+ mapTestClassNameToCoveredClassName="false"
11
+ processIsolation="false"
12
+ stopOnError="false"
13
+ stopOnFailure="false"
14
+ stopOnIncomplete="false"
15
+ stopOnSkipped="false"
16
+ testSuiteLoaderFile="phpunit/src/Runner/StandardTestSuiteLoader.php"
17
+ strict="false"
18
+ verbose="false">
19
+ <testsuites>
20
+ <testsuite name="Unit">
21
+ <directory>test/Unit</directory>
22
+ </testsuite>
23
+ </testsuites>
24
+ <filter>
25
+ <whitelist>
26
+ <directory suffix=".php">lib/</directory>
27
+ </whitelist>
28
+ </filter>
29
+ </phpunit>
vendor/composer/ClassLoader.php CHANGED
@@ -1,441 +1,441 @@
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
- private $classMapAuthoritative = false;
57
- private $missingClasses = array();
58
- private $apcuPrefix;
59
-
60
- public function getPrefixes()
61
- {
62
- if (!empty($this->prefixesPsr0)) {
63
- return call_user_func_array('array_merge', $this->prefixesPsr0);
64
- }
65
-
66
- return array();
67
- }
68
-
69
- public function getPrefixesPsr4()
70
- {
71
- return $this->prefixDirsPsr4;
72
- }
73
-
74
- public function getFallbackDirs()
75
- {
76
- return $this->fallbackDirsPsr0;
77
- }
78
-
79
- public function getFallbackDirsPsr4()
80
- {
81
- return $this->fallbackDirsPsr4;
82
- }
83
-
84
- public function getClassMap()
85
- {
86
- return $this->classMap;
87
- }
88
-
89
- /**
90
- * @param array $classMap Class to filename map
91
- */
92
- public function addClassMap(array $classMap)
93
- {
94
- if ($this->classMap) {
95
- $this->classMap = array_merge($this->classMap, $classMap);
96
- } else {
97
- $this->classMap = $classMap;
98
- }
99
- }
100
-
101
- /**
102
- * Registers a set of PSR-0 directories for a given prefix, either
103
- * appending or prepending to the ones previously set for this prefix.
104
- *
105
- * @param string $prefix The prefix
106
- * @param array|string $paths The PSR-0 root directories
107
- * @param bool $prepend Whether to prepend the directories
108
- */
109
- public function add($prefix, $paths, $prepend = false)
110
- {
111
- if (!$prefix) {
112
- if ($prepend) {
113
- $this->fallbackDirsPsr0 = array_merge(
114
- (array) $paths,
115
- $this->fallbackDirsPsr0
116
- );
117
- } else {
118
- $this->fallbackDirsPsr0 = array_merge(
119
- $this->fallbackDirsPsr0,
120
- (array) $paths
121
- );
122
- }
123
-
124
- return;
125
- }
126
-
127
- $first = $prefix[0];
128
- if (!isset($this->prefixesPsr0[$first][$prefix])) {
129
- $this->prefixesPsr0[$first][$prefix] = (array) $paths;
130
-
131
- return;
132
- }
133
- if ($prepend) {
134
- $this->prefixesPsr0[$first][$prefix] = array_merge(
135
- (array) $paths,
136
- $this->prefixesPsr0[$first][$prefix]
137
- );
138
- } else {
139
- $this->prefixesPsr0[$first][$prefix] = array_merge(
140
- $this->prefixesPsr0[$first][$prefix],
141
- (array) $paths
142
- );
143
- }
144
- }
145
-
146
- /**
147
- * Registers a set of PSR-4 directories for a given namespace, either
148
- * appending or prepending to the ones previously set for this namespace.
149
- *
150
- * @param string $prefix The prefix/namespace, with trailing '\\'
151
- * @param array|string $paths The PSR-4 base directories
152
- * @param bool $prepend Whether to prepend the directories
153
- *
154
- * @throws \InvalidArgumentException
155
- */
156
- public function addPsr4($prefix, $paths, $prepend = false)
157
- {
158
- if (!$prefix) {
159
- // Register directories for the root namespace.
160
- if ($prepend) {
161
- $this->fallbackDirsPsr4 = array_merge(
162
- (array) $paths,
163
- $this->fallbackDirsPsr4
164
- );
165
- } else {
166
- $this->fallbackDirsPsr4 = array_merge(
167
- $this->fallbackDirsPsr4,
168
- (array) $paths
169
- );
170
- }
171
- } elseif (!isset($this->prefixDirsPsr4[$prefix])) {
172
- // Register directories for a new namespace.
173
- $length = strlen($prefix);
174
- if ('\\' !== $prefix[$length - 1]) {
175
- throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
176
- }
177
- $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
178
- $this->prefixDirsPsr4[$prefix] = (array) $paths;
179
- } elseif ($prepend) {
180
- // Prepend directories for an already registered namespace.
181
- $this->prefixDirsPsr4[$prefix] = array_merge(
182
- (array) $paths,
183
- $this->prefixDirsPsr4[$prefix]
184
- );
185
- } else {
186
- // Append directories for an already registered namespace.
187
- $this->prefixDirsPsr4[$prefix] = array_merge(
188
- $this->prefixDirsPsr4[$prefix],
189
- (array) $paths
190
- );
191
- }
192
- }
193
-
194
- /**
195
- * Registers a set of PSR-0 directories for a given prefix,
196
- * replacing any others previously set for this prefix.
197
- *
198
- * @param string $prefix The prefix
199
- * @param array|string $paths The PSR-0 base directories
200
- */
201
- public function set($prefix, $paths)
202
- {
203
- if (!$prefix) {
204
- $this->fallbackDirsPsr0 = (array) $paths;
205
- } else {
206
- $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
207
- }
208
- }
209
-
210
- /**
211
- * Registers a set of PSR-4 directories for a given namespace,
212
- * replacing any others previously set for this namespace.
213
- *
214
- * @param string $prefix The prefix/namespace, with trailing '\\'
215
- * @param array|string $paths The PSR-4 base directories
216
- *
217
- * @throws \InvalidArgumentException
218
- */
219
- public function setPsr4($prefix, $paths)
220
- {
221
- if (!$prefix) {
222
- $this->fallbackDirsPsr4 = (array) $paths;
223
- } else {
224
- $length = strlen($prefix);
225
- if ('\\' !== $prefix[$length - 1]) {
226
- throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
227
- }
228
- $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
229
- $this->prefixDirsPsr4[$prefix] = (array) $paths;
230
- }
231
- }
232
-
233
- /**
234
- * Turns on searching the include path for class files.
235
- *
236
- * @param bool $useIncludePath
237
- */
238
- public function setUseIncludePath($useIncludePath)
239
- {
240
- $this->useIncludePath = $useIncludePath;
241
- }
242
-
243
- /**
244
- * Can be used to check if the autoloader uses the include path to check
245
- * for classes.
246
- *
247
- * @return bool
248
- */
249
- public function getUseIncludePath()
250
- {
251
- return $this->useIncludePath;
252
- }
253
-
254
- /**
255
- * Turns off searching the prefix and fallback directories for classes
256
- * that have not been registered with the class map.
257
- *
258
- * @param bool $classMapAuthoritative
259
- */
260
- public function setClassMapAuthoritative($classMapAuthoritative)
261
- {
262
- $this->classMapAuthoritative = $classMapAuthoritative;
263
- }
264
-
265
- /**
266
- * Should class lookup fail if not found in the current class map?
267
- *
268
- * @return bool
269
- */
270
- public function isClassMapAuthoritative()
271
- {
272
- return $this->classMapAuthoritative;
273
- }
274
-
275
- /**
276
- * APCu prefix to use to cache found/not-found classes, if the extension is enabled.
277
- *
278
- * @param string|null $apcuPrefix
279
- */
280
- public function setApcuPrefix($apcuPrefix)
281
- {
282
- $this->apcuPrefix = function_exists('apcu_fetch') && ini_get('apc.enabled') ? $apcuPrefix : null;
283
- }
284
-
285
- /**
286
- * The APCu prefix in use, or null if APCu caching is not enabled.
287
- *
288
- * @return string|null
289
- */
290
- public function getApcuPrefix()
291
- {
292
- return $this->apcuPrefix;
293
- }
294
-
295
- /**
296
- * Registers this instance as an autoloader.
297
- *
298
- * @param bool $prepend Whether to prepend the autoloader or not
299
- */
300
- public function register($prepend = false)
301
- {
302
- spl_autoload_register(array($this, 'loadClass'), true, $prepend);
303
- }
304
-
305
- /**
306
- * Unregisters this instance as an autoloader.
307
- */
308
- public function unregister()
309
- {
310
- spl_autoload_unregister(array($this, 'loadClass'));
311
- }
312
-
313
- /**
314
- * Loads the given class or interface.
315
- *
316
- * @param string $class The name of the class
317
- * @return bool|null True if loaded, null otherwise
318
- */
319
- public function loadClass($class)
320
- {
321
- if ($file = $this->findFile($class)) {
322
- includeFile($file);
323
-
324
- return true;
325
- }
326
- }
327
-
328
- /**
329
- * Finds the path to the file where the class is defined.
330
- *
331
- * @param string $class The name of the class
332
- *
333
- * @return string|false The path if found, false otherwise
334
- */
335
- public function findFile($class)
336
- {
337
- // class map lookup
338
- if (isset($this->classMap[$class])) {
339
- return $this->classMap[$class];
340
- }
341
- if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
342
- return false;
343
- }
344
- if (null !== $this->apcuPrefix) {
345
- $file = apcu_fetch($this->apcuPrefix.$class, $hit);
346
- if ($hit) {
347
- return $file;
348
- }
349
- }
350
-
351
- $file = $this->findFileWithExtension($class, '.php');
352
-
353
- // Search for Hack files if we are running on HHVM
354
- if (false === $file && defined('HHVM_VERSION')) {
355
- $file = $this->findFileWithExtension($class, '.hh');
356
- }
357
-
358
- if (null !== $this->apcuPrefix) {
359
- apcu_add($this->apcuPrefix.$class, $file);
360
- }
361
-
362
- if (false === $file) {
363
- // Remember that this class does not exist.
364
- $this->missingClasses[$class] = true;
365
- }
366
-
367
- return $file;
368
- }
369
-
370
- private function findFileWithExtension($class, $ext)
371
- {
372
- // PSR-4 lookup
373
- $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
374
-
375
- $first = $class[0];
376
- if (isset($this->prefixLengthsPsr4[$first])) {
377
- foreach ($this->prefixLengthsPsr4[$first] as $prefix => $length) {
378
- if (0 === strpos($class, $prefix)) {
379
- foreach ($this->prefixDirsPsr4[$prefix] as $dir) {
380
- if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) {
381
- return $file;
382
- }
383
- }
384
- }
385
- }
386
- }
387
-
388
- // PSR-4 fallback dirs
389
- foreach ($this->fallbackDirsPsr4 as $dir) {
390
- if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
391
- return $file;
392
- }
393
- }
394
-
395
- // PSR-0 lookup
396
- if (false !== $pos = strrpos($class, '\\')) {
397
- // namespaced class name
398
- $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
399
- . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
400
- } else {
401
- // PEAR-like class name
402
- $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
403
- }
404
-
405
- if (isset($this->prefixesPsr0[$first])) {
406
- foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
407
- if (0 === strpos($class, $prefix)) {
408
- foreach ($dirs as $dir) {
409
- if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
410
- return $file;
411
- }
412
- }
413
- }
414
- }
415
- }
416
-
417
- // PSR-0 fallback dirs
418
- foreach ($this->fallbackDirsPsr0 as $dir) {
419
- if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
420
- return $file;
421
- }
422
- }
423
-
424
- // PSR-0 include paths.
425
- if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
426
- return $file;
427
- }
428
-
429
- return false;
430
- }
431
- }
432
-
433
- /**
434
- * Scope isolated include.
435
- *
436
- * Prevents access to $this/self from included files.
437
- */
438
- function includeFile($file)
439
- {
440
- include $file;
441
- }
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
+ private $classMapAuthoritative = false;
57
+ private $missingClasses = array();
58
+ private $apcuPrefix;
59
+
60
+ public function getPrefixes()
61
+ {
62
+ if (!empty($this->prefixesPsr0)) {
63
+ return call_user_func_array('array_merge', $this->prefixesPsr0);
64
+ }
65
+
66
+ return array();
67
+ }
68
+
69
+ public function getPrefixesPsr4()
70
+ {
71
+ return $this->prefixDirsPsr4;
72
+ }
73
+
74
+ public function getFallbackDirs()
75
+ {
76
+ return $this->fallbackDirsPsr0;
77
+ }
78
+
79
+ public function getFallbackDirsPsr4()
80
+ {
81
+ return $this->fallbackDirsPsr4;
82
+ }
83
+
84
+ public function getClassMap()
85
+ {
86
+ return $this->classMap;
87
+ }
88
+
89
+ /**
90
+ * @param array $classMap Class to filename map
91
+ */
92
+ public function addClassMap(array $classMap)
93
+ {
94
+ if ($this->classMap) {
95
+ $this->classMap = array_merge($this->classMap, $classMap);
96
+ } else {
97
+ $this->classMap = $classMap;
98
+ }
99
+ }
100
+
101
+ /**
102
+ * Registers a set of PSR-0 directories for a given prefix, either
103
+ * appending or prepending to the ones previously set for this prefix.
104
+ *
105
+ * @param string $prefix The prefix
106
+ * @param array|string $paths The PSR-0 root directories
107
+ * @param bool $prepend Whether to prepend the directories
108
+ */
109
+ public function add($prefix, $paths, $prepend = false)
110
+ {
111
+ if (!$prefix) {
112
+ if ($prepend) {
113
+ $this->fallbackDirsPsr0 = array_merge(
114
+ (array) $paths,
115
+ $this->fallbackDirsPsr0
116
+ );
117
+ } else {
118
+ $this->fallbackDirsPsr0 = array_merge(
119
+ $this->fallbackDirsPsr0,
120
+ (array) $paths
121
+ );
122
+ }
123
+
124
+ return;
125
+ }
126
+
127
+ $first = $prefix[0];
128
+ if (!isset($this->prefixesPsr0[$first][$prefix])) {
129
+ $this->prefixesPsr0[$first][$prefix] = (array) $paths;
130
+
131
+ return;
132
+ }
133
+ if ($prepend) {
134
+ $this->prefixesPsr0[$first][$prefix] = array_merge(
135
+ (array) $paths,
136
+ $this->prefixesPsr0[$first][$prefix]
137
+ );
138
+ } else {
139
+ $this->prefixesPsr0[$first][$prefix] = array_merge(
140
+ $this->prefixesPsr0[$first][$prefix],
141
+ (array) $paths
142
+ );
143
+ }
144
+ }
145
+
146
+ /**
147
+ * Registers a set of PSR-4 directories for a given namespace, either
148
+ * appending or prepending to the ones previously set for this namespace.
149
+ *
150
+ * @param string $prefix The prefix/namespace, with trailing '\\'
151
+ * @param array|string $paths The PSR-4 base directories
152
+ * @param bool $prepend Whether to prepend the directories
153
+ *
154
+ * @throws \InvalidArgumentException
155
+ */
156
+ public function addPsr4($prefix, $paths, $prepend = false)
157
+ {
158
+ if (!$prefix) {
159
+ // Register directories for the root namespace.
160
+ if ($prepend) {
161
+ $this->fallbackDirsPsr4 = array_merge(
162
+ (array) $paths,
163
+ $this->fallbackDirsPsr4
164
+ );
165
+ } else {
166
+ $this->fallbackDirsPsr4 = array_merge(
167
+ $this->fallbackDirsPsr4,
168
+ (array) $paths
169
+ );
170
+ }
171
+ } elseif (!isset($this->prefixDirsPsr4[$prefix])) {
172
+ // Register directories for a new namespace.
173
+ $length = strlen($prefix);
174
+ if ('\\' !== $prefix[$length - 1]) {
175
+ throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
176
+ }
177
+ $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
178
+ $this->prefixDirsPsr4[$prefix] = (array) $paths;
179
+ } elseif ($prepend) {
180
+ // Prepend directories for an already registered namespace.
181
+ $this->prefixDirsPsr4[$prefix] = array_merge(
182
+ (array) $paths,
183
+ $this->prefixDirsPsr4[$prefix]
184
+ );
185
+ } else {
186
+ // Append directories for an already registered namespace.
187
+ $this->prefixDirsPsr4[$prefix] = array_merge(
188
+ $this->prefixDirsPsr4[$prefix],
189
+ (array) $paths
190
+ );
191
+ }
192
+ }
193
+
194
+ /**
195
+ * Registers a set of PSR-0 directories for a given prefix,
196
+ * replacing any others previously set for this prefix.
197
+ *
198
+ * @param string $prefix The prefix
199
+ * @param array|string $paths The PSR-0 base directories
200
+ */
201
+ public function set($prefix, $paths)
202
+ {
203
+ if (!$prefix) {
204
+ $this->fallbackDirsPsr0 = (array) $paths;
205
+ } else {
206
+ $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
207
+ }
208
+ }
209
+
210
+ /**
211
+ * Registers a set of PSR-4 directories for a given namespace,
212
+ * replacing any others previously set for this namespace.
213
+ *
214
+ * @param string $prefix The prefix/namespace, with trailing '\\'
215
+ * @param array|string $paths The PSR-4 base directories
216
+ *
217
+ * @throws \InvalidArgumentException
218
+ */
219
+ public function setPsr4($prefix, $paths)
220
+ {
221
+ if (!$prefix) {
222
+ $this->fallbackDirsPsr4 = (array) $paths;
223
+ } else {
224
+ $length = strlen($prefix);
225
+ if ('\\' !== $prefix[$length - 1]) {
226
+ throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
227
+ }
228
+ $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
229
+ $this->prefixDirsPsr4[$prefix] = (array) $paths;
230
+ }
231
+ }
232
+
233
+ /**
234
+ * Turns on searching the include path for class files.
235
+ *
236
+ * @param bool $useIncludePath
237
+ */
238
+ public function setUseIncludePath($useIncludePath)
239
+ {
240
+ $this->useIncludePath = $useIncludePath;
241
+ }
242
+
243
+ /**
244
+ * Can be used to check if the autoloader uses the include path to check
245
+ * for classes.
246
+ *
247
+ * @return bool
248
+ */
249
+ public function getUseIncludePath()
250
+ {
251
+ return $this->useIncludePath;
252
+ }
253
+
254
+ /**
255
+ * Turns off searching the prefix and fallback directories for classes
256
+ * that have not been registered with the class map.
257
+ *
258
+ * @param bool $classMapAuthoritative
259
+ */
260
+ public function setClassMapAuthoritative($classMapAuthoritative)
261
+ {
262
+ $this->classMapAuthoritative = $classMapAuthoritative;
263
+ }
264
+
265
+ /**
266
+ * Should class lookup fail if not found in the current class map?
267
+ *
268
+ * @return bool
269
+ */
270
+ public function isClassMapAuthoritative()
271
+ {
272
+ return $this->classMapAuthoritative;
273
+ }
274
+
275
+ /**
276
+ * APCu prefix to use to cache found/not-found classes, if the extension is enabled.
277
+ *
278
+ * @param string|null $apcuPrefix
279
+ */
280
+ public function setApcuPrefix($apcuPrefix)
281
+ {
282
+ $this->apcuPrefix = function_exists('apcu_fetch') && ini_get('apc.enabled') ? $apcuPrefix : null;
283
+ }
284
+
285
+ /**
286
+ * The APCu prefix in use, or null if APCu caching is not enabled.
287
+ *
288
+ * @return string|null
289
+ */
290
+ public function getApcuPrefix()
291
+ {
292
+ return $this->apcuPrefix;
293
+ }
294
+
295
+ /**
296
+ * Registers this instance as an autoloader.
297
+ *
298
+ * @param bool $prepend Whether to prepend the autoloader or not
299
+ */
300
+ public function register($prepend = false)
301
+ {
302
+ spl_autoload_register(array($this, 'loadClass'), true, $prepend);
303
+ }
304
+
305
+ /**
306
+ * Unregisters this instance as an autoloader.
307
+ */
308
+ public function unregister()
309
+ {
310
+ spl_autoload_unregister(array($this, 'loadClass'));
311
+ }
312
+
313
+ /**
314
+ * Loads the given class or interface.
315
+ *
316
+ * @param string $class The name of the class
317
+ * @return bool|null True if loaded, null otherwise
318
+ */
319
+ public function loadClass($class)
320
+ {
321
+ if ($file = $this->findFile($class)) {
322
+ includeFile($file);
323
+
324
+ return true;
325
+ }
326
+ }
327
+
328
+ /**
329
+ * Finds the path to the file where the class is defined.
330
+ *
331
+ * @param string $class The name of the class
332
+ *
333
+ * @return string|false The path if found, false otherwise
334
+ */
335
+ public function findFile($class)
336
+ {
337
+ // class map lookup
338
+ if (isset($this->classMap[$class])) {
339
+ return $this->classMap[$class];
340
+ }
341
+ if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
342
+ return false;
343
+ }
344
+ if (null !== $this->apcuPrefix) {
345
+ $file = apcu_fetch($this->apcuPrefix.$class, $hit);
346
+ if ($hit) {
347
+ return $file;
348
+ }
349
+ }
350
+
351
+ $file = $this->findFileWithExtension($class, '.php');
352
+
353
+ // Search for Hack files if we are running on HHVM
354
+ if (false === $file && defined('HHVM_VERSION')) {
355
+ $file = $this->findFileWithExtension($class, '.hh');
356
+ }
357
+
358
+ if (null !== $this->apcuPrefix) {
359
+ apcu_add($this->apcuPrefix.$class, $file);
360
+ }
361
+
362
+ if (false === $file) {
363
+ // Remember that this class does not exist.
364
+ $this->missingClasses[$class] = true;
365
+ }
366
+
367
+ return $file;
368
+ }
369
+
370
+ private function findFileWithExtension($class, $ext)
371
+ {
372
+ // PSR-4 lookup
373
+ $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
374
+
375
+ $first = $class[0];
376
+ if (isset($this->prefixLengthsPsr4[$first])) {
377
+ foreach ($this->prefixLengthsPsr4[$first] as $prefix => $length) {
378
+ if (0 === strpos($class, $prefix)) {
379
+ foreach ($this->prefixDirsPsr4[$prefix] as $dir) {
380
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) {
381
+ return $file;
382
+ }
383
+ }
384
+ }
385
+ }
386
+ }
387
+
388
+ // PSR-4 fallback dirs
389
+ foreach ($this->fallbackDirsPsr4 as $dir) {
390
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
391
+ return $file;
392
+ }
393
+ }
394
+
395
+ // PSR-0 lookup
396
+ if (false !== $pos = strrpos($class, '\\')) {
397
+ // namespaced class name
398
+ $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
399
+ . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
400
+ } else {
401
+ // PEAR-like class name
402
+ $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
403
+ }
404
+
405
+ if (isset($this->prefixesPsr0[$first])) {
406
+ foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
407
+ if (0 === strpos($class, $prefix)) {
408
+ foreach ($dirs as $dir) {
409
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
410
+ return $file;
411
+ }
412
+ }
413
+ }
414
+ }
415
+ }
416
+
417
+ // PSR-0 fallback dirs
418
+ foreach ($this->fallbackDirsPsr0 as $dir) {
419
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
420
+ return $file;
421
+ }
422
+ }
423
+
424
+ // PSR-0 include paths.
425
+ if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
426
+ return $file;
427
+ }
428
+
429
+ return false;
430
+ }
431
+ }
432
+
433
+ /**
434
+ * Scope isolated include.
435
+ *
436
+ * Prevents access to $this/self from included files.
437
+ */
438
+ function includeFile($file)
439
+ {
440
+ include $file;
441
+ }
vendor/composer/LICENSE CHANGED
@@ -1,21 +1,21 @@
1
-
2
- Copyright (c) 2016 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
-
1
+
2
+ Copyright (c) 2016 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
+
vendor/composer/autoload_classmap.php CHANGED
@@ -1,10 +1,10 @@
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
- 'Mobile_Detect' => $vendorDir . '/mobiledetect/mobiledetectlib/Mobile_Detect.php',
10
- );
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
+ 'Mobile_Detect' => $vendorDir . '/mobiledetect/mobiledetectlib/Mobile_Detect.php',
10
+ );
vendor/composer/autoload_files.php CHANGED
@@ -1,10 +1,10 @@
1
- <?php
2
-
3
- // autoload_files.php @generated by Composer
4
-
5
- $vendorDir = dirname(dirname(__FILE__));
6
- $baseDir = dirname($vendorDir);
7
-
8
- return array(
9
- 'f15d016d70663d5e96ccd2b863511eb8' => $vendorDir . '/cbschuld/browser.php/lib/Browser.php',
10
- );
1
+ <?php
2
+
3
+ // autoload_files.php @generated by Composer
4
+
5
+ $vendorDir = dirname(dirname(__FILE__));
6
+ $baseDir = dirname($vendorDir);
7
+
8
+ return array(
9
+ 'f15d016d70663d5e96ccd2b863511eb8' => $vendorDir . '/cbschuld/browser.php/lib/Browser.php',
10
+ );
vendor/composer/autoload_namespaces.php CHANGED
@@ -1,10 +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
- 'Detection' => array($vendorDir . '/mobiledetect/mobiledetectlib/namespaced'),
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
+ 'Detection' => array($vendorDir . '/mobiledetect/mobiledetectlib/namespaced'),
10
+ );
vendor/composer/autoload_psr4.php CHANGED
@@ -1,10 +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
- 'Jaybizzle\\CrawlerDetect\\' => array($vendorDir . '/jaybizzle/crawler-detect/src'),
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
+ 'Jaybizzle\\CrawlerDetect\\' => array($vendorDir . '/jaybizzle/crawler-detect/src'),
10
+ );
vendor/composer/autoload_real.php CHANGED
@@ -1,70 +1,70 @@
1
- <?php
2
-
3
- // autoload_real.php @generated by Composer
4
-
5
- class ComposerAutoloaderInit28a0833b49959d9021dc40cd45dfc52b
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('ComposerAutoloaderInit28a0833b49959d9021dc40cd45dfc52b', 'loadClassLoader'), true, true);
23
- self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
- spl_autoload_unregister(array('ComposerAutoloaderInit28a0833b49959d9021dc40cd45dfc52b', 'loadClassLoader'));
25
-
26
- $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
27
- if ($useStaticLoader) {
28
- require_once __DIR__ . '/autoload_static.php';
29
-
30
- call_user_func(\Composer\Autoload\ComposerStaticInit28a0833b49959d9021dc40cd45dfc52b::getInitializer($loader));
31
- } else {
32
- $map = require __DIR__ . '/autoload_namespaces.php';
33
- foreach ($map as $namespace => $path) {
34
- $loader->set($namespace, $path);
35
- }
36
-
37
- $map = require __DIR__ . '/autoload_psr4.php';
38
- foreach ($map as $namespace => $path) {
39
- $loader->setPsr4($namespace, $path);
40
- }
41
-
42
- $classMap = require __DIR__ . '/autoload_classmap.php';
43
- if ($classMap) {
44
- $loader->addClassMap($classMap);
45
- }
46
- }
47
-
48
- $loader->register(true);
49
-
50
- if ($useStaticLoader) {
51
- $includeFiles = Composer\Autoload\ComposerStaticInit28a0833b49959d9021dc40cd45dfc52b::$files;
52
- } else {
53
- $includeFiles = require __DIR__ . '/autoload_files.php';
54
- }
55
- foreach ($includeFiles as $fileIdentifier => $file) {
56
- composerRequire28a0833b49959d9021dc40cd45dfc52b($fileIdentifier, $file);
57
- }
58
-
59
- return $loader;
60
- }
61
- }
62
-
63
- function composerRequire28a0833b49959d9021dc40cd45dfc52b($fileIdentifier, $file)
64
- {
65
- if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
66
- require $file;
67
-
68
- $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
69
- }
70
- }
1
+ <?php
2
+
3
+ // autoload_real.php @generated by Composer
4
+
5
+ class ComposerAutoloaderInit28a0833b49959d9021dc40cd45dfc52b
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('ComposerAutoloaderInit28a0833b49959d9021dc40cd45dfc52b', 'loadClassLoader'), true, true);
23
+ self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
+ spl_autoload_unregister(array('ComposerAutoloaderInit28a0833b49959d9021dc40cd45dfc52b', 'loadClassLoader'));
25
+
26
+ $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
27
+ if ($useStaticLoader) {
28
+ require_once __DIR__ . '/autoload_static.php';
29
+
30
+ call_user_func(\Composer\Autoload\ComposerStaticInit28a0833b49959d9021dc40cd45dfc52b::getInitializer($loader));
31
+ } else {
32
+ $map = require __DIR__ . '/autoload_namespaces.php';
33
+ foreach ($map as $namespace => $path) {
34
+ $loader->set($namespace, $path);
35
+ }
36
+
37
+ $map = require __DIR__ . '/autoload_psr4.php';
38
+ foreach ($map as $namespace => $path) {
39
+ $loader->setPsr4($namespace, $path);
40
+ }
41
+
42
+ $classMap = require __DIR__ . '/autoload_classmap.php';
43
+ if ($classMap) {
44
+ $loader->addClassMap($classMap);
45
+ }
46
+ }
47
+
48
+ $loader->register(true);
49
+
50
+ if ($useStaticLoader) {
51
+ $includeFiles = Composer\Autoload\ComposerStaticInit28a0833b49959d9021dc40cd45dfc52b::$files;
52
+ } else {
53
+ $includeFiles = require __DIR__ . '/autoload_files.php';
54
+ }
55
+ foreach ($includeFiles as $fileIdentifier => $file) {
56
+ composerRequire28a0833b49959d9021dc40cd45dfc52b($fileIdentifier, $file);
57
+ }
58
+
59
+ return $loader;
60
+ }
61
+ }
62
+
63
+ function composerRequire28a0833b49959d9021dc40cd45dfc52b($fileIdentifier, $file)
64
+ {
65
+ if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
66
+ require $file;
67
+
68
+ $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
69
+ }
70
+ }
vendor/composer/autoload_static.php CHANGED
@@ -1,51 +1,51 @@
1
- <?php
2
-
3
- // autoload_static.php @generated by Composer
4
-
5
- namespace Composer\Autoload;
6
-
7
- class ComposerStaticInit28a0833b49959d9021dc40cd45dfc52b
8
- {
9
- public static $files = array (
10
- 'f15d016d70663d5e96ccd2b863511eb8' => __DIR__ . '/..' . '/cbschuld/browser.php/lib/Browser.php',
11
- );
12
-
13
- public static $prefixLengthsPsr4 = array (
14
- 'J' =>
15
- array (
16
- 'Jaybizzle\\CrawlerDetect\\' => 24,
17
- ),
18
- );
19
-
20
- public static $prefixDirsPsr4 = array (
21
- 'Jaybizzle\\CrawlerDetect\\' =>
22
- array (
23
- 0 => __DIR__ . '/..' . '/jaybizzle/crawler-detect/src',
24
- ),
25
- );
26
-
27
- public static $prefixesPsr0 = array (
28
- 'D' =>
29
- array (
30
- 'Detection' =>
31
- array (
32
- 0 => __DIR__ . '/..' . '/mobiledetect/mobiledetectlib/namespaced',
33
- ),
34
- ),
35
- );
36
-
37
- public static $classMap = array (
38
- 'Mobile_Detect' => __DIR__ . '/..' . '/mobiledetect/mobiledetectlib/Mobile_Detect.php',
39
- );
40
-
41
- public static function getInitializer(ClassLoader $loader)
42
- {
43
- return \Closure::bind(function () use ($loader) {
44
- $loader->prefixLengthsPsr4 = ComposerStaticInit28a0833b49959d9021dc40cd45dfc52b::$prefixLengthsPsr4;
45
- $loader->prefixDirsPsr4 = ComposerStaticInit28a0833b49959d9021dc40cd45dfc52b::$prefixDirsPsr4;
46
- $loader->prefixesPsr0 = ComposerStaticInit28a0833b49959d9021dc40cd45dfc52b::$prefixesPsr0;
47
- $loader->classMap = ComposerStaticInit28a0833b49959d9021dc40cd45dfc52b::$classMap;
48
-
49
- }, null, ClassLoader::class);
50
- }
51
- }
1
+ <?php
2
+
3
+ // autoload_static.php @generated by Composer
4
+
5
+ namespace Composer\Autoload;
6
+
7
+ class ComposerStaticInit28a0833b49959d9021dc40cd45dfc52b
8
+ {
9
+ public static $files = array (
10
+ 'f15d016d70663d5e96ccd2b863511eb8' => __DIR__ . '/..' . '/cbschuld/browser.php/lib/Browser.php',
11
+ );
12
+
13
+ public static $prefixLengthsPsr4 = array (
14
+ 'J' =>
15
+ array (
16
+ 'Jaybizzle\\CrawlerDetect\\' => 24,
17
+ ),
18
+ );
19
+
20
+ public static $prefixDirsPsr4 = array (
21
+ 'Jaybizzle\\CrawlerDetect\\' =>
22
+ array (
23
+ 0 => __DIR__ . '/..' . '/jaybizzle/crawler-detect/src',
24
+ ),
25
+ );
26
+
27
+ public static $prefixesPsr0 = array (
28
+ 'D' =>
29
+ array (
30
+ 'Detection' =>
31
+ array (
32
+ 0 => __DIR__ . '/..' . '/mobiledetect/mobiledetectlib/namespaced',
33
+ ),
34
+ ),
35
+ );
36
+
37
+ public static $classMap = array (
38
+ 'Mobile_Detect' => __DIR__ . '/..' . '/mobiledetect/mobiledetectlib/Mobile_Detect.php',
39
+ );
40
+
41
+ public static function getInitializer(ClassLoader $loader)
42
+ {
43
+ return \Closure::bind(function () use ($loader) {
44
+ $loader->prefixLengthsPsr4 = ComposerStaticInit28a0833b49959d9021dc40cd45dfc52b::$prefixLengthsPsr4;
45
+ $loader->prefixDirsPsr4 = ComposerStaticInit28a0833b49959d9021dc40cd45dfc52b::$prefixDirsPsr4;
46
+ $loader->prefixesPsr0 = ComposerStaticInit28a0833b49959d9021dc40cd45dfc52b::$prefixesPsr0;
47
+ $loader->classMap = ComposerStaticInit28a0833b49959d9021dc40cd45dfc52b::$classMap;
48
+
49
+ }, null, ClassLoader::class);
50
+ }
51
+ }
vendor/composer/installed.json CHANGED
@@ -1,154 +1,154 @@
1
- [
2
- {
3
- "name": "cbschuld/browser.php",
4
- "version": "dev-master",
5
- "version_normalized": "9999999-dev",
6
- "source": {
7
- "type": "git",
8
- "url": "https://github.com/cbschuld/Browser.php.git",
9
- "reference": "6bde9efb0b14a4917affe741500c29149419e491"
10
- },
11
- "dist": {
12
- "type": "zip",
13
- "url": "https://api.github.com/repos/cbschuld/Browser.php/zipball/6bde9efb0b14a4917affe741500c29149419e491",
14
- "reference": "6bde9efb0b14a4917affe741500c29149419e491",
15
- "shasum": ""
16
- },
17
- "time": "2017-07-31T23:43:17+00:00",
18
- "type": "library",
19
- "extra": {
20
- "branch-alias": {
21
- "dev-master": "1.95-dev"
22
- }
23
- },
24
- "installation-source": "source",
25
- "autoload": {
26
- "files": [
27
- "lib/Browser.php"
28
- ]
29
- },
30
- "notification-url": "https://packagist.org/downloads/",
31
- "license": [
32
- "MIT"
33
- ],
34
- "authors": [
35
- {
36
- "name": "Chris Schuld",
37
- "email": "chris@chrisschuld.com",
38
- "homepage": "http://chrisschuld.com"
39
- }
40
- ],
41
- "description": "A PHP Class to detect a user's Browser",
42
- "homepage": "http://chrisschuld.com/projects/browser-php-detecting-a-users-browser-from-php.html",
43
- "keywords": [
44
- "browser",
45
- "detection",
46
- "user agent"
47
- ]
48
- },
49
- {
50
- "name": "jaybizzle/crawler-detect",
51
- "version": "v1.2.63",
52
- "version_normalized": "1.2.63.0",
53
- "source": {
54
- "type": "git",
55
- "url": "https://github.com/JayBizzle/Crawler-Detect.git",
56
- "reference": "3566bc69d0839ab2dfd739a660b00f25a6f02031"
57
- },
58
- "dist": {
59
- "type": "zip",
60
- "url": "https://api.github.com/repos/JayBizzle/Crawler-Detect/zipball/3566bc69d0839ab2dfd739a660b00f25a6f02031",
61
- "reference": "3566bc69d0839ab2dfd739a660b00f25a6f02031",
62
- "shasum": ""
63
- },
64
- "require": {
65
- "php": ">=5.3.0"
66
- },
67
- "require-dev": {
68
- "phpunit/phpunit": "^4.8|^5.5|^6.5",
69
- "satooshi/php-coveralls": "1.*"
70
- },
71
- "time": "2018-05-21T19:56:44+00:00",
72
- "type": "library",
73
- "installation-source": "dist",
74
- "autoload": {
75
- "psr-4": {
76
- "Jaybizzle\\CrawlerDetect\\": "src/"
77
- }
78
- },
79
- "notification-url": "https://packagist.org/downloads/",
80
- "license": [
81
- "MIT"
82
- ],
83
- "authors": [
84
- {
85
- "name": "Mark Beech",
86
- "email": "m@rkbee.ch",
87
- "role": "Developer"
88
- }
89
- ],
90
- "description": "CrawlerDetect is a PHP class for detecting bots/crawlers/spiders via the user agent",
91
- "homepage": "https://github.com/JayBizzle/Crawler-Detect/",
92
- "keywords": [
93
- "crawler",
94
- "crawler detect",
95
- "crawler detector",
96
- "crawlerdetect",
97
- "php crawler detect"
98
- ]
99
- },
100
- {
101
- "name": "mobiledetect/mobiledetectlib",
102
- "version": "2.8.31",
103
- "version_normalized": "2.8.31.0",
104
- "source": {
105
- "type": "git",
106
- "url": "https://github.com/serbanghita/Mobile-Detect.git",
107
- "reference": "adb882ea3b9d154f087ecb2c333180dad6f4dd37"
108
- },
109
- "dist": {
110
- "type": "zip",
111
- "url": "https://api.github.com/repos/serbanghita/Mobile-Detect/zipball/adb882ea3b9d154f087ecb2c333180dad6f4dd37",
112
- "reference": "adb882ea3b9d154f087ecb2c333180dad6f4dd37",
113
- "shasum": ""
114
- },
115
- "require": {
116
- "php": ">=5.0.0"
117
- },
118
- "require-dev": {
119
- "phpunit/phpunit": "~4.8.35||~5.7"
120
- },
121
- "time": "2018-02-26T19:39:55+00:00",
122
- "type": "library",
123
- "installation-source": "dist",
124
- "autoload": {
125
- "classmap": [
126
- "Mobile_Detect.php"
127
- ],
128
- "psr-0": {
129
- "Detection": "namespaced/"
130
- }
131
- },
132
- "notification-url": "https://packagist.org/downloads/",
133
- "license": [
134
- "MIT"
135
- ],
136
- "authors": [
137
- {
138
- "name": "Serban Ghita",
139
- "email": "serbanghita@gmail.com",
140
- "homepage": "http://mobiledetect.net",
141
- "role": "Developer"
142
- }
143
- ],
144
- "description": "Mobile_Detect is a lightweight PHP class for detecting mobile devices. It uses the User-Agent string combined with specific HTTP headers to detect the mobile environment.",
145
- "homepage": "https://github.com/serbanghita/Mobile-Detect",
146
- "keywords": [
147
- "detect mobile devices",
148
- "mobile",
149
- "mobile detect",
150
- "mobile detector",
151
- "php mobile detect"
152
- ]
153
- }
154
- ]
1
+ [
2
+ {
3
+ "name": "cbschuld/browser.php",
4
+ "version": "dev-master",
5
+ "version_normalized": "9999999-dev",
6
+ "source": {
7
+ "type": "git",
8
+ "url": "https://github.com/cbschuld/Browser.php.git",
9
+ "reference": "6bde9efb0b14a4917affe741500c29149419e491"
10
+ },
11
+ "dist": {
12
+ "type": "zip",
13
+ "url": "https://api.github.com/repos/cbschuld/Browser.php/zipball/6bde9efb0b14a4917affe741500c29149419e491",
14
+ "reference": "6bde9efb0b14a4917affe741500c29149419e491",
15
+ "shasum": ""
16
+ },
17
+ "time": "2017-07-31T23:43:17+00:00",
18
+ "type": "library",
19
+ "extra": {
20
+ "branch-alias": {
21
+ "dev-master": "1.95-dev"
22
+ }
23
+ },
24
+ "installation-source": "source",
25
+ "autoload": {
26
+ "files": [
27
+ "lib/Browser.php"
28
+ ]
29
+ },
30
+ "notification-url": "https://packagist.org/downloads/",
31
+ "license": [
32
+ "MIT"
33
+ ],
34
+ "authors": [
35
+ {
36
+ "name": "Chris Schuld",
37
+ "email": "chris@chrisschuld.com",
38
+ "homepage": "http://chrisschuld.com"
39
+ }
40
+ ],
41
+ "description": "A PHP Class to detect a user's Browser",
42
+ "homepage": "http://chrisschuld.com/projects/browser-php-detecting-a-users-browser-from-php.html",
43
+ "keywords": [
44
+ "browser",
45
+ "detection",
46
+ "user agent"
47
+ ]
48
+ },
49
+ {
50
+ "name": "jaybizzle/crawler-detect",
51
+ "version": "v1.2.63",
52
+ "version_normalized": "1.2.63.0",
53
+ "source": {
54
+ "type": "git",
55
+ "url": "https://github.com/JayBizzle/Crawler-Detect.git",
56
+ "reference": "3566bc69d0839ab2dfd739a660b00f25a6f02031"
57
+ },
58
+ "dist": {
59
+ "type": "zip",
60
+ "url": "https://api.github.com/repos/JayBizzle/Crawler-Detect/zipball/3566bc69d0839ab2dfd739a660b00f25a6f02031",
61
+ "reference": "3566bc69d0839ab2dfd739a660b00f25a6f02031",
62
+ "shasum": ""
63
+ },
64
+ "require": {
65
+ "php": ">=5.3.0"
66
+ },
67
+ "require-dev": {
68
+ "phpunit/phpunit": "^4.8|^5.5|^6.5",
69
+ "satooshi/php-coveralls": "1.*"
70
+ },
71
+ "time": "2018-05-21T19:56:44+00:00",
72
+ "type": "library",
73
+ "installation-source": "dist",
74
+ "autoload": {
75
+ "psr-4": {
76
+ "Jaybizzle\\CrawlerDetect\\": "src/"
77
+ }
78
+ },
79
+ "notification-url": "https://packagist.org/downloads/",
80
+ "license": [
81
+ "MIT"
82
+ ],
83
+ "authors": [
84
+ {
85
+ "name": "Mark Beech",
86
+ "email": "m@rkbee.ch",
87
+ "role": "Developer"
88
+ }
89
+ ],
90
+ "description": "CrawlerDetect is a PHP class for detecting bots/crawlers/spiders via the user agent",
91
+ "homepage": "https://github.com/JayBizzle/Crawler-Detect/",
92
+ "keywords": [
93
+ "crawler",
94
+ "crawler detect",
95
+ "crawler detector",
96
+ "crawlerdetect",
97
+ "php crawler detect"
98
+ ]
99
+ },
100
+ {
101
+ "name": "mobiledetect/mobiledetectlib",
102
+ "version": "2.8.31",
103
+ "version_normalized": "2.8.31.0",
104
+ "source": {
105
+ "type": "git",
106
+ "url": "https://github.com/serbanghita/Mobile-Detect.git",
107
+ "reference": "adb882ea3b9d154f087ecb2c333180dad6f4dd37"
108
+ },
109
+ "dist": {
110
+ "type": "zip",
111
+ "url": "https://api.github.com/repos/serbanghita/Mobile-Detect/zipball/adb882ea3b9d154f087ecb2c333180dad6f4dd37",
112
+ "reference": "adb882ea3b9d154f087ecb2c333180dad6f4dd37",
113
+ "shasum": ""
114
+ },
115
+ "require": {
116
+ "php": ">=5.0.0"
117
+ },
118
+ "require-dev": {
119
+ "phpunit/phpunit": "~4.8.35||~5.7"
120
+ },
121
+ "time": "2018-02-26T19:39:55+00:00",
122
+ "type": "library",
123
+ "installation-source": "dist",
124
+ "autoload": {
125
+ "classmap": [
126
+ "Mobile_Detect.php"
127
+ ],
128
+ "psr-0": {
129
+ "Detection": "namespaced/"
130
+ }
131
+ },
132
+ "notification-url": "https://packagist.org/downloads/",
133
+ "license": [
134
+ "MIT"
135
+ ],
136
+ "authors": [
137
+ {
138
+ "name": "Serban Ghita",
139
+ "email": "serbanghita@gmail.com",
140
+ "homepage": "http://mobiledetect.net",
141
+ "role": "Developer"
142
+ }
143
+ ],
144
+ "description": "Mobile_Detect is a lightweight PHP class for detecting mobile devices. It uses the User-Agent string combined with specific HTTP headers to detect the mobile environment.",
145
+ "homepage": "https://github.com/serbanghita/Mobile-Detect",
146
+ "keywords": [
147
+ "detect mobile devices",
148
+ "mobile",
149
+ "mobile detect",
150
+ "mobile detector",
151
+ "php mobile detect"
152
+ ]
153
+ }
154
+ ]
vendor/jaybizzle/crawler-detect/LICENSE CHANGED
@@ -1,22 +1,22 @@
1
- The MIT License (MIT)
2
-
3
- Copyright (c) 2015-2018 Mark Beech
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
22
-
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015-2018 Mark Beech
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
vendor/jaybizzle/crawler-detect/README.md CHANGED
@@ -1,68 +1,68 @@
1
- <p align="center"><a href="http://crawlerdetect.io/" target="_blank"><img src="https://cloud.githubusercontent.com/assets/340752/23082173/1bd1a396-f550-11e6-8aba-4d3c75edea2f.png" width="321" height="219" /></a><br><br>
2
- <a href="http://crawlerdetect.io/" target="_blank">crawlerdetect.io</a>
3
- <br><br>
4
- </p>
5
-
6
- <p align="center">
7
- <a href="https://travis-ci.org/JayBizzle/Crawler-Detect"><img src="https://img.shields.io/travis/JayBizzle/Crawler-Detect/master.svg?style=flat-square" /></a>
8
- <a href="https://packagist.org/packages/jaybizzle/crawler-detect"><img src="https://img.shields.io/packagist/dm/JayBizzle/Crawler-Detect.svg?style=flat-square" /></a>
9
- <a href="https://scrutinizer-ci.com/g/JayBizzle/Crawler-Detect/?branch=master"><img src="https://img.shields.io/scrutinizer/g/JayBizzle/Crawler-Detect.svg?style=flat-square" /></a>
10
- <a href="https://github.com/JayBizzle/Crawler-Detect"><img src="https://img.shields.io/badge/license-MIT-ff69b4.svg?style=flat-square" /></a>
11
- <a href="https://packagist.org/packages/jaybizzle/crawler-detect"><img src="https://img.shields.io/packagist/v/jaybizzle/Crawler-Detect.svg?style=flat-square" /></a>
12
- <a href="https://styleci.io/repos/32755917"><img src="https://styleci.io/repos/32755917/shield" /></a>
13
- <a href="https://coveralls.io/github/JayBizzle/Crawler-Detect"><img src="https://img.shields.io/coveralls/JayBizzle/Crawler-Detect/master.svg?style=flat-square" /></a>
14
- </p>
15
-
16
- ## About CrawlerDetect
17
-
18
- CrawlerDetect is a PHP class for detecting bots/crawlers/spiders via the user agent and http_from header. Currently able to detect 1,000's of bots/spiders/crawlers.
19
-
20
- ### Installation
21
- Run `composer require jaybizzle/crawler-detect 1.*` or add `"jaybizzle/crawler-detect" :"1.*"` to your `composer.json`.
22
-
23
- ### Usage
24
- ```PHP
25
- use Jaybizzle\CrawlerDetect\CrawlerDetect;
26
-
27
- $CrawlerDetect = new CrawlerDetect;
28
-
29
- // Check the user agent of the current 'visitor'
30
- if($CrawlerDetect->isCrawler()) {
31
- // true if crawler user agent detected
32
- }
33
-
34
- // Pass a user agent as a string
35
- if($CrawlerDetect->isCrawler('Mozilla/5.0 (compatible; Sosospider/2.0; +http://help.soso.com/webspider.htm)')) {
36
- // true if crawler user agent detected
37
- }
38
-
39
- // Output the name of the bot that matched (if any)
40
- echo $CrawlerDetect->getMatches();
41
- ```
42
-
43
- ### Contributing
44
- If you find a bot/spider/crawler user agent that CrawlerDetect fails to detect, please submit a pull request with the regex pattern added to the `$data` array in `Fixtures/Crawlers.php` and add the failing user agent to `tests/crawlers.txt`.
45
-
46
- Failing that, just create an issue with the user agent you have found, and we'll take it from there :)
47
-
48
- ### Laravel Package
49
- If you would like to use this with Laravel 4/5, please see [Laravel-Crawler-Detect](https://github.com/JayBizzle/Laravel-Crawler-Detect)
50
-
51
- ### Symfony Bundle
52
- To use this library with Symfony 2/3/4, check out the [CrawlerDetectBundle](https://github.com/nicolasmure/CrawlerDetectBundle).
53
-
54
- ### YII2 Extension
55
- To use this library with the YII2 framework, check out [yii2-crawler-detect](https://github.com/AlikDex/yii2-crawler-detect).
56
-
57
- ### ES6 Library
58
- To use this library with NodeJS or any ES6 application based, check out [es6-crawler-detect](https://github.com/JefferyHus/es6-crawler-detect).
59
-
60
- ### .NET Library
61
- To use this library in a .net standard (including .net core) based project, check out [NetCrawlerDetect](https://github.com/gplumb/NetCrawlerDetect).
62
-
63
- ### Nette Extension
64
- To use this library with the Nette framework, checkout [NetteCrawlerDetect](https://github.com/JanGalek/Crawler-Detect).
65
-
66
- _Parts of this class are based on the brilliant [MobileDetect](https://github.com/serbanghita/Mobile-Detect)_
67
-
68
- [![Analytics](https://ga-beacon.appspot.com/UA-72430465-1/Crawler-Detect/readme?pixel)](https://github.com/JayBizzle/Crawler-Detect)
1
+ <p align="center"><a href="http://crawlerdetect.io/" target="_blank"><img src="https://cloud.githubusercontent.com/assets/340752/23082173/1bd1a396-f550-11e6-8aba-4d3c75edea2f.png" width="321" height="219" /></a><br><br>
2
+ <a href="http://crawlerdetect.io/" target="_blank">crawlerdetect.io</a>
3
+ <br><br>
4
+ </p>
5
+
6
+ <p align="center">
7
+ <a href="https://travis-ci.org/JayBizzle/Crawler-Detect"><img src="https://img.shields.io/travis/JayBizzle/Crawler-Detect/master.svg?style=flat-square" /></a>
8
+ <a href="https://packagist.org/packages/jaybizzle/crawler-detect"><img src="https://img.shields.io/packagist/dm/JayBizzle/Crawler-Detect.svg?style=flat-square" /></a>
9
+ <a href="https://scrutinizer-ci.com/g/JayBizzle/Crawler-Detect/?branch=master"><img src="https://img.shields.io/scrutinizer/g/JayBizzle/Crawler-Detect.svg?style=flat-square" /></a>
10
+ <a href="https://github.com/JayBizzle/Crawler-Detect"><img src="https://img.shields.io/badge/license-MIT-ff69b4.svg?style=flat-square" /></a>
11
+ <a href="https://packagist.org/packages/jaybizzle/crawler-detect"><img src="https://img.shields.io/packagist/v/jaybizzle/Crawler-Detect.svg?style=flat-square" /></a>
12
+ <a href="https://styleci.io/repos/32755917"><img src="https://styleci.io/repos/32755917/shield" /></a>
13
+ <a href="https://coveralls.io/github/JayBizzle/Crawler-Detect"><img src="https://img.shields.io/coveralls/JayBizzle/Crawler-Detect/master.svg?style=flat-square" /></a>
14
+ </p>
15
+
16
+ ## About CrawlerDetect
17
+
18
+ CrawlerDetect is a PHP class for detecting bots/crawlers/spiders via the user agent and http_from header. Currently able to detect 1,000's of bots/spiders/crawlers.
19
+
20
+ ### Installation
21
+ Run `composer require jaybizzle/crawler-detect 1.*` or add `"jaybizzle/crawler-detect" :"1.*"` to your `composer.json`.
22
+
23
+ ### Usage
24
+ ```PHP
25
+ use Jaybizzle\CrawlerDetect\CrawlerDetect;
26
+
27
+ $CrawlerDetect = new CrawlerDetect;
28
+
29
+ // Check the user agent of the current 'visitor'
30
+ if($CrawlerDetect->isCrawler()) {
31
+ // true if crawler user agent detected
32
+ }
33
+
34
+ // Pass a user agent as a string
35
+ if($CrawlerDetect->isCrawler('Mozilla/5.0 (compatible; Sosospider/2.0; +http://help.soso.com/webspider.htm)')) {
36
+ // true if crawler user agent detected
37
+ }
38
+
39
+ // Output the name of the bot that matched (if any)
40
+ echo $CrawlerDetect->getMatches();
41
+ ```
42
+
43
+ ### Contributing
44
+ If you find a bot/spider/crawler user agent that CrawlerDetect fails to detect, please submit a pull request with the regex pattern added to the `$data` array in `Fixtures/Crawlers.php` and add the failing user agent to `tests/crawlers.txt`.
45
+
46
+ Failing that, just create an issue with the user agent you have found, and we'll take it from there :)
47
+
48
+ ### Laravel Package
49
+ If you would like to use this with Laravel 4/5, please see [Laravel-Crawler-Detect](https://github.com/JayBizzle/Laravel-Crawler-Detect)
50
+
51
+ ### Symfony Bundle
52
+ To use this library with Symfony 2/3/4, check out the [CrawlerDetectBundle](https://github.com/nicolasmure/CrawlerDetectBundle).
53
+
54
+ ### YII2 Extension
55
+ To use this library with the YII2 framework, check out [yii2-crawler-detect](https://github.com/AlikDex/yii2-crawler-detect).
56
+
57
+ ### ES6 Library
58
+ To use this library with NodeJS or any ES6 application based, check out [es6-crawler-detect](https://github.com/JefferyHus/es6-crawler-detect).
59
+
60
+ ### .NET Library
61
+ To use this library in a .net standard (including .net core) based project, check out [NetCrawlerDetect](https://github.com/gplumb/NetCrawlerDetect).
62
+
63
+ ### Nette Extension
64
+ To use this library with the Nette framework, checkout [NetteCrawlerDetect](https://github.com/JanGalek/Crawler-Detect).
65
+
66
+ _Parts of this class are based on the brilliant [MobileDetect](https://github.com/serbanghita/Mobile-Detect)_
67
+
68
+ [![Analytics](https://ga-beacon.appspot.com/UA-72430465-1/Crawler-Detect/readme?pixel)](https://github.com/JayBizzle/Crawler-Detect)
vendor/jaybizzle/crawler-detect/composer.json CHANGED
@@ -1,30 +1,30 @@
1
- {
2
- "name": "jaybizzle/crawler-detect",
3
- "type": "library",
4
- "description": "CrawlerDetect is a PHP class for detecting bots/crawlers/spiders via the user agent",
5
- "keywords": ["crawler", "crawler detect", "crawler detector", "crawlerdetect", "php crawler detect"],
6
- "homepage": "https://github.com/JayBizzle/Crawler-Detect/",
7
- "license": "MIT",
8
- "authors": [
9
- {
10
- "name": "Mark Beech",
11
- "email": "m@rkbee.ch",
12
- "role": "Developer"
13
- }
14
- ],
15
- "require": {
16
- "php": ">=5.3.0"
17
- },
18
- "require-dev": {
19
- "phpunit/phpunit": "^4.8|^5.5|^6.5",
20
- "satooshi/php-coveralls": "1.*"
21
- },
22
- "autoload": {
23
- "psr-4": {
24
- "Jaybizzle\\CrawlerDetect\\": "src/"
25
- }
26
- },
27
- "scripts": {
28
- "test": "vendor/bin/phpunit"
29
- }
30
- }
1
+ {
2
+ "name": "jaybizzle/crawler-detect",
3
+ "type": "library",
4
+ "description": "CrawlerDetect is a PHP class for detecting bots/crawlers/spiders via the user agent",
5
+ "keywords": ["crawler", "crawler detect", "crawler detector", "crawlerdetect", "php crawler detect"],
6
+ "homepage": "https://github.com/JayBizzle/Crawler-Detect/",
7
+ "license": "MIT",
8
+ "authors": [
9
+ {
10
+ "name": "Mark Beech",
11
+ "email": "m@rkbee.ch",
12
+ "role": "Developer"
13
+ }
14
+ ],
15
+ "require": {
16
+ "php": ">=5.3.0"
17
+ },
18
+ "require-dev": {
19
+ "phpunit/phpunit": "^4.8|^5.5|^6.5",
20
+ "satooshi/php-coveralls": "1.*"
21
+ },
22
+ "autoload": {
23
+ "psr-4": {
24
+ "Jaybizzle\\CrawlerDetect\\": "src/"
25
+ }
26
+ },
27
+ "scripts": {
28
+ "test": "vendor/bin/phpunit"
29
+ }
30
+ }
vendor/jaybizzle/crawler-detect/export.php CHANGED
@@ -1,41 +1,41 @@
1
- <?php
2
-
3
- /*
4
- * This file is part of Crawler Detect - the web crawler detection library.
5
- *
6
- * (c) Mark Beech <m@rkbee.ch>
7
- *
8
- * This source file is subject to the MIT license that is bundled
9
- * with this source code in the file LICENSE.
10
- */
11
-
12
- require 'src/Fixtures/AbstractProvider.php';
13
- require 'src/Fixtures/Crawlers.php';
14
- require 'src/Fixtures/Exclusions.php';
15
- require 'src/Fixtures/Headers.php';
16
-
17
- $src = array(
18
- 'Crawlers',
19
- 'Exclusions',
20
- 'Headers',
21
- );
22
-
23
- foreach ($src as $class) {
24
- $class = "Jaybizzle\\CrawlerDetect\\Fixtures\\$class";
25
- $object = new $class;
26
-
27
- outputJson($object);
28
- outputTxt($object);
29
- }
30
-
31
- function outputJson($object)
32
- {
33
- $className = (new ReflectionClass($object))->getShortName();
34
- file_put_contents("raw/$className.json", json_encode($object->getAll()));
35
- }
36
-
37
- function outputTxt($object)
38
- {
39
- $className = (new ReflectionClass($object))->getShortName();
40
- file_put_contents("raw/$className.txt", implode($object->getAll(), PHP_EOL));
41
- }
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of Crawler Detect - the web crawler detection library.
5
+ *
6
+ * (c) Mark Beech <m@rkbee.ch>
7
+ *
8
+ * This source file is subject to the MIT license that is bundled
9
+ * with this source code in the file LICENSE.
10
+ */
11
+
12
+ require 'src/Fixtures/AbstractProvider.php';
13
+ require 'src/Fixtures/Crawlers.php';
14
+ require 'src/Fixtures/Exclusions.php';
15
+ require 'src/Fixtures/Headers.php';
16
+
17
+ $src = array(
18
+ 'Crawlers',
19
+ 'Exclusions',
20
+ 'Headers',
21
+ );
22
+
23
+ foreach ($src as $class) {
24
+ $class = "Jaybizzle\\CrawlerDetect\\Fixtures\\$class";
25
+ $object = new $class;
26
+
27
+ outputJson($object);
28
+ outputTxt($object);
29
+ }
30
+
31
+ function outputJson($object)
32
+ {
33
+ $className = (new ReflectionClass($object))->getShortName();
34
+ file_put_contents("raw/$className.json", json_encode($object->getAll()));
35
+ }
36
+
37
+ function outputTxt($object)
38
+ {
39
+ $className = (new ReflectionClass($object))->getShortName();
40
+ file_put_contents("raw/$className.txt", implode($object->getAll(), PHP_EOL));
41
+ }
vendor/jaybizzle/crawler-detect/raw/Crawlers.txt CHANGED
@@ -1,1141 +1,1141 @@
1
- .*Java.*outbrain
2
- YLT
3
- 008\/
4
- 192\.comAgent
5
- 2ip\.ru
6
- 404checker
7
- 404enemy
8
- 80legs
9
- ^b0t$
10
- ^bluefish
11
- ^Calypso v\/
12
- ^COMODO DCV
13
- ^DangDang
14
- ^DavClnt
15
- ^FDM
16
- ^git\/
17
- ^Goose\/
18
- ^Grabber
19
- ^HTTPClient\/
20
- ^Java\/
21
- ^Jeode\/
22
- ^Jetty\/
23
- ^Mget
24
- ^Microsoft URL Control
25
- ^NG\/[0-9\.]
26
- ^NING\/
27
- ^PHP\/[0-9]
28
- ^RMA\/
29
- ^Ruby|Ruby\/[0-9]
30
- ^scrutiny\/
31
- ^VSE\/[0-9]
32
- ^WordPress\.com
33
- ^XRL\/[0-9]
34
- ^ZmEu
35
- a3logics\.in
36
- A6-Indexer
37
- a\.pr-cy\.ru
38
- Abonti
39
- Aboundex
40
- aboutthedomain
41
- Accoona-AI-Agent
42
- acoon
43
- acrylicapps\.com\/pulp
44
- Acunetix
45
- adbeat
46
- AddThis
47
- ADmantX
48
- adressendeutschland
49
- adscanner\/
50
- Advanced Email Extractor v
51
- agentslug
52
- AHC
53
- aihit
54
- aiohttp\/
55
- Airmail
56
- akka-http\/
57
- akula\/
58
- alertra
59
- alexa site audit
60
- Alibaba\.Security\.Heimdall
61
- Alligator
62
- allloadin\.com
63
- AllSubmitter
64
- alyze\.info
65
- amagit
66
- Anarchie
67
- AndroidDownloadManager
68
- Anemone
69
- AngleSharp\/
70
- Ant\.com
71
- Anturis Agent
72
- AnyEvent-HTTP\/
73
- Apache Droid
74
- Apache-HttpAsyncClient\/
75
- Apache-HttpClient\/
76
- ApacheBench\/
77
- Apexoo
78
- APIs-Google
79
- AportWorm\/[0-9]
80
- AppBeat\/[0-9]
81
- AppEngine-Google
82
- Arachmo
83
- arachnode
84
- Arachnophilia
85
- aria2
86
- asafaweb.com
87
- AskQuickly
88
- ASPSeek
89
- Asterias
90
- Astute
91
- asynchttp
92
- Attach
93
- autocite
94
- Autonomy
95
- axios\/
96
- B-l-i-t-z-B-O-T
97
- Backlink-Ceck
98
- backlink-check
99
- BackStreet
100
- BackWeb
101
- Bad-Neighborhood
102
- Badass
103
- baidu\.com
104
- Bandit
105
- BatchFTP
106
- Battleztar\ Bazinga
107
- baypup\/[0-9]
108
- baypup\/colbert
109
- BazQux
110
- BBBike
111
- BCKLINKS
112
- BDFetch
113
- BegunAdvertising\/
114
- BigBozz
115
- Bigfoot
116
- biglotron
117
- BingLocalSearch
118
- BingPreview
119
- binlar
120
- biNu image cacher
121
- Bitacle
122
- biz_Directory
123
- Black\ Hole
124
- Blackboard Safeassign
125
- BlackWidow
126
- Bloglovin
127
- BlogPulseLive
128
- BlogSearch
129
- Blogtrottr
130
- BlowFish
131
- Boardreader
132
- boitho\.com-dc
133
- Bolt
134
- BPImageWalker
135
- Braintree-Webhooks
136
- Branch Metrics API
137
- Branch-Passthrough
138
- Brandprotect
139
- Brandwatch
140
- Brodie\/
141
- Browsershots
142
- BUbiNG
143
- Buck\/
144
- Buddy
145
- BuiltWith
146
- Bullseye
147
- BunnySlippers
148
- Burf Search
149
- Butterfly\/
150
- BuzzSumo
151
- CAAM\/[0-9]
152
- CakePHP
153
- Calculon
154
- CapsuleChecker
155
- CaretNail
156
- catexplorador
157
- cb crawl
158
- CC Metadata Scaper
159
- Cegbfeieh
160
- Cerberian Drtrs
161
- CERT\.at-Statistics-Survey
162
- cg-eye
163
- changedetection
164
- ChangesMeter\/
165
- Charlotte
166
- CheckHost
167
- checkprivacy
168
- CherryPicker
169
- ChinaClaw
170
- Chirp\/[0-9]
171
- chkme\.com
172
- Chlooe
173
- CirrusExplorer\/
174
- CISPA Vulnerability Notification
175
- Citoid
176
- CJNetworkQuality
177
- Clarsentia
178
- clips\.ua\.ac\.be
179
- Cloud\ mapping
180
- CloudEndure
181
- CloudFlare-AlwaysOnline
182
- Cloudinary\/[0-9]
183
- cmcm\.com
184
- coccoc
185
- cognitiveseo
186
- colly -
187
- CommaFeed
188
- Commons-HttpClient
189
- Comodo SSL Checker
190
- contactbigdatafr
191
- convera
192
- copyright sheriff
193
- CopyRightCheck
194
- Copyscape
195
- Cosmos4j\.feedback
196
- Covario-IDS
197
- CrawlForMe\/[0-9]
198
- Crescent
199
- cron-job\.org
200
- Crowsnest
201
- CSHttp
202
- curb
203
- Curious George
204
- curl
205
- Custo
206
- cuwhois\/[0-9]
207
- cybo\.com
208
- DareBoost
209
- DatabaseDriverMysqli
210
- DataCha0s
211
- DataparkSearch
212
- dataprovider
213
- Daum(oa)?[ \/][0-9]
214
- Demon
215
- DeuSu
216
- developers\.google\.com\/\+\/web\/snippet\/
217
- Devil
218
- Digg
219
- Digincore
220
- DigitalPebble
221
- Dirbuster
222
- Dispatch\/
223
- DittoSpyder
224
- dlvr
225
- DMBrowser
226
- DNS-Tools Header-Analyzer
227
- DNSPod-reporting
228
- docoloc
229
- Dolphin http client\/
230
- DomainAppender
231
- Donuts Content Explorer
232
- dotMailer content retrieval
233
- dotSemantic
234
- downforeveryoneorjustme
235
- Download\ Wonder
236
- downnotifier\.com
237
- DowntimeDetector
238
- Dragonfly File Reader
239
- Drip
240
- drupact
241
- Drupal \(\+http:\/\/drupal\.org\/\)
242
- DTS\ Agent
243
- dubaiindex
244
- EARTHCOM
245
- Easy-Thumb
246
- EasyDL
247
- Ebingbong
248
- ec2linkfinder
249
- eCairn-Grabber
250
- eCatch
251
- ECCP
252
- echocrawl
253
- eContext\/
254
- Ecxi
255
- EirGrabber
256
- ElectricMonk
257
- elefent
258
- EMail Exractor
259
- Email%20Extractor%20Lite
260
- EMail\ Wolf
261
- EmailWolf
262
- Embed PHP Library
263
- Embedly
264
- europarchive\.org
265
- evc-batch
266
- EventMachine HttpClient
267
- Evidon
268
- Evrinid
269
- ExactSearch
270
- ExaleadCloudview
271
- Excel\/
272
- Exif Viewer
273
- ExperianCrawlUK
274
- Exploratodo
275
- Express WebPictures
276
- ExtractorPro
277
- Extreme\ Picture\ Finder
278
- EyeNetIE
279
- ezooms
280
- facebookexternalhit
281
- facebookplatform
282
- fairshare
283
- Faraday v
284
- fasthttp
285
- Faveeo
286
- Favicon downloader
287
- FavOrg
288
- Feed Wrangler
289
- Feedbin
290
- FeedBooster
291
- FeedBucket
292
- FeedBunch\/[0-9]
293
- FeedBurner
294
- FeedChecker
295
- Feedly
296
- Feedspot
297
- Feedwind\/[0-9]
298
- feeltiptop
299
- Fetch API
300
- Fetch\/[0-9]
301
- Fever\/[0-9]
302
- FHscan
303
- Fimap
304
- findlink
305
- findthatfile
306
- FlashGet
307
- FlipboardBrowserProxy
308
- FlipboardProxy
309
- FlipboardRSS
310
- fluffy
311
- Flunky
312
- flynxapp
313
- forensiq
314
- FoundSeoTool\/[0-9]
315
- free thumbnails
316
- Freeuploader
317
- FreeWebMonitoring SiteChecker
318
- Funnelback
319
- G-i-g-a-b-o-t
320
- g00g1e\.net
321
- GAChecker
322
- ganarvisitas\/[0-9]
323
- geek-tools
324
- Genderanalyzer
325
- Genieo
326
- GentleSource
327
- Getintent
328
- GetLinkInfo
329
- getprismatic\.com
330
- GetRight
331
- GetURLInfo\/[0-9]
332
- GetWeb
333
- Ghost Inspector
334
- GigablastOpenSource
335
- GIS-LABS
336
- github-camo
337
- github\.com\/
338
- Go [\d\.]* package http
339
- Go http package
340
- Go!Zilla
341
- Go-Ahead-Got-It
342
- Go-http-client
343
- gobyus
344
- gofetch
345
- GomezAgent
346
- gooblog
347
- Goodzer\/[0-9]
348
- Google favicon
349
- Google Keyword Suggestion
350
- Google Keyword Tool
351
- Google Page Speed Insights
352
- Google PP Default
353
- Google Search Console
354
- Google Web Preview
355
- Google-Adwords
356
- Google-Apps-Script
357
- Google-Calendar-Importer
358
- Google-HotelAdsVerifier
359
- Google-HTTP-Java-Client
360
- Google-Publisher-Plugin
361
- Google-SearchByImage
362
- Google-Site-Verification
363
- Google-Structured-Data-Testing-Tool
364
- Google-Youtube-Links
365
- google_partner_monitoring
366
- GoogleDocs
367
- GoogleHC\/
368
- GoogleProducer
369
- Gookey
370
- GoScraper
371
- GoSpotCheck
372
- GoSquared-Status-Checker
373
- gosquared-thumbnailer
374
- Gotit
375
- GoZilla
376
- grabify
377
- GrabNet
378
- Grafula
379
- Grammarly
380
- GrapeFX
381
- grokkit
382
- grouphigh
383
- grub-client
384
- gSOAP\/
385
- GT::WWW
386
- GTmetrix
387
- GuzzleHttp
388
- gvfs\/
389
- HAA(A)?RTLAND http client
390
- Haansoft
391
- hackney\/
392
- Hatena
393
- Havij
394
- hawkReader
395
- HEADMasterSEO
396
- HeartRails_Capture
397
- help@dataminr\.com
398
- heritrix
399
- historious\/
400
- hledejLevne\.cz\/[0-9]
401
- Hloader
402
- HMView
403
- Holmes
404
- HonesoSearchEngine\/
405
- HootSuite Image proxy
406
- Hootsuite-WebFeed\/[0-9]
407
- hosterstats
408
- HostTracker
409
- ht:\/\/check
410
- htdig
411
- HTMLparser
412
- http-get
413
- HTTP-Header-Abfrage
414
- http-kit
415
- http-request\/
416
- HTTP-Tiny
417
- HTTP::Lite
418
- http\.rb\/
419
- HTTP_Compression_Test
420
- http_request2
421
- http_requester
422
- HttpComponents
423
- httphr
424
- HTTPMon
425
- httpscheck
426
- httpssites_power
427
- httpunit
428
- HttpUrlConnection
429
- httrack
430
- huaweisymantec
431
- HubPages.*crawlingpolicy
432
- HubSpot
433
- Humanlinks
434
- HyperZbozi.cz Feeder
435
- i2kconnect\/
436
- Iblog
437
- ichiro
438
- Id-search
439
- IdeelaborPlagiaat
440
- IDG Twitter Links Resolver
441
- IDwhois\/[0-9]
442
- Iframely
443
- igdeSpyder
444
- IlTrovatore
445
- Image\ Fetch
446
- Image\ Sucker
447
- ImageEngine\/
448
- Imagga
449
- imgsizer
450
- InAGist
451
- inbound\.li parser
452
- InDesign%20CC
453
- Indy\ Library
454
- infegy
455
- infohelfer
456
- InfoTekies
457
- InfoWizards Reciprocal Link System PRO
458
- inpwrd\.com
459
- instabid
460
- Instapaper
461
- Integrity
462
- integromedb
463
- Intelliseek
464
- InterGET
465
- Internet\ Ninja
466
- internet_archive
467
- InternetSeer
468
- internetVista monitor
469
- intraVnews
470
- IODC
471
- IOI
472
- iplabel
473
- ips-agent
474
- IPS\/[0-9]
475
- IPWorks HTTP\/S Component
476
- iqdb\/
477
- Iria
478
- Irokez
479
- isitup\.org
480
- iskanie
481
- iZSearch
482
- janforman
483
- Jaunt\/
484
- Jbrofuzz
485
- Jersey\/
486
- JetCar
487
- Jigsaw
488
- Jobboerse
489
- JobFeed discovery
490
- Jobg8 URL Monitor
491
- jobo
492
- Jobrapido
493
- Jobsearch1\.5
494
- JoinVision Generic
495
- Joomla
496
- Jorgee
497
- JS-Kit
498
- JustView
499
- Kaspersky Lab CFR link resolver
500
- KeepRight OpenStreetMap Checker
501
- Kelny\/
502
- Kerrigan\/
503
- KeyCDN
504
- Keyword Extractor
505
- Keyword\ Density
506
- Keywords Research
507
- KickFire
508
- KimonoLabs\/
509
- Kml-Google
510
- knows\.is
511
- KOCMOHABT
512
- kouio
513
- kulturarw3
514
- KumKie
515
- L\.webis
516
- Larbin
517
- Lavf\/
518
- LayeredExtractor
519
- LeechFTP
520
- LeechGet
521
- letsencrypt
522
- Lftp
523
- LibVLC
524
- LibWeb
525
- Libwhisker
526
- libwww
527
- Licorne Image Snapshot
528
- Liferea\/
529
- Lightspeedsystems
530
- Likse
531
- link checker
532
- Link Valet
533
- link_thumbnailer
534
- LinkAlarm\/
535
- linkCheck
536
- linkdex
537
- LinkExaminer
538
- linkfluence
539
- linkpeek
540
- LinkPreviewGenerator
541
- LinkScan
542
- LinksManager
543
- LinkTiger
544
- LinkWalker
545
- Lipperhey
546
- Litemage_walker
547
- livedoor ScreenShot
548
- LoadImpactRload
549
- LongURL API
550
- looksystems\.net
551
- ltx71
552
- lua-resty-http
553
- lwp-request
554
- lwp-trivial
555
- LWP::Simple
556
- lycos
557
- LYT\.SR
558
- mabontland
559
- Mag-Net
560
- MagpieRSS
561
- Mail.Ru
562
- MailChimp
563
- Majestic12
564
- makecontact\/
565
- Mandrill
566
- MapperCmd
567
- marketinggrader
568
- MarkMonitor
569
- MarkWatch
570
- Mass\ Downloader
571
- masscan\/[0-9]
572
- Mata\ Hari
573
- Mediapartners-Google
574
- mediawords
575
- MegaIndex\.ru
576
- Melvil Rawi\/
577
- MergeFlow-PageReader
578
- Metaspinner
579
- MetaURI
580
- MFC_Tear_Sample
581
- Microsearch
582
- Microsoft Office
583
- Microsoft Windows Network Diagnostics
584
- Microsoft-WebDAV-MiniRedir
585
- Microsoft\ Data\ Access
586
- MIDown\ tool
587
- MIIxpc
588
- Mindjet
589
- Miniature.io\/
590
- Miniflux
591
- Mister\ PiX
592
- mixdata dot com
593
- mixed-content-scan
594
- mixnode
595
- Mnogosearch
596
- mogimogi
597
- Mojeek
598
- Mojolicious \(Perl\)
599
- monitis
600
- Monitority\/[0-9]
601
- montastic
602
- MonTools
603
- Moreover
604
- Morfeus\ Fucking\ Scanner
605
- Morning Paper
606
- MovableType
607
- mowser
608
- Mrcgiguy
609
- MS\ Web\ Services\ Client\ Protocol
610
- MSFrontPage
611
- mShots
612
- MuckRack\/
613
- muhstik-scan
614
- MVAClient
615
- MxToolbox\/
616
- nagios
617
- Najdi\.si\/
618
- Name\ Intelligence
619
- Nameprotect
620
- Navroad
621
- NearSite
622
- Needle
623
- Nessus
624
- Net\ Vampire
625
- NetAnts
626
- NETCRAFT
627
- NetLyzer
628
- NetMechanic
629
- Netpursual
630
- netresearch
631
- NetShelter ContentScan
632
- Netsparker
633
- NetTrack
634
- Netvibes
635
- NetZIP
636
- Neustar WPM
637
- NeutrinoAPI
638
- NewRelicPinger\/1.0 \(\d+\)
639
- NewsBlur .*Finder
640
- NewsGator
641
- newsme
642
- newspaper\/
643
- Nexgate Ruby Client
644
- NG-Search
645
- Nibbler
646
- NICErsPRO
647
- Nikto
648
- nineconnections\.com
649
- NLNZ_IAHarvester
650
- Nmap Scripting Engine
651
- node-superagent
652
- node-urllib\/
653
- node\.io
654
- nominet\.org\.uk
655
- Norton-Safeweb
656
- Notifixious
657
- notifyninja
658
- nuhk
659
- nutch
660
- Nuzzel
661
- nWormFeedFinder
662
- Nymesis
663
- NYU
664
- Ocelli\/[0-9]
665
- Octopus
666
- oegp
667
- Offline Explorer
668
- Offline\ Navigator
669
- okhttp
670
- Omea Reader
671
- omgili
672
- OMSC
673
- Online Domain Tools
674
- OpenCalaisSemanticProxy
675
- Openfind
676
- OpenLinkProfiler
677
- Openstat\/
678
- OpenVAS
679
- Optimizer
680
- Orbiter
681
- OrgProbe\/[0-9]
682
- orion-semantics
683
- ow\.ly
684
- Owler
685
- ownCloud News
686
- OxfordCloudService\/[0-9]
687
- Page Analyzer
688
- Page Valet
689
- page2rss
690
- page\ scorer
691
- page_verifier
692
- PageAnalyzer
693
- PageGrabber
694
- PagePeeker
695
- PageScorer
696
- Pagespeed\/[0-9]
697
- Panopta
698
- panscient
699
- Papa\ Foto
700
- parsijoo
701
- Pavuk
702
- PayPal IPN
703
- pcBrowser
704
- Pcore-HTTP
705
- PEAR HTTPRequest
706
- Pearltrees
707
- PECL::HTTP
708
- peerindex
709
- Peew
710
- PeoplePal
711
- Perlu -
712
- PhantomJS Screenshoter
713
- PhantomJS\/
714
- Photon\/
715
- phpcrawl
716
- phpservermon
717
- Pi-Monster
718
- Picscout
719
- Picsearch
720
- PictureFinder
721
- Pimonster
722
- ping\.blo\.gs\/
723
- Pingability
724
- Pingdom
725
- Pingoscope
726
- PingSpot
727
- pinterest\.com
728
- Pixray
729
- Pizilla
730
- PleaseCrawl
731
- Ploetz \+ Zeller
732
- Plukkie
733
- plumanalytics
734
- PocketParser
735
- Pockey
736
- POE-Component-Client-HTTP
737
- Pompos
738
- Porkbun
739
- Port Monitor
740
- postano
741
- PostmanRuntime\/
742
- PostPost
743
- postrank
744
- PowerPoint\/
745
- Priceonomics Analysis Engine
746
- PrintFriendly\.com
747
- PritTorrent\/[0-9]
748
- Prlog
749
- probethenet
750
- Project 25499
751
- Promotion_Tools_www.searchenginepromotionhelp.com
752
- prospectb2b
753
- Protopage
754
- ProWebWalker
755
- proximic
756
- PRTG Network Monitor
757
- pshtt, https scanning
758
- PTST
759
- PTST\/[0-9]+
760
- Pulsepoint XT3 web scraper
761
- Pump
762
- Python-httplib2
763
- python-requests
764
- Python-urllib
765
- Qirina Hurdler
766
- QQDownload
767
- QrafterPro
768
- Qseero
769
- Qualidator.com SiteAnalyzer
770
- QueryN\ Metasearch
771
- Quora Link Preview
772
- Qwantify
773
- Radian6
774
- RankActive
775
- RankFlex
776
- RankSonicSiteAuditor
777
- Readability
778
- RealDownload
779
- RealPlayer%20Downloader
780
- RebelMouse
781
- Recorder
782
- RecurPost\/
783
- redback\/
784
- Redirect Checker Tool
785
- ReederForMac
786
- ReGet
787
- RepoMonkey
788
- request\.js
789
- ResponseCodeTest\/[0-9]
790
- RestSharp
791
- Riddler
792
- Rival IQ
793
- Robosourcer
794
- Robozilla\/[0-9]
795
- ROI Hunter
796
- RPT-HTTPClient
797
- RSSOwl
798
- safe-agent-scanner
799
- SalesIntelligent
800
- Saleslift
801
- SauceNAO
802
- SBIder
803
- scalaj-http
804
- scan\.lol
805
- ScanAlert
806
- Scoop
807
- scooter
808
- ScoutJet
809
- ScoutURLMonitor
810
- Scrapy
811
- Screaming
812
- ScreenShotService\/[0-9]
813
- Scrubby
814
- Search37\/
815
- search\.thunderstone
816
- Searchestate
817
- SearchSight
818
- Seeker
819
- semanticdiscovery
820
- semanticjuice
821
- Semiocast HTTP client
822
- Semrush
823
- sentry\/
824
- SEO Browser
825
- Seo Servis
826
- seo-nastroj.cz
827
- Seobility
828
- SEOCentro
829
- SeoCheck
830
- SEOkicks
831
- Seomoz
832
- SEOprofiler
833
- SeopultContentAnalyzer
834
- seoscanners
835
- SEOstats
836
- Server Density Service Monitoring
837
- servernfo\.com
838
- SetCronJob\/
839
- sexsearcher
840
- Seznam
841
- Shelob
842
- Shodan
843
- Shoppimon Analyzer
844
- ShoppimonAgent\/[0-9]
845
- ShopWiki
846
- ShortLinkTranslate
847
- shrinktheweb
848
- Sideqik
849
- SilverReader
850
- SimplePie
851
- SimplyFast
852
- Siphon
853
- SISTRIX
854
- Site-Shot\/
855
- Site24x7
856
- Site\ Sucker
857
- SiteBar
858
- Sitebeam
859
- Sitebulb\/
860
- SiteCondor
861
- SiteExplorer
862
- SiteGuardian
863
- Siteimprove
864
- SiteIndexed
865
- Sitemap(s)? Generator
866
- SiteMonitor
867
- Siteshooter B0t
868
- SiteSnagger
869
- SiteSucker
870
- SiteTruth
871
- Sitevigil
872
- sitexy\.com
873
- SkypeUriPreview
874
- Slack\/
875
- slider\.com
876
- slurp
877
- SlySearch
878
- SmartDownload
879
- SMRF URL Expander
880
- SMUrlExpander
881
- Snake
882
- Snappy
883
- SniffRSS
884
- sniptracker
885
- Snoopy
886
- SnowHaze Search
887
- sogou web
888
- SortSite
889
- Sottopop
890
- sovereign\.ai
891
- SpaceBison
892
- Spammen
893
- Spanner
894
- spaziodati
895
- Specificfeeds
896
- speedy
897
- SPEng
898
- Spinn3r
899
- spray-can
900
- Sprinklr
901
- spyonweb
902
- sqlmap
903
- Sqlworm
904
- Sqworm
905
- SSL Labs
906
- ssl-tools
907
- StackRambler
908
- Statastico\/
909
- StatusCake
910
- Steeler
911
- Stratagems Kumo
912
- Stroke.cz
913
- StudioFACA
914
- suchen
915
- Sucuri
916
- summify
917
- Super Monitoring
918
- SuperHTTP
919
- Surphace Scout
920
- Suzuran
921
- SwiteScraper
922
- Symfony BrowserKit
923
- Symfony2 BrowserKit
924
- SynHttpClient-Built
925
- Sysomos
926
- sysscan
927
- Szukacz
928
- T0PHackTeam
929
- tAkeOut
930
- Tarantula\/
931
- Taringa UGC
932
- Teleport
933
- Telesoft
934
- Telesphoreo
935
- Telesphorep
936
- Tenon\.io
937
- teoma
938
- terrainformatica\.com
939
- Test Certificate Info
940
- Tetrahedron\/[0-9]
941
- The Drop Reaper
942
- The Expert HTML Source Viewer
943
- The\ Intraformant
944
- theinternetrules
945
- TheNomad
946
- theoldreader\.com
947
- Thinklab
948
- Thumbshots
949
- ThumbSniper
950
- TinEye
951
- Tiny Tiny RSS
952
- TLSProbe\/
953
- Toata
954
- topster
955
- touche.com
956
- Traackr.com
957
- TrapitAgent
958
- Trendiction
959
- Trendsmap Resolver
960
- trendspottr\.com
961
- truwoGPS
962
- TulipChain
963
- Turingos
964
- Turnitin
965
- tweetedtimes\.com
966
- Tweetminster
967
- Tweezler\/
968
- Twice
969
- Twikle
970
- Twingly
971
- Twisted PageGetter
972
- Typhoeus
973
- ubermetrics-technologies
974
- uclassify
975
- uCrawlr\/
976
- UdmSearch
977
- UniversalFeedParser
978
- Unshorten\.It\!\/[0-9]
979
- Untiny
980
- UnwindFetchor
981
- updated
982
- updown\.io daemon
983
- Upflow
984
- Uptimia
985
- URL Verifier
986
- URLChecker
987
- URLitor.com
988
- urlresolver
989
- Urlstat
990
- UrlTrends Ranking Updater
991
- URLy\ Warning
992
- URLy\.Warning
993
- Vacuum
994
- Vagabondo
995
- VB\ Project
996
- vBSEO
997
- VCI
998
- via ggpht\.com GoogleImageProxy
999
- VidibleScraper
1000
- Virusdie
1001
- visionutils
1002
- vkShare
1003
- VoidEYE
1004
- Voil
1005
- voltron
1006
- voyager\/
1007
- VSAgent\/[0-9]
1008
- VSB-TUO\/[0-9]
1009
- Vulnbusters Meter
1010
- VYU2
1011
- w3af\.org
1012
- W3C-checklink
1013
- W3C-mobileOK
1014
- W3C_I18n-Checker
1015
- W3C_Unicorn
1016
- Wallpapers\/[0-9]+
1017
- WallpapersHD
1018
- wangling
1019
- Wappalyzer
1020
- WatchMouse
1021
- WbSrch\/
1022
- web-capture\.net
1023
- Web-Monitoring
1024
- Web-sniffer
1025
- Web\ Auto
1026
- Web\ Collage
1027
- Web\ Enhancer
1028
- Web\ Fetch
1029
- Web\ Fuck
1030
- Web\ Pix
1031
- Web\ Sauger
1032
- Web\ Sucker
1033
- Webalta
1034
- Webauskunft
1035
- WebAuto
1036
- WebCapture
1037
- WebClient\/
1038
- webcollage
1039
- WebCookies
1040
- WebCopier
1041
- WebCorp
1042
- WebDoc
1043
- WebEnhancer
1044
- WebFetch
1045
- WebFuck
1046
- WebGo\ IS
1047
- WebImageCollector
1048
- WebImages
1049
- WebIndex
1050
- webkit2png
1051
- WebLeacher
1052
- webmastercoffee
1053
- webmon
1054
- WebPix
1055
- WebReaper
1056
- WebSauger
1057
- webscreenie
1058
- Webshag
1059
- Webshot
1060
- Website Analyzer\/
1061
- Website\ Quester
1062
- WebsiteExtractor
1063
- websitepulse agent
1064
- websitepulse[+ ]checker
1065
- WebsiteQuester
1066
- Websnapr\/
1067
- Webster
1068
- WebStripper
1069
- WebSucker
1070
- Webthumb\/[0-9]
1071
- WebThumbnail
1072
- WebWhacker
1073
- WebZIP
1074
- WeCrawlForThePeace
1075
- WeLikeLinks
1076
- WEPA
1077
- WeSEE
1078
- wf84
1079
- wget
1080
- WhatsApp
1081
- WhatsMyIP
1082
- WhatWeb
1083
- WhereGoes\?
1084
- Whibse
1085
- WhoRunsCoinHive
1086
- Whynder Magnet
1087
- Windows-RSS-Platform
1088
- WinHttpRequest
1089
- wkhtmlto
1090
- wmtips
1091
- Woko
1092
- Word\/
1093
- WordPress\/
1094
- wotbox
1095
- WP Engine Install Performance API
1096
- wpif
1097
- wprecon\.com survey
1098
- WPScan
1099
- wscheck
1100
- Wtrace
1101
- WWW-Collector-E
1102
- WWW-Mechanize
1103
- WWW::Mechanize
1104
- www\.monitor\.us
1105
- WWWOFFLE
1106
- x09Mozilla
1107
- x22Mozilla
1108
- XaxisSemanticsClassifier
1109
- Xenu Link Sleuth
1110
- XING-contenttabreceiver\/[0-9]
1111
- XmlSitemapGenerator
1112
- xpymep([0-9]?)\.exe
1113
- Y!J-(ASR|BSC)
1114
- Yaanb
1115
- yacy
1116
- Yahoo Ad monitoring
1117
- Yahoo Link Preview
1118
- YahooCacheSystem
1119
- YahooYSMcm
1120
- YandeG
1121
- Yandex(?!Search)
1122
- yanga
1123
- yeti
1124
- Yo-yo
1125
- Yoleo Consumer
1126
- yoogliFetchAgent
1127
- YottaaMonitor
1128
- Your-Website-Sucks\/[0-9]
1129
- yourls\.org
1130
- Zade
1131
- Zao
1132
- Zauba
1133
- Zemanta Aggregator
1134
- Zend\\Http\\Client
1135
- Zend_Http_Client
1136
- Zermelo
1137
- Zeus
1138
- zgrab
1139
- ZnajdzFoto
1140
- ZyBorg
1141
  [a-z0-9\-_]*(bot|crawler|archiver|transcoder|spider|uptime|validator|fetcher)
1
+ .*Java.*outbrain
2
+ YLT
3
+ 008\/
4
+ 192\.comAgent
5
+ 2ip\.ru
6
+ 404checker
7
+ 404enemy
8
+ 80legs
9
+ ^b0t$
10
+ ^bluefish
11
+ ^Calypso v\/
12
+ ^COMODO DCV
13
+ ^DangDang
14
+ ^DavClnt
15
+ ^FDM
16
+ ^git\/
17
+ ^Goose\/
18
+ ^Grabber
19
+ ^HTTPClient\/
20
+ ^Java\/
21
+ ^Jeode\/
22
+ ^Jetty\/
23
+ ^Mget
24
+ ^Microsoft URL Control
25
+ ^NG\/[0-9\.]
26
+ ^NING\/
27
+ ^PHP\/[0-9]
28
+ ^RMA\/
29
+ ^Ruby|Ruby\/[0-9]
30
+ ^scrutiny\/
31
+ ^VSE\/[0-9]
32
+ ^WordPress\.com
33
+ ^XRL\/[0-9]
34
+ ^ZmEu
35
+ a3logics\.in
36
+ A6-Indexer
37
+ a\.pr-cy\.ru
38
+ Abonti
39
+ Aboundex
40
+ aboutthedomain
41
+ Accoona-AI-Agent
42
+ acoon
43
+ acrylicapps\.com\/pulp
44
+ Acunetix
45
+ adbeat
46
+ AddThis
47
+ ADmantX
48
+ adressendeutschland
49
+ adscanner\/
50
+ Advanced Email Extractor v
51
+ agentslug
52
+ AHC
53
+ aihit
54
+ aiohttp\/
55
+ Airmail
56
+ akka-http\/
57
+ akula\/
58
+ alertra
59
+ alexa site audit
60
+ Alibaba\.Security\.Heimdall
61
+ Alligator
62
+ allloadin\.com
63
+ AllSubmitter
64
+ alyze\.info
65
+ amagit
66
+ Anarchie
67
+ AndroidDownloadManager
68
+ Anemone
69
+ AngleSharp\/
70
+ Ant\.com
71
+ Anturis Agent
72
+ AnyEvent-HTTP\/
73
+ Apache Droid
74
+ Apache-HttpAsyncClient\/
75
+ Apache-HttpClient\/
76
+ ApacheBench\/
77
+ Apexoo
78
+ APIs-Google
79
+ AportWorm\/[0-9]
80
+ AppBeat\/[0-9]
81
+ AppEngine-Google
82
+ Arachmo
83
+ arachnode
84
+ Arachnophilia
85
+ aria2
86
+ asafaweb.com
87
+ AskQuickly
88
+ ASPSeek
89
+ Asterias
90
+ Astute
91
+ asynchttp
92
+ Attach
93
+ autocite
94
+ Autonomy
95
+ axios\/
96
+ B-l-i-t-z-B-O-T
97
+ Backlink-Ceck
98
+ backlink-check
99
+ BackStreet
100
+ BackWeb
101
+ Bad-Neighborhood
102
+ Badass
103
+ baidu\.com
104
+ Bandit
105
+ BatchFTP
106
+ Battleztar\ Bazinga
107
+ baypup\/[0-9]
108
+ baypup\/colbert
109
+ BazQux
110
+ BBBike
111
+ BCKLINKS
112
+ BDFetch
113
+ BegunAdvertising\/
114
+ BigBozz
115
+ Bigfoot
116
+ biglotron
117
+ BingLocalSearch
118
+ BingPreview
119
+ binlar
120
+ biNu image cacher
121
+ Bitacle
122
+ biz_Directory
123
+ Black\ Hole
124
+ Blackboard Safeassign
125
+ BlackWidow
126
+ Bloglovin
127
+ BlogPulseLive
128
+ BlogSearch
129
+ Blogtrottr
130
+ BlowFish
131
+ Boardreader
132
+ boitho\.com-dc
133
+ Bolt
134
+ BPImageWalker
135
+ Braintree-Webhooks
136
+ Branch Metrics API
137
+ Branch-Passthrough
138
+ Brandprotect
139
+ Brandwatch
140
+ Brodie\/
141
+ Browsershots
142
+ BUbiNG
143
+ Buck\/
144
+ Buddy
145
+ BuiltWith
146
+ Bullseye
147
+ BunnySlippers
148
+ Burf Search
149
+ Butterfly\/
150
+ BuzzSumo
151
+ CAAM\/[0-9]
152
+ CakePHP
153
+ Calculon
154
+ CapsuleChecker
155
+ CaretNail
156
+ catexplorador
157
+ cb crawl
158
+ CC Metadata Scaper
159
+ Cegbfeieh
160
+ Cerberian Drtrs
161
+ CERT\.at-Statistics-Survey
162
+ cg-eye
163
+ changedetection
164
+ ChangesMeter\/
165
+ Charlotte
166
+ CheckHost
167
+ checkprivacy
168
+ CherryPicker
169
+ ChinaClaw
170
+ Chirp\/[0-9]
171
+ chkme\.com
172
+ Chlooe
173
+ CirrusExplorer\/
174
+ CISPA Vulnerability Notification
175
+ Citoid
176
+ CJNetworkQuality
177
+ Clarsentia
178
+ clips\.ua\.ac\.be
179
+ Cloud\ mapping
180
+ CloudEndure
181
+ CloudFlare-AlwaysOnline
182
+ Cloudinary\/[0-9]
183
+ cmcm\.com
184
+ coccoc
185
+ cognitiveseo
186
+ colly -
187
+ CommaFeed
188
+ Commons-HttpClient
189
+ Comodo SSL Checker
190
+ contactbigdatafr
191
+ convera
192
+ copyright sheriff
193
+ CopyRightCheck
194
+ Copyscape
195
+ Cosmos4j\.feedback
196
+ Covario-IDS
197
+ CrawlForMe\/[0-9]
198
+ Crescent
199
+ cron-job\.org
200
+ Crowsnest
201
+ CSHttp
202
+ curb
203
+ Curious George
204
+ curl
205
+ Custo
206
+ cuwhois\/[0-9]
207
+ cybo\.com
208
+ DareBoost
209
+ DatabaseDriverMysqli
210
+ DataCha0s
211
+ DataparkSearch
212
+ dataprovider
213
+ Daum(oa)?[ \/][0-9]
214
+ Demon
215
+ DeuSu
216
+ developers\.google\.com\/\+\/web\/snippet\/
217
+ Devil
218
+ Digg
219
+ Digincore
220
+ DigitalPebble
221
+ Dirbuster
222
+ Dispatch\/
223
+ DittoSpyder
224
+ dlvr
225
+ DMBrowser
226
+ DNS-Tools Header-Analyzer
227
+ DNSPod-reporting
228
+ docoloc
229
+ Dolphin http client\/
230
+ DomainAppender
231
+ Donuts Content Explorer
232
+ dotMailer content retrieval
233
+ dotSemantic
234
+ downforeveryoneorjustme
235
+ Download\ Wonder
236
+ downnotifier\.com
237
+ DowntimeDetector
238
+ Dragonfly File Reader
239
+ Drip
240
+ drupact
241
+ Drupal \(\+http:\/\/drupal\.org\/\)
242
+ DTS\ Agent
243
+ dubaiindex
244
+ EARTHCOM
245
+ Easy-Thumb
246
+ EasyDL
247
+ Ebingbong
248
+ ec2linkfinder
249
+ eCairn-Grabber
250
+ eCatch
251
+ ECCP
252
+ echocrawl
253
+ eContext\/
254
+ Ecxi
255
+ EirGrabber
256
+ ElectricMonk
257
+ elefent
258
+ EMail Exractor
259
+ Email%20Extractor%20Lite
260
+ EMail\ Wolf
261
+ EmailWolf
262
+ Embed PHP Library
263
+ Embedly
264
+ europarchive\.org
265
+ evc-batch
266
+ EventMachine HttpClient
267
+ Evidon
268
+ Evrinid
269
+ ExactSearch
270
+ ExaleadCloudview
271
+ Excel\/
272
+ Exif Viewer
273
+ ExperianCrawlUK
274
+ Exploratodo
275
+ Express WebPictures
276
+ ExtractorPro
277
+ Extreme\ Picture\ Finder
278
+ EyeNetIE
279
+ ezooms
280
+ facebookexternalhit
281
+ facebookplatform
282
+ fairshare
283
+ Faraday v
284
+ fasthttp
285
+ Faveeo
286
+ Favicon downloader
287
+ FavOrg
288
+ Feed Wrangler
289
+ Feedbin
290
+ FeedBooster
291
+ FeedBucket
292
+ FeedBunch\/[0-9]
293
+ FeedBurner
294
+ FeedChecker
295
+ Feedly
296
+ Feedspot
297
+ Feedwind\/[0-9]
298
+ feeltiptop
299
+ Fetch API
300
+ Fetch\/[0-9]
301
+ Fever\/[0-9]
302
+ FHscan
303
+ Fimap
304
+ findlink
305
+ findthatfile
306
+ FlashGet
307
+ FlipboardBrowserProxy
308
+ FlipboardProxy
309
+ FlipboardRSS
310
+ fluffy
311
+ Flunky
312
+ flynxapp
313
+ forensiq
314
+ FoundSeoTool\/[0-9]
315
+ free thumbnails
316
+ Freeuploader
317
+ FreeWebMonitoring SiteChecker
318
+ Funnelback
319
+ G-i-g-a-b-o-t
320
+ g00g1e\.net
321
+ GAChecker
322
+ ganarvisitas\/[0-9]
323
+ geek-tools
324
+ Genderanalyzer
325
+ Genieo
326
+ GentleSource
327
+ Getintent
328
+ GetLinkInfo
329
+ getprismatic\.com
330
+ GetRight
331
+ GetURLInfo\/[0-9]
332
+ GetWeb
333
+ Ghost Inspector
334
+ GigablastOpenSource
335
+ GIS-LABS
336
+ github-camo
337
+ github\.com\/
338
+ Go [\d\.]* package http
339
+ Go http package
340
+ Go!Zilla
341
+ Go-Ahead-Got-It
342
+ Go-http-client
343
+ gobyus
344
+ gofetch
345
+ GomezAgent
346
+ gooblog
347
+ Goodzer\/[0-9]
348
+ Google favicon
349
+ Google Keyword Suggestion
350
+ Google Keyword Tool
351
+ Google Page Speed Insights
352
+ Google PP Default
353
+ Google Search Console
354
+ Google Web Preview
355
+ Google-Adwords
356
+ Google-Apps-Script
357
+ Google-Calendar-Importer
358
+ Google-HotelAdsVerifier
359
+ Google-HTTP-Java-Client
360
+ Google-Publisher-Plugin
361
+ Google-SearchByImage
362
+ Google-Site-Verification
363
+ Google-Structured-Data-Testing-Tool
364
+ Google-Youtube-Links
365
+ google_partner_monitoring
366
+ GoogleDocs
367
+ GoogleHC\/
368
+ GoogleProducer
369
+ Gookey
370
+ GoScraper
371
+ GoSpotCheck
372
+ GoSquared-Status-Checker
373
+ gosquared-thumbnailer
374
+ Gotit
375
+ GoZilla
376
+ grabify
377
+ GrabNet
378
+ Grafula
379
+ Grammarly
380
+ GrapeFX
381
+ grokkit
382
+ grouphigh
383
+ grub-client
384
+ gSOAP\/
385
+ GT::WWW
386
+ GTmetrix
387
+ GuzzleHttp
388
+ gvfs\/
389
+ HAA(A)?RTLAND http client
390
+ Haansoft
391
+ hackney\/
392
+ Hatena
393
+ Havij
394
+ hawkReader
395
+ HEADMasterSEO
396
+ HeartRails_Capture
397
+ help@dataminr\.com
398
+ heritrix
399
+ historious\/
400
+ hledejLevne\.cz\/[0-9]
401
+ Hloader
402
+ HMView
403
+ Holmes
404
+ HonesoSearchEngine\/
405
+ HootSuite Image proxy
406
+ Hootsuite-WebFeed\/[0-9]
407
+ hosterstats
408
+ HostTracker
409
+ ht:\/\/check
410
+ htdig
411
+ HTMLparser
412
+ http-get
413
+ HTTP-Header-Abfrage
414
+ http-kit
415
+ http-request\/
416
+ HTTP-Tiny
417
+ HTTP::Lite
418
+ http\.rb\/
419
+ HTTP_Compression_Test
420
+ http_request2
421
+ http_requester
422
+ HttpComponents
423
+ httphr
424
+ HTTPMon
425
+ httpscheck
426
+ httpssites_power
427
+ httpunit
428
+ HttpUrlConnection
429
+ httrack
430
+ huaweisymantec
431
+ HubPages.*crawlingpolicy
432
+ HubSpot
433
+ Humanlinks
434
+ HyperZbozi.cz Feeder
435
+ i2kconnect\/
436
+ Iblog
437
+ ichiro
438
+ Id-search
439
+ IdeelaborPlagiaat
440
+ IDG Twitter Links Resolver
441
+ IDwhois\/[0-9]
442
+ Iframely
443
+ igdeSpyder
444
+ IlTrovatore
445
+ Image\ Fetch
446
+ Image\ Sucker
447
+ ImageEngine\/
448
+ Imagga
449
+ imgsizer
450
+ InAGist
451
+ inbound\.li parser
452
+ InDesign%20CC
453
+ Indy\ Library
454
+ infegy
455
+ infohelfer
456
+ InfoTekies
457
+ InfoWizards Reciprocal Link System PRO
458
+ inpwrd\.com
459
+ instabid
460
+ Instapaper
461
+ Integrity
462
+ integromedb
463
+ Intelliseek
464
+ InterGET
465
+ Internet\ Ninja
466
+ internet_archive
467
+ InternetSeer
468
+ internetVista monitor
469
+ intraVnews
470
+ IODC
471
+ IOI
472
+ iplabel
473
+ ips-agent
474
+ IPS\/[0-9]
475
+ IPWorks HTTP\/S Component
476
+ iqdb\/
477
+ Iria
478
+ Irokez
479
+ isitup\.org
480
+ iskanie
481
+ iZSearch
482
+ janforman
483
+ Jaunt\/
484
+ Jbrofuzz
485
+ Jersey\/
486
+ JetCar
487
+ Jigsaw
488
+ Jobboerse
489
+ JobFeed discovery
490
+ Jobg8 URL Monitor
491
+ jobo
492
+ Jobrapido
493
+ Jobsearch1\.5
494
+ JoinVision Generic
495
+ Joomla
496
+ Jorgee
497
+ JS-Kit
498
+ JustView
499
+ Kaspersky Lab CFR link resolver
500
+ KeepRight OpenStreetMap Checker
501
+ Kelny\/
502
+ Kerrigan\/
503
+ KeyCDN
504
+ Keyword Extractor
505
+ Keyword\ Density
506
+ Keywords Research
507
+ KickFire
508
+ KimonoLabs\/
509
+ Kml-Google
510
+ knows\.is
511
+ KOCMOHABT
512
+ kouio
513
+ kulturarw3
514
+ KumKie
515
+ L\.webis
516
+ Larbin
517
+ Lavf\/
518
+ LayeredExtractor
519
+ LeechFTP
520
+ LeechGet
521
+ letsencrypt
522
+ Lftp
523
+ LibVLC
524
+ LibWeb
525
+ Libwhisker
526
+ libwww
527
+ Licorne Image Snapshot
528
+ Liferea\/
529
+ Lightspeedsystems
530
+ Likse
531
+ link checker
532
+ Link Valet
533
+ link_thumbnailer
534
+ LinkAlarm\/
535
+ linkCheck
536
+ linkdex
537
+ LinkExaminer
538
+ linkfluence
539
+ linkpeek
540
+ LinkPreviewGenerator
541
+ LinkScan
542
+ LinksManager
543
+ LinkTiger
544
+ LinkWalker
545
+ Lipperhey
546
+ Litemage_walker
547
+ livedoor ScreenShot
548
+ LoadImpactRload
549
+ LongURL API
550
+ looksystems\.net
551
+ ltx71
552
+ lua-resty-http
553
+ lwp-request
554
+ lwp-trivial
555
+ LWP::Simple
556
+ lycos
557
+ LYT\.SR
558
+ mabontland
559
+ Mag-Net
560
+ MagpieRSS
561
+ Mail.Ru
562
+ MailChimp
563
+ Majestic12
564
+ makecontact\/
565
+ Mandrill
566
+ MapperCmd
567
+ marketinggrader
568
+ MarkMonitor
569
+ MarkWatch
570
+ Mass\ Downloader
571
+ masscan\/[0-9]
572
+ Mata\ Hari
573
+ Mediapartners-Google
574
+ mediawords
575
+ MegaIndex\.ru
576
+ Melvil Rawi\/
577
+ MergeFlow-PageReader
578
+ Metaspinner
579
+ MetaURI
580
+ MFC_Tear_Sample
581
+ Microsearch
582
+ Microsoft Office
583
+ Microsoft Windows Network Diagnostics
584
+ Microsoft-WebDAV-MiniRedir
585
+ Microsoft\ Data\ Access
586
+ MIDown\ tool
587
+ MIIxpc
588
+ Mindjet
589
+ Miniature.io\/
590
+ Miniflux
591
+ Mister\ PiX
592
+ mixdata dot com
593
+ mixed-content-scan
594
+ mixnode
595
+ Mnogosearch
596
+ mogimogi
597
+ Mojeek
598
+ Mojolicious \(Perl\)
599
+ monitis
600
+ Monitority\/[0-9]
601
+ montastic
602
+ MonTools
603
+ Moreover
604
+ Morfeus\ Fucking\ Scanner
605
+ Morning Paper
606
+ MovableType
607
+ mowser
608
+ Mrcgiguy
609
+ MS\ Web\ Services\ Client\ Protocol
610
+ MSFrontPage
611
+ mShots
612
+ MuckRack\/
613
+ muhstik-scan
614
+ MVAClient
615
+ MxToolbox\/
616
+ nagios
617
+ Najdi\.si\/
618
+ Name\ Intelligence
619
+ Nameprotect
620
+ Navroad
621
+ NearSite
622
+ Needle
623
+ Nessus
624
+ Net\ Vampire
625
+ NetAnts
626
+ NETCRAFT
627
+ NetLyzer
628
+ NetMechanic
629
+ Netpursual
630
+ netresearch
631
+ NetShelter ContentScan
632
+ Netsparker
633
+ NetTrack
634
+ Netvibes
635
+ NetZIP
636
+ Neustar WPM
637
+ NeutrinoAPI
638
+ NewRelicPinger\/1.0 \(\d+\)
639
+ NewsBlur .*Finder
640
+ NewsGator
641
+ newsme
642
+ newspaper\/
643
+ Nexgate Ruby Client
644
+ NG-Search
645
+ Nibbler
646
+ NICErsPRO
647
+ Nikto
648
+ nineconnections\.com
649
+ NLNZ_IAHarvester
650
+ Nmap Scripting Engine
651
+ node-superagent
652
+ node-urllib\/
653
+ node\.io
654
+ nominet\.org\.uk
655
+ Norton-Safeweb
656
+ Notifixious
657
+ notifyninja
658
+ nuhk
659
+ nutch
660
+ Nuzzel
661
+ nWormFeedFinder
662
+ Nymesis
663
+ NYU
664
+ Ocelli\/[0-9]
665
+ Octopus
666
+ oegp
667
+ Offline Explorer
668
+ Offline\ Navigator
669
+ okhttp
670
+ Omea Reader
671
+ omgili
672
+ OMSC
673
+ Online Domain Tools
674
+ OpenCalaisSemanticProxy
675
+ Openfind
676
+ OpenLinkProfiler
677
+ Openstat\/
678
+ OpenVAS
679
+ Optimizer
680
+ Orbiter
681
+ OrgProbe\/[0-9]
682
+ orion-semantics
683
+ ow\.ly
684
+ Owler
685
+ ownCloud News
686
+ OxfordCloudService\/[0-9]
687
+ Page Analyzer
688
+ Page Valet
689
+ page2rss
690
+ page\ scorer
691
+ page_verifier
692
+ PageAnalyzer
693
+ PageGrabber
694
+ PagePeeker
695
+ PageScorer
696
+ Pagespeed\/[0-9]
697
+ Panopta
698
+ panscient
699
+ Papa\ Foto
700
+ parsijoo
701
+ Pavuk
702
+ PayPal IPN
703
+ pcBrowser
704
+ Pcore-HTTP
705
+ PEAR HTTPRequest
706
+ Pearltrees
707
+ PECL::HTTP
708
+ peerindex
709
+ Peew
710
+ PeoplePal
711
+ Perlu -
712
+ PhantomJS Screenshoter
713
+ PhantomJS\/
714
+ Photon\/
715
+ phpcrawl
716
+ phpservermon
717
+ Pi-Monster
718
+ Picscout
719
+ Picsearch
720
+ PictureFinder
721
+ Pimonster
722
+ ping\.blo\.gs\/
723
+ Pingability
724
+ Pingdom
725
+ Pingoscope
726
+ PingSpot
727
+ pinterest\.com
728
+ Pixray
729
+ Pizilla
730
+ PleaseCrawl
731
+ Ploetz \+ Zeller
732
+ Plukkie
733
+ plumanalytics
734
+ PocketParser
735
+ Pockey
736
+ POE-Component-Client-HTTP
737
+ Pompos
738
+ Porkbun
739
+ Port Monitor
740
+ postano
741
+ PostmanRuntime\/
742
+ PostPost
743
+ postrank
744
+ PowerPoint\/
745
+ Priceonomics Analysis Engine
746
+ PrintFriendly\.com
747
+ PritTorrent\/[0-9]
748
+ Prlog
749
+ probethenet
750
+ Project 25499
751
+ Promotion_Tools_www.searchenginepromotionhelp.com
752
+ prospectb2b
753
+ Protopage
754
+ ProWebWalker
755
+ proximic
756
+ PRTG Network Monitor
757
+ pshtt, https scanning
758
+ PTST
759
+ PTST\/[0-9]+
760
+ Pulsepoint XT3 web scraper
761
+ Pump
762
+ Python-httplib2
763
+ python-requests
764
+ Python-urllib
765
+ Qirina Hurdler
766
+ QQDownload
767
+ QrafterPro
768
+ Qseero
769
+ Qualidator.com SiteAnalyzer
770
+ QueryN\ Metasearch
771
+ Quora Link Preview
772
+ Qwantify
773
+ Radian6
774
+ RankActive
775
+ RankFlex
776
+ RankSonicSiteAuditor
777
+ Readability
778
+ RealDownload
779
+ RealPlayer%20Downloader
780
+ RebelMouse
781
+ Recorder
782
+ RecurPost\/
783
+ redback\/
784
+ Redirect Checker Tool
785
+ ReederForMac
786
+ ReGet
787
+ RepoMonkey
788
+ request\.js
789
+ ResponseCodeTest\/[0-9]
790
+ RestSharp
791
+ Riddler
792
+ Rival IQ
793
+ Robosourcer
794
+ Robozilla\/[0-9]
795
+ ROI Hunter
796
+ RPT-HTTPClient
797
+ RSSOwl
798
+ safe-agent-scanner
799
+ SalesIntelligent
800
+ Saleslift
801
+ SauceNAO
802
+ SBIder
803
+ scalaj-http
804
+ scan\.lol
805
+ ScanAlert
806
+ Scoop
807
+ scooter
808
+ ScoutJet
809
+ ScoutURLMonitor
810
+ Scrapy
811
+ Screaming
812
+ ScreenShotService\/[0-9]
813
+ Scrubby
814
+ Search37\/
815
+ search\.thunderstone
816
+ Searchestate
817
+ SearchSight
818
+ Seeker
819
+ semanticdiscovery
820
+ semanticjuice
821
+ Semiocast HTTP client
822
+ Semrush
823
+ sentry\/
824
+ SEO Browser
825
+ Seo Servis
826
+ seo-nastroj.cz
827
+ Seobility
828
+ SEOCentro
829
+ SeoCheck
830
+ SEOkicks
831
+ Seomoz
832
+ SEOprofiler
833
+ SeopultContentAnalyzer
834
+ seoscanners
835
+ SEOstats
836
+ Server Density Service Monitoring
837
+ servernfo\.com
838
+ SetCronJob\/
839
+ sexsearcher
840
+ Seznam
841
+ Shelob
842
+ Shodan
843
+ Shoppimon Analyzer
844
+ ShoppimonAgent\/[0-9]
845
+ ShopWiki
846
+ ShortLinkTranslate
847
+ shrinktheweb
848
+ Sideqik
849
+ SilverReader
850
+ SimplePie
851
+ SimplyFast
852
+ Siphon
853
+ SISTRIX
854
+ Site-Shot\/
855
+ Site24x7
856
+ Site\ Sucker
857
+ SiteBar
858
+ Sitebeam
859
+ Sitebulb\/
860
+ SiteCondor
861
+ SiteExplorer
862
+ SiteGuardian
863
+ Siteimprove
864
+ SiteIndexed
865
+ Sitemap(s)? Generator
866
+ SiteMonitor
867
+ Siteshooter B0t
868
+ SiteSnagger
869
+ SiteSucker
870
+ SiteTruth
871
+ Sitevigil
872
+ sitexy\.com
873
+ SkypeUriPreview
874
+ Slack\/
875
+ slider\.com
876
+ slurp
877
+ SlySearch
878
+ SmartDownload
879
+ SMRF URL Expander
880
+ SMUrlExpander
881
+ Snake
882
+ Snappy
883
+ SniffRSS
884
+ sniptracker
885
+ Snoopy
886
+ SnowHaze Search
887
+ sogou web
888
+ SortSite
889
+ Sottopop
890
+ sovereign\.ai
891
+ SpaceBison
892
+ Spammen
893
+ Spanner
894
+ spaziodati
895
+ Specificfeeds
896
+ speedy
897
+ SPEng
898
+ Spinn3r
899
+ spray-can
900
+ Sprinklr
901
+ spyonweb
902
+ sqlmap
903
+ Sqlworm
904
+ Sqworm
905
+ SSL Labs
906
+ ssl-tools
907
+ StackRambler
908
+ Statastico\/
909
+ StatusCake
910
+ Steeler
911
+ Stratagems Kumo
912
+ Stroke.cz
913
+ StudioFACA
914
+ suchen
915
+ Sucuri
916
+ summify
917
+ Super Monitoring
918
+ SuperHTTP
919
+ Surphace Scout
920
+ Suzuran
921
+ SwiteScraper
922
+ Symfony BrowserKit
923
+ Symfony2 BrowserKit
924
+ SynHttpClient-Built
925
+ Sysomos
926
+ sysscan
927
+ Szukacz
928
+ T0PHackTeam
929
+ tAkeOut
930
+ Tarantula\/
931
+ Taringa UGC
932
+ Teleport
933
+ Telesoft
934
+ Telesphoreo
935
+ Telesphorep
936
+ Tenon\.io
937
+ teoma
938
+ terrainformatica\.com
939
+ Test Certificate Info
940
+ Tetrahedron\/[0-9]
941
+ The Drop Reaper
942
+ The Expert HTML Source Viewer
943
+ The\ Intraformant
944
+ theinternetrules
945
+ TheNomad
946
+ theoldreader\.com
947
+ Thinklab
948
+ Thumbshots
949
+ ThumbSniper
950
+ TinEye
951
+ Tiny Tiny RSS
952
+ TLSProbe\/
953
+ Toata
954
+ topster
955
+ touche.com
956
+ Traackr.com
957
+ TrapitAgent
958
+ Trendiction
959
+ Trendsmap Resolver
960
+ trendspottr\.com
961
+ truwoGPS
962
+ TulipChain
963
+ Turingos
964
+ Turnitin
965
+ tweetedtimes\.com
966
+ Tweetminster
967
+ Tweezler\/
968
+ Twice
969
+ Twikle
970
+ Twingly
971
+ Twisted PageGetter
972
+ Typhoeus
973
+ ubermetrics-technologies
974
+ uclassify
975
+ uCrawlr\/
976
+ UdmSearch
977
+ UniversalFeedParser
978
+ Unshorten\.It\!\/[0-9]
979
+ Untiny
980
+ UnwindFetchor
981
+ updated
982
+ updown\.io daemon
983
+ Upflow
984
+ Uptimia
985
+ URL Verifier
986
+ URLChecker
987
+ URLitor.com
988
+ urlresolver
989
+ Urlstat
990
+ UrlTrends Ranking Updater
991
+ URLy\ Warning
992
+ URLy\.Warning
993
+ Vacuum
994
+ Vagabondo
995
+ VB\ Project
996
+ vBSEO
997
+ VCI
998
+ via ggpht\.com GoogleImageProxy
999
+ VidibleScraper
1000
+ Virusdie
1001
+ visionutils
1002
+ vkShare
1003
+ VoidEYE
1004
+ Voil
1005
+ voltron
1006
+ voyager\/
1007
+ VSAgent\/[0-9]
1008
+ VSB-TUO\/[0-9]
1009
+ Vulnbusters Meter
1010
+ VYU2
1011
+ w3af\.org
1012
+ W3C-checklink
1013
+ W3C-mobileOK
1014
+ W3C_I18n-Checker
1015
+ W3C_Unicorn
1016
+ Wallpapers\/[0-9]+
1017
+ WallpapersHD
1018
+ wangling
1019
+ Wappalyzer
1020
+ WatchMouse
1021
+ WbSrch\/
1022
+ web-capture\.net
1023
+ Web-Monitoring
1024
+ Web-sniffer
1025
+ Web\ Auto
1026
+ Web\ Collage
1027
+ Web\ Enhancer
1028
+ Web\ Fetch
1029
+ Web\ Fuck
1030
+ Web\ Pix
1031
+ Web\ Sauger
1032
+ Web\ Sucker
1033
+ Webalta
1034
+ Webauskunft
1035
+ WebAuto
1036
+ WebCapture
1037
+ WebClient\/
1038
+ webcollage
1039
+ WebCookies
1040
+ WebCopier
1041
+ WebCorp
1042
+ WebDoc
1043
+ WebEnhancer
1044
+ WebFetch
1045
+ WebFuck
1046
+ WebGo\ IS
1047
+ WebImageCollector
1048
+ WebImages
1049
+ WebIndex
1050
+ webkit2png
1051
+ WebLeacher
1052
+ webmastercoffee
1053
+ webmon
1054
+ WebPix
1055
+ WebReaper
1056
+ WebSauger
1057
+ webscreenie
1058
+ Webshag
1059
+ Webshot
1060
+ Website Analyzer\/
1061
+ Website\ Quester
1062
+ WebsiteExtractor
1063
+ websitepulse agent
1064
+ websitepulse[+ ]checker
1065
+ WebsiteQuester
1066
+ Websnapr\/
1067
+ Webster
1068
+ WebStripper
1069
+ WebSucker
1070
+ Webthumb\/[0-9]
1071
+ WebThumbnail
1072
+ WebWhacker
1073
+ WebZIP
1074
+ WeCrawlForThePeace
1075
+ WeLikeLinks
1076
+ WEPA
1077
+ WeSEE
1078
+ wf84
1079
+ wget
1080
+ WhatsApp
1081
+ WhatsMyIP
1082
+ WhatWeb
1083
+ WhereGoes\?
1084
+ Whibse
1085
+ WhoRunsCoinHive
1086
+ Whynder Magnet
1087
+ Windows-RSS-Platform
1088
+ WinHttpRequest
1089
+ wkhtmlto
1090
+ wmtips
1091
+ Woko
1092
+ Word\/
1093
+ WordPress\/
1094
+ wotbox
1095
+ WP Engine Install Performance API
1096
+ wpif
1097
+ wprecon\.com survey
1098
+ WPScan
1099
+ wscheck
1100
+ Wtrace
1101
+ WWW-Collector-E
1102
+ WWW-Mechanize
1103
+ WWW::Mechanize
1104
+ www\.monitor\.us
1105
+ WWWOFFLE
1106
+ x09Mozilla
1107
+ x22Mozilla
1108
+ XaxisSemanticsClassifier
1109
+ Xenu Link Sleuth
1110
+ XING-contenttabreceiver\/[0-9]
1111
+ XmlSitemapGenerator
1112
+ xpymep([0-9]?)\.exe
1113
+ Y!J-(ASR|BSC)
1114
+ Yaanb
1115
+ yacy
1116
+ Yahoo Ad monitoring
1117
+ Yahoo Link Preview
1118
+ YahooCacheSystem
1119
+ YahooYSMcm
1120
+ YandeG
1121
+ Yandex(?!Search)
1122
+ yanga
1123
+ yeti
1124
+ Yo-yo
1125
+ Yoleo Consumer
1126
+ yoogliFetchAgent
1127
+ YottaaMonitor
1128
+ Your-Website-Sucks\/[0-9]
1129
+ yourls\.org
1130
+ Zade
1131
+ Zao
1132
+ Zauba
1133
+ Zemanta Aggregator
1134
+ Zend\\Http\\Client
1135
+ Zend_Http_Client
1136
+ Zermelo
1137
+ Zeus
1138
+ zgrab
1139
+ ZnajdzFoto
1140
+ ZyBorg
1141
  [a-z0-9\-_]*(bot|crawler|archiver|transcoder|spider|uptime|validator|fetcher)
vendor/jaybizzle/crawler-detect/raw/Exclusions.txt CHANGED
@@ -1,42 +1,42 @@
1
- Safari.[\d\.]*
2
- Firefox.[\d\.]*
3
- Chrome.[\d\.]*
4
- Chromium.[\d\.]*
5
- MSIE.[\d\.]
6
- Opera\/[\d\.]*
7
- Mozilla.[\d\.]*
8
- AppleWebKit.[\d\.]*
9
- Trident.[\d\.]*
10
- Windows NT.[\d\.]*
11
- Android [\d\.]*
12
- Macintosh.
13
- Ubuntu
14
- Linux
15
- [ ]Intel
16
- Mac OS X [\d_]*
17
- (like )?Gecko(.[\d\.]*)?
18
- KHTML,
19
- CriOS.[\d\.]*
20
- CPU iPhone OS ([0-9_])* like Mac OS X
21
- CPU OS ([0-9_])* like Mac OS X
22
- iPod
23
- compatible
24
- x86_..
25
- i686
26
- x64
27
- X11
28
- rv:[\d\.]*
29
- Version.[\d\.]*
30
- WOW64
31
- Win64
32
- Dalvik.[\d\.]*
33
- \.NET CLR [\d\.]*
34
- Presto.[\d\.]*
35
- Media Center PC
36
- BlackBerry
37
- Build
38
- Opera Mini\/\d{1,2}\.\d{1,2}\.[\d\.]*\/\d{1,2}\.
39
- Opera
40
- \.NET[\d\.]*
41
- cubot
42
  ;
1
+ Safari.[\d\.]*
2
+ Firefox.[\d\.]*
3
+ Chrome.[\d\.]*
4
+ Chromium.[\d\.]*
5
+ MSIE.[\d\.]
6
+ Opera\/[\d\.]*
7
+ Mozilla.[\d\.]*
8
+ AppleWebKit.[\d\.]*
9
+ Trident.[\d\.]*
10
+ Windows NT.[\d\.]*
11
+ Android [\d\.]*
12
+ Macintosh.
13
+ Ubuntu
14
+ Linux
15
+ [ ]Intel
16
+ Mac OS X [\d_]*
17
+ (like )?Gecko(.[\d\.]*)?
18
+ KHTML,
19
+ CriOS.[\d\.]*
20
+ CPU iPhone OS ([0-9_])* like Mac OS X
21
+ CPU OS ([0-9_])* like Mac OS X
22
+ iPod
23
+ compatible
24
+ x86_..
25
+ i686
26
+ x64
27
+ X11
28
+ rv:[\d\.]*
29
+ Version.[\d\.]*
30
+ WOW64
31
+ Win64
32
+ Dalvik.[\d\.]*
33
+ \.NET CLR [\d\.]*
34
+ Presto.[\d\.]*
35
+ Media Center PC
36
+ BlackBerry
37
+ Build
38
+ Opera Mini\/\d{1,2}\.\d{1,2}\.[\d\.]*\/\d{1,2}\.
39
+ Opera
40
+ \.NET[\d\.]*
41
+ cubot
42
  ;
vendor/jaybizzle/crawler-detect/raw/Headers.txt CHANGED
@@ -1,10 +1,10 @@
1
- HTTP_USER_AGENT
2
- HTTP_X_OPERAMINI_PHONE_UA
3
- HTTP_X_DEVICE_USER_AGENT
4
- HTTP_X_ORIGINAL_USER_AGENT
5
- HTTP_X_SKYFIRE_PHONE
6
- HTTP_X_BOLT_PHONE_UA
7
- HTTP_DEVICE_STOCK_UA
8
- HTTP_X_UCBROWSER_DEVICE_UA
9
- HTTP_FROM
10
  HTTP_X_SCANNER
1
+ HTTP_USER_AGENT
2
+ HTTP_X_OPERAMINI_PHONE_UA
3
+ HTTP_X_DEVICE_USER_AGENT
4
+ HTTP_X_ORIGINAL_USER_AGENT
5
+ HTTP_X_SKYFIRE_PHONE
6
+ HTTP_X_BOLT_PHONE_UA
7
+ HTTP_DEVICE_STOCK_UA
8
+ HTTP_X_UCBROWSER_DEVICE_UA
9
+ HTTP_FROM
10
  HTTP_X_SCANNER
vendor/jaybizzle/crawler-detect/src/CrawlerDetect.php CHANGED
@@ -1,191 +1,191 @@
1
- <?php
2
-
3
- /*
4
- * This file is part of Crawler Detect - the web crawler detection library.
5
- *
6
- * (c) Mark Beech <m@rkbee.ch>
7
- *
8
- * This source file is subject to the MIT license that is bundled
9
- * with this source code in the file LICENSE.
10
- */
11
-
12
- namespace Jaybizzle\CrawlerDetect;
13
-
14
- use Jaybizzle\CrawlerDetect\Fixtures\Headers;
15
- use Jaybizzle\CrawlerDetect\Fixtures\Crawlers;
16
- use Jaybizzle\CrawlerDetect\Fixtures\Exclusions;
17
-
18
- class CrawlerDetect
19
- {
20
- /**
21
- * The user agent.
22
- *
23
- * @var null
24
- */
25
- protected $userAgent = null;
26
-
27
- /**
28
- * Headers that contain a user agent.
29
- *
30
- * @var array
31
- */
32
- protected $httpHeaders = array();
33
-
34
- /**
35
- * Store regex matches.
36
- *
37
- * @var array
38
- */
39
- protected $matches = array();
40
-
41
- /**
42
- * Crawlers object.
43
- *
44
- * @var \Jaybizzle\CrawlerDetect\Fixtures\Crawlers
45
- */
46
- protected $crawlers;
47
-
48
- /**
49
- * Exclusions object.
50
- *
51
- * @var \Jaybizzle\CrawlerDetect\Fixtures\Exclusions
52
- */
53
- protected $exclusions;
54
-
55
- /**
56
- * Headers object.
57
- *
58
- * @var \Jaybizzle\CrawlerDetect\Fixtures\Headers
59
- */
60
- protected $uaHttpHeaders;
61
-
62
- /**
63
- * The compiled regex string.
64
- *
65
- * @var string
66
- */
67
- protected $compiledRegex;
68
-
69
- /**
70
- * The compiled exclusions regex string.
71
- *
72
- * @var string
73
- */
74
- protected $compiledExclusions;
75
-
76
- /**
77
- * Class constructor.
78
- */
79
- public function __construct(array $headers = null, $userAgent = null)
80
- {
81
- $this->crawlers = new Crawlers();
82
- $this->exclusions = new Exclusions();
83
- $this->uaHttpHeaders = new Headers();
84
-
85
- $this->compiledRegex = $this->compileRegex($this->crawlers->getAll());
86
- $this->compiledExclusions = $this->compileRegex($this->exclusions->getAll());
87
-
88
- $this->setHttpHeaders($headers);
89
- $this->userAgent = $this->setUserAgent($userAgent);
90
- }
91
-
92
- /**
93
- * Compile the regex patterns into one regex string.
94
- *
95
- * @param array
96
- *
97
- * @return string
98
- */
99
- public function compileRegex($patterns)
100
- {
101
- return '('.implode('|', $patterns).')';
102
- }
103
-
104
- /**
105
- * Set HTTP headers.
106
- *
107
- * @param array|null $httpHeaders
108
- */
109
- public function setHttpHeaders($httpHeaders)
110
- {
111
- // Use global _SERVER if $httpHeaders aren't defined.
112
- if (! is_array($httpHeaders) || ! count($httpHeaders)) {
113
- $httpHeaders = $_SERVER;
114
- }
115
-
116
- // Clear existing headers.
117
- $this->httpHeaders = array();
118
-
119
- // Only save HTTP headers. In PHP land, that means
120
- // only _SERVER vars that start with HTTP_.
121
- foreach ($httpHeaders as $key => $value) {
122
- if (strpos($key, 'HTTP_') === 0) {
123
- $this->httpHeaders[$key] = $value;
124
- }
125
- }
126
- }
127
-
128
- /**
129
- * Return user agent headers.
130
- *
131
- * @return array
132
- */
133
- public function getUaHttpHeaders()
134
- {
135
- return $this->uaHttpHeaders->getAll();
136
- }
137
-
138
- /**
139
- * Set the user agent.
140
- *
141
- * @param string $userAgent
142
- */
143
- public function setUserAgent($userAgent)
144
- {
145
- if (is_null($userAgent)) {
146
- foreach ($this->getUaHttpHeaders() as $altHeader) {
147
- if (isset($this->httpHeaders[$altHeader])) {
148
- $userAgent .= $this->httpHeaders[$altHeader].' ';
149
- }
150
- }
151
- }
152
-
153
- return $userAgent;
154
- }
155
-
156
- /**
157
- * Check user agent string against the regex.
158
- *
159
- * @param string|null $userAgent
160
- *
161
- * @return bool
162
- */
163
- public function isCrawler($userAgent = null)
164
- {
165
- $agent = $userAgent ?: $this->userAgent;
166
-
167
- $agent = preg_replace('/'.$this->compiledExclusions.'/i', '', $agent);
168
-
169
- if (strlen(trim($agent)) == 0) {
170
- return false;
171
- }
172
-
173
- $result = preg_match('/'.$this->compiledRegex.'/i', trim($agent), $matches);
174
-
175
- if ($matches) {
176
- $this->matches = $matches;
177
- }
178
-
179
- return (bool) $result;
180
- }
181
-
182
- /**
183
- * Return the matches.
184
- *
185
- * @return string|null
186
- */
187
- public function getMatches()
188
- {
189
- return isset($this->matches[0]) ? $this->matches[0] : null;
190
- }
191
- }
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of Crawler Detect - the web crawler detection library.
5
+ *
6
+ * (c) Mark Beech <m@rkbee.ch>
7
+ *
8
+ * This source file is subject to the MIT license that is bundled
9
+ * with this source code in the file LICENSE.
10
+ */
11
+
12
+ namespace Jaybizzle\CrawlerDetect;
13
+
14
+ use Jaybizzle\CrawlerDetect\Fixtures\Headers;
15
+ use Jaybizzle\CrawlerDetect\Fixtures\Crawlers;
16
+ use Jaybizzle\CrawlerDetect\Fixtures\Exclusions;
17
+
18
+ class CrawlerDetect
19
+ {
20
+ /**
21
+ * The user agent.
22
+ *
23
+ * @var null
24
+ */
25
+ protected $userAgent = null;
26
+
27
+ /**
28
+ * Headers that contain a user agent.
29
+ *
30
+ * @var array
31
+ */
32
+ protected $httpHeaders = array();
33
+
34
+ /**
35
+ * Store regex matches.
36
+ *
37
+ * @var array
38
+ */
39
+ protected $matches = array();
40
+
41
+ /**
42
+ * Crawlers object.
43
+ *
44
+ * @var \Jaybizzle\CrawlerDetect\Fixtures\Crawlers
45
+ */
46
+ protected $crawlers;
47
+
48
+ /**
49
+ * Exclusions object.
50
+ *
51
+ * @var \Jaybizzle\CrawlerDetect\Fixtures\Exclusions
52
+ */
53
+ protected $exclusions;
54
+
55
+ /**
56
+ * Headers object.
57
+ *
58
+ * @var \Jaybizzle\CrawlerDetect\Fixtures\Headers
59
+ */
60
+ protected $uaHttpHeaders;
61
+
62
+ /**
63
+ * The compiled regex string.
64
+ *
65
+ * @var string
66
+ */
67
+ protected $compiledRegex;
68
+
69
+ /**
70
+ * The compiled exclusions regex string.
71
+ *
72
+ * @var string
73
+ */
74
+ protected $compiledExclusions;
75
+
76
+ /**
77
+ * Class constructor.
78
+ */
79
+ public function __construct(array $headers = null, $userAgent = null)
80
+ {
81
+ $this->crawlers = new Crawlers();
82
+ $this->exclusions = new Exclusions();
83
+ $this->uaHttpHeaders = new Headers();
84
+
85
+ $this->compiledRegex = $this->compileRegex($this->crawlers->getAll());
86
+ $this->compiledExclusions = $this->compileRegex($this->exclusions->getAll());
87
+
88
+ $this->setHttpHeaders($headers);
89
+ $this->userAgent = $this->setUserAgent($userAgent);
90
+ }
91
+
92
+ /**
93
+ * Compile the regex patterns into one regex string.
94
+ *
95
+ * @param array
96
+ *
97
+ * @return string
98
+ */
99
+ public function compileRegex($patterns)
100
+ {
101
+ return '('.implode('|', $patterns).')';
102
+ }
103
+
104
+ /**
105
+ * Set HTTP headers.
106
+ *
107
+ * @param array|null $httpHeaders
108
+ */
109
+ public function setHttpHeaders($httpHeaders)
110
+ {
111
+ // Use global _SERVER if $httpHeaders aren't defined.
112
+ if (! is_array($httpHeaders) || ! count($httpHeaders)) {
113
+ $httpHeaders = $_SERVER;
114
+ }
115
+
116
+ // Clear existing headers.
117
+ $this->httpHeaders = array();
118
+
119
+ // Only save HTTP headers. In PHP land, that means
120
+ // only _SERVER vars that start with HTTP_.
121
+ foreach ($httpHeaders as $key => $value) {
122
+ if (strpos($key, 'HTTP_') === 0) {
123
+ $this->httpHeaders[$key] = $value;
124
+ }
125
+ }
126
+ }
127
+
128
+ /**
129
+ * Return user agent headers.
130
+ *
131
+ * @return array
132
+ */
133
+ public function getUaHttpHeaders()
134
+ {
135
+ return $this->uaHttpHeaders->getAll();
136
+ }
137
+
138
+ /**
139
+ * Set the user agent.
140
+ *
141
+ * @param string $userAgent
142
+ */
143
+ public function setUserAgent($userAgent)
144
+ {
145
+ if (is_null($userAgent)) {
146
+ foreach ($this->getUaHttpHeaders() as $altHeader) {
147
+ if (isset($this->httpHeaders[$altHeader])) {
148
+ $userAgent .= $this->httpHeaders[$altHeader].' ';
149
+ }
150
+ }
151
+ }
152
+
153
+ return $userAgent;
154
+ }
155
+
156
+ /**
157
+ * Check user agent string against the regex.
158
+ *
159
+ * @param string|null $userAgent
160
+ *
161
+ * @return bool
162
+ */
163
+ public function isCrawler($userAgent = null)
164
+ {
165
+ $agent = $userAgent ?: $this->userAgent;
166
+
167
+ $agent = preg_replace('/'.$this->compiledExclusions.'/i', '', $agent);
168
+
169
+ if (strlen(trim($agent)) == 0) {
170
+ return false;
171
+ }
172
+
173
+ $result = preg_match('/'.$this->compiledRegex.'/i', trim($agent), $matches);
174
+
175
+ if ($matches) {
176
+ $this->matches = $matches;
177
+ }
178
+
179
+ return (bool) $result;
180
+ }
181
+
182
+ /**
183
+ * Return the matches.
184
+ *
185
+ * @return string|null
186
+ */
187
+ public function getMatches()
188
+ {
189
+ return isset($this->matches[0]) ? $this->matches[0] : null;
190
+ }
191
+ }
vendor/jaybizzle/crawler-detect/src/Fixtures/AbstractProvider.php CHANGED
@@ -1,31 +1,31 @@
1
- <?php
2
-
3
- /*
4
- * This file is part of Crawler Detect - the web crawler detection library.
5
- *
6
- * (c) Mark Beech <m@rkbee.ch>
7
- *
8
- * This source file is subject to the MIT license that is bundled
9
- * with this source code in the file LICENSE.
10
- */
11
-
12
- namespace Jaybizzle\CrawlerDetect\Fixtures;
13
-
14
- abstract class AbstractProvider
15
- {
16
- /**
17
- * The data set.
18
- *
19
- * @var array
20
- */
21
- protected $data;
22
- /**
23
- * Return the data set.
24
- *
25
- * @return array
26
- */
27
- public function getAll()
28
- {
29
- return $this->data;
30
- }
31
- }
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of Crawler Detect - the web crawler detection library.
5
+ *
6
+ * (c) Mark Beech <m@rkbee.ch>
7
+ *
8
+ * This source file is subject to the MIT license that is bundled
9
+ * with this source code in the file LICENSE.
10
+ */
11
+
12
+ namespace Jaybizzle\CrawlerDetect\Fixtures;
13
+
14
+ abstract class AbstractProvider
15
+ {
16
+ /**
17
+ * The data set.
18
+ *
19
+ * @var array
20
+ */
21
+ protected $data;
22
+ /**
23
+ * Return the data set.
24
+ *
25
+ * @return array
26
+ */
27
+ public function getAll()
28
+ {
29
+ return $this->data;
30
+ }
31
+ }
vendor/jaybizzle/crawler-detect/src/Fixtures/Crawlers.php CHANGED
@@ -1,1162 +1,1162 @@
1
- <?php
2
-
3
- /*
4
- * This file is part of Crawler Detect - the web crawler detection library.
5
- *
6
- * (c) Mark Beech <m@rkbee.ch>
7
- *
8
- * This source file is subject to the MIT license that is bundled
9
- * with this source code in the file LICENSE.
10
- */
11
-
12
- namespace Jaybizzle\CrawlerDetect\Fixtures;
13
-
14
- class Crawlers extends AbstractProvider
15
- {
16
- /**
17
- * Array of regular expressions to match against the user agent.
18
- *
19
- * @var array
20
- */
21
- protected $data = array(
22
- '.*Java.*outbrain',
23
- ' YLT',
24
- '008\/',
25
- '192\.comAgent',
26
- '2ip\.ru',
27
- '404checker',
28
- '404enemy',
29
- '80legs',
30
- '^b0t$',
31
- '^bluefish ',
32
- '^Calypso v\/',
33
- '^COMODO DCV',
34
- '^DangDang',
35
- '^DavClnt',
36
- '^FDM ',
37
- '^git\/',
38
- '^Goose\/',
39
- '^Grabber',
40
- '^HTTPClient\/',
41
- '^Java\/',
42
- '^Jeode\/',
43
- '^Jetty\/',
44
- '^Mget',
45
- '^Microsoft URL Control',
46
- '^NG\/[0-9\.]',
47
- '^NING\/',
48
- '^PHP\/[0-9]',
49
- '^RMA\/',
50
- '^Ruby|Ruby\/[0-9]',
51
- '^scrutiny\/',
52
- '^VSE\/[0-9]',
53
- '^WordPress\.com',
54
- '^XRL\/[0-9]',
55
- '^ZmEu',
56
- 'a3logics\.in',
57
- 'A6-Indexer',
58
- 'a\.pr-cy\.ru',
59
- 'Abonti',
60
- 'Aboundex',
61
- 'aboutthedomain',
62
- 'Accoona-AI-Agent',
63
- 'acoon',
64
- 'acrylicapps\.com\/pulp',
65
- 'Acunetix',
66
- 'adbeat',
67
- 'AddThis',
68
- 'ADmantX',
69
- 'adressendeutschland',
70
- 'adscanner\/',
71
- 'Advanced Email Extractor v',
72
- 'agentslug',
73
- 'AHC',
74
- 'aihit',
75
- 'aiohttp\/',
76
- 'Airmail',
77
- 'akka-http\/',
78
- 'akula\/',
79
- 'alertra',
80
- 'alexa site audit',
81
- 'Alibaba\.Security\.Heimdall',
82
- 'Alligator',
83
- 'allloadin\.com',
84
- 'AllSubmitter',
85
- 'alyze\.info',
86
- 'amagit',
87
- 'Anarchie',
88
- 'AndroidDownloadManager',
89
- 'Anemone',
90
- 'AngleSharp\/',
91
- 'Ant\.com',
92
- 'Anturis Agent',
93
- 'AnyEvent-HTTP\/',
94
- 'Apache Droid',
95
- 'Apache-HttpAsyncClient\/',
96
- 'Apache-HttpClient\/',
97
- 'ApacheBench\/',
98
- 'Apexoo',
99
- 'APIs-Google',
100
- 'AportWorm\/[0-9]',
101
- 'AppBeat\/[0-9]',
102
- 'AppEngine-Google',
103
- 'Arachmo',
104
- 'arachnode',
105
- 'Arachnophilia',
106
- 'aria2',
107
- 'asafaweb.com',
108
- 'AskQuickly',
109
- 'ASPSeek',
110
- 'Asterias',
111
- 'Astute',
112
- 'asynchttp',
113
- 'Attach',
114
- 'autocite',
115
- 'Autonomy',
116
- 'axios\/',
117
- 'B-l-i-t-z-B-O-T',
118
- 'Backlink-Ceck',
119
- 'backlink-check',
120
- 'BackStreet',
121
- 'BackWeb',
122
- 'Bad-Neighborhood',
123
- 'Badass',
124
- 'baidu\.com',
125
- 'Bandit',
126
- 'BatchFTP',
127
- 'Battleztar\ Bazinga',
128
- 'baypup\/[0-9]',
129
- 'baypup\/colbert',
130
- 'BazQux',
131
- 'BBBike',
132
- 'BCKLINKS',
133
- 'BDFetch',
134
- 'BegunAdvertising\/',
135
- 'BigBozz',
136
- 'Bigfoot',
137
- 'biglotron',
138
- 'BingLocalSearch',
139
- 'BingPreview',
140
- 'binlar',
141
- 'biNu image cacher',
142
- 'Bitacle',
143
- 'biz_Directory',
144
- 'Black\ Hole',
145
- 'Blackboard Safeassign',
146
- 'BlackWidow',
147
- 'Bloglovin',
148
- 'BlogPulseLive',
149
- 'BlogSearch',
150
- 'Blogtrottr',
151
- 'BlowFish',
152
- 'Boardreader',
153
- 'boitho\.com-dc',
154
- 'BPImageWalker',
155
- 'Braintree-Webhooks',
156
- 'Branch Metrics API',
157
- 'Branch-Passthrough',
158
- 'Brandprotect',
159
- 'Brandwatch',
160
- 'Brodie\/',
161
- 'Browsershots',
162
- 'BUbiNG',
163
- 'Buck\/',
164
- 'Buddy',
165
- 'BuiltWith',
166
- 'Bullseye',
167
- 'BunnySlippers',
168
- 'Burf Search',
169
- 'Butterfly\/',
170
- 'BuzzSumo',
171
- 'CAAM\/[0-9]',
172
- 'CakePHP',
173
- 'Calculon',
174
- 'CapsuleChecker',
175
- 'CaretNail',
176
- 'catexplorador',
177
- 'cb crawl',
178
- 'CC Metadata Scaper',
179
- 'Cegbfeieh',
180
- 'Cerberian Drtrs',
181
- 'CERT\.at-Statistics-Survey',
182
- 'cg-eye',
183
- 'changedetection',
184
- 'ChangesMeter\/',
185
- 'Charlotte',
186
- 'CheckHost',
187
- 'checkprivacy',
188
- 'CherryPicker',
189
- 'ChinaClaw',
190
- 'Chirp\/[0-9]',
191
- 'chkme\.com',
192
- 'Chlooe',
193
- 'CirrusExplorer\/',
194
- 'CISPA Vulnerability Notification',
195
- 'Citoid',
196
- 'CJNetworkQuality',
197
- 'Clarsentia',
198
- 'clips\.ua\.ac\.be',
199
- 'Cloud\ mapping',
200
- 'CloudEndure',
201
- 'CloudFlare-AlwaysOnline',
202
- 'Cloudinary\/[0-9]',
203
- 'cmcm\.com',
204
- 'coccoc',
205
- 'cognitiveseo',
206
- 'colly -',
207
- 'CommaFeed',
208
- 'Commons-HttpClient',
209
- 'Comodo SSL Checker',
210
- 'contactbigdatafr',
211
- 'convera',
212
- 'copyright sheriff',
213
- 'CopyRightCheck',
214
- 'Copyscape',
215
- 'Cosmos4j\.feedback',
216
- 'Covario-IDS',
217
- 'CrawlForMe\/[0-9]',
218
- 'Crescent',
219
- 'cron-job\.org',
220
- 'Crowsnest',
221
- 'CSHttp',
222
- 'curb',
223
- 'Curious George',
224
- 'curl',
225
- 'cuwhois\/[0-9]',
226
- 'cybo\.com',
227
- 'DareBoost',
228
- 'DatabaseDriverMysqli',
229
- 'DataCha0s',
230
- 'DataparkSearch',
231
- 'dataprovider',
232
- 'Daum(oa)?[ \/][0-9]',
233
- 'Demon',
234
- 'DeuSu',
235
- 'developers\.google\.com\/\+\/web\/snippet\/',
236
- 'Devil',
237
- 'Digg',
238
- 'Digincore',
239
- 'DigitalPebble',
240
- 'Dirbuster',
241
- 'Dispatch\/',
242
- 'DittoSpyder',
243
- 'dlvr',
244
- 'DMBrowser',
245
- 'DNS-Tools Header-Analyzer',
246
- 'DNSPod-reporting',
247
- 'docoloc',
248
- 'Dolphin http client\/',
249
- 'DomainAppender',
250
- 'Donuts Content Explorer',
251
- 'dotMailer content retrieval',
252
- 'dotSemantic',
253
- 'downforeveryoneorjustme',
254
- 'Download\ Wonder',
255
- 'downnotifier\.com',
256
- 'DowntimeDetector',
257
- 'Dragonfly File Reader',
258
- 'Drip',
259
- 'drupact',
260
- 'Drupal \(\+http:\/\/drupal\.org\/\)',
261
- 'DTS\ Agent',
262
- 'dubaiindex',
263
- 'EARTHCOM',
264
- 'Easy-Thumb',
265
- 'EasyDL',
266
- 'Ebingbong',
267
- 'ec2linkfinder',
268
- 'eCairn-Grabber',
269
- 'eCatch',
270
- 'ECCP',
271
- 'echocrawl',
272
- 'eContext\/',
273
- 'Ecxi',
274
- 'EirGrabber',
275
- 'ElectricMonk',
276
- 'elefent',
277
- 'EMail Exractor',
278
- 'Email%20Extractor%20Lite',
279
- 'EMail\ Wolf',
280
- 'EmailWolf',
281
- 'Embed PHP Library',
282
- 'Embedly',
283
- 'europarchive\.org',
284
- 'evc-batch',
285
- 'EventMachine HttpClient',
286
- 'Evidon',
287
- 'Evrinid',
288
- 'ExactSearch',
289
- 'ExaleadCloudview',
290
- 'Excel\/',
291
- 'Exif Viewer',
292
- 'ExperianCrawlUK',
293
- 'Exploratodo',
294
- 'Express WebPictures',
295
- 'ExtractorPro',
296
- 'Extreme\ Picture\ Finder',
297
- 'EyeNetIE',
298
- 'ezooms',
299
- 'facebookexternalhit',
300
- 'facebookplatform',
301
- 'fairshare',
302
- 'Faraday v',
303
- 'fasthttp',
304
- 'Faveeo',
305
- 'Favicon downloader',
306
- 'FavOrg',
307
- 'Feed Wrangler',
308
- 'Feedbin',
309
- 'FeedBooster',
310
- 'FeedBucket',
311
- 'FeedBunch\/[0-9]',
312
- 'FeedBurner',
313
- 'FeedChecker',
314
- 'Feedly',
315
- 'Feedspot',
316
- 'Feedwind\/[0-9]',
317
- 'feeltiptop',
318
- 'Fetch API',
319
- 'Fetch\/[0-9]',
320
- 'Fever\/[0-9]',
321
- 'FHscan',
322
- 'Fimap',
323
- 'findlink',
324
- 'findthatfile',
325
- 'FlashGet',
326
- 'FlipboardBrowserProxy',
327
- 'FlipboardProxy',
328
- 'FlipboardRSS',
329
- 'fluffy',
330
- 'Flunky',
331
- 'flynxapp',
332
- 'forensiq',
333
- 'FoundSeoTool\/[0-9]',
334
- 'free thumbnails',
335
- 'Freeuploader',
336
- 'FreeWebMonitoring SiteChecker',
337
- 'Funnelback',
338
- 'G-i-g-a-b-o-t',
339
- 'g00g1e\.net',
340
- 'GAChecker',
341
- 'ganarvisitas\/[0-9]',
342
- 'geek-tools',
343
- 'Genderanalyzer',
344
- 'Genieo',
345
- 'GentleSource',
346
- 'Getintent',
347
- 'GetLinkInfo',
348
- 'getprismatic\.com',
349
- 'GetRight',
350
- 'GetURLInfo\/[0-9]',
351
- 'GetWeb',
352
- 'Ghost Inspector',
353
- 'GigablastOpenSource',
354
- 'GIS-LABS',
355
- 'github-camo',
356
- 'github\.com\/',
357
- 'Go [\d\.]* package http',
358
- 'Go http package',
359
- 'Go!Zilla',
360
- 'Go-Ahead-Got-It',
361
- 'Go-http-client',
362
- 'gobyus',
363
- 'gofetch',
364
- 'GomezAgent',
365
- 'gooblog',
366
- 'Goodzer\/[0-9]',
367
- 'Google favicon',
368
- 'Google Keyword Suggestion',
369
- 'Google Keyword Tool',
370
- 'Google Page Speed Insights',
371
- 'Google PP Default',
372
- 'Google Search Console',
373
- 'Google Web Preview',
374
- 'Google-Adwords',
375
- 'Google-Apps-Script',
376
- 'Google-Calendar-Importer',
377
- 'Google-HotelAdsVerifier',
378
- 'Google-HTTP-Java-Client',
379
- 'Google-Publisher-Plugin',
380
- 'Google-SearchByImage',
381
- 'Google-Site-Verification',
382
- 'Google-Structured-Data-Testing-Tool',
383
- 'Google-Youtube-Links',
384
- 'google_partner_monitoring',
385
- 'GoogleDocs',
386
- 'GoogleHC\/',
387
- 'GoogleProducer',
388
- 'Gookey',
389
- 'GoScraper',
390
- 'GoSpotCheck',
391
- 'GoSquared-Status-Checker',
392
- 'gosquared-thumbnailer',
393
- 'Gotit',
394
- 'GoZilla',
395
- 'grabify',
396
- 'GrabNet',
397
- 'Grafula',
398
- 'Grammarly',
399
- 'GrapeFX',
400
- 'grokkit',
401
- 'grouphigh',
402
- 'grub-client',
403
- 'gSOAP\/',
404
- 'GT::WWW',
405
- 'GTmetrix',
406
- 'GuzzleHttp',
407
- 'gvfs\/',
408
- 'HAA(A)?RTLAND http client',
409
- 'Haansoft',
410
- 'hackney\/',
411
- 'Hatena',
412
- 'Havij',
413
- 'hawkReader',
414
- 'HEADMasterSEO',
415
- 'HeartRails_Capture',
416
- 'help@dataminr\.com',
417
- 'heritrix',
418
- 'historious\/',
419
- 'hledejLevne\.cz\/[0-9]',
420
- 'Hloader',
421
- 'HMView',
422
- 'Holmes',
423
- 'HonesoSearchEngine\/',
424
- 'HootSuite Image proxy',
425
- 'Hootsuite-WebFeed\/[0-9]',
426
- 'hosterstats',
427
- 'HostTracker',
428
- 'ht:\/\/check',
429
- 'htdig',
430
- 'HTMLparser',
431
- 'http-get',
432
- 'HTTP-Header-Abfrage',
433
- 'http-kit',
434
- 'http-request\/',
435
- 'HTTP-Tiny',
436
- 'HTTP::Lite',
437
- 'http\.rb\/',
438
- 'HTTP_Compression_Test',
439
- 'http_request2',
440
- 'http_requester',
441
- 'HttpComponents',
442
- 'httphr',
443
- 'HTTPMon',
444
- 'httpscheck',
445
- 'httpssites_power',
446
- 'httpunit',
447
- 'HttpUrlConnection',
448
- 'httrack',
449
- 'huaweisymantec',
450
- 'HubPages.*crawlingpolicy',
451
- 'HubSpot ',
452
- 'Humanlinks',
453
- 'HyperZbozi.cz Feeder',
454
- 'i2kconnect\/',
455
- 'Iblog',
456
- 'ichiro',
457
- 'Id-search',
458
- 'IdeelaborPlagiaat',
459
- 'IDG Twitter Links Resolver',
460
- 'IDwhois\/[0-9]',
461
- 'Iframely',
462
- 'igdeSpyder',
463
- 'IlTrovatore',
464
- 'Image\ Fetch',
465
- 'Image\ Sucker',
466
- 'ImageEngine\/',
467
- 'Imagga',
468
- 'imgsizer',
469
- 'InAGist',
470
- 'inbound\.li parser',
471
- 'InDesign%20CC',
472
- 'Indy\ Library',
473
- 'infegy',
474
- 'infohelfer',
475
- 'InfoTekies',
476
- 'InfoWizards Reciprocal Link System PRO',
477
- 'inpwrd\.com',
478
- 'instabid',
479
- 'Instapaper',
480
- 'Integrity',
481
- 'integromedb',
482
- 'Intelliseek',
483
- 'InterGET',
484
- 'Internet\ Ninja',
485
- 'internet_archive',
486
- 'InternetSeer',
487
- 'internetVista monitor',
488
- 'intraVnews',
489
- 'IODC',
490
- 'IOI',
491
- 'iplabel',
492
- 'ips-agent',
493
- 'IPS\/[0-9]',
494
- 'IPWorks HTTP\/S Component',
495
- 'iqdb\/',
496
- 'Iria',
497
- 'Irokez',
498
- 'isitup\.org',
499
- 'iskanie',
500
- 'iZSearch',
501
- 'janforman',
502
- 'Jaunt\/',
503
- 'Jbrofuzz',
504
- 'Jersey\/',
505
- 'JetCar',
506
- 'Jigsaw',
507
- 'Jobboerse',
508
- 'JobFeed discovery',
509
- 'Jobg8 URL Monitor',
510
- 'jobo',
511
- 'Jobrapido',
512
- 'Jobsearch1\.5',
513
- 'JoinVision Generic',
514
- 'Joomla',
515
- 'Jorgee',
516
- 'JS-Kit',
517
- 'JustView',
518
- 'Kaspersky Lab CFR link resolver',
519
- 'KeepRight OpenStreetMap Checker',
520
- 'Kelny\/',
521
- 'Kerrigan\/',
522
- 'KeyCDN',
523
- 'Keyword Extractor',
524
- 'Keyword\ Density',
525
- 'Keywords Research',
526
- 'KickFire',
527
- 'KimonoLabs\/',
528
- 'Kml-Google',
529
- 'knows\.is',
530
- 'KOCMOHABT',
531
- 'kouio',
532
- 'kulturarw3',
533
- 'KumKie',
534
- 'L\.webis',
535
- 'Larbin',
536
- 'Lavf\/',
537
- 'LayeredExtractor',
538
- 'LeechFTP',
539
- 'LeechGet',
540
- 'letsencrypt',
541
- 'Lftp',
542
- 'LibVLC',
543
- 'LibWeb',
544
- 'Libwhisker',
545
- 'libwww',
546
- 'Licorne Image Snapshot',
547
- 'Liferea\/',
548
- 'Lightspeedsystems',
549
- 'Likse',
550
- 'link checker',
551
- 'Link Valet',
552
- 'link_thumbnailer',
553
- 'LinkAlarm\/',
554
- 'linkCheck',
555
- 'linkdex',
556
- 'LinkExaminer',
557
- 'linkfluence',
558
- 'linkpeek',
559
- 'LinkPreviewGenerator',
560
- 'LinkScan',
561
- 'LinksManager',
562
- 'LinkTiger',
563
- 'LinkWalker',
564
- 'Lipperhey',
565
- 'Litemage_walker',
566
- 'livedoor ScreenShot',
567
- 'LoadImpactRload',
568
- 'LongURL API',
569
- 'looksystems\.net',
570
- 'ltx71',
571
- 'lua-resty-http',
572
- 'lwp-request',
573
- 'lwp-trivial',
574
- 'LWP::Simple',
575
- 'lycos',
576
- 'LYT\.SR',
577
- 'mabontland',
578
- 'Mag-Net',
579
- 'MagpieRSS',
580
- 'Mail.Ru',
581
- 'MailChimp',
582
- 'Majestic12',
583
- 'makecontact\/',
584
- 'Mandrill',
585
- 'MapperCmd',
586
- 'marketinggrader',
587
- 'MarkMonitor',
588
- 'MarkWatch',
589
- 'Mass\ Downloader',
590
- 'masscan\/[0-9]',
591
- 'Mata\ Hari',
592
- 'Mediapartners-Google',
593
- 'mediawords',
594
- 'MegaIndex\.ru',
595
- 'Melvil Rawi\/',
596
- 'MergeFlow-PageReader',
597
- 'Metaspinner',
598
- 'MetaURI',
599
- 'MFC_Tear_Sample',
600
- 'Microsearch',
601
- 'Microsoft Office ',
602
- 'Microsoft Windows Network Diagnostics',
603
- 'Microsoft-WebDAV-MiniRedir',
604
- 'Microsoft\ Data\ Access',
605
- 'MIDown\ tool',
606
- 'MIIxpc',
607
- 'Mindjet',
608
- 'Miniature.io\/',
609
- 'Miniflux',
610
- 'Mister\ PiX',
611
- 'mixdata dot com',
612
- 'mixed-content-scan',
613
- 'mixnode',
614
- 'Mnogosearch',
615
- 'mogimogi',
616
- 'Mojeek',
617
- 'Mojolicious \(Perl\)',
618
- 'monitis',
619
- 'Monitority\/[0-9]',
620
- 'montastic',
621
- 'MonTools',
622
- 'Moreover',
623
- 'Morfeus\ Fucking\ Scanner',
624
- 'Morning Paper',
625
- 'MovableType',
626
- 'mowser',
627
- 'Mrcgiguy',
628
- 'MS\ Web\ Services\ Client\ Protocol',
629
- 'MSFrontPage',
630
- 'mShots',
631
- 'MuckRack\/',
632
- 'muhstik-scan',
633
- 'MVAClient',
634
- 'MxToolbox\/',
635
- 'nagios',
636
- 'Najdi\.si\/',
637
- 'Name\ Intelligence',
638
- 'Nameprotect',
639
- 'Navroad',
640
- 'NearSite',
641
- 'Needle',
642
- 'Nessus',
643
- 'Net\ Vampire',
644
- 'NetAnts',
645
- 'NETCRAFT',
646
- 'NetLyzer',
647
- 'NetMechanic',
648
- 'Netpursual',
649
- 'netresearch',
650
- 'NetShelter ContentScan',
651
- 'Netsparker',
652
- 'NetTrack',
653
- 'Netvibes',
654
- 'NetZIP',
655
- 'Neustar WPM',
656
- 'NeutrinoAPI',
657
- 'NewRelicPinger\/1.0 \(\d+\)',
658
- 'NewsBlur .*Finder',
659
- 'NewsGator',
660
- 'newsme',
661
- 'newspaper\/',
662
- 'Nexgate Ruby Client',
663
- 'NG-Search',
664
- 'Nibbler',
665
- 'NICErsPRO',
666
- 'Nikto',
667
- 'nineconnections\.com',
668
- 'NLNZ_IAHarvester',
669
- 'Nmap Scripting Engine',
670
- 'node-superagent',
671
- 'node-urllib\/',
672
- 'node\.io',
673
- 'nominet\.org\.uk',
674
- 'Norton-Safeweb',
675
- 'Notifixious',
676
- 'notifyninja',
677
- 'nuhk',
678
- 'nutch',
679
- 'Nuzzel',
680
- 'nWormFeedFinder',
681
- 'Nymesis',
682
- 'NYU',
683
- 'Ocelli\/[0-9]',
684
- 'Octopus',
685
- 'oegp',
686
- 'Offline Explorer',
687
- 'Offline\ Navigator',
688
- 'okhttp',
689
- 'Omea Reader',
690
- 'omgili',
691
- 'OMSC',
692
- 'Online Domain Tools',
693
- 'OpenCalaisSemanticProxy',
694
- 'Openfind',
695
- 'OpenLinkProfiler',
696
- 'Openstat\/',
697
- 'OpenVAS',
698
- 'Optimizer',
699
- 'Orbiter',
700
- 'OrgProbe\/[0-9]',
701
- 'orion-semantics',
702
- 'ow\.ly',
703
- 'Owler',
704
- 'ownCloud News',
705
- 'OxfordCloudService\/[0-9]',
706
- 'Page Analyzer',
707
- 'Page Valet',
708
- 'page2rss',
709
- 'page\ scorer',
710
- 'page_verifier',
711
- 'PageAnalyzer',
712
- 'PageGrabber',
713
- 'PagePeeker',
714
- 'PageScorer',
715
- 'Pagespeed\/[0-9]',
716
- 'Panopta',
717
- 'panscient',
718
- 'Papa\ Foto',
719
- 'parsijoo',
720
- 'Pavuk',
721
- 'PayPal IPN',
722
- 'pcBrowser',
723
- 'Pcore-HTTP',
724
- 'PEAR HTTPRequest',
725
- 'Pearltrees',
726
- 'PECL::HTTP',
727
- 'peerindex',
728
- 'Peew',
729
- 'PeoplePal',
730
- 'Perlu -',
731
- 'PhantomJS Screenshoter',
732
- 'PhantomJS\/',
733
- 'Photon\/',
734
- 'phpcrawl',
735
- 'phpservermon',
736
- 'Pi-Monster',
737
- 'Picscout',
738
- 'Picsearch',
739
- 'PictureFinder',
740
- 'Pimonster',
741
- 'ping\.blo\.gs\/',
742
- 'Pingability',
743
- 'Pingdom',
744
- 'Pingoscope',
745
- 'PingSpot',
746
- 'pinterest\.com',
747
- 'Pixray',
748
- 'Pizilla',
749
- 'PleaseCrawl',
750
- 'Ploetz \+ Zeller',
751
- 'Plukkie',
752
- 'plumanalytics',
753
- 'PocketParser',
754
- 'Pockey',
755
- 'POE-Component-Client-HTTP',
756
- 'Pompos',
757
- 'Porkbun',
758
- 'Port Monitor',
759
- 'postano',
760
- 'PostmanRuntime\/',
761
- 'PostPost',
762
- 'postrank',
763
- 'PowerPoint\/',
764
- 'Priceonomics Analysis Engine',
765
- 'PrintFriendly\.com',
766
- 'PritTorrent\/[0-9]',
767
- 'Prlog',
768
- 'probethenet',
769
- 'Project 25499',
770
- 'Promotion_Tools_www.searchenginepromotionhelp.com',
771
- 'prospectb2b',
772
- 'Protopage',
773
- 'ProWebWalker',
774
- 'proximic',
775
- 'PRTG Network Monitor',
776
- 'pshtt, https scanning',
777
- 'PTST ',
778
- 'PTST\/[0-9]+',
779
- 'Pulsepoint XT3 web scraper',
780
- 'Pump',
781
- 'Python-httplib2',
782
- 'python-requests',
783
- 'Python-urllib',
784
- 'Qirina Hurdler',
785
- 'QQDownload',
786
- 'QrafterPro',
787
- 'Qseero',
788
- 'Qualidator.com SiteAnalyzer',
789
- 'QueryN\ Metasearch',
790
- 'Quora Link Preview',
791
- 'Qwantify',
792
- 'Radian6',
793
- 'RankActive',
794
- 'RankFlex',
795
- 'RankSonicSiteAuditor',
796
- 'Readability',
797
- 'RealDownload',
798
- 'RealPlayer%20Downloader',
799
- 'RebelMouse',
800
- 'Recorder',
801
- 'RecurPost\/',
802
- 'redback\/',
803
- 'Redirect Checker Tool',
804
- 'ReederForMac',
805
- 'ReGet',
806
- 'RepoMonkey',
807
- 'request\.js',
808
- 'ResponseCodeTest\/[0-9]',
809
- 'RestSharp',
810
- 'Riddler',
811
- 'Rival IQ',
812
- 'Robosourcer',
813
- 'Robozilla\/[0-9]',
814
- 'ROI Hunter',
815
- 'RPT-HTTPClient',
816
- 'RSSOwl',
817
- 'safe-agent-scanner',
818
- 'SalesIntelligent',
819
- 'Saleslift',
820
- 'SauceNAO',
821
- 'SBIder',
822
- 'scalaj-http',
823
- 'scan\.lol',
824
- 'ScanAlert',
825
- 'Scoop',
826
- 'scooter',
827
- 'ScoutJet',
828
- 'ScoutURLMonitor',
829
- 'Scrapy',
830
- 'Screaming',
831
- 'ScreenShotService\/[0-9]',
832
- 'Scrubby',
833
- 'Search37\/',
834
- 'search\.thunderstone',
835
- 'Searchestate',
836
- 'SearchSight',
837
- 'Seeker',
838
- 'semanticdiscovery',
839
- 'semanticjuice',
840
- 'Semiocast HTTP client',
841
- 'Semrush',
842
- 'sentry\/',
843
- 'SEO Browser',
844
- 'Seo Servis',
845
- 'seo-nastroj.cz',
846
- 'Seobility',
847
- 'SEOCentro',
848
- 'SeoCheck',
849
- 'SEOkicks',
850
- 'Seomoz',
851
- 'SEOprofiler',
852
- 'SeopultContentAnalyzer',
853
- 'seoscanners',
854
- 'SEOstats',
855
- 'Server Density Service Monitoring',
856
- 'servernfo\.com',
857
- 'SetCronJob\/',
858
- 'sexsearcher',
859
- 'Seznam',
860
- 'Shelob',
861
- 'Shodan',
862
- 'Shoppimon Analyzer',
863
- 'ShoppimonAgent\/[0-9]',
864
- 'ShopWiki',
865
- 'ShortLinkTranslate',
866
- 'shrinktheweb',
867
- 'Sideqik',
868
- 'SilverReader',
869
- 'SimplePie',
870
- 'SimplyFast',
871
- 'Siphon',
872
- 'SISTRIX',
873
- 'Site-Shot\/',
874
- 'Site24x7',
875
- 'Site\ Sucker',
876
- 'SiteBar',
877
- 'Sitebeam',
878
- 'Sitebulb\/',
879
- 'SiteCondor',
880
- 'SiteExplorer',
881
- 'SiteGuardian',
882
- 'Siteimprove',
883
- 'SiteIndexed',
884
- 'Sitemap(s)? Generator',
885
- 'SiteMonitor',
886
- 'Siteshooter B0t',
887
- 'SiteSnagger',
888
- 'SiteSucker',
889
- 'SiteTruth',
890
- 'Sitevigil',
891
- 'sitexy\.com',
892
- 'SkypeUriPreview',
893
- 'Slack\/',
894
- 'slider\.com',
895
- 'slurp',
896
- 'SlySearch',
897
- 'SmartDownload',
898
- 'SMRF URL Expander',
899
- 'SMUrlExpander',
900
- 'Snake',
901
- 'Snappy',
902
- 'SniffRSS',
903
- 'sniptracker',
904
- 'Snoopy',
905
- 'SnowHaze Search',
906
- 'sogou web',
907
- 'SortSite',
908
- 'Sottopop',
909
- 'sovereign\.ai',
910
- 'SpaceBison',
911
- 'Spammen',
912
- 'Spanner',
913
- 'spaziodati',
914
- 'Specificfeeds',
915
- 'speedy',
916
- 'SPEng',
917
- 'Spinn3r',
918
- 'spray-can',
919
- 'Sprinklr ',
920
- 'spyonweb',
921
- 'sqlmap',
922
- 'Sqlworm',
923
- 'Sqworm',
924
- 'SSL Labs',
925
- 'ssl-tools',
926
- 'StackRambler',
927
- 'Statastico\/',
928
- 'StatusCake',
929
- 'Steeler',
930
- 'Stratagems Kumo',
931
- 'Stroke.cz',
932
- 'StudioFACA',
933
- 'suchen',
934
- 'Sucuri',
935
- 'summify',
936
- 'Super Monitoring',
937
- 'SuperHTTP',
938
- 'Surphace Scout',
939
- 'Suzuran',
940
- 'SwiteScraper',
941
- 'Symfony BrowserKit',
942
- 'Symfony2 BrowserKit',
943
- 'SynHttpClient-Built',
944
- 'Sysomos',
945
- 'sysscan',
946
- 'Szukacz',
947
- 'T0PHackTeam',
948
- 'tAkeOut',
949
- 'Tarantula\/',
950
- 'Taringa UGC',
951
- 'Teleport',
952
- 'Telesoft',
953
- 'Telesphoreo',
954
- 'Telesphorep',
955
- 'Tenon\.io',
956
- 'teoma',
957
- 'terrainformatica\.com',
958
- 'Test Certificate Info',
959
- 'Tetrahedron\/[0-9]',
960
- 'The Drop Reaper',
961
- 'The Expert HTML Source Viewer',
962
- 'The\ Intraformant',
963
- 'theinternetrules',
964
- 'TheNomad',
965
- 'theoldreader\.com',
966
- 'Thinklab',
967
- 'Thumbshots',
968
- 'ThumbSniper',
969
- 'TinEye',
970
- 'Tiny Tiny RSS',
971
- 'TLSProbe\/',
972
- 'Toata',
973
- 'topster',
974
- 'touche.com',
975
- 'Traackr.com',
976
- 'TrapitAgent',
977
- 'Trendiction',
978
- 'Trendsmap Resolver',
979
- 'trendspottr\.com',
980
- 'truwoGPS',
981
- 'TulipChain',
982
- 'Turingos',
983
- 'Turnitin',
984
- 'tweetedtimes\.com',
985
- 'Tweetminster',
986
- 'Tweezler\/',
987
- 'Twice',
988
- 'Twikle',
989
- 'Twingly',
990
- 'Twisted PageGetter',
991
- 'Typhoeus',
992
- 'ubermetrics-technologies',
993
- 'uclassify',
994
- 'uCrawlr\/',
995
- 'UdmSearch',
996
- 'UniversalFeedParser',
997
- 'Unshorten\.It\!\/[0-9]',
998
- 'Untiny',
999
- 'UnwindFetchor',
1000
- 'updated',
1001
- 'updown\.io daemon',
1002
- 'Upflow',
1003
- 'Uptimia',
1004
- 'URL Verifier',
1005
- 'URLChecker',
1006
- 'URLitor.com',
1007
- 'urlresolver',
1008
- 'Urlstat',
1009
- 'UrlTrends Ranking Updater',
1010
- 'URLy\ Warning',
1011
- 'URLy\.Warning',
1012
- 'Vacuum',
1013
- 'Vagabondo',
1014
- 'VB\ Project',
1015
- 'vBSEO',
1016
- 'VCI',
1017
- 'via ggpht\.com GoogleImageProxy',
1018
- 'VidibleScraper',
1019
- 'Virusdie',
1020
- 'visionutils',
1021
- 'vkShare',
1022
- 'VoidEYE',
1023
- 'Voil',
1024
- 'voltron',
1025
- 'voyager\/',
1026
- 'VSAgent\/[0-9]',
1027
- 'VSB-TUO\/[0-9]',
1028
- 'Vulnbusters Meter',
1029
- 'VYU2',
1030
- 'w3af\.org',
1031
- 'W3C-checklink',
1032
- 'W3C-mobileOK',
1033
- 'W3C_I18n-Checker',
1034
- 'W3C_Unicorn',
1035
- 'Wallpapers\/[0-9]+',
1036
- 'WallpapersHD',
1037
- 'wangling',
1038
- 'Wappalyzer',
1039
- 'WatchMouse',
1040
- 'WbSrch\/',
1041
- 'web-capture\.net',
1042
- 'Web-Monitoring',
1043
- 'Web-sniffer',
1044
- 'Web\ Auto',
1045
- 'Web\ Collage',
1046
- 'Web\ Enhancer',
1047
- 'Web\ Fetch',
1048
- 'Web\ Fuck',
1049
- 'Web\ Pix',
1050
- 'Web\ Sauger',
1051
- 'Web\ Sucker',
1052
- 'Webalta',
1053
- 'Webauskunft',
1054
- 'WebAuto',
1055
- 'WebCapture',
1056
- 'WebClient\/',
1057
- 'webcollage',
1058
- 'WebCookies',
1059
- 'WebCopier',
1060
- 'WebCorp',
1061
- 'WebDoc',
1062
- 'WebEnhancer',
1063
- 'WebFetch',
1064
- 'WebFuck',
1065
- 'WebGo\ IS',
1066
- 'WebImageCollector',
1067
- 'WebImages',
1068
- 'WebIndex',
1069
- 'webkit2png',
1070
- 'WebLeacher',
1071
- 'webmastercoffee',
1072
- 'webmon ',
1073
- 'WebPix',
1074
- 'WebReaper',
1075
- 'WebSauger',
1076
- 'webscreenie',
1077
- 'Webshag',
1078
- 'Webshot',
1079
- 'Website Analyzer\/',
1080
- 'Website\ Quester',
1081
- 'WebsiteExtractor',
1082
- 'websitepulse agent',
1083
- 'websitepulse[+ ]checker',
1084
- 'WebsiteQuester',
1085
- 'Websnapr\/',
1086
- 'Webster',
1087
- 'WebStripper',
1088
- 'WebSucker',
1089
- 'Webthumb\/[0-9]',
1090
- 'WebThumbnail',
1091
- 'WebWhacker',
1092
- 'WebZIP',
1093
- 'WeCrawlForThePeace',
1094
- 'WeLikeLinks',
1095
- 'WEPA',
1096
- 'WeSEE',
1097
- 'wf84',
1098
- 'wget',
1099
- 'WhatsApp',
1100
- 'WhatsMyIP',
1101
- 'WhatWeb',
1102
- 'WhereGoes\?',
1103
- 'Whibse',
1104
- 'WhoRunsCoinHive',
1105
- 'Whynder Magnet',
1106
- 'Windows-RSS-Platform',
1107
- 'WinHttpRequest',
1108
- 'wkhtmlto',
1109
- 'wmtips',
1110
- 'Woko',
1111
- 'Word\/',
1112
- 'WordPress\/',
1113
- 'wotbox',
1114
- 'WP Engine Install Performance API',
1115
- 'wpif',
1116
- 'wprecon\.com survey',
1117
- 'WPScan',
1118
- 'wscheck',
1119
- 'Wtrace',
1120
- 'WWW-Collector-E',
1121
- 'WWW-Mechanize',
1122
- 'WWW::Mechanize',
1123
- 'www\.monitor\.us',
1124
- 'WWWOFFLE',
1125
- 'x09Mozilla',
1126
- 'x22Mozilla',
1127
- 'XaxisSemanticsClassifier',
1128
- 'Xenu Link Sleuth',
1129
- 'XING-contenttabreceiver\/[0-9]',
1130
- 'XmlSitemapGenerator',
1131
- 'xpymep([0-9]?)\.exe',
1132
- 'Y!J-(ASR|BSC)',
1133
- 'Yaanb',
1134
- 'yacy',
1135
- 'Yahoo Ad monitoring',
1136
- 'Yahoo Link Preview',
1137
- 'YahooCacheSystem',
1138
- 'YahooYSMcm',
1139
- 'YandeG',
1140
- 'Yandex(?!Search)',
1141
- 'yanga',
1142
- 'yeti',
1143
- 'Yo-yo',
1144
- 'Yoleo Consumer',
1145
- 'yoogliFetchAgent',
1146
- 'YottaaMonitor',
1147
- 'Your-Website-Sucks\/[0-9]',
1148
- 'yourls\.org',
1149
- 'Zade',
1150
- 'Zao',
1151
- 'Zauba',
1152
- 'Zemanta Aggregator',
1153
- 'Zend\\\\Http\\\\Client',
1154
- 'Zend_Http_Client',
1155
- 'Zermelo',
1156
- 'Zeus',
1157
- 'zgrab',
1158
- 'ZnajdzFoto',
1159
- 'ZyBorg',
1160
- '[a-z0-9\-_]*(bot|crawler|archiver|transcoder|spider|uptime|validator|fetcher)',
1161
- );
1162
- }
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of Crawler Detect - the web crawler detection library.
5
+ *
6
+ * (c) Mark Beech <m@rkbee.ch>
7
+ *
8
+ * This source file is subject to the MIT license that is bundled
9
+ * with this source code in the file LICENSE.
10
+ */
11
+
12
+ namespace Jaybizzle\CrawlerDetect\Fixtures;
13
+
14
+ class Crawlers extends AbstractProvider
15
+ {
16
+ /**
17
+ * Array of regular expressions to match against the user agent.
18
+ *
19
+ * @var array
20
+ */
21
+ protected $data = array(
22
+ '.*Java.*outbrain',
23
+ ' YLT',
24
+ '008\/',
25
+ '192\.comAgent',
26
+ '2ip\.ru',
27
+ '404checker',
28
+ '404enemy',
29
+ '80legs',
30
+ '^b0t$',
31
+ '^bluefish ',
32
+ '^Calypso v\/',
33
+ '^COMODO DCV',
34
+ '^DangDang',
35
+ '^DavClnt',
36
+ '^FDM ',
37
+ '^git\/',
38
+ '^Goose\/',
39
+ '^Grabber',
40
+ '^HTTPClient\/',
41
+ '^Java\/',
42
+ '^Jeode\/',
43
+ '^Jetty\/',
44
+ '^Mget',
45
+ '^Microsoft URL Control',
46
+ '^NG\/[0-9\.]',
47
+ '^NING\/',
48
+ '^PHP\/[0-9]',
49
+ '^RMA\/',
50
+ '^Ruby|Ruby\/[0-9]',
51
+ '^scrutiny\/',
52
+ '^VSE\/[0-9]',
53
+ '^WordPress\.com',
54
+ '^XRL\/[0-9]',
55
+ '^ZmEu',
56
+ 'a3logics\.in',
57
+ 'A6-Indexer',
58
+ 'a\.pr-cy\.ru',
59
+ 'Abonti',
60
+ 'Aboundex',
61
+ 'aboutthedomain',
62
+ 'Accoona-AI-Agent',
63
+ 'acoon',
64
+ 'acrylicapps\.com\/pulp',
65
+ 'Acunetix',
66
+ 'adbeat',
67
+ 'AddThis',
68
+ 'ADmantX',
69
+ 'adressendeutschland',
70
+ 'adscanner\/',
71
+ 'Advanced Email Extractor v',
72
+ 'agentslug',
73
+ 'AHC',
74
+ 'aihit',
75
+ 'aiohttp\/',
76
+ 'Airmail',
77
+ 'akka-http\/',
78
+ 'akula\/',
79
+ 'alertra',
80
+ 'alexa site audit',
81
+ 'Alibaba\.Security\.Heimdall',
82
+ 'Alligator',
83
+ 'allloadin\.com',
84
+ 'AllSubmitter',
85
+ 'alyze\.info',
86
+ 'amagit',
87
+ 'Anarchie',
88
+ 'AndroidDownloadManager',
89
+ 'Anemone',
90
+ 'AngleSharp\/',
91
+ 'Ant\.com',
92
+ 'Anturis Agent',
93
+ 'AnyEvent-HTTP\/',
94
+ 'Apache Droid',
95
+ 'Apache-HttpAsyncClient\/',
96
+ 'Apache-HttpClient\/',
97
+ 'ApacheBench\/',
98
+ 'Apexoo',
99
+ 'APIs-Google',
100
+ 'AportWorm\/[0-9]',
101
+ 'AppBeat\/[0-9]',
102
+ 'AppEngine-Google',
103
+ 'Arachmo',
104
+ 'arachnode',
105
+ 'Arachnophilia',
106
+ 'aria2',
107
+ 'asafaweb.com',
108
+ 'AskQuickly',
109
+ 'ASPSeek',
110
+ 'Asterias',
111
+ 'Astute',
112
+ 'asynchttp',
113
+ 'Attach',
114
+ 'autocite',
115
+ 'Autonomy',
116
+ 'axios\/',
117
+ 'B-l-i-t-z-B-O-T',
118
+ 'Backlink-Ceck',
119
+ 'backlink-check',
120
+ 'BackStreet',
121
+ 'BackWeb',
122
+ 'Bad-Neighborhood',
123
+ 'Badass',
124
+ 'baidu\.com',
125
+ 'Bandit',
126
+ 'BatchFTP',
127
+ 'Battleztar\ Bazinga',
128
+ 'baypup\/[0-9]',
129
+ 'baypup\/colbert',
130
+ 'BazQux',
131
+ 'BBBike',
132
+ 'BCKLINKS',
133
+ 'BDFetch',
134
+ 'BegunAdvertising\/',
135
+ 'BigBozz',
136
+ 'Bigfoot',
137
+ 'biglotron',
138
+ 'BingLocalSearch',
139
+ 'BingPreview',
140
+ 'binlar',
141
+ 'biNu image cacher',
142
+ 'Bitacle',
143
+ 'biz_Directory',
144
+ 'Black\ Hole',
145
+ 'Blackboard Safeassign',
146
+ 'BlackWidow',
147
+ 'Bloglovin',
148
+ 'BlogPulseLive',
149
+ 'BlogSearch',
150
+ 'Blogtrottr',
151
+ 'BlowFish',
152
+ 'Boardreader',
153
+ 'boitho\.com-dc',
154
+ 'BPImageWalker',
155
+ 'Braintree-Webhooks',
156
+ 'Branch Metrics API',
157
+ 'Branch-Passthrough',
158
+ 'Brandprotect',
159
+ 'Brandwatch',
160
+ 'Brodie\/',
161
+ 'Browsershots',
162
+ 'BUbiNG',
163
+ 'Buck\/',
164
+ 'Buddy',
165
+ 'BuiltWith',
166
+ 'Bullseye',
167
+ 'BunnySlippers',
168
+ 'Burf Search',
169
+ 'Butterfly\/',
170
+ 'BuzzSumo',
171
+ 'CAAM\/[0-9]',
172
+ 'CakePHP',
173
+ 'Calculon',
174
+ 'CapsuleChecker',
175
+ 'CaretNail',
176
+ 'catexplorador',
177
+ 'cb crawl',
178
+ 'CC Metadata Scaper',
179
+ 'Cegbfeieh',
180
+ 'Cerberian Drtrs',
181
+ 'CERT\.at-Statistics-Survey',
182
+ 'cg-eye',
183
+ 'changedetection',
184
+ 'ChangesMeter\/',
185
+ 'Charlotte',
186
+ 'CheckHost',
187
+ 'checkprivacy',
188
+ 'CherryPicker',
189
+ 'ChinaClaw',
190
+ 'Chirp\/[0-9]',
191
+ 'chkme\.com',
192
+ 'Chlooe',
193
+ 'CirrusExplorer\/',
194
+ 'CISPA Vulnerability Notification',
195
+ 'Citoid',
196
+ 'CJNetworkQuality',
197
+ 'Clarsentia',
198
+ 'clips\.ua\.ac\.be',
199
+ 'Cloud\ mapping',
200
+ 'CloudEndure',
201
+ 'CloudFlare-AlwaysOnline',
202
+ 'Cloudinary\/[0-9]',
203
+ 'cmcm\.com',
204
+ 'coccoc',
205
+ 'cognitiveseo',
206
+ 'colly -',
207
+ 'CommaFeed',
208
+ 'Commons-HttpClient',
209
+ 'Comodo SSL Checker',
210
+ 'contactbigdatafr',
211
+ 'convera',
212
+ 'copyright sheriff',
213
+ 'CopyRightCheck',
214
+ 'Copyscape',
215
+ 'Cosmos4j\.feedback',
216
+ 'Covario-IDS',
217
+ 'CrawlForMe\/[0-9]',
218
+ 'Crescent',
219
+ 'cron-job\.org',
220
+ 'Crowsnest',
221
+ 'CSHttp',
222
+ 'curb',
223
+ 'Curious George',
224
+ 'curl',
225
+ 'cuwhois\/[0-9]',
226
+ 'cybo\.com',
227
+ 'DareBoost',
228
+ 'DatabaseDriverMysqli',
229
+ 'DataCha0s',
230
+ 'DataparkSearch',
231
+ 'dataprovider',
232
+ 'Daum(oa)?[ \/][0-9]',
233
+ 'Demon',
234
+ 'DeuSu',
235
+ 'developers\.google\.com\/\+\/web\/snippet\/',
236
+ 'Devil',
237
+ 'Digg',
238
+ 'Digincore',
239
+ 'DigitalPebble',
240
+ 'Dirbuster',
241
+ 'Dispatch\/',
242
+ 'DittoSpyder',
243
+ 'dlvr',
244
+ 'DMBrowser',
245
+ 'DNS-Tools Header-Analyzer',
246
+ 'DNSPod-reporting',
247
+ 'docoloc',
248
+ 'Dolphin http client\/',
249
+ 'DomainAppender',
250
+ 'Donuts Content Explorer',
251
+ 'dotMailer content retrieval',
252
+ 'dotSemantic',
253
+ 'downforeveryoneorjustme',
254
+ 'Download\ Wonder',
255
+ 'downnotifier\.com',
256
+ 'DowntimeDetector',
257
+ 'Dragonfly File Reader',
258
+ 'Drip',
259
+ 'drupact',
260
+ 'Drupal \(\+http:\/\/drupal\.org\/\)',
261
+ 'DTS\ Agent',
262
+ 'dubaiindex',
263
+ 'EARTHCOM',
264
+ 'Easy-Thumb',
265
+ 'EasyDL',
266
+ 'Ebingbong',
267
+ 'ec2linkfinder',
268
+ 'eCairn-Grabber',
269
+ 'eCatch',
270
+ 'ECCP',
271
+ 'echocrawl',
272
+ 'eContext\/',
273
+ 'Ecxi',
274
+ 'EirGrabber',
275
+ 'ElectricMonk',
276
+ 'elefent',
277
+ 'EMail Exractor',
278
+ 'Email%20Extractor%20Lite',
279
+ 'EMail\ Wolf',
280
+ 'EmailWolf',
281
+ 'Embed PHP Library',
282
+ 'Embedly',
283
+ 'europarchive\.org',
284
+ 'evc-batch',
285
+ 'EventMachine HttpClient',
286
+ 'Evidon',
287
+ 'Evrinid',
288
+ 'ExactSearch',
289
+ 'ExaleadCloudview',
290
+ 'Excel\/',
291
+ 'Exif Viewer',
292
+ 'ExperianCrawlUK',
293
+ 'Exploratodo',
294
+ 'Express WebPictures',
295
+ 'ExtractorPro',
296
+ 'Extreme\ Picture\ Finder',
297
+ 'EyeNetIE',
298
+ 'ezooms',
299
+ 'facebookexternalhit',
300
+ 'facebookplatform',
301
+ 'fairshare',
302
+ 'Faraday v',
303
+ 'fasthttp',
304
+ 'Faveeo',
305
+ 'Favicon downloader',
306
+ 'FavOrg',
307
+ 'Feed Wrangler',
308
+ 'Feedbin',
309
+ 'FeedBooster',
310
+ 'FeedBucket',
311
+ 'FeedBunch\/[0-9]',
312
+ 'FeedBurner',
313
+ 'FeedChecker',
314
+ 'Feedly',
315
+ 'Feedspot',
316
+ 'Feedwind\/[0-9]',
317
+ 'feeltiptop',
318
+ 'Fetch API',
319
+ 'Fetch\/[0-9]',
320
+ 'Fever\/[0-9]',
321
+ 'FHscan',
322
+ 'Fimap',
323
+ 'findlink',
324
+ 'findthatfile',
325
+ 'FlashGet',
326
+ 'FlipboardBrowserProxy',
327
+ 'FlipboardProxy',
328
+ 'FlipboardRSS',
329
+ 'fluffy',
330
+ 'Flunky',
331
+ 'flynxapp',
332
+ 'forensiq',
333
+ 'FoundSeoTool\/[0-9]',
334
+ 'free thumbnails',
335
+ 'Freeuploader',
336
+ 'FreeWebMonitoring SiteChecker',
337
+ 'Funnelback',
338
+ 'G-i-g-a-b-o-t',
339
+ 'g00g1e\.net',
340
+ 'GAChecker',
341
+ 'ganarvisitas\/[0-9]',
342
+ 'geek-tools',
343
+ 'Genderanalyzer',
344
+ 'Genieo',
345
+ 'GentleSource',
346
+ 'Getintent',
347
+ 'GetLinkInfo',
348
+ 'getprismatic\.com',
349
+ 'GetRight',
350
+ 'GetURLInfo\/[0-9]',
351
+ 'GetWeb',
352
+ 'Ghost Inspector',
353
+ 'GigablastOpenSource',
354
+ 'GIS-LABS',
355
+ 'github-camo',
356
+ 'github\.com\/',
357
+ 'Go [\d\.]* package http',
358
+ 'Go http package',
359
+ 'Go!Zilla',
360
+ 'Go-Ahead-Got-It',
361
+ 'Go-http-client',
362
+ 'gobyus',
363
+ 'gofetch',
364
+ 'GomezAgent',
365
+ 'gooblog',
366
+ 'Goodzer\/[0-9]',
367
+ 'Google favicon',
368
+ 'Google Keyword Suggestion',
369
+ 'Google Keyword Tool',
370
+ 'Google Page Speed Insights',
371
+ 'Google PP Default',
372
+ 'Google Search Console',
373
+ 'Google Web Preview',
374
+ 'Google-Adwords',
375
+ 'Google-Apps-Script',
376
+ 'Google-Calendar-Importer',
377
+ 'Google-HotelAdsVerifier',
378
+ 'Google-HTTP-Java-Client',
379
+ 'Google-Publisher-Plugin',
380
+ 'Google-SearchByImage',
381
+ 'Google-Site-Verification',
382
+ 'Google-Structured-Data-Testing-Tool',
383
+ 'Google-Youtube-Links',
384
+ 'google_partner_monitoring',
385
+ 'GoogleDocs',
386
+ 'GoogleHC\/',
387
+ 'GoogleProducer',
388
+ 'Gookey',
389
+ 'GoScraper',
390
+ 'GoSpotCheck',
391
+ 'GoSquared-Status-Checker',
392
+ 'gosquared-thumbnailer',
393
+ 'Gotit',
394
+ 'GoZilla',
395
+ 'grabify',
396
+ 'GrabNet',
397
+ 'Grafula',
398
+ 'Grammarly',
399
+ 'GrapeFX',
400
+ 'grokkit',
401
+ 'grouphigh',
402
+ 'grub-client',
403
+ 'gSOAP\/',
404
+ 'GT::WWW',
405
+ 'GTmetrix',
406
+ 'GuzzleHttp',
407
+ 'gvfs\/',
408
+ 'HAA(A)?RTLAND http client',
409
+ 'Haansoft',
410
+ 'hackney\/',
411
+ 'Hatena',
412
+ 'Havij',
413
+ 'hawkReader',
414
+ 'HEADMasterSEO',
415
+ 'HeartRails_Capture',
416
+ 'help@dataminr\.com',
417
+ 'heritrix',
418
+ 'historious\/',
419
+ 'hledejLevne\.cz\/[0-9]',
420
+ 'Hloader',
421
+ 'HMView',
422
+ 'Holmes',
423
+ 'HonesoSearchEngine\/',
424
+ 'HootSuite Image proxy',
425
+ 'Hootsuite-WebFeed\/[0-9]',
426
+ 'hosterstats',
427
+ 'HostTracker',
428
+ 'ht:\/\/check',
429
+ 'htdig',
430
+ 'HTMLparser',
431
+ 'http-get',
432
+ 'HTTP-Header-Abfrage',
433
+ 'http-kit',
434
+ 'http-request\/',
435
+ 'HTTP-Tiny',
436
+ 'HTTP::Lite',
437
+ 'http\.rb\/',
438
+ 'HTTP_Compression_Test',
439
+ 'http_request2',
440
+ 'http_requester',
441
+ 'HttpComponents',
442
+ 'httphr',
443
+ 'HTTPMon',
444
+ 'httpscheck',
445
+ 'httpssites_power',
446
+ 'httpunit',
447
+ 'HttpUrlConnection',
448
+ 'httrack',
449
+ 'huaweisymantec',
450
+ 'HubPages.*crawlingpolicy',
451
+ 'HubSpot ',
452
+ 'Humanlinks',
453
+ 'HyperZbozi.cz Feeder',
454
+ 'i2kconnect\/',
455
+ 'Iblog',
456
+ 'ichiro',
457
+ 'Id-search',
458
+ 'IdeelaborPlagiaat',
459
+ 'IDG Twitter Links Resolver',
460
+ 'IDwhois\/[0-9]',
461
+ 'Iframely',
462
+ 'igdeSpyder',
463
+ 'IlTrovatore',
464
+ 'Image\ Fetch',
465
+ 'Image\ Sucker',
466
+ 'ImageEngine\/',
467
+ 'Imagga',
468
+ 'imgsizer',
469
+ 'InAGist',
470
+ 'inbound\.li parser',
471
+ 'InDesign%20CC',
472
+ 'Indy\ Library',
473
+ 'infegy',
474
+ 'infohelfer',
475
+ 'InfoTekies',
476
+ 'InfoWizards Reciprocal Link System PRO',
477
+ 'inpwrd\.com',
478
+ 'instabid',
479
+ 'Instapaper',
480
+ 'Integrity',
481
+ 'integromedb',
482
+ 'Intelliseek',
483
+ 'InterGET',
484
+ 'Internet\ Ninja',
485
+ 'internet_archive',
486
+ 'InternetSeer',
487
+ 'internetVista monitor',
488
+ 'intraVnews',
489
+ 'IODC',
490
+ 'IOI',
491
+ 'iplabel',
492
+ 'ips-agent',
493
+ 'IPS\/[0-9]',
494
+ 'IPWorks HTTP\/S Component',
495
+ 'iqdb\/',
496
+ 'Iria',
497
+ 'Irokez',
498
+ 'isitup\.org',
499
+ 'iskanie',
500
+ 'iZSearch',
501
+ 'janforman',
502
+ 'Jaunt\/',
503
+ 'Jbrofuzz',
504
+ 'Jersey\/',
505
+ 'JetCar',
506
+ 'Jigsaw',
507
+ 'Jobboerse',
508
+ 'JobFeed discovery',
509
+ 'Jobg8 URL Monitor',
510
+ 'jobo',
511
+ 'Jobrapido',
512
+ 'Jobsearch1\.5',
513
+ 'JoinVision Generic',
514
+ 'Joomla',
515
+ 'Jorgee',
516
+ 'JS-Kit',
517
+ 'JustView',
518
+ 'Kaspersky Lab CFR link resolver',
519
+ 'KeepRight OpenStreetMap Checker',
520
+ 'Kelny\/',
521
+ 'Kerrigan\/',
522
+ 'KeyCDN',
523
+ 'Keyword Extractor',
524
+ 'Keyword\ Density',
525
+ 'Keywords Research',
526
+ 'KickFire',
527
+ 'KimonoLabs\/',
528
+ 'Kml-Google',
529
+ 'knows\.is',
530
+ 'KOCMOHABT',
531
+ 'kouio',
532
+ 'kulturarw3',
533
+ 'KumKie',
534
+ 'L\.webis',
535
+ 'Larbin',
536
+ 'Lavf\/',
537
+ 'LayeredExtractor',
538
+ 'LeechFTP',
539
+ 'LeechGet',
540
+ 'letsencrypt',
541
+ 'Lftp',
542
+ 'LibVLC',
543
+ 'LibWeb',
544
+ 'Libwhisker',
545
+ 'libwww',
546
+ 'Licorne Image Snapshot',
547
+ 'Liferea\/',
548
+ 'Lightspeedsystems',
549
+ 'Likse',
550
+ 'link checker',
551
+ 'Link Valet',
552
+ 'link_thumbnailer',
553
+ 'LinkAlarm\/',
554
+ 'linkCheck',
555
+ 'linkdex',
556
+ 'LinkExaminer',
557
+ 'linkfluence',
558
+ 'linkpeek',
559
+ 'LinkPreviewGenerator',
560
+ 'LinkScan',
561
+ 'LinksManager',
562
+ 'LinkTiger',
563
+ 'LinkWalker',
564
+ 'Lipperhey',
565
+ 'Litemage_walker',
566
+ 'livedoor ScreenShot',
567
+ 'LoadImpactRload',
568
+ 'LongURL API',
569
+ 'looksystems\.net',
570
+ 'ltx71',
571
+ 'lua-resty-http',
572
+ 'lwp-request',
573
+ 'lwp-trivial',
574
+ 'LWP::Simple',
575
+ 'lycos',
576
+ 'LYT\.SR',
577
+ 'mabontland',
578
+ 'Mag-Net',
579
+ 'MagpieRSS',
580
+ 'Mail.Ru',
581
+ 'MailChimp',
582
+ 'Majestic12',
583
+ 'makecontact\/',
584
+ 'Mandrill',
585
+ 'MapperCmd',
586
+ 'marketinggrader',
587
+ 'MarkMonitor',
588
+ 'MarkWatch',
589
+ 'Mass\ Downloader',
590
+ 'masscan\/[0-9]',
591
+ 'Mata\ Hari',
592
+ 'Mediapartners-Google',
593
+ 'mediawords',
594
+ 'MegaIndex\.ru',
595
+ 'Melvil Rawi\/',
596
+ 'MergeFlow-PageReader',
597
+ 'Metaspinner',
598
+ 'MetaURI',
599
+ 'MFC_Tear_Sample',
600
+ 'Microsearch',
601
+ 'Microsoft Office ',
602
+ 'Microsoft Windows Network Diagnostics',
603
+ 'Microsoft-WebDAV-MiniRedir',
604
+ 'Microsoft\ Data\ Access',
605
+ 'MIDown\ tool',
606
+ 'MIIxpc',
607
+ 'Mindjet',
608
+ 'Miniature.io\/',
609
+ 'Miniflux',
610
+ 'Mister\ PiX',
611
+ 'mixdata dot com',
612
+ 'mixed-content-scan',
613
+ 'mixnode',
614
+ 'Mnogosearch',
615
+ 'mogimogi',
616
+ 'Mojeek',
617
+ 'Mojolicious \(Perl\)',
618
+ 'monitis',
619
+ 'Monitority\/[0-9]',
620
+ 'montastic',
621
+ 'MonTools',
622
+ 'Moreover',
623
+ 'Morfeus\ Fucking\ Scanner',
624
+ 'Morning Paper',
625
+ 'MovableType',
626
+ 'mowser',
627
+ 'Mrcgiguy',
628
+ 'MS\ Web\ Services\ Client\ Protocol',
629
+ 'MSFrontPage',
630
+ 'mShots',
631
+ 'MuckRack\/',
632
+ 'muhstik-scan',
633
+ 'MVAClient',
634
+ 'MxToolbox\/',
635
+ 'nagios',
636
+ 'Najdi\.si\/',
637
+ 'Name\ Intelligence',
638
+ 'Nameprotect',
639
+ 'Navroad',
640
+ 'NearSite',
641
+ 'Needle',
642
+ 'Nessus',
643
+ 'Net\ Vampire',
644
+ 'NetAnts',
645
+ 'NETCRAFT',
646
+ 'NetLyzer',
647
+ 'NetMechanic',
648
+ 'Netpursual',
649
+ 'netresearch',
650
+ 'NetShelter ContentScan',
651
+ 'Netsparker',
652
+ 'NetTrack',
653
+ 'Netvibes',
654
+ 'NetZIP',
655
+ 'Neustar WPM',
656
+ 'NeutrinoAPI',
657
+ 'NewRelicPinger\/1.0 \(\d+\)',
658
+ 'NewsBlur .*Finder',
659
+ 'NewsGator',
660
+ 'newsme',
661
+ 'newspaper\/',
662
+ 'Nexgate Ruby Client',
663
+ 'NG-Search',
664
+ 'Nibbler',
665
+ 'NICErsPRO',
666
+ 'Nikto',
667
+ 'nineconnections\.com',
668
+ 'NLNZ_IAHarvester',
669
+ 'Nmap Scripting Engine',
670
+ 'node-superagent',
671
+ 'node-urllib\/',
672
+ 'node\.io',
673
+ 'nominet\.org\.uk',
674
+ 'Norton-Safeweb',
675
+ 'Notifixious',
676
+ 'notifyninja',
677
+ 'nuhk',
678
+ 'nutch',
679
+ 'Nuzzel',
680
+ 'nWormFeedFinder',
681
+ 'Nymesis',
682
+ 'NYU',
683
+ 'Ocelli\/[0-9]',
684
+ 'Octopus',
685
+ 'oegp',
686
+ 'Offline Explorer',
687
+ 'Offline\ Navigator',
688
+ 'okhttp',
689
+ 'Omea Reader',
690
+ 'omgili',
691
+ 'OMSC',
692
+ 'Online Domain Tools',
693
+ 'OpenCalaisSemanticProxy',
694
+ 'Openfind',
695
+ 'OpenLinkProfiler',
696
+ 'Openstat\/',
697
+ 'OpenVAS',
698
+ 'Optimizer',
699
+ 'Orbiter',
700
+ 'OrgProbe\/[0-9]',
701
+ 'orion-semantics',
702
+ 'ow\.ly',
703
+ 'Owler',
704
+ 'ownCloud News',
705
+ 'OxfordCloudService\/[0-9]',
706
+ 'Page Analyzer',
707
+ 'Page Valet',
708
+ 'page2rss',
709
+ 'page\ scorer',
710
+ 'page_verifier',
711
+ 'PageAnalyzer',
712
+ 'PageGrabber',
713
+ 'PagePeeker',
714
+ 'PageScorer',
715
+ 'Pagespeed\/[0-9]',
716
+ 'Panopta',
717
+ 'panscient',
718
+ 'Papa\ Foto',
719
+ 'parsijoo',
720
+ 'Pavuk',
721
+ 'PayPal IPN',
722
+ 'pcBrowser',
723
+ 'Pcore-HTTP',
724
+ 'PEAR HTTPRequest',
725
+ 'Pearltrees',
726
+ 'PECL::HTTP',
727
+ 'peerindex',
728
+ 'Peew',
729
+ 'PeoplePal',
730
+ 'Perlu -',
731
+ 'PhantomJS Screenshoter',
732
+ 'PhantomJS\/',
733
+ 'Photon\/',
734
+ 'phpcrawl',
735
+ 'phpservermon',
736
+ 'Pi-Monster',
737
+ 'Picscout',
738
+ 'Picsearch',
739
+ 'PictureFinder',
740
+ 'Pimonster',
741
+ 'ping\.blo\.gs\/',
742
+ 'Pingability',
743
+ 'Pingdom',
744
+ 'Pingoscope',
745
+ 'PingSpot',
746
+ 'pinterest\.com',
747
+ 'Pixray',
748
+ 'Pizilla',
749
+ 'PleaseCrawl',
750
+ 'Ploetz \+ Zeller',
751
+ 'Plukkie',
752
+ 'plumanalytics',
753
+ 'PocketParser',
754
+ 'Pockey',
755
+ 'POE-Component-Client-HTTP',
756
+ 'Pompos',
757
+ 'Porkbun',
758
+ 'Port Monitor',
759
+ 'postano',
760
+ 'PostmanRuntime\/',
761
+ 'PostPost',
762
+ 'postrank',
763
+ 'PowerPoint\/',
764
+ 'Priceonomics Analysis Engine',
765
+ 'PrintFriendly\.com',
766
+ 'PritTorrent\/[0-9]',
767
+ 'Prlog',
768
+ 'probethenet',
769
+ 'Project 25499',
770
+ 'Promotion_Tools_www.searchenginepromotionhelp.com',
771
+ 'prospectb2b',
772
+ 'Protopage',
773
+ 'ProWebWalker',
774
+ 'proximic',
775
+ 'PRTG Network Monitor',
776
+ 'pshtt, https scanning',
777
+ 'PTST ',
778
+ 'PTST\/[0-9]+',
779
+ 'Pulsepoint XT3 web scraper',
780
+ 'Pump',
781
+ 'Python-httplib2',
782
+ 'python-requests',
783
+ 'Python-urllib',
784
+ 'Qirina Hurdler',
785
+ 'QQDownload',
786
+ 'QrafterPro',
787
+ 'Qseero',
788
+ 'Qualidator.com SiteAnalyzer',
789
+ 'QueryN\ Metasearch',
790
+ 'Quora Link Preview',
791
+ 'Qwantify',
792
+ 'Radian6',
793
+ 'RankActive',
794
+ 'RankFlex',
795
+ 'RankSonicSiteAuditor',
796
+ 'Readability',
797
+ 'RealDownload',
798
+ 'RealPlayer%20Downloader',
799
+ 'RebelMouse',
800
+ 'Recorder',
801
+ 'RecurPost\/',
802
+ 'redback\/',
803
+ 'Redirect Checker Tool',
804
+ 'ReederForMac',
805
+ 'ReGet',
806
+ 'RepoMonkey',
807
+ 'request\.js',
808
+ 'ResponseCodeTest\/[0-9]',
809
+ 'RestSharp',
810
+ 'Riddler',
811
+ 'Rival IQ',
812
+ 'Robosourcer',
813
+ 'Robozilla\/[0-9]',
814
+ 'ROI Hunter',
815
+ 'RPT-HTTPClient',
816
+ 'RSSOwl',
817
+ 'safe-agent-scanner',
818
+ 'SalesIntelligent',
819
+ 'Saleslift',
820
+ 'SauceNAO',
821
+ 'SBIder',
822
+ 'scalaj-http',
823
+ 'scan\.lol',
824
+ 'ScanAlert',
825
+ 'Scoop',
826
+ 'scooter',
827
+ 'ScoutJet',
828
+ 'ScoutURLMonitor',
829
+ 'Scrapy',
830
+ 'Screaming',
831
+ 'ScreenShotService\/[0-9]',
832
+ 'Scrubby',
833
+ 'Search37\/',
834
+ 'search\.thunderstone',
835
+ 'Searchestate',
836
+ 'SearchSight',
837
+ 'Seeker',
838
+ 'semanticdiscovery',
839
+ 'semanticjuice',
840
+ 'Semiocast HTTP client',
841
+ 'Semrush',
842
+ 'sentry\/',
843
+ 'SEO Browser',
844
+ 'Seo Servis',
845
+ 'seo-nastroj.cz',
846
+ 'Seobility',
847
+ 'SEOCentro',
848
+ 'SeoCheck',
849
+ 'SEOkicks',
850
+ 'Seomoz',
851
+ 'SEOprofiler',
852
+ 'SeopultContentAnalyzer',
853
+ 'seoscanners',
854
+ 'SEOstats',
855
+ 'Server Density Service Monitoring',
856
+ 'servernfo\.com',
857
+ 'SetCronJob\/',
858
+ 'sexsearcher',
859
+ 'Seznam',
860
+ 'Shelob',
861
+ 'Shodan',
862
+ 'Shoppimon Analyzer',
863
+ 'ShoppimonAgent\/[0-9]',
864
+ 'ShopWiki',
865
+ 'ShortLinkTranslate',
866
+ 'shrinktheweb',
867
+ 'Sideqik',
868
+ 'SilverReader',
869
+ 'SimplePie',
870
+ 'SimplyFast',
871
+ 'Siphon',
872
+ 'SISTRIX',
873
+ 'Site-Shot\/',
874
+ 'Site24x7',
875
+ 'Site\ Sucker',
876
+ 'SiteBar',
877
+ 'Sitebeam',
878
+ 'Sitebulb\/',
879
+ 'SiteCondor',
880
+ 'SiteExplorer',
881
+ 'SiteGuardian',
882
+ 'Siteimprove',
883
+ 'SiteIndexed',
884
+ 'Sitemap(s)? Generator',
885
+ 'SiteMonitor',
886
+ 'Siteshooter B0t',
887
+ 'SiteSnagger',
888
+ 'SiteSucker',
889
+ 'SiteTruth',
890
+ 'Sitevigil',
891
+ 'sitexy\.com',
892
+ 'SkypeUriPreview',
893
+ 'Slack\/',
894
+ 'slider\.com',
895
+ 'slurp',
896
+ 'SlySearch',
897
+ 'SmartDownload',
898
+ 'SMRF URL Expander',
899
+ 'SMUrlExpander',
900
+ 'Snake',
901
+ 'Snappy',
902
+ 'SniffRSS',
903
+ 'sniptracker',
904
+ 'Snoopy',
905
+ 'SnowHaze Search',
906
+ 'sogou web',
907
+ 'SortSite',
908
+ 'Sottopop',
909
+ 'sovereign\.ai',
910
+ 'SpaceBison',
911
+ 'Spammen',
912
+ 'Spanner',
913
+ 'spaziodati',
914
+ 'Specificfeeds',
915
+ 'speedy',
916
+ 'SPEng',
917
+ 'Spinn3r',
918
+ 'spray-can',
919
+ 'Sprinklr ',
920
+ 'spyonweb',
921
+ 'sqlmap',
922
+ 'Sqlworm',
923
+ 'Sqworm',
924
+ 'SSL Labs',
925
+ 'ssl-tools',
926
+ 'StackRambler',
927
+ 'Statastico\/',
928
+ 'StatusCake',
929
+ 'Steeler',
930
+ 'Stratagems Kumo',
931
+ 'Stroke.cz',
932
+ 'StudioFACA',
933
+ 'suchen',
934
+ 'Sucuri',
935
+ 'summify',
936
+ 'Super Monitoring',
937
+ 'SuperHTTP',
938
+ 'Surphace Scout',
939
+ 'Suzuran',
940
+ 'SwiteScraper',
941
+ 'Symfony BrowserKit',
942
+ 'Symfony2 BrowserKit',
943
+ 'SynHttpClient-Built',
944
+ 'Sysomos',
945
+ 'sysscan',
946
+ 'Szukacz',
947
+ 'T0PHackTeam',
948
+ 'tAkeOut',
949
+ 'Tarantula\/',
950
+ 'Taringa UGC',
951
+ 'Teleport',
952
+ 'Telesoft',
953
+ 'Telesphoreo',
954
+ 'Telesphorep',
955
+ 'Tenon\.io',
956
+ 'teoma',
957
+ 'terrainformatica\.com',
958
+ 'Test Certificate Info',
959
+ 'Tetrahedron\/[0-9]',
960
+ 'The Drop Reaper',
961
+ 'The Expert HTML Source Viewer',
962
+ 'The\ Intraformant',
963
+ 'theinternetrules',
964
+ 'TheNomad',
965
+ 'theoldreader\.com',
966
+ 'Thinklab',
967
+ 'Thumbshots',
968
+ 'ThumbSniper',
969
+ 'TinEye',
970
+ 'Tiny Tiny RSS',
971
+ 'TLSProbe\/',
972
+ 'Toata',
973
+ 'topster',
974
+ 'touche.com',
975
+ 'Traackr.com',
976
+ 'TrapitAgent',
977
+ 'Trendiction',
978
+ 'Trendsmap Resolver',
979
+ 'trendspottr\.com',
980
+ 'truwoGPS',
981
+ 'TulipChain',
982
+ 'Turingos',
983
+ 'Turnitin',
984
+ 'tweetedtimes\.com',
985
+ 'Tweetminster',
986
+ 'Tweezler\/',
987
+ 'Twice',
988
+ 'Twikle',
989
+ 'Twingly',
990
+ 'Twisted PageGetter',
991
+ 'Typhoeus',
992
+ 'ubermetrics-technologies',
993
+ 'uclassify',
994
+ 'uCrawlr\/',
995
+ 'UdmSearch',
996
+ 'UniversalFeedParser',
997
+ 'Unshorten\.It\!\/[0-9]',
998
+ 'Untiny',
999
+ 'UnwindFetchor',
1000
+ 'updated',
1001
+ 'updown\.io daemon',
1002
+ 'Upflow',
1003
+ 'Uptimia',
1004
+ 'URL Verifier',
1005
+ 'URLChecker',
1006
+ 'URLitor.com',
1007
+ 'urlresolver',
1008
+ 'Urlstat',
1009
+ 'UrlTrends Ranking Updater',
1010
+ 'URLy\ Warning',
1011
+ 'URLy\.Warning',
1012
+ 'Vacuum',
1013
+ 'Vagabondo',
1014
+ 'VB\ Project',
1015
+ 'vBSEO',
1016
+ 'VCI',
1017
+ 'via ggpht\.com GoogleImageProxy',
1018
+ 'VidibleScraper',
1019
+ 'Virusdie',
1020
+ 'visionutils',
1021
+ 'vkShare',
1022
+ 'VoidEYE',
1023
+ 'Voil',
1024
+ 'voltron',
1025
+ 'voyager\/',
1026
+ 'VSAgent\/[0-9]',
1027
+ 'VSB-TUO\/[0-9]',
1028
+ 'Vulnbusters Meter',
1029
+ 'VYU2',
1030
+ 'w3af\.org',
1031
+ 'W3C-checklink',
1032
+ 'W3C-mobileOK',
1033
+ 'W3C_I18n-Checker',
1034
+ 'W3C_Unicorn',
1035
+ 'Wallpapers\/[0-9]+',
1036
+ 'WallpapersHD',
1037
+ 'wangling',
1038
+ 'Wappalyzer',
1039
+ 'WatchMouse',
1040
+ 'WbSrch\/',
1041
+ 'web-capture\.net',
1042
+ 'Web-Monitoring',
1043
+ 'Web-sniffer',
1044
+ 'Web\ Auto',
1045
+ 'Web\ Collage',
1046
+ 'Web\ Enhancer',
1047
+ 'Web\ Fetch',
1048
+ 'Web\ Fuck',
1049
+ 'Web\ Pix',
1050
+ 'Web\ Sauger',
1051
+ 'Web\ Sucker',
1052
+ 'Webalta',
1053
+ 'Webauskunft',
1054
+ 'WebAuto',
1055
+ 'WebCapture',
1056
+ 'WebClient\/',
1057
+ 'webcollage',
1058
+ 'WebCookies',
1059
+ 'WebCopier',
1060
+ 'WebCorp',
1061
+ 'WebDoc',
1062
+ 'WebEnhancer',
1063
+ 'WebFetch',
1064
+ 'WebFuck',
1065
+ 'WebGo\ IS',
1066
+ 'WebImageCollector',
1067
+ 'WebImages',
1068
+ 'WebIndex',
1069
+ 'webkit2png',
1070
+ 'WebLeacher',
1071
+ 'webmastercoffee',
1072
+ 'webmon ',
1073
+ 'WebPix',
1074
+ 'WebReaper',
1075
+ 'WebSauger',
1076
+ 'webscreenie',
1077
+ 'Webshag',
1078
+ 'Webshot',
1079
+ 'Website Analyzer\/',
1080
+ 'Website\ Quester',
1081
+ 'WebsiteExtractor',
1082
+ 'websitepulse agent',
1083
+ 'websitepulse[+ ]checker',
1084
+ 'WebsiteQuester',
1085
+ 'Websnapr\/',
1086
+ 'Webster',
1087
+ 'WebStripper',
1088
+ 'WebSucker',
1089
+ 'Webthumb\/[0-9]',
1090
+ 'WebThumbnail',
1091
+ 'WebWhacker',
1092
+ 'WebZIP',
1093
+ 'WeCrawlForThePeace',
1094
+ 'WeLikeLinks',
1095
+ 'WEPA',
1096
+ 'WeSEE',
1097
+ 'wf84',
1098
+ 'wget',
1099
+ 'WhatsApp',
1100
+ 'WhatsMyIP',
1101
+ 'WhatWeb',
1102
+ 'WhereGoes\?',
1103
+ 'Whibse',
1104
+ 'WhoRunsCoinHive',
1105
+ 'Whynder Magnet',
1106
+ 'Windows-RSS-Platform',
1107
+ 'WinHttpRequest',
1108
+ 'wkhtmlto',
1109
+ 'wmtips',
1110
+ 'Woko',
1111
+ 'Word\/',
1112
+ 'WordPress\/',
1113
+ 'wotbox',
1114
+ 'WP Engine Install Performance API',
1115
+ 'wpif',
1116
+ 'wprecon\.com survey',
1117
+ 'WPScan',
1118
+ 'wscheck',
1119
+ 'Wtrace',
1120
+ 'WWW-Collector-E',
1121
+ 'WWW-Mechanize',
1122
+ 'WWW::Mechanize',
1123
+ 'www\.monitor\.us',
1124
+ 'WWWOFFLE',
1125
+ 'x09Mozilla',
1126
+ 'x22Mozilla',
1127
+ 'XaxisSemanticsClassifier',
1128
+ 'Xenu Link Sleuth',
1129
+ 'XING-contenttabreceiver\/[0-9]',
1130
+ 'XmlSitemapGenerator',
1131
+ 'xpymep([0-9]?)\.exe',
1132
+ 'Y!J-(ASR|BSC)',
1133
+ 'Yaanb',
1134
+ 'yacy',
1135
+ 'Yahoo Ad monitoring',
1136
+ 'Yahoo Link Preview',
1137
+ 'YahooCacheSystem',
1138
+ 'YahooYSMcm',
1139
+ 'YandeG',
1140
+ 'Yandex(?!Search)',
1141
+ 'yanga',
1142
+ 'yeti',
1143
+ 'Yo-yo',
1144
+ 'Yoleo Consumer',
1145
+ 'yoogliFetchAgent',
1146
+ 'YottaaMonitor',
1147
+ 'Your-Website-Sucks\/[0-9]',
1148
+ 'yourls\.org',
1149
+ 'Zade',
1150
+ 'Zao',
1151
+ 'Zauba',
1152
+ 'Zemanta Aggregator',
1153
+ 'Zend\\\\Http\\\\Client',
1154
+ 'Zend_Http_Client',
1155
+ 'Zermelo',
1156
+ 'Zeus',
1157
+ 'zgrab',
1158
+ 'ZnajdzFoto',
1159
+ 'ZyBorg',
1160
+ '[a-z0-9\-_]*(bot|crawler|archiver|transcoder|spider|uptime|validator|fetcher)',
1161
+ );
1162
+ }
vendor/jaybizzle/crawler-detect/src/Fixtures/Exclusions.php CHANGED
@@ -1,66 +1,66 @@
1
- <?php
2
-
3
- /*
4
- * This file is part of Crawler Detect - the web crawler detection library.
5
- *
6
- * (c) Mark Beech <m@rkbee.ch>
7
- *
8
- * This source file is subject to the MIT license that is bundled
9
- * with this source code in the file LICENSE.
10
- */
11
-
12
- namespace Jaybizzle\CrawlerDetect\Fixtures;
13
-
14
- class Exclusions extends AbstractProvider
15
- {
16
- /**
17
- * List of strings to remove from the user agent before running the crawler regex
18
- * Over a large list of user agents, this gives us about a 55% speed increase!
19
- *
20
- * @var array
21
- */
22
- protected $data = array(
23
- 'Safari.[\d\.]*',
24
- 'Firefox.[\d\.]*',
25
- 'Chrome.[\d\.]*',
26
- 'Chromium.[\d\.]*',
27
- 'MSIE.[\d\.]',
28
- 'Opera\/[\d\.]*',
29
- 'Mozilla.[\d\.]*',
30
- 'AppleWebKit.[\d\.]*',
31
- 'Trident.[\d\.]*',
32
- 'Windows NT.[\d\.]*',
33
- 'Android [\d\.]*',
34
- 'Macintosh.',
35
- 'Ubuntu',
36
- 'Linux',
37
- '[ ]Intel',
38
- 'Mac OS X [\d_]*',
39
- '(like )?Gecko(.[\d\.]*)?',
40
- 'KHTML,',
41
- 'CriOS.[\d\.]*',
42
- 'CPU iPhone OS ([0-9_])* like Mac OS X',
43
- 'CPU OS ([0-9_])* like Mac OS X',
44
- 'iPod',
45
- 'compatible',
46
- 'x86_..',
47
- 'i686',
48
- 'x64',
49
- 'X11',
50
- 'rv:[\d\.]*',
51
- 'Version.[\d\.]*',
52
- 'WOW64',
53
- 'Win64',
54
- 'Dalvik.[\d\.]*',
55
- ' \.NET CLR [\d\.]*',
56
- 'Presto.[\d\.]*',
57
- 'Media Center PC',
58
- 'BlackBerry',
59
- 'Build',
60
- 'Opera Mini\/\d{1,2}\.\d{1,2}\.[\d\.]*\/\d{1,2}\.',
61
- 'Opera',
62
- ' \.NET[\d\.]*',
63
- 'cubot',
64
- ';', // Remove the following characters ;
65
- );
66
- }
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of Crawler Detect - the web crawler detection library.
5
+ *
6
+ * (c) Mark Beech <m@rkbee.ch>
7
+ *
8
+ * This source file is subject to the MIT license that is bundled
9
+ * with this source code in the file LICENSE.
10
+ */
11
+
12
+ namespace Jaybizzle\CrawlerDetect\Fixtures;
13
+
14
+ class Exclusions extends AbstractProvider
15
+ {
16
+ /**
17
+ * List of strings to remove from the user agent before running the crawler regex
18
+ * Over a large list of user agents, this gives us about a 55% speed increase!
19
+ *
20
+ * @var array
21
+ */
22
+ protected $data = array(
23
+ 'Safari.[\d\.]*',
24
+ 'Firefox.[\d\.]*',
25
+ 'Chrome.[\d\.]*',
26
+ 'Chromium.[\d\.]*',
27
+ 'MSIE.[\d\.]',
28
+ 'Opera\/[\d\.]*',
29
+ 'Mozilla.[\d\.]*',
30
+ 'AppleWebKit.[\d\.]*',
31
+ 'Trident.[\d\.]*',
32
+ 'Windows NT.[\d\.]*',
33
+ 'Android [\d\.]*',
34
+ 'Macintosh.',
35
+ 'Ubuntu',
36
+ 'Linux',
37
+ '[ ]Intel',
38
+ 'Mac OS X [\d_]*',
39
+ '(like )?Gecko(.[\d\.]*)?',
40
+ 'KHTML,',
41
+ 'CriOS.[\d\.]*',
42
+ 'CPU iPhone OS ([0-9_])* like Mac OS X',
43
+ 'CPU OS ([0-9_])* like Mac OS X',
44
+ 'iPod',
45
+ 'compatible',
46
+ 'x86_..',
47
+ 'i686',
48
+ 'x64',
49
+ 'X11',
50
+ 'rv:[\d\.]*',
51
+ 'Version.[\d\.]*',
52
+ 'WOW64',
53
+ 'Win64',
54
+ 'Dalvik.[\d\.]*',
55
+ ' \.NET CLR [\d\.]*',
56
+ 'Presto.[\d\.]*',
57
+ 'Media Center PC',
58
+ 'BlackBerry',
59
+ 'Build',
60
+ 'Opera Mini\/\d{1,2}\.\d{1,2}\.[\d\.]*\/\d{1,2}\.',
61
+ 'Opera',
62
+ ' \.NET[\d\.]*',
63
+ 'cubot',
64
+ ';', // Remove the following characters ;
65
+ );
66
+ }
vendor/jaybizzle/crawler-detect/src/Fixtures/Headers.php CHANGED
@@ -1,37 +1,37 @@
1
- <?php
2
-
3
- /*
4
- * This file is part of Crawler Detect - the web crawler detection library.
5
- *
6
- * (c) Mark Beech <m@rkbee.ch>
7
- *
8
- * This source file is subject to the MIT license that is bundled
9
- * with this source code in the file LICENSE.
10
- */
11
-
12
- namespace Jaybizzle\CrawlerDetect\Fixtures;
13
-
14
- class Headers extends AbstractProvider
15
- {
16
- /**
17
- * All possible HTTP headers that represent the user agent string.
18
- *
19
- * @var array
20
- */
21
- protected $data = array(
22
- // The default User-Agent string.
23
- 'HTTP_USER_AGENT',
24
- // Header can occur on devices using Opera Mini.
25
- 'HTTP_X_OPERAMINI_PHONE_UA',
26
- // Vodafone specific header: http://www.seoprinciple.com/mobile-web-community-still-angry-at-vodafone/24/
27
- 'HTTP_X_DEVICE_USER_AGENT',
28
- 'HTTP_X_ORIGINAL_USER_AGENT',
29
- 'HTTP_X_SKYFIRE_PHONE',
30
- 'HTTP_X_BOLT_PHONE_UA',
31
- 'HTTP_DEVICE_STOCK_UA',
32
- 'HTTP_X_UCBROWSER_DEVICE_UA',
33
- // Sometimes, bots (especially Google) use a genuine user agent, but fill this header in with their email address
34
- 'HTTP_FROM',
35
- 'HTTP_X_SCANNER', // Seen in use by Netsparker
36
- );
37
- }
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of Crawler Detect - the web crawler detection library.
5
+ *
6
+ * (c) Mark Beech <m@rkbee.ch>
7
+ *
8
+ * This source file is subject to the MIT license that is bundled
9
+ * with this source code in the file LICENSE.
10
+ */
11
+
12
+ namespace Jaybizzle\CrawlerDetect\Fixtures;
13
+
14
+ class Headers extends AbstractProvider
15
+ {
16
+ /**
17
+ * All possible HTTP headers that represent the user agent string.
18
+ *
19
+ * @var array
20
+ */
21
+ protected $data = array(
22
+ // The default User-Agent string.
23
+ 'HTTP_USER_AGENT',
24
+ // Header can occur on devices using Opera Mini.
25
+ 'HTTP_X_OPERAMINI_PHONE_UA',
26
+ // Vodafone specific header: http://www.seoprinciple.com/mobile-web-community-still-angry-at-vodafone/24/
27
+ 'HTTP_X_DEVICE_USER_AGENT',
28
+ 'HTTP_X_ORIGINAL_USER_AGENT',
29
+ 'HTTP_X_SKYFIRE_PHONE',
30
+ 'HTTP_X_BOLT_PHONE_UA',
31
+ 'HTTP_DEVICE_STOCK_UA',
32
+ 'HTTP_X_UCBROWSER_DEVICE_UA',
33
+ // Sometimes, bots (especially Google) use a genuine user agent, but fill this header in with their email address
34
+ 'HTTP_FROM',
35
+ 'HTTP_X_SCANNER', // Seen in use by Netsparker
36
+ );
37
+ }
vendor/mobiledetect/mobiledetectlib/LICENSE.txt CHANGED
@@ -1,48 +1,48 @@
1
- MIT License
2
-
3
- Copyright (c) <2011-2015> Serban Ghita, Nick Ilyin and contributors.
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining
6
- a copy of this software and associated documentation files (the
7
- "Software"), to deal in the Software without restriction, including
8
- without limitation the rights to use, copy, modify, merge, publish,
9
- distribute, sublicense, and/or sell copies of the Software, and to
10
- permit persons to whom the Software is furnished to do so, subject to
11
- the following conditions:
12
-
13
- The above copyright notice and this permission notice shall be included
14
- in all copies or substantial portions of the Software.
15
-
16
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17
- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19
- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
20
- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21
- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22
- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
-
24
- Developer’s Certificate of Origin 1.1
25
-
26
- By making a contribution to this project, I certify that:
27
-
28
- (a) The contribution was created in whole or in part by me and I
29
- have the right to submit it under the open source license
30
- indicated in the file; or
31
-
32
- (b) The contribution is based upon previous work that, to the best
33
- of my knowledge, is covered under an appropriate open source
34
- license and I have the right under that license to submit that
35
- work with modifications, whether created in whole or in part
36
- by me, under the same open source license (unless I am
37
- permitted to submit under a different license), as indicated
38
- in the file; or
39
-
40
- (c) The contribution was provided directly to me by some other
41
- person who certified (a), (b) or (c) and I have not modified
42
- it.
43
-
44
- (d) I understand and agree that this project and the contribution
45
- are public and that a record of the contribution (including all
46
- personal information I submit with it, including my sign-off) is
47
- maintained indefinitely and may be redistributed consistent with
48
- this project or the open source license(s) involved.
1
+ MIT License
2
+
3
+ Copyright (c) <2011-2015> Serban Ghita, Nick Ilyin and contributors.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included
14
+ in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
20
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
+
24
+ Developer’s Certificate of Origin 1.1
25
+
26
+ By making a contribution to this project, I certify that:
27
+
28
+ (a) The contribution was created in whole or in part by me and I
29
+ have the right to submit it under the open source license
30
+ indicated in the file; or
31
+
32
+ (b) The contribution is based upon previous work that, to the best
33
+ of my knowledge, is covered under an appropriate open source
34
+ license and I have the right under that license to submit that
35
+ work with modifications, whether created in whole or in part
36
+ by me, under the same open source license (unless I am
37
+ permitted to submit under a different license), as indicated
38
+ in the file; or
39
+
40
+ (c) The contribution was provided directly to me by some other
41
+ person who certified (a), (b) or (c) and I have not modified
42
+ it.
43
+
44
+ (d) I understand and agree that this project and the contribution
45
+ are public and that a record of the contribution (including all
46
+ personal information I submit with it, including my sign-off) is
47
+ maintained indefinitely and may be redistributed consistent with
48
+ this project or the open source license(s) involved.
vendor/mobiledetect/mobiledetectlib/Mobile_Detect.php CHANGED
@@ -1,1468 +1,1468 @@
1
- <?php
2
- /**
3
- * Mobile Detect Library
4
- * Motto: "Every business should have a mobile detection script to detect mobile readers"
5
- *
6
- * Mobile_Detect is a lightweight PHP class for detecting mobile devices (including tablets).
7
- * It uses the User-Agent string combined with specific HTTP headers to detect the mobile environment.
8
- *
9
- * Homepage: http://mobiledetect.net
10
- * GitHub: https://github.com/serbanghita/Mobile-Detect
11
- * README: https://github.com/serbanghita/Mobile-Detect/blob/master/README.md
12
- * CONTRIBUTING: https://github.com/serbanghita/Mobile-Detect/blob/master/docs/CONTRIBUTING.md
13
- * KNOWN LIMITATIONS: https://github.com/serbanghita/Mobile-Detect/blob/master/docs/KNOWN_LIMITATIONS.md
14
- * EXAMPLES: https://github.com/serbanghita/Mobile-Detect/wiki/Code-examples
15
- *
16
- * @license https://github.com/serbanghita/Mobile-Detect/blob/master/LICENSE.txt MIT License
17
- * @author Serban Ghita <serbanghita@gmail.com>
18
- * @author Nick Ilyin <nick.ilyin@gmail.com>
19
- * Original author: Victor Stanciu <vic.stanciu@gmail.com>
20
- *
21
- * @version 2.8.31
22
- */
23
- class Mobile_Detect
24
- {
25
- /**
26
- * Mobile detection type.
27
- *
28
- * @deprecated since version 2.6.9
29
- */
30
- const DETECTION_TYPE_MOBILE = 'mobile';
31
-
32
- /**
33
- * Extended detection type.
34
- *
35
- * @deprecated since version 2.6.9
36
- */
37
- const DETECTION_TYPE_EXTENDED = 'extended';
38
-
39
- /**
40
- * A frequently used regular expression to extract version #s.
41
- *
42
- * @deprecated since version 2.6.9
43
- */
44
- const VER = '([\w._\+]+)';
45
-
46
- /**
47
- * Top-level device.
48
- */
49
- const MOBILE_GRADE_A = 'A';
50
-
51
- /**
52
- * Mid-level device.
53
- */
54
- const MOBILE_GRADE_B = 'B';
55
-
56
- /**
57
- * Low-level device.
58
- */
59
- const MOBILE_GRADE_C = 'C';
60
-
61
- /**
62
- * Stores the version number of the current release.
63
- */
64
- const VERSION = '2.8.31';
65
-
66
- /**
67
- * A type for the version() method indicating a string return value.
68
- */
69
- const VERSION_TYPE_STRING = 'text';
70
-
71
- /**
72
- * A type for the version() method indicating a float return value.
73
- */
74
- const VERSION_TYPE_FLOAT = 'float';
75
-
76
- /**
77
- * A cache for resolved matches
78
- * @var array
79
- */
80
- protected $cache = array();
81
-
82
- /**
83
- * The User-Agent HTTP header is stored in here.
84
- * @var string
85
- */
86
- protected $userAgent = null;
87
-
88
- /**
89
- * HTTP headers in the PHP-flavor. So HTTP_USER_AGENT and SERVER_SOFTWARE.
90
- * @var array
91
- */
92
- protected $httpHeaders = array();
93
-
94
- /**
95
- * CloudFront headers. E.g. CloudFront-Is-Desktop-Viewer, CloudFront-Is-Mobile-Viewer & CloudFront-Is-Tablet-Viewer.
96
- * @var array
97
- */
98
- protected $cloudfrontHeaders = array();
99
-
100
- /**
101
- * The matching Regex.
102
- * This is good for debug.
103
- * @var string
104
- */
105
- protected $matchingRegex = null;
106
-
107
- /**
108
- * The matches extracted from the regex expression.
109
- * This is good for debug.
110
- *
111
- * @var string
112
- */
113
- protected $matchesArray = null;
114
-
115
- /**
116
- * The detection type, using self::DETECTION_TYPE_MOBILE or self::DETECTION_TYPE_EXTENDED.
117
- *
118
- * @deprecated since version 2.6.9
119
- *
120
- * @var string
121
- */
122
- protected $detectionType = self::DETECTION_TYPE_MOBILE;
123
-
124
- /**
125
- * HTTP headers that trigger the 'isMobile' detection
126
- * to be true.
127
- *
128
- * @var array
129
- */
130
- protected static $mobileHeaders = array(
131
-
132
- 'HTTP_ACCEPT' => array('matches' => array(
133
- // Opera Mini; @reference: http://dev.opera.com/articles/view/opera-binary-markup-language/
134
- 'application/x-obml2d',
135
- // BlackBerry devices.
136
- 'application/vnd.rim.html',
137
- 'text/vnd.wap.wml',
138
- 'application/vnd.wap.xhtml+xml'
139
- )),
140
- 'HTTP_X_WAP_PROFILE' => null,
141
- 'HTTP_X_WAP_CLIENTID' => null,
142
- 'HTTP_WAP_CONNECTION' => null,
143
- 'HTTP_PROFILE' => null,
144
- // Reported by Opera on Nokia devices (eg. C3).
145
- 'HTTP_X_OPERAMINI_PHONE_UA' => null,
146
- 'HTTP_X_NOKIA_GATEWAY_ID' => null,
147
- 'HTTP_X_ORANGE_ID' => null,
148
- 'HTTP_X_VODAFONE_3GPDPCONTEXT' => null,
149
- 'HTTP_X_HUAWEI_USERID' => null,
150
- // Reported by Windows Smartphones.
151
- 'HTTP_UA_OS' => null,
152
- // Reported by Verizon, Vodafone proxy system.
153
- 'HTTP_X_MOBILE_GATEWAY' => null,
154
- // Seen this on HTC Sensation. SensationXE_Beats_Z715e.
155
- 'HTTP_X_ATT_DEVICEID' => null,
156
- // Seen this on a HTC.
157
- 'HTTP_UA_CPU' => array('matches' => array('ARM')),
158
- );
159
-
160
- /**
161
- * List of mobile devices (phones).
162
- *
163
- * @var array
164
- */
165
- protected static $phoneDevices = array(
166
- 'iPhone' => '\biPhone\b|\biPod\b', // |\biTunes
167
- 'BlackBerry' => 'BlackBerry|\bBB10\b|rim[0-9]+',
168
- 'HTC' => 'HTC|HTC.*(Sensation|Evo|Vision|Explorer|6800|8100|8900|A7272|S510e|C110e|Legend|Desire|T8282)|APX515CKT|Qtek9090|APA9292KT|HD_mini|Sensation.*Z710e|PG86100|Z715e|Desire.*(A8181|HD)|ADR6200|ADR6400L|ADR6425|001HT|Inspire 4G|Android.*\bEVO\b|T-Mobile G1|Z520m|Android [0-9.]+; Pixel',
169
- 'Nexus' => 'Nexus One|Nexus S|Galaxy.*Nexus|Android.*Nexus.*Mobile|Nexus 4|Nexus 5|Nexus 6',
170
- // @todo: Is 'Dell Streak' a tablet or a phone? ;)
171
- 'Dell' => 'Dell[;]? (Streak|Aero|Venue|Venue Pro|Flash|Smoke|Mini 3iX)|XCD28|XCD35|\b001DL\b|\b101DL\b|\bGS01\b',
172
- 'Motorola' => 'Motorola|DROIDX|DROID BIONIC|\bDroid\b.*Build|Android.*Xoom|HRI39|MOT-|A1260|A1680|A555|A853|A855|A953|A955|A956|Motorola.*ELECTRIFY|Motorola.*i1|i867|i940|MB200|MB300|MB501|MB502|MB508|MB511|MB520|MB525|MB526|MB611|MB612|MB632|MB810|MB855|MB860|MB861|MB865|MB870|ME501|ME502|ME511|ME525|ME600|ME632|ME722|ME811|ME860|ME863|ME865|MT620|MT710|MT716|MT720|MT810|MT870|MT917|Motorola.*TITANIUM|WX435|WX445|XT300|XT301|XT311|XT316|XT317|XT319|XT320|XT390|XT502|XT530|XT531|XT532|XT535|XT603|XT610|XT611|XT615|XT681|XT701|XT702|XT711|XT720|XT800|XT806|XT860|XT862|XT875|XT882|XT883|XT894|XT901|XT907|XT909|XT910|XT912|XT928|XT926|XT915|XT919|XT925|XT1021|\bMoto E\b|XT1068|XT1092',
173
- 'Samsung' => '\bSamsung\b|SM-G950F|SM-G955F|SM-G9250|GT-19300|SGH-I337|BGT-S5230|GT-B2100|GT-B2700|GT-B2710|GT-B3210|GT-B3310|GT-B3410|GT-B3730|GT-B3740|GT-B5510|GT-B5512|GT-B5722|GT-B6520|GT-B7300|GT-B7320|GT-B7330|GT-B7350|GT-B7510|GT-B7722|GT-B7800|GT-C3010|GT-C3011|GT-C3060|GT-C3200|GT-C3212|GT-C3212I|GT-C3262|GT-C3222|GT-C3300|GT-C3300K|GT-C3303|GT-C3303K|GT-C3310|GT-C3322|GT-C3330|GT-C3350|GT-C3500|GT-C3510|GT-C3530|GT-C3630|GT-C3780|GT-C5010|GT-C5212|GT-C6620|GT-C6625|GT-C6712|GT-E1050|GT-E1070|GT-E1075|GT-E1080|GT-E1081|GT-E1085|GT-E1087|GT-E1100|GT-E1107|GT-E1110|GT-E1120|GT-E1125|GT-E1130|GT-E1160|GT-E1170|GT-E1175|GT-E1180|GT-E1182|GT-E1200|GT-E1210|GT-E1225|GT-E1230|GT-E1390|GT-E2100|GT-E2120|GT-E2121|GT-E2152|GT-E2220|GT-E2222|GT-E2230|GT-E2232|GT-E2250|GT-E2370|GT-E2550|GT-E2652|GT-E3210|GT-E3213|GT-I5500|GT-I5503|GT-I5700|GT-I5800|GT-I5801|GT-I6410|GT-I6420|GT-I7110|GT-I7410|GT-I7500|GT-I8000|GT-I8150|GT-I8160|GT-I8190|GT-I8320|GT-I8330|GT-I8350|GT-I8530|GT-I8700|GT-I8703|GT-I8910|GT-I9000|GT-I9001|GT-I9003|GT-I9010|GT-I9020|GT-I9023|GT-I9070|GT-I9082|GT-I9100|GT-I9103|GT-I9220|GT-I9250|GT-I9300|GT-I9305|GT-I9500|GT-I9505|GT-M3510|GT-M5650|GT-M7500|GT-M7600|GT-M7603|GT-M8800|GT-M8910|GT-N7000|GT-S3110|GT-S3310|GT-S3350|GT-S3353|GT-S3370|GT-S3650|GT-S3653|GT-S3770|GT-S3850|GT-S5210|GT-S5220|GT-S5229|GT-S5230|GT-S5233|GT-S5250|GT-S5253|GT-S5260|GT-S5263|GT-S5270|GT-S5300|GT-S5330|GT-S5350|GT-S5360|GT-S5363|GT-S5369|GT-S5380|GT-S5380D|GT-S5560|GT-S5570|GT-S5600|GT-S5603|GT-S5610|GT-S5620|GT-S5660|GT-S5670|GT-S5690|GT-S5750|GT-S5780|GT-S5830|GT-S5839|GT-S6102|GT-S6500|GT-S7070|GT-S7200|GT-S7220|GT-S7230|GT-S7233|GT-S7250|GT-S7500|GT-S7530|GT-S7550|GT-S7562|GT-S7710|GT-S8000|GT-S8003|GT-S8500|GT-S8530|GT-S8600|SCH-A310|SCH-A530|SCH-A570|SCH-A610|SCH-A630|SCH-A650|SCH-A790|SCH-A795|SCH-A850|SCH-A870|SCH-A890|SCH-A930|SCH-A950|SCH-A970|SCH-A990|SCH-I100|SCH-I110|SCH-I400|SCH-I405|SCH-I500|SCH-I510|SCH-I515|SCH-I600|SCH-I730|SCH-I760|SCH-I770|SCH-I830|SCH-I910|SCH-I920|SCH-I959|SCH-LC11|SCH-N150|SCH-N300|SCH-R100|SCH-R300|SCH-R351|SCH-R400|SCH-R410|SCH-T300|SCH-U310|SCH-U320|SCH-U350|SCH-U360|SCH-U365|SCH-U370|SCH-U380|SCH-U410|SCH-U430|SCH-U450|SCH-U460|SCH-U470|SCH-U490|SCH-U540|SCH-U550|SCH-U620|SCH-U640|SCH-U650|SCH-U660|SCH-U700|SCH-U740|SCH-U750|SCH-U810|SCH-U820|SCH-U900|SCH-U940|SCH-U960|SCS-26UC|SGH-A107|SGH-A117|SGH-A127|SGH-A137|SGH-A157|SGH-A167|SGH-A177|SGH-A187|SGH-A197|SGH-A227|SGH-A237|SGH-A257|SGH-A437|SGH-A517|SGH-A597|SGH-A637|SGH-A657|SGH-A667|SGH-A687|SGH-A697|SGH-A707|SGH-A717|SGH-A727|SGH-A737|SGH-A747|SGH-A767|SGH-A777|SGH-A797|SGH-A817|SGH-A827|SGH-A837|SGH-A847|SGH-A867|SGH-A877|SGH-A887|SGH-A897|SGH-A927|SGH-B100|SGH-B130|SGH-B200|SGH-B220|SGH-C100|SGH-C110|SGH-C120|SGH-C130|SGH-C140|SGH-C160|SGH-C170|SGH-C180|SGH-C200|SGH-C207|SGH-C210|SGH-C225|SGH-C230|SGH-C417|SGH-C450|SGH-D307|SGH-D347|SGH-D357|SGH-D407|SGH-D415|SGH-D780|SGH-D807|SGH-D980|SGH-E105|SGH-E200|SGH-E315|SGH-E316|SGH-E317|SGH-E335|SGH-E590|SGH-E635|SGH-E715|SGH-E890|SGH-F300|SGH-F480|SGH-I200|SGH-I300|SGH-I320|SGH-I550|SGH-I577|SGH-I600|SGH-I607|SGH-I617|SGH-I627|SGH-I637|SGH-I677|SGH-I700|SGH-I717|SGH-I727|SGH-i747M|SGH-I777|SGH-I780|SGH-I827|SGH-I847|SGH-I857|SGH-I896|SGH-I897|SGH-I900|SGH-I907|SGH-I917|SGH-I927|SGH-I937|SGH-I997|SGH-J150|SGH-J200|SGH-L170|SGH-L700|SGH-M110|SGH-M150|SGH-M200|SGH-N105|SGH-N500|SGH-N600|SGH-N620|SGH-N625|SGH-N700|SGH-N710|SGH-P107|SGH-P207|SGH-P300|SGH-P310|SGH-P520|SGH-P735|SGH-P777|SGH-Q105|SGH-R210|SGH-R220|SGH-R225|SGH-S105|SGH-S307|SGH-T109|SGH-T119|SGH-T139|SGH-T209|SGH-T219|SGH-T229|SGH-T239|SGH-T249|SGH-T259|SGH-T309|SGH-T319|SGH-T329|SGH-T339|SGH-T349|SGH-T359|SGH-T369|SGH-T379|SGH-T409|SGH-T429|SGH-T439|SGH-T459|SGH-T469|SGH-T479|SGH-T499|SGH-T509|SGH-T519|SGH-T539|SGH-T559|SGH-T589|SGH-T609|SGH-T619|SGH-T629|SGH-T639|SGH-T659|SGH-T669|SGH-T679|SGH-T709|SGH-T719|SGH-T729|SGH-T739|SGH-T746|SGH-T749|SGH-T759|SGH-T769|SGH-T809|SGH-T819|SGH-T839|SGH-T919|SGH-T929|SGH-T939|SGH-T959|SGH-T989|SGH-U100|SGH-U200|SGH-U800|SGH-V205|SGH-V206|SGH-X100|SGH-X105|SGH-X120|SGH-X140|SGH-X426|SGH-X427|SGH-X475|SGH-X495|SGH-X497|SGH-X507|SGH-X600|SGH-X610|SGH-X620|SGH-X630|SGH-X700|SGH-X820|SGH-X890|SGH-Z130|SGH-Z150|SGH-Z170|SGH-ZX10|SGH-ZX20|SHW-M110|SPH-A120|SPH-A400|SPH-A420|SPH-A460|SPH-A500|SPH-A560|SPH-A600|SPH-A620|SPH-A660|SPH-A700|SPH-A740|SPH-A760|SPH-A790|SPH-A800|SPH-A820|SPH-A840|SPH-A880|SPH-A900|SPH-A940|SPH-A960|SPH-D600|SPH-D700|SPH-D710|SPH-D720|SPH-I300|SPH-I325|SPH-I330|SPH-I350|SPH-I500|SPH-I600|SPH-I700|SPH-L700|SPH-M100|SPH-M220|SPH-M240|SPH-M300|SPH-M305|SPH-M320|SPH-M330|SPH-M350|SPH-M360|SPH-M370|SPH-M380|SPH-M510|SPH-M540|SPH-M550|SPH-M560|SPH-M570|SPH-M580|SPH-M610|SPH-M620|SPH-M630|SPH-M800|SPH-M810|SPH-M850|SPH-M900|SPH-M910|SPH-M920|SPH-M930|SPH-N100|SPH-N200|SPH-N240|SPH-N300|SPH-N400|SPH-Z400|SWC-E100|SCH-i909|GT-N7100|GT-N7105|SCH-I535|SM-N900A|SGH-I317|SGH-T999L|GT-S5360B|GT-I8262|GT-S6802|GT-S6312|GT-S6310|GT-S5312|GT-S5310|GT-I9105|GT-I8510|GT-S6790N|SM-G7105|SM-N9005|GT-S5301|GT-I9295|GT-I9195|SM-C101|GT-S7392|GT-S7560|GT-B7610|GT-I5510|GT-S7582|GT-S7530E|GT-I8750|SM-G9006V|SM-G9008V|SM-G9009D|SM-G900A|SM-G900D|SM-G900F|SM-G900H|SM-G900I|SM-G900J|SM-G900K|SM-G900L|SM-G900M|SM-G900P|SM-G900R4|SM-G900S|SM-G900T|SM-G900V|SM-G900W8|SHV-E160K|SCH-P709|SCH-P729|SM-T2558|GT-I9205|SM-G9350|SM-J120F|SM-G920F|SM-G920V|SM-G930F|SM-N910C|SM-A310F|GT-I9190|SM-J500FN|SM-G903F',
174
- 'LG' => '\bLG\b;|LG[- ]?(C800|C900|E400|E610|E900|E-900|F160|F180K|F180L|F180S|730|855|L160|LS740|LS840|LS970|LU6200|MS690|MS695|MS770|MS840|MS870|MS910|P500|P700|P705|VM696|AS680|AS695|AX840|C729|E970|GS505|272|C395|E739BK|E960|L55C|L75C|LS696|LS860|P769BK|P350|P500|P509|P870|UN272|US730|VS840|VS950|LN272|LN510|LS670|LS855|LW690|MN270|MN510|P509|P769|P930|UN200|UN270|UN510|UN610|US670|US740|US760|UX265|UX840|VN271|VN530|VS660|VS700|VS740|VS750|VS910|VS920|VS930|VX9200|VX11000|AX840A|LW770|P506|P925|P999|E612|D955|D802|MS323)',
175
- 'Sony' => 'SonyST|SonyLT|SonyEricsson|SonyEricssonLT15iv|LT18i|E10i|LT28h|LT26w|SonyEricssonMT27i|C5303|C6902|C6903|C6906|C6943|D2533',
176
- 'Asus' => 'Asus.*Galaxy|PadFone.*Mobile',
177
- 'NokiaLumia' => 'Lumia [0-9]{3,4}',
178
- // http://www.micromaxinfo.com/mobiles/smartphones
179
- // Added because the codes might conflict with Acer Tablets.
180
- 'Micromax' => 'Micromax.*\b(A210|A92|A88|A72|A111|A110Q|A115|A116|A110|A90S|A26|A51|A35|A54|A25|A27|A89|A68|A65|A57|A90)\b',
181
- // @todo Complete the regex.
182
- 'Palm' => 'PalmSource|Palm', // avantgo|blazer|elaine|hiptop|plucker|xiino ;
183
- 'Vertu' => 'Vertu|Vertu.*Ltd|Vertu.*Ascent|Vertu.*Ayxta|Vertu.*Constellation(F|Quest)?|Vertu.*Monika|Vertu.*Signature', // Just for fun ;)
184
- // http://www.pantech.co.kr/en/prod/prodList.do?gbrand=VEGA (PANTECH)
185
- // Most of the VEGA devices are legacy. PANTECH seem to be newer devices based on Android.
186
- 'Pantech' => 'PANTECH|IM-A850S|IM-A840S|IM-A830L|IM-A830K|IM-A830S|IM-A820L|IM-A810K|IM-A810S|IM-A800S|IM-T100K|IM-A725L|IM-A780L|IM-A775C|IM-A770K|IM-A760S|IM-A750K|IM-A740S|IM-A730S|IM-A720L|IM-A710K|IM-A690L|IM-A690S|IM-A650S|IM-A630K|IM-A600S|VEGA PTL21|PT003|P8010|ADR910L|P6030|P6020|P9070|P4100|P9060|P5000|CDM8992|TXT8045|ADR8995|IS11PT|P2030|P6010|P8000|PT002|IS06|CDM8999|P9050|PT001|TXT8040|P2020|P9020|P2000|P7040|P7000|C790',
187
- // http://www.fly-phone.com/devices/smartphones/ ; Included only smartphones.
188
- 'Fly' => 'IQ230|IQ444|IQ450|IQ440|IQ442|IQ441|IQ245|IQ256|IQ236|IQ255|IQ235|IQ245|IQ275|IQ240|IQ285|IQ280|IQ270|IQ260|IQ250',
189
- // http://fr.wikomobile.com
190
- 'Wiko' => 'KITE 4G|HIGHWAY|GETAWAY|STAIRWAY|DARKSIDE|DARKFULL|DARKNIGHT|DARKMOON|SLIDE|WAX 4G|RAINBOW|BLOOM|SUNSET|GOA(?!nna)|LENNY|BARRY|IGGY|OZZY|CINK FIVE|CINK PEAX|CINK PEAX 2|CINK SLIM|CINK SLIM 2|CINK +|CINK KING|CINK PEAX|CINK SLIM|SUBLIM',
191
- 'iMobile' => 'i-mobile (IQ|i-STYLE|idea|ZAA|Hitz)',
192
- // Added simvalley mobile just for fun. They have some interesting devices.
193
- // http://www.simvalley.fr/telephonie---gps-_22_telephonie-mobile_telephones_.html
194
- 'SimValley' => '\b(SP-80|XT-930|SX-340|XT-930|SX-310|SP-360|SP60|SPT-800|SP-120|SPT-800|SP-140|SPX-5|SPX-8|SP-100|SPX-8|SPX-12)\b',
195
- // Wolfgang - a brand that is sold by Aldi supermarkets.
196
- // http://www.wolfgangmobile.com/
197
- 'Wolfgang' => 'AT-B24D|AT-AS50HD|AT-AS40W|AT-AS55HD|AT-AS45q2|AT-B26D|AT-AS50Q',
198
- 'Alcatel' => 'Alcatel',
199
- 'Nintendo' => 'Nintendo 3DS',
200
- // http://en.wikipedia.org/wiki/Amoi
201
- 'Amoi' => 'Amoi',
202
- // http://en.wikipedia.org/wiki/INQ
203
- 'INQ' => 'INQ',
204
- // @Tapatalk is a mobile app; http://support.tapatalk.com/threads/smf-2-0-2-os-and-browser-detection-plugin-and-tapatalk.15565/#post-79039
205
- 'GenericPhone' => 'Tapatalk|PDA;|SAGEM|\bmmp\b|pocket|\bpsp\b|symbian|Smartphone|smartfon|treo|up.browser|up.link|vodafone|\bwap\b|nokia|Series40|Series60|S60|SonyEricsson|N900|MAUI.*WAP.*Browser',
206
- );
207
-
208
- /**
209
- * List of tablet devices.
210
- *
211
- * @var array
212
- */
213
- protected static $tabletDevices = array(
214
- // @todo: check for mobile friendly emails topic.
215
- 'iPad' => 'iPad|iPad.*Mobile',
216
- // Removed |^.*Android.*Nexus(?!(?:Mobile).)*$
217
- // @see #442
218
- 'NexusTablet' => 'Android.*Nexus[\s]+(7|9|10)',
219
- 'SamsungTablet' => 'SAMSUNG.*Tablet|Galaxy.*Tab|SC-01C|GT-P1000|GT-P1003|GT-P1010|GT-P3105|GT-P6210|GT-P6800|GT-P6810|GT-P7100|GT-P7300|GT-P7310|GT-P7500|GT-P7510|SCH-I800|SCH-I815|SCH-I905|SGH-I957|SGH-I987|SGH-T849|SGH-T859|SGH-T869|SPH-P100|GT-P3100|GT-P3108|GT-P3110|GT-P5100|GT-P5110|GT-P6200|GT-P7320|GT-P7511|GT-N8000|GT-P8510|SGH-I497|SPH-P500|SGH-T779|SCH-I705|SCH-I915|GT-N8013|GT-P3113|GT-P5113|GT-P8110|GT-N8010|GT-N8005|GT-N8020|GT-P1013|GT-P6201|GT-P7501|GT-N5100|GT-N5105|GT-N5110|SHV-E140K|SHV-E140L|SHV-E140S|SHV-E150S|SHV-E230K|SHV-E230L|SHV-E230S|SHW-M180K|SHW-M180L|SHW-M180S|SHW-M180W|SHW-M300W|SHW-M305W|SHW-M380K|SHW-M380S|SHW-M380W|SHW-M430W|SHW-M480K|SHW-M480S|SHW-M480W|SHW-M485W|SHW-M486W|SHW-M500W|GT-I9228|SCH-P739|SCH-I925|GT-I9200|GT-P5200|GT-P5210|GT-P5210X|SM-T311|SM-T310|SM-T310X|SM-T210|SM-T210R|SM-T211|SM-P600|SM-P601|SM-P605|SM-P900|SM-P901|SM-T217|SM-T217A|SM-T217S|SM-P6000|SM-T3100|SGH-I467|XE500|SM-T110|GT-P5220|GT-I9200X|GT-N5110X|GT-N5120|SM-P905|SM-T111|SM-T2105|SM-T315|SM-T320|SM-T320X|SM-T321|SM-T520|SM-T525|SM-T530NU|SM-T230NU|SM-T330NU|SM-T900|XE500T1C|SM-P605V|SM-P905V|SM-T337V|SM-T537V|SM-T707V|SM-T807V|SM-P600X|SM-P900X|SM-T210X|SM-T230|SM-T230X|SM-T325|GT-P7503|SM-T531|SM-T330|SM-T530|SM-T705|SM-T705C|SM-T535|SM-T331|SM-T800|SM-T700|SM-T537|SM-T807|SM-P907A|SM-T337A|SM-T537A|SM-T707A|SM-T807A|SM-T237|SM-T807P|SM-P607T|SM-T217T|SM-T337T|SM-T807T|SM-T116NQ|SM-T116BU|SM-P550|SM-T350|SM-T550|SM-T9000|SM-P9000|SM-T705Y|SM-T805|GT-P3113|SM-T710|SM-T810|SM-T815|SM-T360|SM-T533|SM-T113|SM-T335|SM-T715|SM-T560|SM-T670|SM-T677|SM-T377|SM-T567|SM-T357T|SM-T555|SM-T561|SM-T713|SM-T719|SM-T813|SM-T819|SM-T580|SM-T355Y?|SM-T280|SM-T817A|SM-T820|SM-W700|SM-P580|SM-T587|SM-P350|SM-P555M|SM-P355M|SM-T113NU|SM-T815Y|SM-T585|SM-T285', // SCH-P709|SCH-P729|SM-T2558|GT-I9205 - Samsung Mega - treat them like a regular phone.
220
- // http://docs.aws.amazon.com/silk/latest/developerguide/user-agent.html
221
- 'Kindle' => 'Kindle|Silk.*Accelerated|Android.*\b(KFOT|KFTT|KFJWI|KFJWA|KFOTE|KFSOWI|KFTHWI|KFTHWA|KFAPWI|KFAPWA|WFJWAE|KFSAWA|KFSAWI|KFASWI|KFARWI|KFFOWI|KFGIWI|KFMEWI)\b|Android.*Silk/[0-9.]+ like Chrome/[0-9.]+ (?!Mobile)',
222
- // Only the Surface tablets with Windows RT are considered mobile.
223
- // http://msdn.microsoft.com/en-us/library/ie/hh920767(v=vs.85).aspx
224
- 'SurfaceTablet' => 'Windows NT [0-9.]+; ARM;.*(Tablet|ARMBJS)',
225
- // http://shopping1.hp.com/is-bin/INTERSHOP.enfinity/WFS/WW-USSMBPublicStore-Site/en_US/-/USD/ViewStandardCatalog-Browse?CatalogCategoryID=JfIQ7EN5lqMAAAEyDcJUDwMT
226
- 'HPTablet' => 'HP Slate (7|8|10)|HP ElitePad 900|hp-tablet|EliteBook.*Touch|HP 8|Slate 21|HP SlateBook 10',
227
- // Watch out for PadFone, see #132.
228
- // http://www.asus.com/de/Tablets_Mobile/Memo_Pad_Products/
229
- 'AsusTablet' => '^.*PadFone((?!Mobile).)*$|Transformer|TF101|TF101G|TF300T|TF300TG|TF300TL|TF700T|TF700KL|TF701T|TF810C|ME171|ME301T|ME302C|ME371MG|ME370T|ME372MG|ME172V|ME173X|ME400C|Slider SL101|\bK00F\b|\bK00C\b|\bK00E\b|\bK00L\b|TX201LA|ME176C|ME102A|\bM80TA\b|ME372CL|ME560CG|ME372CG|ME302KL| K010 | K011 | K017 | K01E |ME572C|ME103K|ME170C|ME171C|\bME70C\b|ME581C|ME581CL|ME8510C|ME181C|P01Y|PO1MA|P01Z|\bP027\b|\bP024\b',
230
- 'BlackBerryTablet' => 'PlayBook|RIM Tablet',
231
- 'HTCtablet' => 'HTC_Flyer_P512|HTC Flyer|HTC Jetstream|HTC-P715a|HTC EVO View 4G|PG41200|PG09410',
232
- 'MotorolaTablet' => 'xoom|sholest|MZ615|MZ605|MZ505|MZ601|MZ602|MZ603|MZ604|MZ606|MZ607|MZ608|MZ609|MZ615|MZ616|MZ617',
233
- 'NookTablet' => 'Android.*Nook|NookColor|nook browser|BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2',
234
- // http://www.acer.ro/ac/ro/RO/content/drivers
235
- // http://www.packardbell.co.uk/pb/en/GB/content/download (Packard Bell is part of Acer)
236
- // http://us.acer.com/ac/en/US/content/group/tablets
237
- // http://www.acer.de/ac/de/DE/content/models/tablets/
238
- // Can conflict with Micromax and Motorola phones codes.
239
- 'AcerTablet' => 'Android.*; \b(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700|A701|W500|W500P|W501|W501P|W510|W511|W700|G100|G100W|B1-A71|B1-710|B1-711|A1-810|A1-811|A1-830)\b|W3-810|\bA3-A10\b|\bA3-A11\b|\bA3-A20\b|\bA3-A30',
240
- // http://eu.computers.toshiba-europe.com/innovation/family/Tablets/1098744/banner_id/tablet_footerlink/
241
- // http://us.toshiba.com/tablets/tablet-finder
242
- // http://www.toshiba.co.jp/regza/tablet/
243
- 'ToshibaTablet' => 'Android.*(AT100|AT105|AT200|AT205|AT270|AT275|AT300|AT305|AT1S5|AT500|AT570|AT700|AT830)|TOSHIBA.*FOLIO',
244
- // http://www.nttdocomo.co.jp/english/service/developer/smart_phone/technical_info/spec/index.html
245
- // http://www.lg.com/us/tablets
246
- 'LGTablet' => '\bL-06C|LG-V909|LG-V900|LG-V700|LG-V510|LG-V500|LG-V410|LG-V400|LG-VK810\b',
247
- 'FujitsuTablet' => 'Android.*\b(F-01D|F-02F|F-05E|F-10D|M532|Q572)\b',
248
- // Prestigio Tablets http://www.prestigio.com/support
249
- 'PrestigioTablet' => 'PMP3170B|PMP3270B|PMP3470B|PMP7170B|PMP3370B|PMP3570C|PMP5870C|PMP3670B|PMP5570C|PMP5770D|PMP3970B|PMP3870C|PMP5580C|PMP5880D|PMP5780D|PMP5588C|PMP7280C|PMP7280C3G|PMP7280|PMP7880D|PMP5597D|PMP5597|PMP7100D|PER3464|PER3274|PER3574|PER3884|PER5274|PER5474|PMP5097CPRO|PMP5097|PMP7380D|PMP5297C|PMP5297C_QUAD|PMP812E|PMP812E3G|PMP812F|PMP810E|PMP880TD|PMT3017|PMT3037|PMT3047|PMT3057|PMT7008|PMT5887|PMT5001|PMT5002',
250
- // http://support.lenovo.com/en_GB/downloads/default.page?#
251
- 'LenovoTablet' => 'Lenovo TAB|Idea(Tab|Pad)( A1|A10| K1|)|ThinkPad([ ]+)?Tablet|YT3-850M|YT3-X90L|YT3-X90F|YT3-X90X|Lenovo.*(S2109|S2110|S5000|S6000|K3011|A3000|A3500|A1000|A2107|A2109|A1107|A5500|A7600|B6000|B8000|B8080)(-|)(FL|F|HV|H|)|TB-X103F|TB-X304F|TB-X304L|TB-8703F',
252
- // http://www.dell.com/support/home/us/en/04/Products/tab_mob/tablets
253
- 'DellTablet' => 'Venue 11|Venue 8|Venue 7|Dell Streak 10|Dell Streak 7',
254
- // http://www.yarvik.com/en/matrix/tablets/
255
- 'YarvikTablet' => 'Android.*\b(TAB210|TAB211|TAB224|TAB250|TAB260|TAB264|TAB310|TAB360|TAB364|TAB410|TAB411|TAB420|TAB424|TAB450|TAB460|TAB461|TAB464|TAB465|TAB467|TAB468|TAB07-100|TAB07-101|TAB07-150|TAB07-151|TAB07-152|TAB07-200|TAB07-201-3G|TAB07-210|TAB07-211|TAB07-212|TAB07-214|TAB07-220|TAB07-400|TAB07-485|TAB08-150|TAB08-200|TAB08-201-3G|TAB08-201-30|TAB09-100|TAB09-211|TAB09-410|TAB10-150|TAB10-201|TAB10-211|TAB10-400|TAB10-410|TAB13-201|TAB274EUK|TAB275EUK|TAB374EUK|TAB462EUK|TAB474EUK|TAB9-200)\b',
256
- 'MedionTablet' => 'Android.*\bOYO\b|LIFE.*(P9212|P9514|P9516|S9512)|LIFETAB',
257
- 'ArnovaTablet' => '97G4|AN10G2|AN7bG3|AN7fG3|AN8G3|AN8cG3|AN7G3|AN9G3|AN7dG3|AN7dG3ST|AN7dG3ChildPad|AN10bG3|AN10bG3DT|AN9G2',
258
- // http://www.intenso.de/kategorie_en.php?kategorie=33
259
- // @todo: http://www.nbhkdz.com/read/b8e64202f92a2df129126bff.html - investigate
260
- 'IntensoTablet' => 'INM8002KP|INM1010FP|INM805ND|Intenso Tab|TAB1004',
261
- // IRU.ru Tablets http://www.iru.ru/catalog/soho/planetable/
262
- 'IRUTablet' => 'M702pro',
263
- 'MegafonTablet' => 'MegaFon V9|\bZTE V9\b|Android.*\bMT7A\b',
264
- // http://www.e-boda.ro/tablete-pc.html
265
- 'EbodaTablet' => 'E-Boda (Supreme|Impresspeed|Izzycomm|Essential)',
266
- // http://www.allview.ro/produse/droseries/lista-tablete-pc/
267
- 'AllViewTablet' => 'Allview.*(Viva|Alldro|City|Speed|All TV|Frenzy|Quasar|Shine|TX1|AX1|AX2)',
268
- // http://wiki.archosfans.com/index.php?title=Main_Page
269
- // @note Rewrite the regex format after we add more UAs.
270
- 'ArchosTablet' => '\b(101G9|80G9|A101IT)\b|Qilive 97R|Archos5|\bARCHOS (70|79|80|90|97|101|FAMILYPAD|)(b|c|)(G10| Cobalt| TITANIUM(HD|)| Xenon| Neon|XSK| 2| XS 2| PLATINUM| CARBON|GAMEPAD)\b',
271
- // http://www.ainol.com/plugin.php?identifier=ainol&module=product
272
- 'AinolTablet' => 'NOVO7|NOVO8|NOVO10|Novo7Aurora|Novo7Basic|NOVO7PALADIN|novo9-Spark',
273
- 'NokiaLumiaTablet' => 'Lumia 2520',
274
- // @todo: inspect http://esupport.sony.com/US/p/select-system.pl?DIRECTOR=DRIVER
275
- // Readers http://www.atsuhiro-me.net/ebook/sony-reader/sony-reader-web-browser
276
- // http://www.sony.jp/support/tablet/
277
- 'SonyTablet' => 'Sony.*Tablet|Xperia Tablet|Sony Tablet S|SO-03E|SGPT12|SGPT13|SGPT114|SGPT121|SGPT122|SGPT123|SGPT111|SGPT112|SGPT113|SGPT131|SGPT132|SGPT133|SGPT211|SGPT212|SGPT213|SGP311|SGP312|SGP321|EBRD1101|EBRD1102|EBRD1201|SGP351|SGP341|SGP511|SGP512|SGP521|SGP541|SGP551|SGP621|SGP612|SOT31',
278
- // http://www.support.philips.com/support/catalog/worldproducts.jsp?userLanguage=en&userCountry=cn&categoryid=3G_LTE_TABLET_SU_CN_CARE&title=3G%20tablets%20/%20LTE%20range&_dyncharset=UTF-8
279
- 'PhilipsTablet' => '\b(PI2010|PI3000|PI3100|PI3105|PI3110|PI3205|PI3210|PI3900|PI4010|PI7000|PI7100)\b',
280
- // db + http://www.cube-tablet.com/buy-products.html
281
- 'CubeTablet' => 'Android.*(K8GT|U9GT|U10GT|U16GT|U17GT|U18GT|U19GT|U20GT|U23GT|U30GT)|CUBE U8GT',
282
- // http://www.cobyusa.com/?p=pcat&pcat_id=3001
283
- 'CobyTablet' => 'MID1042|MID1045|MID1125|MID1126|MID7012|MID7014|MID7015|MID7034|MID7035|MID7036|MID7042|MID7048|MID7127|MID8042|MID8048|MID8127|MID9042|MID9740|MID9742|MID7022|MID7010',
284
- // http://www.match.net.cn/products.asp
285
- 'MIDTablet' => 'M9701|M9000|M9100|M806|M1052|M806|T703|MID701|MID713|MID710|MID727|MID760|MID830|MID728|MID933|MID125|MID810|MID732|MID120|MID930|MID800|MID731|MID900|MID100|MID820|MID735|MID980|MID130|MID833|MID737|MID960|MID135|MID860|MID736|MID140|MID930|MID835|MID733|MID4X10',
286
- // http://www.msi.com/support
287
- // @todo Research the Windows Tablets.
288
- 'MSITablet' => 'MSI \b(Primo 73K|Primo 73L|Primo 81L|Primo 77|Primo 93|Primo 75|Primo 76|Primo 73|Primo 81|Primo 91|Primo 90|Enjoy 71|Enjoy 7|Enjoy 10)\b',
289
- // @todo http://www.kyoceramobile.com/support/drivers/
290
- // 'KyoceraTablet' => null,
291
- // @todo http://intexuae.com/index.php/category/mobile-devices/tablets-products/
292
- // 'IntextTablet' => null,
293
- // http://pdadb.net/index.php?m=pdalist&list=SMiT (NoName Chinese Tablets)
294
- // http://www.imp3.net/14/show.php?itemid=20454
295
- 'SMiTTablet' => 'Android.*(\bMID\b|MID-560|MTV-T1200|MTV-PND531|MTV-P1101|MTV-PND530)',
296
- // http://www.rock-chips.com/index.php?do=prod&pid=2
297
- 'RockChipTablet' => 'Android.*(RK2818|RK2808A|RK2918|RK3066)|RK2738|RK2808A',
298
- // http://www.fly-phone.com/devices/tablets/ ; http://www.fly-phone.com/service/
299
- 'FlyTablet' => 'IQ310|Fly Vision',
300
- // http://www.bqreaders.com/gb/tablets-prices-sale.html
301
- 'bqTablet' => 'Android.*(bq)?.*(Elcano|Curie|Edison|Maxwell|Kepler|Pascal|Tesla|Hypatia|Platon|Newton|Livingstone|Cervantes|Avant|Aquaris ([E|M]10|M8))|Maxwell.*Lite|Maxwell.*Plus',
302
- // http://www.huaweidevice.com/worldwide/productFamily.do?method=index&directoryId=5011&treeId=3290
303
- // http://www.huaweidevice.com/worldwide/downloadCenter.do?method=index&directoryId=3372&treeId=0&tb=1&type=software (including legacy tablets)
304
- 'HuaweiTablet' => 'MediaPad|MediaPad 7 Youth|IDEOS S7|S7-201c|S7-202u|S7-101|S7-103|S7-104|S7-105|S7-106|S7-201|S7-Slim|M2-A01L',
305
- // Nec or Medias Tab
306
- 'NecTablet' => '\bN-06D|\bN-08D',
307
- // Pantech Tablets: http://www.pantechusa.com/phones/
308
- 'PantechTablet' => 'Pantech.*P4100',
309
- // Broncho Tablets: http://www.broncho.cn/ (hard to find)
310
- 'BronchoTablet' => 'Broncho.*(N701|N708|N802|a710)',
311
- // http://versusuk.com/support.html
312
- 'VersusTablet' => 'TOUCHPAD.*[78910]|\bTOUCHTAB\b',
313
- // http://www.zync.in/index.php/our-products/tablet-phablets
314
- 'ZyncTablet' => 'z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900',
315
- // http://www.positivoinformatica.com.br/www/pessoal/tablet-ypy/
316
- 'PositivoTablet' => 'TB07STA|TB10STA|TB07FTA|TB10FTA',
317
- // https://www.nabitablet.com/
318
- 'NabiTablet' => 'Android.*\bNabi',
319
- 'KoboTablet' => 'Kobo Touch|\bK080\b|\bVox\b Build|\bArc\b Build',
320
- // French Danew Tablets http://www.danew.com/produits-tablette.php
321
- 'DanewTablet' => 'DSlide.*\b(700|701R|702|703R|704|802|970|971|972|973|974|1010|1012)\b',
322
- // Texet Tablets and Readers http://www.texet.ru/tablet/
323
- 'TexetTablet' => 'NaviPad|TB-772A|TM-7045|TM-7055|TM-9750|TM-7016|TM-7024|TM-7026|TM-7041|TM-7043|TM-7047|TM-8041|TM-9741|TM-9747|TM-9748|TM-9751|TM-7022|TM-7021|TM-7020|TM-7011|TM-7010|TM-7023|TM-7025|TM-7037W|TM-7038W|TM-7027W|TM-9720|TM-9725|TM-9737W|TM-1020|TM-9738W|TM-9740|TM-9743W|TB-807A|TB-771A|TB-727A|TB-725A|TB-719A|TB-823A|TB-805A|TB-723A|TB-715A|TB-707A|TB-705A|TB-709A|TB-711A|TB-890HD|TB-880HD|TB-790HD|TB-780HD|TB-770HD|TB-721HD|TB-710HD|TB-434HD|TB-860HD|TB-840HD|TB-760HD|TB-750HD|TB-740HD|TB-730HD|TB-722HD|TB-720HD|TB-700HD|TB-500HD|TB-470HD|TB-431HD|TB-430HD|TB-506|TB-504|TB-446|TB-436|TB-416|TB-146SE|TB-126SE',
324
- // Avoid detecting 'PLAYSTATION 3' as mobile.
325
- 'PlaystationTablet' => 'Playstation.*(Portable|Vita)',
326
- // http://www.trekstor.de/surftabs.html
327
- 'TrekstorTablet' => 'ST10416-1|VT10416-1|ST70408-1|ST702xx-1|ST702xx-2|ST80208|ST97216|ST70104-2|VT10416-2|ST10216-2A|SurfTab',
328
- // http://www.pyleaudio.com/Products.aspx?%2fproducts%2fPersonal-Electronics%2fTablets
329
- 'PyleAudioTablet' => '\b(PTBL10CEU|PTBL10C|PTBL72BC|PTBL72BCEU|PTBL7CEU|PTBL7C|PTBL92BC|PTBL92BCEU|PTBL9CEU|PTBL9CUK|PTBL9C)\b',
330
- // http://www.advandigital.com/index.php?link=content-product&jns=JP001
331
- // because of the short codenames we have to include whitespaces to reduce the possible conflicts.
332
- 'AdvanTablet' => 'Android.* \b(E3A|T3X|T5C|T5B|T3E|T3C|T3B|T1J|T1F|T2A|T1H|T1i|E1C|T1-E|T5-A|T4|E1-B|T2Ci|T1-B|T1-D|O1-A|E1-A|T1-A|T3A|T4i)\b ',
333
- // http://www.danytech.com/category/tablet-pc
334
- 'DanyTechTablet' => 'Genius Tab G3|Genius Tab S2|Genius Tab Q3|Genius Tab G4|Genius Tab Q4|Genius Tab G-II|Genius TAB GII|Genius TAB GIII|Genius Tab S1',
335
- // http://www.galapad.net/product.html
336
- 'GalapadTablet' => 'Android.*\bG1\b',
337
- // http://www.micromaxinfo.com/tablet/funbook
338
- 'MicromaxTablet' => 'Funbook|Micromax.*\b(P250|P560|P360|P362|P600|P300|P350|P500|P275)\b',
339
- // http://www.karbonnmobiles.com/products_tablet.php
340
- 'KarbonnTablet' => 'Android.*\b(A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2)\b',
341
- // http://www.myallfine.com/Products.asp
342
- 'AllFineTablet' => 'Fine7 Genius|Fine7 Shine|Fine7 Air|Fine8 Style|Fine9 More|Fine10 Joy|Fine11 Wide',
343
- // http://www.proscanvideo.com/products-search.asp?itemClass=TABLET&itemnmbr=
344
- 'PROSCANTablet' => '\b(PEM63|PLT1023G|PLT1041|PLT1044|PLT1044G|PLT1091|PLT4311|PLT4311PL|PLT4315|PLT7030|PLT7033|PLT7033D|PLT7035|PLT7035D|PLT7044K|PLT7045K|PLT7045KB|PLT7071KG|PLT7072|PLT7223G|PLT7225G|PLT7777G|PLT7810K|PLT7849G|PLT7851G|PLT7852G|PLT8015|PLT8031|PLT8034|PLT8036|PLT8080K|PLT8082|PLT8088|PLT8223G|PLT8234G|PLT8235G|PLT8816K|PLT9011|PLT9045K|PLT9233G|PLT9735|PLT9760G|PLT9770G)\b',
345
- // http://www.yonesnav.com/products/products.php
346
- 'YONESTablet' => 'BQ1078|BC1003|BC1077|RK9702|BC9730|BC9001|IT9001|BC7008|BC7010|BC708|BC728|BC7012|BC7030|BC7027|BC7026',
347
- // http://www.cjshowroom.com/eproducts.aspx?classcode=004001001
348
- // China manufacturer makes tablets for different small brands (eg. http://www.zeepad.net/index.html)
349
- 'ChangJiaTablet' => 'TPC7102|TPC7103|TPC7105|TPC7106|TPC7107|TPC7201|TPC7203|TPC7205|TPC7210|TPC7708|TPC7709|TPC7712|TPC7110|TPC8101|TPC8103|TPC8105|TPC8106|TPC8203|TPC8205|TPC8503|TPC9106|TPC9701|TPC97101|TPC97103|TPC97105|TPC97106|TPC97111|TPC97113|TPC97203|TPC97603|TPC97809|TPC97205|TPC10101|TPC10103|TPC10106|TPC10111|TPC10203|TPC10205|TPC10503',
350
- // http://www.gloryunion.cn/products.asp
351
- // http://www.allwinnertech.com/en/apply/mobile.html
352
- // http://www.ptcl.com.pk/pd_content.php?pd_id=284 (EVOTAB)
353
- // @todo: Softwiner tablets?
354
- // aka. Cute or Cool tablets. Not sure yet, must research to avoid collisions.
355
- 'GUTablet' => 'TX-A1301|TX-M9002|Q702|kf026', // A12R|D75A|D77|D79|R83|A95|A106C|R15|A75|A76|D71|D72|R71|R73|R77|D82|R85|D92|A97|D92|R91|A10F|A77F|W71F|A78F|W78F|W81F|A97F|W91F|W97F|R16G|C72|C73E|K72|K73|R96G
356
- // http://www.pointofview-online.com/showroom.php?shop_mode=product_listing&category_id=118
357
- 'PointOfViewTablet' => 'TAB-P506|TAB-navi-7-3G-M|TAB-P517|TAB-P-527|TAB-P701|TAB-P703|TAB-P721|TAB-P731N|TAB-P741|TAB-P825|TAB-P905|TAB-P925|TAB-PR945|TAB-PL1015|TAB-P1025|TAB-PI1045|TAB-P1325|TAB-PROTAB[0-9]+|TAB-PROTAB25|TAB-PROTAB26|TAB-PROTAB27|TAB-PROTAB26XL|TAB-PROTAB2-IPS9|TAB-PROTAB30-IPS9|TAB-PROTAB25XXL|TAB-PROTAB26-IPS10|TAB-PROTAB30-IPS10',
358
- // http://www.overmax.pl/pl/katalog-produktow,p8/tablety,c14/
359
- // @todo: add more tests.
360
- 'OvermaxTablet' => 'OV-(SteelCore|NewBase|Basecore|Baseone|Exellen|Quattor|EduTab|Solution|ACTION|BasicTab|TeddyTab|MagicTab|Stream|TB-08|TB-09)|Qualcore 1027',
361
- // http://hclmetablet.com/India/index.php
362
- 'HCLTablet' => 'HCL.*Tablet|Connect-3G-2.0|Connect-2G-2.0|ME Tablet U1|ME Tablet U2|ME Tablet G1|ME Tablet X1|ME Tablet Y2|ME Tablet Sync',
363
- // http://www.edigital.hu/Tablet_es_e-book_olvaso/Tablet-c18385.html
364
- 'DPSTablet' => 'DPS Dream 9|DPS Dual 7',
365
- // http://www.visture.com/index.asp
366
- 'VistureTablet' => 'V97 HD|i75 3G|Visture V4( HD)?|Visture V5( HD)?|Visture V10',
367
- // http://www.mijncresta.nl/tablet
368
- 'CrestaTablet' => 'CTP(-)?810|CTP(-)?818|CTP(-)?828|CTP(-)?838|CTP(-)?888|CTP(-)?978|CTP(-)?980|CTP(-)?987|CTP(-)?988|CTP(-)?989',
369
- // MediaTek - http://www.mediatek.com/_en/01_products/02_proSys.php?cata_sn=1&cata1_sn=1&cata2_sn=309
370
- 'MediatekTablet' => '\bMT8125|MT8389|MT8135|MT8377\b',
371
- // Concorde tab
372
- 'ConcordeTablet' => 'Concorde([ ]+)?Tab|ConCorde ReadMan',
373
- // GoClever Tablets - http://www.goclever.com/uk/products,c1/tablet,c5/
374
- 'GoCleverTablet' => 'GOCLEVER TAB|A7GOCLEVER|M1042|M7841|M742|R1042BK|R1041|TAB A975|TAB A7842|TAB A741|TAB A741L|TAB M723G|TAB M721|TAB A1021|TAB I921|TAB R721|TAB I720|TAB T76|TAB R70|TAB R76.2|TAB R106|TAB R83.2|TAB M813G|TAB I721|GCTA722|TAB I70|TAB I71|TAB S73|TAB R73|TAB R74|TAB R93|TAB R75|TAB R76.1|TAB A73|TAB A93|TAB A93.2|TAB T72|TAB R83|TAB R974|TAB R973|TAB A101|TAB A103|TAB A104|TAB A104.2|R105BK|M713G|A972BK|TAB A971|TAB R974.2|TAB R104|TAB R83.3|TAB A1042',
375
- // Modecom Tablets - http://www.modecom.eu/tablets/portal/
376
- 'ModecomTablet' => 'FreeTAB 9000|FreeTAB 7.4|FreeTAB 7004|FreeTAB 7800|FreeTAB 2096|FreeTAB 7.5|FreeTAB 1014|FreeTAB 1001 |FreeTAB 8001|FreeTAB 9706|FreeTAB 9702|FreeTAB 7003|FreeTAB 7002|FreeTAB 1002|FreeTAB 7801|FreeTAB 1331|FreeTAB 1004|FreeTAB 8002|FreeTAB 8014|FreeTAB 9704|FreeTAB 1003',
377
- // Vonino Tablets - http://www.vonino.eu/tablets
378
- 'VoninoTablet' => '\b(Argus[ _]?S|Diamond[ _]?79HD|Emerald[ _]?78E|Luna[ _]?70C|Onyx[ _]?S|Onyx[ _]?Z|Orin[ _]?HD|Orin[ _]?S|Otis[ _]?S|SpeedStar[ _]?S|Magnet[ _]?M9|Primus[ _]?94[ _]?3G|Primus[ _]?94HD|Primus[ _]?QS|Android.*\bQ8\b|Sirius[ _]?EVO[ _]?QS|Sirius[ _]?QS|Spirit[ _]?S)\b',
379
- // ECS Tablets - http://www.ecs.com.tw/ECSWebSite/Product/Product_Tablet_List.aspx?CategoryID=14&MenuID=107&childid=M_107&LanID=0
380
- 'ECSTablet' => 'V07OT2|TM105A|S10OT1|TR10CS1',
381
- // Storex Tablets - http://storex.fr/espace_client/support.html
382
- // @note: no need to add all the tablet codes since they are guided by the first regex.
383
- 'StorexTablet' => 'eZee[_\']?(Tab|Go)[0-9]+|TabLC7|Looney Tunes Tab',
384
- // Generic Vodafone tablets.
385
- 'VodafoneTablet' => 'SmartTab([ ]+)?[0-9]+|SmartTabII10|SmartTabII7|VF-1497',
386
- // French tablets - Essentiel B http://www.boulanger.fr/tablette_tactile_e-book/tablette_tactile_essentiel_b/cl_68908.htm?multiChoiceToDelete=brand&mc_brand=essentielb
387
- // Aka: http://www.essentielb.fr/
388
- 'EssentielBTablet' => 'Smart[ \']?TAB[ ]+?[0-9]+|Family[ \']?TAB2',
389
- // Ross & Moor - http://ross-moor.ru/
390
- 'RossMoorTablet' => 'RM-790|RM-997|RMD-878G|RMD-974R|RMT-705A|RMT-701|RME-601|RMT-501|RMT-711',
391
- // i-mobile http://product.i-mobilephone.com/Mobile_Device
392
- 'iMobileTablet' => 'i-mobile i-note',
393
- // http://www.tolino.de/de/vergleichen/
394
- 'TolinoTablet' => 'tolino tab [0-9.]+|tolino shine',
395
- // AudioSonic - a Kmart brand
396
- // http://www.kmart.com.au/webapp/wcs/stores/servlet/Search?langId=-1&storeId=10701&catalogId=10001&categoryId=193001&pageSize=72&currentPage=1&searchCategory=193001%2b4294965664&sortBy=p_MaxPrice%7c1
397
- 'AudioSonicTablet' => '\bC-22Q|T7-QC|T-17B|T-17P\b',
398
- // AMPE Tablets - http://www.ampe.com.my/product-category/tablets/
399
- // @todo: add them gradually to avoid conflicts.
400
- 'AMPETablet' => 'Android.* A78 ',
401
- // Skk Mobile - http://skkmobile.com.ph/product_tablets.php
402
- 'SkkTablet' => 'Android.* (SKYPAD|PHOENIX|CYCLOPS)',
403
- // Tecno Mobile (only tablet) - http://www.tecno-mobile.com/index.php/product?filterby=smart&list_order=all&page=1
404
- 'TecnoTablet' => 'TECNO P9',
405
- // JXD (consoles & tablets) - http://jxd.hk/products.asp?selectclassid=009008&clsid=3
406
- 'JXDTablet' => 'Android.* \b(F3000|A3300|JXD5000|JXD3000|JXD2000|JXD300B|JXD300|S5800|S7800|S602b|S5110b|S7300|S5300|S602|S603|S5100|S5110|S601|S7100a|P3000F|P3000s|P101|P200s|P1000m|P200m|P9100|P1000s|S6600b|S908|P1000|P300|S18|S6600|S9100)\b',
407
- // i-Joy tablets - http://www.i-joy.es/en/cat/products/tablets/
408
- 'iJoyTablet' => 'Tablet (Spirit 7|Essentia|Galatea|Fusion|Onix 7|Landa|Titan|Scooby|Deox|Stella|Themis|Argon|Unique 7|Sygnus|Hexen|Finity 7|Cream|Cream X2|Jade|Neon 7|Neron 7|Kandy|Scape|Saphyr 7|Rebel|Biox|Rebel|Rebel 8GB|Myst|Draco 7|Myst|Tab7-004|Myst|Tadeo Jones|Tablet Boing|Arrow|Draco Dual Cam|Aurix|Mint|Amity|Revolution|Finity 9|Neon 9|T9w|Amity 4GB Dual Cam|Stone 4GB|Stone 8GB|Andromeda|Silken|X2|Andromeda II|Halley|Flame|Saphyr 9,7|Touch 8|Planet|Triton|Unique 10|Hexen 10|Memphis 4GB|Memphis 8GB|Onix 10)',
409
- // http://www.intracon.eu/tablet
410
- 'FX2Tablet' => 'FX2 PAD7|FX2 PAD10',
411
- // http://www.xoro.de/produkte/
412
- // @note: Might be the same brand with 'Simply tablets'
413
- 'XoroTablet' => 'KidsPAD 701|PAD[ ]?712|PAD[ ]?714|PAD[ ]?716|PAD[ ]?717|PAD[ ]?718|PAD[ ]?720|PAD[ ]?721|PAD[ ]?722|PAD[ ]?790|PAD[ ]?792|PAD[ ]?900|PAD[ ]?9715D|PAD[ ]?9716DR|PAD[ ]?9718DR|PAD[ ]?9719QR|PAD[ ]?9720QR|TelePAD1030|Telepad1032|TelePAD730|TelePAD731|TelePAD732|TelePAD735Q|TelePAD830|TelePAD9730|TelePAD795|MegaPAD 1331|MegaPAD 1851|MegaPAD 2151',
414
- // http://www1.viewsonic.com/products/computing/tablets/
415
- 'ViewsonicTablet' => 'ViewPad 10pi|ViewPad 10e|ViewPad 10s|ViewPad E72|ViewPad7|ViewPad E100|ViewPad 7e|ViewSonic VB733|VB100a',
416
- // https://www.verizonwireless.com/tablets/verizon/
417
- 'VerizonTablet' => 'QTAQZ3|QTAIR7|QTAQTZ3|QTASUN1|QTASUN2|QTAXIA1',
418
- // http://www.odys.de/web/internet-tablet_en.html
419
- 'OdysTablet' => 'LOOX|XENO10|ODYS[ -](Space|EVO|Xpress|NOON)|\bXELIO\b|Xelio10Pro|XELIO7PHONETAB|XELIO10EXTREME|XELIOPT2|NEO_QUAD10',
420
- // http://www.captiva-power.de/products.html#tablets-en
421
- 'CaptivaTablet' => 'CAPTIVA PAD',
422
- // IconBIT - http://www.iconbit.com/products/tablets/
423
- 'IconbitTablet' => 'NetTAB|NT-3702|NT-3702S|NT-3702S|NT-3603P|NT-3603P|NT-0704S|NT-0704S|NT-3805C|NT-3805C|NT-0806C|NT-0806C|NT-0909T|NT-0909T|NT-0907S|NT-0907S|NT-0902S|NT-0902S',
424
- // http://www.teclast.com/topic.php?channelID=70&topicID=140&pid=63
425
- 'TeclastTablet' => 'T98 4G|\bP80\b|\bX90HD\b|X98 Air|X98 Air 3G|\bX89\b|P80 3G|\bX80h\b|P98 Air|\bX89HD\b|P98 3G|\bP90HD\b|P89 3G|X98 3G|\bP70h\b|P79HD 3G|G18d 3G|\bP79HD\b|\bP89s\b|\bA88\b|\bP10HD\b|\bP19HD\b|G18 3G|\bP78HD\b|\bA78\b|\bP75\b|G17s 3G|G17h 3G|\bP85t\b|\bP90\b|\bP11\b|\bP98t\b|\bP98HD\b|\bG18d\b|\bP85s\b|\bP11HD\b|\bP88s\b|\bA80HD\b|\bA80se\b|\bA10h\b|\bP89\b|\bP78s\b|\bG18\b|\bP85\b|\bA70h\b|\bA70\b|\bG17\b|\bP18\b|\bA80s\b|\bA11s\b|\bP88HD\b|\bA80h\b|\bP76s\b|\bP76h\b|\bP98\b|\bA10HD\b|\bP78\b|\bP88\b|\bA11\b|\bA10t\b|\bP76a\b|\bP76t\b|\bP76e\b|\bP85HD\b|\bP85a\b|\bP86\b|\bP75HD\b|\bP76v\b|\bA12\b|\bP75a\b|\bA15\b|\bP76Ti\b|\bP81HD\b|\bA10\b|\bT760VE\b|\bT720HD\b|\bP76\b|\bP73\b|\bP71\b|\bP72\b|\bT720SE\b|\bC520Ti\b|\bT760\b|\bT720VE\b|T720-3GE|T720-WiFi',
426
- // Onda - http://www.onda-tablet.com/buy-android-onda.html?dir=desc&limit=all&order=price
427
- 'OndaTablet' => '\b(V975i|Vi30|VX530|V701|Vi60|V701s|Vi50|V801s|V719|Vx610w|VX610W|V819i|Vi10|VX580W|Vi10|V711s|V813|V811|V820w|V820|Vi20|V711|VI30W|V712|V891w|V972|V819w|V820w|Vi60|V820w|V711|V813s|V801|V819|V975s|V801|V819|V819|V818|V811|V712|V975m|V101w|V961w|V812|V818|V971|V971s|V919|V989|V116w|V102w|V973|Vi40)\b[\s]+',
428
- 'JaytechTablet' => 'TPC-PA762',
429
- 'BlaupunktTablet' => 'Endeavour 800NG|Endeavour 1010',
430
- // http://www.digma.ru/support/download/
431
- // @todo: Ebooks also (if requested)
432
- 'DigmaTablet' => '\b(iDx10|iDx9|iDx8|iDx7|iDxD7|iDxD8|iDsQ8|iDsQ7|iDsQ8|iDsD10|iDnD7|3TS804H|iDsQ11|iDj7|iDs10)\b',
433
- // http://www.evolioshop.com/ro/tablete-pc.html
434
- // http://www.evolio.ro/support/downloads_static.html?cat=2
435
- // @todo: Research some more
436
- 'EvolioTablet' => 'ARIA_Mini_wifi|Aria[ _]Mini|Evolio X10|Evolio X7|Evolio X8|\bEvotab\b|\bNeura\b',
437
- // @todo http://www.lavamobiles.com/tablets-data-cards
438
- 'LavaTablet' => 'QPAD E704|\bIvoryS\b|E-TAB IVORY|\bE-TAB\b',
439
- // http://www.breezetablet.com/
440
- 'AocTablet' => 'MW0811|MW0812|MW0922|MTK8382|MW1031|MW0831|MW0821|MW0931|MW0712',
441
- // http://www.mpmaneurope.com/en/products/internet-tablets-14/android-tablets-14/
442
- 'MpmanTablet' => 'MP11 OCTA|MP10 OCTA|MPQC1114|MPQC1004|MPQC994|MPQC974|MPQC973|MPQC804|MPQC784|MPQC780|\bMPG7\b|MPDCG75|MPDCG71|MPDC1006|MP101DC|MPDC9000|MPDC905|MPDC706HD|MPDC706|MPDC705|MPDC110|MPDC100|MPDC99|MPDC97|MPDC88|MPDC8|MPDC77|MP709|MID701|MID711|MID170|MPDC703|MPQC1010',
443
- // https://www.celkonmobiles.com/?_a=categoryphones&sid=2
444
- 'CelkonTablet' => 'CT695|CT888|CT[\s]?910|CT7 Tab|CT9 Tab|CT3 Tab|CT2 Tab|CT1 Tab|C820|C720|\bCT-1\b',
445
- // http://www.wolderelectronics.com/productos/manuales-y-guias-rapidas/categoria-2-miTab
446
- 'WolderTablet' => 'miTab \b(DIAMOND|SPACE|BROOKLYN|NEO|FLY|MANHATTAN|FUNK|EVOLUTION|SKY|GOCAR|IRON|GENIUS|POP|MINT|EPSILON|BROADWAY|JUMP|HOP|LEGEND|NEW AGE|LINE|ADVANCE|FEEL|FOLLOW|LIKE|LINK|LIVE|THINK|FREEDOM|CHICAGO|CLEVELAND|BALTIMORE-GH|IOWA|BOSTON|SEATTLE|PHOENIX|DALLAS|IN 101|MasterChef)\b',
447
- // http://www.mi.com/en
448
- 'MiTablet' => '\bMI PAD\b|\bHM NOTE 1W\b',
449
- // http://www.nbru.cn/index.html
450
- 'NibiruTablet' => 'Nibiru M1|Nibiru Jupiter One',
451
- // http://navroad.com/products/produkty/tablety/
452
- // http://navroad.com/products/produkty/tablety/
453
- 'NexoTablet' => 'NEXO NOVA|NEXO 10|NEXO AVIO|NEXO FREE|NEXO GO|NEXO EVO|NEXO 3G|NEXO SMART|NEXO KIDDO|NEXO MOBI',
454
- // http://leader-online.com/new_site/product-category/tablets/
455
- // http://www.leader-online.net.au/List/Tablet
456
- 'LeaderTablet' => 'TBLT10Q|TBLT10I|TBL-10WDKB|TBL-10WDKBO2013|TBL-W230V2|TBL-W450|TBL-W500|SV572|TBLT7I|TBA-AC7-8G|TBLT79|TBL-8W16|TBL-10W32|TBL-10WKB|TBL-W100',
457
- // http://www.datawind.com/ubislate/
458
- 'UbislateTablet' => 'UbiSlate[\s]?7C',
459
- // http://www.pocketbook-int.com/ru/support
460
- 'PocketBookTablet' => 'Pocketbook',
461
- // http://www.kocaso.com/product_tablet.html
462
- 'KocasoTablet' => '\b(TB-1207)\b',
463
- // http://global.hisense.com/product/asia/tablet/Sero7/201412/t20141215_91832.htm
464
- 'HisenseTablet' => '\b(F5281|E2371)\b',
465
- // http://www.tesco.com/direct/hudl/
466
- 'Hudl' => 'Hudl HT7S3|Hudl 2',
467
- // http://www.telstra.com.au/home-phone/thub-2/
468
- 'TelstraTablet' => 'T-Hub2',
469
- 'GenericTablet' => 'Android.*\b97D\b|Tablet(?!.*PC)|BNTV250A|MID-WCDMA|LogicPD Zoom2|\bA7EB\b|CatNova8|A1_07|CT704|CT1002|\bM721\b|rk30sdk|\bEVOTAB\b|M758A|ET904|ALUMIUM10|Smartfren Tab|Endeavour 1010|Tablet-PC-4|Tagi Tab|\bM6pro\b|CT1020W|arc 10HD|\bTP750\b|\bQTAQZ3\b'
470
- );
471
-
472
- /**
473
- * List of mobile Operating Systems.
474
- *
475
- * @var array
476
- */
477
- protected static $operatingSystems = array(
478
- 'AndroidOS' => 'Android',
479
- 'BlackBerryOS' => 'blackberry|\bBB10\b|rim tablet os',
480
- 'PalmOS' => 'PalmOS|avantgo|blazer|elaine|hiptop|palm|plucker|xiino',
481
- 'SymbianOS' => 'Symbian|SymbOS|Series60|Series40|SYB-[0-9]+|\bS60\b',
482
- // @reference: http://en.wikipedia.org/wiki/Windows_Mobile
483
- 'WindowsMobileOS' => 'Windows CE.*(PPC|Smartphone|Mobile|[0-9]{3}x[0-9]{3})|Window Mobile|Windows Phone [0-9.]+|WCE;',
484
- // @reference: http://en.wikipedia.org/wiki/Windows_Phone
485
- // http://wifeng.cn/?r=blog&a=view&id=106
486
- // http://nicksnettravels.builttoroam.com/post/2011/01/10/Bogus-Windows-Phone-7-User-Agent-String.aspx
487
- // http://msdn.microsoft.com/library/ms537503.aspx
488
- // https://msdn.microsoft.com/en-us/library/hh869301(v=vs.85).aspx
489
- 'WindowsPhoneOS' => 'Windows Phone 10.0|Windows Phone 8.1|Windows Phone 8.0|Windows Phone OS|XBLWP7|ZuneWP7|Windows NT 6.[23]; ARM;',
490
- 'iOS' => '\biPhone.*Mobile|\biPod|\biPad|AppleCoreMedia',
491
- // http://en.wikipedia.org/wiki/MeeGo
492
- // @todo: research MeeGo in UAs
493
- 'MeeGoOS' => 'MeeGo',
494
- // http://en.wikipedia.org/wiki/Maemo
495
- // @todo: research Maemo in UAs
496
- 'MaemoOS' => 'Maemo',
497
- 'JavaOS' => 'J2ME/|\bMIDP\b|\bCLDC\b', // '|Java/' produces bug #135
498
- 'webOS' => 'webOS|hpwOS',
499
- 'badaOS' => '\bBada\b',
500
- 'BREWOS' => 'BREW',
501
- );
502
-
503
- /**
504
- * List of mobile User Agents.
505
- *
506
- * IMPORTANT: This is a list of only mobile browsers.
507
- * Mobile Detect 2.x supports only mobile browsers,
508
- * it was never designed to detect all browsers.
509
- * The change will come in 2017 in the 3.x release for PHP7.
510
- *
511
- * @var array
512
- */
513
- protected static $browsers = array(
514
- //'Vivaldi' => 'Vivaldi',
515
- // @reference: https://developers.google.com/chrome/mobile/docs/user-agent
516
- 'Chrome' => '\bCrMo\b|CriOS|Android.*Chrome/[.0-9]* (Mobile)?',
517
- 'Dolfin' => '\bDolfin\b',
518
- 'Opera' => 'Opera.*Mini|Opera.*Mobi|Android.*Opera|Mobile.*OPR/[0-9.]+|Coast/[0-9.]+',
519
- 'Skyfire' => 'Skyfire',
520
- 'Edge' => 'Mobile Safari/[.0-9]* Edge',
521
- 'IE' => 'IEMobile|MSIEMobile', // |Trident/[.0-9]+
522
- 'Firefox' => 'fennec|firefox.*maemo|(Mobile|Tablet).*Firefox|Firefox.*Mobile|FxiOS',
523
- 'Bolt' => 'bolt',
524
- 'TeaShark' => 'teashark',
525
- 'Blazer' => 'Blazer',
526
- // @reference: http://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariWebContent/OptimizingforSafarioniPhone/OptimizingforSafarioniPhone.html#//apple_ref/doc/uid/TP40006517-SW3
527
- 'Safari' => 'Version.*Mobile.*Safari|Safari.*Mobile|MobileSafari',
528
- // http://en.wikipedia.org/wiki/Midori_(web_browser)
529
- //'Midori' => 'midori',
530
- //'Tizen' => 'Tizen',
531
- 'UCBrowser' => 'UC.*Browser|UCWEB',
532
- 'baiduboxapp' => 'baiduboxapp',
533
- 'baidubrowser' => 'baidubrowser',
534
- // https://github.com/serbanghita/Mobile-Detect/issues/7
535
- 'DiigoBrowser' => 'DiigoBrowser',
536
- // http://www.puffinbrowser.com/index.php
537
- 'Puffin' => 'Puffin',
538
- // http://mercury-browser.com/index.html
539
- 'Mercury' => '\bMercury\b',
540
- // http://en.wikipedia.org/wiki/Obigo_Browser
541
- 'ObigoBrowser' => 'Obigo',
542
- // http://en.wikipedia.org/wiki/NetFront
543
- 'NetFront' => 'NF-Browser',
544
- // @reference: http://en.wikipedia.org/wiki/Minimo
545
- // http://en.wikipedia.org/wiki/Vision_Mobile_Browser
546
- 'GenericBrowser' => 'NokiaBrowser|OviBrowser|OneBrowser|TwonkyBeamBrowser|SEMC.*Browser|FlyFlow|Minimo|NetFront|Novarra-Vision|MQQBrowser|MicroMessenger',
547
- // @reference: https://en.wikipedia.org/wiki/Pale_Moon_(web_browser)
548
- 'PaleMoon' => 'Android.*PaleMoon|Mobile.*PaleMoon',
549
- );
550
-
551
- /**
552
- * Utilities.
553
- *
554
- * @var array
555
- */
556
- protected static $utilities = array(
557
- // Experimental. When a mobile device wants to switch to 'Desktop Mode'.
558
- // http://scottcate.com/technology/windows-phone-8-ie10-desktop-or-mobile/
559
- // https://github.com/serbanghita/Mobile-Detect/issues/57#issuecomment-15024011
560
- // https://developers.facebook.com/docs/sharing/best-practices
561
- 'Bot' => 'Googlebot|facebookexternalhit|AdsBot-Google|Google Keyword Suggestion|Facebot|YandexBot|YandexMobileBot|bingbot|ia_archiver|AhrefsBot|Ezooms|GSLFbot|WBSearchBot|Twitterbot|TweetmemeBot|Twikle|PaperLiBot|Wotbox|UnwindFetchor|Exabot|MJ12bot|YandexImages|TurnitinBot|Pingdom',
562
- 'MobileBot' => 'Googlebot-Mobile|AdsBot-Google-Mobile|YahooSeeker/M1A1-R2D2',
563
- 'DesktopMode' => 'WPDesktop',
564
- 'TV' => 'SonyDTV|HbbTV', // experimental
565
- 'WebKit' => '(webkit)[ /]([\w.]+)',
566
- // @todo: Include JXD consoles.
567
- 'Console' => '\b(Nintendo|Nintendo WiiU|Nintendo 3DS|PLAYSTATION|Xbox)\b',
568
- 'Watch' => 'SM-V700',
569
- );
570
-
571
- /**
572
- * All possible HTTP headers that represent the
573
- * User-Agent string.
574
- *
575
- * @var array
576
- */
577
- protected static $uaHttpHeaders = array(
578
- // The default User-Agent string.
579
- 'HTTP_USER_AGENT',
580
- // Header can occur on devices using Opera Mini.
581
- 'HTTP_X_OPERAMINI_PHONE_UA',
582
- // Vodafone specific header: http://www.seoprinciple.com/mobile-web-community-still-angry-at-vodafone/24/
583
- 'HTTP_X_DEVICE_USER_AGENT',
584
- 'HTTP_X_ORIGINAL_USER_AGENT',
585
- 'HTTP_X_SKYFIRE_PHONE',
586
- 'HTTP_X_BOLT_PHONE_UA',
587
- 'HTTP_DEVICE_STOCK_UA',
588
- 'HTTP_X_UCBROWSER_DEVICE_UA'
589
- );
590
-
591
- /**
592
- * The individual segments that could exist in a User-Agent string. VER refers to the regular
593
- * expression defined in the constant self::VER.
594
- *
595
- * @var array
596
- */
597
- protected static $properties = array(
598
-
599
- // Build
600
- 'Mobile' => 'Mobile/[VER]',
601
- 'Build' => 'Build/[VER]',
602
- 'Version' => 'Version/[VER]',
603
- 'VendorID' => 'VendorID/[VER]',
604
-
605
- // Devices
606
- 'iPad' => 'iPad.*CPU[a-z ]+[VER]',
607
- 'iPhone' => 'iPhone.*CPU[a-z ]+[VER]',
608
- 'iPod' => 'iPod.*CPU[a-z ]+[VER]',
609
- //'BlackBerry' => array('BlackBerry[VER]', 'BlackBerry [VER];'),
610
- 'Kindle' => 'Kindle/[VER]',
611
-
612
- // Browser
613
- 'Chrome' => array('Chrome/[VER]', 'CriOS/[VER]', 'CrMo/[VER]'),
614
- 'Coast' => array('Coast/[VER]'),
615
- 'Dolfin' => 'Dolfin/[VER]',
616
- // @reference: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent/Firefox
617
- 'Firefox' => array('Firefox/[VER]', 'FxiOS/[VER]'),
618
- 'Fennec' => 'Fennec/[VER]',
619
- // http://msdn.microsoft.com/en-us/library/ms537503(v=vs.85).aspx
620
- // https://msdn.microsoft.com/en-us/library/ie/hh869301(v=vs.85).aspx
621
- 'Edge' => 'Edge/[VER]',
622
- 'IE' => array('IEMobile/[VER];', 'IEMobile [VER]', 'MSIE [VER];', 'Trident/[0-9.]+;.*rv:[VER]'),
623
- // http://en.wikipedia.org/wiki/NetFront
624
- 'NetFront' => 'NetFront/[VER]',
625
- 'NokiaBrowser' => 'NokiaBrowser/[VER]',
626
- 'Opera' => array( ' OPR/[VER]', 'Opera Mini/[VER]', 'Version/[VER]' ),
627
- 'Opera Mini' => 'Opera Mini/[VER]',
628
- 'Opera Mobi' => 'Version/[VER]',
629
- 'UCBrowser' => array( 'UCWEB[VER]', 'UC.*Browser/[VER]' ),
630
- 'MQQBrowser' => 'MQQBrowser/[VER]',
631
- 'MicroMessenger' => 'MicroMessenger/[VER]',
632
- 'baiduboxapp' => 'baiduboxapp/[VER]',
633
- 'baidubrowser' => 'baidubrowser/[VER]',
634
- 'SamsungBrowser' => 'SamsungBrowser/[VER]',
635
- 'Iron' => 'Iron/[VER]',
636
- // @note: Safari 7534.48.3 is actually Version 5.1.
637
- // @note: On BlackBerry the Version is overwriten by the OS.
638
- 'Safari' => array( 'Version/[VER]', 'Safari/[VER]' ),
639
- 'Skyfire' => 'Skyfire/[VER]',
640
- 'Tizen' => 'Tizen/[VER]',
641
- 'Webkit' => 'webkit[ /][VER]',
642
- 'PaleMoon' => 'PaleMoon/[VER]',
643
-
644
- // Engine
645
- 'Gecko' => 'Gecko/[VER]',
646
- 'Trident' => 'Trident/[VER]',
647
- 'Presto' => 'Presto/[VER]',
648
- 'Goanna' => 'Goanna/[VER]',
649
-
650
- // OS
651
- 'iOS' => ' \bi?OS\b [VER][ ;]{1}',
652
- 'Android' => 'Android [VER]',
653
- 'BlackBerry' => array('BlackBerry[\w]+/[VER]', 'BlackBerry.*Version/[VER]', 'Version/[VER]'),
654
- 'BREW' => 'BREW [VER]',
655
- 'Java' => 'Java/[VER]',
656
- // @reference: http://windowsteamblog.com/windows_phone/b/wpdev/archive/2011/08/29/introducing-the-ie9-on-windows-phone-mango-user-agent-string.aspx
657
- // @reference: http://en.wikipedia.org/wiki/Windows_NT#Releases
658
- 'Windows Phone OS' => array( 'Windows Phone OS [VER]', 'Windows Phone [VER]'),
659
- 'Windows Phone' => 'Windows Phone [VER]',
660
- 'Windows CE' => 'Windows CE/[VER]',
661
- // http://social.msdn.microsoft.com/Forums/en-US/windowsdeveloperpreviewgeneral/thread/6be392da-4d2f-41b4-8354-8dcee20c85cd
662
- 'Windows NT' => 'Windows NT [VER]',
663
- 'Symbian' => array('SymbianOS/[VER]', 'Symbian/[VER]'),
664
- 'webOS' => array('webOS/[VER]', 'hpwOS/[VER];'),
665
- );
666
-
667
- /**
668
- * Construct an instance of this class.
669
- *
670
- * @param array $headers Specify the headers as injection. Should be PHP _SERVER flavored.
671
- * If left empty, will use the global _SERVER['HTTP_*'] vars instead.
672
- * @param string $userAgent Inject the User-Agent header. If null, will use HTTP_USER_AGENT
673
- * from the $headers array instead.
674
- */
675
- public function __construct(
676
- array $headers = null,
677
- $userAgent = null
678
- ) {
679
- $this->setHttpHeaders($headers);
680
- $this->setUserAgent($userAgent);
681
- }
682
-
683
- /**
684
- * Get the current script version.
685
- * This is useful for the demo.php file,
686
- * so people can check on what version they are testing
687
- * for mobile devices.
688
- *
689
- * @return string The version number in semantic version format.
690
- */
691
- public static function getScriptVersion()
692
- {
693
- return self::VERSION;
694
- }
695
-
696
- /**
697
- * Set the HTTP Headers. Must be PHP-flavored. This method will reset existing headers.
698
- *
699
- * @param array $httpHeaders The headers to set. If null, then using PHP's _SERVER to extract
700
- * the headers. The default null is left for backwards compatibility.
701
- */
702
- public function setHttpHeaders($httpHeaders = null)
703
- {
704
- // use global _SERVER if $httpHeaders aren't defined
705
- if (!is_array($httpHeaders) || !count($httpHeaders)) {
706
- $httpHeaders = $_SERVER;
707
- }
708
-
709
- // clear existing headers
710
- $this->httpHeaders = array();
711
-
712
- // Only save HTTP headers. In PHP land, that means only _SERVER vars that
713
- // start with HTTP_.
714
- foreach ($httpHeaders as $key => $value) {
715
- if (substr($key, 0, 5) === 'HTTP_') {
716
- $this->httpHeaders[$key] = $value;
717
- }
718
- }
719
-
720
- // In case we're dealing with CloudFront, we need to know.
721
- $this->setCfHeaders($httpHeaders);
722
- }
723
-
724
- /**
725
- * Retrieves the HTTP headers.
726
- *
727
- * @return array
728
- */
729
- public function getHttpHeaders()
730
- {
731
- return $this->httpHeaders;
732
- }
733
-
734
- /**
735
- * Retrieves a particular header. If it doesn't exist, no exception/error is caused.
736
- * Simply null is returned.
737
- *
738
- * @param string $header The name of the header to retrieve. Can be HTTP compliant such as
739
- * "User-Agent" or "X-Device-User-Agent" or can be php-esque with the
740
- * all-caps, HTTP_ prefixed, underscore seperated awesomeness.
741
- *
742
- * @return string|null The value of the header.
743
- */
744
- public function getHttpHeader($header)
745
- {
746
- // are we using PHP-flavored headers?
747
- if (strpos($header, '_') === false) {
748
- $header = str_replace('-', '_', $header);
749
- $header = strtoupper($header);
750
- }
751
-
752
- // test the alternate, too
753
- $altHeader = 'HTTP_' . $header;
754
-
755
- //Test both the regular and the HTTP_ prefix
756
- if (isset($this->httpHeaders[$header])) {
757
- return $this->httpHeaders[$header];
758
- } elseif (isset($this->httpHeaders[$altHeader])) {
759
- return $this->httpHeaders[$altHeader];
760
- }
761
-
762
- return null;
763
- }
764
-
765
- public function getMobileHeaders()
766
- {
767
- return self::$mobileHeaders;
768
- }
769
-
770
- /**
771
- * Get all possible HTTP headers that
772
- * can contain the User-Agent string.
773
- *
774
- * @return array List of HTTP headers.
775
- */
776
- public function getUaHttpHeaders()
777
- {
778
- return self::$uaHttpHeaders;
779
- }
780
-
781
-
782
- /**
783
- * Set CloudFront headers
784
- * http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/header-caching.html#header-caching-web-device
785
- *
786
- * @param array $cfHeaders List of HTTP headers
787
- *
788
- * @return boolean If there were CloudFront headers to be set
789
- */
790
- public function setCfHeaders($cfHeaders = null) {
791
- // use global _SERVER if $cfHeaders aren't defined
792
- if (!is_array($cfHeaders) || !count($cfHeaders)) {
793
- $cfHeaders = $_SERVER;
794
- }
795
-
796
- // clear existing headers
797
- $this->cloudfrontHeaders = array();
798
-
799
- // Only save CLOUDFRONT headers. In PHP land, that means only _SERVER vars that
800
- // start with cloudfront-.
801
- $response = false;
802
- foreach ($cfHeaders as $key => $value) {
803
- if (substr(strtolower($key), 0, 16) === 'http_cloudfront_') {
804
- $this->cloudfrontHeaders[strtoupper($key)] = $value;
805
- $response = true;
806
- }
807
- }
808
-
809
- return $response;
810
- }
811
-
812
- /**
813
- * Retrieves the cloudfront headers.
814
- *
815
- * @return array
816
- */
817
- public function getCfHeaders()
818
- {
819
- return $this->cloudfrontHeaders;
820
- }
821
-
822
- /**
823
- * @param string $userAgent
824
- * @return string
825
- */
826
- private function prepareUserAgent($userAgent) {
827
- $userAgent = trim($userAgent);
828
- $userAgent = substr($userAgent, 0, 500);
829
- return $userAgent;
830
- }
831
-
832
- /**
833
- * Set the User-Agent to be used.
834
- *
835
- * @param string $userAgent The user agent string to set.
836
- *
837
- * @return string|null
838
- */
839
- public function setUserAgent($userAgent = null)
840
- {
841
- // Invalidate cache due to #375
842
- $this->cache = array();
843
-
844
- if (false === empty($userAgent)) {
845
- return $this->userAgent = $this->prepareUserAgent($userAgent);
846
- } else {
847
- $this->userAgent = null;
848
- foreach ($this->getUaHttpHeaders() as $altHeader) {
849
- if (false === empty($this->httpHeaders[$altHeader])) { // @todo: should use getHttpHeader(), but it would be slow. (Serban)
850
- $this->userAgent .= $this->httpHeaders[$altHeader] . " ";
851
- }
852
- }
853
-
854
- if (!empty($this->userAgent)) {
855
- return $this->userAgent = $this->prepareUserAgent($this->userAgent);
856
- }
857
- }
858
-
859
- if (count($this->getCfHeaders()) > 0) {
860
- return $this->userAgent = 'Amazon CloudFront';
861
- }
862
- return $this->userAgent = null;
863
- }
864
-
865
- /**
866
- * Retrieve the User-Agent.
867
- *
868
- * @return string|null The user agent if it's set.
869
- */
870
- public function getUserAgent()
871
- {
872
- return $this->userAgent;
873
- }
874
-
875
- /**
876
- * Set the detection type. Must be one of self::DETECTION_TYPE_MOBILE or
877
- * self::DETECTION_TYPE_EXTENDED. Otherwise, nothing is set.
878
- *
879
- * @deprecated since version 2.6.9
880
- *
881
- * @param string $type The type. Must be a self::DETECTION_TYPE_* constant. The default
882
- * parameter is null which will default to self::DETECTION_TYPE_MOBILE.
883
- */
884
- public function setDetectionType($type = null)
885
- {
886
- if ($type === null) {
887
- $type = self::DETECTION_TYPE_MOBILE;
888
- }
889
-
890
- if ($type !== self::DETECTION_TYPE_MOBILE && $type !== self::DETECTION_TYPE_EXTENDED) {
891
- return;
892
- }
893
-
894
- $this->detectionType = $type;
895
- }
896
-
897
- public function getMatchingRegex()
898
- {
899
- return $this->matchingRegex;
900
- }
901
-
902
- public function getMatchesArray()
903
- {
904
- return $this->matchesArray;
905
- }
906
-
907
- /**
908
- * Retrieve the list of known phone devices.
909
- *
910
- * @return array List of phone devices.
911
- */
912
- public static function getPhoneDevices()
913
- {
914
- return self::$phoneDevices;
915
- }
916
-
917
- /**
918
- * Retrieve the list of known tablet devices.
919
- *
920
- * @return array List of tablet devices.
921
- */
922
- public static function getTabletDevices()
923
- {
924
- return self::$tabletDevices;
925
- }
926
-
927
- /**
928
- * Alias for getBrowsers() method.
929
- *
930
- * @return array List of user agents.
931
- */
932
- public static function getUserAgents()
933
- {
934
- return self::getBrowsers();
935
- }
936
-
937
- /**
938
- * Retrieve the list of known browsers. Specifically, the user agents.
939
- *
940
- * @return array List of browsers / user agents.
941
- */
942
- public static function getBrowsers()
943
- {
944
- return self::$browsers;
945
- }
946
-
947
- /**
948
- * Retrieve the list of known utilities.
949
- *
950
- * @return array List of utilities.
951
- */
952
- public static function getUtilities()
953
- {
954
- return self::$utilities;
955
- }
956
-
957
- /**
958
- * Method gets the mobile detection rules. This method is used for the magic methods $detect->is*().
959
- *
960
- * @deprecated since version 2.6.9
961
- *
962
- * @return array All the rules (but not extended).
963
- */
964
- public static function getMobileDetectionRules()
965
- {
966
- static $rules;
967
-
968
- if (!$rules) {
969
- $rules = array_merge(
970
- self::$phoneDevices,
971
- self::$tabletDevices,
972
- self::$operatingSystems,
973
- self::$browsers
974
- );
975
- }
976
-
977
- return $rules;
978
-
979
- }
980
-
981
- /**
982
- * Method gets the mobile detection rules + utilities.
983
- * The reason this is separate is because utilities rules
984
- * don't necessary imply mobile. This method is used inside
985
- * the new $detect->is('stuff') method.
986
- *
987
- * @deprecated since version 2.6.9
988
- *
989
- * @return array All the rules + extended.
990
- */
991
- public function getMobileDetectionRulesExtended()
992
- {
993
- static $rules;
994
-
995
- if (!$rules) {
996
- // Merge all rules together.
997
- $rules = array_merge(
998
- self::$phoneDevices,
999
- self::$tabletDevices,
1000
- self::$operatingSystems,
1001
- self::$browsers,
1002
- self::$utilities
1003
- );
1004
- }
1005
-
1006
- return $rules;
1007
- }
1008
-
1009
- /**
1010
- * Retrieve the current set of rules.
1011
- *
1012
- * @deprecated since version 2.6.9
1013
- *
1014
- * @return array
1015
- */
1016
- public function getRules()
1017
- {
1018
- if ($this->detectionType == self::DETECTION_TYPE_EXTENDED) {
1019
- return self::getMobileDetectionRulesExtended();
1020
- } else {
1021
- return self::getMobileDetectionRules();
1022
- }
1023
- }
1024
-
1025
- /**
1026
- * Retrieve the list of mobile operating systems.
1027
- *
1028
- * @return array The list of mobile operating systems.
1029
- */
1030
- public static function getOperatingSystems()
1031
- {
1032
- return self::$operatingSystems;
1033
- }
1034
-
1035
- /**
1036
- * Check the HTTP headers for signs of mobile.
1037
- * This is the fastest mobile check possible; it's used
1038
- * inside isMobile() method.
1039
- *
1040
- * @return bool
1041
- */
1042
- public function checkHttpHeadersForMobile()
1043
- {
1044
-
1045
- foreach ($this->getMobileHeaders() as $mobileHeader => $matchType) {
1046
- if (isset($this->httpHeaders[$mobileHeader])) {
1047
- if (is_array($matchType['matches'])) {
1048
- foreach ($matchType['matches'] as $_match) {
1049
- if (strpos($this->httpHeaders[$mobileHeader], $_match) !== false) {
1050
- return true;
1051
- }
1052
- }
1053
-
1054
- return false;
1055
- } else {
1056
- return true;
1057
- }
1058
- }
1059
- }
1060
-
1061
- return false;
1062
-
1063
- }
1064
-
1065
- /**
1066
- * Magic overloading method.
1067
- *
1068
- * @method boolean is[...]()
1069
- * @param string $name
1070
- * @param array $arguments
1071
- * @return mixed
1072
- * @throws BadMethodCallException when the method doesn't exist and doesn't start with 'is'
1073
- */
1074
- public function __call($name, $arguments)
1075
- {
1076
- // make sure the name starts with 'is', otherwise
1077
- if (substr($name, 0, 2) !== 'is') {
1078
- throw new BadMethodCallException("No such method exists: $name");
1079
- }
1080
-
1081
- $this->setDetectionType(self::DETECTION_TYPE_MOBILE);
1082
-
1083
- $key = substr($name, 2);
1084
-
1085
- return $this->matchUAAgainstKey($key);
1086
- }
1087
-
1088
- /**
1089
- * Find a detection rule that matches the current User-agent.
1090
- *
1091
- * @param null $userAgent deprecated
1092
- * @return boolean
1093
- */
1094
- protected function matchDetectionRulesAgainstUA($userAgent = null)
1095
- {
1096
- // Begin general search.
1097
- foreach ($this->getRules() as $_regex) {
1098
- if (empty($_regex)) {
1099
- continue;
1100
- }
1101
-
1102
- if ($this->match($_regex, $userAgent)) {
1103
- return true;
1104
- }
1105
- }
1106
-
1107
- return false;
1108
- }
1109
-
1110
- /**
1111
- * Search for a certain key in the rules array.
1112
- * If the key is found then try to match the corresponding
1113
- * regex against the User-Agent.
1114
- *
1115
- * @param string $key
1116
- *
1117
- * @return boolean
1118
- */
1119
- protected function matchUAAgainstKey($key)
1120
- {
1121
- // Make the keys lowercase so we can match: isIphone(), isiPhone(), isiphone(), etc.
1122
- $key = strtolower($key);
1123
- if (false === isset($this->cache[$key])) {
1124
-
1125
- // change the keys to lower case
1126
- $_rules = array_change_key_case($this->getRules());
1127
-
1128
- if (false === empty($_rules[$key])) {
1129
- $this->cache[$key] = $this->match($_rules[$key]);
1130
- }
1131
-
1132
- if (false === isset($this->cache[$key])) {
1133
- $this->cache[$key] = false;
1134
- }
1135
- }
1136
-
1137
- return $this->cache[$key];
1138
- }
1139
-
1140
- /**
1141
- * Check if the device is mobile.
1142
- * Returns true if any type of mobile device detected, including special ones
1143
- * @param null $userAgent deprecated
1144
- * @param null $httpHeaders deprecated
1145
- * @return bool
1146
- */
1147
- public function isMobile($userAgent = null, $httpHeaders = null)
1148
- {
1149
-
1150
- if ($httpHeaders) {
1151
- $this->setHttpHeaders($httpHeaders);
1152
- }
1153
-
1154
- if ($userAgent) {
1155
- $this->setUserAgent($userAgent);
1156
- }
1157
-
1158
- // Check specifically for cloudfront headers if the useragent === 'Amazon CloudFront'
1159
- if ($this->getUserAgent() === 'Amazon CloudFront') {
1160
- $cfHeaders = $this->getCfHeaders();
1161
- if(array_key_exists('HTTP_CLOUDFRONT_IS_MOBILE_VIEWER', $cfHeaders) && $cfHeaders['HTTP_CLOUDFRONT_IS_MOBILE_VIEWER'] === 'true') {
1162
- return true;
1163
- }
1164
- }
1165
-
1166
- $this->setDetectionType(self::DETECTION_TYPE_MOBILE);
1167
-
1168
- if ($this->checkHttpHeadersForMobile()) {
1169
- return true;
1170
- } else {
1171
- return $this->matchDetectionRulesAgainstUA();
1172
- }
1173
-
1174
- }
1175
-
1176
- /**
1177
- * Check if the device is a tablet.
1178
- * Return true if any type of tablet device is detected.
1179
- *
1180
- * @param string $userAgent deprecated
1181
- * @param array $httpHeaders deprecated
1182
- * @return bool
1183
- */
1184
- public function isTablet($userAgent = null, $httpHeaders = null)
1185
- {
1186
- // Check specifically for cloudfront headers if the useragent === 'Amazon CloudFront'
1187
- if ($this->getUserAgent() === 'Amazon CloudFront') {
1188
- $cfHeaders = $this->getCfHeaders();
1189
- if(array_key_exists('HTTP_CLOUDFRONT_IS_TABLET_VIEWER', $cfHeaders) && $cfHeaders['HTTP_CLOUDFRONT_IS_TABLET_VIEWER'] === 'true') {
1190
- return true;
1191
- }
1192
- }
1193
-
1194
- $this->setDetectionType(self::DETECTION_TYPE_MOBILE);
1195
-
1196
- foreach (self::$tabletDevices as $_regex) {
1197
- if ($this->match($_regex, $userAgent)) {
1198
- return true;
1199
- }
1200
- }
1201
-
1202
- return false;
1203
- }
1204
-
1205
- /**
1206
- * This method checks for a certain property in the
1207
- * userAgent.
1208
- * @todo: The httpHeaders part is not yet used.
1209
- *
1210
- * @param string $key
1211
- * @param string $userAgent deprecated
1212
- * @param string $httpHeaders deprecated
1213
- * @return bool|int|null
1214
- */
1215
- public function is($key, $userAgent = null, $httpHeaders = null)
1216
- {
1217
- // Set the UA and HTTP headers only if needed (eg. batch mode).
1218
- if ($httpHeaders) {
1219
- $this->setHttpHeaders($httpHeaders);
1220
- }
1221
-
1222
- if ($userAgent) {
1223
- $this->setUserAgent($userAgent);
1224
- }
1225
-
1226
- $this->setDetectionType(self::DETECTION_TYPE_EXTENDED);
1227
-
1228
- return $this->matchUAAgainstKey($key);
1229
- }
1230
-
1231
- /**
1232
- * Some detection rules are relative (not standard),
1233
- * because of the diversity of devices, vendors and
1234
- * their conventions in representing the User-Agent or
1235
- * the HTTP headers.
1236
- *
1237
- * This method will be used to check custom regexes against
1238
- * the User-Agent string.
1239
- *
1240
- * @param $regex
1241
- * @param string $userAgent
1242
- * @return bool
1243
- *
1244
- * @todo: search in the HTTP headers too.
1245
- */
1246
- public function match($regex, $userAgent = null)
1247
- {
1248
- $match = (bool) preg_match(sprintf('#%s#is', $regex), (false === empty($userAgent) ? $userAgent : $this->userAgent), $matches);
1249
- // If positive match is found, store the results for debug.
1250
- if ($match) {
1251
- $this->matchingRegex = $regex;
1252
- $this->matchesArray = $matches;
1253
- }
1254
-
1255
- return $match;
1256
- }
1257
-
1258
- /**
1259
- * Get the properties array.
1260
- *
1261
- * @return array
1262
- */
1263
- public static function getProperties()
1264
- {
1265
- return self::$properties;
1266
- }
1267
-
1268
- /**
1269
- * Prepare the version number.
1270
- *
1271
- * @todo Remove the error supression from str_replace() call.
1272
- *
1273
- * @param string $ver The string version, like "2.6.21.2152";
1274
- *
1275
- * @return float
1276
- */
1277
- public function prepareVersionNo($ver)
1278
- {
1279
- $ver = str_replace(array('_', ' ', '/'), '.', $ver);
1280
- $arrVer = explode('.', $ver, 2);
1281
-
1282
- if (isset($arrVer[1])) {
1283
- $arrVer[1] = @str_replace('.', '', $arrVer[1]); // @todo: treat strings versions.
1284
- }
1285
-
1286
- return (float) implode('.', $arrVer);
1287
- }
1288
-
1289
- /**
1290
- * Check the version of the given property in the User-Agent.
1291
- * Will return a float number. (eg. 2_0 will return 2.0, 4.3.1 will return 4.31)
1292
- *
1293
- * @param string $propertyName The name of the property. See self::getProperties() array
1294
- * keys for all possible properties.
1295
- * @param string $type Either self::VERSION_TYPE_STRING to get a string value or
1296
- * self::VERSION_TYPE_FLOAT indicating a float value. This parameter
1297
- * is optional and defaults to self::VERSION_TYPE_STRING. Passing an
1298
- * invalid parameter will default to the this type as well.
1299
- *
1300
- * @return string|float The version of the property we are trying to extract.
1301
- */
1302
- public function version($propertyName, $type = self::VERSION_TYPE_STRING)
1303
- {
1304
- if (empty($propertyName)) {
1305
- return false;
1306
- }
1307
-
1308
- // set the $type to the default if we don't recognize the type
1309
- if ($type !== self::VERSION_TYPE_STRING && $type !== self::VERSION_TYPE_FLOAT) {
1310
- $type = self::VERSION_TYPE_STRING;
1311
- }
1312
-
1313
- $properties = self::getProperties();
1314
-
1315
- // Check if the property exists in the properties array.
1316
- if (true === isset($properties[$propertyName])) {
1317
-
1318
- // Prepare the pattern to be matched.
1319
- // Make sure we always deal with an array (string is converted).
1320
- $properties[$propertyName] = (array) $properties[$propertyName];
1321
-
1322
- foreach ($properties[$propertyName] as $propertyMatchString) {
1323
-
1324
- $propertyPattern = str_replace('[VER]', self::VER, $propertyMatchString);
1325
-
1326
- // Identify and extract the version.
1327
- preg_match(sprintf('#%s#is', $propertyPattern), $this->userAgent, $match);
1328
-
1329
- if (false === empty($match[1])) {
1330
- $version = ($type == self::VERSION_TYPE_FLOAT ? $this->prepareVersionNo($match[1]) : $match[1]);
1331
-
1332
- return $version;
1333
- }
1334
-
1335
- }
1336
-
1337
- }
1338
-
1339
- return false;
1340
- }
1341
-
1342
- /**
1343
- * Retrieve the mobile grading, using self::MOBILE_GRADE_* constants.
1344
- *
1345
- * @return string One of the self::MOBILE_GRADE_* constants.
1346
- */
1347
- public function mobileGrade()
1348
- {
1349
- $isMobile = $this->isMobile();
1350
-
1351
- if (
1352
- // Apple iOS 4-7.0 – Tested on the original iPad (4.3 / 5.0), iPad 2 (4.3 / 5.1 / 6.1), iPad 3 (5.1 / 6.0), iPad Mini (6.1), iPad Retina (7.0), iPhone 3GS (4.3), iPhone 4 (4.3 / 5.1), iPhone 4S (5.1 / 6.0), iPhone 5 (6.0), and iPhone 5S (7.0)
1353
- $this->is('iOS') && $this->version('iPad', self::VERSION_TYPE_FLOAT) >= 4.3 ||
1354
- $this->is('iOS') && $this->version('iPhone', self::VERSION_TYPE_FLOAT) >= 4.3 ||
1355
- $this->is('iOS') && $this->version('iPod', self::VERSION_TYPE_FLOAT) >= 4.3 ||
1356
-
1357
- // Android 2.1-2.3 - Tested on the HTC Incredible (2.2), original Droid (2.2), HTC Aria (2.1), Google Nexus S (2.3). Functional on 1.5 & 1.6 but performance may be sluggish, tested on Google G1 (1.5)
1358
- // Android 3.1 (Honeycomb) - Tested on the Samsung Galaxy Tab 10.1 and Motorola XOOM
1359
- // Android 4.0 (ICS) - Tested on a Galaxy Nexus. Note: transition performance can be poor on upgraded devices
1360
- // Android 4.1 (Jelly Bean) - Tested on a Galaxy Nexus and Galaxy 7
1361
- ( $this->version('Android', self::VERSION_TYPE_FLOAT)>2.1 && $this->is('Webkit') ) ||
1362
-
1363
- // Windows Phone 7.5-8 - Tested on the HTC Surround (7.5), HTC Trophy (7.5), LG-E900 (7.5), Nokia 800 (7.8), HTC Mazaa (7.8), Nokia Lumia 520 (8), Nokia Lumia 920 (8), HTC 8x (8)
1364
- $this->version('Windows Phone OS', self::VERSION_TYPE_FLOAT) >= 7.5 ||
1365
-
1366
- // Tested on the Torch 9800 (6) and Style 9670 (6), BlackBerry® Torch 9810 (7), BlackBerry Z10 (10)
1367
- $this->is('BlackBerry') && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT) >= 6.0 ||
1368
- // Blackberry Playbook (1.0-2.0) - Tested on PlayBook
1369
- $this->match('Playbook.*Tablet') ||
1370
-
1371
- // Palm WebOS (1.4-3.0) - Tested on the Palm Pixi (1.4), Pre (1.4), Pre 2 (2.0), HP TouchPad (3.0)
1372
- ( $this->version('webOS', self::VERSION_TYPE_FLOAT) >= 1.4 && $this->match('Palm|Pre|Pixi') ) ||
1373
- // Palm WebOS 3.0 - Tested on HP TouchPad
1374
- $this->match('hp.*TouchPad') ||
1375
-
1376
- // Firefox Mobile 18 - Tested on Android 2.3 and 4.1 devices
1377
- ( $this->is('Firefox') && $this->version('Firefox', self::VERSION_TYPE_FLOAT) >= 18 ) ||
1378
-
1379
- // Chrome for Android - Tested on Android 4.0, 4.1 device
1380
- ( $this->is('Chrome') && $this->is('AndroidOS') && $this->version('Android', self::VERSION_TYPE_FLOAT) >= 4.0 ) ||
1381
-
1382
- // Skyfire 4.1 - Tested on Android 2.3 device
1383
- ( $this->is('Skyfire') && $this->version('Skyfire', self::VERSION_TYPE_FLOAT) >= 4.1 && $this->is('AndroidOS') && $this->version('Android', self::VERSION_TYPE_FLOAT) >= 2.3 ) ||
1384
-
1385
- // Opera Mobile 11.5-12: Tested on Android 2.3
1386
- ( $this->is('Opera') && $this->version('Opera Mobi', self::VERSION_TYPE_FLOAT) >= 11.5 && $this->is('AndroidOS') ) ||
1387
-
1388
- // Meego 1.2 - Tested on Nokia 950 and N9
1389
- $this->is('MeeGoOS') ||
1390
-
1391
- // Tizen (pre-release) - Tested on early hardware
1392
- $this->is('Tizen') ||
1393
-
1394
- // Samsung Bada 2.0 - Tested on a Samsung Wave 3, Dolphin browser
1395
- // @todo: more tests here!
1396
- $this->is('Dolfin') && $this->version('Bada', self::VERSION_TYPE_FLOAT) >= 2.0 ||
1397
-
1398
- // UC Browser - Tested on Android 2.3 device
1399
- ( ($this->is('UC Browser') || $this->is('Dolfin')) && $this->version('Android', self::VERSION_TYPE_FLOAT) >= 2.3 ) ||
1400
-
1401
- // Kindle 3 and Fire - Tested on the built-in WebKit browser for each
1402
- ( $this->match('Kindle Fire') ||
1403
- $this->is('Kindle') && $this->version('Kindle', self::VERSION_TYPE_FLOAT) >= 3.0 ) ||
1404
-
1405
- // Nook Color 1.4.1 - Tested on original Nook Color, not Nook Tablet
1406
- $this->is('AndroidOS') && $this->is('NookTablet') ||
1407
-
1408
- // Chrome Desktop 16-24 - Tested on OS X 10.7 and Windows 7
1409
- $this->version('Chrome', self::VERSION_TYPE_FLOAT) >= 16 && !$isMobile ||
1410
-
1411
- // Safari Desktop 5-6 - Tested on OS X 10.7 and Windows 7
1412
- $this->version('Safari', self::VERSION_TYPE_FLOAT) >= 5.0 && !$isMobile ||
1413
-
1414
- // Firefox Desktop 10-18 - Tested on OS X 10.7 and Windows 7
1415
- $this->version('Firefox', self::VERSION_TYPE_FLOAT) >= 10.0 && !$isMobile ||
1416
-
1417
- // Internet Explorer 7-9 - Tested on Windows XP, Vista and 7
1418
- $this->version('IE', self::VERSION_TYPE_FLOAT) >= 7.0 && !$isMobile ||
1419
-
1420
- // Opera Desktop 10-12 - Tested on OS X 10.7 and Windows 7
1421
- $this->version('Opera', self::VERSION_TYPE_FLOAT) >= 10 && !$isMobile
1422
- ){
1423
- return self::MOBILE_GRADE_A;
1424
- }
1425
-
1426
- if (
1427
- $this->is('iOS') && $this->version('iPad', self::VERSION_TYPE_FLOAT)<4.3 ||
1428
- $this->is('iOS') && $this->version('iPhone', self::VERSION_TYPE_FLOAT)<4.3 ||
1429
- $this->is('iOS') && $this->version('iPod', self::VERSION_TYPE_FLOAT)<4.3 ||
1430
-
1431
- // Blackberry 5.0: Tested on the Storm 2 9550, Bold 9770
1432
- $this->is('Blackberry') && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT) >= 5 && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT)<6 ||
1433
-
1434
- //Opera Mini (5.0-6.5) - Tested on iOS 3.2/4.3 and Android 2.3
1435
- ($this->version('Opera Mini', self::VERSION_TYPE_FLOAT) >= 5.0 && $this->version('Opera Mini', self::VERSION_TYPE_FLOAT) <= 7.0 &&
1436
- ($this->version('Android', self::VERSION_TYPE_FLOAT) >= 2.3 || $this->is('iOS')) ) ||
1437
-
1438
- // Nokia Symbian^3 - Tested on Nokia N8 (Symbian^3), C7 (Symbian^3), also works on N97 (Symbian^1)
1439
- $this->match('NokiaN8|NokiaC7|N97.*Series60|Symbian/3') ||
1440
-
1441
- // @todo: report this (tested on Nokia N71)
1442
- $this->version('Opera Mobi', self::VERSION_TYPE_FLOAT) >= 11 && $this->is('SymbianOS')
1443
- ){
1444
- return self::MOBILE_GRADE_B;
1445
- }
1446
-
1447
- if (
1448
- // Blackberry 4.x - Tested on the Curve 8330
1449
- $this->version('BlackBerry', self::VERSION_TYPE_FLOAT) <= 5.0 ||
1450
- // Windows Mobile - Tested on the HTC Leo (WinMo 5.2)
1451
- $this->match('MSIEMobile|Windows CE.*Mobile') || $this->version('Windows Mobile', self::VERSION_TYPE_FLOAT) <= 5.2 ||
1452
-
1453
- // Tested on original iPhone (3.1), iPhone 3 (3.2)
1454
- $this->is('iOS') && $this->version('iPad', self::VERSION_TYPE_FLOAT) <= 3.2 ||
1455
- $this->is('iOS') && $this->version('iPhone', self::VERSION_TYPE_FLOAT) <= 3.2 ||
1456
- $this->is('iOS') && $this->version('iPod', self::VERSION_TYPE_FLOAT) <= 3.2 ||
1457
-
1458
- // Internet Explorer 7 and older - Tested on Windows XP
1459
- $this->version('IE', self::VERSION_TYPE_FLOAT) <= 7.0 && !$isMobile
1460
- ){
1461
- return self::MOBILE_GRADE_C;
1462
- }
1463
-
1464
- // All older smartphone platforms and featurephones - Any device that doesn't support media queries
1465
- // will receive the basic, C grade experience.
1466
- return self::MOBILE_GRADE_C;
1467
- }
1468
- }
1
+ <?php
2
+ /**
3
+ * Mobile Detect Library
4
+ * Motto: "Every business should have a mobile detection script to detect mobile readers"
5
+ *
6
+ * Mobile_Detect is a lightweight PHP class for detecting mobile devices (including tablets).
7
+ * It uses the User-Agent string combined with specific HTTP headers to detect the mobile environment.
8
+ *
9
+ * Homepage: http://mobiledetect.net
10
+ * GitHub: https://github.com/serbanghita/Mobile-Detect
11
+ * README: https://github.com/serbanghita/Mobile-Detect/blob/master/README.md
12
+ * CONTRIBUTING: https://github.com/serbanghita/Mobile-Detect/blob/master/docs/CONTRIBUTING.md
13
+ * KNOWN LIMITATIONS: https://github.com/serbanghita/Mobile-Detect/blob/master/docs/KNOWN_LIMITATIONS.md
14
+ * EXAMPLES: https://github.com/serbanghita/Mobile-Detect/wiki/Code-examples
15
+ *
16
+ * @license https://github.com/serbanghita/Mobile-Detect/blob/master/LICENSE.txt MIT License
17
+ * @author Serban Ghita <serbanghita@gmail.com>
18
+ * @author Nick Ilyin <nick.ilyin@gmail.com>
19
+ * Original author: Victor Stanciu <vic.stanciu@gmail.com>
20
+ *
21
+ * @version 2.8.31
22
+ */
23
+ class Mobile_Detect
24
+ {
25
+ /**
26
+ * Mobile detection type.
27
+ *
28
+ * @deprecated since version 2.6.9
29
+ */
30
+ const DETECTION_TYPE_MOBILE = 'mobile';
31
+
32
+ /**
33
+ * Extended detection type.
34
+ *
35
+ * @deprecated since version 2.6.9
36
+ */
37
+ const DETECTION_TYPE_EXTENDED = 'extended';
38
+
39
+ /**
40
+ * A frequently used regular expression to extract version #s.
41
+ *
42
+ * @deprecated since version 2.6.9
43
+ */
44
+ const VER = '([\w._\+]+)';
45
+
46
+ /**
47
+ * Top-level device.
48
+ */
49
+ const MOBILE_GRADE_A = 'A';
50
+
51
+ /**
52
+ * Mid-level device.
53
+ */
54
+ const MOBILE_GRADE_B = 'B';
55
+
56
+ /**
57
+ * Low-level device.
58
+ */
59
+ const MOBILE_GRADE_C = 'C';
60
+
61
+ /**
62
+ * Stores the version number of the current release.
63
+ */
64
+ const VERSION = '2.8.31';
65
+
66
+ /**
67
+ * A type for the version() method indicating a string return value.
68
+ */
69
+ const VERSION_TYPE_STRING = 'text';
70
+
71
+ /**
72
+ * A type for the version() method indicating a float return value.
73
+ */
74
+ const VERSION_TYPE_FLOAT = 'float';
75
+
76
+ /**
77
+ * A cache for resolved matches
78
+ * @var array
79
+ */
80
+ protected $cache = array();
81
+
82
+ /**
83
+ * The User-Agent HTTP header is stored in here.
84
+ * @var string
85
+ */
86
+ protected $userAgent = null;
87
+
88
+ /**
89
+ * HTTP headers in the PHP-flavor. So HTTP_USER_AGENT and SERVER_SOFTWARE.
90
+ * @var array
91
+ */
92
+ protected $httpHeaders = array();
93
+
94
+ /**
95
+ * CloudFront headers. E.g. CloudFront-Is-Desktop-Viewer, CloudFront-Is-Mobile-Viewer & CloudFront-Is-Tablet-Viewer.
96
+ * @var array
97
+ */
98
+ protected $cloudfrontHeaders = array();
99
+
100
+ /**
101
+ * The matching Regex.
102
+ * This is good for debug.
103
+ * @var string
104
+ */
105
+ protected $matchingRegex = null;
106
+
107
+ /**
108
+ * The matches extracted from the regex expression.
109
+ * This is good for debug.
110
+ *
111
+ * @var string
112
+ */
113
+ protected $matchesArray = null;
114
+
115
+ /**
116
+ * The detection type, using self::DETECTION_TYPE_MOBILE or self::DETECTION_TYPE_EXTENDED.
117
+ *
118
+ * @deprecated since version 2.6.9
119
+ *
120
+ * @var string
121
+ */
122
+ protected $detectionType = self::DETECTION_TYPE_MOBILE;
123
+
124
+ /**
125
+ * HTTP headers that trigger the 'isMobile' detection
126
+ * to be true.
127
+ *
128
+ * @var array
129
+ */
130
+ protected static $mobileHeaders = array(
131
+
132
+ 'HTTP_ACCEPT' => array('matches' => array(
133
+ // Opera Mini; @reference: http://dev.opera.com/articles/view/opera-binary-markup-language/
134
+ 'application/x-obml2d',
135
+ // BlackBerry devices.
136
+ 'application/vnd.rim.html',
137
+ 'text/vnd.wap.wml',
138
+ 'application/vnd.wap.xhtml+xml'
139
+ )),
140
+ 'HTTP_X_WAP_PROFILE' => null,
141
+ 'HTTP_X_WAP_CLIENTID' => null,
142
+ 'HTTP_WAP_CONNECTION' => null,
143
+ 'HTTP_PROFILE' => null,
144
+ // Reported by Opera on Nokia devices (eg. C3).
145
+ 'HTTP_X_OPERAMINI_PHONE_UA' => null,
146
+ 'HTTP_X_NOKIA_GATEWAY_ID' => null,
147
+ 'HTTP_X_ORANGE_ID' => null,
148
+ 'HTTP_X_VODAFONE_3GPDPCONTEXT' => null,
149
+ 'HTTP_X_HUAWEI_USERID' => null,
150
+ // Reported by Windows Smartphones.
151
+ 'HTTP_UA_OS' => null,
152
+ // Reported by Verizon, Vodafone proxy system.
153
+ 'HTTP_X_MOBILE_GATEWAY' => null,
154
+ // Seen this on HTC Sensation. SensationXE_Beats_Z715e.
155
+ 'HTTP_X_ATT_DEVICEID' => null,
156
+ // Seen this on a HTC.
157
+ 'HTTP_UA_CPU' => array('matches' => array('ARM')),
158
+ );
159
+
160
+ /**
161
+ * List of mobile devices (phones).
162
+ *
163
+ * @var array
164
+ */
165
+ protected static $phoneDevices = array(
166
+ 'iPhone' => '\biPhone\b|\biPod\b', // |\biTunes
167
+ 'BlackBerry' => 'BlackBerry|\bBB10\b|rim[0-9]+',
168
+ 'HTC' => 'HTC|HTC.*(Sensation|Evo|Vision|Explorer|6800|8100|8900|A7272|S510e|C110e|Legend|Desire|T8282)|APX515CKT|Qtek9090|APA9292KT|HD_mini|Sensation.*Z710e|PG86100|Z715e|Desire.*(A8181|HD)|ADR6200|ADR6400L|ADR6425|001HT|Inspire 4G|Android.*\bEVO\b|T-Mobile G1|Z520m|Android [0-9.]+; Pixel',
169
+ 'Nexus' => 'Nexus One|Nexus S|Galaxy.*Nexus|Android.*Nexus.*Mobile|Nexus 4|Nexus 5|Nexus 6',
170
+ // @todo: Is 'Dell Streak' a tablet or a phone? ;)
171
+ 'Dell' => 'Dell[;]? (Streak|Aero|Venue|Venue Pro|Flash|Smoke|Mini 3iX)|XCD28|XCD35|\b001DL\b|\b101DL\b|\bGS01\b',
172
+ 'Motorola' => 'Motorola|DROIDX|DROID BIONIC|\bDroid\b.*Build|Android.*Xoom|HRI39|MOT-|A1260|A1680|A555|A853|A855|A953|A955|A956|Motorola.*ELECTRIFY|Motorola.*i1|i867|i940|MB200|MB300|MB501|MB502|MB508|MB511|MB520|MB525|MB526|MB611|MB612|MB632|MB810|MB855|MB860|MB861|MB865|MB870|ME501|ME502|ME511|ME525|ME600|ME632|ME722|ME811|ME860|ME863|ME865|MT620|MT710|MT716|MT720|MT810|MT870|MT917|Motorola.*TITANIUM|WX435|WX445|XT300|XT301|XT311|XT316|XT317|XT319|XT320|XT390|XT502|XT530|XT531|XT532|XT535|XT603|XT610|XT611|XT615|XT681|XT701|XT702|XT711|XT720|XT800|XT806|XT860|XT862|XT875|XT882|XT883|XT894|XT901|XT907|XT909|XT910|XT912|XT928|XT926|XT915|XT919|XT925|XT1021|\bMoto E\b|XT1068|XT1092',
173
+ 'Samsung' => '\bSamsung\b|SM-G950F|SM-G955F|SM-G9250|GT-19300|SGH-I337|BGT-S5230|GT-B2100|GT-B2700|GT-B2710|GT-B3210|GT-B3310|GT-B3410|GT-B3730|GT-B3740|GT-B5510|GT-B5512|GT-B5722|GT-B6520|GT-B7300|GT-B7320|GT-B7330|GT-B7350|GT-B7510|GT-B7722|GT-B7800|GT-C3010|GT-C3011|GT-C3060|GT-C3200|GT-C3212|GT-C3212I|GT-C3262|GT-C3222|GT-C3300|GT-C3300K|GT-C3303|GT-C3303K|GT-C3310|GT-C3322|GT-C3330|GT-C3350|GT-C3500|GT-C3510|GT-C3530|GT-C3630|GT-C3780|GT-C5010|GT-C5212|GT-C6620|GT-C6625|GT-C6712|GT-E1050|GT-E1070|GT-E1075|GT-E1080|GT-E1081|GT-E1085|GT-E1087|GT-E1100|GT-E1107|GT-E1110|GT-E1120|GT-E1125|GT-E1130|GT-E1160|GT-E1170|GT-E1175|GT-E1180|GT-E1182|GT-E1200|GT-E1210|GT-E1225|GT-E1230|GT-E1390|GT-E2100|GT-E2120|GT-E2121|GT-E2152|GT-E2220|GT-E2222|GT-E2230|GT-E2232|GT-E2250|GT-E2370|GT-E2550|GT-E2652|GT-E3210|GT-E3213|GT-I5500|GT-I5503|GT-I5700|GT-I5800|GT-I5801|GT-I6410|GT-I6420|GT-I7110|GT-I7410|GT-I7500|GT-I8000|GT-I8150|GT-I8160|GT-I8190|GT-I8320|GT-I8330|GT-I8350|GT-I8530|GT-I8700|GT-I8703|GT-I8910|GT-I9000|GT-I9001|GT-I9003|GT-I9010|GT-I9020|GT-I9023|GT-I9070|GT-I9082|GT-I9100|GT-I9103|GT-I9220|GT-I9250|GT-I9300|GT-I9305|GT-I9500|GT-I9505|GT-M3510|GT-M5650|GT-M7500|GT-M7600|GT-M7603|GT-M8800|GT-M8910|GT-N7000|GT-S3110|GT-S3310|GT-S3350|GT-S3353|GT-S3370|GT-S3650|GT-S3653|GT-S3770|GT-S3850|GT-S5210|GT-S5220|GT-S5229|GT-S5230|GT-S5233|GT-S5250|GT-S5253|GT-S5260|GT-S5263|GT-S5270|GT-S5300|GT-S5330|GT-S5350|GT-S5360|GT-S5363|GT-S5369|GT-S5380|GT-S5380D|GT-S5560|GT-S5570|GT-S5600|GT-S5603|GT-S5610|GT-S5620|GT-S5660|GT-S5670|GT-S5690|GT-S5750|GT-S5780|GT-S5830|GT-S5839|GT-S6102|GT-S6500|GT-S7070|GT-S7200|GT-S7220|GT-S7230|GT-S7233|GT-S7250|GT-S7500|GT-S7530|GT-S7550|GT-S7562|GT-S7710|GT-S8000|GT-S8003|GT-S8500|GT-S8530|GT-S8600|SCH-A310|SCH-A530|SCH-A570|SCH-A610|SCH-A630|SCH-A650|SCH-A790|SCH-A795|SCH-A850|SCH-A870|SCH-A890|SCH-A930|SCH-A950|SCH-A970|SCH-A990|SCH-I100|SCH-I110|SCH-I400|SCH-I405|SCH-I500|SCH-I510|SCH-I515|SCH-I600|SCH-I730|SCH-I760|SCH-I770|SCH-I830|SCH-I910|SCH-I920|SCH-I959|SCH-LC11|SCH-N150|SCH-N300|SCH-R100|SCH-R300|SCH-R351|SCH-R400|SCH-R410|SCH-T300|SCH-U310|SCH-U320|SCH-U350|SCH-U360|SCH-U365|SCH-U370|SCH-U380|SCH-U410|SCH-U430|SCH-U450|SCH-U460|SCH-U470|SCH-U490|SCH-U540|SCH-U550|SCH-U620|SCH-U640|SCH-U650|SCH-U660|SCH-U700|SCH-U740|SCH-U750|SCH-U810|SCH-U820|SCH-U900|SCH-U940|SCH-U960|SCS-26UC|SGH-A107|SGH-A117|SGH-A127|SGH-A137|SGH-A157|SGH-A167|SGH-A177|SGH-A187|SGH-A197|SGH-A227|SGH-A237|SGH-A257|SGH-A437|SGH-A517|SGH-A597|SGH-A637|SGH-A657|SGH-A667|SGH-A687|SGH-A697|SGH-A707|SGH-A717|SGH-A727|SGH-A737|SGH-A747|SGH-A767|SGH-A777|SGH-A797|SGH-A817|SGH-A827|SGH-A837|SGH-A847|SGH-A867|SGH-A877|SGH-A887|SGH-A897|SGH-A927|SGH-B100|SGH-B130|SGH-B200|SGH-B220|SGH-C100|SGH-C110|SGH-C120|SGH-C130|SGH-C140|SGH-C160|SGH-C170|SGH-C180|SGH-C200|SGH-C207|SGH-C210|SGH-C225|SGH-C230|SGH-C417|SGH-C450|SGH-D307|SGH-D347|SGH-D357|SGH-D407|SGH-D415|SGH-D780|SGH-D807|SGH-D980|SGH-E105|SGH-E200|SGH-E315|SGH-E316|SGH-E317|SGH-E335|SGH-E590|SGH-E635|SGH-E715|SGH-E890|SGH-F300|SGH-F480|SGH-I200|SGH-I300|SGH-I320|SGH-I550|SGH-I577|SGH-I600|SGH-I607|SGH-I617|SGH-I627|SGH-I637|SGH-I677|SGH-I700|SGH-I717|SGH-I727|SGH-i747M|SGH-I777|SGH-I780|SGH-I827|SGH-I847|SGH-I857|SGH-I896|SGH-I897|SGH-I900|SGH-I907|SGH-I917|SGH-I927|SGH-I937|SGH-I997|SGH-J150|SGH-J200|SGH-L170|SGH-L700|SGH-M110|SGH-M150|SGH-M200|SGH-N105|SGH-N500|SGH-N600|SGH-N620|SGH-N625|SGH-N700|SGH-N710|SGH-P107|SGH-P207|SGH-P300|SGH-P310|SGH-P520|SGH-P735|SGH-P777|SGH-Q105|SGH-R210|SGH-R220|SGH-R225|SGH-S105|SGH-S307|SGH-T109|SGH-T119|SGH-T139|SGH-T209|SGH-T219|SGH-T229|SGH-T239|SGH-T249|SGH-T259|SGH-T309|SGH-T319|SGH-T329|SGH-T339|SGH-T349|SGH-T359|SGH-T369|SGH-T379|SGH-T409|SGH-T429|SGH-T439|SGH-T459|SGH-T469|SGH-T479|SGH-T499|SGH-T509|SGH-T519|SGH-T539|SGH-T559|SGH-T589|SGH-T609|SGH-T619|SGH-T629|SGH-T639|SGH-T659|SGH-T669|SGH-T679|SGH-T709|SGH-T719|SGH-T729|SGH-T739|SGH-T746|SGH-T749|SGH-T759|SGH-T769|SGH-T809|SGH-T819|SGH-T839|SGH-T919|SGH-T929|SGH-T939|SGH-T959|SGH-T989|SGH-U100|SGH-U200|SGH-U800|SGH-V205|SGH-V206|SGH-X100|SGH-X105|SGH-X120|SGH-X140|SGH-X426|SGH-X427|SGH-X475|SGH-X495|SGH-X497|SGH-X507|SGH-X600|SGH-X610|SGH-X620|SGH-X630|SGH-X700|SGH-X820|SGH-X890|SGH-Z130|SGH-Z150|SGH-Z170|SGH-ZX10|SGH-ZX20|SHW-M110|SPH-A120|SPH-A400|SPH-A420|SPH-A460|SPH-A500|SPH-A560|SPH-A600|SPH-A620|SPH-A660|SPH-A700|SPH-A740|SPH-A760|SPH-A790|SPH-A800|SPH-A820|SPH-A840|SPH-A880|SPH-A900|SPH-A940|SPH-A960|SPH-D600|SPH-D700|SPH-D710|SPH-D720|SPH-I300|SPH-I325|SPH-I330|SPH-I350|SPH-I500|SPH-I600|SPH-I700|SPH-L700|SPH-M100|SPH-M220|SPH-M240|SPH-M300|SPH-M305|SPH-M320|SPH-M330|SPH-M350|SPH-M360|SPH-M370|SPH-M380|SPH-M510|SPH-M540|SPH-M550|SPH-M560|SPH-M570|SPH-M580|SPH-M610|SPH-M620|SPH-M630|SPH-M800|SPH-M810|SPH-M850|SPH-M900|SPH-M910|SPH-M920|SPH-M930|SPH-N100|SPH-N200|SPH-N240|SPH-N300|SPH-N400|SPH-Z400|SWC-E100|SCH-i909|GT-N7100|GT-N7105|SCH-I535|SM-N900A|SGH-I317|SGH-T999L|GT-S5360B|GT-I8262|GT-S6802|GT-S6312|GT-S6310|GT-S5312|GT-S5310|GT-I9105|GT-I8510|GT-S6790N|SM-G7105|SM-N9005|GT-S5301|GT-I9295|GT-I9195|SM-C101|GT-S7392|GT-S7560|GT-B7610|GT-I5510|GT-S7582|GT-S7530E|GT-I8750|SM-G9006V|SM-G9008V|SM-G9009D|SM-G900A|SM-G900D|SM-G900F|SM-G900H|SM-G900I|SM-G900J|SM-G900K|SM-G900L|SM-G900M|SM-G900P|SM-G900R4|SM-G900S|SM-G900T|SM-G900V|SM-G900W8|SHV-E160K|SCH-P709|SCH-P729|SM-T2558|GT-I9205|SM-G9350|SM-J120F|SM-G920F|SM-G920V|SM-G930F|SM-N910C|SM-A310F|GT-I9190|SM-J500FN|SM-G903F',
174
+ 'LG' => '\bLG\b;|LG[- ]?(C800|C900|E400|E610|E900|E-900|F160|F180K|F180L|F180S|730|855|L160|LS740|LS840|LS970|LU6200|MS690|MS695|MS770|MS840|MS870|MS910|P500|P700|P705|VM696|AS680|AS695|AX840|C729|E970|GS505|272|C395|E739BK|E960|L55C|L75C|LS696|LS860|P769BK|P350|P500|P509|P870|UN272|US730|VS840|VS950|LN272|LN510|LS670|LS855|LW690|MN270|MN510|P509|P769|P930|UN200|UN270|UN510|UN610|US670|US740|US760|UX265|UX840|VN271|VN530|VS660|VS700|VS740|VS750|VS910|VS920|VS930|VX9200|VX11000|AX840A|LW770|P506|P925|P999|E612|D955|D802|MS323)',
175
+ 'Sony' => 'SonyST|SonyLT|SonyEricsson|SonyEricssonLT15iv|LT18i|E10i|LT28h|LT26w|SonyEricssonMT27i|C5303|C6902|C6903|C6906|C6943|D2533',
176
+ 'Asus' => 'Asus.*Galaxy|PadFone.*Mobile',
177
+ 'NokiaLumia' => 'Lumia [0-9]{3,4}',
178
+ // http://www.micromaxinfo.com/mobiles/smartphones
179
+ // Added because the codes might conflict with Acer Tablets.
180
+ 'Micromax' => 'Micromax.*\b(A210|A92|A88|A72|A111|A110Q|A115|A116|A110|A90S|A26|A51|A35|A54|A25|A27|A89|A68|A65|A57|A90)\b',
181
+ // @todo Complete the regex.
182
+ 'Palm' => 'PalmSource|Palm', // avantgo|blazer|elaine|hiptop|plucker|xiino ;
183
+ 'Vertu' => 'Vertu|Vertu.*Ltd|Vertu.*Ascent|Vertu.*Ayxta|Vertu.*Constellation(F|Quest)?|Vertu.*Monika|Vertu.*Signature', // Just for fun ;)
184
+ // http://www.pantech.co.kr/en/prod/prodList.do?gbrand=VEGA (PANTECH)
185
+ // Most of the VEGA devices are legacy. PANTECH seem to be newer devices based on Android.
186
+ 'Pantech' => 'PANTECH|IM-A850S|IM-A840S|IM-A830L|IM-A830K|IM-A830S|IM-A820L|IM-A810K|IM-A810S|IM-A800S|IM-T100K|IM-A725L|IM-A780L|IM-A775C|IM-A770K|IM-A760S|IM-A750K|IM-A740S|IM-A730S|IM-A720L|IM-A710K|IM-A690L|IM-A690S|IM-A650S|IM-A630K|IM-A600S|VEGA PTL21|PT003|P8010|ADR910L|P6030|P6020|P9070|P4100|P9060|P5000|CDM8992|TXT8045|ADR8995|IS11PT|P2030|P6010|P8000|PT002|IS06|CDM8999|P9050|PT001|TXT8040|P2020|P9020|P2000|P7040|P7000|C790',
187
+ // http://www.fly-phone.com/devices/smartphones/ ; Included only smartphones.
188
+ 'Fly' => 'IQ230|IQ444|IQ450|IQ440|IQ442|IQ441|IQ245|IQ256|IQ236|IQ255|IQ235|IQ245|IQ275|IQ240|IQ285|IQ280|IQ270|IQ260|IQ250',
189
+ // http://fr.wikomobile.com
190
+ 'Wiko' => 'KITE 4G|HIGHWAY|GETAWAY|STAIRWAY|DARKSIDE|DARKFULL|DARKNIGHT|DARKMOON|SLIDE|WAX 4G|RAINBOW|BLOOM|SUNSET|GOA(?!nna)|LENNY|BARRY|IGGY|OZZY|CINK FIVE|CINK PEAX|CINK PEAX 2|CINK SLIM|CINK SLIM 2|CINK +|CINK KING|CINK PEAX|CINK SLIM|SUBLIM',
191
+ 'iMobile' => 'i-mobile (IQ|i-STYLE|idea|ZAA|Hitz)',
192
+ // Added simvalley mobile just for fun. They have some interesting devices.
193
+ // http://www.simvalley.fr/telephonie---gps-_22_telephonie-mobile_telephones_.html
194
+ 'SimValley' => '\b(SP-80|XT-930|SX-340|XT-930|SX-310|SP-360|SP60|SPT-800|SP-120|SPT-800|SP-140|SPX-5|SPX-8|SP-100|SPX-8|SPX-12)\b',
195
+ // Wolfgang - a brand that is sold by Aldi supermarkets.
196
+ // http://www.wolfgangmobile.com/
197
+ 'Wolfgang' => 'AT-B24D|AT-AS50HD|AT-AS40W|AT-AS55HD|AT-AS45q2|AT-B26D|AT-AS50Q',
198
+ 'Alcatel' => 'Alcatel',
199
+ 'Nintendo' => 'Nintendo 3DS',
200
+ // http://en.wikipedia.org/wiki/Amoi
201
+ 'Amoi' => 'Amoi',
202
+ // http://en.wikipedia.org/wiki/INQ
203
+ 'INQ' => 'INQ',
204
+ // @Tapatalk is a mobile app; http://support.tapatalk.com/threads/smf-2-0-2-os-and-browser-detection-plugin-and-tapatalk.15565/#post-79039
205
+ 'GenericPhone' => 'Tapatalk|PDA;|SAGEM|\bmmp\b|pocket|\bpsp\b|symbian|Smartphone|smartfon|treo|up.browser|up.link|vodafone|\bwap\b|nokia|Series40|Series60|S60|SonyEricsson|N900|MAUI.*WAP.*Browser',
206
+ );
207
+
208
+ /**
209
+ * List of tablet devices.
210
+ *
211
+ * @var array
212
+ */
213
+ protected static $tabletDevices = array(
214
+ // @todo: check for mobile friendly emails topic.
215
+ 'iPad' => 'iPad|iPad.*Mobile',
216
+ // Removed |^.*Android.*Nexus(?!(?:Mobile).)*$
217
+ // @see #442
218
+ 'NexusTablet' => 'Android.*Nexus[\s]+(7|9|10)',
219
+ 'SamsungTablet' => 'SAMSUNG.*Tablet|Galaxy.*Tab|SC-01C|GT-P1000|GT-P1003|GT-P1010|GT-P3105|GT-P6210|GT-P6800|GT-P6810|GT-P7100|GT-P7300|GT-P7310|GT-P7500|GT-P7510|SCH-I800|SCH-I815|SCH-I905|SGH-I957|SGH-I987|SGH-T849|SGH-T859|SGH-T869|SPH-P100|GT-P3100|GT-P3108|GT-P3110|GT-P5100|GT-P5110|GT-P6200|GT-P7320|GT-P7511|GT-N8000|GT-P8510|SGH-I497|SPH-P500|SGH-T779|SCH-I705|SCH-I915|GT-N8013|GT-P3113|GT-P5113|GT-P8110|GT-N8010|GT-N8005|GT-N8020|GT-P1013|GT-P6201|GT-P7501|GT-N5100|GT-N5105|GT-N5110|SHV-E140K|SHV-E140L|SHV-E140S|SHV-E150S|SHV-E230K|SHV-E230L|SHV-E230S|SHW-M180K|SHW-M180L|SHW-M180S|SHW-M180W|SHW-M300W|SHW-M305W|SHW-M380K|SHW-M380S|SHW-M380W|SHW-M430W|SHW-M480K|SHW-M480S|SHW-M480W|SHW-M485W|SHW-M486W|SHW-M500W|GT-I9228|SCH-P739|SCH-I925|GT-I9200|GT-P5200|GT-P5210|GT-P5210X|SM-T311|SM-T310|SM-T310X|SM-T210|SM-T210R|SM-T211|SM-P600|SM-P601|SM-P605|SM-P900|SM-P901|SM-T217|SM-T217A|SM-T217S|SM-P6000|SM-T3100|SGH-I467|XE500|SM-T110|GT-P5220|GT-I9200X|GT-N5110X|GT-N5120|SM-P905|SM-T111|SM-T2105|SM-T315|SM-T320|SM-T320X|SM-T321|SM-T520|SM-T525|SM-T530NU|SM-T230NU|SM-T330NU|SM-T900|XE500T1C|SM-P605V|SM-P905V|SM-T337V|SM-T537V|SM-T707V|SM-T807V|SM-P600X|SM-P900X|SM-T210X|SM-T230|SM-T230X|SM-T325|GT-P7503|SM-T531|SM-T330|SM-T530|SM-T705|SM-T705C|SM-T535|SM-T331|SM-T800|SM-T700|SM-T537|SM-T807|SM-P907A|SM-T337A|SM-T537A|SM-T707A|SM-T807A|SM-T237|SM-T807P|SM-P607T|SM-T217T|SM-T337T|SM-T807T|SM-T116NQ|SM-T116BU|SM-P550|SM-T350|SM-T550|SM-T9000|SM-P9000|SM-T705Y|SM-T805|GT-P3113|SM-T710|SM-T810|SM-T815|SM-T360|SM-T533|SM-T113|SM-T335|SM-T715|SM-T560|SM-T670|SM-T677|SM-T377|SM-T567|SM-T357T|SM-T555|SM-T561|SM-T713|SM-T719|SM-T813|SM-T819|SM-T580|SM-T355Y?|SM-T280|SM-T817A|SM-T820|SM-W700|SM-P580|SM-T587|SM-P350|SM-P555M|SM-P355M|SM-T113NU|SM-T815Y|SM-T585|SM-T285', // SCH-P709|SCH-P729|SM-T2558|GT-I9205 - Samsung Mega - treat them like a regular phone.
220
+ // http://docs.aws.amazon.com/silk/latest/developerguide/user-agent.html
221
+ 'Kindle' => 'Kindle|Silk.*Accelerated|Android.*\b(KFOT|KFTT|KFJWI|KFJWA|KFOTE|KFSOWI|KFTHWI|KFTHWA|KFAPWI|KFAPWA|WFJWAE|KFSAWA|KFSAWI|KFASWI|KFARWI|KFFOWI|KFGIWI|KFMEWI)\b|Android.*Silk/[0-9.]+ like Chrome/[0-9.]+ (?!Mobile)',
222
+ // Only the Surface tablets with Windows RT are considered mobile.
223
+ // http://msdn.microsoft.com/en-us/library/ie/hh920767(v=vs.85).aspx
224
+ 'SurfaceTablet' => 'Windows NT [0-9.]+; ARM;.*(Tablet|ARMBJS)',
225
+ // http://shopping1.hp.com/is-bin/INTERSHOP.enfinity/WFS/WW-USSMBPublicStore-Site/en_US/-/USD/ViewStandardCatalog-Browse?CatalogCategoryID=JfIQ7EN5lqMAAAEyDcJUDwMT
226
+ 'HPTablet' => 'HP Slate (7|8|10)|HP ElitePad 900|hp-tablet|EliteBook.*Touch|HP 8|Slate 21|HP SlateBook 10',
227
+ // Watch out for PadFone, see #132.
228
+ // http://www.asus.com/de/Tablets_Mobile/Memo_Pad_Products/
229
+ 'AsusTablet' => '^.*PadFone((?!Mobile).)*$|Transformer|TF101|TF101G|TF300T|TF300TG|TF300TL|TF700T|TF700KL|TF701T|TF810C|ME171|ME301T|ME302C|ME371MG|ME370T|ME372MG|ME172V|ME173X|ME400C|Slider SL101|\bK00F\b|\bK00C\b|\bK00E\b|\bK00L\b|TX201LA|ME176C|ME102A|\bM80TA\b|ME372CL|ME560CG|ME372CG|ME302KL| K010 | K011 | K017 | K01E |ME572C|ME103K|ME170C|ME171C|\bME70C\b|ME581C|ME581CL|ME8510C|ME181C|P01Y|PO1MA|P01Z|\bP027\b|\bP024\b',
230
+ 'BlackBerryTablet' => 'PlayBook|RIM Tablet',
231
+ 'HTCtablet' => 'HTC_Flyer_P512|HTC Flyer|HTC Jetstream|HTC-P715a|HTC EVO View 4G|PG41200|PG09410',
232
+ 'MotorolaTablet' => 'xoom|sholest|MZ615|MZ605|MZ505|MZ601|MZ602|MZ603|MZ604|MZ606|MZ607|MZ608|MZ609|MZ615|MZ616|MZ617',
233
+ 'NookTablet' => 'Android.*Nook|NookColor|nook browser|BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2',
234
+ // http://www.acer.ro/ac/ro/RO/content/drivers
235
+ // http://www.packardbell.co.uk/pb/en/GB/content/download (Packard Bell is part of Acer)
236
+ // http://us.acer.com/ac/en/US/content/group/tablets
237
+ // http://www.acer.de/ac/de/DE/content/models/tablets/
238
+ // Can conflict with Micromax and Motorola phones codes.
239
+ 'AcerTablet' => 'Android.*; \b(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700|A701|W500|W500P|W501|W501P|W510|W511|W700|G100|G100W|B1-A71|B1-710|B1-711|A1-810|A1-811|A1-830)\b|W3-810|\bA3-A10\b|\bA3-A11\b|\bA3-A20\b|\bA3-A30',
240
+ // http://eu.computers.toshiba-europe.com/innovation/family/Tablets/1098744/banner_id/tablet_footerlink/
241
+ // http://us.toshiba.com/tablets/tablet-finder
242
+ // http://www.toshiba.co.jp/regza/tablet/
243
+ 'ToshibaTablet' => 'Android.*(AT100|AT105|AT200|AT205|AT270|AT275|AT300|AT305|AT1S5|AT500|AT570|AT700|AT830)|TOSHIBA.*FOLIO',
244
+ // http://www.nttdocomo.co.jp/english/service/developer/smart_phone/technical_info/spec/index.html
245
+ // http://www.lg.com/us/tablets
246
+ 'LGTablet' => '\bL-06C|LG-V909|LG-V900|LG-V700|LG-V510|LG-V500|LG-V410|LG-V400|LG-VK810\b',
247
+ 'FujitsuTablet' => 'Android.*\b(F-01D|F-02F|F-05E|F-10D|M532|Q572)\b',
248
+ // Prestigio Tablets http://www.prestigio.com/support
249
+ 'PrestigioTablet' => 'PMP3170B|PMP3270B|PMP3470B|PMP7170B|PMP3370B|PMP3570C|PMP5870C|PMP3670B|PMP5570C|PMP5770D|PMP3970B|PMP3870C|PMP5580C|PMP5880D|PMP5780D|PMP5588C|PMP7280C|PMP7280C3G|PMP7280|PMP7880D|PMP5597D|PMP5597|PMP7100D|PER3464|PER3274|PER3574|PER3884|PER5274|PER5474|PMP5097CPRO|PMP5097|PMP7380D|PMP5297C|PMP5297C_QUAD|PMP812E|PMP812E3G|PMP812F|PMP810E|PMP880TD|PMT3017|PMT3037|PMT3047|PMT3057|PMT7008|PMT5887|PMT5001|PMT5002',
250
+ // http://support.lenovo.com/en_GB/downloads/default.page?#
251
+ 'LenovoTablet' => 'Lenovo TAB|Idea(Tab|Pad)( A1|A10| K1|)|ThinkPad([ ]+)?Tablet|YT3-850M|YT3-X90L|YT3-X90F|YT3-X90X|Lenovo.*(S2109|S2110|S5000|S6000|K3011|A3000|A3500|A1000|A2107|A2109|A1107|A5500|A7600|B6000|B8000|B8080)(-|)(FL|F|HV|H|)|TB-X103F|TB-X304F|TB-X304L|TB-8703F',
252
+ // http://www.dell.com/support/home/us/en/04/Products/tab_mob/tablets
253
+ 'DellTablet' => 'Venue 11|Venue 8|Venue 7|Dell Streak 10|Dell Streak 7',
254
+ // http://www.yarvik.com/en/matrix/tablets/
255
+ 'YarvikTablet' => 'Android.*\b(TAB210|TAB211|TAB224|TAB250|TAB260|TAB264|TAB310|TAB360|TAB364|TAB410|TAB411|TAB420|TAB424|TAB450|TAB460|TAB461|TAB464|TAB465|TAB467|TAB468|TAB07-100|TAB07-101|TAB07-150|TAB07-151|TAB07-152|TAB07-200|TAB07-201-3G|TAB07-210|TAB07-211|TAB07-212|TAB07-214|TAB07-220|TAB07-400|TAB07-485|TAB08-150|TAB08-200|TAB08-201-3G|TAB08-201-30|TAB09-100|TAB09-211|TAB09-410|TAB10-150|TAB10-201|TAB10-211|TAB10-400|TAB10-410|TAB13-201|TAB274EUK|TAB275EUK|TAB374EUK|TAB462EUK|TAB474EUK|TAB9-200)\b',
256
+ 'MedionTablet' => 'Android.*\bOYO\b|LIFE.*(P9212|P9514|P9516|S9512)|LIFETAB',
257
+ 'ArnovaTablet' => '97G4|AN10G2|AN7bG3|AN7fG3|AN8G3|AN8cG3|AN7G3|AN9G3|AN7dG3|AN7dG3ST|AN7dG3ChildPad|AN10bG3|AN10bG3DT|AN9G2',
258
+ // http://www.intenso.de/kategorie_en.php?kategorie=33
259
+ // @todo: http://www.nbhkdz.com/read/b8e64202f92a2df129126bff.html - investigate
260
+ 'IntensoTablet' => 'INM8002KP|INM1010FP|INM805ND|Intenso Tab|TAB1004',
261
+ // IRU.ru Tablets http://www.iru.ru/catalog/soho/planetable/
262
+ 'IRUTablet' => 'M702pro',
263
+ 'MegafonTablet' => 'MegaFon V9|\bZTE V9\b|Android.*\bMT7A\b',
264
+ // http://www.e-boda.ro/tablete-pc.html
265
+ 'EbodaTablet' => 'E-Boda (Supreme|Impresspeed|Izzycomm|Essential)',
266
+ // http://www.allview.ro/produse/droseries/lista-tablete-pc/
267
+ 'AllViewTablet' => 'Allview.*(Viva|Alldro|City|Speed|All TV|Frenzy|Quasar|Shine|TX1|AX1|AX2)',
268
+ // http://wiki.archosfans.com/index.php?title=Main_Page
269
+ // @note Rewrite the regex format after we add more UAs.
270
+ 'ArchosTablet' => '\b(101G9|80G9|A101IT)\b|Qilive 97R|Archos5|\bARCHOS (70|79|80|90|97|101|FAMILYPAD|)(b|c|)(G10| Cobalt| TITANIUM(HD|)| Xenon| Neon|XSK| 2| XS 2| PLATINUM| CARBON|GAMEPAD)\b',
271
+ // http://www.ainol.com/plugin.php?identifier=ainol&module=product
272
+ 'AinolTablet' => 'NOVO7|NOVO8|NOVO10|Novo7Aurora|Novo7Basic|NOVO7PALADIN|novo9-Spark',
273
+ 'NokiaLumiaTablet' => 'Lumia 2520',
274
+ // @todo: inspect http://esupport.sony.com/US/p/select-system.pl?DIRECTOR=DRIVER
275
+ // Readers http://www.atsuhiro-me.net/ebook/sony-reader/sony-reader-web-browser
276
+ // http://www.sony.jp/support/tablet/
277
+ 'SonyTablet' => 'Sony.*Tablet|Xperia Tablet|Sony Tablet S|SO-03E|SGPT12|SGPT13|SGPT114|SGPT121|SGPT122|SGPT123|SGPT111|SGPT112|SGPT113|SGPT131|SGPT132|SGPT133|SGPT211|SGPT212|SGPT213|SGP311|SGP312|SGP321|EBRD1101|EBRD1102|EBRD1201|SGP351|SGP341|SGP511|SGP512|SGP521|SGP541|SGP551|SGP621|SGP612|SOT31',
278
+ // http://www.support.philips.com/support/catalog/worldproducts.jsp?userLanguage=en&userCountry=cn&categoryid=3G_LTE_TABLET_SU_CN_CARE&title=3G%20tablets%20/%20LTE%20range&_dyncharset=UTF-8
279
+ 'PhilipsTablet' => '\b(PI2010|PI3000|PI3100|PI3105|PI3110|PI3205|PI3210|PI3900|PI4010|PI7000|PI7100)\b',
280
+ // db + http://www.cube-tablet.com/buy-products.html
281
+ 'CubeTablet' => 'Android.*(K8GT|U9GT|U10GT|U16GT|U17GT|U18GT|U19GT|U20GT|U23GT|U30GT)|CUBE U8GT',
282
+ // http://www.cobyusa.com/?p=pcat&pcat_id=3001
283
+ 'CobyTablet' => 'MID1042|MID1045|MID1125|MID1126|MID7012|MID7014|MID7015|MID7034|MID7035|MID7036|MID7042|MID7048|MID7127|MID8042|MID8048|MID8127|MID9042|MID9740|MID9742|MID7022|MID7010',
284
+ // http://www.match.net.cn/products.asp
285
+ 'MIDTablet' => 'M9701|M9000|M9100|M806|M1052|M806|T703|MID701|MID713|MID710|MID727|MID760|MID830|MID728|MID933|MID125|MID810|MID732|MID120|MID930|MID800|MID731|MID900|MID100|MID820|MID735|MID980|MID130|MID833|MID737|MID960|MID135|MID860|MID736|MID140|MID930|MID835|MID733|MID4X10',
286
+ // http://www.msi.com/support
287
+ // @todo Research the Windows Tablets.
288
+ 'MSITablet' => 'MSI \b(Primo 73K|Primo 73L|Primo 81L|Primo 77|Primo 93|Primo 75|Primo 76|Primo 73|Primo 81|Primo 91|Primo 90|Enjoy 71|Enjoy 7|Enjoy 10)\b',
289
+ // @todo http://www.kyoceramobile.com/support/drivers/
290
+ // 'KyoceraTablet' => null,
291
+ // @todo http://intexuae.com/index.php/category/mobile-devices/tablets-products/
292
+ // 'IntextTablet' => null,
293
+ // http://pdadb.net/index.php?m=pdalist&list=SMiT (NoName Chinese Tablets)
294
+ // http://www.imp3.net/14/show.php?itemid=20454
295
+ 'SMiTTablet' => 'Android.*(\bMID\b|MID-560|MTV-T1200|MTV-PND531|MTV-P1101|MTV-PND530)',
296
+ // http://www.rock-chips.com/index.php?do=prod&pid=2
297
+ 'RockChipTablet' => 'Android.*(RK2818|RK2808A|RK2918|RK3066)|RK2738|RK2808A',
298
+ // http://www.fly-phone.com/devices/tablets/ ; http://www.fly-phone.com/service/
299
+ 'FlyTablet' => 'IQ310|Fly Vision',
300
+ // http://www.bqreaders.com/gb/tablets-prices-sale.html
301
+ 'bqTablet' => 'Android.*(bq)?.*(Elcano|Curie|Edison|Maxwell|Kepler|Pascal|Tesla|Hypatia|Platon|Newton|Livingstone|Cervantes|Avant|Aquaris ([E|M]10|M8))|Maxwell.*Lite|Maxwell.*Plus',
302
+ // http://www.huaweidevice.com/worldwide/productFamily.do?method=index&directoryId=5011&treeId=3290
303
+ // http://www.huaweidevice.com/worldwide/downloadCenter.do?method=index&directoryId=3372&treeId=0&tb=1&type=software (including legacy tablets)
304
+ 'HuaweiTablet' => 'MediaPad|MediaPad 7 Youth|IDEOS S7|S7-201c|S7-202u|S7-101|S7-103|S7-104|S7-105|S7-106|S7-201|S7-Slim|M2-A01L',
305
+ // Nec or Medias Tab
306
+ 'NecTablet' => '\bN-06D|\bN-08D',
307
+ // Pantech Tablets: http://www.pantechusa.com/phones/
308
+ 'PantechTablet' => 'Pantech.*P4100',
309
+ // Broncho Tablets: http://www.broncho.cn/ (hard to find)
310
+ 'BronchoTablet' => 'Broncho.*(N701|N708|N802|a710)',
311
+ // http://versusuk.com/support.html
312
+ 'VersusTablet' => 'TOUCHPAD.*[78910]|\bTOUCHTAB\b',
313
+ // http://www.zync.in/index.php/our-products/tablet-phablets
314
+ 'ZyncTablet' => 'z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900',
315
+ // http://www.positivoinformatica.com.br/www/pessoal/tablet-ypy/
316
+ 'PositivoTablet' => 'TB07STA|TB10STA|TB07FTA|TB10FTA',
317
+ // https://www.nabitablet.com/
318
+ 'NabiTablet' => 'Android.*\bNabi',
319
+ 'KoboTablet' => 'Kobo Touch|\bK080\b|\bVox\b Build|\bArc\b Build',
320
+ // French Danew Tablets http://www.danew.com/produits-tablette.php
321
+ 'DanewTablet' => 'DSlide.*\b(700|701R|702|703R|704|802|970|971|972|973|974|1010|1012)\b',
322
+ // Texet Tablets and Readers http://www.texet.ru/tablet/
323
+ 'TexetTablet' => 'NaviPad|TB-772A|TM-7045|TM-7055|TM-9750|TM-7016|TM-7024|TM-7026|TM-7041|TM-7043|TM-7047|TM-8041|TM-9741|TM-9747|TM-9748|TM-9751|TM-7022|TM-7021|TM-7020|TM-7011|TM-7010|TM-7023|TM-7025|TM-7037W|TM-7038W|TM-7027W|TM-9720|TM-9725|TM-9737W|TM-1020|TM-9738W|TM-9740|TM-9743W|TB-807A|TB-771A|TB-727A|TB-725A|TB-719A|TB-823A|TB-805A|TB-723A|TB-715A|TB-707A|TB-705A|TB-709A|TB-711A|TB-890HD|TB-880HD|TB-790HD|TB-780HD|TB-770HD|TB-721HD|TB-710HD|TB-434HD|TB-860HD|TB-840HD|TB-760HD|TB-750HD|TB-740HD|TB-730HD|TB-722HD|TB-720HD|TB-700HD|TB-500HD|TB-470HD|TB-431HD|TB-430HD|TB-506|TB-504|TB-446|TB-436|TB-416|TB-146SE|TB-126SE',
324
+ // Avoid detecting 'PLAYSTATION 3' as mobile.
325
+ 'PlaystationTablet' => 'Playstation.*(Portable|Vita)',
326
+ // http://www.trekstor.de/surftabs.html
327
+ 'TrekstorTablet' => 'ST10416-1|VT10416-1|ST70408-1|ST702xx-1|ST702xx-2|ST80208|ST97216|ST70104-2|VT10416-2|ST10216-2A|SurfTab',
328
+ // http://www.pyleaudio.com/Products.aspx?%2fproducts%2fPersonal-Electronics%2fTablets
329
+ 'PyleAudioTablet' => '\b(PTBL10CEU|PTBL10C|PTBL72BC|PTBL72BCEU|PTBL7CEU|PTBL7C|PTBL92BC|PTBL92BCEU|PTBL9CEU|PTBL9CUK|PTBL9C)\b',
330
+ // http://www.advandigital.com/index.php?link=content-product&jns=JP001
331
+ // because of the short codenames we have to include whitespaces to reduce the possible conflicts.
332
+ 'AdvanTablet' => 'Android.* \b(E3A|T3X|T5C|T5B|T3E|T3C|T3B|T1J|T1F|T2A|T1H|T1i|E1C|T1-E|T5-A|T4|E1-B|T2Ci|T1-B|T1-D|O1-A|E1-A|T1-A|T3A|T4i)\b ',
333
+ // http://www.danytech.com/category/tablet-pc
334
+ 'DanyTechTablet' => 'Genius Tab G3|Genius Tab S2|Genius Tab Q3|Genius Tab G4|Genius Tab Q4|Genius Tab G-II|Genius TAB GII|Genius TAB GIII|Genius Tab S1',
335
+ // http://www.galapad.net/product.html
336
+ 'GalapadTablet' => 'Android.*\bG1\b',
337
+ // http://www.micromaxinfo.com/tablet/funbook
338
+ 'MicromaxTablet' => 'Funbook|Micromax.*\b(P250|P560|P360|P362|P600|P300|P350|P500|P275)\b',
339
+ // http://www.karbonnmobiles.com/products_tablet.php
340
+ 'KarbonnTablet' => 'Android.*\b(A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2)\b',
341
+ // http://www.myallfine.com/Products.asp
342
+ 'AllFineTablet' => 'Fine7 Genius|Fine7 Shine|Fine7 Air|Fine8 Style|Fine9 More|Fine10 Joy|Fine11 Wide',
343
+ // http://www.proscanvideo.com/products-search.asp?itemClass=TABLET&itemnmbr=
344
+ 'PROSCANTablet' => '\b(PEM63|PLT1023G|PLT1041|PLT1044|PLT1044G|PLT1091|PLT4311|PLT4311PL|PLT4315|PLT7030|PLT7033|PLT7033D|PLT7035|PLT7035D|PLT7044K|PLT7045K|PLT7045KB|PLT7071KG|PLT7072|PLT7223G|PLT7225G|PLT7777G|PLT7810K|PLT7849G|PLT7851G|PLT7852G|PLT8015|PLT8031|PLT8034|PLT8036|PLT8080K|PLT8082|PLT8088|PLT8223G|PLT8234G|PLT8235G|PLT8816K|PLT9011|PLT9045K|PLT9233G|PLT9735|PLT9760G|PLT9770G)\b',
345
+ // http://www.yonesnav.com/products/products.php
346
+ 'YONESTablet' => 'BQ1078|BC1003|BC1077|RK9702|BC9730|BC9001|IT9001|BC7008|BC7010|BC708|BC728|BC7012|BC7030|BC7027|BC7026',
347
+ // http://www.cjshowroom.com/eproducts.aspx?classcode=004001001
348
+ // China manufacturer makes tablets for different small brands (eg. http://www.zeepad.net/index.html)
349
+ 'ChangJiaTablet' => 'TPC7102|TPC7103|TPC7105|TPC7106|TPC7107|TPC7201|TPC7203|TPC7205|TPC7210|TPC7708|TPC7709|TPC7712|TPC7110|TPC8101|TPC8103|TPC8105|TPC8106|TPC8203|TPC8205|TPC8503|TPC9106|TPC9701|TPC97101|TPC97103|TPC97105|TPC97106|TPC97111|TPC97113|TPC97203|TPC97603|TPC97809|TPC97205|TPC10101|TPC10103|TPC10106|TPC10111|TPC10203|TPC10205|TPC10503',
350
+ // http://www.gloryunion.cn/products.asp
351
+ // http://www.allwinnertech.com/en/apply/mobile.html
352
+ // http://www.ptcl.com.pk/pd_content.php?pd_id=284 (EVOTAB)
353
+ // @todo: Softwiner tablets?
354
+ // aka. Cute or Cool tablets. Not sure yet, must research to avoid collisions.
355
+ 'GUTablet' => 'TX-A1301|TX-M9002|Q702|kf026', // A12R|D75A|D77|D79|R83|A95|A106C|R15|A75|A76|D71|D72|R71|R73|R77|D82|R85|D92|A97|D92|R91|A10F|A77F|W71F|A78F|W78F|W81F|A97F|W91F|W97F|R16G|C72|C73E|K72|K73|R96G
356
+ // http://www.pointofview-online.com/showroom.php?shop_mode=product_listing&category_id=118
357
+ 'PointOfViewTablet' => 'TAB-P506|TAB-navi-7-3G-M|TAB-P517|TAB-P-527|TAB-P701|TAB-P703|TAB-P721|TAB-P731N|TAB-P741|TAB-P825|TAB-P905|TAB-P925|TAB-PR945|TAB-PL1015|TAB-P1025|TAB-PI1045|TAB-P1325|TAB-PROTAB[0-9]+|TAB-PROTAB25|TAB-PROTAB26|TAB-PROTAB27|TAB-PROTAB26XL|TAB-PROTAB2-IPS9|TAB-PROTAB30-IPS9|TAB-PROTAB25XXL|TAB-PROTAB26-IPS10|TAB-PROTAB30-IPS10',
358
+ // http://www.overmax.pl/pl/katalog-produktow,p8/tablety,c14/
359
+ // @todo: add more tests.
360
+ 'OvermaxTablet' => 'OV-(SteelCore|NewBase|Basecore|Baseone|Exellen|Quattor|EduTab|Solution|ACTION|BasicTab|TeddyTab|MagicTab|Stream|TB-08|TB-09)|Qualcore 1027',
361
+ // http://hclmetablet.com/India/index.php
362
+ 'HCLTablet' => 'HCL.*Tablet|Connect-3G-2.0|Connect-2G-2.0|ME Tablet U1|ME Tablet U2|ME Tablet G1|ME Tablet X1|ME Tablet Y2|ME Tablet Sync',
363
+ // http://www.edigital.hu/Tablet_es_e-book_olvaso/Tablet-c18385.html
364
+ 'DPSTablet' => 'DPS Dream 9|DPS Dual 7',
365
+ // http://www.visture.com/index.asp
366
+ 'VistureTablet' => 'V97 HD|i75 3G|Visture V4( HD)?|Visture V5( HD)?|Visture V10',
367
+ // http://www.mijncresta.nl/tablet
368
+ 'CrestaTablet' => 'CTP(-)?810|CTP(-)?818|CTP(-)?828|CTP(-)?838|CTP(-)?888|CTP(-)?978|CTP(-)?980|CTP(-)?987|CTP(-)?988|CTP(-)?989',
369
+ // MediaTek - http://www.mediatek.com/_en/01_products/02_proSys.php?cata_sn=1&cata1_sn=1&cata2_sn=309
370
+ 'MediatekTablet' => '\bMT8125|MT8389|MT8135|MT8377\b',
371
+ // Concorde tab
372
+ 'ConcordeTablet' => 'Concorde([ ]+)?Tab|ConCorde ReadMan',
373
+ // GoClever Tablets - http://www.goclever.com/uk/products,c1/tablet,c5/
374
+ 'GoCleverTablet' => 'GOCLEVER TAB|A7GOCLEVER|M1042|M7841|M742|R1042BK|R1041|TAB A975|TAB A7842|TAB A741|TAB A741L|TAB M723G|TAB M721|TAB A1021|TAB I921|TAB R721|TAB I720|TAB T76|TAB R70|TAB R76.2|TAB R106|TAB R83.2|TAB M813G|TAB I721|GCTA722|TAB I70|TAB I71|TAB S73|TAB R73|TAB R74|TAB R93|TAB R75|TAB R76.1|TAB A73|TAB A93|TAB A93.2|TAB T72|TAB R83|TAB R974|TAB R973|TAB A101|TAB A103|TAB A104|TAB A104.2|R105BK|M713G|A972BK|TAB A971|TAB R974.2|TAB R104|TAB R83.3|TAB A1042',
375
+ // Modecom Tablets - http://www.modecom.eu/tablets/portal/
376
+ 'ModecomTablet' => 'FreeTAB 9000|FreeTAB 7.4|FreeTAB 7004|FreeTAB 7800|FreeTAB 2096|FreeTAB 7.5|FreeTAB 1014|FreeTAB 1001 |FreeTAB 8001|FreeTAB 9706|FreeTAB 9702|FreeTAB 7003|FreeTAB 7002|FreeTAB 1002|FreeTAB 7801|FreeTAB 1331|FreeTAB 1004|FreeTAB 8002|FreeTAB 8014|FreeTAB 9704|FreeTAB 1003',
377
+ // Vonino Tablets - http://www.vonino.eu/tablets
378
+ 'VoninoTablet' => '\b(Argus[ _]?S|Diamond[ _]?79HD|Emerald[ _]?78E|Luna[ _]?70C|Onyx[ _]?S|Onyx[ _]?Z|Orin[ _]?HD|Orin[ _]?S|Otis[ _]?S|SpeedStar[ _]?S|Magnet[ _]?M9|Primus[ _]?94[ _]?3G|Primus[ _]?94HD|Primus[ _]?QS|Android.*\bQ8\b|Sirius[ _]?EVO[ _]?QS|Sirius[ _]?QS|Spirit[ _]?S)\b',
379
+ // ECS Tablets - http://www.ecs.com.tw/ECSWebSite/Product/Product_Tablet_List.aspx?CategoryID=14&MenuID=107&childid=M_107&LanID=0
380
+ 'ECSTablet' => 'V07OT2|TM105A|S10OT1|TR10CS1',
381
+ // Storex Tablets - http://storex.fr/espace_client/support.html
382
+ // @note: no need to add all the tablet codes since they are guided by the first regex.
383
+ 'StorexTablet' => 'eZee[_\']?(Tab|Go)[0-9]+|TabLC7|Looney Tunes Tab',
384
+ // Generic Vodafone tablets.
385
+ 'VodafoneTablet' => 'SmartTab([ ]+)?[0-9]+|SmartTabII10|SmartTabII7|VF-1497',
386
+ // French tablets - Essentiel B http://www.boulanger.fr/tablette_tactile_e-book/tablette_tactile_essentiel_b/cl_68908.htm?multiChoiceToDelete=brand&mc_brand=essentielb
387
+ // Aka: http://www.essentielb.fr/
388
+ 'EssentielBTablet' => 'Smart[ \']?TAB[ ]+?[0-9]+|Family[ \']?TAB2',
389
+ // Ross & Moor - http://ross-moor.ru/
390
+ 'RossMoorTablet' => 'RM-790|RM-997|RMD-878G|RMD-974R|RMT-705A|RMT-701|RME-601|RMT-501|RMT-711',
391
+ // i-mobile http://product.i-mobilephone.com/Mobile_Device
392
+ 'iMobileTablet' => 'i-mobile i-note',
393
+ // http://www.tolino.de/de/vergleichen/
394
+ 'TolinoTablet' => 'tolino tab [0-9.]+|tolino shine',
395
+ // AudioSonic - a Kmart brand
396
+ // http://www.kmart.com.au/webapp/wcs/stores/servlet/Search?langId=-1&storeId=10701&catalogId=10001&categoryId=193001&pageSize=72&currentPage=1&searchCategory=193001%2b4294965664&sortBy=p_MaxPrice%7c1
397
+ 'AudioSonicTablet' => '\bC-22Q|T7-QC|T-17B|T-17P\b',
398
+ // AMPE Tablets - http://www.ampe.com.my/product-category/tablets/
399
+ // @todo: add them gradually to avoid conflicts.
400
+ 'AMPETablet' => 'Android.* A78 ',
401
+ // Skk Mobile - http://skkmobile.com.ph/product_tablets.php
402
+ 'SkkTablet' => 'Android.* (SKYPAD|PHOENIX|CYCLOPS)',
403
+ // Tecno Mobile (only tablet) - http://www.tecno-mobile.com/index.php/product?filterby=smart&list_order=all&page=1
404
+ 'TecnoTablet' => 'TECNO P9',
405
+ // JXD (consoles & tablets) - http://jxd.hk/products.asp?selectclassid=009008&clsid=3
406
+ 'JXDTablet' => 'Android.* \b(F3000|A3300|JXD5000|JXD3000|JXD2000|JXD300B|JXD300|S5800|S7800|S602b|S5110b|S7300|S5300|S602|S603|S5100|S5110|S601|S7100a|P3000F|P3000s|P101|P200s|P1000m|P200m|P9100|P1000s|S6600b|S908|P1000|P300|S18|S6600|S9100)\b',
407
+ // i-Joy tablets - http://www.i-joy.es/en/cat/products/tablets/
408
+ 'iJoyTablet' => 'Tablet (Spirit 7|Essentia|Galatea|Fusion|Onix 7|Landa|Titan|Scooby|Deox|Stella|Themis|Argon|Unique 7|Sygnus|Hexen|Finity 7|Cream|Cream X2|Jade|Neon 7|Neron 7|Kandy|Scape|Saphyr 7|Rebel|Biox|Rebel|Rebel 8GB|Myst|Draco 7|Myst|Tab7-004|Myst|Tadeo Jones|Tablet Boing|Arrow|Draco Dual Cam|Aurix|Mint|Amity|Revolution|Finity 9|Neon 9|T9w|Amity 4GB Dual Cam|Stone 4GB|Stone 8GB|Andromeda|Silken|X2|Andromeda II|Halley|Flame|Saphyr 9,7|Touch 8|Planet|Triton|Unique 10|Hexen 10|Memphis 4GB|Memphis 8GB|Onix 10)',
409
+ // http://www.intracon.eu/tablet
410
+ 'FX2Tablet' => 'FX2 PAD7|FX2 PAD10',
411
+ // http://www.xoro.de/produkte/
412
+ // @note: Might be the same brand with 'Simply tablets'
413
+ 'XoroTablet' => 'KidsPAD 701|PAD[ ]?712|PAD[ ]?714|PAD[ ]?716|PAD[ ]?717|PAD[ ]?718|PAD[ ]?720|PAD[ ]?721|PAD[ ]?722|PAD[ ]?790|PAD[ ]?792|PAD[ ]?900|PAD[ ]?9715D|PAD[ ]?9716DR|PAD[ ]?9718DR|PAD[ ]?9719QR|PAD[ ]?9720QR|TelePAD1030|Telepad1032|TelePAD730|TelePAD731|TelePAD732|TelePAD735Q|TelePAD830|TelePAD9730|TelePAD795|MegaPAD 1331|MegaPAD 1851|MegaPAD 2151',
414
+ // http://www1.viewsonic.com/products/computing/tablets/
415
+ 'ViewsonicTablet' => 'ViewPad 10pi|ViewPad 10e|ViewPad 10s|ViewPad E72|ViewPad7|ViewPad E100|ViewPad 7e|ViewSonic VB733|VB100a',
416
+ // https://www.verizonwireless.com/tablets/verizon/
417
+ 'VerizonTablet' => 'QTAQZ3|QTAIR7|QTAQTZ3|QTASUN1|QTASUN2|QTAXIA1',
418
+ // http://www.odys.de/web/internet-tablet_en.html
419
+ 'OdysTablet' => 'LOOX|XENO10|ODYS[ -](Space|EVO|Xpress|NOON)|\bXELIO\b|Xelio10Pro|XELIO7PHONETAB|XELIO10EXTREME|XELIOPT2|NEO_QUAD10',
420
+ // http://www.captiva-power.de/products.html#tablets-en
421
+ 'CaptivaTablet' => 'CAPTIVA PAD',
422
+ // IconBIT - http://www.iconbit.com/products/tablets/
423
+ 'IconbitTablet' => 'NetTAB|NT-3702|NT-3702S|NT-3702S|NT-3603P|NT-3603P|NT-0704S|NT-0704S|NT-3805C|NT-3805C|NT-0806C|NT-0806C|NT-0909T|NT-0909T|NT-0907S|NT-0907S|NT-0902S|NT-0902S',
424
+ // http://www.teclast.com/topic.php?channelID=70&topicID=140&pid=63
425
+ 'TeclastTablet' => 'T98 4G|\bP80\b|\bX90HD\b|X98 Air|X98 Air 3G|\bX89\b|P80 3G|\bX80h\b|P98 Air|\bX89HD\b|P98 3G|\bP90HD\b|P89 3G|X98 3G|\bP70h\b|P79HD 3G|G18d 3G|\bP79HD\b|\bP89s\b|\bA88\b|\bP10HD\b|\bP19HD\b|G18 3G|\bP78HD\b|\bA78\b|\bP75\b|G17s 3G|G17h 3G|\bP85t\b|\bP90\b|\bP11\b|\bP98t\b|\bP98HD\b|\bG18d\b|\bP85s\b|\bP11HD\b|\bP88s\b|\bA80HD\b|\bA80se\b|\bA10h\b|\bP89\b|\bP78s\b|\bG18\b|\bP85\b|\bA70h\b|\bA70\b|\bG17\b|\bP18\b|\bA80s\b|\bA11s\b|\bP88HD\b|\bA80h\b|\bP76s\b|\bP76h\b|\bP98\b|\bA10HD\b|\bP78\b|\bP88\b|\bA11\b|\bA10t\b|\bP76a\b|\bP76t\b|\bP76e\b|\bP85HD\b|\bP85a\b|\bP86\b|\bP75HD\b|\bP76v\b|\bA12\b|\bP75a\b|\bA15\b|\bP76Ti\b|\bP81HD\b|\bA10\b|\bT760VE\b|\bT720HD\b|\bP76\b|\bP73\b|\bP71\b|\bP72\b|\bT720SE\b|\bC520Ti\b|\bT760\b|\bT720VE\b|T720-3GE|T720-WiFi',
426
+ // Onda - http://www.onda-tablet.com/buy-android-onda.html?dir=desc&limit=all&order=price
427
+ 'OndaTablet' => '\b(V975i|Vi30|VX530|V701|Vi60|V701s|Vi50|V801s|V719|Vx610w|VX610W|V819i|Vi10|VX580W|Vi10|V711s|V813|V811|V820w|V820|Vi20|V711|VI30W|V712|V891w|V972|V819w|V820w|Vi60|V820w|V711|V813s|V801|V819|V975s|V801|V819|V819|V818|V811|V712|V975m|V101w|V961w|V812|V818|V971|V971s|V919|V989|V116w|V102w|V973|Vi40)\b[\s]+',
428
+ 'JaytechTablet' => 'TPC-PA762',
429
+ 'BlaupunktTablet' => 'Endeavour 800NG|Endeavour 1010',
430
+ // http://www.digma.ru/support/download/
431
+ // @todo: Ebooks also (if requested)
432
+ 'DigmaTablet' => '\b(iDx10|iDx9|iDx8|iDx7|iDxD7|iDxD8|iDsQ8|iDsQ7|iDsQ8|iDsD10|iDnD7|3TS804H|iDsQ11|iDj7|iDs10)\b',
433
+ // http://www.evolioshop.com/ro/tablete-pc.html
434
+ // http://www.evolio.ro/support/downloads_static.html?cat=2
435
+ // @todo: Research some more
436
+ 'EvolioTablet' => 'ARIA_Mini_wifi|Aria[ _]Mini|Evolio X10|Evolio X7|Evolio X8|\bEvotab\b|\bNeura\b',
437
+ // @todo http://www.lavamobiles.com/tablets-data-cards
438
+ 'LavaTablet' => 'QPAD E704|\bIvoryS\b|E-TAB IVORY|\bE-TAB\b',
439
+ // http://www.breezetablet.com/
440
+ 'AocTablet' => 'MW0811|MW0812|MW0922|MTK8382|MW1031|MW0831|MW0821|MW0931|MW0712',
441
+ // http://www.mpmaneurope.com/en/products/internet-tablets-14/android-tablets-14/
442
+ 'MpmanTablet' => 'MP11 OCTA|MP10 OCTA|MPQC1114|MPQC1004|MPQC994|MPQC974|MPQC973|MPQC804|MPQC784|MPQC780|\bMPG7\b|MPDCG75|MPDCG71|MPDC1006|MP101DC|MPDC9000|MPDC905|MPDC706HD|MPDC706|MPDC705|MPDC110|MPDC100|MPDC99|MPDC97|MPDC88|MPDC8|MPDC77|MP709|MID701|MID711|MID170|MPDC703|MPQC1010',
443
+ // https://www.celkonmobiles.com/?_a=categoryphones&sid=2
444
+ 'CelkonTablet' => 'CT695|CT888|CT[\s]?910|CT7 Tab|CT9 Tab|CT3 Tab|CT2 Tab|CT1 Tab|C820|C720|\bCT-1\b',
445
+ // http://www.wolderelectronics.com/productos/manuales-y-guias-rapidas/categoria-2-miTab
446
+ 'WolderTablet' => 'miTab \b(DIAMOND|SPACE|BROOKLYN|NEO|FLY|MANHATTAN|FUNK|EVOLUTION|SKY|GOCAR|IRON|GENIUS|POP|MINT|EPSILON|BROADWAY|JUMP|HOP|LEGEND|NEW AGE|LINE|ADVANCE|FEEL|FOLLOW|LIKE|LINK|LIVE|THINK|FREEDOM|CHICAGO|CLEVELAND|BALTIMORE-GH|IOWA|BOSTON|SEATTLE|PHOENIX|DALLAS|IN 101|MasterChef)\b',
447
+ // http://www.mi.com/en
448
+ 'MiTablet' => '\bMI PAD\b|\bHM NOTE 1W\b',
449
+ // http://www.nbru.cn/index.html
450
+ 'NibiruTablet' => 'Nibiru M1|Nibiru Jupiter One',
451
+ // http://navroad.com/products/produkty/tablety/
452
+ // http://navroad.com/products/produkty/tablety/
453
+ 'NexoTablet' => 'NEXO NOVA|NEXO 10|NEXO AVIO|NEXO FREE|NEXO GO|NEXO EVO|NEXO 3G|NEXO SMART|NEXO KIDDO|NEXO MOBI',
454
+ // http://leader-online.com/new_site/product-category/tablets/
455
+ // http://www.leader-online.net.au/List/Tablet
456
+ 'LeaderTablet' => 'TBLT10Q|TBLT10I|TBL-10WDKB|TBL-10WDKBO2013|TBL-W230V2|TBL-W450|TBL-W500|SV572|TBLT7I|TBA-AC7-8G|TBLT79|TBL-8W16|TBL-10W32|TBL-10WKB|TBL-W100',
457
+ // http://www.datawind.com/ubislate/
458
+ 'UbislateTablet' => 'UbiSlate[\s]?7C',
459
+ // http://www.pocketbook-int.com/ru/support
460
+ 'PocketBookTablet' => 'Pocketbook',
461
+ // http://www.kocaso.com/product_tablet.html
462
+ 'KocasoTablet' => '\b(TB-1207)\b',
463
+ // http://global.hisense.com/product/asia/tablet/Sero7/201412/t20141215_91832.htm
464
+ 'HisenseTablet' => '\b(F5281|E2371)\b',
465
+ // http://www.tesco.com/direct/hudl/
466
+ 'Hudl' => 'Hudl HT7S3|Hudl 2',
467
+ // http://www.telstra.com.au/home-phone/thub-2/
468
+ 'TelstraTablet' => 'T-Hub2',
469
+ 'GenericTablet' => 'Android.*\b97D\b|Tablet(?!.*PC)|BNTV250A|MID-WCDMA|LogicPD Zoom2|\bA7EB\b|CatNova8|A1_07|CT704|CT1002|\bM721\b|rk30sdk|\bEVOTAB\b|M758A|ET904|ALUMIUM10|Smartfren Tab|Endeavour 1010|Tablet-PC-4|Tagi Tab|\bM6pro\b|CT1020W|arc 10HD|\bTP750\b|\bQTAQZ3\b'
470
+ );
471
+
472
+ /**
473
+ * List of mobile Operating Systems.
474
+ *
475
+ * @var array
476
+ */
477
+ protected static $operatingSystems = array(
478
+ 'AndroidOS' => 'Android',
479
+ 'BlackBerryOS' => 'blackberry|\bBB10\b|rim tablet os',
480
+ 'PalmOS' => 'PalmOS|avantgo|blazer|elaine|hiptop|palm|plucker|xiino',
481
+ 'SymbianOS' => 'Symbian|SymbOS|Series60|Series40|SYB-[0-9]+|\bS60\b',
482
+ // @reference: http://en.wikipedia.org/wiki/Windows_Mobile
483
+ 'WindowsMobileOS' => 'Windows CE.*(PPC|Smartphone|Mobile|[0-9]{3}x[0-9]{3})|Window Mobile|Windows Phone [0-9.]+|WCE;',
484
+ // @reference: http://en.wikipedia.org/wiki/Windows_Phone
485
+ // http://wifeng.cn/?r=blog&a=view&id=106
486
+ // http://nicksnettravels.builttoroam.com/post/2011/01/10/Bogus-Windows-Phone-7-User-Agent-String.aspx
487
+ // http://msdn.microsoft.com/library/ms537503.aspx
488
+ // https://msdn.microsoft.com/en-us/library/hh869301(v=vs.85).aspx
489
+ 'WindowsPhoneOS' => 'Windows Phone 10.0|Windows Phone 8.1|Windows Phone 8.0|Windows Phone OS|XBLWP7|ZuneWP7|Windows NT 6.[23]; ARM;',
490
+ 'iOS' => '\biPhone.*Mobile|\biPod|\biPad|AppleCoreMedia',
491
+ // http://en.wikipedia.org/wiki/MeeGo
492
+ // @todo: research MeeGo in UAs
493
+ 'MeeGoOS' => 'MeeGo',
494
+ // http://en.wikipedia.org/wiki/Maemo
495
+ // @todo: research Maemo in UAs
496
+ 'MaemoOS' => 'Maemo',
497
+ 'JavaOS' => 'J2ME/|\bMIDP\b|\bCLDC\b', // '|Java/' produces bug #135
498
+ 'webOS' => 'webOS|hpwOS',
499
+ 'badaOS' => '\bBada\b',
500
+ 'BREWOS' => 'BREW',
501
+ );
502
+
503
+ /**
504
+ * List of mobile User Agents.
505
+ *
506
+ * IMPORTANT: This is a list of only mobile browsers.
507
+ * Mobile Detect 2.x supports only mobile browsers,
508
+ * it was never designed to detect all browsers.
509
+ * The change will come in 2017 in the 3.x release for PHP7.
510
+ *
511
+ * @var array
512
+ */
513
+ protected static $browsers = array(
514
+ //'Vivaldi' => 'Vivaldi',
515
+ // @reference: https://developers.google.com/chrome/mobile/docs/user-agent
516
+ 'Chrome' => '\bCrMo\b|CriOS|Android.*Chrome/[.0-9]* (Mobile)?',
517
+ 'Dolfin' => '\bDolfin\b',
518
+ 'Opera' => 'Opera.*Mini|Opera.*Mobi|Android.*Opera|Mobile.*OPR/[0-9.]+|Coast/[0-9.]+',
519
+ 'Skyfire' => 'Skyfire',
520
+ 'Edge' => 'Mobile Safari/[.0-9]* Edge',
521
+ 'IE' => 'IEMobile|MSIEMobile', // |Trident/[.0-9]+
522
+ 'Firefox' => 'fennec|firefox.*maemo|(Mobile|Tablet).*Firefox|Firefox.*Mobile|FxiOS',
523
+ 'Bolt' => 'bolt',
524
+ 'TeaShark' => 'teashark',
525
+ 'Blazer' => 'Blazer',
526
+ // @reference: http://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariWebContent/OptimizingforSafarioniPhone/OptimizingforSafarioniPhone.html#//apple_ref/doc/uid/TP40006517-SW3
527
+ 'Safari' => 'Version.*Mobile.*Safari|Safari.*Mobile|MobileSafari',
528
+ // http://en.wikipedia.org/wiki/Midori_(web_browser)
529
+ //'Midori' => 'midori',
530
+ //'Tizen' => 'Tizen',
531
+ 'UCBrowser' => 'UC.*Browser|UCWEB',
532
+ 'baiduboxapp' => 'baiduboxapp',
533
+ 'baidubrowser' => 'baidubrowser',
534
+ // https://github.com/serbanghita/Mobile-Detect/issues/7
535
+ 'DiigoBrowser' => 'DiigoBrowser',
536
+ // http://www.puffinbrowser.com/index.php
537
+ 'Puffin' => 'Puffin',
538
+ // http://mercury-browser.com/index.html
539
+ 'Mercury' => '\bMercury\b',
540
+ // http://en.wikipedia.org/wiki/Obigo_Browser
541
+ 'ObigoBrowser' => 'Obigo',
542
+ // http://en.wikipedia.org/wiki/NetFront
543
+ 'NetFront' => 'NF-Browser',
544
+ // @reference: http://en.wikipedia.org/wiki/Minimo
545
+ // http://en.wikipedia.org/wiki/Vision_Mobile_Browser
546
+ 'GenericBrowser' => 'NokiaBrowser|OviBrowser|OneBrowser|TwonkyBeamBrowser|SEMC.*Browser|FlyFlow|Minimo|NetFront|Novarra-Vision|MQQBrowser|MicroMessenger',
547
+ // @reference: https://en.wikipedia.org/wiki/Pale_Moon_(web_browser)
548
+ 'PaleMoon' => 'Android.*PaleMoon|Mobile.*PaleMoon',
549
+ );
550
+
551
+ /**
552
+ * Utilities.
553
+ *
554
+ * @var array
555
+ */
556
+ protected static $utilities = array(
557
+ // Experimental. When a mobile device wants to switch to 'Desktop Mode'.
558
+ // http://scottcate.com/technology/windows-phone-8-ie10-desktop-or-mobile/
559
+ // https://github.com/serbanghita/Mobile-Detect/issues/57#issuecomment-15024011
560
+ // https://developers.facebook.com/docs/sharing/best-practices
561
+ 'Bot' => 'Googlebot|facebookexternalhit|AdsBot-Google|Google Keyword Suggestion|Facebot|YandexBot|YandexMobileBot|bingbot|ia_archiver|AhrefsBot|Ezooms|GSLFbot|WBSearchBot|Twitterbot|TweetmemeBot|Twikle|PaperLiBot|Wotbox|UnwindFetchor|Exabot|MJ12bot|YandexImages|TurnitinBot|Pingdom',
562
+ 'MobileBot' => 'Googlebot-Mobile|AdsBot-Google-Mobile|YahooSeeker/M1A1-R2D2',
563
+ 'DesktopMode' => 'WPDesktop',
564
+ 'TV' => 'SonyDTV|HbbTV', // experimental
565
+ 'WebKit' => '(webkit)[ /]([\w.]+)',
566
+ // @todo: Include JXD consoles.
567
+ 'Console' => '\b(Nintendo|Nintendo WiiU|Nintendo 3DS|PLAYSTATION|Xbox)\b',
568
+ 'Watch' => 'SM-V700',
569
+ );
570
+
571
+ /**
572
+ * All possible HTTP headers that represent the
573
+ * User-Agent string.
574
+ *
575
+ * @var array
576
+ */
577
+ protected static $uaHttpHeaders = array(
578
+ // The default User-Agent string.
579
+ 'HTTP_USER_AGENT',
580
+ // Header can occur on devices using Opera Mini.
581
+ 'HTTP_X_OPERAMINI_PHONE_UA',
582
+ // Vodafone specific header: http://www.seoprinciple.com/mobile-web-community-still-angry-at-vodafone/24/
583
+ 'HTTP_X_DEVICE_USER_AGENT',
584
+ 'HTTP_X_ORIGINAL_USER_AGENT',
585
+ 'HTTP_X_SKYFIRE_PHONE',
586
+ 'HTTP_X_BOLT_PHONE_UA',
587
+ 'HTTP_DEVICE_STOCK_UA',
588
+ 'HTTP_X_UCBROWSER_DEVICE_UA'
589
+ );
590
+
591
+ /**
592
+ * The individual segments that could exist in a User-Agent string. VER refers to the regular
593
+ * expression defined in the constant self::VER.
594
+ *
595
+ * @var array
596
+ */
597
+ protected static $properties = array(
598
+
599
+ // Build
600
+ 'Mobile' => 'Mobile/[VER]',
601
+ 'Build' => 'Build/[VER]',
602
+ 'Version' => 'Version/[VER]',
603
+ 'VendorID' => 'VendorID/[VER]',
604
+
605
+ // Devices
606
+ 'iPad' => 'iPad.*CPU[a-z ]+[VER]',
607
+ 'iPhone' => 'iPhone.*CPU[a-z ]+[VER]',
608
+ 'iPod' => 'iPod.*CPU[a-z ]+[VER]',
609
+ //'BlackBerry' => array('BlackBerry[VER]', 'BlackBerry [VER];'),
610
+ 'Kindle' => 'Kindle/[VER]',
611
+
612
+ // Browser
613
+ 'Chrome' => array('Chrome/[VER]', 'CriOS/[VER]', 'CrMo/[VER]'),
614
+ 'Coast' => array('Coast/[VER]'),
615
+ 'Dolfin' => 'Dolfin/[VER]',
616
+ // @reference: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent/Firefox
617
+ 'Firefox' => array('Firefox/[VER]', 'FxiOS/[VER]'),
618
+ 'Fennec' => 'Fennec/[VER]',
619
+ // http://msdn.microsoft.com/en-us/library/ms537503(v=vs.85).aspx
620
+ // https://msdn.microsoft.com/en-us/library/ie/hh869301(v=vs.85).aspx
621
+ 'Edge' => 'Edge/[VER]',
622
+ 'IE' => array('IEMobile/[VER];', 'IEMobile [VER]', 'MSIE [VER];', 'Trident/[0-9.]+;.*rv:[VER]'),
623
+ // http://en.wikipedia.org/wiki/NetFront
624
+ 'NetFront' => 'NetFront/[VER]',
625
+ 'NokiaBrowser' => 'NokiaBrowser/[VER]',
626
+ 'Opera' => array( ' OPR/[VER]', 'Opera Mini/[VER]', 'Version/[VER]' ),
627
+ 'Opera Mini' => 'Opera Mini/[VER]',
628
+ 'Opera Mobi' => 'Version/[VER]',
629
+ 'UCBrowser' => array( 'UCWEB[VER]', 'UC.*Browser/[VER]' ),
630
+ 'MQQBrowser' => 'MQQBrowser/[VER]',
631
+ 'MicroMessenger' => 'MicroMessenger/[VER]',
632
+ 'baiduboxapp' => 'baiduboxapp/[VER]',
633
+ 'baidubrowser' => 'baidubrowser/[VER]',
634
+ 'SamsungBrowser' => 'SamsungBrowser/[VER]',
635
+ 'Iron' => 'Iron/[VER]',
636
+ // @note: Safari 7534.48.3 is actually Version 5.1.
637
+ // @note: On BlackBerry the Version is overwriten by the OS.
638
+ 'Safari' => array( 'Version/[VER]', 'Safari/[VER]' ),
639
+ 'Skyfire' => 'Skyfire/[VER]',
640
+ 'Tizen' => 'Tizen/[VER]',
641
+ 'Webkit' => 'webkit[ /][VER]',
642
+ 'PaleMoon' => 'PaleMoon/[VER]',
643
+
644
+ // Engine
645
+ 'Gecko' => 'Gecko/[VER]',
646
+ 'Trident' => 'Trident/[VER]',
647
+ 'Presto' => 'Presto/[VER]',
648
+ 'Goanna' => 'Goanna/[VER]',
649
+
650
+ // OS
651
+ 'iOS' => ' \bi?OS\b [VER][ ;]{1}',
652
+ 'Android' => 'Android [VER]',
653
+ 'BlackBerry' => array('BlackBerry[\w]+/[VER]', 'BlackBerry.*Version/[VER]', 'Version/[VER]'),
654
+ 'BREW' => 'BREW [VER]',
655
+ 'Java' => 'Java/[VER]',
656
+ // @reference: http://windowsteamblog.com/windows_phone/b/wpdev/archive/2011/08/29/introducing-the-ie9-on-windows-phone-mango-user-agent-string.aspx
657
+ // @reference: http://en.wikipedia.org/wiki/Windows_NT#Releases
658
+ 'Windows Phone OS' => array( 'Windows Phone OS [VER]', 'Windows Phone [VER]'),
659
+ 'Windows Phone' => 'Windows Phone [VER]',
660
+ 'Windows CE' => 'Windows CE/[VER]',
661
+ // http://social.msdn.microsoft.com/Forums/en-US/windowsdeveloperpreviewgeneral/thread/6be392da-4d2f-41b4-8354-8dcee20c85cd
662
+ 'Windows NT' => 'Windows NT [VER]',
663
+ 'Symbian' => array('SymbianOS/[VER]', 'Symbian/[VER]'),
664
+ 'webOS' => array('webOS/[VER]', 'hpwOS/[VER];'),
665
+ );
666
+
667
+ /**
668
+ * Construct an instance of this class.
669
+ *
670
+ * @param array $headers Specify the headers as injection. Should be PHP _SERVER flavored.
671
+ * If left empty, will use the global _SERVER['HTTP_*'] vars instead.
672
+ * @param string $userAgent Inject the User-Agent header. If null, will use HTTP_USER_AGENT
673
+ * from the $headers array instead.
674
+ */
675
+ public function __construct(
676
+ array $headers = null,
677
+ $userAgent = null
678
+ ) {
679
+ $this->setHttpHeaders($headers);
680
+ $this->setUserAgent($userAgent);
681
+ }
682
+
683
+ /**
684
+ * Get the current script version.
685
+ * This is useful for the demo.php file,
686
+ * so people can check on what version they are testing
687
+ * for mobile devices.
688
+ *
689
+ * @return string The version number in semantic version format.
690
+ */
691
+ public static function getScriptVersion()
692
+ {
693
+ return self::VERSION;
694
+ }
695
+
696
+ /**
697
+ * Set the HTTP Headers. Must be PHP-flavored. This method will reset existing headers.
698
+ *
699
+ * @param array $httpHeaders The headers to set. If null, then using PHP's _SERVER to extract
700
+ * the headers. The default null is left for backwards compatibility.
701
+ */
702
+ public function setHttpHeaders($httpHeaders = null)
703
+ {
704
+ // use global _SERVER if $httpHeaders aren't defined
705
+ if (!is_array($httpHeaders) || !count($httpHeaders)) {
706
+ $httpHeaders = $_SERVER;
707
+ }
708
+
709
+ // clear existing headers
710
+ $this->httpHeaders = array();
711
+
712
+ // Only save HTTP headers. In PHP land, that means only _SERVER vars that
713
+ // start with HTTP_.
714
+ foreach ($httpHeaders as $key => $value) {
715
+ if (substr($key, 0, 5) === 'HTTP_') {
716
+ $this->httpHeaders[$key] = $value;
717
+ }
718
+ }
719
+
720
+ // In case we're dealing with CloudFront, we need to know.
721
+ $this->setCfHeaders($httpHeaders);
722
+ }
723
+
724
+ /**
725
+ * Retrieves the HTTP headers.
726
+ *
727
+ * @return array
728
+ */
729
+ public function getHttpHeaders()
730
+ {
731
+ return $this->httpHeaders;
732
+ }
733
+
734
+ /**
735
+ * Retrieves a particular header. If it doesn't exist, no exception/error is caused.
736
+ * Simply null is returned.
737
+ *
738
+ * @param string $header The name of the header to retrieve. Can be HTTP compliant such as
739
+ * "User-Agent" or "X-Device-User-Agent" or can be php-esque with the
740
+ * all-caps, HTTP_ prefixed, underscore seperated awesomeness.
741
+ *
742
+ * @return string|null The value of the header.
743
+ */
744
+ public function getHttpHeader($header)
745
+ {
746
+ // are we using PHP-flavored headers?
747
+ if (strpos($header, '_') === false) {
748
+ $header = str_replace('-', '_', $header);
749
+ $header = strtoupper($header);
750
+ }
751
+
752
+ // test the alternate, too
753
+ $altHeader = 'HTTP_' . $header;
754
+
755
+ //Test both the regular and the HTTP_ prefix
756
+ if (isset($this->httpHeaders[$header])) {
757
+ return $this->httpHeaders[$header];
758
+ } elseif (isset($this->httpHeaders[$altHeader])) {
759
+ return $this->httpHeaders[$altHeader];
760
+ }
761
+
762
+ return null;
763
+ }
764
+
765
+ public function getMobileHeaders()
766
+ {
767
+ return self::$mobileHeaders;
768
+ }
769
+
770
+ /**
771
+ * Get all possible HTTP headers that
772
+ * can contain the User-Agent string.
773
+ *
774
+ * @return array List of HTTP headers.
775
+ */
776
+ public function getUaHttpHeaders()
777
+ {
778
+ return self::$uaHttpHeaders;
779
+ }
780
+
781
+
782
+ /**
783
+ * Set CloudFront headers
784
+ * http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/header-caching.html#header-caching-web-device
785
+ *
786
+ * @param array $cfHeaders List of HTTP headers
787
+ *
788
+ * @return boolean If there were CloudFront headers to be set
789
+ */
790
+ public function setCfHeaders($cfHeaders = null) {
791
+ // use global _SERVER if $cfHeaders aren't defined
792
+ if (!is_array($cfHeaders) || !count($cfHeaders)) {
793
+ $cfHeaders = $_SERVER;
794
+ }
795
+
796
+ // clear existing headers
797
+ $this->cloudfrontHeaders = array();
798
+
799
+ // Only save CLOUDFRONT headers. In PHP land, that means only _SERVER vars that
800
+ // start with cloudfront-.
801
+ $response = false;
802
+ foreach ($cfHeaders as $key => $value) {
803
+ if (substr(strtolower($key), 0, 16) === 'http_cloudfront_') {
804
+ $this->cloudfrontHeaders[strtoupper($key)] = $value;
805
+ $response = true;
806
+ }
807
+ }
808
+
809
+ return $response;
810
+ }
811
+
812
+ /**
813
+ * Retrieves the cloudfront headers.
814
+ *
815
+ * @return array
816
+ */
817
+ public function getCfHeaders()
818
+ {
819
+ return $this->cloudfrontHeaders;
820
+ }
821
+
822
+ /**
823
+ * @param string $userAgent
824
+ * @return string
825
+ */
826
+ private function prepareUserAgent($userAgent) {
827
+ $userAgent = trim($userAgent);
828
+ $userAgent = substr($userAgent, 0, 500