WP RSS Aggregator - Version 4.7.3

Version Description

(2015-08-04) = * Enhanced: Core now implements an image cache logic. * Enhanced: Add-ons on the "Add-ons" page now have an installed-but-inactive status. * Enhanced: Google Alerts permalinks will now be normalized. * Enhanced: Russian translation added. * Fixed bug: Inline help (tooltips) translations now work. * Fixed bug: Link to the Feed to Post add-on on the welcome page is no longer broken.

Download this release

Release Info

Developer jeangalea
Plugin Icon 128x128 WP RSS Aggregator
Version 4.7.3
Comparing to
See all releases

Code changes from version 4.7.2 to 4.7.3

includes/admin-addons.php CHANGED
@@ -7,13 +7,15 @@
7
  *
8
  */
9
  function wprss_addons_page_display() {
10
-
11
  $premium = array();
12
  $premium[] = array(
13
  'title' => __( "Excerpts & Thumbnails", WPRSS_TEXT_DOMAIN ),
14
  'description' => __( "Adds the ability to display thumbnails and excerpts. Perfect for adding some life and color to your feed item display. For more flexibility Feed to Post is a better option.", WPRSS_TEXT_DOMAIN ),
15
  'thumbnail' => WPRSS_IMG . 'add-ons/wprss.jpg',
16
  'active' => is_plugin_active( 'wp-rss-excerpts-thumbnails/wp-rss-excerpts-thumbnails.php' ),
 
 
17
  'url' => 'http://www.wprssaggregator.com/extension/excerpts-thumbnails/'
18
  );
19
  $premium[] = array(
@@ -21,6 +23,8 @@
21
  'description' => __( "Assign categories to your feed sources. Then display a particular category or multiple categories on a post or page via shortcodes.", WPRSS_TEXT_DOMAIN ),
22
  'thumbnail' => WPRSS_IMG . 'add-ons/wprss.jpg',
23
  'active' => is_plugin_active( 'wp-rss-categories/wp-rss-categories.php' ),
 
 
24
  'url' => 'http://www.wprssaggregator.com/extension/categories/'
25
  );
26
  $premium[] = array(
@@ -28,6 +32,8 @@
28
  'description' => __( "Import feeds that contain specific keywords in either the title or their content. Control what gets imported to your blog. You can use keywords, keyphrases and categories.", WPRSS_TEXT_DOMAIN ),
29
  'thumbnail' => WPRSS_IMG . 'add-ons/wprss.jpg',
30
  'active' => is_plugin_active( 'wp-rss-keyword-filtering/wp-rss-keyword-filtering.php' ),
 
 
31
  'url' => 'http://www.wprssaggregator.com/extension/keyword-filtering/'
32
  );
33
  $premium[] = array(
@@ -35,6 +41,8 @@
35
  'description' => __( "Allows you to import feed items into posts or any other custom post type that you have created. Takes WP RSS Aggregator to a whole new level of flexibility.", WPRSS_TEXT_DOMAIN ),
36
  'thumbnail' => WPRSS_IMG . 'add-ons/wprss.jpg',
37
  'active' => is_plugin_active( 'wp-rss-feed-to-post/wp-rss-feed-to-post.php' ),
 
 
38
  'url' => 'http://www.wprssaggregator.com/extension/feed-to-post/'
39
  );
40
  $premium[] = array(
@@ -42,6 +50,8 @@
42
  'description' => __( "This add-ons provides the connectivity to our Full Text Premium service, which gives you unlimited feed items returned per feed source.", WPRSS_TEXT_DOMAIN ),
43
  'thumbnail' => WPRSS_IMG . 'add-ons/wprss.jpg',
44
  'active' => is_plugin_active( 'wp-rss-full-text-feeds/wp-rss-full-text.php' ),
 
 
45
  'url' => 'http://www.wprssaggregator.com/extension/full-text-rss-feeds/'
46
  );
47
  $premium[] = array(
@@ -49,6 +59,8 @@
49
  'description' => __( "Allows you to spin the content for posts imported by Feed to Post using WordAi. Cleverly rewrite your posts without changing their meaning and maintaining human readability.", WPRSS_TEXT_DOMAIN ),
50
  'thumbnail' => WPRSS_IMG . 'add-ons/wprss.jpg',
51
  'active' => is_plugin_active( 'wp-rss-wordai/wp-rss-wordai.php' ),
 
 
52
  'url' => 'http://www.wprssaggregator.com/extension/wordai/'
53
  );
54
 
@@ -75,6 +87,8 @@
75
  <div class="footer">
76
  <?php if( $addon['active'] ): ?>
77
  <a class="button button-disabled"><span class="wprss-sprite-tick"></span><?php _e( "Installed", WPRSS_TEXT_DOMAIN ); ?></a>
 
 
78
  <?php else: ?>
79
  <a target="_blank" href="<?php echo $addon['url']; ?>" class="button"><?php _e( "Purchase & Install", WPRSS_TEXT_DOMAIN ); ?></a>
80
  <?php endif; ?>
@@ -89,4 +103,24 @@
89
 
90
  <?php
91
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
92
  }
7
  *
8
  */
9
  function wprss_addons_page_display() {
10
+
11
  $premium = array();
12
  $premium[] = array(
13
  'title' => __( "Excerpts & Thumbnails", WPRSS_TEXT_DOMAIN ),
14
  'description' => __( "Adds the ability to display thumbnails and excerpts. Perfect for adding some life and color to your feed item display. For more flexibility Feed to Post is a better option.", WPRSS_TEXT_DOMAIN ),
15
  'thumbnail' => WPRSS_IMG . 'add-ons/wprss.jpg',
16
  'active' => is_plugin_active( 'wp-rss-excerpts-thumbnails/wp-rss-excerpts-thumbnails.php' ),
17
+ 'installed_inactive' => wprss_is_plugin_inactive( 'wp-rss-excerpts-thumbnails/wp-rss-excerpts-thumbnails.php' ),
18
+ 'path' => 'wp-rss-excerpts-thumbnails/wp-rss-excerpts-thumbnails.php',
19
  'url' => 'http://www.wprssaggregator.com/extension/excerpts-thumbnails/'
20
  );
21
  $premium[] = array(
23
  'description' => __( "Assign categories to your feed sources. Then display a particular category or multiple categories on a post or page via shortcodes.", WPRSS_TEXT_DOMAIN ),
24
  'thumbnail' => WPRSS_IMG . 'add-ons/wprss.jpg',
25
  'active' => is_plugin_active( 'wp-rss-categories/wp-rss-categories.php' ),
26
+ 'installed_inactive' => wprss_is_plugin_inactive( 'wp-rss-categories/wp-rss-categories.php' ),
27
+ 'path' => 'wp-rss-categories/wp-rss-categories.php',
28
  'url' => 'http://www.wprssaggregator.com/extension/categories/'
29
  );
30
  $premium[] = array(
32
  'description' => __( "Import feeds that contain specific keywords in either the title or their content. Control what gets imported to your blog. You can use keywords, keyphrases and categories.", WPRSS_TEXT_DOMAIN ),
33
  'thumbnail' => WPRSS_IMG . 'add-ons/wprss.jpg',
34
  'active' => is_plugin_active( 'wp-rss-keyword-filtering/wp-rss-keyword-filtering.php' ),
35
+ 'installed_inactive' => wprss_is_plugin_inactive( 'wp-rss-keyword-filtering/wp-rss-keyword-filtering.php' ),
36
+ 'path' => 'wp-rss-keyword-filtering/wp-rss-keyword-filtering.php',
37
  'url' => 'http://www.wprssaggregator.com/extension/keyword-filtering/'
38
  );
39
  $premium[] = array(
41
  'description' => __( "Allows you to import feed items into posts or any other custom post type that you have created. Takes WP RSS Aggregator to a whole new level of flexibility.", WPRSS_TEXT_DOMAIN ),
42
  'thumbnail' => WPRSS_IMG . 'add-ons/wprss.jpg',
43
  'active' => is_plugin_active( 'wp-rss-feed-to-post/wp-rss-feed-to-post.php' ),
44
+ 'installed_inactive' => wprss_is_plugin_inactive( 'wp-rss-feed-to-post/wp-rss-feed-to-post.php' ),
45
+ 'path' => 'wp-rss-feed-to-post/wp-rss-feed-to-post.php',
46
  'url' => 'http://www.wprssaggregator.com/extension/feed-to-post/'
47
  );
48
  $premium[] = array(
50
  'description' => __( "This add-ons provides the connectivity to our Full Text Premium service, which gives you unlimited feed items returned per feed source.", WPRSS_TEXT_DOMAIN ),
51
  'thumbnail' => WPRSS_IMG . 'add-ons/wprss.jpg',
52
  'active' => is_plugin_active( 'wp-rss-full-text-feeds/wp-rss-full-text.php' ),
53
+ 'installed_inactive' => wprss_is_plugin_inactive( 'wp-rss-full-text-feeds/wp-rss-full-text.php' ),
54
+ 'path' => 'wp-rss-full-text-feeds/wp-rss-full-text.php',
55
  'url' => 'http://www.wprssaggregator.com/extension/full-text-rss-feeds/'
56
  );
57
  $premium[] = array(
59
  'description' => __( "Allows you to spin the content for posts imported by Feed to Post using WordAi. Cleverly rewrite your posts without changing their meaning and maintaining human readability.", WPRSS_TEXT_DOMAIN ),
60
  'thumbnail' => WPRSS_IMG . 'add-ons/wprss.jpg',
61
  'active' => is_plugin_active( 'wp-rss-wordai/wp-rss-wordai.php' ),
62
+ 'installed_inactive' => wprss_is_plugin_inactive( 'wp-rss-wordai/wp-rss-wordai.php' ),
63
+ 'path' => 'wp-rss-wordai/wp-rss-wordai.php',
64
  'url' => 'http://www.wprssaggregator.com/extension/wordai/'
65
  );
66
 
87
  <div class="footer">
88
  <?php if( $addon['active'] ): ?>
89
  <a class="button button-disabled"><span class="wprss-sprite-tick"></span><?php _e( "Installed", WPRSS_TEXT_DOMAIN ); ?></a>
90
+ <?php elseif( $addon['installed_inactive'] ): ?>
91
+ <a class="button" href="<?php echo wp_nonce_url('plugins.php?action=activate&amp;plugin='.$addon['path'], 'activate-plugin_'.$addon['path'] ) ?>"><?php _e( "Activate", WPRSS_TEXT_DOMAIN ); ?></a>
92
  <?php else: ?>
93
  <a target="_blank" href="<?php echo $addon['url']; ?>" class="button"><?php _e( "Purchase & Install", WPRSS_TEXT_DOMAIN ); ?></a>
94
  <?php endif; ?>
103
 
104
  <?php
105
 
106
+ }
107
+
108
+ /**
109
+ * Check if plugin file exists but plugin is inactive
110
+ * @param $path Path to plugin file
111
+ * @since 4.7.3
112
+ * @return bool TRUE if plugin file found but plugin inactive. False otherwise
113
+ */
114
+ function wprss_is_plugin_inactive( $path ){
115
+
116
+ if( ! isset( $path ) ){
117
+ return FALSE;
118
+ }
119
+
120
+ if( file_exists( WP_PLUGIN_DIR . '/' . $path ) && is_plugin_inactive( $path ) ){
121
+ return TRUE; // plugin found but inactive
122
+ }
123
+
124
+ return FALSE;
125
+
126
  }
includes/admin-help-metaboxes.php CHANGED
@@ -1,76 +1,80 @@
1
  <?php
2
 
