Subscribe2 - Version 10.33

Version Description

(4th June, 2020) =

  • Bump tested upto version 4.4
  • Minimum PHP version set to 5.4

See complete changelog.

Download this release

Release Info

Developer tareq1988
Plugin Icon 128x128 Subscribe2
Version 10.33
Comparing to
See all releases

Code changes from version 10.32 to 10.33

.gitignore ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ config.codekit
2
+ .idea
3
+ .codekit-cache
4
+ /vendor/
5
+ node_modules
6
+ zip
7
+ .DS_Store
8
+ nbproject
9
+ debug.log
10
+ npm-debug.log
11
+ .netbeans.xml
12
+ .vscode
13
+ build/*
14
+ !build/index.js
ChangeLog.txt → changelog.txt RENAMED
@@ -1,3 +1,8 @@
 
 
 
 
 
1
  = 10.32 =
2
 
3
  * Bump minimum required WordPress to 4.4
1
+ = 10.33 (4th June, 2020) =
2
+
3
+ * Bump tested upto version 4.4
4
+ * Minimum PHP version set to 5.4
5
+
6
  = 10.32 =
7
 
8
  * Bump minimum required WordPress to 4.4
classes/class-mo-admin-notice.php CHANGED
@@ -46,11 +46,11 @@ if ( ! class_exists( 'MO_Admin_Notice' ) ) {
46
  );
47
  $this->notice_css();
48
  $install_url = wp_nonce_url(
49
- admin_url( 'update.php?action=install-plugin&plugin=mailoptin' ),
50
  'install-plugin_mailoptin'
51
  );
52
 
53
- $activate_url = wp_nonce_url( admin_url( 'plugins.php?action=activate&plugin=mailoptin%2Fmailoptin.php' ), 'activate-plugin_mailoptin/mailoptin.php' );
54
  ?>
55
  <div class="mo-admin-notice notice notice-success">
56
  <div class="mo-notice-first-half">
@@ -58,7 +58,7 @@ if ( ! class_exists( 'MO_Admin_Notice' ) ) {
58
  <?php
59
  printf(
60
  // Translators: Mail Optin admin notice
61
- __( 'Free optin form plugin that will %1$sincrease your email list subscribers%2$s and keep them engaged with %1$sautomated and schedule newsletters%2$s.', 'subscribe2' ),
62
  '<span class="mo-stylize"><strong>',
63
  '</strong></span>'
64
  );
@@ -69,16 +69,16 @@ if ( ! class_exists( 'MO_Admin_Notice' ) ) {
69
  <div class="mo-notice-other-half">
70
  <?php if ( ! $this->is_plugin_installed() ) : ?>
71
  <a class="button button-primary button-hero" id="mo-install-mailoptin-plugin" href="<?php echo $install_url; ?>">
72
- <?php _e( 'Install MailOptin Now for Free!', 'subscribe2' ); ?>
73
  </a>
74
  <?php endif; ?>
75
  <?php if ( $this->is_plugin_installed() && ! $this->is_plugin_active() ) : ?>
76
  <a class="button button-primary button-hero" id="mo-activate-mailoptin-plugin" href="<?php echo $activate_url; ?>">
77
- <?php _e( 'Activate MailOptin Now!', 'subscribe2' ); ?>
78
  </a>
79
  <?php endif; ?>
80
  <div class="mo-notice-learn-more">
81
- <a target="_blank" href="https://mailoptin.io">Learn more</a>
82
  </div>
83
  </div>
84
  <a href="<?php echo $dismiss_url; ?>">
@@ -107,11 +107,11 @@ if ( ! class_exists( 'MO_Admin_Notice' ) ) {
107
  public function is_plugin_installed() {
108
  $installed_plugins = get_plugins();
109
 
110
- return isset( $installed_plugins['mailoptin/mailoptin.php'] );
111
  }
112
 
113
  public function is_plugin_active() {
114
- return is_plugin_active( 'mailoptin/mailoptin.php' );
115
  }
116
 
117
  public function notice_css() {
46
  );
47
  $this->notice_css();
48
  $install_url = wp_nonce_url(
49
+ admin_url( 'plugin-install.php?s=wemail&tab=search&type=term' ),
50
  'install-plugin_mailoptin'
51
  );
52
 
53
+ $activate_url = wp_nonce_url( admin_url( 'plugins.php?action=activate&plugin=wemail%2Fwemail.php' ), 'activate-plugin_wemail/wemail.php' );
54
  ?>
55
  <div class="mo-admin-notice notice notice-success">
56
  <div class="mo-notice-first-half">
58
  <?php
59
  printf(
60
  // Translators: Mail Optin admin notice
61
+ __( 'Free email newsletter plugin that will %1$sincrease your email list subscribers%2$s and keep them engaged with %1$sautomated and schedule newsletters%2$s.', 'subscribe2' ),
62
  '<span class="mo-stylize"><strong>',
63
  '</strong></span>'
64
  );
69
  <div class="mo-notice-other-half">
70
  <?php if ( ! $this->is_plugin_installed() ) : ?>
71
  <a class="button button-primary button-hero" id="mo-install-mailoptin-plugin" href="<?php echo $install_url; ?>">
72
+ <?php _e( 'Install weMail Now for Free!', 'subscribe2' ); ?>
73
  </a>
74
  <?php endif; ?>
75
  <?php if ( $this->is_plugin_installed() && ! $this->is_plugin_active() ) : ?>
76
  <a class="button button-primary button-hero" id="mo-activate-mailoptin-plugin" href="<?php echo $activate_url; ?>">
77
+ <?php _e( 'Activate weMail Now!', 'subscribe2' ); ?>
78
  </a>
79
  <?php endif; ?>
80
  <div class="mo-notice-learn-more">
81
+ <a target="_blank" href="https://getwemail.io">Learn more</a>
82
  </div>
83
  </div>
84
  <a href="<?php echo $dismiss_url; ?>">
107
  public function is_plugin_installed() {
108
  $installed_plugins = get_plugins();
109
 
110
+ return isset( $installed_plugins['wemail/wemail.php'] );
111
  }
112
 
113
  public function is_plugin_active() {
114
+ return is_plugin_active( 'wemail/wemail.php' );
115
  }
116
 
117
  public function notice_css() {
include/appsero/composer.json ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "appsero/client",
3
+ "description": "Appsero Client",
4
+ "keywords": ["analytics", "wordpress", "plugin", "theme"],
5
+ "type": "library",
6
+ "license": "MIT",
7
+ "authors": [
8
+ {
9
+ "name": "Tareq Hasan",
10
+ "email": "tareq@appsero.com"
11
+ }
12
+ ],
13
+ "autoload": {
14
+ "psr-4": {
15
+ "Appsero\\": "src/"
16
+ }
17
+ },
18
+ "require": {
19
+ "php": ">=5.3"
20
+ }
21
+ }
include/appsero/readme.md ADDED
@@ -0,0 +1,206 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Appsero - Client
2
+
3
+ - [Installation](#installation)
4
+ - [Insights](#insights)
5
+ - [Dynamic Usage](#dynamic-usage)
6
+
7
+
8
+ ## Installation
9
+
10
+ You can install AppSero Client in two ways, via composer and manually.
11
+
12
+ ### 1. Composer Installation
13
+
14
+ Add dependency in your project (theme/plugin):
15
+
16
+ ```
17
+ composer require appsero/client
18
+ ```
19
+
20
+ Now add `autoload.php` in your file if you haven't done already.
21
+
22
+ ```php
23
+ require __DIR__ . '/vendor/autoload.php';
24
+ ```
25
+
26
+ ### 2. Manual Installation
27
+
28
+ Clone the repository in your project.
29
+
30
+ ```
31
+ cd /path/to/your/project/folder
32
+ git clone https://github.com/AppSero/client.git appsero
33
+ ```
34
+
35
+ Now include the dependencies in your plugin/theme.
36
+
37
+ ```php
38
+ require __DIR__ . '/appsero/src/Client.php';
39
+ ```
40
+
41
+ ## Insights
42
+
43
+ AppSero can be used in both themes and plugins.
44
+
45
+ The `Appsero\Client` class has *three* parameters:
46
+
47
+ ```php
48
+ $client = new Appsero\Client( $hash, $name, $file );
49
+ ```
50
+
51
+ - **hash** (*string*, *required*) - The unique identifier for a plugin or theme.
52
+ - **name** (*string*, *required*) - The name of the plugin or theme.
53
+ - **file** (*string*, *required*) - The **main file** path of the plugin. For theme, path to `functions.php`
54
+
55
+ ### Usage Example
56
+
57
+ Please refer to the **installation** step before start using the class.
58
+
59
+ You can obtain the **hash** for your plugin for the [Appsero Dashboard](https://dashboard.appsero.com). The 3rd parameter **must** have to be the main file of the plugin.
60
+
61
+ ```php
62
+ /**
63
+ * Initialize the tracker
64
+ *
65
+ * @return void
66
+ */
67
+ function appsero_init_tracker_appsero_test() {
68
+
69
+ if ( ! class_exists( 'Appsero\Client' ) ) {
70
+ require_once __DIR__ . '/appsero/src/Client.php';
71
+ }
72
+
73
+ $client = new Appsero\Client( 'a4a8da5b-b419-4656-98e9-4a42e9044891', 'Akismet', __FILE__ );
74
+
75
+ // Active insights
76
+ $client->insights()->init();
77
+
78
+ // Active automatic updater
79
+ $client->updater();
80
+
81
+ // Active license page and checker
82
+ $args = array(
83
+ 'type' => 'options',
84
+ 'menu_title' => 'Akismet',
85
+ 'page_title' => 'Akismet License Settings',
86
+ 'menu_slug' => 'akismet_settings',
87
+ );
88
+ $client->license()->add_settings_page( $args );
89
+ }
90
+
91
+ appsero_init_tracker_appsero_test();
92
+ ```
93
+
94
+ Make sure you call this function directly, never use any action hook to call this function.
95
+
96
+ > For plugins example code that needs to be used on your main plugin file.
97
+ > For themes example code that needs to be used on your themes `functions.php` file.
98
+
99
+ ## More Usage
100
+
101
+ Sometimes you wouldn't want to show the notice, or want to customize the notice message. You can do that as well.
102
+
103
+ ```php
104
+ $client = new Appsero\Client( 'a4a8da5b-b419-4656-98e9-4a42e9044892', 'Twenty Twelve', __FILE__ );
105
+ ```
106
+
107
+ #### 1. Hiding the notice
108
+
109
+ ```php
110
+ $client->insights()
111
+ ->hide_notice()
112
+ ->init();
113
+ ```
114
+
115
+ #### 2. Customizing the notice message
116
+
117
+ ```php
118
+ $client->insights()
119
+ ->notice( 'My Custom Notice Message' )
120
+ ->init();
121
+ ```
122
+
123
+ #### 3. Adding extra data
124
+
125
+ You can add extra metadata from your theme or plugin. In that case, the **keys** has to be whitelisted from the Appsero dashboard.
126
+ `add_extra` method also support callback as parameter, If you need database call then callback is best for you.
127
+
128
+ ```php
129
+ $metadata = array(
130
+ 'key' => 'value',
131
+ 'another' => 'another_value'
132
+ );
133
+ $client->insights()
134
+ ->add_extra( $metadata )
135
+ ->init();
136
+ ```
137
+
138
+ or
139
+
140
+ ```php
141
+ $metadata = function () {
142
+ return array(
143
+ 'key' => 'value',
144
+ 'another' => 'another_value'
145
+ );
146
+ };
147
+ $client->insights()
148
+ ->add_extra( $metadata )
149
+ ->init();
150
+ ```
151
+
152
+ ---
153
+
154
+ ### Check License Validity
155
+
156
+ Check your plugin/theme is using with valid license or not, First create a global variable of `License` object then use it anywhere in your code.
157
+ If you are using it outside of same function make sure you global the variable before using the condition.
158
+
159
+ ```php
160
+ $client = new Appsero\Client( 'a4a8da5b-b419-4656-98e9-4a42e9044892', 'Twenty Twelve', __FILE__ );
161
+
162
+ $args = array(
163
+ 'type' => 'submenu',
164
+ 'menu_title' => 'Twenty Twelve License',
165
+ 'page_title' => 'Twenty Twelve License Settings',
166
+ 'menu_slug' => 'twenty_twelve_settings',
167
+ 'parent_slug' => 'themes.php',
168
+ );
169
+
170
+ global $twenty_twelve_license;
171
+ $twenty_twelve_license = $client->license();
172
+ $twenty_twelve_license->add_settings_page( $args );
173
+
174
+ if ( $twenty_twelve_license->is_valid() ) {
175
+ // Your special code here
176
+ }
177
+
178
+ Or check by pricing plan title
179
+
180
+ if ( $twenty_twelve_license->is_valid_by( 'title', 'Business' ) ) {
181
+ // Your special code here
182
+ }
183
+ ```
184
+
185
+ ### Use your own license form
186
+
187
+ You can easily manage license by creating a form using HTTP request. Call `license_form_submit` method from License object.
188
+
189
+ ```php
190
+ global $twenty_twelve_license; // License object
191
+ $twenty_twelve_license->license_form_submit([
192
+ '_nonce' => wp_create_nonce( 'Twenty Twelve' ), // create a nonce with name
193
+ '_action' => 'active', // active, deactive
194
+ 'license_key' => 'random-license-key', // no need to provide if you want to deactive
195
+ ]);
196
+ if ( ! $twenty_twelve_license->error ) {
197
+ // license activated
198
+ $twenty_twelve_license->success; // Success message is here
199
+ } else {
200
+ $twenty_twelve_license->error; // has error message here
201
+ }
202
+ ```
203
+
204
+ ## Credits
205
+
206
+ Created and maintained by [Appsero](https://appsero.com).
include/appsero/src/Client.php ADDED
@@ -0,0 +1,233 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Appsero;
3
+
4
+ /**
5
+ * Appsero Client
6
+ *
7
+ * This class is necessary to set project data
8
+ */
9
+ class Client {
10
+
11
+ /**
12
+ * The client version
13
+ *
14
+ * @var string
15
+ */
16
+ public $version = '1.1.11';
17
+
18
+ /**
19
+ * Hash identifier of the plugin
20
+ *
21
+ * @var string
22
+ */
23
+ public $hash;
24
+
25
+ /**
26
+ * Name of the plugin
27
+ *
28
+ * @var string
29
+ */
30
+ public $name;
31
+
32
+ /**
33
+ * The plugin/theme file path
34
+ * @example .../wp-content/plugins/test-slug/test-slug.php
35
+ *
36
+ * @var string
37
+ */
38
+ public $file;
39
+
40
+ /**
41
+ * Main plugin file
42
+ * @example test-slug/test-slug.php
43
+ *
44
+ * @var string
45
+ */
46
+ public $basename;
47
+
48
+ /**
49
+ * Slug of the plugin
50
+ * @example test-slug
51
+ *
52
+ * @var string
53
+ */
54
+ public $slug;
55
+
56
+ /**
57
+ * The project version
58
+ *
59
+ * @var string
60
+ */
61
+ public $project_version;
62
+
63
+ /**
64
+ * The project type
65
+ *
66
+ * @var string
67
+ */
68
+ public $type;
69
+
70
+ /**
71
+ * textdomain
72
+ *
73
+ * @var string
74
+ */
75
+ public $textdomain;
76
+
77
+ /**
78
+ * Initialize the class
79
+ *
80
+ * @param string $hash hash of the plugin
81
+ * @param string $name readable name of the plugin
82
+ * @param string $file main plugin file path
83
+ */
84
+ public function __construct( $hash, $name, $file ) {
85
+ $this->hash = $hash;
86
+ $this->name = $name;
87
+ $this->file = $file;
88
+
89
+ $this->set_basename_and_slug();
90
+ }
91
+
92
+ /**
93
+ * Initialize insights class
94
+ *
95
+ * @return Appsero\Insights
96
+ */
97
+ public function insights() {
98
+
99
+ if ( ! class_exists( __NAMESPACE__ . '\Insights') ) {
100
+ require_once __DIR__ . '/Insights.php';
101
+ }
102
+
103
+ return new Insights( $this );
104
+ }
105
+
106
+ /**
107
+ * Initialize plugin/theme updater
108
+ *
109
+ * @return Appsero\Updater
110
+ */
111
+ public function updater() {
112
+
113
+ if ( ! class_exists( __NAMESPACE__ . '\Updater') ) {
114
+ require_once __DIR__ . '/Updater.php';
115
+ }
116
+
117
+ return new Updater( $this );
118
+ }
119
+
120
+ /**
121
+ * Initialize license checker
122
+ *
123
+ * @return Appsero\License
124
+ */
125
+ public function license() {
126
+
127
+ if ( ! class_exists( __NAMESPACE__ . '\License') ) {
128
+ require_once __DIR__ . '/License.php';
129
+ }
130
+
131
+ return new License( $this );
132
+ }
133
+
134
+ /**
135
+ * API Endpoint
136
+ *
137
+ * @return string
138
+ */
139
+ public function endpoint() {
140
+ $endpoint = apply_filters( 'appsero_endpoint', 'https://api.appsero.com' );
141
+
142
+ return trailingslashit( $endpoint );
143
+ }
144
+
145
+ /**
146
+ * Set project basename, slug and version
147
+ *
148
+ * @return void
149
+ */
150
+ protected function set_basename_and_slug() {
151
+
152
+ if ( strpos( $this->file, WP_CONTENT_DIR . '/themes/' ) === false ) {
153
+
154
+ $this->basename = plugin_basename( $this->file );
155
+
156
+ list( $this->slug, $mainfile) = explode( '/', $this->basename );
157
+
158
+ require_once ABSPATH . 'wp-admin/includes/plugin.php';
159
+
160
+ $plugin_data = get_plugin_data( $this->file );
161
+
162
+ $this->project_version = $plugin_data['Version'];
163
+ $this->type = 'plugin';
164
+ $this->textdomain = $this->slug;
165
+
166
+ } else {
167
+
168
+ $this->basename = str_replace( WP_CONTENT_DIR . '/themes/', '', $this->file );
169
+
170
+ list( $this->slug, $mainfile) = explode( '/', $this->basename );
171
+
172
+ $theme = wp_get_theme( $this->slug );
173
+
174
+ $this->project_version = $theme->version;
175
+ $this->type = 'theme';
176
+
177
+ }
178
+ }
179
+
180
+ /**
181
+ * Send request to remote endpoint
182
+ *
183
+ * @param array $params
184
+ * @param string $route
185
+ *
186
+ * @return array|WP_Error Array of results including HTTP headers or WP_Error if the request failed.
187
+ */
188
+ public function send_request( $params, $route, $blocking = false ) {
189
+ $url = $this->endpoint() . $route;
190
+
191
+ $headers = array(
192
+ 'user-agent' => 'Appsero/' . md5( esc_url( home_url() ) ) . ';',
193
+ 'Accept' => 'application/json',
194
+ );
195
+
196
+ $response = wp_remote_post( $url, array(
197
+ 'method' => 'POST',
198
+ 'timeout' => 30,
199
+ 'redirection' => 5,
200
+ 'httpversion' => '1.0',
201
+ 'blocking' => $blocking,
202
+ 'headers' => $headers,
203
+ 'body' => array_merge( $params, array( 'client' => $this->version ) ),
204
+ 'cookies' => array()
205
+ ) );
206
+
207
+ return $response;
208
+ }
209
+
210
+ /**
211
+ * Check if the current server is localhost
212
+ *
213
+ * @return boolean
214
+ */
215
+ public function is_local_server() {
216
+ return in_array( $_SERVER['REMOTE_ADDR'], array( '127.0.0.1', '::1' ) );
217
+ }
218
+
219
+ /**
220
+ * Translate function _e()
221
+ */
222
+ public function _etrans( $text ) {
223
+ call_user_func( '_e', $text, $this->textdomain );
224
+ }
225
+
226
+ /**
227
+ * Translate function __()
228
+ */
229
+ public function __trans( $text ) {
230
+ return call_user_func( '__', $text, $this->textdomain );
231
+ }
232
+
233
+ }
include/appsero/src/Insights.php ADDED
@@ -0,0 +1,972 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Appsero;
3
+
4
+ /**
5
+ * Appsero Insights
6
+ *
7
+ * This is a tracker class to track plugin usage based on if the customer has opted in.
8
+ * No personal information is being tracked by this class, only general settings, active plugins, environment details
9
+ * and admin email.
10
+ */
11
+ class Insights {
12
+
13
+ /**
14
+ * The notice text
15
+ *
16
+ * @var string
17
+ */
18
+ public $notice;
19
+
20
+ /**
21
+ * Wheather to the notice or not
22
+ *
23
+ * @var boolean
24
+ */
25
+ protected $show_notice = true;
26
+
27
+ /**
28
+ * If extra data needs to be sent
29
+ *
30
+ * @var array
31
+ */
32
+ protected $extra_data = array();
33
+
34
+ /**
35
+ * AppSero\Client
36
+ *
37
+ * @var object
38
+ */
39
+ protected $client;
40
+
41
+ /**
42
+ * Initialize the class
43
+ *
44
+ * @param AppSero\Client
45
+ */
46
+ public function __construct( $client, $name = null, $file = null ) {
47
+
48
+ if ( is_string( $client ) && ! empty( $name ) && ! empty( $file ) ) {
49
+ $client = new Client( $client, $name, $file );
50
+ }
51
+
52
+ if ( is_object( $client ) && is_a( $client, 'Appsero\Client' ) ) {
53
+ $this->client = $client;
54
+ }
55
+ }
56
+
57
+ /**
58
+ * Don't show the notice
59
+ *
60
+ * @return \self
61
+ */
62
+ public function hide_notice() {
63
+ $this->show_notice = false;
64
+
65
+ return $this;
66
+ }
67
+
68
+ /**
69
+ * Add extra data if needed
70
+ *
71
+ * @param array $data
72
+ *
73
+ * @return \self
74
+ */
75
+ public function add_extra( $data = array() ) {
76
+ $this->extra_data = $data;
77
+
78
+ return $this;
79
+ }
80
+
81
+ /**
82
+ * Set custom notice text
83
+ *
84
+ * @param string $text
85
+ *
86
+ * @return \self
87
+ */
88
+ public function notice( $text ) {
89
+ $this->notice = $text;
90
+
91
+ return $this;
92
+ }
93
+
94
+ /**
95
+ * Initialize insights
96
+ *
97
+ * @return void
98
+ */
99
+ public function init() {
100
+ if ( $this->client->type == 'plugin' ) {
101
+ $this->init_plugin();
102
+ } else if ( $this->client->type == 'theme' ) {
103
+ $this->init_theme();
104
+ }
105
+ }
106
+
107
+ /**
108
+ * Initialize theme hooks
109
+ *
110
+ * @return void
111
+ */
112
+ public function init_theme() {
113
+ $this->init_common();
114
+
115
+ add_action( 'switch_theme', array( $this, 'deactivation_cleanup' ) );
116
+ add_action( 'switch_theme', array( $this, 'theme_deactivated' ), 12, 3 );
117
+ }
118
+
119
+ /**
120
+ * Initialize plugin hooks
121
+ *
122
+ * @return void
123
+ */
124
+ public function init_plugin() {
125
+ // plugin deactivate popup
126
+ if ( ! $this->is_local_server() ) {
127
+ add_filter( 'plugin_action_links_' . $this->client->basename, array( $this, 'plugin_action_links' ) );
128
+ add_action( 'admin_footer', array( $this, 'deactivate_scripts' ) );
129
+ }
130
+
131
+ $this->init_common();
132
+
133
+ register_activation_hook( $this->client->file, array( $this, 'activate_plugin' ) );
134
+ register_deactivation_hook( $this->client->file, array( $this, 'deactivation_cleanup' ) );
135
+ }
136
+
137
+ /**
138
+ * Initialize common hooks
139
+ *
140
+ * @return void
141
+ */
142
+ protected function init_common() {
143
+
144
+ if ( $this->show_notice ) {
145
+ // tracking notice
146
+ add_action( 'admin_notices', array( $this, 'admin_notice' ) );
147
+ }
148
+
149
+ add_action( 'admin_init', array( $this, 'handle_optin_optout' ) );
150
+
151
+ // uninstall reason
152
+ add_action( 'wp_ajax_' . $this->client->slug . '_submit-uninstall-reason', array( $this, 'uninstall_reason_submission' ) );
153
+
154
+ // cron events
155
+ add_filter( 'cron_schedules', array( $this, 'add_weekly_schedule' ) );
156
+ add_action( $this->client->slug . '_tracker_send_event', array( $this, 'send_tracking_data' ) );
157
+ // add_action( 'admin_init', array( $this, 'send_tracking_data' ) ); // test
158
+ }
159
+
160
+ /**
161
+ * Send tracking data to AppSero server
162
+ *
163
+ * @param boolean $override
164
+ *
165
+ * @return void
166
+ */
167
+ public function send_tracking_data( $override = false ) {
168
+ // skip on AJAX Requests
169
+ if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
170
+ return;
171
+ }
172
+
173
+ if ( ! $this->tracking_allowed() && ! $override ) {
174
+ return;
175
+ }
176
+
177
+ // Send a maximum of once per week
178
+ $last_send = $this->get_last_send();
179
+
180
+ if ( $last_send && $last_send > strtotime( '-1 week' ) ) {
181
+ return;
182
+ }
183
+
184
+ $response = $this->client->send_request( $this->get_tracking_data(), 'track' );
185
+
186
+ update_option( $this->client->slug . '_tracking_last_send', time() );
187
+ }
188
+
189
+ /**
190
+ * Get the tracking data points
191
+ *
192
+ * @return array
193
+ */
194
+ protected function get_tracking_data() {
195
+ $all_plugins = $this->get_all_plugins();
196
+
197
+ $users = get_users( array(
198
+ 'role' => 'administrator',
199
+ 'orderby' => 'ID',
200
+ 'order' => 'ASC',
201
+ 'number' => 1,
202
+ 'paged' => 1,
203
+ ) );
204
+
205
+ $admin_user = ( is_array( $users ) && ! empty( $users ) ) ? $users[0] : false;
206
+ $first_name = $last_name = '';
207
+
208
+ if ( $admin_user ) {
209
+ $first_name = $admin_user->first_name ? $admin_user->first_name : $admin_user->display_name;
210
+ $last_name = $admin_user->last_name;
211
+ }
212
+
213
+ $data = array(
214
+ 'version' => $this->client->project_version,
215
+ 'url' => esc_url( home_url() ),
216
+ 'site' => $this->get_site_name(),
217
+ 'admin_email' => get_option( 'admin_email' ),
218
+ 'first_name' => $first_name,
219
+ 'last_name' => $last_name,
220
+ 'hash' => $this->client->hash,
221
+ 'server' => $this->get_server_info(),
222
+ 'wp' => $this->get_wp_info(),
223
+ 'users' => $this->get_user_counts(),
224
+ 'active_plugins' => count( $all_plugins['active_plugins'] ),
225
+ 'inactive_plugins' => count( $all_plugins['inactive_plugins'] ),
226
+ 'ip_address' => $this->get_user_ip_address(),
227
+ 'theme' => get_stylesheet(),
228
+ 'version' => $this->client->project_version,
229
+ );
230
+
231
+ // Add metadata
232
+ if ( $extra = $this->get_extra_data() ) {
233
+ $data['extra'] = $extra;
234
+ }
235
+
236
+ return apply_filters( $this->client->slug . '_tracker_data', $data );
237
+ }
238
+
239
+ /**
240
+ * If a child class wants to send extra data
241
+ *
242
+ * @return mixed
243
+ */
244
+ protected function get_extra_data() {
245
+ if ( is_callable( $this->extra_data ) ) {
246
+ return call_user_func( $this->extra_data );
247
+ }
248
+
249
+ if ( is_array( $this->extra_data ) ) {
250
+ return $this->extra_data;
251
+ }
252
+
253
+ return array();
254
+ }
255
+
256
+ /**
257
+ * Explain the user which data we collect
258
+ *
259
+ * @return string
260
+ */
261
+ protected function data_we_collect() {
262
+ $data = array(
263
+ 'Server environment details (php, mysql, server, WordPress versions)',
264
+ 'Number of users in your site',
265
+ 'Site language',
266
+ 'Number of active and inactive plugins',
267
+ 'Site name and url',
268
+ 'Your name and email address',
269
+ );
270
+
271
+ return $data;
272
+ }
273
+
274
+ /**
275
+ * Check if the user has opted into tracking
276
+ *
277
+ * @return bool
278
+ */
279
+ public function tracking_allowed() {
280
+ $allow_tracking = get_option( $this->client->slug . '_allow_tracking', 'no' );
281
+
282
+ return $allow_tracking == 'yes';
283
+ }
284
+
285
+ /**
286
+ * Get the last time a tracking was sent
287
+ *
288
+ * @return false|string
289
+ */
290
+ private function get_last_send() {
291
+ return get_option( $this->client->slug . '_tracking_last_send', false );
292
+ }
293
+
294
+ /**
295
+ * Check if the notice has been dismissed or enabled
296
+ *
297
+ * @return boolean
298
+ */
299
+ private function notice_dismissed() {
300
+ $hide_notice = get_option( $this->client->slug . '_tracking_notice', null );
301
+
302
+ if ( 'hide' == $hide_notice ) {
303
+ return true;
304
+ }
305
+
306
+ return false;
307
+ }
308
+
309
+ /**
310
+ * Check if the current server is localhost
311
+ *
312
+ * @return boolean
313
+ */
314
+ private function is_local_server() {
315
+ return false;
316
+
317
+ $is_local = in_array( $_SERVER['REMOTE_ADDR'], array( '127.0.0.1', '::1' ) );
318
+
319
+ return apply_filters( 'appsero_is_local', $is_local );
320
+ }
321
+
322
+ /**
323
+ * Schedule the event weekly
324
+ *
325
+ * @return void
326
+ */
327
+ private function schedule_event() {
328
+ $hook_name = $this->client->slug . '_tracker_send_event';
329
+
330
+ if ( ! wp_next_scheduled( $hook_name ) ) {
331
+ wp_schedule_event( time(), 'weekly', $hook_name );
332
+ }
333
+ }
334
+
335
+ /**
336
+ * Clear any scheduled hook
337
+ *
338
+ * @return void
339
+ */
340
+ private function clear_schedule_event() {
341
+ wp_clear_scheduled_hook( $this->client->slug . '_tracker_send_event' );
342
+ }
343
+
344
+ /**
345
+ * Display the admin notice to users that have not opted-in or out
346
+ *
347
+ * @return void
348
+ */
349
+ public function admin_notice() {
350
+
351
+ if ( $this->notice_dismissed() ) {
352
+ return;
353
+ }
354
+
355
+ if ( $this->tracking_allowed() ) {
356
+ return;
357
+ }
358
+
359
+ if ( ! current_user_can( 'manage_options' ) ) {
360
+ return;
361
+ }
362
+
363
+ // don't show tracking if a local server
364
+ if ( ! $this->is_local_server() ) {
365
+ $optin_url = add_query_arg( $this->client->slug . '_tracker_optin', 'true' );
366
+ $optout_url = add_query_arg( $this->client->slug . '_tracker_optout', 'true' );
367
+
368
+ if ( empty( $this->notice ) ) {
369
+ $notice = sprintf( $this->client->__trans( 'Want to help make <strong>%1$s</strong> even more awesome? Allow %1$s to collect non-sensitive diagnostic data and usage information.' ), $this->client->name );
370
+ } else {
371
+ $notice = $this->notice;
372
+ }
373
+
374
+ $policy_url = 'https://' . 'appsero.com/privacy-policy/';
375
+
376
+ $notice .= ' (<a class="' . $this->client->slug . '-insights-data-we-collect" href="#">' . $this->client->__trans( 'what we collect' ) . '</a>)';
377
+ $notice .= '<p class="description" style="display:none;">' . implode( ', ', $this->data_we_collect() ) . '. No sensitive data is tracked. ';
378
+ $notice .= 'We are using Appsero to collect your data. <a href="' . $policy_url . '">Learn more</a> about how Appsero collects and handle your data.</p>';
379
+
380
+ echo '<div class="updated"><p>';
381
+ echo $notice;
382
+ echo '</p><p class="submit">';
383
+ echo '&nbsp;<a href="' . esc_url( $optin_url ) . '" class="button-primary button-large">' . $this->client->__trans( 'Allow' ) . '</a>';
384
+ echo '&nbsp;<a href="' . esc_url( $optout_url ) . '" class="button-secondary button-large">' . $this->client->__trans( 'No thanks' ) . '</a>';
385
+ echo '</p></div>';
386
+
387
+ echo "<script type='text/javascript'>jQuery('." . $this->client->slug . "-insights-data-we-collect').on('click', function(e) {
388
+ e.preventDefault();
389
+ jQuery(this).parents('.updated').find('p.description').slideToggle('fast');
390
+ });
391
+ </script>
392
+ ";
393
+ }
394
+ }
395
+
396
+ /**
397
+ * handle the optin/optout
398
+ *
399
+ * @return void
400
+ */
401
+ public function handle_optin_optout() {
402
+
403
+ if ( isset( $_GET[ $this->client->slug . '_tracker_optin' ] ) && $_GET[ $this->client->slug . '_tracker_optin' ] == 'true' ) {
404
+ $this->optin();
405
+
406
+ wp_redirect( remove_query_arg( $this->client->slug . '_tracker_optin' ) );
407
+ exit;
408
+ }
409
+
410
+ if ( isset( $_GET[ $this->client->slug . '_tracker_optout' ] ) && $_GET[ $this->client->slug . '_tracker_optout' ] == 'true' ) {
411
+ $this->optout();
412
+
413
+ wp_redirect( remove_query_arg( $this->client->slug . '_tracker_optout' ) );
414
+ exit;
415
+ }
416
+ }
417
+
418
+ /**
419
+ * Tracking optin
420
+ *
421
+ * @return void
422
+ */
423
+ public function optin() {
424
+ update_option( $this->client->slug . '_allow_tracking', 'yes' );
425
+ update_option( $this->client->slug . '_tracking_notice', 'hide' );
426
+
427
+ $this->clear_schedule_event();
428
+ $this->schedule_event();
429
+ $this->send_tracking_data();
430
+ }
431
+
432
+ /**
433
+ * Optout from tracking
434
+ *
435
+ * @return void
436
+ */
437
+ public function optout() {
438
+ update_option( $this->client->slug . '_allow_tracking', 'no' );
439
+ update_option( $this->client->slug . '_tracking_notice', 'hide' );
440
+
441
+ $this->clear_schedule_event();
442
+ }
443
+
444
+ /**
445
+ * Get the number of post counts
446
+ *
447
+ * @param string $post_type
448
+ *
449
+ * @return integer
450
+ */
451
+ public function get_post_count( $post_type ) {
452
+ global $wpdb;
453
+
454
+ return (int) $wpdb->get_var( "SELECT count(ID) FROM $wpdb->posts WHERE post_type = '$post_type' and post_status = 'publish'");
455
+ }
456
+
457
+ /**
458
+ * Get server related info.
459
+ *
460
+ * @return array
461
+ */
462
+ private static function get_server_info() {
463
+ global $wpdb;
464
+
465
+ $server_data = array();
466
+
467
+ if ( isset( $_SERVER['SERVER_SOFTWARE'] ) && ! empty( $_SERVER['SERVER_SOFTWARE'] ) ) {
468
+ $server_data['software'] = $_SERVER['SERVER_SOFTWARE'];
469
+ }
470
+
471
+ if ( function_exists( 'phpversion' ) ) {
472
+ $server_data['php_version'] = phpversion();
473
+ }
474
+
475
+ $server_data['mysql_version'] = $wpdb->db_version();
476
+
477
+ $server_data['php_max_upload_size'] = size_format( wp_max_upload_size() );
478
+ $server_data['php_default_timezone'] = date_default_timezone_get();
479
+ $server_data['php_soap'] = class_exists( 'SoapClient' ) ? 'Yes' : 'No';
480
+ $server_data['php_fsockopen'] = function_exists( 'fsockopen' ) ? 'Yes' : 'No';
481
+ $server_data['php_curl'] = function_exists( 'curl_init' ) ? 'Yes' : 'No';
482
+
483
+ return $server_data;
484
+ }
485
+
486
+ /**
487
+ * Get WordPress related data.
488
+ *
489
+ * @return array
490
+ */
491
+ private function get_wp_info() {
492
+ $wp_data = array();
493
+
494
+ $wp_data['memory_limit'] = WP_MEMORY_LIMIT;
495
+ $wp_data['debug_mode'] = ( defined('WP_DEBUG') && WP_DEBUG ) ? 'Yes' : 'No';
496
+ $wp_data['locale'] = get_locale();
497
+ $wp_data['version'] = get_bloginfo( 'version' );
498
+ $wp_data['multisite'] = is_multisite() ? 'Yes' : 'No';
499
+
500
+ return $wp_data;
501
+ }
502
+
503
+ /**
504
+ * Get the list of active and inactive plugins
505
+ *
506
+ * @return array
507
+ */
508
+ private function get_all_plugins() {
509
+ // Ensure get_plugins function is loaded
510
+ if ( ! function_exists( 'get_plugins' ) ) {
511
+ include ABSPATH . '/wp-admin/includes/plugin.php';
512
+ }
513
+
514
+ $plugins = get_plugins();
515
+ $active_plugins_keys = get_option( 'active_plugins', array() );
516
+ $active_plugins = array();
517
+
518
+ foreach ( $plugins as $k => $v ) {
519
+ // Take care of formatting the data how we want it.
520
+ $formatted = array();
521
+ $formatted['name'] = strip_tags( $v['Name'] );
522
+
523
+ if ( isset( $v['Version'] ) ) {
524
+ $formatted['version'] = strip_tags( $v['Version'] );
525
+ }
526
+
527
+ if ( isset( $v['Author'] ) ) {
528
+ $formatted['author'] = strip_tags( $v['Author'] );
529
+ }
530
+
531
+ if ( isset( $v['Network'] ) ) {
532
+ $formatted['network'] = strip_tags( $v['Network'] );
533
+ }
534
+
535
+ if ( isset( $v['PluginURI'] ) ) {
536
+ $formatted['plugin_uri'] = strip_tags( $v['PluginURI'] );
537
+ }
538
+
539
+ if ( in_array( $k, $active_plugins_keys ) ) {
540
+ // Remove active plugins from list so we can show active and inactive separately
541
+ unset( $plugins[$k] );
542
+ $active_plugins[$k] = $formatted;
543
+ } else {
544
+ $plugins[$k] = $formatted;
545
+ }
546
+ }
547
+
548
+ return array( 'active_plugins' => $active_plugins, 'inactive_plugins' => $plugins );
549
+ }
550
+
551
+ /**
552
+ * Get user totals based on user role.
553
+ *
554
+ * @return array
555
+ */
556
+ public function get_user_counts() {
557
+ $user_count = array();
558
+ $user_count_data = count_users();
559
+ $user_count['total'] = $user_count_data['total_users'];
560
+
561
+ // Get user count based on user role
562
+ foreach ( $user_count_data['avail_roles'] as $role => $count ) {
563
+ $user_count[ $role ] = $count;
564
+ }
565
+
566
+ return $user_count;
567
+ }
568
+
569
+ /**
570
+ * Add weekly cron schedule
571
+ *
572
+ * @param array $schedules
573
+ *
574
+ * @return array
575
+ */
576
+ public function add_weekly_schedule( $schedules ) {
577
+
578
+ $schedules['weekly'] = array(
579
+ 'interval' => DAY_IN_SECONDS * 7,
580
+ 'display' => 'Once Weekly',
581
+ );
582
+
583
+ return $schedules;
584
+ }
585
+
586
+ /**
587
+ * Plugin activation hook
588
+ *
589
+ * @return void
590
+ */
591
+ public function activate_plugin() {
592
+ $allowed = get_option( $this->client->slug . '_allow_tracking', 'no' );
593
+
594
+ // if it wasn't allowed before, do nothing
595
+ if ( 'yes' !== $allowed ) {
596
+ return;
597
+ }
598
+
599
+ // re-schedule and delete the last sent time so we could force send again
600
+ $hook_name = $this->client->slug . '_tracker_send_event';
601
+ if ( ! wp_next_scheduled( $hook_name ) ) {
602
+ wp_schedule_event( time(), 'weekly', $hook_name );
603
+ }
604
+
605
+ delete_option( $this->client->slug . '_tracking_last_send' );
606
+
607
+ $this->send_tracking_data( true );
608
+ }
609
+
610
+ /**
611
+ * Clear our options upon deactivation
612
+ *
613
+ * @return void
614
+ */
615
+ public function deactivation_cleanup() {
616
+ $this->clear_schedule_event();
617
+
618
+ if ( 'theme' == $this->client->type ) {
619
+ delete_option( $this->client->slug . '_tracking_last_send' );
620
+ delete_option( $this->client->slug . '_allow_tracking' );
621
+ }
622
+
623
+ delete_option( $this->client->slug . '_tracking_notice' );
624
+ }
625
+
626
+ /**
627
+ * Hook into action links and modify the deactivate link
628
+ *
629
+ * @param array $links
630
+ *
631
+ * @return array
632
+ */
633
+ public function plugin_action_links( $links ) {
634
+
635
+ if ( array_key_exists( 'deactivate', $links ) ) {
636
+ $links['deactivate'] = str_replace( '<a', '<a class="' . $this->client->slug . '-deactivate-link"', $links['deactivate'] );
637
+ }
638
+
639
+ return $links;
640
+ }
641
+
642
+ /**
643
+ * Plugin uninstall reasons
644
+ *
645
+ * @return array
646
+ */
647
+ private function get_uninstall_reasons() {
648
+ $reasons = array(
649
+ array(
650
+ 'id' => 'could-not-understand',
651
+ 'text' => "I couldn't understand how to make it work",
652
+ 'type' => 'textarea',
653
+ 'placeholder' => 'Would you like us to assist you?'
654
+ ),
655
+ array(
656
+ 'id' => 'found-better-plugin',
657
+ 'text' => 'I found a better plugin',
658
+ 'type' => 'text',
659
+ 'placeholder' => 'Which plugin?'
660
+ ),
661
+ array(
662
+ 'id' => 'not-have-that-feature',
663
+ 'text' => 'The plugin is great, but I need specific feature that you don\'t support',
664
+ 'type' => 'textarea',
665
+ 'placeholder' => 'Could you tell us more about that feature?'
666
+ ),
667
+ array(
668
+ 'id' => 'is-not-working',
669
+ 'text' => 'The plugin is not working',
670
+ 'type' => 'textarea',
671
+ 'placeholder' => 'Could you tell us a bit more whats not working?'
672
+ ),
673
+ array(
674
+ 'id' => 'looking-for-other',
675
+ 'text' => "It's not what I was looking for",
676
+ 'type' => '',
677
+ 'placeholder' => ''
678
+ ),
679
+ array(
680
+ 'id' => 'did-not-work-as-expected',
681
+ 'text' => "The plugin didn't work as expected",
682
+ 'type' => 'textarea',
683
+ 'placeholder' => 'What did you expect?'
684
+ ),
685
+ array(
686
+ 'id' => 'other',
687
+ 'text' => 'Other',
688
+ 'type' => 'textarea',
689
+ 'placeholder' => 'Could you tell us a bit more?'
690
+ ),
691
+ );
692
+
693
+ return $reasons;
694
+ }
695
+
696
+ /**
697
+ * Plugin deactivation uninstall reason submission
698
+ *
699
+ * @return void
700
+ */
701
+ public function uninstall_reason_submission() {
702
+
703
+ if ( ! isset( $_POST['reason_id'] ) ) {
704
+ wp_send_json_error();
705
+ }
706
+
707
+ $current_user = wp_get_current_user();
708
+
709
+ $data = array(
710
+ 'hash' => $this->client->hash,
711
+ 'reason_id' => sanitize_text_field( $_POST['reason_id'] ),
712
+ 'reason_info' => isset( $_REQUEST['reason_info'] ) ? trim( stripslashes( $_REQUEST['reason_info'] ) ) : '',
713
+ 'site' => $this->get_site_name(),
714
+ 'url' => esc_url( home_url() ),
715
+ 'admin_email' => get_option( 'admin_email' ),
716
+ 'user_email' => $current_user->user_email,
717
+ 'first_name' => $current_user->first_name,
718
+ 'last_name' => $current_user->last_name,
719
+ 'server' => $this->get_server_info(),
720
+ 'wp' => $this->get_wp_info(),
721
+ 'ip_address' => $this->get_user_ip_address(),
722
+ 'theme' => get_stylesheet(),
723
+ 'version' => $this->client->project_version,
724
+ );
725
+
726
+ // Add metadata
727
+ if ( $extra = $this->get_extra_data() ) {
728
+ $data['extra'] = $extra;
729
+ }
730
+
731
+ $this->client->send_request( $data, 'deactivate' );
732
+
733
+ wp_send_json_success();
734
+ }
735
+
736
+ /**
737
+ * Handle the plugin deactivation feedback
738
+ *
739
+ * @return void
740
+ */
741
+ public function deactivate_scripts() {
742
+ global $pagenow;
743
+
744
+ if ( 'plugins.php' != $pagenow ) {
745
+ return;
746
+ }
747
+
748
+ $reasons = $this->get_uninstall_reasons();
749
+ ?>
750
+
751
+ <div class="wd-dr-modal" id="<?php echo $this->client->slug; ?>-wd-dr-modal">
752
+ <div class="wd-dr-modal-wrap">
753
+ <div class="wd-dr-modal-header">
754
+ <h3><?php $this->client->_etrans( 'If you have a moment, please let us know why you are deactivating:' ); ?></h3>
755
+ </div>
756
+
757
+ <div class="wd-dr-modal-body">
758
+ <ul class="reasons">
759
+ <?php foreach ($reasons as $reason) { ?>
760
+ <li data-type="<?php echo esc_attr( $reason['type'] ); ?>" data-placeholder="<?php echo esc_attr( $reason['placeholder'] ); ?>">
761
+ <label><input type="radio" name="selected-reason" value="<?php echo $reason['id']; ?>"> <?php echo $reason['text']; ?></label>
762
+ </li>
763
+ <?php } ?>
764
+ </ul>
765
+ <p class="wd-dr-modal-reasons-bottom">
766
+ We share your data with <a href="<?php echo 'https://appsero.com'; ?>">Appsero</a> to troubleshoot problems &amp; make product improvements.
767
+ <a href="<?php echo 'https://appsero.com/privacy-policy'; ?>">Learn more</a> about how Appsero handles your data.
768
+ </p>
769
+ </div>
770
+
771
+ <div class="wd-dr-modal-footer">
772
+ <a href="#" class="dont-bother-me"><?php $this->client->_etrans( "I rather wouldn't say" ); ?></a>
773
+ <button class="button-secondary"><?php $this->client->_etrans( 'Submit & Deactivate' ); ?></button>
774
+ <button class="button-primary"><?php $this->client->_etrans( 'Cancel' ); ?></button>
775
+ </div>
776
+ </div>
777
+ </div>
778
+
779
+ <style type="text/css">
780
+ .wd-dr-modal {
781
+ position: fixed;
782
+ z-index: 99999;
783
+ top: 0;
784
+ right: 0;
785
+ bottom: 0;
786
+ left: 0;
787
+ background: rgba(0,0,0,0.5);
788
+ display: none;
789
+ }
790
+
791
+ .wd-dr-modal.modal-active {
792
+ display: block;
793
+ }
794
+
795
+ .wd-dr-modal-wrap {
796
+ width: 475px;
797
+ position: relative;
798
+ margin: 10% auto;
799
+ background: #fff;
800
+ }
801
+
802
+ .wd-dr-modal-header {
803
+ border-bottom: 1px solid #eee;
804
+ padding: 8px 20px;
805
+ }
806
+
807
+ .wd-dr-modal-header h3 {
808
+ line-height: 150%;
809
+ margin: 0;
810
+ }
811
+
812
+ .wd-dr-modal-body {
813
+ padding: 5px 20px 20px 20px;
814
+ }
815
+
816
+ .wd-dr-modal-body .reason-input {
817
+ margin-top: 5px;
818
+ margin-left: 20px;
819
+ }
820
+ .wd-dr-modal-footer {
821
+ border-top: 1px solid #eee;
822
+ padding: 12px 20px;
823
+ text-align: right;
824
+ }
825
+ .wd-dr-modal-reasons-bottom {
826
+ margin: 15px 0 0 0;
827
+ }
828
+ </style>
829
+
830
+ <script type="text/javascript">
831
+ (function($) {
832
+ $(function() {
833
+ var modal = $( '#<?php echo $this->client->slug; ?>-wd-dr-modal' );
834
+ var deactivateLink = '';
835
+
836
+ $( '#the-list' ).on('click', 'a.<?php echo $this->client->slug; ?>-deactivate-link', function(e) {
837
+ e.preventDefault();
838
+
839
+ modal.addClass('modal-active');
840
+ deactivateLink = $(this).attr('href');
841
+ modal.find('a.dont-bother-me').attr('href', deactivateLink).css('float', 'left');
842
+ });
843
+
844
+ modal.on('click', 'button.button-primary', function(e) {
845
+ e.preventDefault();
846
+
847
+ modal.removeClass('modal-active');
848
+ });
849
+
850
+ modal.on('click', 'input[type="radio"]', function () {
851
+ var parent = $(this).parents('li:first');
852
+
853
+ modal.find('.reason-input').remove();
854
+
855
+ var inputType = parent.data('type'),
856
+ inputPlaceholder = parent.data('placeholder'),
857
+ reasonInputHtml = '<div class="reason-input">' + ( ( 'text' === inputType ) ? '<input type="text" size="40" />' : '<textarea rows="5" cols="45"></textarea>' ) + '</div>';
858
+
859
+ if ( inputType !== '' ) {
860
+ parent.append( $(reasonInputHtml) );
861
+ parent.find('input, textarea').attr('placeholder', inputPlaceholder).focus();
862
+ }
863
+ });
864
+
865
+ modal.on('click', 'button.button-secondary', function(e) {
866
+ e.preventDefault();
867
+
868
+ var button = $(this);
869
+
870
+ if ( button.hasClass('disabled') ) {
871
+ return;
872
+ }
873
+
874
+ var $radio = $( 'input[type="radio"]:checked', modal );
875
+
876
+ var $selected_reason = $radio.parents('li:first'),
877
+ $input = $selected_reason.find('textarea, input[type="text"]');
878
+
879
+ $.ajax({
880
+ url: ajaxurl,
881
+ type: 'POST',
882
+ data: {
883
+ action: '<?php echo $this->client->slug; ?>_submit-uninstall-reason',
884
+ reason_id: ( 0 === $radio.length ) ? 'none' : $radio.val(),
885
+ reason_info: ( 0 !== $input.length ) ? $input.val().trim() : ''
886
+ },
887
+ beforeSend: function() {
888
+ button.addClass('disabled');
889
+ button.text('Processing...');
890
+ },
891
+ complete: function() {
892
+ window.location.href = deactivateLink;
893
+ }
894
+ });
895
+ });
896
+ });
897
+ }(jQuery));
898
+ </script>
899
+
900
+ <?php
901
+ }
902
+
903
+ /**
904
+ * Run after theme deactivated
905
+ * @param string $new_name
906
+ * @param object $new_theme
907
+ * @param object $old_theme
908
+ * @return void
909
+ */
910
+ public function theme_deactivated( $new_name, $new_theme, $old_theme ) {
911
+ // Make sure this is appsero theme
912
+ if ( $old_theme->get_template() == $this->client->slug ) {
913
+ $current_user = wp_get_current_user();
914
+
915
+ $data = array(
916
+ 'hash' => $this->client->hash,
917
+ 'reason_id' => 'none',
918
+ 'reason_info' => '',
919
+ 'site' => $this->get_site_name(),
920
+ 'url' => esc_url( home_url() ),
921
+ 'admin_email' => get_option( 'admin_email' ),
922
+ 'user_email' => $current_user->user_email,
923
+ 'first_name' => $current_user->first_name,
924
+ 'last_name' => $current_user->last_name,
925
+ 'server' => $this->get_server_info(),
926
+ 'wp' => $this->get_wp_info(),
927
+ 'ip_address' => $this->get_user_ip_address(),
928
+ 'theme' => get_stylesheet(),
929
+ 'version' => $this->client->project_version,
930
+ );
931
+
932
+ $this->client->send_request( $data, 'deactivate' );
933
+ }
934
+ }
935
+
936
+ /**
937
+ * Get user IP Address
938
+ */
939
+ private function get_user_ip_address() {
940
+ $response = wp_remote_get( 'https://icanhazip.com/' );
941
+
942
+ if ( is_wp_error( $response ) ) {
943
+ return '';
944
+ }
945
+
946
+ $ip = trim( wp_remote_retrieve_body( $response ) );
947
+
948
+ if ( ! filter_var( $ip, FILTER_VALIDATE_IP ) ) {
949
+ return '';
950
+ }
951
+
952
+ return $ip;
953
+ }
954
+
955
+ /**
956
+ * Get site name
957
+ */
958
+ private function get_site_name() {
959
+ $site_name = get_bloginfo( 'name' );
960
+
961
+ if ( empty( $site_name ) ) {
962
+ $site_name = get_bloginfo( 'description' );
963
+ $site_name = wp_trim_words( $site_name, 3, '' );
964
+ }
965
+
966
+ if ( empty( $site_name ) ) {
967
+ $site_name = esc_url( home_url() );
968
+ }
969
+
970
+ return $site_name;
971
+ }
972
+ }
include/appsero/src/License.php ADDED
@@ -0,0 +1,705 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Appsero;
3
+
4
+ /**
5
+ * Appsero License Checker
6
+ *
7
+ * This class will check, active and deactive license
8
+ */
9
+ class License {
10
+
11
+ /**
12
+ * AppSero\Client
13
+ *
14
+ * @var object
15
+ */
16
+ protected $client;
17
+
18
+ /**
19
+ * Arguments of create menu
20
+ *
21
+ * @var array
22
+ */
23
+ protected $menu_args;
24
+
25
+ /**
26
+ * `option_name` of `wp_options` table
27
+ *
28
+ * @var string
29
+ */
30
+ protected $option_key;
31
+
32
+ /**
33
+ * Error message of HTTP request
34
+ *
35
+ * @var string
36
+ */
37
+ public $error;
38
+
39
+ /**
40
+ * Success message on form submit
41
+ *
42
+ * @var string
43
+ */
44
+ public $success;
45
+
46
+ /**
47
+ * Corn schedule hook name
48
+ *
49
+ * @var string
50
+ */
51
+ protected $schedule_hook;
52
+
53
+ /**
54
+ * Set value for valid licnese
55
+ *
56
+ * @var boolean
57
+ */
58
+ private $is_valid_licnese = null;
59
+
60
+ /**
61
+ * Initialize the class
62
+ *
63
+ * @param Appsero\Client
64
+ */
65
+ public function __construct( Client $client ) {
66
+ $this->client = $client;
67
+
68
+ $this->option_key = 'appsero_' . md5( $this->client->slug ) . '_manage_license';
69
+
70
+ $this->schedule_hook = $this->client->slug . '_license_check_event';
71
+
72
+ // Run hook to check license status daily
73
+ add_action( $this->schedule_hook, array( $this, 'check_license_status' ) );
74
+
75
+ // Active/Deactive corn schedule
76
+ $this->run_schedule();
77
+ }
78
+
79
+ /**
80
+ * Check license
81
+ *
82
+ * @return boolean
83
+ */
84
+ public function check( $license_key ) {
85
+ $route = 'public/license/' . $this->client->hash . '/check';
86
+
87
+ return $this->send_request( $license_key, $route );
88
+ }
89
+
90
+ /**
91
+ * Active a license
92
+ *
93
+ * @return boolean
94
+ */
95
+ public function activate( $license_key ) {
96
+ $route = 'public/license/' . $this->client->hash . '/activate';
97
+
98
+ return $this->send_request( $license_key, $route );
99
+ }
100
+
101
+ /**
102
+ * Deactivate a license
103
+ *
104
+ * @return boolean
105
+ */
106
+ public function deactivate( $license_key ) {
107
+ $route = 'public/license/' . $this->client->hash . '/deactivate';
108
+
109
+ return $this->send_request( $license_key, $route );
110
+ }
111
+
112
+ /**
113
+ * Send common request
114
+ *
115
+ * @param $license_key
116
+ * @param $route
117
+ *
118
+ * @return array
119
+ */
120
+ protected function send_request( $license_key, $route ) {
121
+ $params = array(
122
+ 'license_key' => $license_key,
123
+ 'url' => esc_url( home_url() ),
124
+ 'is_local' => $this->client->is_local_server(),
125
+ );
126
+
127
+ $response = $this->client->send_request( $params, $route, true );
128
+
129
+ if ( is_wp_error( $response ) ) {
130
+ return array(
131
+ 'success' => false,
132
+ 'error' => $response->get_error_message()
133
+ );
134
+ }
135
+
136
+ $response = json_decode( wp_remote_retrieve_body( $response ), true );
137
+
138
+ if ( empty( $response ) || isset( $response['exception'] )) {
139
+ return array(
140
+ 'success' => false,
141
+ 'error' => 'Unknown error occurred, Please try again.'
142
+ );
143
+ }
144
+
145
+ if ( isset( $response['errors'] ) && isset( $response['errors']['license_key'] ) ) {
146
+ $response = array(
147
+ 'success' => false,
148
+ 'error' => $response['errors']['license_key'][0]
149
+ );
150
+ }
151
+
152
+ return $response;
153
+ }
154
+
155
+ /**
156
+ * Add settings page for license
157
+ *
158
+ * @param array $args
159
+ *
160
+ * @return void
161
+ */
162
+ public function add_settings_page( $args = array() ) {
163
+ $defaults = array(
164
+ 'type' => 'menu', // Can be: menu, options, submenu
165
+ 'page_title' => 'Manage License',
166
+ 'menu_title' => 'Manage License',
167
+ 'capability' => 'manage_options',
168
+ 'menu_slug' => $this->client->slug . '-manage-license',
169
+ 'icon_url' => '',
170
+ 'position' => null,
171
+ 'parent_slug' => '',
172
+ );
173
+
174
+ $this->menu_args = wp_parse_args( $args, $defaults );
175
+
176
+ add_action( 'admin_menu', array( $this, 'admin_menu' ), 99 );
177
+ }
178
+
179
+ /**
180
+ * Admin Menu hook
181
+ *
182
+ * @return void
183
+ */
184
+ public function admin_menu() {
185
+ switch ( $this->menu_args['type'] ) {
186
+ case 'menu':
187
+ $this->create_menu_page();
188
+ break;
189
+
190
+ case 'submenu':
191
+ $this->create_submenu_page();
192
+ break;
193
+
194
+ case 'options':
195
+ $this->create_options_page();
196
+ break;
197
+ }
198
+ }
199
+
200
+ /**
201
+ * License menu output
202
+ */
203
+ public function menu_output() {
204
+
205
+ if ( isset( $_POST['submit'] ) ) {
206
+ $this->license_form_submit( $_POST );
207
+ }
208
+
209
+ $license = get_option( $this->option_key, null );
210
+ $action = ( $license && isset( $license['status'] ) && 'activate' == $license['status'] ) ? 'deactive' : 'active';
211
+ $this->licenses_style();
212
+ ?>
213
+
214
+ <div class="wrap appsero-license-settings-wrapper">
215
+ <h1>License Settings</h1>
216
+
217
+ <?php
218
+ $this->show_license_page_notices();
219
+ do_action( 'before_appsero_license_section' );
220
+ ?>
221
+
222
+ <div class="appsero-license-settings appsero-license-section">
223
+ <?php $this->show_license_page_card_header(); ?>
224
+
225
+ <div class="appsero-license-details">
226
+ <p>Activate <strong><?php echo $this->client->name; ?></strong> by your license key to get professional support and automatic update from your WordPress dashboard.</p>
227
+ <form method="post" action="<?php $this->formActionUrl(); ?>" novalidate="novalidate" spellcheck="false">
228
+ <input type="hidden" name="_action" value="<?php echo $action; ?>">
229
+ <input type="hidden" name="_nonce" value="<?php echo wp_create_nonce( $this->client->name ); ?>">
230
+ <div class="license-input-fields">
231
+ <div class="license-input-key">
232
+ <svg enable-background="new 0 0 512 512" version="1.1" viewBox="0 0 512 512" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
233
+ <path d="m463.75 48.251c-64.336-64.336-169.01-64.335-233.35 1e-3 -43.945 43.945-59.209 108.71-40.181 167.46l-185.82 185.82c-2.813 2.813-4.395 6.621-4.395 10.606v84.858c0 8.291 6.709 15 15 15h84.858c3.984 0 7.793-1.582 10.605-4.395l21.211-21.226c3.237-3.237 4.819-7.778 4.292-12.334l-2.637-22.793 31.582-2.974c7.178-0.674 12.847-6.343 13.521-13.521l2.974-31.582 22.793 2.651c4.233 0.571 8.496-0.85 11.704-3.691 3.193-2.856 5.024-6.929 5.024-11.206v-27.929h27.422c3.984 0 7.793-1.582 10.605-4.395l38.467-37.958c58.74 19.043 122.38 4.929 166.33-39.046 64.336-64.335 64.336-169.01 0-233.35zm-42.435 106.07c-17.549 17.549-46.084 17.549-63.633 0s-17.549-46.084 0-63.633 46.084-17.549 63.633 0 17.548 46.084 0 63.633z"/>
234
+ </svg>
235
+ <input type="text" value="<?php echo $this->get_input_license_value( $action, $license ); ?>"
236
+ placeholder="Enter your license key to activate" name="license_key"
237
+ <?php echo ( 'deactive' == $action ) ? 'readonly="readonly"' : ''; ?>
238
+ />
239
+ </div>
240
+ <button type="submit" name="submit" class="<?php echo 'deactive' == $action ? 'deactive-button' : ''; ?>">
241
+ <?php echo $action == 'active' ? 'Activate License' : 'Deactivate License' ; ?>
242
+ </button>
243
+ </div>
244
+ </form>
245
+
246
+ <?php
247
+ if ( 'deactive' == $action && isset( $license['remaining'] ) ) {
248
+ $this->show_active_license_info( $license );
249
+ }
250
+ ?>
251
+ </div>
252
+ </div> <!-- /.appsero-license-settings -->
253
+
254
+ <?php do_action( 'after_appsero_license_section' ); ?>
255
+ </div>
256
+ <?php
257
+ }
258
+
259
+ /**
260
+ * License form submit
261
+ */
262
+ public function license_form_submit( $form ) {
263
+ if ( ! isset( $form['_nonce'], $form['_action'] ) ) {
264
+ $this->error = "Please add all information";
265
+ return;
266
+ }
267
+
268
+ if ( ! wp_verify_nonce( $form['_nonce'], $this->client->name ) ) {
269
+ $this->error = "You don't have permission to manage license.";
270
+ return;
271
+ }
272
+
273
+ switch ( $form['_action'] ) {
274
+ case 'active':
275
+ $this->active_client_license( $form );
276
+ break;
277
+
278
+ case 'deactive':
279
+ $this->deactive_client_license( $form );
280
+ break;
281
+ }
282
+ }
283
+
284
+ /**
285
+ * Check license status on schedule
286
+ */
287
+ public function check_license_status() {
288
+ $license = get_option( $this->option_key, null );
289
+
290
+ if ( isset( $license['key'] ) && ! empty( $license['key'] ) ) {
291
+ $response = $this->check( $license['key'] );
292
+
293
+ if ( isset( $response['success'] ) && $response['success'] ) {
294
+ $license['status'] = 'activate';
295
+ $license['remaining'] = $response['remaining'];
296
+ $license['activation_limit'] = $response['activation_limit'];
297
+ $license['expiry_days'] = $response['expiry_days'];
298
+ $license['title'] = $response['title'];
299
+ $license['source_id'] = $response['source_identifier'];
300
+ $license['recurring'] = $response['recurring'];
301
+ } else {
302
+ $license['status'] = 'deactivate';
303
+ $license['expiry_days'] = 0;
304
+ }
305
+
306
+ update_option( $this->option_key, $license, false );
307
+ }
308
+ }
309
+
310
+ /**
311
+ * Check this is a valid license
312
+ */
313
+ public function is_valid() {
314
+ if ( null !== $this->is_valid_licnese ) {
315
+ return $this->is_valid_licnese;
316
+ }
317
+
318
+ $license = get_option( $this->option_key, null );
319
+ if ( ! empty( $license['key'] ) && isset( $license['status'] ) && $license['status'] == 'activate' ) {
320
+ $this->is_valid_licnese = true;
321
+ } else {
322
+ $this->is_valid_licnese = false;
323
+ }
324
+
325
+ return $this->is_valid_licnese;
326
+ }
327
+
328
+ /**
329
+ * Check this is a valid license
330
+ */
331
+ public function is_valid_by( $option, $value ) {
332
+ $license = get_option( $this->option_key, null );
333
+
334
+ if ( ! empty( $license['key'] ) && isset( $license['status'] ) && $license['status'] == 'activate' ) {
335
+ if ( isset( $license[ $option ] ) && $license[ $option ] == $value ) {
336
+ return true;
337
+ }
338
+ }
339
+
340
+ return false;
341
+ }
342
+
343
+ /**
344
+ * Styles for licenses page
345
+ */
346
+ private function licenses_style() {
347
+ ?>
348
+ <style type="text/css">
349
+ .appsero-license-section {
350
+ width: 100%;
351
+ max-width: 1100px;
352
+ min-height: 1px;
353
+ box-sizing: border-box;
354
+ }
355
+ .appsero-license-settings {
356
+ background-color: #fff;
357
+ box-shadow: 0px 3px 10px rgba(16, 16, 16, 0.05);
358
+ }
359
+ .appsero-license-settings * {
360
+ box-sizing: border-box;
361
+ }
362
+ .appsero-license-title {
363
+ background-color: #F8FAFB;
364
+ border-bottom: 2px solid #EAEAEA;
365
+ display: flex;
366
+ align-items: center;
367
+ padding: 10px 20px;
368
+ }
369
+ .appsero-license-title svg {
370
+ width: 30px;
371
+ height: 30px;
372
+ fill: #0082BF;
373
+ }
374
+ .appsero-license-title span {
375
+ font-size: 17px;
376
+ color: #444444;
377
+ margin-left: 10px;
378
+ }
379
+ .appsero-license-details {
380
+ padding: 20px;
381
+ }
382
+ .appsero-license-details p {
383
+ font-size: 15px;
384
+ margin: 0 0 20px 0;
385
+ }
386
+ .license-input-key {
387
+ position: relative;
388
+ flex: 0 0 72%;
389
+ max-width: 72%;
390
+ }
391
+ .license-input-key input {
392
+ background-color: #F9F9F9;
393
+ padding: 10px 15px 10px 48px;
394
+ border: 1px solid #E8E5E5;
395
+ border-radius: 3px;
396
+ height: 45px;
397
+ font-size: 16px;
398
+ color: #71777D;
399
+ width: 100%;
400
+ box-shadow: 0 0 0 transparent;
401
+ }
402
+ .license-input-key input:focus {
403
+ outline: 0 none;
404
+ border: 1px solid #E8E5E5;
405
+ box-shadow: 0 0 0 transparent;
406
+ }
407
+ .license-input-key svg {
408
+ width: 22px;
409
+ height: 22px;
410
+ fill: #0082BF;
411
+ position: absolute;
412
+ left: 14px;
413
+ top: 13px;
414
+ }
415
+ .license-input-fields {
416
+ display: flex;
417
+ justify-content: space-between;
418
+ margin-bottom: 30px;
419
+ max-width: 850px;
420
+ width: 100%;
421
+ }
422
+ .license-input-fields button {
423
+ color: #fff;
424
+ font-size: 17px;
425
+ padding: 8px;
426
+ height: 46px;
427
+ background-color: #0082BF;
428
+ border-radius: 3px;
429
+ cursor: pointer;
430
+ flex: 0 0 25%;
431
+ max-width: 25%;
432
+ border: 1px solid #0082BF;
433
+ }
434
+ .license-input-fields button.deactive-button {
435
+ background-color: #E40055;
436
+ border-color: #E40055;
437
+ }
438
+ .license-input-fields button:focus {
439
+ outline: 0 none;
440
+ }
441
+ .active-license-info {
442
+ display: flex;
443
+ }
444
+ .single-license-info {
445
+ min-width: 220px;
446
+ flex: 0 0 30%;
447
+ }
448
+ .single-license-info h3 {
449
+ font-size: 18px;
450
+ margin: 0 0 12px 0;
451
+ }
452
+ .single-license-info p {
453
+ margin: 0;
454
+ color: #00C000;
455
+ }
456
+ .single-license-info p.occupied {
457
+ color: #E40055;
458
+ }
459
+ </style>
460
+ <?php
461
+ }
462
+
463
+ /**
464
+ * Show active license information
465
+ */
466
+ private function show_active_license_info( $license ) {
467
+ ?>
468
+ <div class="active-license-info">
469
+ <div class="single-license-info">
470
+ <h3>Activation Remaining</h3>
471
+ <?php if ( empty( $license['activation_limit'] ) ): ?>
472
+ <p>Unlimited</p>
473
+ <?php else: ?>
474
+ <p class="<?php echo $license['remaining'] ? '' : 'occupied'; ?>">
475
+ <?php echo $license['remaining']; ?> out of <?php echo $license['activation_limit']; ?>
476
+ </p>
477
+ <?php endif; ?>
478
+ </div>
479
+ <div class="single-license-info">
480
+ <h3>Expires in</h3>
481
+ <?php
482
+ if ( $license['recurring'] && false !== $license['expiry_days'] ) {
483
+ $occupied = $license['expiry_days'] > 10 ? '' : 'occupied';
484
+ echo '<p class="' . $occupied . '">' . $license['expiry_days'] . ' days</p>';
485
+ } else {
486
+ echo '<p>Never</p>';
487
+ }
488
+ ?>
489
+ </div>
490
+ </div>
491
+ <?php
492
+ }
493
+
494
+ /**
495
+ * Show license settings page notices
496
+ */
497
+ private function show_license_page_notices() {
498
+ if ( ! empty( $this->error ) ) :
499
+ ?>
500
+ <div class="notice notice-error is-dismissible appsero-license-section">
501
+ <p><?php echo $this->error; ?></p>
502
+ </div>
503
+ <?php
504
+ endif;
505
+ if ( ! empty( $this->success ) ) :
506
+ ?>
507
+ <div class="notice notice-success is-dismissible appsero-license-section">
508
+ <p><?php echo $this->success; ?></p>
509
+ </div>
510
+ <?php
511
+ endif;
512
+ echo '<br />';
513
+ }
514
+
515
+ /**
516
+ * Card header
517
+ */
518
+ private function show_license_page_card_header() {
519
+ ?>
520
+ <div class="appsero-license-title">
521
+ <svg enable-background="new 0 0 299.995 299.995" version="1.1" viewBox="0 0 300 300" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
522
+ <path d="m150 161.48c-8.613 0-15.598 6.982-15.598 15.598 0 5.776 3.149 10.807 7.817 13.505v17.341h15.562v-17.341c4.668-2.697 7.817-7.729 7.817-13.505 0-8.616-6.984-15.598-15.598-15.598z"/>
523
+ <path d="m150 85.849c-13.111 0-23.775 10.665-23.775 23.775v25.319h47.548v-25.319c-1e-3 -13.108-10.665-23.775-23.773-23.775z"/>
524
+ <path d="m150 1e-3c-82.839 0-150 67.158-150 150 0 82.837 67.156 150 150 150s150-67.161 150-150c0-82.839-67.161-150-150-150zm46.09 227.12h-92.173c-9.734 0-17.626-7.892-17.626-17.629v-56.919c0-8.491 6.007-15.582 14.003-17.25v-25.697c0-27.409 22.3-49.711 49.711-49.711 27.409 0 49.709 22.3 49.709 49.711v25.697c7.993 1.673 14 8.759 14 17.25v56.919h2e-3c0 9.736-7.892 17.629-17.626 17.629z"/>
525
+ </svg>
526
+ <span>Activate License</span>
527
+ </div>
528
+ <?php
529
+ }
530
+
531
+ /**
532
+ * Active client license
533
+ */
534
+ private function active_client_license( $form ) {
535
+ if ( empty( $form['license_key'] ) ) {
536
+ $this->error = 'The license key field is required.';
537
+ return;
538
+ }
539
+
540
+ $license_key = sanitize_text_field( $form['license_key'] );
541
+ $response = $this->activate( $license_key );
542
+
543
+ if ( ! $response['success'] ) {
544
+ $this->error = $response['error'] ? $response['error'] : 'Unknown error occurred.';
545
+ return;
546
+ }
547
+
548
+ $data = array(
549
+ 'key' => $license_key,
550
+ 'status' => 'activate',
551
+ 'remaining' => $response['remaining'],
552
+ 'activation_limit' => $response['activation_limit'],
553
+ 'expiry_days' => $response['expiry_days'],
554
+ 'title' => $response['title'],
555
+ 'source_id' => $response['source_identifier'],
556
+ 'recurring' => $response['recurring'],
557
+ );
558
+
559
+ update_option( $this->option_key, $data, false );
560
+
561
+ $this->success = 'License activated successfully.';
562
+ }
563
+
564
+ /**
565
+ * Deactive client license
566
+ */
567
+ private function deactive_client_license( $form ) {
568
+ $license = get_option( $this->option_key, null );
569
+
570
+ if ( empty( $license['key'] ) ) {
571
+ $this->error = 'License key not found.';
572
+ return;
573
+ }
574
+
575
+ $response = $this->deactivate( $license['key'] );
576
+
577
+ $data = array(
578
+ 'key' => '',
579
+ 'status' => 'deactivate',
580
+ );
581
+
582
+ update_option( $this->option_key, $data, false );
583
+
584
+ if ( ! $response['success'] ) {
585
+ $this->error = $response['error'] ? $response['error'] : 'Unknown error occurred.';
586
+ return;
587
+ }
588
+
589
+ $this->success = 'License deactivated successfully.';
590
+ }
591
+
592
+ /**
593
+ * Add license menu page
594
+ */
595
+ private function create_menu_page() {
596
+ call_user_func(
597
+ 'add_' . 'menu' . '_page',
598
+ $this->menu_args['page_title'],
599
+ $this->menu_args['menu_title'],
600
+ $this->menu_args['capability'],
601
+ $this->menu_args['menu_slug'],
602
+ array( $this, 'menu_output' ),
603
+ $this->menu_args['icon_url'],
604
+ $this->menu_args['position']
605
+ );
606
+ }
607
+
608
+ /**
609
+ * Add submenu page
610
+ */
611
+ private function create_submenu_page() {
612
+ call_user_func(
613
+ 'add_' . 'submenu' . '_page',
614
+ $this->menu_args['parent_slug'],
615
+ $this->menu_args['page_title'],
616
+ $this->menu_args['menu_title'],
617
+ $this->menu_args['capability'],
618
+ $this->menu_args['menu_slug'],
619
+ array( $this, 'menu_output' ),
620
+ $this->menu_args['position']
621
+ );
622
+ }
623
+
624
+ /**
625
+ * Add submenu page
626
+ */
627
+ private function create_options_page() {
628
+ call_user_func(
629
+ 'add_' . 'options' . '_page',
630
+ $this->menu_args['page_title'],
631
+ $this->menu_args['menu_title'],
632
+ $this->menu_args['capability'],
633
+ $this->menu_args['menu_slug'],
634
+ array( $this, 'menu_output' ),
635
+ $this->menu_args['position']
636
+ );
637
+ }
638
+
639
+ /**
640
+ * Schedule daily sicense checker event
641
+ */
642
+ public function schedule_cron_event() {
643
+ if ( ! wp_next_scheduled( $this->schedule_hook ) ) {
644
+ wp_schedule_event( time(), 'daily', $this->schedule_hook );
645
+
646
+ wp_schedule_single_event( time() + 20, $this->schedule_hook );
647
+ }
648
+ }
649
+
650
+ /**
651
+ * Clear any scheduled hook
652
+ */
653
+ public function clear_scheduler() {
654
+ wp_clear_scheduled_hook( $this->schedule_hook );
655
+ }
656
+
657
+ /**
658
+ * Enable/Disable schedule
659
+ */
660
+ private function run_schedule() {
661
+ switch ( $this->client->type ) {
662
+ case 'plugin':
663
+ register_activation_hook( $this->client->file, array( $this, 'schedule_cron_event' ) );
664
+ register_deactivation_hook( $this->client->file, array( $this, 'clear_scheduler' ) );
665
+ break;
666
+
667
+ case 'theme':
668
+ add_action( 'after_switch_theme', array( $this, 'schedule_cron_event' ) );
669
+ add_action( 'switch_theme', array( $this, 'clear_scheduler' ) );
670
+ break;
671
+ }
672
+ }
673
+
674
+ /**
675
+ * Form action URL
676
+ */
677
+ private function formActionUrl() {
678
+ echo add_query_arg(
679
+ array( 'page' => $_GET['page'] ),
680
+ admin_url( basename( $_SERVER['SCRIPT_NAME'] ) )
681
+ );
682
+ }
683
+
684
+ /**
685
+ * Get input license key
686
+ * @param $action
687
+ * @return $license
688
+ */
689
+ private function get_input_license_value( $action, $license ) {
690
+ if ( 'active' == $action ) {
691
+ return isset( $license['key'] ) ? $license['key'] : '';
692
+ }
693
+
694
+ if ( 'deactive' == $action ) {
695
+ $key_length = strlen( $license['key'] );
696
+
697
+ return str_pad(
698
+ substr( $license['key'], 0, $key_length / 2 ), $key_length, '*'
699
+ );
700
+ }
701
+
702
+ return '';
703
+ }
704
+
705
+ }
include/appsero/src/Updater.php ADDED
@@ -0,0 +1,247 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Appsero;
3
+
4
+ /**
5
+ * Appsero Updater
6
+ *
7
+ * This class will show new updates project
8
+ */
9
+ class Updater {
10
+
11
+ /**
12
+ * Appsero\Client
13
+ *
14
+ * @var object
15
+ */
16
+ protected $client;
17
+
18
+ /**
19
+ * Initialize the class
20
+ *
21
+ * @param Appsero\Client
22
+ */
23
+ public function __construct( Client $client ) {
24
+
25
+ $this->client = $client;
26
+ $this->cache_key = 'appsero_' . md5( $this->client->slug ) . '_version_info';
27
+
28
+ // Run hooks.
29
+ if ( $this->client->type == 'plugin' ) {
30
+ $this->run_plugin_hooks();
31
+ } elseif ( $this->client->type == 'theme' ) {
32
+ $this->run_theme_hooks();
33
+ }
34
+ }
35
+
36
+ /**
37
+ * Set up WordPress filter to hooks to get update.
38
+ *
39
+ * @return void
40
+ */
41
+ public function run_plugin_hooks() {
42
+ add_filter( 'pre_set_site_transient_update_plugins', array( $this, 'check_plugin_update' ) );
43
+ add_filter( 'plugins_api', array( $this, 'plugins_api_filter' ), 10, 3 );
44
+ }
45
+
46
+ /**
47
+ * Set up WordPress filter to hooks to get update.
48
+ *
49
+ * @return void
50
+ */
51
+ public function run_theme_hooks() {
52
+ add_filter( 'pre_set_site_transient_update_themes', array( $this, 'check_theme_update' ) );
53
+ }
54
+
55
+ /**
56
+ * Check for Update for this specific project
57
+ */
58
+ public function check_plugin_update( $transient_data ) {
59
+ global $pagenow;
60
+
61
+ if ( ! is_object( $transient_data ) ) {
62
+ $transient_data = new \stdClass;
63
+ }
64
+
65
+ if ( 'plugins.php' == $pagenow && is_multisite() ) {
66
+ return $transient_data;
67
+ }
68
+
69
+ if ( ! empty( $transient_data->response ) && ! empty( $transient_data->response[ $this->client->basename ] ) ) {
70
+ return $transient_data;
71
+ }
72
+
73
+ $version_info = $this->get_cached_version_info();
74
+
75
+ if ( false === $version_info ) {
76
+ $version_info = $this->get_project_latest_version();
77
+ $this->set_cached_version_info( $version_info );
78
+ }
79
+
80
+ if ( false !== $version_info && is_object( $version_info ) && isset( $version_info->new_version ) ) {
81
+
82
+ if ( version_compare( $this->client->project_version, $version_info->new_version, '<' ) ) {
83
+ unset( $version_info->sections );
84
+ $transient_data->response[ $this->client->basename ] = $version_info;
85
+ }
86
+
87
+ $transient_data->last_checked = time();
88
+ $transient_data->checked[ $this->client->basename ] = $this->client->project_version;
89
+ }
90
+
91
+ return $transient_data;
92
+ }
93
+
94
+ /**
95
+ * Get version info from database
96
+ *
97
+ * @return Object or Boolean
98
+ */
99
+ private function get_cached_version_info() {
100
+
101
+ $value = get_transient( $this->cache_key );
102
+
103
+ if( ! $value && ! isset( $value->name ) ) {
104
+ return false; // Cache is expired
105
+ }
106
+
107
+ // We need to turn the icons into an array
108
+ if ( isset( $value->icons ) ) {
109
+ $value->icons = (array) $value->icons;
110
+ }
111
+
112
+ // We need to turn the banners into an array
113
+ if ( isset( $value->banners ) ) {
114
+ $value->banners = (array) $value->banners;
115
+ }
116
+
117
+ if ( isset( $value->sections ) ) {
118
+ $value->sections = (array) $value->sections;
119
+ }
120
+
121
+ return $value;
122
+ }
123
+
124
+ /**
125
+ * Set version info to database
126
+ */
127
+ private function set_cached_version_info( $value ) {
128
+ if ( ! $value ) {
129
+ return;
130
+ }
131
+
132
+ set_transient( $this->cache_key, $value, 3 * HOUR_IN_SECONDS );
133
+ }
134
+
135
+ /**
136
+ * Get plugin info from Appsero
137
+ */
138
+ private function get_project_latest_version() {
139
+
140
+ $license_option_key = 'appsero_' . md5( $this->client->slug ) . '_manage_license';
141
+ $license = get_option( $license_option_key, null );
142
+
143
+ $params = array(
144
+ 'version' => $this->client->project_version,
145
+ 'name' => $this->client->name,
146
+ 'slug' => $this->client->slug,
147
+ 'basename' => $this->client->basename,
148
+ 'license_key' => ! empty( $license ) && isset( $license['key'] ) ? $license['key'] : '',
149
+ );
150
+
151
+ $route = 'update/' . $this->client->hash . '/check';
152
+
153
+ $response = $this->client->send_request( $params, $route, true );
154
+
155
+ if ( is_wp_error( $response ) ) {
156
+ return false;
157
+ }
158
+
159
+ $response = json_decode( wp_remote_retrieve_body( $response ) );
160
+
161
+ if ( ! isset( $response->slug ) ) {
162
+ return false;
163
+ }
164
+
165
+ if ( isset( $response->icons ) ) {
166
+ $response->icons = (array) $response->icons;
167
+ }
168
+
169
+ if ( isset( $response->banners ) ) {
170
+ $response->banners = (array) $response->banners;
171
+ }
172
+
173
+ if ( isset( $response->sections ) ) {
174
+ $response->sections = (array) $response->sections;
175
+ }
176
+
177
+ return $response;
178
+ }
179
+
180
+ /**
181
+ * Updates information on the "View version x.x details" page with custom data.
182
+ *
183
+ * @param mixed $data
184
+ * @param string $action
185
+ * @param object $args
186
+ *
187
+ * @return object $data
188
+ */
189
+ public function plugins_api_filter( $data, $action = '', $args = null ) {
190
+
191
+ if ( $action != 'plugin_information' ) {
192
+ return $data;
193
+ }
194
+
195
+ if ( ! isset( $args->slug ) || ( $args->slug != $this->client->slug ) ) {
196
+ return $data;
197
+ }
198
+
199
+ $version_info = $this->get_cached_version_info();
200
+
201
+ if ( false === $version_info ) {
202
+ $version_info = $this->get_project_latest_version();
203
+ $this->set_cached_version_info( $version_info );
204
+ }
205
+
206
+ return $version_info;
207
+ }
208
+
209
+ /**
210
+ * Check theme upate
211
+ */
212
+ public function check_theme_update( $transient_data ) {
213
+ global $pagenow;
214
+
215
+ if ( ! is_object( $transient_data ) ) {
216
+ $transient_data = new \stdClass;
217
+ }
218
+
219
+ if ( 'themes.php' == $pagenow && is_multisite() ) {
220
+ return $transient_data;
221
+ }
222
+
223
+ if ( ! empty( $transient_data->response ) && ! empty( $transient_data->response[ $this->client->slug ] ) ) {
224
+ return $transient_data;
225
+ }
226
+
227
+ $version_info = $this->get_cached_version_info();
228
+
229
+ if ( false === $version_info ) {
230
+ $version_info = $this->get_project_latest_version();
231
+ $this->set_cached_version_info( $version_info );
232
+ }
233
+
234
+ if ( false !== $version_info && is_object( $version_info ) && isset( $version_info->new_version ) ) {
235
+
236
+ if ( version_compare( $this->client->project_version, $version_info->new_version, '<' ) ) {
237
+ $transient_data->response[ $this->client->slug ] = (array) $version_info;
238
+ }
239
+
240
+ $transient_data->last_checked = time();
241
+ $transient_data->checked[ $this->client->slug ] = $this->client->project_version;
242
+ }
243
+
244
+ return $transient_data;
245
+ }
246
+
247
+ }
ReadMe.txt → readme.txt RENAMED
@@ -1,10 +1,13 @@
1
  === Subscribe2 - Form, Email Subscribers & Newsletters ===
2
- Contributors: collizo4sky
3
- Donate link: https://mailoptin.io
4
  Tags: posts, subscription, email, subscribe, notify, notification, newsletter, post notification, email marketing, optin, form
5
  Requires at least: 4.0
6
- Tested up to: 5.3
 
 
7
  License: GPLv3
 
8
 
9
  Sends a list of subscribers an email notification when you publish new posts.
10
 
@@ -31,7 +34,11 @@ The format of the email can also be customised for per-post notifications, Subsc
31
  * HTML excerpt (Registered Users only).
32
  * HTML full post (Registered Users only).
33
 
34
- If you want to send new post notification or daily, weekly or monthly email digest of published posts to your email list in MailChimp, AWeber, Constant Contact etc, upgrade to [MailOptin](https://mailoptin.io).
 
 
 
 
35
 
36
  == Installation ==
37
 
@@ -65,4 +72,9 @@ This token will automatically be replaced by dynamic subscription information an
65
 
66
  == Changelog ==
67
 
68
- See complete changelog installed in the same folder as this readme.
 
 
 
 
 
1
  === Subscribe2 - Form, Email Subscribers & Newsletters ===
2
+ Contributors: tareq1988, nizamuddinbabu, wemail
3
+ Donate link: https://getwemail.io
4
  Tags: posts, subscription, email, subscribe, notify, notification, newsletter, post notification, email marketing, optin, form
5
  Requires at least: 4.0
6
+ Tested up to: 5.4
7
+ Stable tag: 10.33
8
+ Requires PHP: 5.4
9
  License: GPLv3
10
+ License URI: https://www.gnu.org/licenses/gpl-3.0.html
11
 
12
  Sends a list of subscribers an email notification when you publish new posts.
13
 
34
  * HTML excerpt (Registered Users only).
35
  * HTML full post (Registered Users only).
36
 
37
+ If you want to grow your subscriber lists, send automated campaigns to huge subscriber lists, you should upgrade to [weMail](https://getwemail.io).
38
+
39
+
40
+ = Privacy Policy =
41
+ Subscribe2 uses [Appsero](https://appsero.com) SDK to collect some telemetry data upon user's confirmation. This helps us to troubleshoot problems faster & make product improvements. Learn more about how [Appsero collects and uses this data](https://appsero.com/privacy-policy/).
42
 
43
  == Installation ==
44
 
72
 
73
  == Changelog ==
74
 
75
+ = 10.33 (4th June, 2020) =
76
+
77
+ * Bump tested upto version 4.4
78
+ * Minimum PHP version set to 5.4
79
+
80
+ See complete [changelog](https://github.com/weMail/Subscribe2/blob/develop/changeLog.txt).
subscribe2.php CHANGED
@@ -1,17 +1,17 @@
1
  <?php
2
  /*
3
  Plugin Name: Subscribe2
4
- Plugin URI: https://mailoptin.io
5
  Description: Notifies an email list when new entries are posted.
6
- Version: 10.32
7
- Author: Subscribe2
8
- Author URI: https://mailoptin.io
9
  Licence: GPLv3
10
  Text Domain: subscribe2
11
  */
12
 
13
  /*
14
- Copyright (C) 2006-20 Matthew Robinson
15
  Based on the Original Subscribe2 plugin by
16
  Copyright (C) 2005 Scott Merrill (skippy@skippy.net)
17
 
@@ -54,7 +54,7 @@ if ( is_plugin_active_for_network( plugin_basename( __FILE__ ) ) ) {
54
 
55
  // our version number. Don't touch this or any line below
56
  // unless you know exactly what you are doing
57
- define( 'S2VERSION', '10.32' );
58
  define( 'S2PLUGIN', __FILE__ );
59
  define( 'S2PATH', trailingslashit( dirname( __FILE__ ) ) );
60
  define( 'S2DIR', trailingslashit( dirname( plugin_basename( __FILE__ ) ) ) );
@@ -66,7 +66,9 @@ if ( function_exists( 'set_time_limit' ) ) {
66
  }
67
 
68
  global $mysubscribe2;
 
69
  require_once S2PATH . 'classes/class-s2-core.php';
 
70
  if ( is_admin() ) {
71
  require_once S2PATH . 'classes/class-s2-admin.php';
72
  $mysubscribe2 = new S2_Admin();
@@ -74,4 +76,22 @@ if ( is_admin() ) {
74
  require_once S2PATH . 'classes/class-s2-frontend.php';
75
  $mysubscribe2 = new S2_Frontend();
76
  }
 
77
  add_action( 'plugins_loaded', array( $mysubscribe2, 's2init' ) );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  <?php
2
  /*
3
  Plugin Name: Subscribe2
4
+ Plugin URI: https://getwemail.io
5
  Description: Notifies an email list when new entries are posted.
6
+ Version: 10.33
7
+ Author: weMail
8
+ Author URI: https://getwemail.io
9
  Licence: GPLv3
10
  Text Domain: subscribe2
11
  */
12
 
13
  /*
14
+ Copyright (C) 2020 weDevs (info@getwemail.io)
15
  Based on the Original Subscribe2 plugin by
16
  Copyright (C) 2005 Scott Merrill (skippy@skippy.net)
17
 
54
 
55
  // our version number. Don't touch this or any line below
56
  // unless you know exactly what you are doing
57
+ define( 'S2VERSION', '10.33' );
58
  define( 'S2PLUGIN', __FILE__ );
59
  define( 'S2PATH', trailingslashit( dirname( __FILE__ ) ) );
60
  define( 'S2DIR', trailingslashit( dirname( plugin_basename( __FILE__ ) ) ) );
66
  }
67
 
68
  global $mysubscribe2;
69
+
70
  require_once S2PATH . 'classes/class-s2-core.php';
71
+
72
  if ( is_admin() ) {
73
  require_once S2PATH . 'classes/class-s2-admin.php';
74
  $mysubscribe2 = new S2_Admin();
76
  require_once S2PATH . 'classes/class-s2-frontend.php';
77
  $mysubscribe2 = new S2_Frontend();
78
  }
79
+
80
  add_action( 'plugins_loaded', array( $mysubscribe2, 's2init' ) );
81
+
82
+ /**
83
+ * Initialize the plugin tracker
84
+ *
85
+ * @return void
86
+ */
87
+ function subscribe2_init_appsero() {
88
+
89
+ if ( ! class_exists( 'Appsero\Client' ) ) {
90
+ require_once S2PATH . 'include/appsero/src/Client.php';
91
+ }
92
+
93
+ $client = new Appsero\Client( '6c1e710d-aab6-4d4b-b29d-aad2ff773f4c', 'Subscribe2', __FILE__ );
94
+ $client->insights()->init();
95
+ }
96
+
97
+ subscribe2_init_appsero();
subscribe2.pot CHANGED
@@ -1,30 +1,41 @@
1
- # Copyright (C) 2020 Subscribe2
2
- # This file is distributed under the same license as the Subscribe2 package.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: Subscribe2 10.32\n"
6
  "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/subscribe2\n"
7
- "POT-Creation-Date: 2020-01-19 17:21:19+00:00\n"
8
- "MIME-Version: 1.0\n"
9
- "Content-Type: text/plain; charset=utf-8\n"
10
- "Content-Transfer-Encoding: 8bit\n"
11
- "PO-Revision-Date: 2020-MO-DA HO:MI+ZONE\n"
12
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13
  "Language-Team: LANGUAGE <LL@li.org>\n"
14
- "Language: en\n"
15
- "Plural-Forms: nplurals=2; plural=(n != 1);\n"
16
- "X-Poedit-Country: United States\n"
17
- "X-Poedit-SourceCharset: UTF-8\n"
18
- "X-Poedit-KeywordsList: "
19
- "__;_e;_x:1,2c;_ex:1,2c;_n:1,2;_nx:1,2,4c;_n_noop:1,2;_nx_noop:1,2,3c;esc_"
20
- "attr__;esc_html__;esc_attr_e;esc_html_e;esc_attr_x:1,2c;esc_html_x:1,2c;\n"
21
- "X-Poedit-Basepath: ../\n"
22
- "X-Poedit-SearchPath-0: .\n"
23
- "X-Poedit-Bookmarks: \n"
24
- "X-Textdomain-Support: yes\n"
25
- "X-Generator: grunt-wp-i18n 1.0.3\n"
26
-
27
- #: admin/send-email.php:11 admin/settings.php:11 admin/subscribers.php:32
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
28
  #: admin/your-subscriptions.php:13
29
  msgid "Security error! Your request cannot be completed."
30
  msgstr ""
@@ -90,9 +101,7 @@ msgid "Attempt made to resend the Digest Notification email"
90
  msgstr ""
91
 
92
  #: admin/settings.php:37
93
- msgid ""
94
- "The Digest Notification email contained no post information. No email was "
95
- "sent"
96
  msgstr ""
97
 
98
  #: admin/settings.php:120
@@ -112,53 +121,58 @@ msgid "Modify your template"
112
  msgstr ""
113
 
114
  #: admin/settings.php:152
115
- msgid ""
116
- "Your chosen email type (per-post or digest) does not support the following "
117
- "keywords:"
118
  msgstr ""
119
 
120
- #: admin/settings.php:166
121
  #. Translators: Warning message
122
- msgid ""
123
- "You appear to be sending notifications from %1$s, which has a different "
124
- "domain name than your blog server %2$s. This may result in failed emails."
125
  msgstr ""
126
 
127
- #: admin/settings.php:174 classes/class-s2-admin.php:22
128
- #: classes/class-s2-admin.php:259
 
129
  msgid "Settings"
130
  msgstr ""
131
 
132
- #: admin/settings.php:176 classes/class-s2-admin.php:116
 
133
  msgid "Email Settings"
134
  msgstr ""
135
 
136
- #: admin/settings.php:177 classes/class-s2-admin.php:126
 
137
  msgid "Templates"
138
  msgstr ""
139
 
140
- #: admin/settings.php:178 classes/class-s2-admin.php:136
 
141
  msgid "Registered Users"
142
  msgstr ""
143
 
144
- #: admin/settings.php:179 classes/class-s2-admin.php:145
 
145
  msgid "Appearance"
146
  msgstr ""
147
 
148
- #: admin/settings.php:180 classes/class-s2-admin.php:163
 
149
  msgid "Miscellaneous"
150
  msgstr ""
151
 
152
- #: admin/settings.php:203 classes/class-s2-admin.php:841
153
- #: classes/class-s2-list-table-legacy.php:43 classes/class-s2-list-table.php:36
 
154
  msgid "Edit"
155
  msgstr ""
156
 
157
- #: admin/settings.php:206 classes/class-s2-admin.php:855
 
158
  msgid "Update"
159
  msgstr ""
160
 
161
- #: admin/settings.php:207 classes/class-s2-admin.php:856
 
162
  msgid "Revert"
163
  msgstr ""
164
 
@@ -186,20 +200,39 @@ msgstr ""
186
  msgid "Include theme CSS stylesheet in HTML notifications"
187
  msgstr ""
188
 
189
- #: admin/settings.php:221 admin/settings.php:227 admin/settings.php:233
190
- #: admin/settings.php:238 admin/settings.php:244 admin/settings.php:382
191
- #: admin/settings.php:388 admin/settings.php:403 admin/settings.php:411
192
- #: admin/settings.php:427 admin/settings.php:434 admin/subscribers.php:328
193
- #: classes/class-s2-forms.php:59 classes/class-s2-forms.php:100
 
 
 
 
 
 
 
 
 
194
  msgid "Yes"
195
  msgstr ""
196
 
197
- #: admin/settings.php:223 admin/settings.php:229 admin/settings.php:235
198
- #: admin/settings.php:240 admin/settings.php:246 admin/settings.php:379
199
- #: admin/settings.php:384 admin/settings.php:390 admin/settings.php:405
200
- #: admin/settings.php:413 admin/settings.php:423 admin/settings.php:429
201
- #: admin/settings.php:436 admin/subscribers.php:330
202
- #: classes/class-s2-forms.php:61 classes/class-s2-forms.php:104
 
 
 
 
 
 
 
 
 
 
203
  msgid "No"
204
  msgstr ""
205
 
@@ -207,525 +240,503 @@ msgstr ""
207
  msgid "Send Emails for Pages"
208
  msgstr ""
209
 
210
- #: admin/settings.php:231
 
 
 
 
211
  msgid "Send Emails for Password Protected Posts"
212
  msgstr ""
213
 
214
- #: admin/settings.php:236
215
  msgid "Send Emails for Private Posts"
216
  msgstr ""
217
 
218
- #: admin/settings.php:242
219
  msgid "Include Sticky Posts at the top of all Digest Notifications"
220
  msgstr ""
221
 
222
- #: admin/settings.php:248
223
  msgid "Send Email From"
224
  msgstr ""
225
 
226
- #: admin/settings.php:253
227
  msgid "Send Emails"
228
  msgstr ""
229
 
230
- #: admin/settings.php:257
231
  msgid "For digest notifications, date order for posts is"
232
  msgstr ""
233
 
234
- #: admin/settings.php:259
235
  msgid "Descending"
236
  msgstr ""
237
 
238
- #: admin/settings.php:261
239
  msgid "Ascending"
240
  msgstr ""
241
 
242
- #: admin/settings.php:263
243
  msgid "Add Tracking Parameters to the Permalink"
244
  msgstr ""
245
 
246
- #: admin/settings.php:265
247
- msgid ""
248
- "eg. "
249
- "utm_source=subscribe2&amp;utm_medium=email&amp;utm_campaign=postnotify&"
250
- "amp;utm_id={ID}&amp;utm_title={TITLE}"
251
  msgstr ""
252
 
253
- #: admin/settings.php:276
254
  msgid "Notification email (must not be empty)"
255
  msgstr ""
256
 
257
- #: admin/settings.php:277 admin/settings.php:316 admin/settings.php:321
 
 
258
  msgid "Subject Line"
259
  msgstr ""
260
 
261
- #: admin/settings.php:282
262
  msgid "Send Email Preview"
263
  msgstr ""
264
 
265
- #: admin/settings.php:283
266
  msgid "Message substitutions"
267
  msgstr ""
268
 
269
- #: admin/settings.php:285
270
  msgid "IF THE FOLLOWING KEYWORDS ARE ALSO IN YOUR POST THEY WILL BE SUBSTITUTED"
271
  msgstr ""
272
 
273
- #: admin/settings.php:288
274
  msgid "the post's title<br>(<i>for per-post emails only</i>)"
275
  msgstr ""
276
 
277
- #: admin/settings.php:289
278
  msgid "the post's unformatted title <br>(<i>for per-post emails only</i>)"
279
  msgstr ""
280
 
281
- #: admin/settings.php:290
282
- msgid ""
283
- "the excerpt or the entire post<br>(<i>based on the subscriber's "
284
- "preferences</i>)"
285
  msgstr ""
286
 
287
- #: admin/settings.php:291
288
- msgid ""
289
- "the excerpt of the post and the time it was posted<br>(<i>for digest emails "
290
- "only</i>)"
291
  msgstr ""
292
 
293
- #: admin/settings.php:292
294
  msgid "a list of post titles<br>(<i>for digest emails only</i>)"
295
  msgstr ""
296
 
297
- #: admin/settings.php:293
298
- msgid ""
299
- "a list of post titles followed by links to the articles<br>(<i>for digest "
300
- "emails only</i>)"
301
  msgstr ""
302
 
303
- #: admin/settings.php:294
304
- msgid ""
305
- "a reference style list of links at the end of the email with corresponding "
306
- "numbers in the content<br>(<i>for the full content plain text per-post "
307
- "email only</i>)"
308
  msgstr ""
309
 
310
- #: admin/settings.php:295
311
  msgid "the post's permalink<br>(<i>for per-post emails only</i>)"
312
  msgstr ""
313
 
314
- #: admin/settings.php:296
315
  msgid "the post's permalink after conversion by TinyURL"
316
  msgstr ""
317
 
318
- #: admin/settings.php:297
319
  msgid "the post's unformatted permalink<br>(<i>for per-post emails only</i>)"
320
  msgstr ""
321
 
322
- #: admin/settings.php:298
323
  msgid "the date the post was made<br>(<i>for per-post emails only</i>)"
324
  msgstr ""
325
 
326
- #: admin/settings.php:299
327
  msgid "the time the post was made<br>(<i>for per-post emails only</i>)"
328
  msgstr ""
329
 
330
- #: admin/settings.php:300
331
  msgid "the admin or post author's name"
332
  msgstr ""
333
 
334
- #: admin/settings.php:301
335
  msgid "the admin or post author's email"
336
  msgstr ""
337
 
338
- #: admin/settings.php:302
339
  msgid "the post author's name"
340
  msgstr ""
341
 
342
- #: admin/settings.php:303
343
- msgid ""
344
- "the generated link to confirm a request<br>(<i>only used in the "
345
- "confirmation email template</i>)"
346
  msgstr ""
347
 
348
- #: admin/settings.php:305
349
- msgid ""
350
- "a generated unsubscribe link<br>(<i>only used in the email notification "
351
- "template</i>)"
352
  msgstr ""
353
 
354
- #: admin/settings.php:307
355
- msgid ""
356
- "Action performed by LINK in confirmation email<br>(<i>only used in the "
357
- "confirmation email template</i>)"
358
  msgstr ""
359
 
360
- #: admin/settings.php:308
361
  msgid "the post's assigned categories"
362
  msgstr ""
363
 
364
- #: admin/settings.php:309
365
  msgid "the post's assigned Tags"
366
  msgstr ""
367
 
368
- #: admin/settings.php:310
369
- msgid ""
370
- "the number of posts included in the digest email<br>(<i>for digest emails "
371
- "only</i>)"
372
  msgstr ""
373
 
374
- #: admin/settings.php:312
375
  msgid "the post's featured image"
376
  msgstr ""
377
 
378
- #: admin/settings.php:315
379
  msgid "Subscribe / Unsubscribe confirmation email"
380
  msgstr ""
381
 
382
- #: admin/settings.php:320
383
  msgid "Reminder email to Unconfirmed Subscribers"
384
  msgstr ""
385
 
386
- #: admin/settings.php:336
387
  msgid "Compulsory Categories"
388
  msgstr ""
389
 
390
- #: admin/settings.php:338
391
  msgid "Compulsory categories will be checked by default for Registered Subscribers"
392
  msgstr ""
393
 
394
- #: admin/settings.php:345
395
  msgid "Excluded Categories"
396
  msgstr ""
397
 
398
- #: admin/settings.php:347
399
- msgid ""
400
- "Posts assigned to any Excluded Category do not generate notifications and "
401
- "are not included in digest notifications"
402
  msgstr ""
403
 
404
- #: admin/settings.php:351
405
  msgid "Allow registered users to subscribe to excluded categories?"
406
  msgstr ""
407
 
408
- #: admin/settings.php:359
409
  msgid "Excluded Formats"
410
  msgstr ""
411
 
412
- #: admin/settings.php:361
413
- msgid ""
414
- "Posts assigned to any Excluded Format do not generate notifications and are "
415
- "not included in digest notifications"
416
  msgstr ""
417
 
418
- #: admin/settings.php:369
419
  msgid "Auto-Subscribe"
420
  msgstr ""
421
 
422
- #: admin/settings.php:371
423
  msgid "Subscribe new users registering with your blog"
424
  msgstr ""
425
 
426
- #: admin/settings.php:374
427
  msgid "Automatically"
428
  msgstr ""
429
 
430
- #: admin/settings.php:377
431
  msgid "Display option on Registration Form"
432
  msgstr ""
433
 
434
- #: admin/settings.php:380
435
  msgid "Auto-subscribe includes any excluded categories"
436
  msgstr ""
437
 
438
- #: admin/settings.php:386
439
  msgid "Registration Form option is checked by default"
440
  msgstr ""
441
 
442
- #: admin/settings.php:392
443
  msgid "Auto-subscribe users to receive email as"
444
  msgstr ""
445
 
446
- #: admin/settings.php:394 admin/subscribers.php:314
 
447
  #: classes/class-s2-forms.php:48
448
  msgid "HTML - Full"
449
  msgstr ""
450
 
451
- #: admin/settings.php:396 admin/subscribers.php:315
 
452
  #: classes/class-s2-forms.php:50
453
  msgid "HTML - Excerpt"
454
  msgstr ""
455
 
456
- #: admin/settings.php:398 admin/subscribers.php:316
 
457
  #: classes/class-s2-forms.php:52
458
  msgid "Plain Text - Full"
459
  msgstr ""
460
 
461
- #: admin/settings.php:400 admin/subscribers.php:317
 
462
  #: classes/class-s2-forms.php:54
463
  msgid "Plain Text - Excerpt"
464
  msgstr ""
465
 
466
- #: admin/settings.php:401
467
  msgid "Registered Users have the option to auto-subscribe to new categories"
468
  msgstr ""
469
 
470
- #: admin/settings.php:407
471
  msgid "New categories are immediately excluded"
472
  msgstr ""
473
 
474
- #: admin/settings.php:409
475
- msgid ""
476
- "Option for Registered Users to auto-subscribe to new categories is checked "
477
- "by default"
478
  msgstr ""
479
 
480
- #: admin/settings.php:417
481
  msgid "Display checkbox to allow subscriptions from the comment form"
482
  msgstr ""
483
 
484
- #: admin/settings.php:419
485
  msgid "Before the Comment Submit button"
486
  msgstr ""
487
 
488
- #: admin/settings.php:421
489
  msgid "After the Comment Submit button"
490
  msgstr ""
491
 
492
- #: admin/settings.php:425
493
  msgid "Comment form checkbox is checked by default"
494
  msgstr ""
495
 
496
- #: admin/settings.php:432
497
  msgid "Show one-click subscription on profile page"
498
  msgstr ""
499
 
500
- #: admin/settings.php:447
501
  msgid "Set default Subscribe2 page as"
502
  msgstr ""
503
 
504
- #: admin/settings.php:452
505
  msgid "Show a link to your subscription page in \"meta\"?"
506
  msgstr ""
507
 
508
- #: admin/settings.php:456
509
  msgid "Show the Subscribe2 button on the Write toolbar?"
510
  msgstr ""
511
 
512
- #: admin/settings.php:460
513
  msgid "Enable popup style subscription form?"
514
  msgstr ""
515
 
516
- #: admin/settings.php:464
517
  msgid "Enable Subscribe2 Widget?"
518
  msgstr ""
519
 
520
- #: admin/settings.php:468
521
  msgid "Enable Subscribe2 Counter Widget?"
522
  msgstr ""
523
 
524
- #: admin/settings.php:472
525
  msgid "Disable email notifications is checked by default on authoring pages?"
526
  msgstr ""
527
 
528
- #: admin/settings.php:476
529
- msgid ""
530
- "Use javascript to update IP address in Subscribe2 HTML form data? (useful "
531
- "if caching is enabled)"
532
  msgstr ""
533
 
534
- #: admin/settings.php:484
535
  msgid "Barred Domains"
536
  msgstr ""
537
 
538
- #: admin/settings.php:486
539
- msgid ""
540
- "Enter domains to bar for public subscriptions, wildcards (*) and exceptions "
541
- "(!) are allowed"
542
  msgstr ""
543
 
544
- #: admin/settings.php:487
545
- msgid ""
546
- "Use a new line for each entry and omit the \"@\" symbol, for example "
547
- "!email.com, hotmail.com, yahoo.*"
548
  msgstr ""
549
 
550
- #: admin/settings.php:490
551
  msgid "Links"
552
  msgstr ""
553
 
554
- #: admin/settings.php:491
555
  msgid "Plugin Site"
556
  msgstr ""
557
 
558
- #: admin/settings.php:492
559
  msgid "Plugin Forum"
560
  msgstr ""
561
 
562
- #: admin/settings.php:493
563
  msgid "Plugin Blog"
564
  msgstr ""
565
 
566
- #: admin/settings.php:494
567
- msgid "Make a donation via PayPal"
568
- msgstr ""
569
-
570
- #: admin/settings.php:500
571
  msgid "Submit"
572
  msgstr ""
573
 
574
- #: admin/settings.php:504
575
  msgid "Reset to Default Settings"
576
  msgstr ""
577
 
578
- #: admin/settings.php:505
579
- msgid ""
580
- "Use this to reset all options to their defaults. This <strong><em>will "
581
- "not</em></strong> modify your list of subscribers."
582
  msgstr ""
583
 
584
- #: admin/settings.php:507
585
  msgid "RESET"
586
  msgstr ""
587
 
588
- #: admin/subscribers.php:57
589
  msgid "Address(es) subscribed!"
590
  msgstr ""
591
 
592
- #: admin/subscribers.php:64
593
  msgid "Address(es) unsubscribed!"
594
  msgstr ""
595
 
596
- #: admin/subscribers.php:69
597
- msgid ""
598
- "Some emails were not processed, the following are already Registered "
599
- "Subscribers"
600
  msgstr ""
601
 
602
- #: admin/subscribers.php:72
603
  msgid "Some emails were not processed, the following are already Public Subscribers"
604
  msgstr ""
605
 
606
- #: admin/subscribers.php:75
607
  msgid "Some emails were not processed, the following were not in the database"
608
  msgstr ""
609
 
610
- #: admin/subscribers.php:78
611
  msgid "Some emails were not processed, the following were invalid email addresses"
612
  msgstr ""
613
 
614
- #: admin/subscribers.php:86
615
  msgid "Reminder Email(s) Sent!"
616
  msgstr ""
617
 
618
- #: admin/subscribers.php:93
619
  msgid "Registered Users Subscribed!"
620
  msgstr ""
621
 
622
- #: admin/subscribers.php:100
623
  msgid "Registered Users Unsubscribed!"
624
  msgstr ""
625
 
626
- #: admin/subscribers.php:107
627
  msgid "Format updated for Selected Registered Users!"
628
  msgstr ""
629
 
630
- #: admin/subscribers.php:114
631
  msgid "Digest Subscription updated for Selected Registered Users!"
632
  msgstr ""
633
 
634
- #: admin/subscribers.php:199 classes/class-s2-admin.php:15
 
635
  msgid "Subscribers"
636
  msgstr ""
637
 
638
- #: admin/subscribers.php:201 classes/class-s2-admin.php:69
639
- #: classes/class-s2-admin.php:650
 
640
  msgid "Public Subscribers"
641
  msgstr ""
642
 
643
- #: admin/subscribers.php:202 classes/class-s2-admin.php:76
644
- #: classes/class-s2-admin.php:654
 
645
  msgid "Registered Subscribers"
646
  msgstr ""
647
 
648
- #: admin/subscribers.php:217 admin/subscribers.php:240
 
649
  msgid "Add/Remove Subscribers"
650
  msgstr ""
651
 
652
- #: admin/subscribers.php:218
653
  msgid "Enter addresses, one per line or comma-separated"
654
  msgstr ""
655
 
656
- #: admin/subscribers.php:221 admin/subscribers.php:305
657
- #: classes/class-s2-forms.php:195 classes/class-s2-frontend.php:84
 
 
658
  msgid "Subscribe"
659
  msgstr ""
660
 
661
- #: admin/subscribers.php:222 admin/subscribers.php:306
662
- #: classes/class-s2-forms.php:174 classes/class-s2-frontend.php:83
 
 
663
  msgid "Unsubscribe"
664
  msgstr ""
665
 
666
- #: admin/subscribers.php:227 admin/subscribers.php:247
 
667
  msgid "Current Subscribers"
668
  msgstr ""
669
 
670
- #: admin/subscribers.php:241
671
  msgid "Add Registered User"
672
  msgstr ""
673
 
674
- #: admin/subscribers.php:256
675
  msgid "Filter"
676
  msgstr ""
677
 
678
- #: admin/subscribers.php:260
679
  msgid "Send Reminder Email"
680
  msgstr ""
681
 
682
- #: admin/subscribers.php:274
683
  msgid "Save Emails to CSV File"
684
  msgstr ""
685
 
686
- #: admin/subscribers.php:281
687
  msgid "Search"
688
  msgstr ""
689
 
690
- #: admin/subscribers.php:288
691
  msgid "Bulk Management"
692
  msgstr ""
693
 
694
- #: admin/subscribers.php:302 admin/subscribers.php:324
695
- msgid ""
696
- "Preferences for Registered Users selected above can be changed using this "
697
- "section."
698
  msgstr ""
699
 
700
- #: admin/subscribers.php:303
701
  msgid "Consider User Privacy as changes cannot be undone"
702
  msgstr ""
703
 
704
- #: admin/subscribers.php:304
705
  msgid "Action to perform"
706
  msgstr ""
707
 
708
- #: admin/subscribers.php:312
709
  msgid "Bulk Update Categories"
710
  msgstr ""
711
 
712
- #: admin/subscribers.php:313
713
  msgid "Send email as"
714
  msgstr ""
715
 
716
- #: admin/subscribers.php:318
717
  msgid "Bulk Update Format"
718
  msgstr ""
719
 
720
- #: admin/subscribers.php:325
721
  msgid "Consider User Privacy as changes cannot be undone."
722
  msgstr ""
723
 
724
- #: admin/subscribers.php:326
725
  msgid "Subscribe Selected Users to receive a periodic digest notification"
726
  msgstr ""
727
 
728
- #: admin/subscribers.php:331
729
  msgid "Bulk Update Digest Subscription"
730
  msgstr ""
731
 
@@ -741,30 +752,23 @@ msgstr ""
741
  msgid "Update Preferences"
742
  msgstr ""
743
 
744
- #: classes/class-mo-admin-notice.php:62
745
  #. Translators: Mail Optin admin notice
746
- msgid ""
747
- "Free optin form plugin that will %1$sincrease your email list "
748
- "subscribers%2$s and keep them engaged with %1$sautomated and schedule "
749
- "newsletters%2$s."
750
  msgstr ""
751
 
752
- #: classes/class-mo-admin-notice.php:74
753
- msgid "Install MailOptin Now for Free!"
754
  msgstr ""
755
 
756
- #: classes/class-mo-admin-notice.php:79
757
- msgid "Activate MailOptin Now!"
758
  msgstr ""
759
 
760
- #: classes/class-mo-admin-notice.php:88
761
  msgid "Dismiss this notice"
762
  msgstr ""
763
 
764
- #. Author of the plugin/theme
765
- msgid "Subscribe2"
766
- msgstr ""
767
-
768
  #: classes/class-s2-admin.php:10
769
  msgid "Your Subscriptions"
770
  msgstr ""
@@ -773,24 +777,20 @@ msgstr ""
773
  msgid "Send Email"
774
  msgstr ""
775
 
776
- #: classes/class-s2-admin.php:42 classes/class-s2-admin.php:50
777
- #: classes/class-s2-admin.php:62 classes/class-s2-admin.php:109
778
- #: classes/class-s2-admin.php:176
 
 
779
  msgid "Overview"
780
  msgstr ""
781
 
782
  #: classes/class-s2-admin.php:43
783
- msgid ""
784
- "From this page you can opt in or out of receiving a periodical digest style "
785
- "email of blog posts."
786
  msgstr ""
787
 
788
  #: classes/class-s2-admin.php:51
789
- msgid ""
790
- "From this page you can control your subscription preferences. Choose the "
791
- "email format you wish to receive, which categories you would like to "
792
- "receive notification for and depending on the site settings which authors "
793
- "you would like to read."
794
  msgstr ""
795
 
796
  #: classes/class-s2-admin.php:63
@@ -798,37 +798,23 @@ msgid "From this page you can manage your subscribers."
798
  msgstr ""
799
 
800
  #: classes/class-s2-admin.php:70
801
- msgid ""
802
- "Public Subscribers are subscribers who have used the plugin form and only "
803
- "provided their email address."
804
  msgstr ""
805
 
806
  #: classes/class-s2-admin.php:70
807
- msgid ""
808
- "On this page public subscribers can be viewed, searched, deleted and also "
809
- "toggled between Confirmed and Unconfirmed status."
810
  msgstr ""
811
 
812
  #: classes/class-s2-admin.php:77
813
- msgid ""
814
- "Registered Subscribers are subscribers who have registered in WordPress and "
815
- "have a username and password."
816
  msgstr ""
817
 
818
  #: classes/class-s2-admin.php:78
819
- msgid ""
820
- "Registered Subscribers have greater personal control over their "
821
- "subscription. They can change the format of the email and also select which "
822
- "categories and authors they want to receive notifications about."
823
  msgstr ""
824
 
825
  #: classes/class-s2-admin.php:79
826
- msgid ""
827
- "On this page registered subscribers can be viewed and searched. User "
828
- "accounts can be deleted from here with any posts created by those users "
829
- "being assigned to the currently logged in user. Bulk changes can be applied "
830
- "to all user settings changing their subscription email format and "
831
- "categories."
832
  msgstr ""
833
 
834
  #: classes/class-s2-admin.php:88
@@ -840,312 +826,235 @@ msgid "From this page you can adjust the Settings for Subscribe2."
840
  msgstr ""
841
 
842
  #: classes/class-s2-admin.php:117
843
- msgid ""
844
- "This section allows you to specify settings that apply to the emails "
845
- "generated by the site."
846
  msgstr ""
847
 
848
  #: classes/class-s2-admin.php:118
849
- msgid ""
850
- "Emails can be sent to individual subscribers by setting the number of "
851
- "recipients per email to 1. A setting greater than one will group recipients "
852
- "together and make use of the BCC emails header. A setting of 0 sends a "
853
- "single email with all subscribers in one large BCC group. A setting of 1 "
854
- "looks less like spam email to filters but takes longer to process."
855
  msgstr ""
856
 
857
  #: classes/class-s2-admin.php:119
858
- msgid ""
859
- "This section is also where the sender of the email on this page is chosen. "
860
- "You can choose Post Author or your Blogname but it is recommended to create "
861
- "a user account with an email address that really exists and shares the same "
862
- "domain name as your site (the bit after the @ should be the same as your "
863
- "sites web address) and then use this account."
864
  msgstr ""
865
 
866
  #: classes/class-s2-admin.php:120
867
- msgid ""
868
- "This page also configures the frequency of emails. This can be at the time "
869
- "new posts are made (per post) or periodically with an excerpt of each post "
870
- "made (digest). Additionally the post types (pages, private, password "
871
- "protected) can also be configured here."
872
  msgstr ""
873
 
874
  #: classes/class-s2-admin.php:127
875
- msgid ""
876
- "This section allows you to customise the content of your notification "
877
- "emails."
878
  msgstr ""
879
 
880
  #: classes/class-s2-admin.php:128
881
- msgid ""
882
- "There are special {KEYWORDS} that are used by Subscribe2 to place content "
883
- "into the final email. The template also accepts regular text and HTML as "
884
- "desired in the final emails."
885
  msgstr ""
886
 
887
  #: classes/class-s2-admin.php:129
888
- msgid ""
889
- "The {KEYWORDS} are listed on the right of the templates, note that some are "
890
- "for per post emails only and some are for digest emails only. Make sure the "
891
- "correct keywords are used based upon the Email Settings."
892
  msgstr ""
893
 
894
  #: classes/class-s2-admin.php:130
895
- msgid ""
896
- "The Notification Email template is used for sending notifications of new "
897
- "posts. The Subscribe / Unsubscribe confirmation template is sent when a new "
898
- "subscription or unsubscription request is made. The Reminder template is "
899
- "used to send reminder emails; this is done automatically or can be done "
900
- "manually."
901
  msgstr ""
902
 
903
  #: classes/class-s2-admin.php:137
904
- msgid ""
905
- "This section allows settings that apply to Registered Subscribers to be "
906
- "configured."
907
  msgstr ""
908
 
909
  #: classes/class-s2-admin.php:138
910
- msgid ""
911
- "Categories can be made compulsory so emails are always sent to Public and "
912
- "Registered Subscribers for posts in these categories. They can also be "
913
- "excluded so that emails are not generated for Subscribers. Registered "
914
- "Subscribers can be allowed to bypass category exclusions. Excluded "
915
- "categories take precedence over Compulsory categories."
916
  msgstr ""
917
 
918
  #: classes/class-s2-admin.php:139
919
- msgid ""
920
- "A set of default settings for new users can also be specified using the "
921
- "Auto Subscribe section. Settings specified here will be applied to any "
922
- "newly created user accounts while Subscribe2 is activated."
923
  msgstr ""
924
 
925
  #: classes/class-s2-admin.php:146
926
- msgid ""
927
- "This section allows you to enable several aspect of the plugin such as "
928
- "Widgets and editor buttons."
929
  msgstr ""
930
 
931
  #: classes/class-s2-admin.php:147
932
- msgid ""
933
- "AJAX mode can be enabled that is intended to work with the shortcode link "
934
- "parameter so that a dialog opens in the centre of the browser rather then "
935
- "using the regular form."
936
  msgstr ""
937
 
938
  #: classes/class-s2-admin.php:148
939
- msgid ""
940
- "The email over ride check box can be set to be automatically checked for "
941
- "every new post and page from here to, this may be useful if you will only "
942
- "want to send very occasional notifications for specific posts. You can then "
943
- "uncheck this box just before you publish your content."
944
- msgstr ""
945
-
946
- #: classes/class-s2-admin.php:154
947
- msgid "ReCaptcha"
948
  msgstr ""
949
 
950
  #: classes/class-s2-admin.php:155
951
- msgid "This section holds site and secret keys for using Google ReCaptcha."
952
- msgstr ""
953
-
954
- #: classes/class-s2-admin.php:156
955
- msgid ""
956
- "V2 ReCaptcha takes precedence over Invisible ReCaptcha. To use Invisible "
957
- "ReCaptcha, leave the V2 ReCaptcha key fields empty."
958
- msgstr ""
959
-
960
- #: classes/class-s2-admin.php:157
961
- msgid ""
962
- "Both key files needs populating for V2 ReCaptcha or Invisible ReCaptcha, "
963
- "failure to complete both fields will result in ReCaptcha not working."
964
  msgstr ""
965
 
966
- #: classes/class-s2-admin.php:164
967
- msgid ""
968
- "This section contains a place to bar specified domains from becoming Public "
969
- "Subscribers and links to help and support pages."
970
  msgstr ""
971
 
972
- #: classes/class-s2-admin.php:165
973
- msgid ""
974
- "In the paid Subscribe2 HTML version there is also a place here to enter a "
975
- "license code so that updates can be accessed automatically."
976
  msgstr ""
977
 
978
- #: classes/class-s2-admin.php:177
979
- msgid ""
980
- "From this page you can send emails to the recipients in the group selected "
981
- "in the drop down."
982
  msgstr ""
983
 
984
- #: classes/class-s2-admin.php:178
985
- msgid ""
986
- "<strong>Preview</strong> will send a preview of the email to the currently "
987
- "logged in user. <strong>Send</strong> will send the email to the recipient "
988
- "list."
989
  msgstr ""
990
 
991
- #: classes/class-s2-admin.php:236
992
- msgid ""
993
- "You are about to delete a registered user account, any posts made by this "
994
- "user will be assigned to you. Are you sure?"
995
- msgstr ""
996
-
997
- #: classes/class-s2-admin.php:237
998
- msgid ""
999
- "You are about to delete registered user accounts, any posts made by these "
1000
- "users will be assigned to you. Are you sure?"
1001
- msgstr ""
1002
-
1003
- #: classes/class-s2-admin.php:238
1004
  msgid "You are about to delete a public subscriber. Are you sure?"
1005
  msgstr ""
1006
 
1007
- #: classes/class-s2-admin.php:239
1008
  msgid "You are about to delete public subscribers. Are you sure?"
1009
  msgstr ""
1010
 
1011
- #: classes/class-s2-admin.php:240
1012
- msgid ""
1013
- "You are about to make Bulk Management changes to all Registered Users. Are "
1014
- "you sure?"
1015
  msgstr ""
1016
 
1017
- #: classes/class-s2-admin.php:241
1018
- msgid ""
1019
- "You are about to make Bulk Management changes to the selected Registered "
1020
- "User. Are you sure?"
1021
  msgstr ""
1022
 
1023
- #: classes/class-s2-admin.php:242
1024
- msgid ""
1025
- "You are about to make Bulk Management changes to the selected Registered "
1026
- "Users. Are you sure?"
1027
  msgstr ""
1028
 
1029
- #: classes/class-s2-admin.php:260
1030
- msgid "Donate"
1031
- msgstr ""
1032
-
1033
- #: classes/class-s2-admin.php:370
1034
  msgid "Subscribe2 Notification Override"
1035
  msgstr ""
1036
 
1037
- #: classes/class-s2-admin.php:383 gutenberg/gutenberg-translations.php:29
 
 
1038
  msgid "Subscribe2 Preview"
1039
  msgstr ""
1040
 
1041
- #: classes/class-s2-admin.php:397 gutenberg/gutenberg-translations.php:21
 
 
1042
  msgid "Subscribe2 Resend"
1043
  msgstr ""
1044
 
1045
- #: classes/class-s2-admin.php:417 gutenberg/gutenberg-translations.php:20
 
 
1046
  msgid "Check here to disable sending of an email notification for this post/page"
1047
  msgstr ""
1048
 
1049
- #: classes/class-s2-admin.php:454 gutenberg/gutenberg-translations.php:30
 
 
1050
  msgid "Send preview email of this post to currently logged in user:"
1051
  msgstr ""
1052
 
1053
- #: classes/class-s2-admin.php:455 gutenberg/gutenberg-translations.php:31
 
 
1054
  msgid "Send Preview"
1055
  msgstr ""
1056
 
1057
- #: classes/class-s2-admin.php:479 gutenberg/gutenberg-translations.php:22
 
 
1058
  msgid "Resend the notification email of this post to current subscribers:"
1059
  msgstr ""
1060
 
1061
- #: classes/class-s2-admin.php:480 gutenberg/gutenberg-translations.php:23
 
 
1062
  msgid "Resend Notification"
1063
  msgstr ""
1064
 
1065
- #: classes/class-s2-admin.php:588
 
 
 
 
 
1066
  msgid "Registered User"
1067
  msgstr ""
1068
 
1069
- #: classes/class-s2-admin.php:593
1070
  msgid "Confirmed Public Subscriber"
1071
  msgstr ""
1072
 
1073
- #: classes/class-s2-admin.php:595
1074
  msgid "Unconfirmed Public Subscriber"
1075
  msgstr ""
1076
 
1077
- #: classes/class-s2-admin.php:612 classes/class-s2-forms.php:306
 
1078
  #: classes/class-s2-forms.php:366
1079
  msgid "Select / Unselect All"
1080
  msgstr ""
1081
 
1082
- #: classes/class-s2-admin.php:649
1083
  msgid "All Users and Subscribers"
1084
  msgstr ""
1085
 
1086
- #: classes/class-s2-admin.php:651
1087
  msgid "Confirmed"
1088
  msgstr ""
1089
 
1090
- #: classes/class-s2-admin.php:652
1091
  msgid "Unconfirmed"
1092
  msgstr ""
1093
 
1094
- #: classes/class-s2-admin.php:653
1095
  msgid "All Registered Users"
1096
  msgstr ""
1097
 
1098
- #: classes/class-s2-admin.php:761
1099
  msgid "Post Author"
1100
  msgstr ""
1101
 
1102
- #: classes/class-s2-admin.php:801
1103
- msgid ""
1104
- "The WordPress cron functions may be disabled on this server. Digest "
1105
- "notifications may not work."
1106
  msgstr ""
1107
 
1108
- #: classes/class-s2-admin.php:810
1109
  msgid "For each Post"
1110
  msgstr ""
1111
 
1112
- #: classes/class-s2-admin.php:832
1113
  msgid "Current UTC time is"
1114
  msgstr ""
1115
 
1116
- #: classes/class-s2-admin.php:834
1117
  msgid "Current blog time is"
1118
  msgstr ""
1119
 
1120
- #: classes/class-s2-admin.php:836
1121
  msgid "Next email notification will be sent when your blog time is after"
1122
  msgstr ""
1123
 
1124
- #: classes/class-s2-admin.php:858
1125
  msgid "Attempt to resend the last Digest Notification email"
1126
  msgstr ""
1127
 
1128
- #: classes/class-s2-admin.php:859
1129
  msgid "Resend Digest"
1130
  msgstr ""
1131
 
1132
- #: classes/class-s2-admin.php:876
1133
  msgid "Select a page"
1134
  msgstr ""
1135
 
1136
- #: classes/class-s2-admin.php:1147
1137
  msgid "Email subscription"
1138
  msgstr ""
1139
 
1140
- #: classes/class-s2-admin.php:1149
1141
  msgid "Subscribe / Unsubscribe"
1142
  msgstr ""
1143
 
1144
- #: classes/class-s2-admin.php:1150
1145
  msgid "Receive notifications"
1146
  msgstr ""
1147
 
1148
- #: classes/class-s2-admin.php:1151
1149
  msgid "Check if you want to receive email notification when new posts are published"
1150
  msgstr ""
1151
 
@@ -1157,40 +1066,46 @@ msgstr ""
1157
  msgid "There was an error validating your request. Please try again later."
1158
  msgstr ""
1159
 
1160
- #: classes/class-s2-ajax.php:104 classes/class-s2-ajax.php:134
1161
- #: classes/class-s2-ajax.php:148 classes/class-s2-frontend.php:24
 
 
1162
  msgid "A confirmation message is on its way!"
1163
  msgstr ""
1164
 
1165
- #: classes/class-s2-ajax.php:112 classes/class-s2-frontend.php:30
 
1166
  msgid "Sorry, but that does not look like an email address to me."
1167
  msgstr ""
1168
 
1169
- #: classes/class-s2-ajax.php:114 classes/class-s2-frontend.php:32
1170
- msgid ""
1171
- "Sorry, email addresses at that domain are currently barred due to spam, "
1172
- "please use an alternative email address."
1173
  msgstr ""
1174
 
1175
- #: classes/class-s2-ajax.php:120 classes/class-s2-frontend.php:188
 
1176
  msgid "Slow down, you move too fast."
1177
  msgstr ""
1178
 
1179
- #: classes/class-s2-ajax.php:126
1180
  #. Translators: Link to login page
 
1181
  msgid "To manage your subscription options please <a href=\"%1$s\">login.</a>"
1182
  msgstr ""
1183
 
1184
- #: classes/class-s2-ajax.php:136 classes/class-s2-ajax.php:150
 
1185
  #: classes/class-s2-frontend.php:34
1186
  msgid "Sorry, there seems to be an error on the server. Please try again later."
1187
  msgstr ""
1188
 
1189
- #: classes/class-s2-ajax.php:140 classes/class-s2-frontend.php:26
 
1190
  msgid "That email address is already subscribed."
1191
  msgstr ""
1192
 
1193
- #: classes/class-s2-ajax.php:144 classes/class-s2-frontend.php:28
 
1194
  msgid "That email address is not subscribed."
1195
  msgstr ""
1196
 
@@ -1215,9 +1130,7 @@ msgid "Check here to Subscribe to email notifications for new posts"
1215
  msgstr ""
1216
 
1217
  #: classes/class-s2-core.php:1257
1218
- msgid ""
1219
- "By registering with this blog you are also agreeing to receive email "
1220
- "notifications for new posts but you can unsubscribe at anytime"
1221
  msgstr ""
1222
 
1223
  #: classes/class-s2-core.php:1285
@@ -1228,7 +1141,8 @@ msgstr ""
1228
  msgid "Weekly"
1229
  msgstr ""
1230
 
1231
- #: classes/class-s2-core.php:1622 classes/class-s2-core.php:1623
 
1232
  msgid "Author"
1233
  msgstr ""
1234
 
@@ -1236,11 +1150,13 @@ msgstr ""
1236
  msgid "Posted on"
1237
  msgstr ""
1238
 
1239
- #: classes/class-s2-core.php:1656 classes/class-s2-core.php:1657
 
1240
  msgid "Posted in"
1241
  msgstr ""
1242
 
1243
- #: classes/class-s2-core.php:1670 classes/class-s2-core.php:1671
 
1244
  msgid "Tagged as"
1245
  msgstr ""
1246
 
@@ -1368,11 +1284,14 @@ msgstr ""
1368
  msgid "Disable Anti-spam measures"
1369
  msgstr ""
1370
 
1371
- #: classes/class-s2-form-widget.php:182 gutenberg/gutenberg-translations.php:17
 
 
1372
  msgid "Disable wrapping of form buttons"
1373
  msgstr ""
1374
 
1375
- #: classes/class-s2-forms.php:17 classes/class-s2-forms.php:21
 
1376
  msgid "Permission error! Your request cannot be completed."
1377
  msgstr ""
1378
 
@@ -1424,11 +1343,13 @@ msgstr ""
1424
  msgid "Subscribed Blogs"
1425
  msgstr ""
1426
 
1427
- #: classes/class-s2-forms.php:168 classes/class-s2-forms.php:189
 
1428
  msgid "Viewing Settings Now"
1429
  msgstr ""
1430
 
1431
- #: classes/class-s2-forms.php:172 classes/class-s2-forms.php:193
 
1432
  msgid "View Settings"
1433
  msgstr ""
1434
 
@@ -1440,23 +1361,19 @@ msgstr ""
1440
  msgid "Subscription preferences updated."
1441
  msgstr ""
1442
 
1443
- #: classes/class-s2-frontend.php:8
1444
  #. Translators: Link to login page
 
1445
  msgid "To manage your subscription options please <a href=\"%1$s\">login</a>."
1446
  msgstr ""
1447
 
1448
- #: classes/class-s2-frontend.php:12
1449
  #. Translators: Link to Profile page
1450
- msgid ""
1451
- "You may manage your subscription options from your <a "
1452
- "href=\"%1$s\">profile</a>."
1453
  msgstr ""
1454
 
1455
- #: classes/class-s2-frontend.php:20
1456
  #. Translators: Link to Profile page
1457
- msgid ""
1458
- "<a href=\"%1$s\">Subscribe</a> to email notifications when this blog posts "
1459
- "new content."
1460
  msgstr ""
1461
 
1462
  #: classes/class-s2-frontend.php:37
@@ -1483,7 +1400,8 @@ msgstr ""
1483
  msgid "Enter email address..."
1484
  msgstr ""
1485
 
1486
- #: classes/class-s2-frontend.php:155 classes/class-s2-frontend.php:157
 
1487
  msgid "Your email:"
1488
  msgstr ""
1489
 
@@ -1515,77 +1433,56 @@ msgstr ""
1515
  msgid "[Un]Subscribe to Posts"
1516
  msgstr ""
1517
 
1518
- #: classes/class-s2-list-table-legacy.php:131
 
 
 
 
 
 
 
 
 
1519
  #: classes/class-s2-list-table.php:112
1520
  msgid "Select All"
1521
  msgstr ""
1522
 
1523
- #: classes/class-s2-list-table-legacy.php:183
1524
- #: classes/class-s2-list-table-legacy.php:188
1525
- #: classes/class-s2-list-table.php:167 classes/class-s2-list-table.php:172
1526
  msgid "Delete"
1527
  msgstr ""
1528
 
1529
- #: classes/class-s2-list-table-legacy.php:189
1530
  #: classes/class-s2-list-table.php:173
1531
  msgid "Toggle"
1532
  msgstr ""
1533
 
1534
- #: classes/class-s2-list-table-legacy.php:198
1535
  #: classes/class-s2-list-table.php:182
1536
  msgid "No users were selected."
1537
  msgstr ""
1538
 
1539
- #: classes/class-s2-list-table-legacy.php:211
1540
  #: classes/class-s2-list-table.php:195
1541
  msgid "Address(es) deleted!"
1542
  msgstr ""
1543
 
1544
- #: classes/class-s2-list-table-legacy.php:215
1545
  #: classes/class-s2-list-table.php:199
1546
  msgid "Delete failed! You cannot delete some or all of these users."
1547
  msgstr ""
1548
 
1549
- #: classes/class-s2-list-table-legacy.php:218
1550
  #: classes/class-s2-list-table.php:202
1551
- msgid ""
1552
- "Registered user(s) deleted! Any posts made by these users were assigned to "
1553
- "you."
1554
  msgstr ""
1555
 
1556
- #: classes/class-s2-list-table-legacy.php:242
1557
  #: classes/class-s2-list-table.php:226
1558
  msgid "Status changed!"
1559
  msgstr ""
1560
 
1561
- #: classes/class-s2-list-table-legacy.php:259
1562
- #: classes/class-s2-list-table.php:247
1563
  #. Translators: Pagination
 
1564
  msgid "%s item"
1565
  msgid_plural "%s items"
1566
  msgstr[0] ""
1567
  msgstr[1] ""
1568
 
1569
- #: classes/class-s2-list-table-legacy.php:307
1570
- msgid "Go to the first page"
1571
- msgstr ""
1572
-
1573
- #: classes/class-s2-list-table-legacy.php:315
1574
- msgid "Go to the previous page"
1575
- msgstr ""
1576
-
1577
- #: classes/class-s2-list-table-legacy.php:325
1578
- msgid "Current page"
1579
- msgstr ""
1580
-
1581
- #: classes/class-s2-list-table-legacy.php:338
1582
- msgid "Go to the next page"
1583
- msgstr ""
1584
-
1585
- #: classes/class-s2-list-table-legacy.php:346
1586
- msgid "Go to the last page"
1587
- msgstr ""
1588
-
1589
  #: classes/class-s2-list-table.php:308
1590
  msgid "First page"
1591
  msgstr ""
@@ -1594,10 +1491,17 @@ msgstr ""
1594
  msgid "Previous page"
1595
  msgstr ""
1596
 
1597
- #: classes/class-s2-list-table.php:326 classes/class-s2-list-table.php:330
 
1598
  msgid "Current Page"
1599
  msgstr ""
1600
 
 
 
 
 
 
 
1601
  #: classes/class-s2-list-table.php:346
1602
  msgid "Next page"
1603
  msgstr ""
@@ -1607,75 +1511,94 @@ msgid "Last page"
1607
  msgstr ""
1608
 
1609
  #: gutenberg/gutenberg-translations.php:5
 
1610
  msgid "Subscribe2 HTML"
1611
  msgstr ""
1612
 
1613
  #: gutenberg/gutenberg-translations.php:6
 
1614
  msgid "email"
1615
  msgstr ""
1616
 
1617
  #: gutenberg/gutenberg-translations.php:7
 
1618
  msgid "notification"
1619
  msgstr ""
1620
 
1621
  #: gutenberg/gutenberg-translations.php:8
 
1622
  msgid "Subscribe2 Shortcode Parameters"
1623
  msgstr ""
1624
 
1625
  #: gutenberg/gutenberg-translations.php:9
 
1626
  msgid "Button Display Options"
1627
  msgstr ""
1628
 
1629
  #: gutenberg/gutenberg-translations.php:10
 
1630
  msgid "Show Both Buttons"
1631
  msgstr ""
1632
 
1633
  #: gutenberg/gutenberg-translations.php:11
 
1634
  msgid "Hide Subscribe Button"
1635
  msgstr ""
1636
 
1637
  #: gutenberg/gutenberg-translations.php:12
 
1638
  msgid "Hide Unsubscribe Button"
1639
  msgstr ""
1640
 
1641
  #: gutenberg/gutenberg-translations.php:13
 
1642
  msgid "Page ID"
1643
  msgstr ""
1644
 
1645
  #: gutenberg/gutenberg-translations.php:14
 
1646
  msgid "Disable Javascript"
1647
  msgstr ""
1648
 
1649
  #: gutenberg/gutenberg-translations.php:15
 
1650
  msgid "Disable Simple Anti-Spam Measures"
1651
  msgstr ""
1652
 
1653
  #: gutenberg/gutenberg-translations.php:16
 
1654
  msgid "Textbox size"
1655
  msgstr ""
1656
 
1657
  #: gutenberg/gutenberg-translations.php:18
 
1658
  msgid "Link Text"
1659
  msgstr ""
1660
 
1661
  #: gutenberg/gutenberg-translations.php:19
 
1662
  msgid "Subscribe2 HTML Shortcode"
1663
  msgstr ""
1664
 
1665
  #: gutenberg/gutenberg-translations.php:24
 
1666
  msgid "Attempt made to send email preview"
1667
  msgstr ""
1668
 
1669
  #: gutenberg/gutenberg-translations.php:25
 
1670
  msgid "Attempt made to resend email notification"
1671
  msgstr ""
1672
 
1673
  #: gutenberg/gutenberg-translations.php:26
1674
  #: gutenberg/gutenberg-translations.php:27
 
 
1675
  msgid "Subscribe2 Sidebar"
1676
  msgstr ""
1677
 
1678
  #: gutenberg/gutenberg-translations.php:28
 
1679
  msgid "Subscribe2 Override"
1680
  msgstr ""
1681
 
@@ -1688,8 +1611,7 @@ msgid ""
1688
  "You may view the latest post at\n"
1689
  "{PERMALINK}\n"
1690
  "\n"
1691
- "You received this e-mail because you asked to be notified when new updates "
1692
- "are posted.\n"
1693
  "Best regards,\n"
1694
  "{MYNAME}\n"
1695
  "{EMAIL}"
@@ -1697,8 +1619,7 @@ msgstr ""
1697
 
1698
  #: include/options.php:148
1699
  msgid ""
1700
- "{BLOGNAME} has received a request to {ACTION} for this email address. To "
1701
- "complete your request please click on the link below:\n"
1702
  "\n"
1703
  "{LINK}\n"
1704
  "\n"
@@ -1714,15 +1635,13 @@ msgstr ""
1714
 
1715
  #: include/options.php:156
1716
  msgid ""
1717
- "This email address was subscribed for notifications at {BLOGNAME} "
1718
- "({BLOGLINK}) but the subscription remains incomplete.\n"
1719
  "\n"
1720
  "If you wish to complete your subscription please click on the link below:\n"
1721
  "\n"
1722
  "{LINK}\n"
1723
  "\n"
1724
- "If you do not wish to complete your subscription please ignore this email "
1725
- "and your address will be removed from our database.\n"
1726
  "\n"
1727
  "Regards,\n"
1728
  "{MYNAME}"
@@ -1736,47 +1655,11 @@ msgstr ""
1736
  msgid "I'm just a plugin, please don't call me directly"
1737
  msgstr ""
1738
 
 
1739
  #: subscribe2.php:39
1740
- #. Translators: Subscribe2 needs WordPress 3.3 or above, exit if not on a
1741
- #. compatible version
1742
- msgid ""
1743
- "This version of Subscribe2 requires WordPress 3.3 or greater. Please update "
1744
- "%1$s or use an older version of %2$s."
1745
  msgstr ""
1746
 
1747
  #: subscribe2.php:51
1748
- msgid ""
1749
- "Subscribe2 HTML cannot be activated as a network plugin. Please activate it "
1750
- "on a site level"
1751
- msgstr ""
1752
-
1753
- #. Author URI of the plugin/theme
1754
- msgid "https://subscribe2.wordpress.com/"
1755
- msgstr ""
1756
-
1757
- #. Description of the plugin/theme
1758
- msgid "Notifies an email list when new entries are posted."
1759
  msgstr ""
1760
-
1761
- #: classes/class-s2-admin.php:567
1762
- msgctxt "Comma Separated Column Header names for CSV Export"
1763
- msgid "User Email,User Type,User Name,Confirm Date,IP"
1764
- msgstr ""
1765
-
1766
- #: classes/class-s2-list-table-legacy.php:75
1767
- #: classes/class-s2-list-table-legacy.php:80 classes/class-s2-list-table.php:68
1768
- msgctxt "column name"
1769
- msgid "Email"
1770
- msgstr ""
1771
-
1772
- #: classes/class-s2-list-table-legacy.php:81 classes/class-s2-list-table.php:69
1773
- msgctxt "column name"
1774
- msgid "Date"
1775
- msgstr ""
1776
-
1777
- #: classes/class-s2-list-table-legacy.php:333
1778
- #: classes/class-s2-list-table.php:338
1779
- #. Translators: Pagination
1780
- msgctxt "paging"
1781
- msgid "%1$s of %2$s"
1782
- msgstr ""
1
+ # Copyright (C) 2020 weMail
2
+ # This file is distributed under the same license as the Subscribe2 plugin.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: Subscribe2 10.33\n"
6
  "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/subscribe2\n"
 
 
 
 
 
7
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
8
  "Language-Team: LANGUAGE <LL@li.org>\n"
9
+ "MIME-Version: 1.0\n"
10
+ "Content-Type: text/plain; charset=UTF-8\n"
11
+ "Content-Transfer-Encoding: 8bit\n"
12
+ "POT-Creation-Date: 2020-06-04T07:08:04+00:00\n"
13
+ "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
14
+ "X-Generator: WP-CLI 2.4.0\n"
15
+ "X-Domain: subscribe2\n"
16
+
17
+ #. Plugin Name of the plugin
18
+ #: classes/class-s2-admin.php:8
19
+ #: classes/class-s2-form-widget.php:24
20
+ msgid "Subscribe2"
21
+ msgstr ""
22
+
23
+ #. Plugin URI of the plugin
24
+ #. Author URI of the plugin
25
+ msgid "https://getwemail.io"
26
+ msgstr ""
27
+
28
+ #. Description of the plugin
29
+ msgid "Notifies an email list when new entries are posted."
30
+ msgstr ""
31
+
32
+ #. Author of the plugin
33
+ msgid "weMail"
34
+ msgstr ""
35
+
36
+ #: admin/send-email.php:11
37
+ #: admin/settings.php:11
38
+ #: admin/subscribers.php:27
39
  #: admin/your-subscriptions.php:13
40
  msgid "Security error! Your request cannot be completed."
41
  msgstr ""
101
  msgstr ""
102
 
103
  #: admin/settings.php:37
104
+ msgid "The Digest Notification email contained no post information. No email was sent"
 
 
105
  msgstr ""
106
 
107
  #: admin/settings.php:120
121
  msgstr ""
122
 
123
  #: admin/settings.php:152
124
+ msgid "Your chosen email type (per-post or digest) does not support the following keywords:"
 
 
125
  msgstr ""
126
 
 
127
  #. Translators: Warning message
128
+ #: admin/settings.php:166
129
+ msgid "You appear to be sending notifications from %1$s, which has a different domain name than your blog server %2$s. This may result in failed emails."
 
130
  msgstr ""
131
 
132
+ #: admin/settings.php:174
133
+ #: classes/class-s2-admin.php:22
134
+ #: classes/class-s2-admin.php:249
135
  msgid "Settings"
136
  msgstr ""
137
 
138
+ #: admin/settings.php:176
139
+ #: classes/class-s2-admin.php:116
140
  msgid "Email Settings"
141
  msgstr ""
142
 
143
+ #: admin/settings.php:177
144
+ #: classes/class-s2-admin.php:126
145
  msgid "Templates"
146
  msgstr ""
147
 
148
+ #: admin/settings.php:178
149
+ #: classes/class-s2-admin.php:136
150
  msgid "Registered Users"
151
  msgstr ""
152
 
153
+ #: admin/settings.php:179
154
+ #: classes/class-s2-admin.php:145
155
  msgid "Appearance"
156
  msgstr ""
157
 
158
+ #: admin/settings.php:180
159
+ #: classes/class-s2-admin.php:154
160
  msgid "Miscellaneous"
161
  msgstr ""
162
 
163
+ #: admin/settings.php:203
164
+ #: classes/class-s2-admin.php:825
165
+ #: classes/class-s2-list-table.php:36
166
  msgid "Edit"
167
  msgstr ""
168
 
169
+ #: admin/settings.php:206
170
+ #: classes/class-s2-admin.php:839
171
  msgid "Update"
172
  msgstr ""
173
 
174
+ #: admin/settings.php:207
175
+ #: classes/class-s2-admin.php:840
176
  msgid "Revert"
177
  msgstr ""
178
 
200
  msgid "Include theme CSS stylesheet in HTML notifications"
201
  msgstr ""
202
 
203
+ #: admin/settings.php:221
204
+ #: admin/settings.php:227
205
+ #: admin/settings.php:241
206
+ #: admin/settings.php:246
207
+ #: admin/settings.php:252
208
+ #: admin/settings.php:390
209
+ #: admin/settings.php:396
210
+ #: admin/settings.php:411
211
+ #: admin/settings.php:419
212
+ #: admin/settings.php:435
213
+ #: admin/settings.php:442
214
+ #: admin/subscribers.php:323
215
+ #: classes/class-s2-forms.php:59
216
+ #: classes/class-s2-forms.php:100
217
  msgid "Yes"
218
  msgstr ""
219
 
220
+ #: admin/settings.php:223
221
+ #: admin/settings.php:229
222
+ #: admin/settings.php:243
223
+ #: admin/settings.php:248
224
+ #: admin/settings.php:254
225
+ #: admin/settings.php:387
226
+ #: admin/settings.php:392
227
+ #: admin/settings.php:398
228
+ #: admin/settings.php:413
229
+ #: admin/settings.php:421
230
+ #: admin/settings.php:431
231
+ #: admin/settings.php:437
232
+ #: admin/settings.php:444
233
+ #: admin/subscribers.php:325
234
+ #: classes/class-s2-forms.php:61
235
+ #: classes/class-s2-forms.php:104
236
  msgid "No"
237
  msgstr ""
238
 
240
  msgid "Send Emails for Pages"
241
  msgstr ""
242
 
243
+ #: admin/settings.php:234
244
+ msgid "Subscribe2 will send email notifications for the following custom post types"
245
+ msgstr ""
246
+
247
+ #: admin/settings.php:239
248
  msgid "Send Emails for Password Protected Posts"
249
  msgstr ""
250
 
251
+ #: admin/settings.php:244
252
  msgid "Send Emails for Private Posts"
253
  msgstr ""
254
 
255
+ #: admin/settings.php:250
256
  msgid "Include Sticky Posts at the top of all Digest Notifications"
257
  msgstr ""
258
 
259
+ #: admin/settings.php:256
260
  msgid "Send Email From"
261
  msgstr ""
262
 
263
+ #: admin/settings.php:261
264
  msgid "Send Emails"
265
  msgstr ""
266
 
267
+ #: admin/settings.php:265
268
  msgid "For digest notifications, date order for posts is"
269
  msgstr ""
270
 
271
+ #: admin/settings.php:267
272
  msgid "Descending"
273
  msgstr ""
274
 
275
+ #: admin/settings.php:269
276
  msgid "Ascending"
277
  msgstr ""
278
 
279
+ #: admin/settings.php:271
280
  msgid "Add Tracking Parameters to the Permalink"
281
  msgstr ""
282
 
283
+ #: admin/settings.php:273
284
+ msgid "eg. utm_source=subscribe2&amp;utm_medium=email&amp;utm_campaign=postnotify&amp;utm_id={ID}&amp;utm_title={TITLE}"
 
 
 
285
  msgstr ""
286
 
287
+ #: admin/settings.php:284
288
  msgid "Notification email (must not be empty)"
289
  msgstr ""
290
 
291
+ #: admin/settings.php:285
292
+ #: admin/settings.php:324
293
+ #: admin/settings.php:329
294
  msgid "Subject Line"
295
  msgstr ""
296
 
297
+ #: admin/settings.php:290
298
  msgid "Send Email Preview"
299
  msgstr ""
300
 
301
+ #: admin/settings.php:291
302
  msgid "Message substitutions"
303
  msgstr ""
304
 
305
+ #: admin/settings.php:293
306
  msgid "IF THE FOLLOWING KEYWORDS ARE ALSO IN YOUR POST THEY WILL BE SUBSTITUTED"
307
  msgstr ""
308
 
309
+ #: admin/settings.php:296
310
  msgid "the post's title<br>(<i>for per-post emails only</i>)"
311
  msgstr ""
312
 
313
+ #: admin/settings.php:297
314
  msgid "the post's unformatted title <br>(<i>for per-post emails only</i>)"
315
  msgstr ""
316
 
317
+ #: admin/settings.php:298
318
+ msgid "the excerpt or the entire post<br>(<i>based on the subscriber's preferences</i>)"
 
 
319
  msgstr ""
320
 
321
+ #: admin/settings.php:299
322
+ msgid "the excerpt of the post and the time it was posted<br>(<i>for digest emails only</i>)"
 
 
323
  msgstr ""
324
 
325
+ #: admin/settings.php:300
326
  msgid "a list of post titles<br>(<i>for digest emails only</i>)"
327
  msgstr ""
328
 
329
+ #: admin/settings.php:301
330
+ msgid "a list of post titles followed by links to the articles<br>(<i>for digest emails only</i>)"
 
 
331
  msgstr ""
332
 
333
+ #: admin/settings.php:302
334
+ msgid "a reference style list of links at the end of the email with corresponding numbers in the content<br>(<i>for the full content plain text per-post email only</i>)"
 
 
 
335
  msgstr ""
336
 
337
+ #: admin/settings.php:303
338
  msgid "the post's permalink<br>(<i>for per-post emails only</i>)"
339
  msgstr ""
340
 
341
+ #: admin/settings.php:304
342
  msgid "the post's permalink after conversion by TinyURL"
343
  msgstr ""
344
 
345
+ #: admin/settings.php:305
346
  msgid "the post's unformatted permalink<br>(<i>for per-post emails only</i>)"
347
  msgstr ""
348
 
349
+ #: admin/settings.php:306
350
  msgid "the date the post was made<br>(<i>for per-post emails only</i>)"
351
  msgstr ""
352
 
353
+ #: admin/settings.php:307
354
  msgid "the time the post was made<br>(<i>for per-post emails only</i>)"
355
  msgstr ""
356
 
357
+ #: admin/settings.php:308
358
  msgid "the admin or post author's name"
359
  msgstr ""
360
 
361
+ #: admin/settings.php:309
362
  msgid "the admin or post author's email"
363
  msgstr ""
364
 
365
+ #: admin/settings.php:310
366
  msgid "the post author's name"
367
  msgstr ""
368
 
369
+ #: admin/settings.php:311
370
+ msgid "the generated link to confirm a request<br>(<i>only used in the confirmation email template</i>)"
 
 
371
  msgstr ""
372
 
373
+ #: admin/settings.php:313
374
+ msgid "a generated unsubscribe link<br>(<i>only used in the email notification template</i>)"
 
 
375
  msgstr ""
376
 
377
+ #: admin/settings.php:315
378
+ msgid "Action performed by LINK in confirmation email<br>(<i>only used in the confirmation email template</i>)"
 
 
379
  msgstr ""
380
 
381
+ #: admin/settings.php:316
382
  msgid "the post's assigned categories"
383
  msgstr ""
384
 
385
+ #: admin/settings.php:317
386
  msgid "the post's assigned Tags"
387
  msgstr ""
388
 
389
+ #: admin/settings.php:318
390
+ msgid "the number of posts included in the digest email<br>(<i>for digest emails only</i>)"
 
 
391
  msgstr ""
392
 
393
+ #: admin/settings.php:320
394
  msgid "the post's featured image"
395
  msgstr ""
396
 
397
+ #: admin/settings.php:323
398
  msgid "Subscribe / Unsubscribe confirmation email"
399
  msgstr ""
400
 
401
+ #: admin/settings.php:328
402
  msgid "Reminder email to Unconfirmed Subscribers"
403
  msgstr ""
404
 
405
+ #: admin/settings.php:344
406
  msgid "Compulsory Categories"
407
  msgstr ""
408
 
409
+ #: admin/settings.php:346
410
  msgid "Compulsory categories will be checked by default for Registered Subscribers"
411
  msgstr ""
412
 
413
+ #: admin/settings.php:353
414
  msgid "Excluded Categories"
415
  msgstr ""
416
 
417
+ #: admin/settings.php:355
418
+ msgid "Posts assigned to any Excluded Category do not generate notifications and are not included in digest notifications"
 
 
419
  msgstr ""
420
 
421
+ #: admin/settings.php:359
422
  msgid "Allow registered users to subscribe to excluded categories?"
423
  msgstr ""
424
 
425
+ #: admin/settings.php:367
426
  msgid "Excluded Formats"
427
  msgstr ""
428
 
429
+ #: admin/settings.php:369
430
+ msgid "Posts assigned to any Excluded Format do not generate notifications and are not included in digest notifications"
 
 
431
  msgstr ""
432
 
433
+ #: admin/settings.php:377
434
  msgid "Auto-Subscribe"
435
  msgstr ""
436
 
437
+ #: admin/settings.php:379
438
  msgid "Subscribe new users registering with your blog"
439
  msgstr ""
440
 
441
+ #: admin/settings.php:382
442
  msgid "Automatically"
443
  msgstr ""
444
 
445
+ #: admin/settings.php:385
446
  msgid "Display option on Registration Form"
447
  msgstr ""
448
 
449
+ #: admin/settings.php:388
450
  msgid "Auto-subscribe includes any excluded categories"
451
  msgstr ""
452
 
453
+ #: admin/settings.php:394
454
  msgid "Registration Form option is checked by default"
455
  msgstr ""
456
 
457
+ #: admin/settings.php:400
458
  msgid "Auto-subscribe users to receive email as"
459
  msgstr ""
460
 
461
+ #: admin/settings.php:402
462
+ #: admin/subscribers.php:309
463
  #: classes/class-s2-forms.php:48
464
  msgid "HTML - Full"
465
  msgstr ""
466
 
467
+ #: admin/settings.php:404
468
+ #: admin/subscribers.php:310
469
  #: classes/class-s2-forms.php:50
470
  msgid "HTML - Excerpt"
471
  msgstr ""
472
 
473
+ #: admin/settings.php:406
474
+ #: admin/subscribers.php:311
475
  #: classes/class-s2-forms.php:52
476
  msgid "Plain Text - Full"
477
  msgstr ""
478
 
479
+ #: admin/settings.php:408
480
+ #: admin/subscribers.php:312
481
  #: classes/class-s2-forms.php:54
482
  msgid "Plain Text - Excerpt"
483
  msgstr ""
484
 
485
+ #: admin/settings.php:409
486
  msgid "Registered Users have the option to auto-subscribe to new categories"
487
  msgstr ""
488
 
489
+ #: admin/settings.php:415
490
  msgid "New categories are immediately excluded"
491
  msgstr ""
492
 
493
+ #: admin/settings.php:417
494
+ msgid "Option for Registered Users to auto-subscribe to new categories is checked by default"
 
 
495
  msgstr ""
496
 
497
+ #: admin/settings.php:425
498
  msgid "Display checkbox to allow subscriptions from the comment form"
499
  msgstr ""
500
 
501
+ #: admin/settings.php:427
502
  msgid "Before the Comment Submit button"
503
  msgstr ""
504
 
505
+ #: admin/settings.php:429
506
  msgid "After the Comment Submit button"
507
  msgstr ""
508
 
509
+ #: admin/settings.php:433
510
  msgid "Comment form checkbox is checked by default"
511
  msgstr ""
512
 
513
+ #: admin/settings.php:440
514
  msgid "Show one-click subscription on profile page"
515
  msgstr ""
516
 
517
+ #: admin/settings.php:455
518
  msgid "Set default Subscribe2 page as"
519
  msgstr ""
520
 
521
+ #: admin/settings.php:460
522
  msgid "Show a link to your subscription page in \"meta\"?"
523
  msgstr ""
524
 
525
+ #: admin/settings.php:464
526
  msgid "Show the Subscribe2 button on the Write toolbar?"
527
  msgstr ""
528
 
529
+ #: admin/settings.php:468
530
  msgid "Enable popup style subscription form?"
531
  msgstr ""
532
 
533
+ #: admin/settings.php:472
534
  msgid "Enable Subscribe2 Widget?"
535
  msgstr ""
536
 
537
+ #: admin/settings.php:476
538
  msgid "Enable Subscribe2 Counter Widget?"
539
  msgstr ""
540
 
541
+ #: admin/settings.php:480
542
  msgid "Disable email notifications is checked by default on authoring pages?"
543
  msgstr ""
544
 
545
+ #: admin/settings.php:484
546
+ msgid "Use javascript to update IP address in Subscribe2 HTML form data? (useful if caching is enabled)"
 
 
547
  msgstr ""
548
 
549
+ #: admin/settings.php:492
550
  msgid "Barred Domains"
551
  msgstr ""
552
 
553
+ #: admin/settings.php:494
554
+ msgid "Enter domains to bar for public subscriptions, wildcards (*) and exceptions (!) are allowed"
 
 
555
  msgstr ""
556
 
557
+ #: admin/settings.php:495
558
+ msgid "Use a new line for each entry and omit the \"@\" symbol, for example !email.com, hotmail.com, yahoo.*"
 
 
559
  msgstr ""
560
 
561
+ #: admin/settings.php:498
562
  msgid "Links"
563
  msgstr ""
564
 
565
+ #: admin/settings.php:499
566
  msgid "Plugin Site"
567
  msgstr ""
568
 
569
+ #: admin/settings.php:500
570
  msgid "Plugin Forum"
571
  msgstr ""
572
 
573
+ #: admin/settings.php:501
574
  msgid "Plugin Blog"
575
  msgstr ""
576
 
577
+ #: admin/settings.php:507
 
 
 
 
578
  msgid "Submit"
579
  msgstr ""
580
 
581
+ #: admin/settings.php:511
582
  msgid "Reset to Default Settings"
583
  msgstr ""
584
 
585
+ #: admin/settings.php:512
586
+ msgid "Use this to reset all options to their defaults. This <strong><em>will not</em></strong> modify your list of subscribers."
 
 
587
  msgstr ""
588
 
589
+ #: admin/settings.php:514
590
  msgid "RESET"
591
  msgstr ""
592
 
593
+ #: admin/subscribers.php:52
594
  msgid "Address(es) subscribed!"
595
  msgstr ""
596
 
597
+ #: admin/subscribers.php:59
598
  msgid "Address(es) unsubscribed!"
599
  msgstr ""
600
 
601
+ #: admin/subscribers.php:64
602
+ msgid "Some emails were not processed, the following are already Registered Subscribers"
 
 
603
  msgstr ""
604
 
605
+ #: admin/subscribers.php:67
606
  msgid "Some emails were not processed, the following are already Public Subscribers"
607
  msgstr ""
608
 
609
+ #: admin/subscribers.php:70
610
  msgid "Some emails were not processed, the following were not in the database"
611
  msgstr ""
612
 
613
+ #: admin/subscribers.php:73
614
  msgid "Some emails were not processed, the following were invalid email addresses"
615
  msgstr ""
616
 
617
+ #: admin/subscribers.php:81
618
  msgid "Reminder Email(s) Sent!"
619
  msgstr ""
620
 
621
+ #: admin/subscribers.php:88
622
  msgid "Registered Users Subscribed!"
623
  msgstr ""
624
 
625
+ #: admin/subscribers.php:95
626
  msgid "Registered Users Unsubscribed!"
627
  msgstr ""
628
 
629
+ #: admin/subscribers.php:102
630
  msgid "Format updated for Selected Registered Users!"
631
  msgstr ""
632
 
633
+ #: admin/subscribers.php:109
634
  msgid "Digest Subscription updated for Selected Registered Users!"
635
  msgstr ""
636
 
637
+ #: admin/subscribers.php:194
638
+ #: classes/class-s2-admin.php:15
639
  msgid "Subscribers"
640
  msgstr ""
641
 
642
+ #: admin/subscribers.php:196
643
+ #: classes/class-s2-admin.php:69
644
+ #: classes/class-s2-admin.php:634
645
  msgid "Public Subscribers"
646
  msgstr ""
647
 
648
+ #: admin/subscribers.php:197
649
+ #: classes/class-s2-admin.php:76
650
+ #: classes/class-s2-admin.php:638
651
  msgid "Registered Subscribers"
652
  msgstr ""
653
 
654
+ #: admin/subscribers.php:212
655
+ #: admin/subscribers.php:235
656
  msgid "Add/Remove Subscribers"
657
  msgstr ""
658
 
659
+ #: admin/subscribers.php:213
660
  msgid "Enter addresses, one per line or comma-separated"
661
  msgstr ""
662
 
663
+ #: admin/subscribers.php:216
664
+ #: admin/subscribers.php:300
665
+ #: classes/class-s2-forms.php:195
666
+ #: classes/class-s2-frontend.php:84
667
  msgid "Subscribe"
668
  msgstr ""
669
 
670
+ #: admin/subscribers.php:217
671
+ #: admin/subscribers.php:301
672
+ #: classes/class-s2-forms.php:174
673
+ #: classes/class-s2-frontend.php:83
674
  msgid "Unsubscribe"
675
  msgstr ""
676
 
677
+ #: admin/subscribers.php:222
678
+ #: admin/subscribers.php:242
679
  msgid "Current Subscribers"
680
  msgstr ""
681
 
682
+ #: admin/subscribers.php:236
683
  msgid "Add Registered User"
684
  msgstr ""
685
 
686
+ #: admin/subscribers.php:251
687
  msgid "Filter"
688
  msgstr ""
689
 
690
+ #: admin/subscribers.php:255
691
  msgid "Send Reminder Email"
692
  msgstr ""
693
 
694
+ #: admin/subscribers.php:269
695
  msgid "Save Emails to CSV File"
696
  msgstr ""
697
 
698
+ #: admin/subscribers.php:276
699
  msgid "Search"
700
  msgstr ""
701
 
702
+ #: admin/subscribers.php:283
703
  msgid "Bulk Management"
704
  msgstr ""
705
 
706
+ #: admin/subscribers.php:297
707
+ #: admin/subscribers.php:319
708
+ msgid "Preferences for Registered Users selected above can be changed using this section."
 
709
  msgstr ""
710
 
711
+ #: admin/subscribers.php:298
712
  msgid "Consider User Privacy as changes cannot be undone"
713
  msgstr ""
714
 
715
+ #: admin/subscribers.php:299
716
  msgid "Action to perform"
717
  msgstr ""
718
 
719
+ #: admin/subscribers.php:307
720
  msgid "Bulk Update Categories"
721
  msgstr ""
722
 
723
+ #: admin/subscribers.php:308
724
  msgid "Send email as"
725
  msgstr ""
726
 
727
+ #: admin/subscribers.php:313
728
  msgid "Bulk Update Format"
729
  msgstr ""
730
 
731
+ #: admin/subscribers.php:320
732
  msgid "Consider User Privacy as changes cannot be undone."
733
  msgstr ""
734
 
735
+ #: admin/subscribers.php:321
736
  msgid "Subscribe Selected Users to receive a periodic digest notification"
737
  msgstr ""
738
 
739
+ #: admin/subscribers.php:326
740
  msgid "Bulk Update Digest Subscription"
741
  msgstr ""
742
 
752
  msgid "Update Preferences"
753
  msgstr ""
754
 
 
755
  #. Translators: Mail Optin admin notice
756
+ #: classes/class-mo-admin-notice.php:61
757
+ msgid "Free email newsletter plugin that will %1$sincrease your email list subscribers%2$s and keep them engaged with %1$sautomated and schedule newsletters%2$s."
 
 
758
  msgstr ""
759
 
760
+ #: classes/class-mo-admin-notice.php:72
761
+ msgid "Install weMail Now for Free!"
762
  msgstr ""
763
 
764
+ #: classes/class-mo-admin-notice.php:77
765
+ msgid "Activate weMail Now!"
766
  msgstr ""
767
 
768
+ #: classes/class-mo-admin-notice.php:86
769
  msgid "Dismiss this notice"
770
  msgstr ""
771
 
 
 
 
 
772
  #: classes/class-s2-admin.php:10
773
  msgid "Your Subscriptions"
774
  msgstr ""
777
  msgid "Send Email"
778
  msgstr ""
779
 
780
+ #: classes/class-s2-admin.php:42
781
+ #: classes/class-s2-admin.php:50
782
+ #: classes/class-s2-admin.php:62
783
+ #: classes/class-s2-admin.php:109
784
+ #: classes/class-s2-admin.php:166
785
  msgid "Overview"
786
  msgstr ""
787
 
788
  #: classes/class-s2-admin.php:43
789
+ msgid "From this page you can opt in or out of receiving a periodical digest style email of blog posts."
 
 
790
  msgstr ""
791
 
792
  #: classes/class-s2-admin.php:51
793
+ msgid "From this page you can control your subscription preferences. Choose the email format you wish to receive, which categories you would like to receive notification for and depending on the site settings which authors you would like to read."
 
 
 
 
794
  msgstr ""
795
 
796
  #: classes/class-s2-admin.php:63
798
  msgstr ""
799
 
800
  #: classes/class-s2-admin.php:70
801
+ msgid "Public Subscribers are subscribers who have used the plugin form and only provided their email address."
 
 
802
  msgstr ""
803
 
804
  #: classes/class-s2-admin.php:70
805
+ msgid "On this page public subscribers can be viewed, searched, deleted and also toggled between Confirmed and Unconfirmed status."
 
 
806
  msgstr ""
807
 
808
  #: classes/class-s2-admin.php:77
809
+ msgid "Registered Subscribers are subscribers who have registered in WordPress and have a username and password."
 
 
810
  msgstr ""
811
 
812
  #: classes/class-s2-admin.php:78
813
+ msgid "Registered Subscribers have greater personal control over their subscription. They can change the format of the email and also select which categories and authors they want to receive notifications about."
 
 
 
814
  msgstr ""
815
 
816
  #: classes/class-s2-admin.php:79
817
+ msgid "On this page registered subscribers can be viewed and searched. User accounts can be deleted from here with any posts created by those users being assigned to the currently logged in user. Bulk changes can be applied to all user settings changing their subscription email format and categories."
 
 
 
 
 
818
  msgstr ""
819
 
820
  #: classes/class-s2-admin.php:88
826
  msgstr ""
827
 
828
  #: classes/class-s2-admin.php:117
829
+ msgid "This section allows you to specify settings that apply to the emails generated by the site."
 
 
830
  msgstr ""
831
 
832
  #: classes/class-s2-admin.php:118
833
+ msgid "Emails can be sent to individual subscribers by setting the number of recipients per email to 1. A setting greater than one will group recipients together and make use of the BCC emails header. A setting of 0 sends a single email with all subscribers in one large BCC group. A setting of 1 looks less like spam email to filters but takes longer to process."
 
 
 
 
 
834
  msgstr ""
835
 
836
  #: classes/class-s2-admin.php:119
837
+ msgid "This section is also where the sender of the email on this page is chosen. You can choose Post Author or your Blogname but it is recommended to create a user account with an email address that really exists and shares the same domain name as your site (the bit after the @ should be the same as your sites web address) and then use this account."
 
 
 
 
 
838
  msgstr ""
839
 
840
  #: classes/class-s2-admin.php:120
841
+ msgid "This page also configures the frequency of emails. This can be at the time new posts are made (per post) or periodically with an excerpt of each post made (digest). Additionally the post types (pages, private, password protected) can also be configured here."
 
 
 
 
842
  msgstr ""
843
 
844
  #: classes/class-s2-admin.php:127
845
+ msgid "This section allows you to customise the content of your notification emails."
 
 
846
  msgstr ""
847
 
848
  #: classes/class-s2-admin.php:128
849
+ msgid "There are special {KEYWORDS} that are used by Subscribe2 to place content into the final email. The template also accepts regular text and HTML as desired in the final emails."
 
 
 
850
  msgstr ""
851
 
852
  #: classes/class-s2-admin.php:129
853
+ msgid "The {KEYWORDS} are listed on the right of the templates, note that some are for per post emails only and some are for digest emails only. Make sure the correct keywords are used based upon the Email Settings."
 
 
 
854
  msgstr ""
855
 
856
  #: classes/class-s2-admin.php:130
857
+ msgid "The Notification Email template is used for sending notifications of new posts. The Subscribe / Unsubscribe confirmation template is sent when a new subscription or unsubscription request is made. The Reminder template is used to send reminder emails; this is done automatically or can be done manually."
 
 
 
 
 
858
  msgstr ""
859
 
860
  #: classes/class-s2-admin.php:137
861
+ msgid "This section allows settings that apply to Registered Subscribers to be configured."
 
 
862
  msgstr ""
863
 
864
  #: classes/class-s2-admin.php:138
865
+ msgid "Categories can be made compulsory so emails are always sent to Public and Registered Subscribers for posts in these categories. They can also be excluded so that emails are not generated for Subscribers. Registered Subscribers can be allowed to bypass category exclusions. Excluded categories take precedence over Compulsory categories."
 
 
 
 
 
866
  msgstr ""
867
 
868
  #: classes/class-s2-admin.php:139
869
+ msgid "A set of default settings for new users can also be specified using the Auto Subscribe section. Settings specified here will be applied to any newly created user accounts while Subscribe2 is activated."
 
 
 
870
  msgstr ""
871
 
872
  #: classes/class-s2-admin.php:146
873
+ msgid "This section allows you to enable several aspect of the plugin such as Widgets and editor buttons."
 
 
874
  msgstr ""
875
 
876
  #: classes/class-s2-admin.php:147
877
+ msgid "AJAX mode can be enabled that is intended to work with the shortcode link parameter so that a dialog opens in the centre of the browser rather then using the regular form."
 
 
 
878
  msgstr ""
879
 
880
  #: classes/class-s2-admin.php:148
881
+ msgid "The email over ride check box can be set to be automatically checked for every new post and page from here to, this may be useful if you will only want to send very occasional notifications for specific posts. You can then uncheck this box just before you publish your content."
 
 
 
 
 
 
 
 
882
  msgstr ""
883
 
884
  #: classes/class-s2-admin.php:155
885
+ msgid "This section contains a place to bar specified domains from becoming Public Subscribers and links to help and support pages."
 
 
 
 
 
 
 
 
 
 
 
 
886
  msgstr ""
887
 
888
+ #: classes/class-s2-admin.php:167
889
+ msgid "From this page you can send emails to the recipients in the group selected in the drop down."
 
 
890
  msgstr ""
891
 
892
+ #: classes/class-s2-admin.php:168
893
+ msgid "<strong>Preview</strong> will send a preview of the email to the currently logged in user. <strong>Send</strong> will send the email to the recipient list."
 
 
894
  msgstr ""
895
 
896
+ #: classes/class-s2-admin.php:226
897
+ msgid "You are about to delete a registered user account, any posts made by this user will be assigned to you. Are you sure?"
 
 
898
  msgstr ""
899
 
900
+ #: classes/class-s2-admin.php:227
901
+ msgid "You are about to delete registered user accounts, any posts made by these users will be assigned to you. Are you sure?"
 
 
 
902
  msgstr ""
903
 
904
+ #: classes/class-s2-admin.php:228
 
 
 
 
 
 
 
 
 
 
 
 
905
  msgid "You are about to delete a public subscriber. Are you sure?"
906
  msgstr ""
907
 
908
+ #: classes/class-s2-admin.php:229
909
  msgid "You are about to delete public subscribers. Are you sure?"
910
  msgstr ""
911
 
912
+ #: classes/class-s2-admin.php:230
913
+ msgid "You are about to make Bulk Management changes to all Registered Users. Are you sure?"
 
 
914
  msgstr ""
915
 
916
+ #: classes/class-s2-admin.php:231
917
+ msgid "You are about to make Bulk Management changes to the selected Registered User. Are you sure?"
 
 
918
  msgstr ""
919
 
920
+ #: classes/class-s2-admin.php:232
921
+ msgid "You are about to make Bulk Management changes to the selected Registered Users. Are you sure?"
 
 
922
  msgstr ""
923
 
924
+ #: classes/class-s2-admin.php:354
 
 
 
 
925
  msgid "Subscribe2 Notification Override"
926
  msgstr ""
927
 
928
+ #: classes/class-s2-admin.php:367
929
+ #: gutenberg/gutenberg-translations.php:29
930
+ #: gutenberg/sidebar.js:176
931
  msgid "Subscribe2 Preview"
932
  msgstr ""
933
 
934
+ #: classes/class-s2-admin.php:381
935
+ #: gutenberg/gutenberg-translations.php:21
936
+ #: gutenberg/sidebar.js:92
937
  msgid "Subscribe2 Resend"
938
  msgstr ""
939
 
940
+ #: classes/class-s2-admin.php:401
941
+ #: gutenberg/gutenberg-translations.php:20
942
+ #: gutenberg/sidebar.js:70
943
  msgid "Check here to disable sending of an email notification for this post/page"
944
  msgstr ""
945
 
946
+ #: classes/class-s2-admin.php:438
947
+ #: gutenberg/gutenberg-translations.php:30
948
+ #: gutenberg/sidebar.js:185
949
  msgid "Send preview email of this post to currently logged in user:"
950
  msgstr ""
951
 
952
+ #: classes/class-s2-admin.php:439
953
+ #: gutenberg/gutenberg-translations.php:31
954
+ #: gutenberg/sidebar.js:197
955
  msgid "Send Preview"
956
  msgstr ""
957
 
958
+ #: classes/class-s2-admin.php:463
959
+ #: gutenberg/gutenberg-translations.php:22
960
+ #: gutenberg/sidebar.js:101
961
  msgid "Resend the notification email of this post to current subscribers:"
962
  msgstr ""
963
 
964
+ #: classes/class-s2-admin.php:464
965
+ #: gutenberg/gutenberg-translations.php:23
966
+ #: gutenberg/sidebar.js:113
967
  msgid "Resend Notification"
968
  msgstr ""
969
 
970
+ #: classes/class-s2-admin.php:551
971
+ msgctxt "Comma Separated Column Header names for CSV Export"
972
+ msgid "User Email,User Type,User Name,Confirm Date,IP"
973
+ msgstr ""
974
+
975
+ #: classes/class-s2-admin.php:572
976
  msgid "Registered User"
977
  msgstr ""
978
 
979
+ #: classes/class-s2-admin.php:577
980
  msgid "Confirmed Public Subscriber"
981
  msgstr ""
982
 
983
+ #: classes/class-s2-admin.php:579
984
  msgid "Unconfirmed Public Subscriber"
985
  msgstr ""
986
 
987
+ #: classes/class-s2-admin.php:596
988
+ #: classes/class-s2-forms.php:306
989
  #: classes/class-s2-forms.php:366
990
  msgid "Select / Unselect All"
991
  msgstr ""
992
 
993
+ #: classes/class-s2-admin.php:633
994
  msgid "All Users and Subscribers"
995
  msgstr ""
996
 
997
+ #: classes/class-s2-admin.php:635
998
  msgid "Confirmed"
999
  msgstr ""
1000
 
1001
+ #: classes/class-s2-admin.php:636
1002
  msgid "Unconfirmed"
1003
  msgstr ""
1004
 
1005
+ #: classes/class-s2-admin.php:637
1006
  msgid "All Registered Users"
1007
  msgstr ""
1008
 
1009
+ #: classes/class-s2-admin.php:745
1010
  msgid "Post Author"
1011
  msgstr ""
1012
 
1013
+ #: classes/class-s2-admin.php:785
1014
+ msgid "The WordPress cron functions may be disabled on this server. Digest notifications may not work."
 
 
1015
  msgstr ""
1016
 
1017
+ #: classes/class-s2-admin.php:794
1018
  msgid "For each Post"
1019
  msgstr ""
1020
 
1021
+ #: classes/class-s2-admin.php:816
1022
  msgid "Current UTC time is"
1023
  msgstr ""
1024
 
1025
+ #: classes/class-s2-admin.php:818
1026
  msgid "Current blog time is"
1027
  msgstr ""
1028
 
1029
+ #: classes/class-s2-admin.php:820
1030
  msgid "Next email notification will be sent when your blog time is after"
1031
  msgstr ""
1032
 
1033
+ #: classes/class-s2-admin.php:842
1034
  msgid "Attempt to resend the last Digest Notification email"
1035
  msgstr ""
1036
 
1037
+ #: classes/class-s2-admin.php:843
1038
  msgid "Resend Digest"
1039
  msgstr ""
1040
 
1041
+ #: classes/class-s2-admin.php:860
1042
  msgid "Select a page"
1043
  msgstr ""
1044
 
1045
+ #: classes/class-s2-admin.php:1131
1046
  msgid "Email subscription"
1047
  msgstr ""
1048
 
1049
+ #: classes/class-s2-admin.php:1133
1050
  msgid "Subscribe / Unsubscribe"
1051
  msgstr ""
1052
 
1053
+ #: classes/class-s2-admin.php:1134
1054
  msgid "Receive notifications"
1055
  msgstr ""
1056
 
1057
+ #: classes/class-s2-admin.php:1135
1058
  msgid "Check if you want to receive email notification when new posts are published"
1059
  msgstr ""
1060
 
1066
  msgid "There was an error validating your request. Please try again later."
1067
  msgstr ""
1068
 
1069
+ #: classes/class-s2-ajax.php:104
1070
+ #: classes/class-s2-ajax.php:134
1071
+ #: classes/class-s2-ajax.php:148
1072
+ #: classes/class-s2-frontend.php:24
1073
  msgid "A confirmation message is on its way!"
1074
  msgstr ""
1075
 
1076
+ #: classes/class-s2-ajax.php:112
1077
+ #: classes/class-s2-frontend.php:30
1078
  msgid "Sorry, but that does not look like an email address to me."
1079
  msgstr ""
1080
 
1081
+ #: classes/class-s2-ajax.php:114
1082
+ #: classes/class-s2-frontend.php:32
1083
+ msgid "Sorry, email addresses at that domain are currently barred due to spam, please use an alternative email address."
 
1084
  msgstr ""
1085
 
1086
+ #: classes/class-s2-ajax.php:120
1087
+ #: classes/class-s2-frontend.php:188
1088
  msgid "Slow down, you move too fast."
1089
  msgstr ""
1090
 
 
1091
  #. Translators: Link to login page
1092
+ #: classes/class-s2-ajax.php:126
1093
  msgid "To manage your subscription options please <a href=\"%1$s\">login.</a>"
1094
  msgstr ""
1095
 
1096
+ #: classes/class-s2-ajax.php:136
1097
+ #: classes/class-s2-ajax.php:150
1098
  #: classes/class-s2-frontend.php:34
1099
  msgid "Sorry, there seems to be an error on the server. Please try again later."
1100
  msgstr ""
1101
 
1102
+ #: classes/class-s2-ajax.php:140
1103
+ #: classes/class-s2-frontend.php:26
1104
  msgid "That email address is already subscribed."
1105
  msgstr ""
1106
 
1107
+ #: classes/class-s2-ajax.php:144
1108
+ #: classes/class-s2-frontend.php:28
1109
  msgid "That email address is not subscribed."
1110
  msgstr ""
1111
 
1130
  msgstr ""
1131
 
1132
  #: classes/class-s2-core.php:1257
1133
+ msgid "By registering with this blog you are also agreeing to receive email notifications for new posts but you can unsubscribe at anytime"
 
 
1134
  msgstr ""
1135
 
1136
  #: classes/class-s2-core.php:1285
1141
  msgid "Weekly"
1142
  msgstr ""
1143
 
1144
+ #: classes/class-s2-core.php:1622
1145
+ #: classes/class-s2-core.php:1623
1146
  msgid "Author"
1147
  msgstr ""
1148
 
1150
  msgid "Posted on"
1151
  msgstr ""
1152
 
1153
+ #: classes/class-s2-core.php:1656
1154
+ #: classes/class-s2-core.php:1657
1155
  msgid "Posted in"
1156
  msgstr ""
1157
 
1158
+ #: classes/class-s2-core.php:1670
1159
+ #: classes/class-s2-core.php:1671
1160
  msgid "Tagged as"
1161
  msgstr ""
1162
 
1284
  msgid "Disable Anti-spam measures"
1285
  msgstr ""
1286
 
1287
+ #: classes/class-s2-form-widget.php:182
1288
+ #: gutenberg/gutenberg-translations.php:17
1289
+ #: gutenberg/shortcode.js:365
1290
  msgid "Disable wrapping of form buttons"
1291
  msgstr ""
1292
 
1293
+ #: classes/class-s2-forms.php:17
1294
+ #: classes/class-s2-forms.php:21
1295
  msgid "Permission error! Your request cannot be completed."
1296
  msgstr ""
1297
 
1343
  msgid "Subscribed Blogs"
1344
  msgstr ""
1345
 
1346
+ #: classes/class-s2-forms.php:168
1347
+ #: classes/class-s2-forms.php:189
1348
  msgid "Viewing Settings Now"
1349
  msgstr ""
1350
 
1351
+ #: classes/class-s2-forms.php:172
1352
+ #: classes/class-s2-forms.php:193
1353
  msgid "View Settings"
1354
  msgstr ""
1355
 
1361
  msgid "Subscription preferences updated."
1362
  msgstr ""
1363
 
 
1364
  #. Translators: Link to login page
1365
+ #: classes/class-s2-frontend.php:8
1366
  msgid "To manage your subscription options please <a href=\"%1$s\">login</a>."
1367
  msgstr ""
1368
 
 
1369
  #. Translators: Link to Profile page
1370
+ #: classes/class-s2-frontend.php:12
1371
+ msgid "You may manage your subscription options from your <a href=\"%1$s\">profile</a>."
 
1372
  msgstr ""
1373
 
 
1374
  #. Translators: Link to Profile page
1375
+ #: classes/class-s2-frontend.php:20
1376
+ msgid "<a href=\"%1$s\">Subscribe</a> to email notifications when this blog posts new content."
 
1377
  msgstr ""
1378
 
1379
  #: classes/class-s2-frontend.php:37
1400
  msgid "Enter email address..."
1401
  msgstr ""
1402
 
1403
+ #: classes/class-s2-frontend.php:155
1404
+ #: classes/class-s2-frontend.php:157
1405
  msgid "Your email:"
1406
  msgstr ""
1407
 
1433
  msgid "[Un]Subscribe to Posts"
1434
  msgstr ""
1435
 
1436
+ #: classes/class-s2-list-table.php:68
1437
+ msgctxt "column name"
1438
+ msgid "Email"
1439
+ msgstr ""
1440
+
1441
+ #: classes/class-s2-list-table.php:69
1442
+ msgctxt "column name"
1443
+ msgid "Date"
1444
+ msgstr ""
1445
+
1446
  #: classes/class-s2-list-table.php:112
1447
  msgid "Select All"
1448
  msgstr ""
1449
 
1450
+ #: classes/class-s2-list-table.php:167
1451
+ #: classes/class-s2-list-table.php:172
 
1452
  msgid "Delete"
1453
  msgstr ""
1454
 
 
1455
  #: classes/class-s2-list-table.php:173
1456
  msgid "Toggle"
1457
  msgstr ""
1458
 
 
1459
  #: classes/class-s2-list-table.php:182
1460
  msgid "No users were selected."
1461
  msgstr ""
1462
 
 
1463
  #: classes/class-s2-list-table.php:195
1464
  msgid "Address(es) deleted!"
1465
  msgstr ""
1466
 
 
1467
  #: classes/class-s2-list-table.php:199
1468
  msgid "Delete failed! You cannot delete some or all of these users."
1469
  msgstr ""
1470
 
 
1471
  #: classes/class-s2-list-table.php:202
1472
+ msgid "Registered user(s) deleted! Any posts made by these users were assigned to you."
 
 
1473
  msgstr ""
1474
 
 
1475
  #: classes/class-s2-list-table.php:226
1476
  msgid "Status changed!"
1477
  msgstr ""
1478
 
 
 
1479
  #. Translators: Pagination
1480
+ #: classes/class-s2-list-table.php:247
1481
  msgid "%s item"
1482
  msgid_plural "%s items"
1483
  msgstr[0] ""
1484
  msgstr[1] ""
1485
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1486
  #: classes/class-s2-list-table.php:308
1487
  msgid "First page"
1488
  msgstr ""
1491
  msgid "Previous page"
1492
  msgstr ""
1493
 
1494
+ #: classes/class-s2-list-table.php:326
1495
+ #: classes/class-s2-list-table.php:330
1496
  msgid "Current Page"
1497
  msgstr ""
1498
 
1499
+ #. Translators: Pagination
1500
+ #: classes/class-s2-list-table.php:338
1501
+ msgctxt "paging"
1502
+ msgid "%1$s of %2$s"
1503
+ msgstr ""
1504
+
1505
  #: classes/class-s2-list-table.php:346
1506
  msgid "Next page"
1507
  msgstr ""
1511
  msgstr ""
1512
 
1513
  #: gutenberg/gutenberg-translations.php:5
1514
+ #: gutenberg/shortcode.js:112
1515
  msgid "Subscribe2 HTML"
1516
  msgstr ""
1517
 
1518
  #: gutenberg/gutenberg-translations.php:6
1519
+ #: gutenberg/shortcode.js:116
1520
  msgid "email"
1521
  msgstr ""
1522
 
1523
  #: gutenberg/gutenberg-translations.php:7
1524
+ #: gutenberg/shortcode.js:117
1525
  msgid "notification"
1526
  msgstr ""
1527
 
1528
  #: gutenberg/gutenberg-translations.php:8
1529
+ #: gutenberg/shortcode.js:314
1530
  msgid "Subscribe2 Shortcode Parameters"
1531
  msgstr ""
1532
 
1533
  #: gutenberg/gutenberg-translations.php:9
1534
+ #: gutenberg/shortcode.js:318
1535
  msgid "Button Display Options"
1536
  msgstr ""
1537
 
1538
  #: gutenberg/gutenberg-translations.php:10
1539
+ #: gutenberg/shortcode.js:322
1540
  msgid "Show Both Buttons"
1541
  msgstr ""
1542
 
1543
  #: gutenberg/gutenberg-translations.php:11
1544
+ #: gutenberg/shortcode.js:323
1545
  msgid "Hide Subscribe Button"
1546
  msgstr ""
1547
 
1548
  #: gutenberg/gutenberg-translations.php:12
1549
+ #: gutenberg/shortcode.js:324
1550
  msgid "Hide Unsubscribe Button"
1551
  msgstr ""
1552
 
1553
  #: gutenberg/gutenberg-translations.php:13
1554
+ #: gutenberg/shortcode.js:332
1555
  msgid "Page ID"
1556
  msgstr ""
1557
 
1558
  #: gutenberg/gutenberg-translations.php:14
1559
+ #: gutenberg/shortcode.js:340
1560
  msgid "Disable Javascript"
1561
  msgstr ""
1562
 
1563
  #: gutenberg/gutenberg-translations.php:15
1564
+ #: gutenberg/shortcode.js:348
1565
  msgid "Disable Simple Anti-Spam Measures"
1566
  msgstr ""
1567
 
1568
  #: gutenberg/gutenberg-translations.php:16
1569
+ #: gutenberg/shortcode.js:357
1570
  msgid "Textbox size"
1571
  msgstr ""
1572
 
1573
  #: gutenberg/gutenberg-translations.php:18
1574
+ #: gutenberg/shortcode.js:374
1575
  msgid "Link Text"
1576
  msgstr ""
1577
 
1578
  #: gutenberg/gutenberg-translations.php:19
1579
+ #: gutenberg/shortcode.js:386
1580
  msgid "Subscribe2 HTML Shortcode"
1581
  msgstr ""
1582
 
1583
  #: gutenberg/gutenberg-translations.php:24
1584
+ #: gutenberg/sidebar.js:123
1585
  msgid "Attempt made to send email preview"
1586
  msgstr ""
1587
 
1588
  #: gutenberg/gutenberg-translations.php:25
1589
+ #: gutenberg/sidebar.js:130
1590
  msgid "Attempt made to resend email notification"
1591
  msgstr ""
1592
 
1593
  #: gutenberg/gutenberg-translations.php:26
1594
  #: gutenberg/gutenberg-translations.php:27
1595
+ #: gutenberg/sidebar.js:143
1596
+ #: gutenberg/sidebar.js:149
1597
  msgid "Subscribe2 Sidebar"
1598
  msgstr ""
1599
 
1600
  #: gutenberg/gutenberg-translations.php:28
1601
+ #: gutenberg/sidebar.js:159
1602
  msgid "Subscribe2 Override"
1603
  msgstr ""
1604
 
1611
  "You may view the latest post at\n"
1612
  "{PERMALINK}\n"
1613
  "\n"
1614
+ "You received this e-mail because you asked to be notified when new updates are posted.\n"
 
1615
  "Best regards,\n"
1616
  "{MYNAME}\n"
1617
  "{EMAIL}"
1619
 
1620
  #: include/options.php:148
1621
  msgid ""
1622
+ "{BLOGNAME} has received a request to {ACTION} for this email address. To complete your request please click on the link below:\n"
 
1623
  "\n"
1624
  "{LINK}\n"
1625
  "\n"
1635
 
1636
  #: include/options.php:156
1637
  msgid ""
1638
+ "This email address was subscribed for notifications at {BLOGNAME} ({BLOGLINK}) but the subscription remains incomplete.\n"
 
1639
  "\n"
1640
  "If you wish to complete your subscription please click on the link below:\n"
1641
  "\n"
1642
  "{LINK}\n"
1643
  "\n"
1644
+ "If you do not wish to complete your subscription please ignore this email and your address will be removed from our database.\n"
 
1645
  "\n"
1646
  "Regards,\n"
1647
  "{MYNAME}"
1655
  msgid "I'm just a plugin, please don't call me directly"
1656
  msgstr ""
1657
 
1658
+ #. Translators: Subscribe2 needs WordPress 4.4 or above, exit if not on a compatible version
1659
  #: subscribe2.php:39
1660
+ msgid "This version of Subscribe2 requires WordPress 4.4 or greater. Please update %1$s or use an older version of %2$s."
 
 
 
 
1661
  msgstr ""
1662
 
1663
  #: subscribe2.php:51
1664
+ msgid "Subscribe2 HTML cannot be activated as a network plugin. Please activate it on a site level"
 
 
 
 
 
 
 
 
 
 
1665
  msgstr ""