3
- if( class_exists('WPRSS_Help') ) {
4
- $help = WPRSS_Help::get_instance();
5
 
6
- // Feed source setting fields
7
- $prefix = 'field_';
8
- $tooltips = array(
9
- /* -----------------------------
10
- * Feed Source Details Metabox
11
- * -----------------------------
12
- */
13
- // Feed Source URL
14
- 'wprss_url' => __('The URL of the feed source. In most cases, the URL of the site will also work, but for best results we recommend trying to find the URL of the RSS feed.
15
 
16
- Also include the <code>http://</code> prefix in the URL.', WPRSS_TEXT_DOMAIN),
17
- // Feed limit
18
- 'wprss_limit' => __('The maximum number of imported items from this feed to keep stored.
 
 
 
 
 
 
19
 
20
- When new items are imported and the limit is exceeded, the oldest feed items will be deleted to make room for new ones.
 
 
21
 
22
- If you already have items imported from this feed source, setting this option now may delete some of your items, in order to comply with the limit.', WPRSS_TEXT_DOMAIN),
23
- // Link to Enclosure
24
- 'wprss_enclosure' => __('Tick this box to make feed items link to the URL in the enclosure tag, rather than link to the original article.
25
 
26
- Enclosure tags are RSS tags that may be included with a feed items. These tags typically contain links to images, audio, videos, attachment files or even flash content.
 
 
27
 
28
- If you are not sure leave this setting blank.', WPRSS_TEXT_DOMAIN),
29
 
30
- 'wprss_unique_titles' => __('Whether to allow multiple feed items to have the same title. When checked, if a feed item has the same title as a previously-imported feed item, it will not be imported.
31
 
32
- This can be useful in cases where permalinks change, or where multiple permalinks refer to the same item.', WPRSS_TEXT_DOMAIN),
33
 
 
34
 
35
- /* -------------------------
36
- * Feed Processing Metabox
37
- * -------------------------
38
- */
39
- // Feed State
40
- 'wprss_state' => __('State of the feed, active or paused.
41
 
42
- If active, the feed source will fetch items periodically, according to the settings below.
 
 
 
 
 
43
 
44
- If paused, the feed source will not fetch feed items periodically.', WPRSS_TEXT_DOMAIN),
45
- // Activate Feed: [date]
46
- 'wprss_activate_feed' => __('You can set a time, in UTC, in the future when the feed source will become active, if it is paused.
47
 
48
- Leave blank to activate immediately.', WPRSS_TEXT_DOMAIN),
49
- // Pause Feed: [date]
50
- 'wprss_pause_feed' => __('You can set a time, in UTC, in the future when the feed source will become paused, if it is active.
51
 
52
- Leave blank to never pause.', WPRSS_TEXT_DOMAIN),
53
- // Update Interval
54
- 'wprss_update_interval' => __('How frequently the feed source should check for new items and fetch if needed.
55
 
56
- If left as <em>Default</em>, the interval in the global settings is used.', WPRSS_TEXT_DOMAIN),
57
- // Delete items older than: [date]
58
- 'wprss_age_limit' => __('The maximum age allowed for feed items. Very useful if you are only concerned with, say, last week\'s news.
59
 
60
- Items already imported will be deleted if they eventually exceed this age limit.
 
 
61
 
62
- Also, items in the RSS feed that are already older than this age will not be imported at all.
63
 
64
- Leaving empty to use the <em>Limit feed items by age</em> option in the general settings.', WPRSS_TEXT_DOMAIN),
65
 
66
- /* ----------------------
67
- * Feed Preview Metabox
68
- * ----------------------
69
- */
70
- // Force Feed
71
- 'wprss_force_feed' => __('Use this option if you are seeing an <q>Invalid feed URL</q> error in the Feed Preview above, but you are sure that the URL is correct.
72
 
73
- Note, however, that this will disable auto-discovery, meaning that the given URL must be an RSS feed URL. Using the site\'s URL will not work.', WPRSS_TEXT_DOMAIN)
74
- );
75
- $help->add_tooltips( $tooltips, $prefix );
 
 
 
 
 
 
 
 
76
  }
1
  <?php
2
 
3
+ add_action( 'plugins_loaded', 'wprss_metaboxes_add_tooltips', 11 );
4
+ function wprss_metaboxes_add_tooltips() {
5
 
6
+ if( class_exists('WPRSS_Help') ) {
7
+ $help = WPRSS_Help::get_instance();
 
 
 
 
 
 
 
8
 
9
+ // Feed source setting fields
10
+ $prefix = 'field_';
11
+ $tooltips = array(
12
+ /* -----------------------------
13
+ * Feed Source Details Metabox
14
+ * -----------------------------
15
+ */
16
+ // Feed Source URL
17
+ 'wprss_url' => __('The URL of the feed source. In most cases, the URL of the site will also work, but for best results we recommend trying to find the URL of the RSS feed.
18
 
19
+ ' . 'Also include the <code>http://</code> prefix in the URL.', WPRSS_TEXT_DOMAIN),
20
+ // Feed limit
21
+ 'wprss_limit' => __('The maximum number of imported items from this feed to keep stored.
22
 
23
+ '. 'When new items are imported and the limit is exceeded, the oldest feed items will be deleted to make room for new ones.
 
 
24
 
25
+ '. 'If you already have items imported from this feed source, setting this option now may delete some of your items, in order to comply with the limit.', WPRSS_TEXT_DOMAIN),
26
+ // Link to Enclosure
27
+ 'wprss_enclosure' => __('Tick this box to make feed items link to the URL in the enclosure tag, rather than link to the original article.
28
 
29
+ '. 'Enclosure tags are RSS tags that may be included with a feed items. These tags typically contain links to images, audio, videos, attachment files or even flash content.
30
 
31
+ '. 'If you are not sure leave this setting blank.', WPRSS_TEXT_DOMAIN),
32
 
33
+ 'wprss_unique_titles' => __('Whether to allow multiple feed items to have the same title. When checked, if a feed item has the same title as a previously-imported feed item, it will not be imported.
34
 
35
+ '. 'This can be useful in cases where permalinks change, or where multiple permalinks refer to the same item.', WPRSS_TEXT_DOMAIN),
36
 
 
 
 
 
 
 
37
 
38
+ /* -------------------------
39
+ * Feed Processing Metabox
40
+ * -------------------------
41
+ */
42
+ // Feed State
43
+ 'wprss_state' => __('State of the feed, active or paused.
44
 
45
+ '. 'If active, the feed source will fetch items periodically, according to the settings below.
 
 
46
 
47
+ '. 'If paused, the feed source will not fetch feed items periodically.', WPRSS_TEXT_DOMAIN),
48
+ // Activate Feed: [date]
49
+ 'wprss_activate_feed' => __('You can set a time, in UTC, in the future when the feed source will become active, if it is paused.
50
 
51
+ '. 'Leave blank to activate immediately.', WPRSS_TEXT_DOMAIN),
52
+ // Pause Feed: [date]
53
+ 'wprss_pause_feed' => __('You can set a time, in UTC, in the future when the feed source will become paused, if it is active.
54
 
55
+ '. 'Leave blank to never pause.', WPRSS_TEXT_DOMAIN),
56
+ // Update Interval
57
+ 'wprss_update_interval' => __('How frequently the feed source should check for new items and fetch if needed.
58
 
59
+ '. 'If left as <em>Default</em>, the interval in the global settings is used.', WPRSS_TEXT_DOMAIN),
60
+ // Delete items older than: [date]
61
+ 'wprss_age_limit' => __('The maximum age allowed for feed items. Very useful if you are only concerned with, say, last week\'s news.
62
 
63
+ '. 'Items already imported will be deleted if they eventually exceed this age limit.
64
 
65
+ '. 'Also, items in the RSS feed that are already older than this age will not be imported at all.
66
 
67
+ '. 'Leaving empty to use the <em>Limit feed items by age</em> option in the general settings.', WPRSS_TEXT_DOMAIN),
 
 
 
 
 
68
 
69
+ /* ----------------------
70
+ * Feed Preview Metabox
71
+ * ----------------------
72
+ */
73
+ // Force Feed
74
+ 'wprss_force_feed' => __('Use this option if you are seeing an <q>Invalid feed URL</q> error in the Feed Preview above, but you are sure that the URL is correct.
75
+
76
+ '. 'Note, however, that this will disable auto-discovery, meaning that the given URL must be an RSS feed URL. Using the site\'s URL will not work.', WPRSS_TEXT_DOMAIN)
77
+ );
78
+ $help->add_tooltips( $tooltips, $prefix );
79
+ }
80
  }
includes/admin-help-settings.php CHANGED
@@ -1,137 +1,139 @@
1
  <?php
2
 
3
- if( class_exists('WPRSS_Help') ) {
4
- $help = WPRSS_Help::get_instance();
5
-
6
- // Feed source setting fields
7
- $prefix = 'setting-';
8
- $tooltips = array(
9
- /* -----------------
10
- * General Section
11
- * -----------------
12
- */ // Limit feed items by age
13
- 'limit-feed-items-by-age' => __( 'The maximum age allowed for feed items.
14
- <hr/>
15
-
16
- Items already imported will be deleted if they eventually exceed this age limit.
17
-
18
- Also, items in the RSS feed that are already older than this age will not be imported at all.
19
- <hr/>
20
-
21
- <em>Leave empty for no limit.</em>', WPRSS_TEXT_DOMAIN),
22
- // Limit feed items per feed
23
- 'limit-feed-items-imported' => __('The maximum number of imported items to keep stored, for feed sources that do not have their own limit.
24
- <hr/>
25
-
26
- When new items are imported and the limit for a feed source is exceeded, the oldest feed items for that feed source will be deleted to make room for the new ones.
27
-
28
- If you already have items imported from this feed source, setting this option now may delete some of your items, in order to comply with the limit.
29
- <hr/>
30
-
31
- <em>Use 0 or leave empty for no limit.</em>', WPRSS_TEXT_DOMAIN),
32
- // Feed processing interval
33
- 'cron-interval' => __('How frequently should the feed sources (that do not have their own update interval) check for updates and fetch items accordingly.
34
-
35
- It is recommended to not have more than 20 feed sources that use this global update interval. Having too many feed sources updating precisely at the same time can cause the WP Cron System to crash.', WPRSS_TEXT_DOMAIN),
36
- // Unique titles only
37
- 'unique-titles' => __('Whether to allow multiple feed items to have the same title. When checked, if a feed item has the same title as a previously-imported feed item from any feed source, it will not be imported.
38
-
39
- This can be useful in cases where permalinks change, or where multiple permalinks refer to the same item.
40
-
41
- Since this feature requires checking every post title, WordPress installs with a significant amount of posts may notice a slight slowdown of the post import process.', WPRSS_TEXT_DOMAIN),
42
- // Custom Feed URL
43
- 'custom-feed-url' => __('The URL of the custom feed, located at <code>http://yoursite.com/[custom feed url]</code>.
44
- <hr/>
45
-
46
- WP RSS Aggregator allows you to create a custom RSS feed, that contains all of your imported feed items. This setting allows you to change the URL of this custom feed.
47
-
48
- <hr/>
49
-
50
- <strong>Note:</strong> You may be required to refresh you Permalinks after you change this setting, by going to <em>Settings <i class="fa fa-angle-right"></i> Permalinks</e> and clicking <em>Save</em>.', WPRSS_TEXT_DOMAIN),
51
- // Custom Feed Title
52
- 'custom-feed-title' => __('The title of the custom feed.
53
-
54
- This title will be included in the RSS source of the custom feed, in a <code>&lt;title&gt;</code> tag.', WPRSS_TEXT_DOMAIN),
55
- // Custom Feed Limit
56
- 'custom-feed-limit' => __('The maximum number of feed items in the custom feed.', WPRSS_TEXT_DOMAIN),
57
-
58
- /* --------------------------
59
- * General Display Settings
60
- * --------------------------
61
- */ // Link titles
62
- 'link-enable' => __('Check this box to make the feed item titles link to the original article.', WPRSS_TEXT_DOMAIN),
63
- // Title Maximum length
64
- 'title-limit' => __('Set the maximum number of characters to show for feed item titles.
65
- <hr/>
66
-
67
- <em>Leave empty for no limit.</em>', WPRSS_TEXT_DOMAIN),
68
- // Show Authors
69
- 'authors-enable' => __('Check this box to show the author for each feed item, if it is available.', WPRSS_TEXT_DOMAIN),
70
- // Video Links
71
- 'video-links' => __('For feed items from YouTube, Vimeo or Dailymotion, you can choose whether you want to have the items link to the original page link, or a link to the embedded video player only.', WPRSS_TEXT_DOMAIN),
72
- // Pagination Type
73
- 'pagination' => __('The type of pagination to use when showing feed items on multiple pages.
74
-
75
- The first shows two links, "Older" and "Newer", which allow you to navigate through the pages.
76
-
77
- The second shows links for all the pages, together with links for the next and previous pages.', WPRSS_TEXT_DOMAIN),
78
- // Feed Limit
79
- 'feed-limit' => __('The maximum number of feed items to display when using the shortcode.
80
-
81
- This enables pagination if set to a number smaller than the number of items to be displayed.', WPRSS_TEXT_DOMAIN),
82
- // Open Links Behaviour
83
- 'open-dd' => __('Choose how you want links to be opened. This applies to the feed item title and the source link.', WPRSS_TEXT_DOMAIN),
84
- // Set links as no follow
85
- 'follow-dd' => __('Enable this option to set all links displayed as "NoFollow".
86
- <hr/>
87
-
88
- "Nofollow" provides a way to tell search engines to <em>not</em> follow certain links, such as links to feed items in this case.', WPRSS_TEXT_DOMAIN),
89
-
90
- /* -------------------------
91
- * Source Display Settings
92
- * -------------------------
93
- */ // Source Enabled
94
- 'source-enable' => __('Enable this option to show the feed source name for each feed item.', WPRSS_TEXT_DOMAIN),
95
- // Text preceding source
96
- 'text-preceding-source' => __('Enter the text that you want to show before the source name. A space is automatically added between this text and the feed source name.', WPRSS_TEXT_DOMAIN),
97
- // Source Link
98
- 'source-link' => __('Enable this option to link the feed source name to the RSS feed\'s source site.', WPRSS_TEXT_DOMAIN),
99
-
100
- /* -------------------------
101
- * Date Display Settings
102
- * -------------------------
103
- */ // Source Enabled
104
- 'date-enable' => __('Enable this to show the feed item\'s date.', WPRSS_TEXT_DOMAIN),
105
- // Text preceding date
106
- 'text-preceding-date' => __('Enter the text that you want to show before the feed item date. A space is automatically added between this text and the date.', WPRSS_TEXT_DOMAIN),
107
- // Date Format
108
- 'date-format' => __('The format to use for the feed item dates, as a PHP date format.', WPRSS_TEXT_DOMAIN),
109
- // Time Ago Format Enable
110
- 'time-ago-format-enable' => __('Enable this option to show the elapsed time from the feed item\'s date and time to the present time.
111
- <em>Eg. 2 hours ago</em>', WPRSS_TEXT_DOMAIN),
112
-
113
- /* --------
114
- * Styles
115
- * --------
116
- */ // Styles Disable
117
- 'styles-disable' => __('Check this box to disable all plugin styles used for displaying feed items.
118
-
119
- This will allow you to provide your own custom CSS styles for displaying the feed items.', WPRSS_TEXT_DOMAIN),
 
 
120
 
121
- /*
122
- * -------
123
- * Other
124
- * -------
125
- */ // Certificate Path
126
- 'certificate-path' => __( 'Path to the file containing one or more certificates.
127
-
128
- These will be used to verify certificates over secure connection, such as when fetching a remote resource over HTTPS.
129
-
130
- Relative path will be relative to the WordPress root.
131
-
132
- <strong>Default:</strong> path to certificate file bundled with WordPress.'
133
- , WPRSS_TEXT_DOMAIN )
134
 
135
- );
136
- $help->add_tooltips( $tooltips, $prefix );
137
- }
 
1
  <?php
2
 
3
+ add_action( 'plugins_loaded', 'wprss_settings_add_tooltips', 11 );
4
+ function wprss_settings_add_tooltips() {
5
+ if( class_exists('WPRSS_Help') ) {
6
+ $help = WPRSS_Help::get_instance();
7
+
8
+ // Feed source setting fields
9
+ $prefix = 'setting-';
10
+ $tooltips = array(
11
+ /* -----------------
12
+ * General Section
13
+ * -----------------
14
+ */ // Limit feed items by age
15
+ 'limit-feed-items-by-age' => __( 'The maximum age allowed for feed items.
16
+ '. '<hr/>
17
+
18
+ '. 'Items already imported will be deleted if they eventually exceed this age limit.
19
+
20
+ '. 'Also, items in the RSS feed that are already older than this age will not be imported at all.
21
+ '. '<hr/>
22
+
23
+ '. '<em>Leave empty for no limit.</em>', WPRSS_TEXT_DOMAIN),
24
+ // Limit feed items per feed
25
+ 'limit-feed-items-imported' => __('The maximum number of imported items to keep stored, for feed sources that do not have their own limit.
26
+ '. '<hr/>
27
+
28
+ '. 'When new items are imported and the limit for a feed source is exceeded, the oldest feed items for that feed source will be deleted to make room for the new ones.
29
+
30
+ '. 'If you already have items imported from this feed source, setting this option now may delete some of your items, in order to comply with the limit.
31
+ '. '<hr/>
32
+
33
+ '. '<em>Use 0 or leave empty for no limit.</em>', WPRSS_TEXT_DOMAIN),
34
+ // Feed processing interval
35
+ 'cron-interval' => __('How frequently should the feed sources (that do not have their own update interval) check for updates and fetch items accordingly.
36
+
37
+ '. 'It is recommended to not have more than 20 feed sources that use this global update interval. Having too many feed sources updating precisely at the same time can cause the WP Cron System to crash.', WPRSS_TEXT_DOMAIN),
38
+ // Unique titles only
39
+ 'unique-titles' => __('Whether to allow multiple feed items to have the same title. When checked, if a feed item has the same title as a previously-imported feed item from any feed source, it will not be imported.
40
+
41
+ '. 'This can be useful in cases where permalinks change, or where multiple permalinks refer to the same item.
42
+
43
+ '. 'Since this feature requires checking every post title, WordPress installs with a significant amount of posts may notice a slight slowdown of the post import process.', WPRSS_TEXT_DOMAIN),
44
+ // Custom Feed URL
45
+ 'custom-feed-url' => __('The URL of the custom feed, located at <code>http://yoursite.com/[custom feed url]</code>.
46
+ '. '<hr/>
47
+
48
+ '. 'WP RSS Aggregator allows you to create a custom RSS feed, that contains all of your imported feed items. This setting allows you to change the URL of this custom feed.
49
+
50
+ '. '<hr/>
51
+
52
+ '. '<strong>Note:</strong> You may be required to refresh you Permalinks after you change this setting, by going to <em>Settings <i class="fa fa-angle-right"></i> Permalinks</e> and clicking <em>Save</em>.', WPRSS_TEXT_DOMAIN),
53
+ // Custom Feed Title
54
+ 'custom-feed-title' => __('The title of the custom feed.
55
+
56
+ '. 'This title will be included in the RSS source of the custom feed, in a <code>&lt;title&gt;</code> tag.', WPRSS_TEXT_DOMAIN),
57
+ // Custom Feed Limit
58
+ 'custom-feed-limit' => __('The maximum number of feed items in the custom feed.', WPRSS_TEXT_DOMAIN),
59
+
60
+ /* --------------------------
61
+ * General Display Settings
62
+ * --------------------------
63
+ */ // Link titles
64
+ 'link-enable' => __('Check this box to make the feed item titles link to the original article.', WPRSS_TEXT_DOMAIN),
65
+ // Title Maximum length
66
+ 'title-limit' => __('Set the maximum number of characters to show for feed item titles.
67
+ '. '<hr/>
68
+
69
+ '. '<em>Leave empty for no limit.</em>', WPRSS_TEXT_DOMAIN),
70
+ // Show Authors
71
+ 'authors-enable' => __('Check this box to show the author for each feed item, if it is available.', WPRSS_TEXT_DOMAIN),
72
+ // Video Links
73
+ 'video-links' => __('For feed items from YouTube, Vimeo or Dailymotion, you can choose whether you want to have the items link to the original page link, or a link to the embedded video player only.', WPRSS_TEXT_DOMAIN),
74
+ // Pagination Type
75
+ 'pagination' => __('The type of pagination to use when showing feed items on multiple pages.
76
+
77
+ '. 'The first shows two links, "Older" and "Newer", which allow you to navigate through the pages.
78
+
79
+ '. 'The second shows links for all the pages, together with links for the next and previous pages.', WPRSS_TEXT_DOMAIN),
80
+ // Feed Limit
81
+ 'feed-limit' => __('The maximum number of feed items to display when using the shortcode.
82
+
83
+ '. 'This enables pagination if set to a number smaller than the number of items to be displayed.', WPRSS_TEXT_DOMAIN),
84
+ // Open Links Behaviour
85
+ 'open-dd' => __('Choose how you want links to be opened. This applies to the feed item title and the source link.', WPRSS_TEXT_DOMAIN),
86
+ // Set links as no follow
87
+ 'follow-dd' => __('Enable this option to set all links displayed as "NoFollow".
88
+ '. '<hr/>
89
+
90
+ '. '"Nofollow" provides a way to tell search engines to <em>not</em> follow certain links, such as links to feed items in this case.', WPRSS_TEXT_DOMAIN),
91
+
92
+ /* -------------------------
93
+ * Source Display Settings
94
+ * -------------------------
95
+ */ // Source Enabled
96
+ 'source-enable' => __('Enable this option to show the feed source name for each feed item.', WPRSS_TEXT_DOMAIN),
97
+ // Text preceding source
98
+ 'text-preceding-source' => __('Enter the text that you want to show before the source name. A space is automatically added between this text and the feed source name.', WPRSS_TEXT_DOMAIN),
99
+ // Source Link
100
+ 'source-link' => __('Enable this option to link the feed source name to the RSS feed\'s source site.', WPRSS_TEXT_DOMAIN),
101
+
102
+ /* -------------------------
103
+ * Date Display Settings
104
+ * -------------------------
105
+ */ // Source Enabled
106
+ 'date-enable' => __('Enable this to show the feed item\'s date.', WPRSS_TEXT_DOMAIN),
107
+ // Text preceding date
108
+ 'text-preceding-date' => __('Enter the text that you want to show before the feed item date. A space is automatically added between this text and the date.', WPRSS_TEXT_DOMAIN),
109
+ // Date Format
110
+ 'date-format' => __('The format to use for the feed item dates, as a PHP date format.', WPRSS_TEXT_DOMAIN),
111
+ // Time Ago Format Enable
112
+ 'time-ago-format-enable' => __('Enable this option to show the elapsed time from the feed item\'s date and time to the present time.
113
+ '. '<em>Eg. 2 hours ago</em>', WPRSS_TEXT_DOMAIN),
114
+
115
+ /* --------
116
+ * Styles
117
+ * --------
118
+ */ // Styles Disable
119
+ 'styles-disable' => __('Check this box to disable all plugin styles used for displaying feed items.
120
+
121
+ '. 'This will allow you to provide your own custom CSS styles for displaying the feed items.', WPRSS_TEXT_DOMAIN),
122
 
123
+ /*
124
+ * -------
125
+ * Other
126
+ * -------
127
+ */ // Certificate Path
128
+ 'certificate-path' => __( 'Path to the file containing one or more certificates.
129
+
130
+ '. 'These will be used to verify certificates over secure connection, such as when fetching a remote resource over HTTPS.
131
+
132
+ '. 'Relative path will be relative to the WordPress root.
133
+
134
+ '. '<strong>Default:</strong> path to certificate file bundled with WordPress.', WPRSS_TEXT_DOMAIN )
 
135
 
136
+ );
137
+ $help->add_tooltips( $tooltips, $prefix );
138
+ }
139
+ }
includes/admin-welcome.php CHANGED
@@ -100,7 +100,7 @@
100
  <h3><?php _e( 'Check out our add-ons:', WPRSS_TEXT_DOMAIN ) ?></h3>
101
 
102
  <ul>
103
- <li><strong><a href="http://www.wprssaggregator.com/extension/feed-post/" target="wprss_ftp"><?php _e( 'Feed to Post', WPRSS_TEXT_DOMAIN ); ?></a></strong></li>
104
  <li><strong><a href="http://www.wprssaggregator.com/extension/excerpts-thumbnails/" target="wprss_et"><?php _e( 'Excerpts &amp; Thumbnails', WPRSS_TEXT_DOMAIN ); ?></a></strong></li>
105
  <li><strong><a href="http://www.wprssaggregator.com/extension/categories/" target="wprss_cat"><?php _e( 'Categories', WPRSS_TEXT_DOMAIN ); ?></a></strong></li>
106
  <li><strong><a href="http://www.wprssaggregator.com/extension/keyword-filtering/" target="wprss_kf"><?php _e( 'Keyword Filtering', WPRSS_TEXT_DOMAIN ); ?></a></strong></li>
100
  <h3><?php _e( 'Check out our add-ons:', WPRSS_TEXT_DOMAIN ) ?></h3>
101
 
102
  <ul>
103
+ <li><strong><a href="http://www.wprssaggregator.com/extension/feed-to-post/" target="wprss_ftp"><?php _e( 'Feed to Post', WPRSS_TEXT_DOMAIN ); ?></a></strong></li>
104
  <li><strong><a href="http://www.wprssaggregator.com/extension/excerpts-thumbnails/" target="wprss_et"><?php _e( 'Excerpts &amp; Thumbnails', WPRSS_TEXT_DOMAIN ); ?></a></strong></li>
105
  <li><strong><a href="http://www.wprssaggregator.com/extension/categories/" target="wprss_cat"><?php _e( 'Categories', WPRSS_TEXT_DOMAIN ); ?></a></strong></li>
106
  <li><strong><a href="http://www.wprssaggregator.com/extension/keyword-filtering/" target="wprss_kf"><?php _e( 'Keyword Filtering', WPRSS_TEXT_DOMAIN ); ?></a></strong></li>
includes/feed-importing.php CHANGED
@@ -9,6 +9,7 @@
9
  // Warning: Order may be important
10
  add_filter('wprss_normalize_permalink', 'wprss_google_news_url_fix', 8);
11
  add_filter('wprss_normalize_permalink', 'wprss_bing_news_url_fix', 9);
 
12
  add_filter('wprss_normalize_permalink', 'wprss_convert_video_permalink', 100);
13
 
14
 
@@ -322,6 +323,17 @@
322
  function wprss_google_news_url_fix($permalink) {
323
  return wprss_tracking_url_fix($permalink, '!^(https?:\/\/)?' . preg_quote('news.google.com', '!') . '.*!');
324
  }
 
 
 
 
 
 
 
 
 
 
 
325
 
326
 
327
  /**
9
  // Warning: Order may be important
10
  add_filter('wprss_normalize_permalink', 'wprss_google_news_url_fix', 8);
11
  add_filter('wprss_normalize_permalink', 'wprss_bing_news_url_fix', 9);
12
+ add_filter('wprss_normalize_permalink', 'wprss_google_alerts_url_fix', 10);
13
  add_filter('wprss_normalize_permalink', 'wprss_convert_video_permalink', 100);
14
 
15
 
323
  function wprss_google_news_url_fix($permalink) {
324
  return wprss_tracking_url_fix($permalink, '!^(https?:\/\/)?' . preg_quote('news.google.com', '!') . '.*!');
325
  }
326
+
327
+
328
+ /**
329
+ * Extracts the actual URL from a Google Alerts permalink
330
+ *
331
+ * @param string $permalink The permalink to normalize.
332
+ * @since 4.7.3
333
+ */
334
+ function wprss_google_alerts_url_fix($permalink) {
335
+ return wprss_tracking_url_fix($permalink, '!^(https?:\/\/)?(www\.)?' . preg_quote('google.com/url', '!') . '.*!');
336
+ }
337
 
338
 
339
  /**
includes/image-caching.php CHANGED
@@ -4,140 +4,618 @@
4
  * @since 4.6.10
5
  */
6
  class WPRSS_Image_Cache {
7
-
 
 
8
  protected $_download_request_timeout = 300;
9
-
 
 
 
 
10
  protected $_image_class_name = 'WPRSS_Image_Cache_Image';
11
  protected $_images = array();
12
-
13
  /**
14
  * @since 4.6.10
15
  */
16
  public function __construct() {
17
  }
18
-
19
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
  /**
21
  * @since 4.6.10
22
- * @param string $class_name
23
  * @return \WPRSS_Image_Cache This instance.
24
  */
25
  public function set_image_class_name( $class_name ) {
26
  $this->_image_class_name = $class_name;
27
  return $this;
28
  }
29
-
30
-
31
  /**
32
  * @since 4.6.10
33
- * @return string
34
  */
35
  public function get_image_class_name() {
36
  return trim($this->_image_class_name);
37
  }
38
-
39
-
40
  /**
41
  * @since 4.6.10
42
- * @param int $timeout
 
43
  * @return \WPRSS_Image_Cache This instance.
44
  */
45
  public function set_download_request_timeout( $timeout ) {
46
  $this->_download_request_timeout = intval( $timeout );
47
  return $this;
48
  }
49
-
50
-
51
  /**
52
  * @since 4.6.10
53
- * @return int
 
54
  */
55
  public function get_download_request_timeout() {
56
  return $this->_download_request_timeout;
57
  }
58
-
59
-
60
  /**
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
61
  * @since 4.6.10
62
  * @param string $url
63
- * @return \WPRSS_Image_Cache_Image
64
  * @throws Exception If class invalid, or not found
65
  */
66
- public function get_new_image( $url = null ) {
67
  $error_caption = 'Could not create new cache image';
68
  $class_name = $this->get_image_class_name();
69
  if ( empty( $class_name ) ) throw new Exception( sprintf( '%1$s: class name must not be empty' ) );
70
  if ( !class_exists( $class_name ) ) throw new Exception( sprintf( '%1$s: class "%2$s" does not exist', $class_name ) );
71
-
72
  $image = new $class_name();
73
  $this->_prepare_image( $image );
74
  /* @var $image WPRSS_Image_Cache_Image */
75
  if ( !is_null( $url ) ) $image->set_url( $url );
76
-
77
  return $image;
78
  }
79
-
80
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
81
  /**
82
  * @since 4.6.10
83
- * @param WPRSS_Image_Cache_Image $image
84
  */
85
  protected function _prepare_image( $image ) {
86
  $image->set_download_request_timeout( $this->get_download_request_timeout() );
 
87
  }
88
-
89
-
90
  /**
 
 
 
 
 
 
91
  * @since 4.6.10
92
  * @param string|null $url
93
- * @return array|WPRSS_Image_Cache_Image|\WP_Error
94
  */
95
  public function get_images( $url = null ) {
96
  if ( is_null( $url ) ) return $this->_images;
97
-
98
  // Gotta cache one
99
  if ( !isset( $this->_images[ $url ] ) ) {
100
- try {
101
- $image = $this->_download_image($url);
102
- } catch ( Exception $e ) {
103
- return new WP_Error( 'image_cache_cannot_download', $e->getMessage() );
104
- }
105
-
106
  $this->_images[ $url ] = $image;
107
  }
108
-
109
  return $this->_images[ $url ];
110
  }
111
-
112
-
113
  /**
 
 
114
  * @since 4.6.10
115
  * @return \WPRSS_Image_Cache This instance
116
  */
117
- public function purge() {
118
  $image_class_name = $this->get_image_class_name();
 
119
  foreach( $this->get_images() as $_url => $_image ) {
120
  /* @var $_image WPRSS_Image_Cache_Image */
121
- if ( is_a( $_image, $image_class_name ) )
122
- $_image->delete();
 
 
 
 
 
 
123
  }
124
-
125
  $this->_images = array();
126
- return $this;
127
  }
128
-
129
-
130
  /**
131
  * @since 4.6.10
132
  * @param string $url
133
  * @return WPRSS_Image_Cache_Image
134
  */
135
- protected function _download_image( $url ) {
136
- $image = $this->get_new_image( $url );
137
- $image->download();
138
-
139
  return $image;
140
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
141
  }
142
 
143
 
@@ -145,45 +623,60 @@ class WPRSS_Image_Cache {
145
  * @since 4.6.10
146
  */
147
  class WPRSS_Image_Cache_Image {
148
-
149
  protected $_url;
 
 
 
150
  protected $_local_path;
151
  protected $_unique_name;
152
  protected $_size;
153
  protected $_download_request_timeout;
154
  protected $_is_attempted;
155
  protected $_is_fall_back_to_unsecure;
156
-
157
-
 
 
 
158
  /**
159
  * @since 4.6.10
160
  * @param string|null $data
161
  */
162
  public function __construct( $data = null ) {
163
  $this->reset();
164
-
165
  if ( is_string( $data ) && !empty( $data ) )
166
  $this->_set_url( $data );
167
  }
168
-
169
-
170
  /**
 
 
 
171
  * @since 4.6.10
172
  * @return \WPRSS_Image_Cache_Image This instance.
173
  */
174
  public function reset() {
175
  $this->_url = null;
 
 
 
176
  $this->_local_path = null;
177
  $this->_unique_name = null;
178
  $this->_size = null;
179
  $this->_download_request_timeout = 300;
180
  $this->_is_attempted = false;
181
  $this->_is_fall_back_to_unsecure = true;
182
-
 
 
 
183
  return $this;
184
  }
185
-
186
-
187
  /**
188
  * @since 4.6.10
189
  * @param string $url
@@ -193,9 +686,12 @@ class WPRSS_Image_Cache_Image {
193
  $this->_url = $url;
194
  return $this;
195
  }
196
-
197
-
198
  /**
 
 
 
199
  * @since 4.6.10
200
  * @param string $url
201
  * @return \WPRSS_Image_Cache_Image This instance.
@@ -203,59 +699,227 @@ class WPRSS_Image_Cache_Image {
203
  public function set_url( $url ) {
204
  $this->reset();
205
  $this->_set_url($url);
206
-
207
  return $this;
208
  }
209
-
210
-
211
  /**
 
 
 
212
  * @since 4.6.10
213
- * @return string
214
  */
215
  public function get_url() {
216
  return $this->_url;
217
  }
218
-
219
-
220
  /**
 
 
221
  * @since 4.6.10
222
- * @return boolean
223
  */
224
  public function has_url() {
225
  return isset( $this->_url );
226
  }
227
-
228
-
 
 
 
 
 
 
229
  /**
230
  * @since 4.6.10
231
  * @param string $path
232
  * @return \WPRSS_Image_Cache_Image This instance.
233
  */
234
- protected function _set_local_path( $path ) {
235
- $this->_local_path = $path;
236
  return $this;
237
  }
238
-
239
-
240
  /**
 
 
 
 
 
 
241
  * @since 4.6.10
242
- * @return string
243
  */
244
- public function get_local_path() {
245
- return $this->_local_path;
246
  }
247
-
248
-
249
  /**
 
 
 
250
  * @since 4.6.10
251
  * @return boolean
252
  */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
253
  public function has_local_path() {
254
- return isset( $this->_local_path );
255
  }
256
-
257
-
258
  /**
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
259
  * @since 4.6.10
260
  * @param int $timeout
261
  * @return \WPRSS_Image_Cache_Image This instance.
@@ -264,17 +928,23 @@ class WPRSS_Image_Cache_Image {
264
  $this->_download_request_timeout = intval( $timeout );
265
  return $this;
266
  }
267
-
268
-
269
  /**
 
 
 
 
 
 
270
  * @since 4.6.10
271
  * @return int
272
  */
273
  public function get_download_request_timeout() {
274
  return $this->_download_request_timeout;
275
  }
276
-
277
-
278
  /**
279
  * @since 4.6.10
280
  * @param boolean|null $is_attempted
@@ -283,22 +953,31 @@ class WPRSS_Image_Cache_Image {
283
  protected function _is_attempted( $is_attempted = null ) {
284
  if ( is_null( $is_attempted ) )
285
  return (bool)$this->_is_attempted;
286
-
287
  $this->_is_attempted = (bool) $is_attempted;
288
  return $this;
289
  }
290
-
291
-
292
  /**
 
 
 
 
293
  * @since 4.6.10
294
- * @return boolean
295
  */
296
  public function is_attempted() {
297
  return $this->_is_attempted();
298
  }
299
-
300
-
301
  /**
 
 
 
 
 
302
  * @since 4.6.10
303
  * @param boolean|null $is_fall_back
304
  * @return \WPRSS_Image_Cache_Image|boolean Whether will fall back to unsecure, or this instance.
@@ -306,121 +985,269 @@ class WPRSS_Image_Cache_Image {
306
  public function is_fall_back_to_unsecure( $is_fall_back = null ) {
307
  if ( is_null( $is_fall_back ) )
308
  return (bool) $this->_is_fall_back_to_unsecure;
309
-
310
  $this->_is_fall_back_to_unsecure = (bool) $is_fall_back;
311
  return $this;
312
  }
313
-
314
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
315
  /**
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
316
  * @since 4.6.10
317
- * @return string {@see get_local_path()}
 
318
  * @throws Exception If no URL is set, or the resource is unreadable, or something went wrong.
319
  */
320
- public function download() {
321
- $error_caption = 'Could not download image';
322
- if ( !$this->has_url() ) throw new Exception ( sprintf( '%1$s: a URL must be supplied' ) );
323
-
324
- // Getting file download lib
325
- $file_lib_path = ABSPATH . 'wp-admin/includes/file.php';
326
- if ( !is_readable( $file_lib_path ) ) throw new Exception( sprintf( '%1$s: the file library cannot be read from %2$s', $error_caption, $file_lib_path ) );
327
- require_once( $file_lib_path );
328
-
329
- // Downloading the image
330
- $url = $this->get_url();
331
- $timeout = $this->get_download_request_timeout();
332
- $tmp_path = $this->_download( $url, $timeout );
333
- if ( is_wp_error( $tmp_path ) ) throw new Exception ( sprintf( '%1$s: %2$s', $error_caption, $tmp_path->get_error_message() ) );
334
- // wprss_log( sprintf( 'Image saved to "%1$s"', $tmp_path ), null, WPRSS_LOG_LEVEL_SYSTEM );
335
- $this->_set_local_path( $tmp_path );
336
-
337
- return $this->get_local_path();
338
  }
339
-
340
-
341
  /**
342
  * @since 4.6.10
343
  * @param string $url
344
  * @param int $timeout
345
- * @return string|WP_Error The local path to the downloaded image, if successful; an error instance if download failed.
346
  */
347
- protected function _download( $url, $timeout ) {
348
- // wprss_log( sprintf( 'Downloading from "%1$s"', $url ), null, WPRSS_LOG_LEVEL_SYSTEM );
349
- $tmp_path = download_url( $url, $timeout );
350
- if ( is_wp_error( $tmp_path ) ) {
 
 
351
  $https = 'https';
 
 
352
  if ( $this->is_fall_back_to_unsecure() && (stripos( $url, $https ) === 0) ) {
 
353
  $url = 'http' . substr( $url, strlen( $https ) );
354
- // wprss_log( sprintf( 'Downloading from "%1$s"', $url ), null, WPRSS_LOG_LEVEL_SYSTEM );
355
- $tmp_path = $this->_download( $url, $timeout );
 
356
  }
 
357
  }
358
-
359
  return $tmp_path;
360
  }
361
-
362
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
363
  /**
 
 
364
  * @since 4.6.10
365
  * @return \WPRSS_Image_Cache_Image This instance.
366
  */
367
  public function delete() {
368
- if ( $path = $this->get_local_path() ) {
369
- if ( file_exists( $path ) ) {
370
- unlink( $path );
371
- }
372
- }
373
-
374
- return $this;
375
  }
376
-
377
-
378
  /**
 
 
 
 
 
379
  * @since 4.6.10
380
- * @return string
381
  */
382
  public function get_unique_name() {
383
- if( !isset($this->_unique_name) ) {
384
- $url = $this->get_url();
385
- // Extract filename from url for title (ignoring query string)
386
- // One of more character that is not a '?', followed by an image extension
387
- preg_match( '/[^\?]+\.(jpg|JPG|jpe|JPE|jpeg|JPEG|gif|GIF|png|PNG)/', $url, $matches );
388
- $url_filename = basename( urldecode( $matches[0] ) );
389
- // Check for extension. If not found, use last component of the URL
390
- if ( !isset( $matches[1] ) ) {
391
- $matches = array();
392
- // Get the path to the image, without the domain. ex. /news/132456/image
393
- preg_match_all( '/[^:]+:\/\/[^\/]+\/(.+)/', $url, $matches );
394
- // If found
395
- if ( isset( $matches[1][0] ) ) {
396
- // Replace all '/' into '.' for the filename
397
- $url_filename = str_replace( '/', '-', $matches[1][0] );
398
- }
399
- // If not found
400
- else {
401
- // Use a random string as a fallback, with length of 16 characters
402
- $url_filename = wprss_ftp_generate_random_string( 16 );
403
- }
404
- }
405
- $this->_set_unique_name( $url_filename );
406
- }
407
-
408
  return $this->_unique_name;
409
  }
410
 
411
-
412
  /**
413
  * @since 4.6.10
414
- * @param string $name
415
  * @return \WPRSS_Image_Cache_Image This instance.
416
  */
417
  protected function _set_unique_name( $name ) {
418
  $this->_unique_name = $name;
419
  return $this;
420
  }
421
-
422
-
423
  /**
 
 
424
  * @since 4.6.10
425
  * @return array A numeric array, where index 0 holds image width, and index 1 holds image height.
426
  * @throws Exception If image file is unreadable.
@@ -428,15 +1255,15 @@ class WPRSS_Image_Cache_Image {
428
  public function get_size() {
429
  if ( !isset( $this->_size ) ) {
430
  $error_caption = 'Could not get image size';
431
- if ( !$this->is_readable() ) throw new Exception( sprintf( '%1$s: image file is not readable' ) );
432
  $path = $this->get_local_path();
433
-
 
434
  // Trying simplest way
435
  if ( $size = getimagesize( $path ) )
436
  $this->_size = array( 0 => $size[0], 1 => $size[1] );
437
-
438
  wprss_log( sprintf( 'Tried `getimagesize()`: %1$s', empty($this->_size) ? 'failure' : 'success' ), __METHOD__, WPRSS_LOG_LEVEL_SYSTEM );
439
-
440
  if( !$this->_size && function_exists( 'gd_info' ) ) {
441
  $image = file_get_contents( $path );
442
  $image = imagecreatefromstring( $image );
@@ -446,16 +1273,18 @@ class WPRSS_Image_Cache_Image {
446
  wprss_log( sprintf( 'Tried GD: %1$s', empty($this->_size) ? 'failure' : 'success' ), __METHOD__, WPRSS_LOG_LEVEL_SYSTEM );
447
  }
448
  }
449
-
450
  return $this->_size;
451
  }
452
-
453
-
454
  /**
455
  * @since 4.6.10
456
  * @return boolean
457
  */
458
  public function is_readable() {
459
- return is_readable( $this->get_local_path() );
 
 
460
  }
461
- }
4
  * @since 4.6.10
5
  */
6
  class WPRSS_Image_Cache {
7
+
8
+ protected static $_instance;
9
+
10
  protected $_download_request_timeout = 300;
11
+ /** @var string See {@see get_temp_dir() } */
12
+ protected $_temp_dir; // System temp dir + 'remote-image-cache'
13
+ protected $_current_time;
14
+ protected $_ttl = 30; // Time to live, in seconds
15
+
16
  protected $_image_class_name = 'WPRSS_Image_Cache_Image';
17
  protected $_images = array();
18
+
19
  /**
20
  * @since 4.6.10
21
  */
22
  public function __construct() {
23
  }
24
+
25
+
26
+ /**
27
+ * Retrieve the singleton instance of this class.
28
+ *
29
+ * @since 4.7.3
30
+ * @return WPRSS_Image_Cache
31
+ */
32
+ public static function instance() {
33
+ if ( is_null( self::$_instance ) )
34
+ self::$_instance = new self;
35
+
36
+ return self::$_instance;
37
+ }
38
+
39
+
40
  /**
41
  * @since 4.6.10
42
+ * @param string $class_name The name of the class, instances of which will represent image files.
43
  * @return \WPRSS_Image_Cache This instance.
44
  */
45
  public function set_image_class_name( $class_name ) {
46
  $this->_image_class_name = $class_name;
47
  return $this;
48
  }
49
+
50
+
51
  /**
52
  * @since 4.6.10
53
+ * @return string The name of the class, instances of which represent image files.
54
  */
55
  public function get_image_class_name() {
56
  return trim($this->_image_class_name);
57
  }
58
+
59
+
60
  /**
61
  * @since 4.6.10
62
+ * @param int $timeout The number of seconds, for which to wait until
63
+ * the remote resource can be considered timed out.
64
  * @return \WPRSS_Image_Cache This instance.
65
  */
66
  public function set_download_request_timeout( $timeout ) {
67
  $this->_download_request_timeout = intval( $timeout );
68
  return $this;
69
  }
70
+
71
+
72
  /**
73
  * @since 4.6.10
74
+ * @return int The number of seconds, for which the request will wait until
75
+ * the remote resource can be considered timed out.
76
  */
77
  public function get_download_request_timeout() {
78
  return $this->_download_request_timeout;
79
  }
80
+
81
+
82
  /**
83
+ * Get the unix timestamp, which represents the current moment in time.
84
+ *
85
+ * The cache expiration calculations will use this time to determine
86
+ * whether or not the cache for each resource is expired.
87
+ *
88
+ * @since 4.7.3
89
+ * @return int The unix timestamp, representing the current moment in time.
90
+ */
91
+ public function get_current_time() {
92
+ if ( !is_null( $this->_current_time ) )
93
+ return $this->_current_time;
94
+
95
+ return time();
96
+ }
97
+
98
+
99
+ /**
100
+ * Set the unix timestamp, which represents the current moment in time.
101
+ *
102
+ * The cache expiration calculations will use this time to determine
103
+ * whether or not the cache for each resource is expired.
104
+ *
105
+ * Use this to determine cache expiration for a moment in time other than now.
106
+ *
107
+ * @since 4.7.3
108
+ * @see normalize_time()
109
+ * @param int|null $time The unix timestamp, representing the current moment in time. If null, the current timestamp will be used.
110
+ * @return WPRSS_Image_Cache This instance.
111
+ */
112
+ public function set_current_time( $time = null ) {
113
+ if ( is_null( $time ) )
114
+ $time = time();
115
+
116
+ $time = $this->normalize_time( $time );
117
+
118
+ if ( is_int( $time ) || is_object( $time ) )
119
+ $this->_current_time = $time;
120
+
121
+ return $this;
122
+ }
123
+
124
+
125
+ /**
126
+ * Get the TTL (Time To Live) of cache files.
127
+ *
128
+ * This value will be used by default by all instances of cache files.
129
+ * If a file is older than this, it will be considered to be expired.
130
+ *
131
+ * @since 4.7.3
132
+ * @see set_ttl()
133
+ * @return int The number of seconds that represents the cache lifetime.
134
+ */
135
+ public function get_ttl() {
136
+ return $this->_ttl;
137
+ }
138
+
139
+
140
+ /**
141
+ * Set the TTL (Time To Live) of cache files.
142
+ *
143
+ * This value will be used by default by all instances of cache files.
144
+ * If a file is older than this, it will be considered to be expired.
145
+ *
146
+ * @since 4.7.3
147
+ * @see get_ttl()
148
+ * @see normalize_time()
149
+ * @param int|str $time A representation of the amount of seconds, for which the cache is considered valid.
150
+ * @return \WPRSS_Image_Cache
151
+ */
152
+ public function set_ttl( $time ) {
153
+ $time = $this->normalize_time( $time );
154
+ $this->_ttl = $time;
155
+
156
+ return $this;
157
+ }
158
+
159
+
160
+ /**
161
+ * Converts one of many representations of time into a Unix timestamp.
162
+ *
163
+ * Supports: An integer Unix timestamp, a string Unix timestamp, a value
164
+ * that ca be cast to integer, or a value that can be read by {@see strtotime}.
165
+ *
166
+ * @since 4.7.3
167
+ * @param int|string $time A representation of time.
168
+ * @return int The Unix timestamp that represents a moment in time.
169
+ */
170
+ public function normalize_time( $time ) {
171
+ if ( is_string( $time ) )
172
+ $time = is_numeric( $time )
173
+ ? intval( $time )
174
+ : (int) strtotime( $time );
175
+
176
+ return $time;
177
+ }
178
+
179
+
180
+ /**
181
+ * If given a cache file, a URL or a path, converts it into a path.
182
+ *
183
+ * @since 4.7.3
184
+ * @see WPRSS_Image_Cache_Image::get_current_path()
185
+ * @see is_valid_url()
186
+ * @see get_unique_filename()
187
+ * @param WPRSS_Image_Cache_Image|string $file An instance of a cache file, a URL, or path.
188
+ * @return string A relative path to a cache file.
189
+ */
190
+ public function normalize_path( $file ) {
191
+ if ( $file instanceof WPRSS_Image_Cache_Image )
192
+ $file = $file->get_current_path();
193
+
194
+ if ( $this->is_valid_url( $file ) )
195
+ $file = $this->get_unique_filename( $file );
196
+
197
+ return $file;
198
+ }
199
+
200
+
201
+ /**
202
+ * Create and retrieve an new instance of a cache file for the specified URL.
203
+ *
204
  * @since 4.6.10
205
  * @param string $url
206
+ * @return \WPRSS_Image_Cache_Image The instance of a new cache file.
207
  * @throws Exception If class invalid, or not found
208
  */
209
+ public function get_new_file( $url = null ) {
210
  $error_caption = 'Could not create new cache image';
211
  $class_name = $this->get_image_class_name();
212
  if ( empty( $class_name ) ) throw new Exception( sprintf( '%1$s: class name must not be empty' ) );
213
  if ( !class_exists( $class_name ) ) throw new Exception( sprintf( '%1$s: class "%2$s" does not exist', $class_name ) );
214
+
215
  $image = new $class_name();
216
  $this->_prepare_image( $image );
217
  /* @var $image WPRSS_Image_Cache_Image */
218
  if ( !is_null( $url ) ) $image->set_url( $url );
219
+
220
  return $image;
221
  }
222
+
223
+
224
+ /**
225
+ * Get a new instance of an image cache image, which points to the specified path.
226
+ *
227
+ * @param WPRSS_Image_Cache_Image|string $file An image cache instance, URL or path.
228
+ * @param boolean $must_exist Whether or not the image cache file must exist.
229
+ * @return WPRSS_Image_Cache_Image|null The new image cache instance if successful;
230
+ * null if $must_exist is true, and the image cache file does not exist.
231
+ */
232
+ public function get_new_file_from_path( $file, $must_exist = false ) {
233
+ $path = $this->normalize_path( $file );
234
+
235
+ if ( $must_exist && !$this->check_file_exists( $path ) )
236
+ return null;
237
+
238
+ $file = $this->get_new_file();
239
+ $file->set_path( $path );
240
+
241
+ return $file;
242
+ }
243
+
244
+
245
  /**
246
  * @since 4.6.10
247
+ * @param WPRSS_Image_Cache_Image $image A prepared instance of an image file.
248
  */
249
  protected function _prepare_image( $image ) {
250
  $image->set_download_request_timeout( $this->get_download_request_timeout() );
251
+ $image->set_ttl( $this->get_ttl() );
252
  }
253
+
254
+
255
  /**
256
+ * Get all the images that are managed by this cache instance,
257
+ * or just one instance that corresponds to a resource identified by the
258
+ * specified URL.
259
+ *
260
+ * If no instance exists yet, it will be created.
261
+ *
262
  * @since 4.6.10
263
  * @param string|null $url
264
+ * @return array|WPRSS_Image_Cache_Image
265
  */
266
  public function get_images( $url = null ) {
267
  if ( is_null( $url ) ) return $this->_images;
268
+
269
  // Gotta cache one
270
  if ( !isset( $this->_images[ $url ] ) ) {
271
+ $image = $this->_get_file( $url );
 
 
 
 
 
272
  $this->_images[ $url ] = $image;
273
  }
274
+
275
  return $this->_images[ $url ];
276
  }
277
+
278
+
279
  /**
280
+ * Delete the cache files for all resources that are managed by this instance.
281
+ *
282
  * @since 4.6.10
283
  * @return \WPRSS_Image_Cache This instance
284
  */
285
+ public function purge( $expired_only = true, $managed_only = true ) {
286
  $image_class_name = $this->get_image_class_name();
287
+ $deleted_count = 0;
288
  foreach( $this->get_images() as $_url => $_image ) {
289
  /* @var $_image WPRSS_Image_Cache_Image */
290
+ if ( is_a( $_image, $image_class_name ) ) {
291
+ $is_delete = $expired_only
292
+ ? $_image->check_expired()
293
+ : true;
294
+
295
+ if ( $is_delete )
296
+ $deleted_count += (int) $_image->delete();
297
+ }
298
  }
299
+
300
  $this->_images = array();
301
+ return $deleted_count;
302
  }
303
+
304
+
305
  /**
306
  * @since 4.6.10
307
  * @param string $url
308
  * @return WPRSS_Image_Cache_Image
309
  */
310
+ protected function _get_file( $url ) {
311
+ $image = $this->get_new_file( $url );
312
+ $image->retrieve();
313
+
314
  return $image;
315
  }
316
+
317
+
318
+ /**
319
+ * Checks whether or not the specified image exists.
320
+ *
321
+ * @since 4.7.3
322
+ * @param WPRSS_Image_Cache_Image|string $file An image instance, URL or file path.
323
+ * @return bool Whether or not the file of the specified image exists locally, and is readable.
324
+ */
325
+ public function check_file_exists( $file ) {
326
+ $file = $this->normalize_path( $file );
327
+ $file = $this->get_tmp_dir( $file );
328
+ return is_readable( $file );
329
+ }
330
+
331
+
332
+ /**
333
+ * Checks whether the file for a resource represented by the given
334
+ * file instance, URL or path has expired.
335
+ *
336
+ * If the file for the resource does not exist, it is considered to be expired.
337
+ *
338
+ * @since 4.7.3
339
+ * @see get_current_time()
340
+ * @see check_image_exists()
341
+ * @see get_expiration_time()
342
+ * @param WPRSS_Image_Cache_Image|string $image An image instance, URL or file path.
343
+ * @return bool Whether or not the cache of the specified image has expired.
344
+ */
345
+ public function check_image_expired( $image ) {
346
+ if ( !$this->check_file_exists( $image ) )
347
+ return true;
348
+ return $this->get_current_time() >= $this->get_expiration_time( $image );
349
+ }
350
+
351
+
352
+ /**
353
+ * Retrieve the time when the cache file for the specified resource will expire.
354
+ *
355
+ * @since 4.7.3
356
+ * @see get_ttl()
357
+ * @see get_file_modification_time()
358
+ * @param WPRSS_Image_Cache_Image|string $image Resource URL, cache file instance or path.
359
+ * @return int The Unix timestamp representing the moment in time when the
360
+ * cache for the specified resource will expire.
361
+ */
362
+ public function get_expiration_time( $image ) {
363
+ $mod_time = $this->get_image_modification_time( $image );
364
+
365
+ $ttl = $image instanceof WPRSS_Image_Cache_Image
366
+ ? $image->get_ttl()
367
+ : $this->get_ttl();
368
+
369
+ return (int) $mod_time + (int) $ttl;
370
+ }
371
+
372
+
373
+ /**
374
+ * Checks whether the specified URL is valid.
375
+ *
376
+ * Valid URLs must start with a protocol, even a relative one.
377
+ *
378
+ * @since 4.7.3
379
+ * @see wprss_validate_url()
380
+ * @param string $url A URL to validate.
381
+ * @return bool True if the specified string is a valud URL; false otherwize.
382
+ */
383
+ public function is_valid_url( $url ) {
384
+ $url = trim( $url );
385
+ $protocol_regex = '^([a-z][\w-]+:)?//';
386
+ return !is_object() && preg_match( $protocol_regex, $url ) && wprss_validate_url( $url );
387
+ }
388
+
389
+
390
+ /**
391
+ * Gets the modification time of the cache file for the specified resource.
392
+ *
393
+ * @since 4.7.3
394
+ * @todo Maybe fix in accordance with {@link http://php.net/manual/en/function.filemtime.php#100692 this bug}.
395
+ * @see normalize_path()
396
+ * @see get_tmp_dir()
397
+ * @see filemtime()
398
+ * @param WPRSS_Image_Cache_Image|string $image Resource URL, cache file instance or path.
399
+ * @return int|null The Unix timestamp representing the time of file modification. Null if cannot be retrieved.
400
+ */
401
+ public function get_image_modification_time( $image ) {
402
+ $path = $this->normalize_path( $image );
403
+ $path = $this->get_tmp_dir( $path );
404
+ $mod_time = @filemtime( $path );
405
+
406
+ return $mod_time
407
+ ? intval( $mod_time )
408
+ : null;
409
+ }
410
+
411
+
412
+ /**
413
+ * Get the path to the root directory of cache files.
414
+ *
415
+ * Optionally, another path can be appended.
416
+ *
417
+ * @since 4.7.3
418
+ * @see trailingslashit()
419
+ * @see get_temp_dir()
420
+ * @param string|null $path If specified, will be appended to the resulting path.
421
+ * @return string A path to the temporary directory, or a file in it. If the primer, it will have a trailing slash.
422
+ */
423
+ public function get_tmp_dir( $path = null ) {
424
+ if ( is_null( $this->_temp_dir ) )
425
+ $this->_temp_dir = trailingslashit( get_temp_dir() ) . 'remote-image-cache';
426
+
427
+ $temp_dir = apply_filters( 'wprss_image_cache_temp_dir', $this->_temp_dir );
428
+ return ( is_null( $path ) )
429
+ ? $temp_dir
430
+ : trailingslashit( $temp_dir ) . $path;
431
+ }
432
+
433
+
434
+ /**
435
+ * Downloads a resource identified by the parameters.
436
+ *
437
+ * If only the first parameter is passed, and it is an instance of a cache
438
+ * file, downloads the resource described by it.
439
+ * If it is a URL, the request timeout and target path will be computed by this instance.
440
+ * Otherwise, they will be overridden by the specified values, respectively.
441
+ *
442
+ * If the 'content-md5' header is present in the responce, MD5 checksum
443
+ * verification will take place.
444
+ *
445
+ * @since 4.7.3
446
+ * @see get_download_request_timeout()
447
+ * @see WPRSS_Image_Cache_Image::get_download_request_timeout()
448
+ * @see get_unique_filename()
449
+ * @see WPRSS_Image_Cache_Image::get_current_path()
450
+ * @see get_tmp_dir()
451
+ * @see wp_mkdir_p()
452
+ * @see wp_safe_remote_get()
453
+ * @see verify_file_md5()
454
+ * @param WPRSS_Image_Cache_Image|string $image An instance of a cache file, or the URL to download.
455
+ * @param int|null $request_timeout The timeout for the download request.
456
+ * @param string|null $target_path The relative path to the target file.
457
+ * @return string| The absolute local path to the downloaded file,
458
+ * or false if checksum verification failed.
459
+ * @throws Exception If the URL is invalid, or the destination path is not writable,
460
+ * or the file download library cannot be read, or any other error happens during download.
461
+ */
462
+ public function download_image( $image, $request_timeout = null, $target_path = null ) {
463
+ if ( $image instanceof WPRSS_Image_Cache_Image ) {
464
+ $url = $image->get_url();
465
+ $timeout = $image->get_download_request_timeout();
466
+ $path = $image->get_current_path();
467
+ }
468
+ else {
469
+ $url = $image;
470
+ $timeout = $this->get_download_request_timeout();
471
+ $path = $this->get_unique_filename( $url );
472
+ }
473
+
474
+ if ( !$url )
475
+ throw new Exception( sprintf( __( 'Invalid URL provided: "%1$s"' ), $url ) );
476
+
477
+ if ( !is_null( $target_path ) )
478
+ $path = $target_path;
479
+
480
+ if ( is_null( $request_timeout ) )
481
+ $timeout = $request_timeout;
482
+
483
+ // Absolute path to the cache file
484
+ $tmpfname = $image instanceof WPRSS_Image_Cache_Image
485
+ ? $image->get_tmp_dir( $path )
486
+ : $this->get_tmp_dir( $path );
487
+
488
+ //WARNING: The file is not automatically deleted, The script must unlink() the file.
489
+ $dirname = dirname( $tmpfname );
490
+ if ( !wp_mkdir_p( $dirname ) )
491
+ throw new Exception( sprintf( __( 'Could not create directory: "%1$s". Filename: "%2$s"' ), $dirname, $tmpfname ) );
492
+
493
+
494
+ // Getting file download lib
495
+ $file_lib_path = ABSPATH . 'wp-admin/includes/file.php';
496
+ if ( !is_readable( $file_lib_path ) )
497
+ throw new Exception( sprintf( __( 'The file library cannot be read from %1$s' ), $file_lib_path ) );
498
+
499
+ require_once( $file_lib_path );
500
+
501
+ // Retrieving the remote resource
502
+ $response = wp_safe_remote_get( $url, array( 'timeout' => $timeout, 'stream' => true, 'filename' => $tmpfname ) );
503
+
504
+ // Could not retrieve
505
+ if ( is_wp_error( $response ) ) {
506
+ @unlink( $tmpfname );
507
+ throw new Exception( $response->get_error_message() );
508
+ }
509
+
510
+ // Retrieved, but remote server served error instead of resource
511
+ if ( 200 != wp_remote_retrieve_response_code( $response ) ){
512
+ @unlink( $tmpfname );
513
+ throw new Exception( trim( wp_remote_retrieve_response_message( $response ) ) );
514
+ }
515
+
516
+ // Checksum verification
517
+ $content_md5 = wp_remote_retrieve_header( $response, 'content-md5' );
518
+ if ( $content_md5 ) {
519
+ $md5_check = verify_file_md5( $tmpfname, $content_md5 );
520
+ if ( is_wp_error( $md5_check ) ) {
521
+ unlink( $tmpfname );
522
+ return $md5_check;
523
+ }
524
+ }
525
+
526
+ return $tmpfname;
527
+ }
528
+
529
+
530
+ /**
531
+ * Uses one of the registered hashing functions to hash the given value.
532
+ *
533
+ * The default functions that will be tried are {@see sha1()} and {@see md5()}
534
+ * in that order. More can be added using the `wprss_image_cache_hash_functions`
535
+ * filter.
536
+ *
537
+ * @since 4.7.3
538
+ * @param mixed $value The value to hash.
539
+ * @param null|mixed $default The value to return if none of the registered caching functions exist.
540
+ * @return string The hash string.
541
+ */
542
+ public function hash( $value, $default = null ) {
543
+ $hash_funcs = apply_filters( 'wprss_image_cache_hash_functions', array( 'sha1', 'md5' ) );
544
+ foreach ( $hash_funcs as $_idx => $_func )
545
+ if ( is_callable( $_func ) )
546
+ return call_user_func_array ( $_func, array( $url_filename ) );
547
+
548
+ return $default;
549
+ }
550
+
551
+
552
+ /**
553
+ * Get a local relative path to for a remote resource, based on it's URL.
554
+ *
555
+ * @since 4.7.3
556
+ * @see generate_unique_file_name()
557
+ * @param WPRSS_Image_Cache_Image|string $url An instance of a cache file, or a URL of a resource.
558
+ * @return string|null A relative path to a cache file. If URL is empty, null is returned.
559
+ */
560
+ public function get_unique_filename( $url ) {
561
+ if ( $url instanceof WPRSS_Image_Cache_Image )
562
+ $url = $url->get_url();
563
+
564
+ return $this->generate_unique_file_name( $url );
565
+ }
566
+
567
+
568
+ /**
569
+ * Get a local relative path to for a remote URL.
570
+ *
571
+ * If the resource is identified by a URL with a relative protocol,
572
+ * the protocol will be completely ignored.
573
+ *
574
+ * @since 4.7.3
575
+ * @param string $url A remote resource URL.
576
+ * @return string A local relative path to the file for the remote resource.
577
+ * The path may contain several folders, and will be of format:
578
+ * [domain inc. subdomain][path to resource][resource name without extension]-[hash of the whole URL][optionally the extension]
579
+ */
580
+ public function generate_unique_file_name( $url ) {
581
+ if ( !strlen( $url ) )
582
+ return null;
583
+
584
+ // In case the URL is specified with a relative protocol
585
+ $url = ltrim( $url, '/' );
586
+
587
+ // Extract filename from url for title (ignoring query string)
588
+ // One of more character that is not a '?', followed by an image extension
589
+ preg_match( '/[^\?]+\.(jpg|JPG|jpeg|JPEG|jpe|JPE|gif|GIF|png|PNG)/', $url, $ext_matches );
590
+ $extension = isset( $ext_matches[1] ) ? $ext_matches[1] : null;
591
+ $url_filename = basename( urldecode( $ext_matches[0] ) );
592
+
593
+ // Get the path to the image, without the domain. ex. /news/132456/image
594
+ $path_matches = array();
595
+ if ( !preg_match_all( '![^:]+://([^/]+)/([^\?]+)!', $url, $path_matches ) )
596
+ return null;
597
+
598
+ $path = isset( $path_matches[2][0] ) ? $path_matches[2][0] : null;
599
+ $domain = isset( $path_matches[1][0] ) ? $path_matches[1][0] : null;
600
+
601
+ $unique_filename = str_replace( '/', '-', $path );
602
+
603
+ $base_filename = $extension
604
+ ? basename( $url_filename, '.' . $extension )
605
+ : $url_filename;
606
+
607
+ if ( $hash = self::hash( $url ) )
608
+ $base_filename = $base_filename . '-' .$hash;
609
+
610
+ if ( !is_null( $extension ) )
611
+ $base_filename .= '.' . $extension;
612
+
613
+ $path = trailingslashit( substr( $path, 0, strlen( $path ) - strlen( $url_filename ) ) );
614
+ $path = trailingslashit( $domain ) . $path;
615
+ $unique_filename = $path . $base_filename;
616
+
617
+ return $unique_filename;
618
+ }
619
  }
620
 
621
 
623
  * @since 4.6.10
624
  */
625
  class WPRSS_Image_Cache_Image {
626
+
627
  protected $_url;
628
+ protected $_path;
629
+ protected $_tmp_path;
630
+ protected $_tmp_dir;
631
  protected $_local_path;
632
  protected $_unique_name;
633
  protected $_size;
634
  protected $_download_request_timeout;
635
  protected $_is_attempted;
636
  protected $_is_fall_back_to_unsecure;
637
+ protected $_ttl;
638
+ protected $_cache;
639
+ protected $_is_cached;
640
+
641
+
642
  /**
643
  * @since 4.6.10
644
  * @param string|null $data
645
  */
646
  public function __construct( $data = null ) {
647
  $this->reset();
648
+
649
  if ( is_string( $data ) && !empty( $data ) )
650
  $this->_set_url( $data );
651
  }
652
+
653
+
654
  /**
655
+ * Brings all properties of this instance to their original values,
656
+ * making it re-usable.
657
+ *
658
  * @since 4.6.10
659
  * @return \WPRSS_Image_Cache_Image This instance.
660
  */
661
  public function reset() {
662
  $this->_url = null;
663
+ $this->_path = null;
664
+ $this->_tmp_path = null;
665
+ $this->_tmp_dir = null;
666
  $this->_local_path = null;
667
  $this->_unique_name = null;
668
  $this->_size = null;
669
  $this->_download_request_timeout = 300;
670
  $this->_is_attempted = false;
671
  $this->_is_fall_back_to_unsecure = true;
672
+ $this->_ttl;
673
+ $this->_cache = null;
674
+ $this->_is_cached = null;
675
+
676
  return $this;
677
  }
678
+
679
+
680
  /**
681
  * @since 4.6.10
682
  * @param string $url
686
  $this->_url = $url;
687
  return $this;
688
  }
689
+
690
+
691
  /**
692
+ * Sets the URL of the remote resource, which this instance represents
693
+ * the cache of.
694
+ *
695
  * @since 4.6.10
696
  * @param string $url
697
  * @return \WPRSS_Image_Cache_Image This instance.
699
  public function set_url( $url ) {
700
  $this->reset();
701
  $this->_set_url($url);
702
+
703
  return $this;
704
  }
705
+
706
+
707
  /**
708
+ * Retrieves the URL of the remove resource, which this instance represents
709
+ * the cache of.
710
+ *
711
  * @since 4.6.10
712
+ * @return string The URL.
713
  */
714
  public function get_url() {
715
  return $this->_url;
716
  }
717
+
718
+
719
  /**
720
+ * Whether or not this instance has a URL assigned.
721
+ *
722
  * @since 4.6.10
723
+ * @return boolean True if this instance has a URL assigned; false otherwise.
724
  */
725
  public function has_url() {
726
  return isset( $this->_url );
727
  }
728
+
729
+
730
+ public function set_path( $path ) {
731
+ $this->_set_path( $path );
732
+ return $this;
733
+ }
734
+
735
+
736
  /**
737
  * @since 4.6.10
738
  * @param string $path
739
  * @return \WPRSS_Image_Cache_Image This instance.
740
  */
741
+ protected function _set_path( $path ) {
742
+ $this->_path = $path;
743
  return $this;
744
  }
745
+
746
+
747
  /**
748
+ * Get the path to the cache file.
749
+ *
750
+ * The path is relative to the root of the cache directory.
751
+ * It will only be set if the cache file is not expired, or has been
752
+ * successfully downloaded.
753
+ *
754
  * @since 4.6.10
755
+ * @return string Relative path to the cache file.
756
  */
757
+ public function get_path() {
758
+ return $this->_path;
759
  }
760
+
761
+
762
  /**
763
+ * Whether or not this instance has a local path assigned.
764
+ *
765
+ * @see get_path().
766
  * @since 4.6.10
767
  * @return boolean
768
  */
769
+ public function has_path() {
770
+ return isset( $this->_path );
771
+ }
772
+
773
+
774
+ /**
775
+ * Get the local absolute path to the cache file.
776
+ *
777
+ * If local path has not yet been set, e.g. before the download of an
778
+ * expired file, this will return the absolute path to where the file
779
+ * would be after download.
780
+ *
781
+ * If the file is retrieved from cache, no local path is set explicitly,
782
+ * but this method will retrieve it's location regardless.
783
+ *
784
+ * @see get_current_path()
785
+ * @see get_tmp_dir()
786
+ * @see has_local_path()
787
+ * @since 4.7.3
788
+ * @return string Absolute path to the cache file.
789
+ */
790
+ public function get_local_path() {
791
+ if ( !is_null( $this->_local_path ) )
792
+ return $this->_local_path;
793
+
794
+ return $this->get_tmp_dir( $this->get_current_path() );
795
+ }
796
+
797
+
798
+ /**
799
+ * @since 4.7.3
800
+ * @param string $path The absolute path to the cache file.
801
+ * @return \WPRSS_Image_Cache_Image This instance.
802
+ */
803
+ protected function _set_local_path( $path ) {
804
+ $this->_local_path = $path;
805
+ return $this;
806
+ }
807
+
808
+
809
+ /**
810
+ * Whether or not the local path has been set.
811
+ *
812
+ * This usually happens after the successful download of an expired file.
813
+ *
814
+ * @see get_local_path()
815
+ * @since 4.7.3
816
+ * @return bool True if the local absolute path has been set; false otherwise.
817
+ */
818
  public function has_local_path() {
819
+ return !is_null( $this->_local_path );
820
  }
821
+
822
+
823
  /**
824
+ * Whether or not the file was retrieved from cache, if attempted to retrieve.
825
+ * Before retrieval attempt, indicates whether or not the file cache has expired.
826
+ *
827
+ * @see is_attempted()
828
+ * @see check_expired()
829
+ * @since 4.7.3
830
+ * @return bool True if file was retrieved or retrievable from cache; false otherwise.
831
+ */
832
+ public function is_cached() {
833
+ return $this->is_attempted()
834
+ ? $this->_is_cached()
835
+ : !$this->check_expired();
836
+ }
837
+
838
+
839
+ /**
840
+ *
841
+ * @since 4.7.3
842
+ * @param null|bool $is_cached If not null, will set whether or not the resource is cached.
843
+ * Otherwise, will retrieve that value
844
+ * @return \WPRSS_Image_Cache_Image|bool This instance, if setting, or the value if retrieving.
845
+ */
846
+ protected function _is_cached( $is_cached = null ) {
847
+ if ( is_null( $is_cached ) )
848
+ return $this->_is_cached;
849
+
850
+ $this->_is_cached = (bool) $is_cached;
851
+ return $this;
852
+ }
853
+
854
+
855
+ /**
856
+ * Get an instance of this image's cache controller, if set.
857
+ * Otherwise, get the singleton instance of {@see WPRSS_Image_Cache}.
858
+ *
859
+ * @since 4.7.3
860
+ * @return WPRSS_Image_Cache The instance of this image's cache controller.
861
+ */
862
+ public function get_cache() {
863
+ if ( is_null( $this->_cache ) )
864
+ return WPRSS_Image_Cache::instance();
865
+
866
+ return $this->_cache;
867
+ }
868
+
869
+
870
+ /**
871
+ * Set the temporary path to this image's file.
872
+ *
873
+ * @since 4.7.3
874
+ * @param string $path
875
+ * @return \WPRSS_Image_Cache_Image This instance.
876
+ */
877
+ protected function _set_tmp_path( $path = null ) {
878
+ if ( is_null( $path ) )
879
+ $path = $this->get_tmp_path();
880
+
881
+ $this->_tmp_path = $path;
882
+ return $this;
883
+ }
884
+
885
+
886
+ /**
887
+ * Retrieve the temporary path to this image's file, which is used for
888
+ * working with it. This may not be the final path.
889
+ *
890
+ * @see get_unique_name()
891
+ * @since 4.7.3
892
+ * @return string The path.
893
+ */
894
+ public function get_tmp_path() {
895
+ if ( !is_null( $this->_tmp_path ) )
896
+ return $this->_tmp_path;
897
+
898
+ return $this->get_unique_name();
899
+ }
900
+
901
+
902
+ /**
903
+ * The current path to the image's file.
904
+ * Used from outside the class for working with this image's file
905
+ * while it is not yet ready.
906
+ *
907
+ * @see get_path()
908
+ * @see get_tmp_path()
909
+ * @since 4.7.3
910
+ * @return string The path.
911
+ */
912
+ public function get_current_path() {
913
+ return !is_null( $path = $this->get_path() )
914
+ ? $path
915
+ : $this->get_tmp_path();
916
+ }
917
+
918
+
919
+ /**
920
+ * Sets the download request timeout.
921
+ *
922
+ * @see get_download_request_timeout()
923
  * @since 4.6.10
924
  * @param int $timeout
925
  * @return \WPRSS_Image_Cache_Image This instance.
928
  $this->_download_request_timeout = intval( $timeout );
929
  return $this;
930
  }
931
+
932
+
933
  /**
934
+ * Gets the download request timeout.
935
+ *
936
+ * This is the maximal number of seconds, for which the request will
937
+ * wait before terminating with a timeout.
938
+ *
939
+ * @see set_download_request_timeout()
940
  * @since 4.6.10
941
  * @return int
942
  */
943
  public function get_download_request_timeout() {
944
  return $this->_download_request_timeout;
945
  }
946
+
947
+
948
  /**
949
  * @since 4.6.10
950
  * @param boolean|null $is_attempted
953
  protected function _is_attempted( $is_attempted = null ) {
954
  if ( is_null( $is_attempted ) )
955
  return (bool)$this->_is_attempted;
956
+
957
  $this->_is_attempted = (bool) $is_attempted;
958
  return $this;
959
  }
960
+
961
+
962
  /**
963
+ * Whether or not the retrieval of the corresponding resource, e.g. file
964
+ * download, has been attempted.
965
+ *
966
+ * @see download()
967
  * @since 4.6.10
968
+ * @return boolean True if retrieval of this resource was attempted; false otherwise.
969
  */
970
  public function is_attempted() {
971
  return $this->_is_attempted();
972
  }
973
+
974
+
975
  /**
976
+ * Gets or sets whether this instance should fall back to an unsecure connection,
977
+ * e.g. try the HTTP protocol, if retrieval of the resource over the secure protocol,
978
+ * e.g. HTTPS, fails.
979
+ *
980
+ * @see download()
981
  * @since 4.6.10
982
  * @param boolean|null $is_fall_back
983
  * @return \WPRSS_Image_Cache_Image|boolean Whether will fall back to unsecure, or this instance.
985
  public function is_fall_back_to_unsecure( $is_fall_back = null ) {
986
  if ( is_null( $is_fall_back ) )
987
  return (bool) $this->_is_fall_back_to_unsecure;
988
+
989
  $this->_is_fall_back_to_unsecure = (bool) $is_fall_back;
990
  return $this;
991
  }
992
+
993
+
994
+ /**
995
+ * Retrieves the TTL (Time To Live) for the corresponding resource's cache.
996
+ *
997
+ * Falls back to the cache controller's value, if not set.
998
+ *
999
+ * @see WPRSS_Image_Cache::get_ttl()
1000
+ * @see get_ttl()
1001
+ * @since 4.7.3
1002
+ * @return int The amount of seconds, for which the cache file may be considered valid.
1003
+ */
1004
+ public function get_ttl() {
1005
+ return !is_null( $this->_ttl )
1006
+ ? $this->_ttl
1007
+ : $this->get_cache()->get_ttl();
1008
+ }
1009
+
1010
+
1011
+ /**
1012
+ * Sets the TTL (Time To Live) for the corresponding resource's cache.
1013
+ *
1014
+ * @see get_ttl()
1015
+ * @since 4.7.3
1016
+ * @param int $time The amount of seconds, for which the cache file should be considered valid.
1017
+ */
1018
+ public function set_ttl( $time ) {
1019
+ $this->_ttl = $this->normalize_time( $time );
1020
+ }
1021
+
1022
+
1023
+ /**
1024
+ * Normalizes a time value.
1025
+ *
1026
+ * This is done by converting one of a variety of representations of time
1027
+ * into a Unix timestamp.
1028
+ *
1029
+ * @see WPRSS_Image_Cache::normalize_time()
1030
+ * @since 4.7.3
1031
+ * @param string|int $time A representation of a moment in time.
1032
+ * @return int A timestamp.
1033
+ */
1034
+ public function normalize_time( $time ) {
1035
+ return $this->get_cache()->normalize_time( $time );
1036
+ }
1037
+
1038
+
1039
+ /**
1040
+ * Retrieves the path to the directory, where the cache file is or will be stored.
1041
+ *
1042
+ * If not set explicitly, falls back to the cache controller's path.
1043
+ * Optionally, can be appended with another path.
1044
+ *
1045
+ * @see WPRSS_Image_Cache::get_tmp_dir()
1046
+ * @since 4.7.3
1047
+ * @param null|string $path A path to append to the cache directory path.
1048
+ * @return string The path to the cache directory, optionally appended with the specified path.
1049
+ * It will not contain the trailing directory separator, but if appended with another path, the separator will be put in between them.
1050
+ */
1051
+ public function get_tmp_dir( $path = null ) {
1052
+ if ( !is_null( $this->_tmp_dir ) )
1053
+ return is_null( $path )
1054
+ ? $this->_tmp_dir
1055
+ : trailingslashit( $this->_tmp_dir ) . $path;
1056
+
1057
+ return $this->get_cache()->get_tmp_dir( $path );
1058
+ }
1059
+
1060
+
1061
  /**
1062
+ * Retrieves the resource identified by this instance's URL.
1063
+ *
1064
+ * If the resource is cached, and the cache is not expired, the resource
1065
+ * will be retrieved from cache.
1066
+ *
1067
+ * @see download()
1068
+ * @since 4.7.3
1069
+ * @return string The path to the resource's cache file.
1070
+ */
1071
+ public function retrieve() {
1072
+ // Prepare image
1073
+ $this->_is_attempted( true )
1074
+ ->_set_path( null )
1075
+ ->_set_local_path( null );
1076
+ $relative_path = $this->get_current_path();
1077
+
1078
+ // Cache still valid
1079
+ if ( !$this->check_expired() ) {
1080
+ $this->_set_path ( $relative_path )
1081
+ ->_is_cached( true );
1082
+ return $this->get_local_path();
1083
+ }
1084
+
1085
+ $local_path = $this->_retrieve();
1086
+ $this->_set_path( $relative_path );
1087
+ $this->_set_local_path( $local_path );
1088
+ $this->_is_cached( false );
1089
+
1090
+ return $this->get_local_path();
1091
+ }
1092
+
1093
+
1094
+ /**
1095
+ * An internal method that does just the actual retrieval of the resource.
1096
+ *
1097
+ * @since 4.7.3
1098
+ * @return string The absolute local path to the retrieved file.
1099
+ * @throws Exception If the file cannot be retrieved, due to read or write errors of some kind.
1100
+ */
1101
+ protected function _retrieve() {
1102
+ return $this->download();
1103
+ }
1104
+
1105
+
1106
+ /**
1107
+ * Downloads a file.
1108
+ *
1109
+ * @see get_url()
1110
+ * @see get_local_path()
1111
  * @since 4.6.10
1112
+ * @param string|null $url The URL of the file to download. If null, the URL used is that of this instance.
1113
+ * @return string The absolute local path to the downloaded file.
1114
  * @throws Exception If no URL is set, or the resource is unreadable, or something went wrong.
1115
  */
1116
+ public function download( $url = null ) {
1117
+ if ( !is_null( $url ) )
1118
+ $this->set_url( $url );
1119
+
1120
+ // Downloading the file
1121
+ $tmp_path = $this->_download();
1122
+
1123
+ return $tmp_path;
 
 
 
 
 
 
 
 
 
 
1124
  }
1125
+
1126
+
1127
  /**
1128
  * @since 4.6.10
1129
  * @param string $url
1130
  * @param int $timeout
1131
+ * @return string The local path to the downloaded image, if successful; an error instance if download failed.
1132
  */
1133
+ protected function _download() {
1134
+ $cache = $this->get_cache();
1135
+
1136
+ try {
1137
+ $tmp_path = $cache->download_image( $this );
1138
+ } catch ( Exception $e ) {
1139
  $https = 'https';
1140
+ $url = $this->get_url();
1141
+ // Should we try unsecure protocol?
1142
  if ( $this->is_fall_back_to_unsecure() && (stripos( $url, $https ) === 0) ) {
1143
+ $orig_url = $url;
1144
  $url = 'http' . substr( $url, strlen( $https ) );
1145
+ $this->set_url( $url );
1146
+ $tmp_path = $cache->download_image( $this );
1147
+ $this->set_url( $orig_url );
1148
  }
1149
+ else throw $e;
1150
  }
1151
+
1152
  return $tmp_path;
1153
  }
1154
+
1155
+
1156
+ /**
1157
+ * Retrieves the time, at which the cache file was last modified.
1158
+ *
1159
+ * @since 4.7.3
1160
+ * @return int|null The timestamp that represents the time when the cache file was last modified on success;
1161
+ * null if timestamp could not be retrieved.
1162
+ */
1163
+ public function get_modification_time() {
1164
+ return $this->get_cache()->get_image_modification_time( $this );
1165
+ }
1166
+
1167
+
1168
+ /**
1169
+ * Checks whether or not the cache file exists.
1170
+ *
1171
+ * @since 4.7.3
1172
+ * @return bool True if the cache file exists; false otherwise.
1173
+ */
1174
+ public function check_exists() {
1175
+ return $this->get_cache()->check_file_exists( $this );
1176
+ }
1177
+
1178
+
1179
+ /**
1180
+ * Checks whether or not the cache file has expired.
1181
+ *
1182
+ * @see get_ttl()
1183
+ * @see WPRSS_Image_Cache::check_image_expired()
1184
+ * @since 4.7.3
1185
+ * @return bool True if the cache file has expired; false otherwise.
1186
+ */
1187
+ public function check_expired() {
1188
+ return $this->get_cache()->check_image_expired( $this );
1189
+ }
1190
+
1191
+
1192
+ /**
1193
+ * Get the time, at which the cache file of this instance will expire.
1194
+ *
1195
+ * @since 4.7.3
1196
+ * @see WPRSS_Image_Cache::get_expiration_time()
1197
+ * @return int Unix timestamp representing the time when the cache file of this instance will expire.
1198
+ * If file doesn't exist, or it's modification date cannot be retrieved, will return 0.
1199
+ */
1200
+ public function get_expiration_time() {
1201
+ return $this->get_cache()->get_expiration_time( $this );
1202
+ }
1203
+
1204
+
1205
  /**
1206
+ * Deletes the cache file of this instance.
1207
+ *
1208
  * @since 4.6.10
1209
  * @return \WPRSS_Image_Cache_Image This instance.
1210
  */
1211
  public function delete() {
1212
+ if ( $path = $this->get_path() )
1213
+ if ( file_exists( $path ) )
1214
+ return @unlink( $path );
1215
+
1216
+ return false;
 
 
1217
  }
1218
+
1219
+
1220
  /**
1221
+ * Generates and stores for subsequent use a filename, which is unique for this instance's URL.
1222
+ *
1223
+ * This file name is relative to the base directory of cache.
1224
+ *
1225
+ * @see get_tmp_dir().
1226
  * @since 4.6.10
1227
+ * @return string A unique name for a local cache file, based on the URL of the resource.
1228
  */
1229
  public function get_unique_name() {
1230
+ if( !isset($this->_unique_name) )
1231
+ $this->_set_unique_name( $this->get_cache()->get_unique_filename( $this ) );
1232
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1233
  return $this->_unique_name;
1234
  }
1235
 
1236
+
1237
  /**
1238
  * @since 4.6.10
1239
+ * @param string $name The relative filename to be used for this instance's cache file.
1240
  * @return \WPRSS_Image_Cache_Image This instance.
1241
  */
1242
  protected function _set_unique_name( $name ) {
1243
  $this->_unique_name = $name;
1244
  return $this;
1245
  }
1246
+
1247
+
1248
  /**
1249
+ * Get the size of the image, which is locally cached.
1250
+ *
1251
  * @since 4.6.10
1252
  * @return array A numeric array, where index 0 holds image width, and index 1 holds image height.
1253
  * @throws Exception If image file is unreadable.
1255
  public function get_size() {
1256
  if ( !isset( $this->_size ) ) {
1257
  $error_caption = 'Could not get image size';
 
1258
  $path = $this->get_local_path();
1259
+ if ( !$this->is_readable() ) throw new Exception( sprintf( '%1$s: image file is not readable', $path ) );
1260
+
1261
  // Trying simplest way
1262
  if ( $size = getimagesize( $path ) )
1263
  $this->_size = array( 0 => $size[0], 1 => $size[1] );
1264
+
1265
  wprss_log( sprintf( 'Tried `getimagesize()`: %1$s', empty($this->_size) ? 'failure' : 'success' ), __METHOD__, WPRSS_LOG_LEVEL_SYSTEM );
1266
+
1267
  if( !$this->_size && function_exists( 'gd_info' ) ) {
1268
  $image = file_get_contents( $path );
1269
  $image = imagecreatefromstring( $image );
1273
  wprss_log( sprintf( 'Tried GD: %1$s', empty($this->_size) ? 'failure' : 'success' ), __METHOD__, WPRSS_LOG_LEVEL_SYSTEM );
1274
  }
1275
  }
1276
+
1277
  return $this->_size;
1278
  }
1279
+
1280
+
1281
  /**
1282
  * @since 4.6.10
1283
  * @return boolean
1284
  */
1285
  public function is_readable() {
1286
+ $path = $this->get_local_path();
1287
+ if ( !$path ) return false;
1288
+ return is_readable( $path );
1289
  }
1290
+ }
languages/wprss-ru_RU.mo ADDED
Binary file
languages/wprss-ru_RU.po ADDED
@@ -0,0 +1,2155 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: wprss\n"
4
+ "POT-Creation-Date: 2015-07-14 18:58+0100\n"
5
+ "PO-Revision-Date: 2015-07-14 19:08+0100\n"
6
+ "Last-Translator: Yuriy Koverenko <j.koverenko@gmail.com>\n"
7
+ "Language-Team: \n"
8
+ "Language: ru\n"
9
+ "MIME-Version: 1.0\n"
10
+ "Content-Type: text/plain; charset=UTF-8\n"
11
+ "Content-Transfer-Encoding: 8bit\n"
12
+ "X-Generator: Poedit 1.6.4\n"
13
+ "X-Poedit-KeywordsList: _;__;_e\n"
14
+ "X-Poedit-Basepath: ../\n"
15
+ "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
16
+ "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
17
+ "X-Poedit-SearchPath-0: .\n"
18
+
19
+ #: includes/OPML.php:42
20
+ #, fuzzy
21
+ msgid ""
22
+ "An error occurred: The file might not be a valid OPML file or is corrupt. "
23
+ msgstr "Ошибка: файл поврежден или не является рабочим файлом OPML. "
24
+
25
+ #: includes/admin-addons.php:13
26
+ msgid "Excerpts & Thumbnails"
27
+ msgstr "Отрывки и Эскизы"
28
+
29
+ #: includes/admin-addons.php:14
30
+ msgid ""
31
+ "Adds the ability to display thumbnails and excerpts. Perfect for adding some "
32
+ "life and color to your feed item display. For more flexibility Feed to Post "
33
+ "is a better option."
34
+ msgstr ""
35
+ "Добавляет возможность отображения эскизов и отрывков. Идеально подходит для "
36
+ "добавления ярких красок в вашу ленту. Для большей гибкости лучше "
37
+ "использовать Импорт ленты в записи."
38
+
39
+ #: includes/admin-addons.php:20 includes/admin-welcome.php:105
40
+ msgid "Categories"
41
+ msgstr "Категории"
42
+
43
+ #: includes/admin-addons.php:21
44
+ msgid ""
45
+ "Assign categories to your feed sources. Then display a particular category "
46
+ "or multiple categories on a post or page via shortcodes."
47
+ msgstr ""
48
+ "Привяжите категории к вашим источникам лент. Затем отобразите одну или "
49
+ "несколько категорий в записи или на странице с помощью шорткодов."
50
+
51
+ #: includes/admin-addons.php:27 includes/admin-welcome.php:106
52
+ msgid "Keyword Filtering"
53
+ msgstr "Фильтр ключевых слов"
54
+
55
+ #: includes/admin-addons.php:28
56
+ msgid ""
57
+ "Import feeds that contain specific keywords in either the title or their "
58
+ "content. Control what gets imported to your blog. You can use keywords, "
59
+ "keyphrases and categories."
60
+ msgstr ""
61
+ "Импортируйте только те ленты, которые содержат определенные ключевые слова в "
62
+ "названии или содержимом. Контролируйте, что именно будет импортироваться в "
63
+ "ваш блог. Вы можете использовать ключевые слова, ключевые фразы и категории."
64
+
65
+ #: includes/admin-addons.php:34 includes/admin-welcome.php:103
66
+ msgid "Feed to Post"
67
+ msgstr "Импорт ленты в записи"
68
+
69
+ #: includes/admin-addons.php:35
70
+ msgid ""
71
+ "Allows you to import feed items into posts or any other custom post type "
72
+ "that you have created. Takes WP RSS Aggregator to a whole new level of "
73
+ "flexibility."
74
+ msgstr ""
75
+ "Позволяет импортировать содержимое ленты в записи или любой другой тип "
76
+ "постов, созданный вами. Подымает WP RSS Aggregator на совершенно новый "
77
+ "уровень гибкости."
78
+
79
+ #: includes/admin-addons.php:41 includes/admin-welcome.php:107
80
+ msgid "Full Text RSS Feeds"
81
+ msgstr "Полнотекстовые RSS-каналы"
82
+
83
+ #: includes/admin-addons.php:42
84
+ msgid ""
85
+ "This add-ons provides the connectivity to our Full Text Premium service, "
86
+ "which gives you unlimited feed items returned per feed source."
87
+ msgstr ""
88
+ "Это дополнение обеспечивает подключение к нашему полнотекстовому премиум-"
89
+ "сервису, который позволит вам получить неограниченное количество пунктов "
90
+ "лент для источника ленты."
91
+
92
+ #: includes/admin-addons.php:48 includes/admin-welcome.php:108
93
+ msgid "WordAi"
94
+ msgstr "WordAi"
95
+
96
+ #: includes/admin-addons.php:49
97
+ msgid ""
98
+ "Allows you to spin the content for posts imported by Feed to Post using "
99
+ "WordAi. Cleverly rewrite your posts without changing their meaning and "
100
+ "maintaining human readability."
101
+ msgstr ""
102
+ "Позволяет вам видоизменять содержимое записей, которые импортируются с "
103
+ "помощью Импорта ленты в записи. Переписывает ваши записи, не изменяя их "
104
+ "смысл и сохраняя удобочитаемость."
105
+
106
+ #: includes/admin-addons.php:59 includes/admin.php:43
107
+ msgid "Add-Ons"
108
+ msgstr "Дополнения"
109
+
110
+ #: includes/admin-addons.php:60
111
+ msgid ""
112
+ "The following Add-ons are available to increase the functionality of the WP "
113
+ "RSS Aggregator plugin."
114
+ msgstr ""
115
+ "С помощью дополнений можно расширить функциональность плагина WP RSS "
116
+ "Aggregator."
117
+
118
+ #: includes/admin-addons.php:61
119
+ msgid ""
120
+ "Each Add-on can be installed as a separate plugin. Note that activating the "
121
+ "Feed to Post plugin will deactivate the Categories and Excerpts & Thumbnails "
122
+ "add-ons."
123
+ msgstr ""
124
+ "Каждое дополнение устанавливается как отдельный плагин. Обратите внимание, "
125
+ "что активация плагина \"Импорт ленты в записи\" отключает плагины \"Категории"
126
+ "\" и \"Отрывки и эскизы\"."
127
+
128
+ #: includes/admin-addons.php:77
129
+ msgid "Installed"
130
+ msgstr "Установлено"
131
+
132
+ #: includes/admin-addons.php:79
133
+ msgid "Purchase & Install"
134
+ msgstr "Купить и установить"
135
+
136
+ #: includes/admin-ajax-notice.php:34
137
+ msgid ""
138
+ "Did you know that you can get more RSS features? Excerpts, thumbnails, "
139
+ "keyword filtering, importing into posts and more... "
140
+ msgstr ""
141
+ "Знаете ли вы, что можно получить больше возможностей RSS? Отрывки, эскизы, "
142
+ "фильтр ключевых слов, импорт в записи и много другого..."
143
+
144
+ #: includes/admin-ajax-notice.php:35
145
+ msgid "Check out the"
146
+ msgstr "Проверьте"
147
+
148
+ #: includes/admin-ajax-notice.php:35
149
+ msgid "extensions"
150
+ msgstr "расширения"
151
+
152
+ #: includes/admin-ajax-notice.php:35
153
+ msgid "page."
154
+ msgstr "страница."
155
+
156
+ #: includes/admin-ajax-notice.php:36 includes/licensing.php:336
157
+ msgid "Dismiss this notification"
158
+ msgstr "Игнорировать это уведомление"
159
+
160
+ #: includes/admin-dashboard.php:25 includes/admin-dashboard.php:26
161
+ msgid "Welcome to WP RSS Aggregator"
162
+ msgstr "Добро пожаловать в WP RSS Aggregator!"
163
+
164
+ #: includes/admin-debugging.php:103
165
+ msgid "Update All Feeds Now"
166
+ msgstr "Обновить все ленты сейчас"
167
+
168
+ #: includes/admin-debugging.php:104
169
+ msgid ""
170
+ "Click the blue button to update all active feed items now. This will check "
171
+ "all feed sources for any new feed items."
172
+ msgstr ""
173
+ "Нажмите на синюю кнопку, чтобы обновить все активные ленты. Будет совершена "
174
+ "проверка всех источников лент на наличие новых пунктов."
175
+
176
+ #: includes/admin-debugging.php:105
177
+ msgid "Existing feed items will not be modified."
178
+ msgstr "Существующие пункты лент не будут изменены."
179
+
180
+ #: includes/admin-debugging.php:107
181
+ msgid ""
182
+ "<strong>Note:</strong> This might take more than a few seconds if you have "
183
+ "many feed sources."
184
+ msgstr ""
185
+ "<strong>Примечание:</strong> Это может занять больше времени, чем несколько "
186
+ "секунд, если у вас много источников лент.."
187
+
188
+ #: includes/admin-debugging.php:112
189
+ msgid "Update all feeds"
190
+ msgstr "Обновить все ленты"
191
+
192
+ #: includes/admin-debugging.php:126
193
+ msgid "Delete and Re-import Feeds"
194
+ msgstr "Удалить и заново импортировать ленты"
195
+
196
+ #: includes/admin-debugging.php:127
197
+ msgid ""
198
+ "Click the red button to delete all imported feed items and re-import them."
199
+ msgstr ""
200
+ "Нажмите на красную кнопку, чтобы удалить все импортированные пункты лент и "
201
+ "заново импортировать их."
202
+
203
+ #: includes/admin-debugging.php:128
204
+ msgid ""
205
+ "<em><strong>Note:</strong> This is a server-intensive process and should "
206
+ "only be used when instructed to by support staff.</em>"
207
+ msgstr ""
208
+ "<em><strong>Примечание:</strong> Это затратный процесс сервера и должен "
209
+ "использоваться только после инструктажа службы поддержки.</em>"
210
+
211
+ #: includes/admin-debugging.php:133
212
+ msgid "Delete and Re-import all feeds"
213
+ msgstr "Удалить и заново импортировать все ленты"
214
+
215
+ #: includes/admin-debugging.php:147 includes/admin-debugging.php:154
216
+ msgid "Restore Default Settings"
217
+ msgstr "Восстановить настройки по умолчанию"
218
+
219
+ #: includes/admin-debugging.php:148
220
+ msgid "Click the red button to reset the plugin settings to default."
221
+ msgstr ""
222
+ "Нажмите красную кнопку, чтобы сбросить все настройки плагина до стандартных."
223
+
224
+ #: includes/admin-debugging.php:149
225
+ msgid ""
226
+ "<em><strong>Note:</strong> This cannot be undone. Once the settings have "
227
+ "been reset, your old settings cannot be restored.</em>"
228
+ msgstr ""
229
+ "<em><strong>Примечание:</strong> Нельзя отменить. Настройки будут сброшены и "
230
+ "не будут подлежать восстановлению.</em>"
231
+
232
+ #: includes/admin-debugging.php:168
233
+ msgid "Error Log"
234
+ msgstr "Журнал ошибок"
235
+
236
+ #: includes/admin-debugging.php:174
237
+ msgid "Clear log"
238
+ msgstr "Очистить журнал"
239
+
240
+ #: includes/admin-debugging.php:202 includes/admin.php:42
241
+ msgid "Debugging"
242
+ msgstr "Отладка"
243
+
244
+ #: includes/admin-debugging.php:252
245
+ msgid "Feeds are being updated in the background."
246
+ msgstr "Ленты обновляются в фоновом режиме."
247
+
248
+ #: includes/admin-debugging.php:261
249
+ msgid "Feeds deleted and are being re-imported in the background."
250
+ msgstr "Ленты были удалены и заново импортируются в фоновом режиме."
251
+
252
+ #: includes/admin-debugging.php:271
253
+ msgid "The error log has been cleared."
254
+ msgstr "Журнал ошибок был очищен."
255
+
256
+ #: includes/admin-debugging.php:281
257
+ msgid "The plugin settings have been reset to default."
258
+ msgstr "Настройки плагина были сброшены."
259
+
260
+ #: includes/admin-display.php:20 includes/admin-display.php:212
261
+ msgid "Name"
262
+ msgstr "Название"
263
+
264
+ #: includes/admin-display.php:27
265
+ msgid "State"
266
+ msgstr "Состояние"
267
+
268
+ #: includes/admin-display.php:28
269
+ msgid "Updates"
270
+ msgstr "Обновления"
271
+
272
+ #: includes/admin-display.php:48
273
+ msgid ""
274
+ "This feed source experienced an error during the last feed fetch or "
275
+ "validation check. Re-check the feed source URL or check the Error Log in the "
276
+ "Debugging page for more details."
277
+ msgstr ""
278
+ "Во время последней выборки ленты или проверки валидности произошла ошибка. "
279
+ "Еще раз проверьте URL ленты или посмотрите журнал ошибок на странице отладки "
280
+ "для более подробной информации."
281
+
282
+ #: includes/admin-display.php:89 includes/admin-heartbeat.php:53
283
+ msgid "None"
284
+ msgstr "Нет"
285
+
286
+ #: includes/admin-display.php:91 includes/admin-heartbeat.php:50
287
+ #: includes/admin-metaboxes.php:494
288
+ msgid "Paused"
289
+ msgstr "Приостановлено"
290
+
291
+ #: includes/admin-display.php:98
292
+ msgid "Next update:"
293
+ msgstr "Следующее обновление через:"
294
+
295
+ #: includes/admin-display.php:106
296
+ msgid "Last updated:"
297
+ msgstr "Последнее обновление:"
298
+
299
+ #: includes/admin-display.php:107 includes/feed-display.php:157
300
+ #, php-format
301
+ msgid "%1$s ago"
302
+ msgstr "%1$s назад"
303
+
304
+ #: includes/admin-display.php:109
305
+ #, php-format
306
+ msgid ""
307
+ "Last update imported: <code class=\"last-update-imported\">%1$d</code> items"
308
+ msgstr ""
309
+ "Во время последнего обновления импортировано: <code class=\"last-update-"
310
+ "imported\">%1$d</code> пунктов"
311
+
312
+ #: includes/admin-display.php:124 includes/admin-metaboxes.php:248
313
+ msgid "Updating feed source"
314
+ msgstr "Обновление источника ленты"
315
+
316
+ #: includes/admin-display.php:213 includes/feed-blacklist.php:322
317
+ msgid "Permalink"
318
+ msgstr "Постоянная ссылка"
319
+
320
+ #: includes/admin-display.php:214
321
+ msgid "Date published"
322
+ msgstr "Дата опубликования"
323
+
324
+ #: includes/admin-display.php:215
325
+ msgid "Source"
326
+ msgstr "Источник"
327
+
328
+ #: includes/admin-display.php:304
329
+ msgid "Feed source updated. "
330
+ msgstr "Источник ленты обновлен."
331
+
332
+ #: includes/admin-display.php:305
333
+ msgid "Custom field updated."
334
+ msgstr "Пользовательское поле обновлено."
335
+
336
+ #: includes/admin-display.php:306
337
+ msgid "Custom field deleted."
338
+ msgstr "Пользовательское поле удалено."
339
+
340
+ #: includes/admin-display.php:307 includes/admin-display.php:313
341
+ msgid "Feed source updated."
342
+ msgstr "Источник ленты обновлен."
343
+
344
+ #: includes/admin-display.php:309 includes/admin-display.php:310
345
+ msgid "Feed source saved."
346
+ msgstr "Источник ленты сохранен."
347
+
348
+ #: includes/admin-display.php:311
349
+ msgid "Feed source submitted."
350
+ msgstr "Источник ленты подан."
351
+
352
+ #: includes/admin-display.php:338
353
+ #, php-format
354
+ msgid "ID: %1$s"
355
+ msgstr "ID: %1$s"
356
+
357
+ #: includes/admin-display.php:352
358
+ msgid "View Items"
359
+ msgstr "Просмотр пунктов"
360
+
361
+ #: includes/admin-display.php:355
362
+ msgid "Fetch Items"
363
+ msgstr "Выборка пунктов"
364
+
365
+ #: includes/admin-display.php:358
366
+ msgid "Delete Items"
367
+ msgstr "Удалить пункты"
368
+
369
+ #: includes/admin-display.php:359
370
+ msgid "Delete feed items imported by this feed source"
371
+ msgstr "Удалить пункты лент этого источника"
372
+
373
+ #: includes/admin-display.php:528
374
+ msgid "Publish Feed"
375
+ msgstr "Опубликовать ленту"
376
+
377
+ #: includes/admin-editor.php:87
378
+ msgid ""
379
+ "Hold Ctrl or Mac Command key when clicking to select more than one feed "
380
+ "source."
381
+ msgstr ""
382
+ "Зажмите Ctrl или кнопку Command на Mac, чтобы выбрать больше одного "
383
+ "источника ленты."
384
+
385
+ #: includes/admin-editor.php:97 includes/custom-post-types.php:21
386
+ #: includes/custom-post-types.php:24
387
+ msgid "Feed Sources"
388
+ msgstr "Источники лент"
389
+
390
+ #: includes/admin-editor.php:99
391
+ msgid "All feed sources"
392
+ msgstr "Все источники лент"
393
+
394
+ #: includes/admin-editor.php:101
395
+ msgid "Choose the feed source to display:"
396
+ msgstr "Выберите источник ленты для отображения:"
397
+
398
+ #: includes/admin-editor.php:122
399
+ msgid "Exclude:"
400
+ msgstr "Исключено:"
401
+
402
+ #: includes/admin-editor.php:124
403
+ msgid "Choose the feed sources to exclude:"
404
+ msgstr "Выберите источники лент для исключения:"
405
+
406
+ #: includes/admin-editor.php:130
407
+ msgid "Feed Limit:"
408
+ msgstr "Лимит ленты"
409
+
410
+ #: includes/admin-editor.php:131
411
+ msgid "Ignore"
412
+ msgstr "Игнорировать"
413
+
414
+ #: includes/admin-editor.php:139
415
+ msgid "Add shortcode"
416
+ msgstr "Добавить шорткод"
417
+
418
+ #: includes/admin-help-metaboxes.php:17
419
+ msgid ""
420
+ "The URL of the feed source. In most cases, the URL of the site will also "
421
+ "work, but for best results we recommend trying to find the URL of the RSS "
422
+ "feed.\n"
423
+ "\n"
424
+ "Also include the <code>http://</code> prefix in the URL."
425
+ msgstr ""
426
+ "URL источника ленты. В большинстве случаев URL сайта тоже подойдет, но для "
427
+ "лучших результатов мы рекомендуем попробовать найти URL RSS-ленты.\n"
428
+ "\n"
429
+ "Также включите префикс <code>http://</code> в URL."
430
+
431
+ #: includes/admin-help-metaboxes.php:21
432
+ msgid ""
433
+ "The maximum number of imported items from this feed to keep stored.\n"
434
+ "\n"
435
+ "When new items are imported and the limit is exceeded, the oldest feed items "
436
+ "will be deleted to make room for new ones.\n"
437
+ "\n"
438
+ "If you already have items imported from this feed source, setting this "
439
+ "option now may delete some of your items, in order to comply with the limit."
440
+ msgstr ""
441
+ "Макисмальное число импортируемых пунктов из этой ленты для хранения.\n"
442
+ "\n"
443
+ "Если при импорте новых пунктов лимит будет превышен, старые пункты ленты "
444
+ "будут удалены, чтобы освободить место для новых.\n"
445
+ "\n"
446
+ "Если у вас уже есть импортированные пункты этой ленты, настройка этого "
447
+ "параметра может удалить некоторые ваши пункты, чтобы вложиться в лимит."
448
+
449
+ #: includes/admin-help-metaboxes.php:27
450
+ msgid ""
451
+ "Tick this box to make feed items link to the URL in the enclosure tag, "
452
+ "rather than link to the original article.\n"
453
+ "\n"
454
+ "Enclosure tags are RSS tags that may be included with a feed items. These "
455
+ "tags typically contain links to images, audio, videos, attachment files or "
456
+ "even flash content.\n"
457
+ "\n"
458
+ "If you are not sure leave this setting blank."
459
+ msgstr ""
460
+ "Отметьте этот флажок, чтобы в пунктах ленты ставить ссылку из тега "
461
+ "\"enclosure\", а не ссылку на оригинал статьи.\n"
462
+ "\n"
463
+ "Теги \"enclosure\" - это RSS-теги, которые могут использоваться в пунктах "
464
+ "ленты. Эти теги обычно содержат ссылки на изображения, аудио, видео, "
465
+ "вложенные файлы или даже на флэш-контент. \n"
466
+ "\n"
467
+ "Если вы не уверены, оставьте это поле пустым."
468
+
469
+ #: includes/admin-help-metaboxes.php:33
470
+ msgid ""
471
+ "Whether to allow multiple feed items to have the same title. When checked, "
472
+ "if a feed item has the same title as a previously-imported feed item, it "
473
+ "will not be imported.\n"
474
+ "\n"
475
+ "This can be useful in cases where permalinks change, or where multiple "
476
+ "permalinks refer to the same item."
477
+ msgstr ""
478
+
479
+ #: includes/admin-help-metaboxes.php:43
480
+ msgid ""
481
+ "State of the feed, active or paused.\n"
482
+ "\n"
483
+ "If active, the feed source will fetch items periodically, according to the "
484
+ "settings below.\n"
485
+ "\n"
486
+ "If paused, the feed source will not fetch feed items periodically."
487
+ msgstr ""
488
+ "Состояние ленты, активна или приостановлена.\n"
489
+ "\n"
490
+ "Если активна, лента будет периодически пополняться новыми пунктами, в "
491
+ "соответствии с приведенными ниже настройками.\n"
492
+ "\n"
493
+ "Если приостановлена, лента не будет пополняться новыми пунктами."
494
+
495
+ #: includes/admin-help-metaboxes.php:49
496
+ msgid ""
497
+ "You can set a time, in UTC, in the future when the feed source will become "
498
+ "active, if it is paused.\n"
499
+ "\n"
500
+ "Leave blank to activate immediately."
501
+ msgstr ""
502
+ "Вы можете установить время автоматической активации ленты в формате UTC, "
503
+ "если сейчас она приостановлена.\n"
504
+ "\n"
505
+ "Оставьте пустым, чтобы активировать сразу."
506
+
507
+ #: includes/admin-help-metaboxes.php:53
508
+ msgid ""
509
+ "You can set a time, in UTC, in the future when the feed source will become "
510
+ "paused, if it is active.\n"
511
+ "\n"
512
+ "Leave blank to never pause."
513
+ msgstr ""
514
+ "Вы можете установить время автоматической остановки обновления ленты в "
515
+ "формате UTC, если сейчас она активна.\n"
516
+ "\n"
517
+ "Оставьте пустым, чтобы никогда не останавливать."
518
+
519
+ #: includes/admin-help-metaboxes.php:57
520
+ msgid ""
521
+ "How frequently the feed source should check for new items and fetch if "
522
+ "needed.\n"
523
+ "\n"
524
+ "If left as <em>Default</em>, the interval in the global settings is used."
525
+ msgstr ""
526
+ "Как часто источник ленты должен проверяться на наличие новых пунктов, если "
527
+ "это необходимо.\n"
528
+ "\n"
529
+ "Если оставить настройки<em>По умолчанию</em>, будет использоваться интервал "
530
+ "из глобальных настроек."
531
+
532
+ #: includes/admin-help-metaboxes.php:61
533
+ msgid ""
534
+ "The maximum age allowed for feed items. Very useful if you are only "
535
+ "concerned with, say, last week's news.\n"
536
+ "\n"
537
+ "Items already imported will be deleted if they eventually exceed this age "
538
+ "limit.\n"
539
+ "\n"
540
+ "Also, items in the RSS feed that are already older than this age will not be "
541
+ "imported at all.\n"
542
+ "\n"
543
+ "Leaving empty to use the <em>Limit feed items by age</em> option in the "
544
+ "general settings."
545
+ msgstr ""
546
+ "Максимальный возраст пунктов лент. Очень полезно, если вам нужны только, "
547
+ "например, новости прошедшей недели.\n"
548
+ "\n"
549
+ "Ранее импортированные пункты лент будут удалены, если не будут "
550
+ "соответствовать возрастному пределу.\n"
551
+ "\n"
552
+ "Кроме того, пункты в RSS-ленте, которые старше установленного возраста, не "
553
+ "будут импортированы.\n"
554
+ "\n"
555
+ "При пустом поле <em>Максимальный возраст пунктов ленты</em> будет "
556
+ "использоваться значение из глобальных настроек."
557
+
558
+ #: includes/admin-help-metaboxes.php:74
559
+ msgid ""
560
+ "Use this option if you are seeing an <q>Invalid feed URL</q> error in the "
561
+ "Feed Preview above, but you are sure that the URL is correct.\n"
562
+ "\n"
563
+ "Note, however, that this will disable auto-discovery, meaning that the given "
564
+ "URL must be an RSS feed URL. Using the site's URL will not work."
565
+ msgstr ""
566
+ "Исользуйте эту опцию, если вы видите ошибку <q>Некорректный URL ленты</q> в "
567
+ "предварительном просмотре ленты выше, но вы уверены, что URL на самом деле "
568
+ "корректный.\n"
569
+ "\n"
570
+ "Заметим, однако, что после этого будет отключено автоматическое обнаружение "
571
+ "ленты. Это означает, что указанная вами ссылка должна быть адресом RSS-"
572
+ "ленты, а не адресом сайта."
573
+
574
+ #: includes/admin-help-settings.php:13
575
+ msgid ""
576
+ "The maximum age allowed for feed items.\n"
577
+ "<hr/>\n"
578
+ "\n"
579
+ "Items already imported will be deleted if they eventually exceed this age "
580
+ "limit.\n"
581
+ "\n"
582
+ "Also, items in the RSS feed that are already older than this age will not be "
583
+ "imported at all.\n"
584
+ "<hr/>\n"
585
+ "\n"
586
+ "<em>Leave empty for no limit.</em>"
587
+ msgstr ""
588
+ "Максимальный возраст пунктов ленты.\n"
589
+ "<hr/>\n"
590
+ "\n"
591
+ " Ранее импортированные пункты ленты будут удалены, если не будут "
592
+ "соответствовать возрастному пределу.\n"
593
+ "\n"
594
+ "Кроме того, пункты в RSS-ленте, которые старше установленного возраста, не "
595
+ "будут импортированы.\n"
596
+ "<hr/>\n"
597
+ "\n"
598
+ "<em>Оставьте пустым, чтобы убрать ограничения.</em>"
599
+
600
+ #: includes/admin-help-settings.php:23
601
+ msgid ""
602
+ "The maximum number of imported items to keep stored, for feed sources that "
603
+ "do not have their own limit.\n"
604
+ "<hr/>\n"
605
+ "\n"
606
+ "When new items are imported and the limit for a feed source is exceeded, the "
607
+ "oldest feed items for that feed source will be deleted to make room for the "
608
+ "new ones.\n"
609
+ "\n"
610
+ "If you already have items imported from this feed source, setting this "
611
+ "option now may delete some of your items, in order to comply with the "
612
+ "limit.\n"
613
+ "<hr/>\n"
614
+ "\n"
615
+ "<em>Use 0 or leave empty for no limit.</em>"
616
+ msgstr ""
617
+ "Макисмальное число хранимых пунктов в ленте для тех лент, у которых не "
618
+ "установлен собственный лимит.\n"
619
+ "<hr/>\n"
620
+ "\n"
621
+ "Если при импорте новых пунктов лимит будет превышен, старые пункты ленты "
622
+ "будут удалены, чтобы освободить место для новых.\n"
623
+ "\n"
624
+ "Если у вас уже есть импортированные пункты этой ленты, настройка этого "
625
+ "параметра может удалить некоторые ваши пункты, чтобы вложиться в лимит.\n"
626
+ "<hr/>\n"
627
+ "\n"
628
+ "<em>Поставьте 0 или оставьте пустым, чтобы убрать ограничения.</em>"
629
+
630
+ #: includes/admin-help-settings.php:33
631
+ msgid ""
632
+ "How frequently should the feed sources (that do not have their own update "
633
+ "interval) check for updates and fetch items accordingly.\n"
634
+ "\n"
635
+ "It is recommended to not have more than 20 feed sources that use this global "
636
+ "update interval. Having too many feed sources updating precisely at the same "
637
+ "time can cause the WP Cron System to crash."
638
+ msgstr ""
639
+ "Как часто источник ленты, для которого не установлен собственный интервал, "
640
+ "должен проверяться на наличие новых пунктов.\n"
641
+ "\n"
642
+ "Рекомендуется иметь не более 20 лент, которые используют данный глобальный "
643
+ "интервал обновления. Слишком большое количество лент, которые будут "
644
+ "обновляться в одно и то же время, может привести к поломке cron-системы "
645
+ "WordPress."
646
+
647
+ #: includes/admin-help-settings.php:37
648
+ msgid ""
649
+ "Whether to allow multiple feed items to have the same title. When checked, "
650
+ "if a feed item has the same title as a previously-imported feed item from "
651
+ "any feed source, it will not be imported.\n"
652
+ "\n"
653
+ "This can be useful in cases where permalinks change, or where multiple "
654
+ "permalinks refer to the same item.\n"
655
+ "\n"
656
+ "Since this feature requires checking every post title, WordPress installs "
657
+ "with a significant amount of posts may notice a slight slowdown of the post "
658
+ "import process."
659
+ msgstr ""
660
+
661
+ #: includes/admin-help-settings.php:43
662
+ msgid ""
663
+ "The URL of the custom feed, located at <code>http://yoursite.com/[custom "
664
+ "feed url]</code>.\n"
665
+ "<hr/>\n"
666
+ "\n"
667
+ "WP RSS Aggregator allows you to create a custom RSS feed, that contains all "
668
+ "of your imported feed items. This setting allows you to change the URL of "
669
+ "this custom feed.\n"
670
+ "\n"
671
+ "<hr/>\n"
672
+ "\n"
673
+ "<strong>Note:</strong> You may be required to refresh you Permalinks after "
674
+ "you change this setting, by going to <em>Settings <i class=\"fa fa-angle-"
675
+ "right\"></i> Permalinks</e> and clicking <em>Save</em>."
676
+ msgstr ""
677
+ "Адрес пользовательской ленты, расположенной в <code>http://yoursite.com/"
678
+ "[адрес пользовательской ленты]</code>.\n"
679
+ "<hr/>\n"
680
+ "\n"
681
+ "WP RSS Aggregator позволяет создавать пользовательскую RSS-ленту, которая "
682
+ "будет содержать все ваши импортированные пункты лент. Этот параметр "
683
+ "позволяет сменить адрес данной пользовательской ленты.\n"
684
+ "\n"
685
+ "<hr/>\n"
686
+ "\n"
687
+ "<strong>Примечание:</strong> Вам может потребоваться обновить ваши "
688
+ "постоянные ссылки после изменения этого параметра, путем нажатия "
689
+ "<em>Сохранить</em> в <em>Настройках <i class=\"fa fa-angle-right\"></i> "
690
+ "Постоянных ссылках</e>."
691
+
692
+ #: includes/admin-help-settings.php:52
693
+ msgid ""
694
+ "The title of the custom feed.\n"
695
+ "\n"
696
+ "This title will be included in the RSS source of the custom feed, in a "
697
+ "<code>&lt;title&gt;</code> tag."
698
+ msgstr ""
699
+ "Название пользовательской ленты.\n"
700
+ "\n"
701
+ "Это название будет включено в источник пользовательской ленты, в теге "
702
+ "<code>&lt;title&gt;</code>."
703
+
704
+ #: includes/admin-help-settings.php:56
705
+ msgid "The maximum number of feed items in the custom feed."
706
+ msgstr "Максимальное число пунктов в пользовательской ленте."
707
+
708
+ #: includes/admin-help-settings.php:62
709
+ msgid ""
710
+ "Check this box to make the feed item titles link to the original article."
711
+ msgstr ""
712
+ "Установите этот флажок, чтобы сделать заголовки пунктов лент ссылками на "
713
+ "оригиналы статей."
714
+
715
+ #: includes/admin-help-settings.php:64
716
+ msgid ""
717
+ "Set the maximum number of characters to show for feed item titles.\n"
718
+ "<hr/>\n"
719
+ "\n"
720
+ "<em>Leave empty for no limit.</em>"
721
+ msgstr ""
722
+ "Установите максимально допустимое число символов в названии пункта ленты.\n"
723
+ "<hr/>\n"
724
+ "\n"
725
+ "<em>Оставьте пустым, чтобы убрать ограничения.</em>"
726
+
727
+ #: includes/admin-help-settings.php:69
728
+ msgid ""
729
+ "Check this box to show the author for each feed item, if it is available."
730
+ msgstr ""
731
+ "Установите этот флажок, чтобы показать автора каждого пункта ленты, если он "
732
+ "доступен."
733
+
734
+ #: includes/admin-help-settings.php:71
735
+ msgid ""
736
+ "For feed items from YouTube, Vimeo or Dailymotion, you can choose whether "
737
+ "you want to have the items link to the original page link, or a link to the "
738
+ "embedded video player only."
739
+ msgstr ""
740
+ "Для пунктов лент из YouTube, Vimeo или Dailymotion, вы можете выбрать, "
741
+ "хотите ли Вы, чтобы пункты ссылались на оригинальную страницу, или только на "
742
+ "встроенный видео-плеер."
743
+
744
+ #: includes/admin-help-settings.php:73
745
+ msgid ""
746
+ "The type of pagination to use when showing feed items on multiple pages.\n"
747
+ "\n"
748
+ "The first shows two links, \"Older\" and \"Newer\", which allow you to "
749
+ "navigate through the pages.\n"
750
+ "\n"
751
+ "The second shows links for all the pages, together with links for the next "
752
+ "and previous pages."
753
+ msgstr ""
754
+ "Тип пагинации при отображении пунктов лент на нескольких страницах.\n"
755
+ "\n"
756
+ "При первом типе отображаются две ссылки, \"Предыдущие\" и \"Следующие\", "
757
+ "которые позволяют перемещаться по страницам.\n"
758
+ "\n"
759
+ "При втором типе отображаются ссылки на все страницы, вместе со ссылками на "
760
+ "следующие и предыдущие страницы."
761
+
762
+ #: includes/admin-help-settings.php:79
763
+ msgid ""
764
+ "The maximum number of feed items to display when using the shortcode.\n"
765
+ "\n"
766
+ "This enables pagination if set to a number smaller than the number of items "
767
+ "to be displayed."
768
+ msgstr ""
769
+ "Максимальное количество пунктов лент в показе при использовании шорткода.\n"
770
+ "\n"
771
+ "Если заданное количество меньше, чем общее количество пунктов, будет "
772
+ "использоваться пагинация."
773
+
774
+ #: includes/admin-help-settings.php:83
775
+ msgid ""
776
+ "Choose how you want links to be opened. This applies to the feed item title "
777
+ "and the source link."
778
+ msgstr ""
779
+ "Выберите, как вы хотите, чтобы открывались ссылки. Это относится и к "
780
+ "заголовку пункта ленты, и к ссылке на источник."
781
+
782
+ #: includes/admin-help-settings.php:85
783
+ msgid ""
784
+ "Enable this option to set all links displayed as \"NoFollow\".\n"
785
+ "<hr/>\n"
786
+ "\n"
787
+ "\"Nofollow\" provides a way to tell search engines to <em>not</em> follow "
788
+ "certain links, such as links to feed items in this case."
789
+ msgstr ""
790
+ "Включите эту опцию, чтобы добавить ко всем ссылкам тег \"NoFollow\".\n"
791
+ "<hr/>\n"
792
+ "\n"
793
+ "Тег \"Nofollow\" позволяет указать поисковым системам <em>не</em> не "
794
+ "поддерживать и не переходить по определенным ссылкам, в данном случае - по "
795
+ "ссылкам в пунктах ленты."
796
+
797
+ #: includes/admin-help-settings.php:94
798
+ msgid "Enable this option to show the feed source name for each feed item."
799
+ msgstr ""
800
+ "Включите эту опцию, чтобы показать имя источника ленты в каждом пункте этой "
801
+ "ленты."
802
+
803
+ #: includes/admin-help-settings.php:96
804
+ msgid ""
805
+ "Enter the text that you want to show before the source name. A space is "
806
+ "automatically added between this text and the feed source name."
807
+ msgstr ""
808
+ "Введите текст, который должен отображаться перед именем источника. Между "
809
+ "этим текстом и именем источника автоматически добавляется пробел."
810
+
811
+ #: includes/admin-help-settings.php:98
812
+ msgid ""
813
+ "Enable this option to link the feed source name to the RSS feed's source "
814
+ "site."
815
+ msgstr ""
816
+ "Включите эту опцию, чтобы поставить ссылку с имени источника ленты на сайт "
817
+ "этого источника."
818
+
819
+ #: includes/admin-help-settings.php:104
820
+ msgid "Enable this to show the feed item's date."
821
+ msgstr "Включите эту опцию, чтобы показывать дату в пунктах ленты."
822
+
823
+ #: includes/admin-help-settings.php:106
824
+ msgid ""
825
+ "Enter the text that you want to show before the feed item date. A space is "
826
+ "automatically added between this text and the date."
827
+ msgstr ""
828
+ "Введите текст, который должен отображаться перед датой. Между этим текстом и "
829
+ "датой автоматически добавляется пробел."
830
+
831
+ #: includes/admin-help-settings.php:108
832
+ msgid "The format to use for the feed item dates, as a PHP date format."
833
+ msgstr "Формат даты в пунктах ленты (в формате PHP)."
834
+
835
+ #: includes/admin-help-settings.php:110
836
+ msgid ""
837
+ "Enable this option to show the elapsed time from the feed item's date and "
838
+ "time to the present time.\n"
839
+ "<em>Eg. 2 hours ago</em>"
840
+ msgstr ""
841
+ "Включите эту опцию, чтобы показывать время, прошедшее с момента публикации "
842
+ "пункта ленты до настоящего времени.\n"
843
+ "<em>Например, 2 часа назад</em>"
844
+
845
+ #: includes/admin-help-settings.php:117
846
+ msgid ""
847
+ "Check this box to disable all plugin styles used for displaying feed items.\n"
848
+ "\n"
849
+ "This will allow you to provide your own custom CSS styles for displaying the "
850
+ "feed items."
851
+ msgstr ""
852
+ "Установите этот флажок, чтобы отключить все стили плагина, используемые для "
853
+ "отображения пунктов лент.\n"
854
+ "\n"
855
+ "Это позволит вам подключить свои собственные стили CSS для отображения "
856
+ "пунктов лент."
857
+
858
+ #: includes/admin-help-settings.php:126
859
+ msgid ""
860
+ "Path to the file containing one or more certificates.\n"
861
+ "\n"
862
+ "These will be used to verify certificates over secure connection, such as "
863
+ "when fetching a remote resource over HTTPS.\n"
864
+ "\n"
865
+ "Relative path will be relative to the WordPress root.\n"
866
+ "\n"
867
+ "<strong>Default:</strong> path to certificate file bundled with WordPress."
868
+ msgstr ""
869
+
870
+ #: includes/admin-help.php:13 includes/admin.php:44
871
+ msgid "Help & Support"
872
+ msgstr "Помощь и Поддержка"
873
+
874
+ #: includes/admin-help.php:14 includes/admin.php:112
875
+ msgid "Documentation"
876
+ msgstr "Документация"
877
+
878
+ #: includes/admin-help.php:15
879
+ msgid ""
880
+ "In the <a href=\"http://www.wprssaggregator.com/documentation/"
881
+ "\">documentation area</a> on the WP RSS Aggregator website you will find "
882
+ "comprehensive details on how to use the core plugin and all the add-ons.\n"
883
+ "\t\t\t\t\n"
884
+ "\t\t\t\tThere are also some videos to help you make a quick start to setting "
885
+ "up and enjoying this plugin."
886
+ msgstr ""
887
+ "В <a href=\"http://www.wprssaggregator.com/documentation/\">документации</a> "
888
+ "на сайте WP RSS Aggregator вы найдете подробные сведения о том, как "
889
+ "использовать основной плагин и все дополнения.\n"
890
+ "\t\t\t\t\n"
891
+ "\t\t\t\tТакже там есть некоторые видео, которые помогут вам быстро настроить "
892
+ "плагин и наслаждаться им."
893
+
894
+ #: includes/admin-help.php:18
895
+ msgid "Frequently Asked Questions (FAQ)"
896
+ msgstr "Часто задаваемые вопросы (FAQ)"
897
+
898
+ #: includes/admin-help.php:19
899
+ msgid ""
900
+ "If after going through the documentation you still have questions, please "
901
+ "take a look at the <a href=\"http://www.wprssaggregator.com/faq/\">FAQ page</"
902
+ "a> on the site, we set this up purposely to answer the most commonly asked "
903
+ "questions by our users."
904
+ msgstr ""
905
+ "Если после прочтения документации у вас останутся вопросы, пожалуйста, "
906
+ "посмотрите <a href=\"http://www.wprssaggregator.com/faq/\">Страницу с часто "
907
+ "задаваемыми вопросами</a> на сайте. Мы специально создали эту страницу, "
908
+ "чтобы ответить на наиболее часто задаваемые вопросы от наших пользователей."
909
+
910
+ #: includes/admin-help.php:64
911
+ #, fuzzy
912
+ msgid "Email Support"
913
+ msgstr "Помощь и Поддержка"
914
+
915
+ #: includes/admin-help.php:65
916
+ msgid ""
917
+ "If you still can't find an answer to your query after reading the "
918
+ "documentation and going through the FAQ, just fill out the support request "
919
+ "form below. We'll be happy to help you out."
920
+ msgstr ""
921
+ "Если вы все еще не можете найти ответ на свой вопрос после прочтения "
922
+ "документации и FAQ, просто <a href=\"http://www.wprssaggregator.com/contact/"
923
+ "\">обратитесь в службу поддержки</a>.\n"
924
+ "Мы будем рады вам помочь."
925
+
926
+ #: includes/admin-help.php:72
927
+ msgid "From: "
928
+ msgstr ""
929
+
930
+ #: includes/admin-help.php:77
931
+ msgid "Replies will be sent to this email address."
932
+ msgstr ""
933
+
934
+ #: includes/admin-help.php:86
935
+ msgid "Attachments"
936
+ msgstr ""
937
+
938
+ #: includes/admin-help.php:89
939
+ #, fuzzy
940
+ msgid "WP RSS Aggregator log file"
941
+ msgstr "Настройки WP RSS Aggregator"
942
+
943
+ #: includes/admin-help.php:92
944
+ #, fuzzy
945
+ msgid "WordPress information"
946
+ msgstr "Системная информация"
947
+
948
+ #: includes/admin-help.php:97
949
+ msgid "Send Message"
950
+ msgstr ""
951
+
952
+ #: includes/admin-help.php:110
953
+ msgid "Support Forums"
954
+ msgstr ""
955
+
956
+ #: includes/admin-help.php:111
957
+ #, fuzzy
958
+ msgid ""
959
+ "Users of the free version of WP RSS Aggregator can ask questions on the <a "
960
+ "href=\"http://wordpress.org/support/plugin/wp-rss-aggregator\">support "
961
+ "forum</a>."
962
+ msgstr ""
963
+ "Если вы используете бесплатную версию плагина, найденную на WordPress.org, "
964
+ "вы можете задать вопросы по поддержке <a href=\"http://wordpress.org/support/"
965
+ "plugin/wp-rss-aggregator\">на справочном форуме</a>."
966
+
967
+ #: includes/admin-help.php:144
968
+ #, php-format
969
+ msgid ""
970
+ "There was an error sending the form. Please use the <a href=\"%s\" target="
971
+ "\"_blank\">contact form on our site.</a>"
972
+ msgstr ""
973
+
974
+ #: includes/admin-help.php:174
975
+ #, php-format
976
+ msgid ""
977
+ "Please fill out all the fields in the form, including the <strong>%s</"
978
+ "strong> field."
979
+ msgstr ""
980
+
981
+ #: includes/admin-help.php:182
982
+ msgid "Please enter a valid email address."
983
+ msgstr ""
984
+
985
+ #: includes/admin-help.php:936
986
+ msgid ""
987
+ "Could not enqueue tooltip content: the queue method is not a valid callable."
988
+ msgstr ""
989
+ "Не удалось поставить в очередь содержание подсказки: метод очереди не "
990
+ "действителен."
991
+
992
+ #: includes/admin-import-export.php:63
993
+ #, php-format
994
+ msgid "Successfully imported <code>%1$s</code> feed sources."
995
+ msgstr "Успешно импортировано <code>%1$s</code> лент."
996
+
997
+ #: includes/admin-import-export.php:119
998
+ msgid "All options are exported successfully."
999
+ msgstr "Все параметры успешно экспортированы."
1000
+
1001
+ #: includes/admin-import-export.php:130
1002
+ msgid "All options are restored successfully."
1003
+ msgstr "Все параметры успешно восстановлены."
1004
+
1005
+ #: includes/admin-import-export.php:141
1006
+ msgid "Invalid file or file size too big."
1007
+ msgstr "Битый файл или слишком большой размер файла."
1008
+
1009
+ #: includes/admin-import-export.php:195
1010
+ msgid "Bulk Feed Import"
1011
+ msgstr "Массовый импорт лент"
1012
+
1013
+ #: includes/admin-import-export.php:196
1014
+ msgid ""
1015
+ "Import multiple feed sources at once, by entering the name and URLs of your "
1016
+ "feeds below."
1017
+ msgstr ""
1018
+ "Импорт сразу нескольких источников лент, путем ввода имени и адресов ваших "
1019
+ "лент ниже."
1020
+
1021
+ #: includes/admin-import-export.php:197
1022
+ msgid "Separate the name and the URL using a comma on each line:"
1023
+ msgstr "Разделяйте имя и адрес, используя запятую в каждой строке:"
1024
+
1025
+ #: includes/admin-import-export.php:198
1026
+ msgid "Feed Name, http://www.myfeed.com"
1027
+ msgstr "Название ленты, http://www.myfeed.com"
1028
+
1029
+ #: includes/admin-import-export.php:204
1030
+ msgid "Bulk Import"
1031
+ msgstr "Массовый импорт"
1032
+
1033
+ #: includes/admin-import-export.php:209
1034
+ msgid "Import & Export Settings"
1035
+ msgstr "Настройки импорта и экспорта"
1036
+
1037
+ #: includes/admin-import-export.php:211 includes/admin-import-export.php:218
1038
+ msgid "Export Settings"
1039
+ msgstr "Настройки экспорта"
1040
+
1041
+ #: includes/admin-import-export.php:212
1042
+ msgid ""
1043
+ "Click the <strong>Export Settings</strong> button to generate a file "
1044
+ "containing all the settings used by WP RSS Aggregator"
1045
+ msgstr ""
1046
+ "Нажмите на кнопку <strong>Настройки экспорта</strong>, чтобы сгенерировать "
1047
+ "файл, содержащий все настройки, используемые в WP RSS Aggregator"
1048
+
1049
+ #: includes/admin-import-export.php:213
1050
+ msgid ""
1051
+ "After exporting, you can either use the backup file to restore your settings "
1052
+ "to this site or to another WordPress site."
1053
+ msgstr ""
1054
+ "После экспорта вы можете использовать файл резервной копии для "
1055
+ "восстановления настроек на этом сайте или на другом WordPress сайте."
1056
+
1057
+ #: includes/admin-import-export.php:222 includes/admin-import-export.php:230
1058
+ msgid "Import Settings"
1059
+ msgstr "Настройки импорта"
1060
+
1061
+ #: includes/admin-import-export.php:223
1062
+ msgid "Click the <strong>Choose file</strong> button and choose a backup file."
1063
+ msgstr ""
1064
+ "Нажмите кнопку <strong>Выбрать файл</strong> и выберите файл резервной копии."
1065
+
1066
+ #: includes/admin-import-export.php:224
1067
+ msgid ""
1068
+ "Press the <strong>Import Settings</strong> button, and WordPress will do the "
1069
+ "rest for you."
1070
+ msgstr ""
1071
+ "Нажмите на кнопку <strong>Настройки импорта</strong> и WordPress сделает все "
1072
+ "остальное за вас."
1073
+
1074
+ #: includes/admin-import-export.php:234
1075
+ msgid "Importing/Exporting Feed Sources"
1076
+ msgstr "Импорт/Экспорт источников лент"
1077
+
1078
+ #: includes/admin-import-export.php:235
1079
+ #, php-format
1080
+ msgid ""
1081
+ "To import/export your feed sources, please use the standard WordPress <a "
1082
+ "href=\"%1$simport.php\">Import</a> and <a href=\"%1$sexport.php\">Export</a> "
1083
+ "functionality."
1084
+ msgstr ""
1085
+ "Чтобы импортировать/экспортировать свои источники лент, пожалуйста, "
1086
+ "используйте стандартный функционал WordPress <a href=\"%1$simport.php"
1087
+ "\">Импорт</a> и <a href=\"%1$sexport.php\">Экспорт</a>."
1088
+
1089
+ #: includes/admin-import-export.php:236
1090
+ #, php-format
1091
+ msgid ""
1092
+ "On the <a href=\"%1$sexport.php\">Export</a> page, check the <strong>Feed "
1093
+ "Sources</strong> radio button and click the <strong>Download Export File</"
1094
+ "strong> button. WordPress will then create an XML file containing all the "
1095
+ "feed sources."
1096
+ msgstr ""
1097
+ "На странице <a href=\"%1$sexport.php\">Экспорт</a> проверьте радиокнопку "
1098
+ "<strong>Источники лент</strong> и нажмите кнопку <strong>Скачать файл "
1099
+ "экспорта</strong>. WordPress создаст XML-файл, содержащий все источники лент."
1100
+
1101
+ #: includes/admin-import-export.php:237
1102
+ #, php-format
1103
+ msgid ""
1104
+ "On the <a href=\"%1$simport.php\">Import</a> page, choose the previously "
1105
+ "created file and click the <strong>Upload file and import</strong> button."
1106
+ msgstr ""
1107
+ "На странице <a href=\"%1$simport.php\">Импорт</a> выберите ранее созданный "
1108
+ "файл и нажмите на кнопку <strong>Загрузить файл и импортировать</strong>."
1109
+
1110
+ #: includes/admin-log.php:236
1111
+ msgid "Log level threshold"
1112
+ msgstr "Журнал уровня порога"
1113
+
1114
+ #: includes/admin-metaboxes.php:20
1115
+ msgid "Save Feed Source"
1116
+ msgstr "Сохранить источник ленты"
1117
+
1118
+ #: includes/admin-metaboxes.php:29
1119
+ msgid "Feed Preview"
1120
+ msgstr "Предварительный просмотр ленты"
1121
+
1122
+ #: includes/admin-metaboxes.php:38
1123
+ msgid "Feed Processing"
1124
+ msgstr "Обработка ленты"
1125
+
1126
+ #: includes/admin-metaboxes.php:48
1127
+ msgid "Like This Plugin?"
1128
+ msgstr "Нравится этот плагин?"
1129
+
1130
+ #: includes/admin-metaboxes.php:58
1131
+ msgid "Feed Source Details"
1132
+ msgstr "Данные источника ленты"
1133
+
1134
+ #: includes/admin-metaboxes.php:91 includes/opml-importer.php:196
1135
+ #: includes/opml-importer.php:227
1136
+ msgid "URL"
1137
+ msgstr "Адрес"
1138
+
1139
+ #: includes/admin-metaboxes.php:99
1140
+ msgid "Limit"
1141
+ msgstr "Лимит"
1142
+
1143
+ #: includes/admin-metaboxes.php:105
1144
+ msgid "Link to enclosure"
1145
+ msgstr "Ссылка на приложение"
1146
+
1147
+ #: includes/admin-metaboxes.php:111 includes/admin-options.php:86
1148
+ msgid "Unique titles only"
1149
+ msgstr ""
1150
+
1151
+ #: includes/admin-metaboxes.php:223 includes/admin-metaboxes.php:498
1152
+ #: includes/admin-options.php:826 includes/admin-options.php:928
1153
+ msgid "Default"
1154
+ msgstr "По умолчанию"
1155
+
1156
+ #: includes/admin-metaboxes.php:393
1157
+ #, php-format
1158
+ msgid "Latest %1$s feed items out of %2$s available from %3$s"
1159
+ msgstr "Последние %1$s пункты ленты из %2$s доступных из %3$s"
1160
+
1161
+ #: includes/admin-metaboxes.php:400 includes/scripts.php:87
1162
+ msgid "ago"
1163
+ msgstr "назад"
1164
+
1165
+ #: includes/admin-metaboxes.php:402
1166
+ msgid "No Date"
1167
+ msgstr "Нет даты"
1168
+
1169
+ #: includes/admin-metaboxes.php:423
1170
+ msgid ""
1171
+ "<strong>Invalid feed URL</strong> - Double check the feed source URL setting "
1172
+ "above."
1173
+ msgstr ""
1174
+ "<strong>Некорректный адрес ленты</strong> - Еще раз проверьте настройки "
1175
+ "адреса ленты выше."
1176
+
1177
+ #: includes/admin-metaboxes.php:427
1178
+ #, php-format
1179
+ msgid ""
1180
+ "Not sure where to find the RSS feed on a website? <a target=\"_blank\" href="
1181
+ "\"%1$s\">Click here</a> for a visual guide. "
1182
+ msgstr ""
1183
+ "Не знаете, где найти RSS-канал на сайте? <a target=\"_blank\" href=\"%1$s"
1184
+ "\">Нажмите здесь</a> для наглядного руководства. "
1185
+
1186
+ #: includes/admin-metaboxes.php:432
1187
+ msgid "No feed URL defined yet"
1188
+ msgstr "Еще не указано ни одного адреса ленты"
1189
+
1190
+ #: includes/admin-metaboxes.php:457
1191
+ msgid "Force the feed"
1192
+ msgstr "Принудительно обновить ленту"
1193
+
1194
+ #: includes/admin-metaboxes.php:493
1195
+ msgid "Active"
1196
+ msgstr "Активный"
1197
+
1198
+ #: includes/admin-metaboxes.php:618
1199
+ msgid "Need help?"
1200
+ msgstr "Нужна помощь?"
1201
+
1202
+ #: includes/admin-metaboxes.php:620
1203
+ msgid "Check out the support forum"
1204
+ msgstr "Посетите справочный форум"
1205
+
1206
+ #: includes/admin-metaboxes.php:623
1207
+ msgid "Suggest a new feature"
1208
+ msgstr "Предложить новую функцию"
1209
+
1210
+ #: includes/admin-metaboxes.php:636
1211
+ msgid "Give it a 5 star rating on WordPress.org"
1212
+ msgstr "Оцените плагин по 5-бальной шкале на WordPress.org"
1213
+
1214
+ #: includes/admin-metaboxes.php:637
1215
+ msgid "Donate a token of your appreciation"
1216
+ msgstr "Сделать пожертоввание"
1217
+
1218
+ #: includes/admin-metaboxes.php:641
1219
+ msgid "Check out the Premium Extensions:"
1220
+ msgstr "Ознакомьтесь с премиальными дополнениями:"
1221
+
1222
+ #: includes/admin-metaboxes.php:662
1223
+ msgid "Follow WP Mayor on Twitter."
1224
+ msgstr "Поддержите WP Mayor в Twitter."
1225
+
1226
+ #: includes/admin-metaboxes.php:663
1227
+ msgid "Like WP Mayor on Facebook."
1228
+ msgstr "Поставьте лайк WP Mayor на Facebook."
1229
+
1230
+ #: includes/admin-options.php:56
1231
+ msgid "General plugin settings"
1232
+ msgstr "Общие настройки плагина"
1233
+
1234
+ #: includes/admin-options.php:57
1235
+ msgid "General display settings"
1236
+ msgstr "Общие настройки отображения"
1237
+
1238
+ #: includes/admin-options.php:58
1239
+ msgid "Source display settings"
1240
+ msgstr "Настройки отображения лент"
1241
+
1242
+ #: includes/admin-options.php:59
1243
+ msgid "Date display settings"
1244
+ msgstr "Настройки отображения дат"
1245
+
1246
+ #: includes/admin-options.php:60
1247
+ msgid "Styles"
1248
+ msgstr "Стили"
1249
+
1250
+ #: includes/admin-options.php:70
1251
+ msgid "Limit feed items by age"
1252
+ msgstr "Ограничение пунктов лент по возрасту"
1253
+
1254
+ #: includes/admin-options.php:74
1255
+ msgid "Limit feed items stored"
1256
+ msgstr "Максимальный срок хранения пунктов лент"
1257
+
1258
+ #: includes/admin-options.php:78
1259
+ msgid "Limit feed items per feed"
1260
+ msgstr "Максимальное количество пунктов в ленте"
1261
+
1262
+ #: includes/admin-options.php:82
1263
+ msgid "Feed processing interval"
1264
+ msgstr "Интервал обновления ленты"
1265
+
1266
+ #: includes/admin-options.php:90
1267
+ msgid "Custom feed URL"
1268
+ msgstr "Адрес пользовательской ленты"
1269
+
1270
+ #: includes/admin-options.php:94
1271
+ msgid "Custom feed Title"
1272
+ msgstr "Название пользовательской ленты"
1273
+
1274
+ #: includes/admin-options.php:98
1275
+ msgid "Custom feed limit"
1276
+ msgstr "Лимит пользовательской ленты"
1277
+
1278
+ #: includes/admin-options.php:102
1279
+ msgid "Anonymous tracking"
1280
+ msgstr "Анонимное отслеживание"
1281
+
1282
+ #: includes/admin-options.php:110
1283
+ msgid "Link title"
1284
+ msgstr "Ссылка в названии"
1285
+
1286
+ #: includes/admin-options.php:114
1287
+ msgid "Title maximum length"
1288
+ msgstr "Максимальная длина названия"
1289
+
1290
+ #: includes/admin-options.php:122
1291
+ msgid "Show authors"
1292
+ msgstr "Показать авторов"
1293
+
1294
+ #: includes/admin-options.php:126
1295
+ msgid "For video feed items use"
1296
+ msgstr "Для видео в пунктах ленты использовать"
1297
+
1298
+ #: includes/admin-options.php:130
1299
+ msgid "Pagination type"
1300
+ msgstr "Тип пагинации"
1301
+
1302
+ #: includes/admin-options.php:134
1303
+ msgid "Feed display limit"
1304
+ msgstr "Максимальное число отображаемых пунктов в ленте"
1305
+
1306
+ #: includes/admin-options.php:138
1307
+ msgid "Open links behaviour"
1308
+ msgstr "Открывать ссылки"
1309
+
1310
+ #: includes/admin-options.php:142
1311
+ msgid "Set links as nofollow"
1312
+ msgstr "Присвоить ссылкам тег nofollow"
1313
+
1314
+ #: includes/admin-options.php:150
1315
+ msgid "Show source"
1316
+ msgstr "Показать источник"
1317
+
1318
+ #: includes/admin-options.php:154
1319
+ msgid "Text preceding source"
1320
+ msgstr "Текст перед источником"
1321
+
1322
+ #: includes/admin-options.php:158
1323
+ msgid "Link source"
1324
+ msgstr "Ссылка на источник"
1325
+
1326
+ #: includes/admin-options.php:166
1327
+ msgid "Show date"
1328
+ msgstr "Показывать дату"
1329
+
1330
+ #: includes/admin-options.php:170
1331
+ msgid "Text preceding date"
1332
+ msgstr "Текст перед датой"
1333
+
1334
+ #: includes/admin-options.php:174
1335
+ msgid "Date format"
1336
+ msgstr "Формат даты"
1337
+
1338
+ #: includes/admin-options.php:178
1339
+ msgid "Time ago format"
1340
+ msgstr "Формат отображения времени \"назад\""
1341
+
1342
+ #: includes/admin-options.php:185
1343
+ msgid "Disable Styles"
1344
+ msgstr "Запретить стили"
1345
+
1346
+ #: includes/admin-options.php:347 includes/admin.php:41
1347
+ msgid "WP RSS Aggregator Settings"
1348
+ msgstr "Настройки WP RSS Aggregator"
1349
+
1350
+ #: includes/admin-options.php:357
1351
+ msgid "General"
1352
+ msgstr "Общие"
1353
+
1354
+ #: includes/admin-options.php:361
1355
+ msgid "Licenses"
1356
+ msgstr "Лицензии"
1357
+
1358
+ #: includes/admin-options.php:401
1359
+ msgid "Save Settings"
1360
+ msgstr "Сохранить настройки"
1361
+
1362
+ #: includes/admin-options.php:415
1363
+ msgid "These are the general settings for WP RSS Aggregator."
1364
+ msgstr "Это общие настройки WP RSS Aggregator."
1365
+
1366
+ #: includes/admin-options.php:424
1367
+ msgid ""
1368
+ "In this section you can find some general options that control how the feed "
1369
+ "items are displayed."
1370
+ msgstr ""
1371
+ "В этом разделе вы можете найти некоторые общие настройки, которые "
1372
+ "определяют, как отображаются пункты лент."
1373
+
1374
+ #: includes/admin-options.php:434
1375
+ msgid "Options that control how the feed item's source is displayed."
1376
+ msgstr "Опции, определяющие, как будет отображаться источник пункта ленты."
1377
+
1378
+ #: includes/admin-options.php:443
1379
+ msgid "Options that control how the feed item's date is displayed."
1380
+ msgstr "Опции, определяющие, как будет отображаться дата пунктов лент."
1381
+
1382
+ #: includes/admin-options.php:452
1383
+ msgid ""
1384
+ "If you would like to disable all styles used in this plugin, tick the "
1385
+ "checkbox."
1386
+ msgstr ""
1387
+ "Если вы хотите отключить все стили, используемые в этом плагине, поставьте "
1388
+ "галочку."
1389
+
1390
+ #: includes/admin-options.php:461
1391
+ msgid "Set your security reset code, in case of any errors."
1392
+ msgstr "Установите код сброса, используемый в случае каких-либо ошибок."
1393
+
1394
+ #: includes/admin-options.php:470
1395
+ msgid "Participate in helping us make the plugin better."
1396
+ msgstr "Принять участие в улучшении плагина."
1397
+
1398
+ #: includes/admin-options.php:497
1399
+ msgid "Original page link"
1400
+ msgstr "Ссылка на оригинал"
1401
+
1402
+ #: includes/admin-options.php:498
1403
+ msgid "Embedded video player link"
1404
+ msgstr "Ссылка на встроенный видеопроигрыватель"
1405
+
1406
+ #: includes/admin-options.php:512
1407
+ msgid "This will not affect already imported feed items."
1408
+ msgstr "Это не повлияет на ранее импортированные пункты лент."
1409
+
1410
+ #: includes/admin-options.php:527
1411
+ msgid "Lightbox"
1412
+ msgstr "Лайтбокс"
1413
+
1414
+ #: includes/admin-options.php:528 includes/update.php:195
1415
+ msgid "New window"
1416
+ msgstr "Новое окно"
1417
+
1418
+ #: includes/admin-options.php:529
1419
+ msgid "Self"
1420
+ msgstr "Это же окно"
1421
+
1422
+ #: includes/admin-options.php:567
1423
+ msgid "PHP Date Format Reference"
1424
+ msgstr "Формат даты PHP"
1425
+
1426
+ #: includes/admin-options.php:595 includes/admin-options.php:706
1427
+ msgid "No limit"
1428
+ msgstr "Без ограничений"
1429
+
1430
+ #: includes/admin-options.php:677
1431
+ msgid "\"Older posts\" and \"Newer posts\" links"
1432
+ msgstr "Ссылки на \"Предыдущие записи\" и \"Следующие записи\""
1433
+
1434
+ #: includes/admin-options.php:678
1435
+ msgid "Page numbers with \"Next\" and \"Previous\" page links"
1436
+ msgstr "Номера страниц со ссылками \"Следующая\" и \"Предыдущая\""
1437
+
1438
+ #: includes/admin-options.php:740
1439
+ msgid "No Limit"
1440
+ msgstr "Без ограничений"
1441
+
1442
+ #: includes/admin-options.php:852
1443
+ msgid "Generate Random Code"
1444
+ msgstr "Сгенерировать произвольный код"
1445
+
1446
+ #: includes/admin-options.php:857
1447
+ msgid ""
1448
+ "Enter the code to use to securely reset the plugin and deactivate it. Be "
1449
+ "sure to save this code somewhere safe."
1450
+ msgstr ""
1451
+ "Введите код, используемый для сброса и отключения плагина. Обязательно "
1452
+ "сохраните этот код в надежном месте."
1453
+
1454
+ #: includes/admin-options.php:863
1455
+ msgid ""
1456
+ "Leave this empty to disable the secure reset function.<br/>\n"
1457
+ " You use this code by adding any of the following to any URL on "
1458
+ "your site."
1459
+ msgstr ""
1460
+ "Оставьте поле пустым, чтобы отключить функцию сброса.\n"
1461
+ " Вы можете использовать этот код, добавив его к любому адресу на "
1462
+ "вашем сайте."
1463
+
1464
+ #: includes/admin-options.php:866
1465
+ msgid "Resets your WP RSS Aggregator settings"
1466
+ msgstr "Сброс настроек WP RSS Aggregator"
1467
+
1468
+ #: includes/admin-options.php:867
1469
+ msgid "Deactivates WP RSS Aggregator"
1470
+ msgstr "Деактивировать WP RSS Aggregator"
1471
+
1472
+ #: includes/admin-options.php:868
1473
+ msgid "Does both of the above"
1474
+ msgstr "Использовать оба варианта выше"
1475
+
1476
+ #: includes/admin-options.php:872
1477
+ msgid ""
1478
+ "Use the above actions only when absolutely necessary, or when instructed to "
1479
+ "by support staff."
1480
+ msgstr ""
1481
+ "Используйте вышепредставленные действия только тогда, когда это абсолютно "
1482
+ "необходимо, или когда проинструктированы службой поддержки."
1483
+
1484
+ #: includes/admin-options.php:888
1485
+ msgid ""
1486
+ "Please help us improve WP RSS Aggregator by allowing us to gather anonymous "
1487
+ "usage statistics. No sensitive data is collected."
1488
+ msgstr ""
1489
+ "Пожалуйста, помогите нам улучшить WP RSS агрегатор, позволяя нам собирать "
1490
+ "анонимную статистику использования. Конфиденциальные данные не собираются."
1491
+
1492
+ #: includes/admin-options.php:943
1493
+ msgid "now"
1494
+ msgstr "сейчас"
1495
+
1496
+ #: includes/admin-statistics.php:149
1497
+ msgid "<b>WP RSS Aggregator:</b> Data report sent!"
1498
+ msgstr "<b>WP RSS Aggregator:</b> Данные отправлены!"
1499
+
1500
+ #: includes/admin-welcome.php:32
1501
+ #, php-format
1502
+ msgid "Welcome to WP RSS Aggregator %1$s!"
1503
+ msgstr "Добро пожаловать в WP RSS Aggregator %1$s!"
1504
+
1505
+ #: includes/admin-welcome.php:34
1506
+ msgid "Thank you for upgrading to the latest version!"
1507
+ msgstr "Спасибо за обновление до последней версии!"
1508
+
1509
+ #: includes/admin-welcome.php:42
1510
+ msgid "What's New?"
1511
+ msgstr "Что нового?"
1512
+
1513
+ #: includes/admin-welcome.php:66
1514
+ msgid "Bulk Adding Feed Sources"
1515
+ msgstr "Массовое добавление источников лент"
1516
+
1517
+ #: includes/admin-welcome.php:69
1518
+ #, php-format
1519
+ msgid ""
1520
+ "The new bulk adding option saves you time by allowing you to enter your feed "
1521
+ "names and URLs all at once.\n"
1522
+ "\t\t\t\t\t\t\t\t\t\tSimply type in or paste your feed sources, and with the "
1523
+ "press of a button, your feed sources will instantly be created!\n"
1524
+ "\t\t\t\t\t\t\t\t\t\tTry it now from the <a href=\"%1$s\">Import &amp; "
1525
+ "Export</a> page."
1526
+ msgstr ""
1527
+ "Новая опция массового добавления экономит ваше время, позволяя указать сразу "
1528
+ "все названия и адреса лент.\n"
1529
+ "\t\t\t\t\t\t\t\t\t\tПросто введите или вставьте источники лент и, с нажатием "
1530
+ "кнопки, ваши ленты будут немедленно созданы!\n"
1531
+ "\t\t\t\t\t\t\t\t\t\tПопробуйте прямо сейчас на странице <a href=\"%1$s"
1532
+ "\">Импорт и экспорт</a>."
1533
+
1534
+ #: includes/admin-welcome.php:74
1535
+ msgid "Feed Item Blacklist"
1536
+ msgstr "Черный список пунктов лент"
1537
+
1538
+ #: includes/admin-welcome.php:78
1539
+ msgid "Trash undesired items"
1540
+ msgstr "Удалить нежелательные пункты"
1541
+
1542
+ #: includes/admin-welcome.php:79
1543
+ msgid ""
1544
+ "Did a feed import an item that you do not wish to keep? Up till now, "
1545
+ "<strong>WP RSS Aggregator</strong>only allowed you to trash the item and "
1546
+ "keep it in your trash."
1547
+ msgstr ""
1548
+ "Продолжать импорт пункта ленты, который вы не хотите хранить? До сих пор "
1549
+ "<strong>WP RSS Aggregator</strong> разрешал только отправлять пункты в "
1550
+ "корзину и держать их там."
1551
+
1552
+ #: includes/admin-welcome.php:84
1553
+ msgid "Blacklist Trashed Items"
1554
+ msgstr "Черный список пунктов в корзине"
1555
+
1556
+ #: includes/admin-welcome.php:85
1557
+ msgid ""
1558
+ "Permanently deleting the item will cause it to be re-imported. Using the new "
1559
+ "<strong>Delete Permanently &amp; Blacklist</strong> option, the feed item is "
1560
+ "deleted and added to the <strong>Blacklist</strong>."
1561
+ msgstr ""
1562
+ "Постоянное удаление пункта приведет к его повторному импорту. Используйте "
1563
+ "новую опцию <strong>Удалить и внести в черный список</strong>, чтобы удалить "
1564
+ "пункт и внести его в черный список."
1565
+
1566
+ #: includes/admin-welcome.php:91
1567
+ msgid "The Blacklist"
1568
+ msgstr "Черный список"
1569
+
1570
+ #: includes/admin-welcome.php:92
1571
+ msgid ""
1572
+ "This is your list of unwanted feed item links. Any item in this list will be "
1573
+ "ignored by <strong>WP RSS Aggregator</strong> in the future, meaning it "
1574
+ "won't be imported from any of your feed sources.and added to the "
1575
+ "<strong>Blacklist</strong>."
1576
+ msgstr ""
1577
+ "Это ваш список нежелательных пунктов лент. Любой пункт из этого списка будет "
1578
+ "игнорироваться <strong>WP RSS Aggregator</strong> в будущем, то есть он не "
1579
+ "будет импортироваться из любых источников лент и будет добавлен в "
1580
+ "<strong>Черный список</strong>."
1581
+
1582
+ #: includes/admin-welcome.php:100
1583
+ msgid "Check out our add-ons:"
1584
+ msgstr "Ознакомьтесь с нашими дополнениями:"
1585
+
1586
+ #: includes/admin-welcome.php:104
1587
+ msgid "Excerpts &amp; Thumbnails"
1588
+ msgstr "Отрывки и эскизы"
1589
+
1590
+ #: includes/admin-welcome.php:111
1591
+ #, php-format
1592
+ msgid ""
1593
+ "More information about add-ons can be found on our website <a href=\"%1$s\">"
1594
+ "%2$s</a>"
1595
+ msgstr ""
1596
+ "Больше информации о наших дополнениях вы можете найти на нашем сайте <a href="
1597
+ "\"%1$s\">%2$s</a>"
1598
+
1599
+ #: includes/admin-welcome.php:117
1600
+ #, php-format
1601
+ msgid "Changelog for v%1$s"
1602
+ msgstr "Список изменений для v%1$s"
1603
+
1604
+ #: includes/admin-welcome.php:123
1605
+ #, php-format
1606
+ msgid ""
1607
+ "Need functionality not already available in core or the add-ons? You can <a "
1608
+ "href=\"%1$s\">suggest new features</a>!"
1609
+ msgstr ""
1610
+ "Необходимые вам функции не доступны в плагине или дополнениях? Вы можете <a "
1611
+ "href=\"%1$s\">предложить новые функции</a>!"
1612
+
1613
+ #: includes/admin-welcome.php:134
1614
+ msgid ""
1615
+ "Fetch RSS feed excerpts to your blog and add thumbnails! Perfect for adding "
1616
+ "some life and color to your feeds."
1617
+ msgstr ""
1618
+ "Добавляет возможность отображения эскизов и отрывков. Идеально подходит для "
1619
+ "добавления ярких красок в вашу ленту."
1620
+
1621
+ #: includes/admin-welcome.php:144
1622
+ msgid ""
1623
+ "Organize your feeds into custom categories. Filter feed items by category "
1624
+ "and make custom WordPress feeds for specific categories."
1625
+ msgstr ""
1626
+ "Структурируйте ленты в категориях. Фильтруйте пункты по категории и сделайте "
1627
+ "пользовательский rss-каналы для определенных категорий."
1628
+
1629
+ #: includes/admin-welcome.php:154
1630
+ msgid ""
1631
+ "Import and store feeds that contain specific keywords in either the title or "
1632
+ "their content. Control what gets imported to your blog."
1633
+ msgstr ""
1634
+ "Импортируйте и храните ленты, которые содержат определенные ключевые слова в "
1635
+ "названии или содержании. Полностью контролируйте то, что импортируется в ваш "
1636
+ "блог."
1637
+
1638
+ #: includes/admin-welcome.php:164
1639
+ msgid "Go to WP RSS Aggregator settings"
1640
+ msgstr "Перейти к настройкам WP RSS Aggregator"
1641
+
1642
+ #: includes/admin.php:40
1643
+ msgid "Export & Import Settings"
1644
+ msgstr "Настройки экспорта и импорта"
1645
+
1646
+ #: includes/admin.php:40
1647
+ msgid "Import & Export"
1648
+ msgstr "Импорт и Экспорт"
1649
+
1650
+ #: includes/admin.php:41 includes/admin.php:111
1651
+ msgid "Settings"
1652
+ msgstr "Настройки"
1653
+
1654
+ #: includes/admin.php:94
1655
+ msgid "Name this feed (e.g. WP Mayor)"
1656
+ msgstr "Название этой ленты (например, WP Mayor)"
1657
+
1658
+ #: includes/admin.php:139
1659
+ #, php-format
1660
+ msgid ""
1661
+ "<b>WP RSS Aggregator</b>: There are saved licenses that have not yet been "
1662
+ "activated. Go to the <a href=\"%1$s\">License page</a> to activate them."
1663
+ msgstr ""
1664
+ "<b>WP RSS Aggregator</b>: Это сохраненные лицензии, которые еще не были "
1665
+ "активированы. Перейдите на <a href=\"%1$s\">страницу лицензий</a> для их "
1666
+ "активации."
1667
+
1668
+ #: includes/cpt-feeds.php:82
1669
+ #, php-format
1670
+ msgid "%1$s &raquo; %2$s Feed"
1671
+ msgstr "%1$s &raquo; %2$s лента"
1672
+
1673
+ #: includes/cpt-feeds.php:83
1674
+ #, php-format
1675
+ msgid "<link rel=\"%1$s\" type=\"%2$s\" title=\"%3$s\" href=\"%4$s\" />\n"
1676
+ msgstr "<link rel=\"%1$s\" type=\"%2$s\" title=\"%3$s\" href=\"%4$s\" />\n"
1677
+
1678
+ #: includes/cron-jobs.php:64
1679
+ msgid "Once every five minutes"
1680
+ msgstr "Раз в 5 минут"
1681
+
1682
+ #: includes/cron-jobs.php:68
1683
+ msgid "Once every ten minutes"
1684
+ msgstr "Раз в 10 минут"
1685
+
1686
+ #: includes/cron-jobs.php:72
1687
+ msgid "Once every fifteen minutes"
1688
+ msgstr "Раз в 15 минут"
1689
+
1690
+ #: includes/cron-jobs.php:76
1691
+ msgid "Once every thirty minutes"
1692
+ msgstr "Раз в тридцать минут"
1693
+
1694
+ #: includes/cron-jobs.php:80
1695
+ msgid "Once every two hours"
1696
+ msgstr "Раз в два часа"
1697
+
1698
+ #: includes/custom-post-types.php:22
1699
+ msgid "Feed Source"
1700
+ msgstr "Источник ленты"
1701
+
1702
+ #: includes/custom-post-types.php:23
1703
+ msgid "Add New"
1704
+ msgstr "Добавить новый"
1705
+
1706
+ #: includes/custom-post-types.php:25
1707
+ msgid "Add New Feed Source"
1708
+ msgstr "Добавить новый источник ленты"
1709
+
1710
+ #: includes/custom-post-types.php:26
1711
+ msgid "Edit Feed Source"
1712
+ msgstr "Редактировать источник ленты"
1713
+
1714
+ #: includes/custom-post-types.php:27
1715
+ msgid "New Feed Source"
1716
+ msgstr "Новый источник ленты"
1717
+
1718
+ #: includes/custom-post-types.php:28
1719
+ msgid "View Feed Source"
1720
+ msgstr "Просмотр источника ленты"
1721
+
1722
+ #: includes/custom-post-types.php:29
1723
+ msgid "Search Feeds"
1724
+ msgstr "Поиск лент"
1725
+
1726
+ #: includes/custom-post-types.php:30
1727
+ msgid "No Feed Sources Found"
1728
+ msgstr "Не найдено источников лент"
1729
+
1730
+ #: includes/custom-post-types.php:31
1731
+ msgid "No Feed Sources Found In Trash"
1732
+ msgstr "Не найдено источников лент в корзине"
1733
+
1734
+ #: includes/custom-post-types.php:32
1735
+ msgid "RSS Aggregator"
1736
+ msgstr "RSS Aggregator"
1737
+
1738
+ #: includes/custom-post-types.php:72 includes/custom-post-types.php:74
1739
+ msgid "Feed Items"
1740
+ msgstr "Пункты лент"
1741
+
1742
+ #: includes/custom-post-types.php:73
1743
+ msgid "Feed Item"
1744
+ msgstr "Пункт ленты"
1745
+
1746
+ #: includes/custom-post-types.php:75
1747
+ msgid "View Feed Items"
1748
+ msgstr "Просмотр пунктов лент"
1749
+
1750
+ #: includes/custom-post-types.php:76
1751
+ msgid "Search Feed Items"
1752
+ msgstr "Поиск пунктов лент"
1753
+
1754
+ #: includes/custom-post-types.php:77
1755
+ msgid "No Feed Items Found"
1756
+ msgstr "Не найдено пунктов лент"
1757
+
1758
+ #: includes/custom-post-types.php:78
1759
+ msgid "No Feed Items Found In Trash"
1760
+ msgstr "Не найдено пунктов лент в корзине"
1761
+
1762
+ #: includes/feed-access.php:119
1763
+ msgid "Certificate Path"
1764
+ msgstr ""
1765
+
1766
+ #: includes/feed-blacklist.php:129
1767
+ msgid "The item you are trying to blacklist does not exist"
1768
+ msgstr "Пункта, который вы пытаетесь добавить в черный список, не существует"
1769
+
1770
+ #: includes/feed-blacklist.php:134
1771
+ msgid "The item you are trying to blacklist is not valid!"
1772
+ msgstr "Пункт, который вы пытаетесь добавить в черный список, некорректный"
1773
+
1774
+ #: includes/feed-blacklist.php:196 includes/feed-blacklist.php:197
1775
+ #: includes/feed-blacklist.php:198
1776
+ msgid "Blacklist"
1777
+ msgstr "Черный список"
1778
+
1779
+ #: includes/feed-blacklist.php:199
1780
+ msgid "Search Blacklist"
1781
+ msgstr "Поиск черных списков"
1782
+
1783
+ #: includes/feed-blacklist.php:200
1784
+ msgid "You do not have any items blacklisted yet!"
1785
+ msgstr "У вас нет пунктов в черном списке!"
1786
+
1787
+ #: includes/feed-blacklist.php:242
1788
+ msgid "Delete Permanently & Blacklist"
1789
+ msgstr "Удалить навсегда и добавить в черный список"
1790
+
1791
+ #: includes/feed-blacklist.php:248
1792
+ msgid ""
1793
+ "The item will be deleted permanently, and its permalink will be recorded in "
1794
+ "the blacklist"
1795
+ msgstr ""
1796
+ "Пункт будет удален навсегда и его постоянная ссылка будет добавлена в черный "
1797
+ "список"
1798
+
1799
+ #: includes/feed-blacklist.php:261
1800
+ msgid "Remove from blacklist"
1801
+ msgstr "Удалить из черного списка"
1802
+
1803
+ #: includes/feed-blacklist.php:321 includes/opml-importer.php:195
1804
+ #: includes/opml-importer.php:226
1805
+ msgid "Title"
1806
+ msgstr "Название"
1807
+
1808
+ #: includes/feed-display.php:359
1809
+ msgid "No feed items found."
1810
+ msgstr "Пункты лент не найдены"
1811
+
1812
+ #: includes/feed-display.php:409
1813
+ msgid "Older posts"
1814
+ msgstr "Предыдущие записи"
1815
+
1816
+ #: includes/feed-display.php:410
1817
+ msgid "Newer posts"
1818
+ msgstr "Следующие записи"
1819
+
1820
+ #: includes/feed-importing.php:289
1821
+ #, php-format
1822
+ msgid "Failed to fetch the RSS feed. Error: %s"
1823
+ msgstr "Не удалось получить RSS-ленту. Ошибка: %s"
1824
+
1825
+ #: includes/feed-importing.php:678
1826
+ #, php-format
1827
+ msgid ""
1828
+ "The PHP script timed out while importing an item from this feed, after %d "
1829
+ "seconds."
1830
+ msgstr "Истекло время импорта пункта из этой ленты после %d секунд."
1831
+
1832
+ #: includes/feed-states.php:110
1833
+ msgid "The feed sources have been activated!"
1834
+ msgstr "Источники ленты были активированы!"
1835
+
1836
+ #: includes/feed-states.php:124
1837
+ msgid "The feed sources have been paused!!"
1838
+ msgstr "Источники ленты были приостановлены!"
1839
+
1840
+ #: includes/libraries/EDD_licensing/EDD_SL_Plugin_Updater.php:177
1841
+ #, php-format
1842
+ msgid ""
1843
+ "There is a new version of %1$s available. <a target=\"_blank\" class="
1844
+ "\"thickbox\" href=\"%2$s\">View version %3$s details</a>."
1845
+ msgstr ""
1846
+ "Доступна новая версия %1$s. <a target=\"_blank\" class=\"thickbox\" href="
1847
+ "\"%2$s\">Посмотреть детали версии %3$s</a>."
1848
+
1849
+ #: includes/libraries/EDD_licensing/EDD_SL_Plugin_Updater.php:184
1850
+ #, php-format
1851
+ msgid ""
1852
+ "There is a new version of %1$s available. <a target=\"_blank\" class="
1853
+ "\"thickbox\" href=\"%2$s\">View version %3$s details</a> or <a href=\"%4$s"
1854
+ "\">update now</a>."
1855
+ msgstr ""
1856
+ "Доступна новая версия %1$s. <a target=\"_blank\" class=\"thickbox\" href="
1857
+ "\"%2$s\">Посмотреть детали версии %3$s</a> или <a href=\"%4$s\">обновить "
1858
+ "сейчас</a>."
1859
+
1860
+ #: includes/libraries/EDD_licensing/EDD_SL_Plugin_Updater.php:324
1861
+ msgid "You do not have permission to install plugin updates"
1862
+ msgstr "У вас нет прав на установку обновлений плагина"
1863
+
1864
+ #: includes/libraries/EDD_licensing/EDD_SL_Plugin_Updater.php:324
1865
+ msgid "Error"
1866
+ msgstr "Ошибка"
1867
+
1868
+ #: includes/licensing.php:303
1869
+ #, php-format
1870
+ msgid ""
1871
+ "Remember to <a href=\"%s\">enter your plugin license code</a> for the WP RSS "
1872
+ "Aggregator <b>%s</b> add-on to benefit from updates and support."
1873
+ msgstr ""
1874
+ "Не забудьте <a href=\"%s\">ввести ваш код лицензии плагина</a> для "
1875
+ "дополнения WP RSS Aggregator <b>%s</b> для получения обновлений и поддержки."
1876
+
1877
+ #: includes/licensing.php:329
1878
+ #, php-format
1879
+ msgid ""
1880
+ "<a href=\"%s\">Save 30%% on your license renewal</a> for the WP RSS "
1881
+ "Aggregator <b>%s</b> add-on and continue receiving updates and support."
1882
+ msgstr ""
1883
+ "<a href=\"%s\">Сэкономьте 30%% на продлении вашей лицензии</a> для "
1884
+ "дополнения WP RSS Aggregator <b>%s</b> и продолжайте получать обновления и "
1885
+ "поддержку."
1886
+
1887
+ #: includes/licensing.php:364 includes/licensing.php:450
1888
+ msgid "No addon ID"
1889
+ msgstr "Нет ID дополнения"
1890
+
1891
+ #: includes/licensing.php:372 includes/licensing.php:414
1892
+ msgid "Invalid event specified"
1893
+ msgstr "Указано недопустимое событие"
1894
+
1895
+ #: includes/licensing.php:375
1896
+ msgid "No event specified"
1897
+ msgstr "Не указаны события"
1898
+
1899
+ #: includes/licensing.php:382
1900
+ msgid "No license"
1901
+ msgstr "Нет лицензии"
1902
+
1903
+ #: includes/licensing.php:391
1904
+ msgid "Bad nonce"
1905
+ msgstr "Неверный номер"
1906
+
1907
+ #: includes/licensing.php:394
1908
+ msgid "No nonce"
1909
+ msgstr "Нет номера"
1910
+
1911
+ #: includes/licensing.php:490
1912
+ msgid "License"
1913
+ msgstr "Лицензия"
1914
+
1915
+ #: includes/licensing.php:497
1916
+ msgid "License Key"
1917
+ msgstr "Лицензионный ключ"
1918
+
1919
+ #: includes/licensing.php:506
1920
+ msgid "Activate License"
1921
+ msgstr "Активировать лицензию"
1922
+
1923
+ #: includes/licensing.php:540
1924
+ msgid "Enter your license key"
1925
+ msgstr "Введите ваш лицензионный ключ"
1926
+
1927
+ #: includes/licensing.php:565
1928
+ msgid "Status"
1929
+ msgstr "Статус"
1930
+
1931
+ #: includes/licensing.php:596
1932
+ msgid ""
1933
+ "No activations left. Click here to manage the sites you've activated "
1934
+ "licenses on."
1935
+ msgstr ""
1936
+ "Не осталось доступных активаций. Нажмите здесь для управления "
1937
+ "активированными лицензиями на ваших сайтах."
1938
+
1939
+ #: includes/licensing.php:601
1940
+ msgid "Renew your license to continue receiving updates and support."
1941
+ msgstr ""
1942
+ "Продлите вашу лицензию для продолжения получения обновлений и поддержки."
1943
+
1944
+ #: includes/licensing.php:604
1945
+ msgid "Activations"
1946
+ msgstr "Активации"
1947
+
1948
+ #: includes/licensing.php:607
1949
+ msgid "Expires on"
1950
+ msgstr "Истекает"
1951
+
1952
+ #: includes/licensing.php:610
1953
+ msgid "Registered to"
1954
+ msgstr "Зарегистрирована на"
1955
+
1956
+ #: includes/licensing.php:615
1957
+ msgid ""
1958
+ "Failed to get license information. This is a temporary problem. Check your "
1959
+ "internet connection and try again later."
1960
+ msgstr ""
1961
+ "Не удалось получить информацию о лицензии. Это временная проблема. Проверьте "
1962
+ "подключение к Интернету и повторите попытку позже."
1963
+
1964
+ #: includes/misc-functions.php:312
1965
+ msgid "&hellip;"
1966
+ msgstr "&hellip;"
1967
+
1968
+ #: includes/opml-importer.php:65
1969
+ msgid "Import OPML"
1970
+ msgstr "Импорт OPML"
1971
+
1972
+ #: includes/opml-importer.php:75
1973
+ msgid "Howdy! Import your feeds here from an OPML (.xml) export file."
1974
+ msgstr "Привет! Импортируйте ваши ленты здесь из файла экспорта OPML (.xml)."
1975
+
1976
+ #: includes/opml-importer.php:76
1977
+ msgid "Click the button below, choose your file, and click 'Upload'."
1978
+ msgstr "Нажмите на кнопку ниже, выберите файл и нажмите кнопку \"Загрузить\"."
1979
+
1980
+ #: includes/opml-importer.php:77
1981
+ msgid "We will take care of the rest."
1982
+ msgstr "Мы позаботимся об остальном."
1983
+
1984
+ #: includes/opml-importer.php:108
1985
+ msgid "Sorry, an error has been encountered."
1986
+ msgstr "Извините, была найдена ошибка."
1987
+
1988
+ #: includes/opml-importer.php:113
1989
+ msgid "Sorry, it seems your uploaded file has been misplaced!"
1990
+ msgstr "Извините, кажется, ваш загруженный файл не был распознан!"
1991
+
1992
+ #: includes/opml-importer.php:114
1993
+ msgid "The uploaded file could not be found at "
1994
+ msgstr "Загруженный файл не может быть найден в"
1995
+
1996
+ #: includes/opml-importer.php:115
1997
+ msgid "It is likely that this was caused by a permissions problem."
1998
+ msgstr "Вполне вероятно, что это было вызвано проблемой допусков и разрешений."
1999
+
2000
+ #: includes/opml-importer.php:187
2001
+ msgid "Feeds were imported successfully!"
2002
+ msgstr "Ленты были успешно импортированы!"
2003
+
2004
+ #: includes/opml-importer.php:194 includes/opml-importer.php:225
2005
+ msgid "ID"
2006
+ msgstr "ID"
2007
+
2008
+ #: includes/opml-importer.php:257
2009
+ msgid "WP RSS OPML"
2010
+ msgstr "WP RSS OPML"
2011
+
2012
+ #: includes/opml-importer.php:258
2013
+ msgid "Import Feeds from an OPML file into WP RSS Aggregator"
2014
+ msgstr "Импорт ленты из OPML файла в WP RSS Aggregator"
2015
+
2016
+ #: includes/scripts.php:31 includes/scripts.php:54
2017
+ msgid "Please wait ..."
2018
+ msgstr "Пожалуйста, подождите ..."
2019
+
2020
+ #: includes/scripts.php:52
2021
+ msgid "Failed to import"
2022
+ msgstr "Ошибка импорта"
2023
+
2024
+ #: includes/scripts.php:53
2025
+ msgid "Items are importing"
2026
+ msgstr "Импорт пунктов"
2027
+
2028
+ #: includes/scripts.php:55
2029
+ msgid "Bulk Add"
2030
+ msgstr "Массовое добавление"
2031
+
2032
+ #: includes/scripts.php:56
2033
+ msgid "OK"
2034
+ msgstr "OK"
2035
+
2036
+ #: includes/scripts.php:57
2037
+ msgid "Cancel"
2038
+ msgstr "Отмена"
2039
+
2040
+ #: includes/scripts.php:58
2041
+ msgid ""
2042
+ "The feed items listed here will be disregarded when importing new items from "
2043
+ "your feed sources."
2044
+ msgstr ""
2045
+ "Пункты лент, перечисленные здесь, будут учитываться при импорте новых "
2046
+ "пунктов из ваших источников лент."
2047
+
2048
+ #: includes/scripts.php:59
2049
+ msgid "Remove selected from Blacklist"
2050
+ msgstr "Удалить выбранные из черного списка"
2051
+
2052
+ #: includes/scripts.php:72
2053
+ msgid "Activate"
2054
+ msgstr "Активировать"
2055
+
2056
+ #: includes/scripts.php:73
2057
+ msgid "Pause"
2058
+ msgstr "Пауза"
2059
+
2060
+ #: includes/scripts.php:79
2061
+ msgid "Move to Trash"
2062
+ msgstr ""
2063
+
2064
+ #: includes/scripts.php:107
2065
+ msgid "Activating..."
2066
+ msgstr "Активация..."
2067
+
2068
+ #: includes/scripts.php:108
2069
+ msgid "Deactivating..."
2070
+ msgstr "Деактивация..."
2071
+
2072
+ #: includes/scripts.php:115
2073
+ msgid "Sending..."
2074
+ msgstr ""
2075
+
2076
+ #: includes/scripts.php:116
2077
+ #, php-format
2078
+ msgid ""
2079
+ "There was an error sending the form. Please use the <a href=\"%s\">contact "
2080
+ "form on our site.</a>"
2081
+ msgstr ""
2082
+
2083
+ #: includes/scripts.php:117
2084
+ msgid ""
2085
+ "Your message has been sent and we'll send you a confirmation e-mail when we "
2086
+ "receive it."
2087
+ msgstr ""
2088
+
2089
+ #: includes/system-info.php:27
2090
+ msgid "System Information"
2091
+ msgstr "Системная информация"
2092
+
2093
+ #: includes/system-info.php:33
2094
+ msgid ""
2095
+ "To copy the system info, click below then press Ctrl + C (PC) or Cmd + C "
2096
+ "(Mac)."
2097
+ msgstr ""
2098
+ "Чтобы скопировать системные данные, нажмите ниже, а затем нажмите Ctrl + C "
2099
+ "(PC) или Cmd + C (Mac)."
2100
+
2101
+ #: includes/system-info.php:38
2102
+ msgid "Download System Info File"
2103
+ msgstr "Скачать файл с системной информацией"
2104
+
2105
+ #: includes/system-info.php:71
2106
+ msgid "Could not determine database driver version"
2107
+ msgstr ""
2108
+
2109
+ #: includes/system-info.php:100
2110
+ msgid "Your server supports fsockopen."
2111
+ msgstr "Ваш сервер поддерживает fsockopen."
2112
+
2113
+ #: includes/system-info.php:100
2114
+ msgid "Your server does not support fsockopen."
2115
+ msgstr "Ваш сервер не поддерживает fsockopen."
2116
+
2117
+ #: includes/update.php:67
2118
+ msgid "No Follow"
2119
+ msgstr "Не поддерживать"
2120
+
2121
+ #: includes/update.php:69
2122
+ msgid "Follow"
2123
+ msgstr "Поддерживать"
2124
+
2125
+ #: wp-rss-aggregator.php:272
2126
+ msgid "Help improve WP RSS Aggregator"
2127
+ msgstr "Помогите улучшить WP RSS Aggregator"
2128
+
2129
+ #: wp-rss-aggregator.php:272
2130
+ msgid ""
2131
+ "You've just installed WP RSS Aggregator. Please helps us improve it by "
2132
+ "allowing us to gather anonymous usage stats so we know which configurations, "
2133
+ "plugins and themes to test with."
2134
+ msgstr ""
2135
+ "Вы только что установили WP RSS Aggregator. Пожалуйста, помогите нам "
2136
+ "улучшить его, позволив нам собирать анонимную статистику использования, "
2137
+ "чтобы мы знали, на каких конфигурациях, плагинах и темах тестировать плагин."
2138
+
2139
+ #: wp-rss-aggregator.php:279
2140
+ msgid "Do not allow tracking"
2141
+ msgstr "Запретить отслеживать"
2142
+
2143
+ #: wp-rss-aggregator.php:280
2144
+ msgid "Allow tracking"
2145
+ msgstr "Разрешить отслеживать"
2146
+
2147
+ #: wp-rss-aggregator.php:406
2148
+ msgid "This plugin requires WordPress version 3.3 or higher."
2149
+ msgstr "Этот плагин требует WordPress версии 3.3 или выше."
2150
+
2151
+ #~ msgid "Support Forums - Core (free version) Plugin Users Only"
2152
+ #~ msgstr "Справочный форум - для пользователей бесплатной версии плагина"
2153
+
2154
+ #~ msgid "Email Ticketing System - Premium Add-on Users Only"
2155
+ #~ msgstr "Система тикетов - только для пользователей премиальных дополнений"
readme.txt CHANGED
@@ -1,10 +1,10 @@
1
  === WP RSS Aggregator ===
2
- Contributors: jeangalea, Mekku, xedin.unknown, markzahra, doytch
3
  Plugin URI: http://www.wprssaggregator.com
4
  Tags: rss, feeds, aggregation, rss to post, autoblog aggregator, rss import, feed aggregator, rss aggregator, multiple rss feeds, multi rss feeds, rss multi importer, feed import, feed import, multiple feed import, feed aggregation, rss feader, feed reader, feed to post, multiple feeds, multi feed importer, multi feed import, multi import, autoblogging, autoblogger, rss feeder, rss post importer, autoblog aggregator, autoblog, autopost, content curation, feedwordpress, wp rss multi import, hungryfeed, wp-o-matic, rss feed, rss feed to post, rss retriever, syndication
5
  Requires at least: 3.3
6
- Tested up to: 4.1
7
- Stable tag: 4.7.2
8
  License: GPLv2 or later
9
  The no.1 RSS feed importer for WordPress. Premium add-ons available for more functionality.
10
 
@@ -169,6 +169,14 @@ The full documentation section can be found on the [WP RSS Aggregator website](w
169
 
170
  == Changelog ==
171
 
 
 
 
 
 
 
 
 
172
  = 4.7.2 (2015-06-30) =
173
  * Enhanced: Copyright updated.
174
  * Fixed bug: Word trimming no longer adds extra closing tags at the end.
1
  === WP RSS Aggregator ===
2
+ Contributors: jeangalea, Mekku, xedin.unknown, markzahra, doytch, chiragswadia
3
  Plugin URI: http://www.wprssaggregator.com
4
  Tags: rss, feeds, aggregation, rss to post, autoblog aggregator, rss import, feed aggregator, rss aggregator, multiple rss feeds, multi rss feeds, rss multi importer, feed import, feed import, multiple feed import, feed aggregation, rss feader, feed reader, feed to post, multiple feeds, multi feed importer, multi feed import, multi import, autoblogging, autoblogger, rss feeder, rss post importer, autoblog aggregator, autoblog, autopost, content curation, feedwordpress, wp rss multi import, hungryfeed, wp-o-matic, rss feed, rss feed to post, rss retriever, syndication
5
  Requires at least: 3.3
6
+ Tested up to: 4.2.3
7
+ Stable tag: 4.7.3
8
  License: GPLv2 or later
9
  The no.1 RSS feed importer for WordPress. Premium add-ons available for more functionality.
10
 
169
 
170
  == Changelog ==
171
 
172
+ = 4.7.3 (2015-08-04) =
173
+ * Enhanced: Core now implements an image cache logic.
174
+ * Enhanced: Add-ons on the "Add-ons" page now have an installed-but-inactive status.
175
+ * Enhanced: Google Alerts permalinks will now be normalized.
176
+ * Enhanced: Russian translation added.
177
+ * Fixed bug: Inline help (tooltips) translations now work.
178
+ * Fixed bug: Link to the Feed to Post add-on on the welcome page is no longer broken.
179
+
180
  = 4.7.2 (2015-06-30) =
181
  * Enhanced: Copyright updated.
182
  * Fixed bug: Word trimming no longer adds extra closing tags at the end.
templates/help-tooltip-content.php CHANGED
@@ -10,5 +10,5 @@
10
  */
11
  ?>
12
  <div class="<?php echo $vars['tooltip_content_class'] ?>" id="<?php echo $vars['tooltip_id_prefix'] . $vars['tooltip_id'] ?>">
13
- <?php echo isset( $vars['text_domain'] ) ? __( wpautop( $vars['tooltip_text'] ), $vars['text_domain'] ) : $vars['tooltip_text'] ?>
14
  </div>
10
  */
11
  ?>
12
  <div class="<?php echo $vars['tooltip_content_class'] ?>" id="<?php echo $vars['tooltip_id_prefix'] . $vars['tooltip_id'] ?>">
13
+ <?php echo isset( $vars['text_domain'] ) ? wpautop( $vars['tooltip_text'] ) : $vars['tooltip_text'] ?>
14
  </div>
wp-rss-aggregator.php CHANGED
@@ -3,7 +3,7 @@
3
  Plugin Name: WP RSS Aggregator
4
  Plugin URI: http://www.wprssaggregator.com
5
  Description: Imports and aggregates multiple RSS Feeds using SimplePie
6
- Version: 4.7.2
7
  Author: Jean Galea
8
  Author URI: http://www.wprssaggregator.com
9
  License: GPLv2
@@ -21,7 +21,7 @@
21
  but WITHOUT ANY WARRANTY; without even the implied warranty of
22
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23
  GNU General Public License for more details.
24
-
25
  You should have received a copy of the GNU General Public License
26
  along with this program; if not, write to the Free Software
27
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
@@ -29,7 +29,7 @@
29
 
30
  /**
31
  * @package WPRSSAggregator
32
- * @version 4.7.2
33
  * @since 1.0
34
  * @author Jean Galea <info@wprssaggregator.com>
35
  * @copyright Copyright (c) 2012-2015, Jean Galea
@@ -41,55 +41,55 @@
41
  * Define constants used by the plugin.
42
  */
43
 
44
- // Set the version number of the plugin.
45
  if( !defined( 'WPRSS_VERSION' ) )
46
- define( 'WPRSS_VERSION', '4.7.2', true );
47
 
48
- // Set the database version number of the plugin.
49
  if( !defined( 'WPRSS_DB_VERSION' ) )
50
  define( 'WPRSS_DB_VERSION', 13 );
51
 
52
- // Set the plugin prefix
53
  if( !defined( 'WPRSS_PREFIX' ) )
54
- define( 'WPRSS_PREFIX', 'wprss', true );
55
 
56
- // Set the plugin prefix
57
  if( !defined( 'WPRSS_FILE_CONSTANT' ) )
58
  define( 'WPRSS_FILE_CONSTANT', __FILE__, true );
59
 
60
- // Set constant path to the plugin directory.
61
  if( !defined( 'WPRSS_DIR' ) )
62
- define( 'WPRSS_DIR', plugin_dir_path( __FILE__ ) );
63
 
64
- // Set constant URI to the plugin URL.
65
  if( !defined( 'WPRSS_URI' ) )
66
- define( 'WPRSS_URI', plugin_dir_url( __FILE__ ) );
67
 
68
- // Set the constant path to the plugin's javascript directory.
69
  if( !defined( 'WPRSS_JS' ) )
70
  define( 'WPRSS_JS', WPRSS_URI . trailingslashit( 'js' ), true );
71
 
72
- // Set the constant path to the plugin's CSS directory.
73
  if( !defined( 'WPRSS_CSS' ) )
74
  define( 'WPRSS_CSS', WPRSS_URI . trailingslashit( 'css' ), true );
75
 
76
- // Set the constant path to the plugin's images directory.
77
  if( !defined( 'WPRSS_IMG' ) )
78
  define( 'WPRSS_IMG', WPRSS_URI . trailingslashit( 'images' ), true );
79
 
80
- // Set the constant path to the plugin's includes directory.
81
  if( !defined( 'WPRSS_INC' ) )
82
  define( 'WPRSS_INC', WPRSS_DIR . trailingslashit( 'includes' ), true );
83
 
84
  if( !defined( 'WPRSS_LANG' ) )
85
  define( 'WPRSS_LANG', WPRSS_DIR . trailingslashit( 'languages' ), true );
86
-
87
  // Set the constant path to the plugin's log file.
88
  if( !defined( 'WPRSS_LOG_FILE' ) )
89
  define( 'WPRSS_LOG_FILE', WPRSS_DIR . 'log', true );
90
  if( !defined( 'WPRSS_LOG_FILE_EXT' ) )
91
  define( 'WPRSS_LOG_FILE_EXT', '.txt', true );
92
-
93
  if ( !defined('WPRSS_SL_STORE_URL') ) {
94
  define( 'WPRSS_SL_STORE_URL', 'http://www.wprssaggregator.com', TRUE );
95
  }
@@ -112,20 +112,20 @@
112
  */
113
 
114
  /* Load install, upgrade and migration code. */
115
- require_once ( WPRSS_INC . 'update.php' );
116
-
117
  /* Load the shortcodes functions file. */
118
  require_once ( WPRSS_INC . 'shortcodes.php' );
119
 
120
  /* Load the custom post types and taxonomies. */
121
- require_once ( WPRSS_INC . 'custom-post-types.php' );
122
 
123
  /* Load the file for setting capabilities of our post types */
124
- require_once ( WPRSS_INC . 'roles-capabilities.php' );
125
 
126
  /* Load the feed processing functions file */
127
  require_once ( WPRSS_INC . 'feed-processing.php' );
128
-
129
  /* Load the blacklist functions file */
130
  require_once ( WPRSS_INC . 'feed-blacklist.php' );
131
 
@@ -133,34 +133,34 @@
133
  require_once ( WPRSS_INC . 'feed-importing.php' );
134
 
135
  /* Load the feed states functions file */
136
- require_once ( WPRSS_INC . 'feed-states.php' );
137
 
138
  /* Load the feed display functions file */
139
- require_once ( WPRSS_INC . 'feed-display.php' );
140
 
141
  /* Load the custom feed file */
142
- require_once ( WPRSS_INC . 'custom-feed.php' );
143
 
144
  /* Load the custom post type feeds file */
145
  require_once ( WPRSS_INC . 'cpt-feeds.php' );
146
 
147
  /* Load the cron job scheduling functions. */
148
- require_once ( WPRSS_INC . 'cron-jobs.php' );
149
 
150
  /* Load the admin functions file. */
151
- require_once ( WPRSS_INC . 'admin.php' );
152
 
153
  /* Load the admin options functions file. */
154
- require_once ( WPRSS_INC . 'admin-options.php' );
155
 
156
  /* Load the settings import/export file */
157
- require_once ( WPRSS_INC . 'admin-import-export.php' );
158
 
159
  /* Load the debugging file */
160
- require_once ( WPRSS_INC . 'system-info.php' );
161
 
162
  /* Load the miscellaneous functions file */
163
- require_once ( WPRSS_INC . 'misc-functions.php' );
164
 
165
  /* Load the OPML Class file */
166
  require_once ( WPRSS_INC . 'OPML.php' );
@@ -170,34 +170,34 @@
170
 
171
  /* Load the admin debugging page file */
172
  require_once ( WPRSS_INC . 'admin-debugging.php' );
173
-
174
  /* Load the addons page file */
175
- require_once ( WPRSS_INC . 'admin-addons.php' );
176
 
177
  /* Load the admin display-related functions */
178
- require_once ( WPRSS_INC . 'admin-display.php' );
179
 
180
  /* Load the admin metaboxes functions */
181
- require_once ( WPRSS_INC . 'admin-metaboxes.php' );
182
 
183
  /* Load the scripts loading functions file */
184
- require_once ( WPRSS_INC . 'scripts.php' );
185
 
186
  /* Load the Ajax notification file */
187
- require_once ( WPRSS_INC . 'admin-ajax-notice.php' );
188
-
189
  /* Load the dashboard welcome screen file */
190
- require_once ( WPRSS_INC . 'admin-dashboard.php' );
191
 
192
  /* Load the logging class */
193
- require_once ( WPRSS_INC . 'roles-capabilities.php' );
194
 
195
  /* Load the security reset file */
196
  require_once ( WPRSS_INC . 'secure-reset.php' );
197
 
198
  /* Load the licensing file */
199
  require_once ( WPRSS_INC . 'licensing.php' );
200
-
201
  /* Load the admin editor file */
202
  require_once ( WPRSS_INC . 'admin-editor.php' );
203
 
@@ -209,7 +209,7 @@
209
 
210
  // Load the logging functions file
211
  require_once ( WPRSS_INC . 'admin-log.php' );
212
-
213
  if ( !defined( 'WPRSS_LOG_LEVEL' ) )
214
  define( 'WPRSS_LOG_LEVEL', WPRSS_LOG_LEVEL_ERROR );
215
 
@@ -218,20 +218,20 @@
218
 
219
  /* Load the admin metaboxes help file */
220
  require_once ( WPRSS_INC . 'admin-help-metaboxes.php' );
221
-
222
  /* Load the admin settings help file */
223
  require_once ( WPRSS_INC . 'admin-help-settings.php' );
224
-
225
  /* SimplePie */
226
  require_once ( ABSPATH . WPINC . '/class-feed.php' );
227
-
228
  /* Access to feed */
229
  require_once ( WPRSS_INC . 'feed-access.php' );
230
 
231
  /* Load the fallbacks for mbstring */
232
  require_once ( WPRSS_INC . 'fallback-mbstring.php' );
233
 
234
-
235
  register_activation_hook( __FILE__ , 'wprss_activate' );
236
  register_deactivation_hook( __FILE__ , 'wprss_deactivate' );
237
 
@@ -242,7 +242,7 @@
242
  *
243
  * @since 1.0
244
  * @return void
245
- */
246
  function wprss_init() {
247
  //If user requested to download system info, generate the download.
248
  if ( isset( $_POST['wprss-sysinfo'] ) ) {
@@ -256,7 +256,7 @@
256
  add_filter( 'wprss_admin_pointers', 'wprss_check_tracking_notice' );
257
  /**
258
  * Сhecks the tracking option and if not set, shows a pointer with opt in and out options.
259
- *
260
  * @since 3.6
261
  */
262
  function wprss_check_tracking_notice( $pointers ){
@@ -292,7 +292,7 @@
292
  add_action( 'admin_enqueue_scripts', 'wprss_prepare_pointers', 1000 );
293
  /**
294
  * Prepare the admin pointers
295
- *
296
  * @since 3.6
297
  */
298
  function wprss_prepare_pointers() {
@@ -332,10 +332,10 @@
332
 
333
  // Add pointers style to queue.
334
  wp_enqueue_style( 'wp-pointer' );
335
-
336
  // Add pointers script to queue. Add custom script.
337
  wp_enqueue_script( 'wprss-pointers', WPRSS_JS . 'pointers.js', array( 'wp-pointer' ) );
338
-
339
  // Add pointer options to script.
340
  wp_localize_script( 'wprss-pointers', 'wprssPointers', $valid_pointers );
341
 
@@ -345,7 +345,7 @@
345
 
346
  /**
347
  * Print the scripts for the admin pointers
348
- *
349
  * @since 3.6
350
  */
351
  function wprss_footer_pointer_scripts() {
@@ -398,13 +398,13 @@
398
  *
399
  * @since 1.0
400
  * @return void
401
- */
402
  function wprss_activate() {
403
  /* Prevents activation of plugin if compatible version of WordPress not found */
404
  if ( version_compare( get_bloginfo( 'version' ), '3.3', '<' ) ) {
405
  deactivate_plugins ( basename( __FILE__ )); // Deactivate plugin
406
  wp_die( __( 'This plugin requires WordPress version 3.3 or higher.' ), 'WP RSS Aggregator', array( 'back_link' => true ) );
407
- }
408
  wprss_settings_initialize();
409
  flush_rewrite_rules();
410
  wprss_schedule_fetch_all_feeds_cron();
@@ -416,7 +416,7 @@
416
  // Sets a transient to trigger a redirect upon completion of activation procedure
417
  set_transient( '_wprss_activation_redirect', true, 30 );
418
  }
419
-
420
  include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
421
  // Check if WordPress SEO is activate, if yes set its options for hiding the metaboxes on the wprss_feed and wprss_feed_item screens
422
  if ( is_plugin_active( 'wordpress-seo/wp-seo.php' ) ) {
@@ -426,17 +426,17 @@
426
  $wpseo_titles['hideeditbox-wprss_feed_item'] = TRUE;
427
  }
428
  update_option( 'wpseo_titles', $wpseo_titles );
429
- }
430
- }
431
 
432
 
433
  /**
434
  * Plugin deactivation procedure
435
  *
436
  * @since 1.0
437
- */
438
  function wprss_deactivate() {
439
- // On deactivation remove the cron job
440
  wp_clear_scheduled_hook( 'wprss_fetch_all_feeds_hook' );
441
  wp_clear_scheduled_hook( 'wprss_truncate_posts_hook' );
442
  // Uschedule cron jobs for all feed sources
@@ -458,11 +458,11 @@
458
  add_action( 'plugins_loaded', 'wprss_load_textdomain' );
459
  /**
460
  * Loads the plugin's translated strings.
461
- *
462
  * @since 2.1
463
- * @return void
464
- */
465
- function wprss_load_textdomain() {
466
  load_plugin_textdomain( WPRSS_TEXT_DOMAIN, false, dirname( plugin_basename( __FILE__ ) ) . '/languages/' );
467
  }
468
 
@@ -485,28 +485,28 @@
485
  function wprss_disable() {
486
  return FALSE;
487
  }
488
-
489
  /**
490
  * Gets the timezone string that corresponds to the timezone set for
491
  * this site. If the timezone is a UTC offset, or if it is not set, still
492
  * returns a valid timezone string.
493
  * However, if no actual zone exists in the configured offset, the result
494
  * may be rounded up, or failure.
495
- *
496
  * @see http://pl1.php.net/manual/en/function.timezone-name-from-abbr.php
497
  * @return string A valid timezone string, or false on failure.
498
  */
499
  function wprss_get_timezone_string() {
500
  $tzstring = get_option( 'timezone_string' );
501
 
502
- if ( empty($tzstring) ) {
503
  $offset = ( int )get_option( 'gmt_offset' );
504
  $tzstring = timezone_name_from_abbr( '', $offset * 60 * 60, 1 );
505
  }
506
 
507
  return $tzstring;
508
  }
509
-
510
 
511
  /**
512
  * @see http://wordpress.stackexchange.com/questions/94755/converting-timestamps-to-local-time-with-date-l18n#135049
@@ -517,7 +517,7 @@
517
  function wprss_local_date_i18n( $timestamp = null, $format = null ) {
518
  $format = is_null( $format ) ? get_option( 'date_format' ) . ' ' . get_option( 'time_format' ) : $format;
519
  $timestamp = $timestamp ? $timestamp : time();
520
-
521
  $timezone_str = wprss_get_timezone_string() ? wprss_get_timezone_string() : 'UTC';
522
  $timezone = new DateTimeZone( $timezone_str );
523
 
@@ -531,7 +531,7 @@
531
  $date->setTime( $datetime['hours'] , $datetime['minutes'] , $datetime['seconds'] );
532
  }
533
  $date_str = $date->format( 'Y-m-d H:i:s' );
534
-
535
  // Pretend the local date is UTC to get the timestamp
536
  // to pass to date_i18n().
537
  $utc_timezone = new DateTimeZone( 'UTC' );
@@ -540,12 +540,12 @@
540
 
541
  return date_i18n( $format, $timestamp, true );
542
  }
543
-
544
 
545
  /**
546
  * Gets an internationalized and localized datetime string, defaulting
547
  * to WP RSS format.
548
- *
549
  * @see wprss_local_date_i18n;
550
  * @param string|null $format Format to use. Default: Wordpress date and time format.
551
  * @param int|null $timestamp The timestamp to localize. Default: time().
@@ -553,6 +553,6 @@
553
  */
554
  function wprss_date_i18n( $timestamp = null, $format = null ) {
555
  $format = is_null( $format ) ? wprss_get_general_setting( 'date_format' ) : $format;
556
-
557
  return wprss_local_date_i18n( $timestamp, $format );
558
  }
3
  Plugin Name: WP RSS Aggregator
4
  Plugin URI: http://www.wprssaggregator.com
5
  Description: Imports and aggregates multiple RSS Feeds using SimplePie
6
+ Version: 4.7.3
7
  Author: Jean Galea
8
  Author URI: http://www.wprssaggregator.com
9
  License: GPLv2
21
  but WITHOUT ANY WARRANTY; without even the implied warranty of
22
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23
  GNU General Public License for more details.
24
+
25
  You should have received a copy of the GNU General Public License
26
  along with this program; if not, write to the Free Software
27
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
29
 
30
  /**
31
  * @package WPRSSAggregator
32
+ * @version 4.7.3
33
  * @since 1.0
34
  * @author Jean Galea <info@wprssaggregator.com>
35
  * @copyright Copyright (c) 2012-2015, Jean Galea
41
  * Define constants used by the plugin.
42
  */
43
 
44
+ // Set the version number of the plugin.
45
  if( !defined( 'WPRSS_VERSION' ) )
46
+ define( 'WPRSS_VERSION', '4.7.3', true );
47
 
48
+ // Set the database version number of the plugin.
49
  if( !defined( 'WPRSS_DB_VERSION' ) )
50
  define( 'WPRSS_DB_VERSION', 13 );
51
 
52
+ // Set the plugin prefix
53
  if( !defined( 'WPRSS_PREFIX' ) )
54
+ define( 'WPRSS_PREFIX', 'wprss', true );
55
 
56
+ // Set the plugin prefix
57
  if( !defined( 'WPRSS_FILE_CONSTANT' ) )
58
  define( 'WPRSS_FILE_CONSTANT', __FILE__, true );
59
 
60
+ // Set constant path to the plugin directory.
61
  if( !defined( 'WPRSS_DIR' ) )
62
+ define( 'WPRSS_DIR', plugin_dir_path( __FILE__ ) );
63
 
64
+ // Set constant URI to the plugin URL.
65
  if( !defined( 'WPRSS_URI' ) )
66
+ define( 'WPRSS_URI', plugin_dir_url( __FILE__ ) );
67
 
68
+ // Set the constant path to the plugin's javascript directory.
69
  if( !defined( 'WPRSS_JS' ) )
70
  define( 'WPRSS_JS', WPRSS_URI . trailingslashit( 'js' ), true );
71
 
72
+ // Set the constant path to the plugin's CSS directory.
73
  if( !defined( 'WPRSS_CSS' ) )
74
  define( 'WPRSS_CSS', WPRSS_URI . trailingslashit( 'css' ), true );
75
 
76
+ // Set the constant path to the plugin's images directory.
77
  if( !defined( 'WPRSS_IMG' ) )
78
  define( 'WPRSS_IMG', WPRSS_URI . trailingslashit( 'images' ), true );
79
 
80
+ // Set the constant path to the plugin's includes directory.
81
  if( !defined( 'WPRSS_INC' ) )
82
  define( 'WPRSS_INC', WPRSS_DIR . trailingslashit( 'includes' ), true );
83
 
84
  if( !defined( 'WPRSS_LANG' ) )
85
  define( 'WPRSS_LANG', WPRSS_DIR . trailingslashit( 'languages' ), true );
86
+
87
  // Set the constant path to the plugin's log file.
88
  if( !defined( 'WPRSS_LOG_FILE' ) )
89
  define( 'WPRSS_LOG_FILE', WPRSS_DIR . 'log', true );
90
  if( !defined( 'WPRSS_LOG_FILE_EXT' ) )
91
  define( 'WPRSS_LOG_FILE_EXT', '.txt', true );
92
+
93
  if ( !defined('WPRSS_SL_STORE_URL') ) {
94
  define( 'WPRSS_SL_STORE_URL', 'http://www.wprssaggregator.com', TRUE );
95
  }
112
  */
113
 
114
  /* Load install, upgrade and migration code. */
115
+ require_once ( WPRSS_INC . 'update.php' );
116
+
117
  /* Load the shortcodes functions file. */
118
  require_once ( WPRSS_INC . 'shortcodes.php' );
119
 
120
  /* Load the custom post types and taxonomies. */
121
+ require_once ( WPRSS_INC . 'custom-post-types.php' );
122
 
123
  /* Load the file for setting capabilities of our post types */
124
+ require_once ( WPRSS_INC . 'roles-capabilities.php' );
125
 
126
  /* Load the feed processing functions file */
127
  require_once ( WPRSS_INC . 'feed-processing.php' );
128
+
129
  /* Load the blacklist functions file */
130
  require_once ( WPRSS_INC . 'feed-blacklist.php' );
131
 
133
  require_once ( WPRSS_INC . 'feed-importing.php' );
134
 
135
  /* Load the feed states functions file */
136
+ require_once ( WPRSS_INC . 'feed-states.php' );
137
 
138
  /* Load the feed display functions file */
139
+ require_once ( WPRSS_INC . 'feed-display.php' );
140
 
141
  /* Load the custom feed file */
142
+ require_once ( WPRSS_INC . 'custom-feed.php' );
143
 
144
  /* Load the custom post type feeds file */
145
  require_once ( WPRSS_INC . 'cpt-feeds.php' );
146
 
147
  /* Load the cron job scheduling functions. */
148
+ require_once ( WPRSS_INC . 'cron-jobs.php' );
149
 
150
  /* Load the admin functions file. */
151
+ require_once ( WPRSS_INC . 'admin.php' );
152
 
153
  /* Load the admin options functions file. */
154
+ require_once ( WPRSS_INC . 'admin-options.php' );
155
 
156
  /* Load the settings import/export file */
157
+ require_once ( WPRSS_INC . 'admin-import-export.php' );
158
 
159
  /* Load the debugging file */
160
+ require_once ( WPRSS_INC . 'system-info.php' );
161
 
162
  /* Load the miscellaneous functions file */
163
+ require_once ( WPRSS_INC . 'misc-functions.php' );
164
 
165
  /* Load the OPML Class file */
166
  require_once ( WPRSS_INC . 'OPML.php' );
170
 
171
  /* Load the admin debugging page file */
172
  require_once ( WPRSS_INC . 'admin-debugging.php' );
173
+
174
  /* Load the addons page file */
175
+ require_once ( WPRSS_INC . 'admin-addons.php' );
176
 
177
  /* Load the admin display-related functions */
178
+ require_once ( WPRSS_INC . 'admin-display.php' );
179
 
180
  /* Load the admin metaboxes functions */
181
+ require_once ( WPRSS_INC . 'admin-metaboxes.php' );
182
 
183
  /* Load the scripts loading functions file */
184
+ require_once ( WPRSS_INC . 'scripts.php' );
185
 
186
  /* Load the Ajax notification file */
187
+ require_once ( WPRSS_INC . 'admin-ajax-notice.php' );
188
+
189
  /* Load the dashboard welcome screen file */
190
+ require_once ( WPRSS_INC . 'admin-dashboard.php' );
191
 
192
  /* Load the logging class */
193
+ require_once ( WPRSS_INC . 'roles-capabilities.php' );
194
 
195
  /* Load the security reset file */
196
  require_once ( WPRSS_INC . 'secure-reset.php' );
197
 
198
  /* Load the licensing file */
199
  require_once ( WPRSS_INC . 'licensing.php' );
200
+
201
  /* Load the admin editor file */
202
  require_once ( WPRSS_INC . 'admin-editor.php' );
203
 
209
 
210
  // Load the logging functions file
211
  require_once ( WPRSS_INC . 'admin-log.php' );
212
+
213
  if ( !defined( 'WPRSS_LOG_LEVEL' ) )
214
  define( 'WPRSS_LOG_LEVEL', WPRSS_LOG_LEVEL_ERROR );
215
 
218
 
219
  /* Load the admin metaboxes help file */
220
  require_once ( WPRSS_INC . 'admin-help-metaboxes.php' );
221
+
222
  /* Load the admin settings help file */
223
  require_once ( WPRSS_INC . 'admin-help-settings.php' );
224
+
225
  /* SimplePie */
226
  require_once ( ABSPATH . WPINC . '/class-feed.php' );
227
+
228
  /* Access to feed */
229
  require_once ( WPRSS_INC . 'feed-access.php' );
230
 
231
  /* Load the fallbacks for mbstring */
232
  require_once ( WPRSS_INC . 'fallback-mbstring.php' );
233
 
234
+
235
  register_activation_hook( __FILE__ , 'wprss_activate' );
236
  register_deactivation_hook( __FILE__ , 'wprss_deactivate' );
237
 
242
  *
243
  * @since 1.0
244
  * @return void
245
+ */
246
  function wprss_init() {
247
  //If user requested to download system info, generate the download.
248
  if ( isset( $_POST['wprss-sysinfo'] ) ) {
256
  add_filter( 'wprss_admin_pointers', 'wprss_check_tracking_notice' );
257
  /**
258
  * Сhecks the tracking option and if not set, shows a pointer with opt in and out options.
259
+ *
260
  * @since 3.6
261
  */
262
  function wprss_check_tracking_notice( $pointers ){
292
  add_action( 'admin_enqueue_scripts', 'wprss_prepare_pointers', 1000 );
293
  /**
294
  * Prepare the admin pointers
295
+ *
296
  * @since 3.6
297
  */
298
  function wprss_prepare_pointers() {
332
 
333
  // Add pointers style to queue.
334
  wp_enqueue_style( 'wp-pointer' );
335
+
336
  // Add pointers script to queue. Add custom script.
337
  wp_enqueue_script( 'wprss-pointers', WPRSS_JS . 'pointers.js', array( 'wp-pointer' ) );
338
+
339
  // Add pointer options to script.
340
  wp_localize_script( 'wprss-pointers', 'wprssPointers', $valid_pointers );
341
 
345
 
346
  /**
347
  * Print the scripts for the admin pointers
348
+ *
349
  * @since 3.6
350
  */
351
  function wprss_footer_pointer_scripts() {
398
  *
399
  * @since 1.0
400
  * @return void
401
+ */
402
  function wprss_activate() {
403
  /* Prevents activation of plugin if compatible version of WordPress not found */
404
  if ( version_compare( get_bloginfo( 'version' ), '3.3', '<' ) ) {
405
  deactivate_plugins ( basename( __FILE__ )); // Deactivate plugin
406
  wp_die( __( 'This plugin requires WordPress version 3.3 or higher.' ), 'WP RSS Aggregator', array( 'back_link' => true ) );
407
+ }
408
  wprss_settings_initialize();
409
  flush_rewrite_rules();
410
  wprss_schedule_fetch_all_feeds_cron();
416
  // Sets a transient to trigger a redirect upon completion of activation procedure
417
  set_transient( '_wprss_activation_redirect', true, 30 );
418
  }
419
+
420
  include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
421
  // Check if WordPress SEO is activate, if yes set its options for hiding the metaboxes on the wprss_feed and wprss_feed_item screens
422
  if ( is_plugin_active( 'wordpress-seo/wp-seo.php' ) ) {
426
  $wpseo_titles['hideeditbox-wprss_feed_item'] = TRUE;
427
  }
428
  update_option( 'wpseo_titles', $wpseo_titles );
429
+ }
430
+ }
431
 
432
 
433
  /**
434
  * Plugin deactivation procedure
435
  *
436
  * @since 1.0
437
+ */
438
  function wprss_deactivate() {
439
+ // On deactivation remove the cron job
440
  wp_clear_scheduled_hook( 'wprss_fetch_all_feeds_hook' );
441
  wp_clear_scheduled_hook( 'wprss_truncate_posts_hook' );
442
  // Uschedule cron jobs for all feed sources
458
  add_action( 'plugins_loaded', 'wprss_load_textdomain' );
459
  /**
460
  * Loads the plugin's translated strings.
461
+ *
462
  * @since 2.1
463
+ * @return void
464
+ */
465
+ function wprss_load_textdomain() {
466
  load_plugin_textdomain( WPRSS_TEXT_DOMAIN, false, dirname( plugin_basename( __FILE__ ) ) . '/languages/' );
467
  }
468
 
485
  function wprss_disable() {
486
  return FALSE;
487
  }
488
+
489
  /**
490
  * Gets the timezone string that corresponds to the timezone set for
491
  * this site. If the timezone is a UTC offset, or if it is not set, still
492
  * returns a valid timezone string.
493
  * However, if no actual zone exists in the configured offset, the result
494
  * may be rounded up, or failure.
495
+ *
496
  * @see http://pl1.php.net/manual/en/function.timezone-name-from-abbr.php
497
  * @return string A valid timezone string, or false on failure.
498
  */
499
  function wprss_get_timezone_string() {
500
  $tzstring = get_option( 'timezone_string' );
501
 
502
+ if ( empty($tzstring) ) {
503
  $offset = ( int )get_option( 'gmt_offset' );
504
  $tzstring = timezone_name_from_abbr( '', $offset * 60 * 60, 1 );
505
  }
506
 
507
  return $tzstring;
508
  }
509
+
510
 
511
  /**
512
  * @see http://wordpress.stackexchange.com/questions/94755/converting-timestamps-to-local-time-with-date-l18n#135049
517
  function wprss_local_date_i18n( $timestamp = null, $format = null ) {
518
  $format = is_null( $format ) ? get_option( 'date_format' ) . ' ' . get_option( 'time_format' ) : $format;
519
  $timestamp = $timestamp ? $timestamp : time();
520
+
521
  $timezone_str = wprss_get_timezone_string() ? wprss_get_timezone_string() : 'UTC';
522
  $timezone = new DateTimeZone( $timezone_str );
523
 
531
  $date->setTime( $datetime['hours'] , $datetime['minutes'] , $datetime['seconds'] );
532
  }
533
  $date_str = $date->format( 'Y-m-d H:i:s' );
534
+
535
  // Pretend the local date is UTC to get the timestamp
536
  // to pass to date_i18n().
537
  $utc_timezone = new DateTimeZone( 'UTC' );
540
 
541
  return date_i18n( $format, $timestamp, true );
542
  }
543
+
544
 
545
  /**
546
  * Gets an internationalized and localized datetime string, defaulting
547
  * to WP RSS format.
548
+ *
549
  * @see wprss_local_date_i18n;
550
  * @param string|null $format Format to use. Default: Wordpress date and time format.
551
  * @param int|null $timestamp The timestamp to localize. Default: time().
553
  */
554
  function wprss_date_i18n( $timestamp = null, $format = null ) {
555
  $format = is_null( $format ) ? wprss_get_general_setting( 'date_format' ) : $format;
556
+
557
  return wprss_local_date_i18n( $timestamp, $format );
558
  }